if (!requireNamespace("knitr", quietly = TRUE)) {
  install.packages("knitr")
}
if(!requireNamespace("readxl", quietly = TRUE)) {
  install.packages("readxl")
}
if(!requireNamespace("gt", quietly = TRUE)) {
  install.packages("gt")
}
library(knitr)
library(RCurl)
library(gprofiler2)
library(dplyr)
library(tibble)
library(stringi)
library(BiocGenerics)
library(data.table)
library(GEOquery)
library(readxl)
library(biomaRt)
library(edgeR)
library(SummarizedExperiment)
library(DESeq2)
library(ggplot2)
library(ComplexHeatmap)
library(circlize)
library(tidyr)
library(gt)

This workbook uses the GEOQuery (Davis and Meltzer 2007), biomaRt (Durinck et al. 2005), tibble (Müller and Wickham 2025), readxl(Wickham and Bryan 2025), dplyr (Wickham et al. 2023), tidyr (Wickham et al. 2025), knitr (Xie 2014), DESeq2 (Love et al. 2014), edgeR (Chen et al. 2025), SummarizedExperiment(Morgan et al. 2025), ggplot2 (Wickham 2016), ComplexHeatmap (Gu 2022), data.table (Barrett et al. 2006), RCurl (Temple Lang 2025), BiocGenerics (Huber et al. 2015), stringi (Gagolewski 2022), gt (Iannone et al. 2026) and circlize (Gu et al. 2014) packages in its code chunks.

Introduction

Septic shock is a complication of sepsis with severe and potentially fatal consequences. Treatment for septic shock is largely dependent on supportive hemodynamic therapy, but patient response to such therapies is variable, and while some septic shock patients, responders, exhibit significant improvement of organ function within a few days of treatment in the ICU, other patients, non-responders, do not exhibit early improvement. Changes in organ function during the early stages of treatment are highly predictive of final outcome, and fatal cases of septic shock are associated with major transcriptomic changes in the initial stages of the condition, so the distinction of gene expression profiles associated with responders and non-responders is informative as to the mechanisms underlying septic shock mortality.

The NCBI Gene Expression Omnibus (GEO) (Barrett et al. 2012) series GSE110487 is a dataset from 2018 consisting of RNA sequencing read counts of whole blood samples taken from 14 septic shock patients who responded to hemodynamic therapy (R group) and 17 non-responders (NR group), at two time points: immediately after ICU admission (T1), and 48 hours later (T2), after some time undergoing treatment.

In Assignment 1, we downloaded the dataset of 58096 genes and 62 samples. Since the data used HGNC identifiers for the genes, we mapped these to ENSG identifiers and cleaned out low expression genes, leaving us with 13673 genes. We visualized and compared raw and normalized read counts with MDS plots, and noted the similarity of their distribution. We then analyzed differential expression between the R patients and the NR patients at each time point, and we analyzed differential expression between T1 and T2 in each group. We noted no differentially expressed genes above our significance threshold between the R and NR groups at T1, and 67 differentially expressed genes between the patient groups at T2, so we determined that analyzing differential expression between R and NR at T2 would provide insight into the difference between the transcriptomic responses of the two groups to hemodynamic therapy. We concluded by visualizing the genes that were differentially expressed in R vs. NR at T2 with a volcano plot and a heatmap. The code used in assignment 1 is contained and hidden in this notebook.

Thresholded over-representation analysis (ORA)

Analysis with g:profiler

We’ll make lists of the genes identified in Assignment 1 as differentially expressed, with corrected p-values below the significance threshold of 0.05.

# get list of significantly differentially expressed genes
DE_genes <- as.data.frame(sig_T2) %>% dplyr::arrange(padj)
DE_genelist <- rownames(DE_genes)

# get separate lists of the upregulated and downregulated genes
upreg_genelist <- rownames(DE_genes[DE_genes$log2FoldChange > 0,])
downreg_genelist <- rownames(DE_genes[DE_genes$log2FoldChange < 0,])

We have 67 differentially expressed genes, 29 of which are upregulated in the R group (R+ genes) and 38 of which are downregulated in the R group (R- genes).

Drawing from protocol demonstrated by (Reimand et al. 2019), we’ll use a one-tailed Fisher’s exact test, as implemented in the gprofiler2 package (Kolberg et al. 2020), to analyze enrichment. This method is suitable for thresholded over-representation analysis because we are calculating enrichment using a binary condition, whether or not a gene is significantly differentially expressed, meaning data fits the 2 x 2 contingency tables used by the Fisher’s exact test, and we wish to assess a directional effect, whether terms are more enriched in the results than expected (Rodchenkov et al. 2019). (1)

We use the Bader lab enrichment map gene set file (Merico et al. 2010) containing all human genesets from the most recent releases, as of 2026-03-02, of GO biological process (Aleksander et al. 2025) excluding annotations that are extracted from public pathway figures, inferred from electronic annotation, inferred from reviewed computational analysis, or have no biological data available, and all pathway resources, including Reactome (Croft et al. 2010), MSigDB (Liberzon et al. 2015), NetPath (Kandasamy et al. 2010), PANTHER (Mi et al. 2013), WikiPathways (Agrawal et al. 2023), PathBank (Wishart et al. 2023), and HumanCyc (Trupp et al. 2010). This is a highly comprehensive, up-to-date compilation of annotation sources that will allow for greater coverage than using any one database alone. (2)

data_dir = paste0(getwd(),"/data")

# access and parse the names of the bader lab human gene set files
gmt_url = "https://download.baderlab.org/EM_Genesets/current_release/Human/symbol/"
filenames = RCurl::getURL(gmt_url)
tc = textConnection(filenames)
contents = readLines(tc)
close(tc)

# find the gmt file with all GOBP and pathway terms, excluding those extracted 
# from published pathway figures and inferred from electronic annotation
rx = gregexpr("(?<=<a href=\")(.*.GOBP_AllPathways_noPFOCR_no_GO_iea.*.)(.gmt)(?=\">)",
              contents, perl = TRUE)
gmt_file = unlist(regmatches(contents, rx))
dest_gmt_file <- file.path(data_dir,gmt_file)

# if the file has not already been downloaded, download
if(!file.exists(dest_gmt_file)){
  download.file(
    paste(gmt_url,gmt_file,sep=""),
    destfile=dest_gmt_file
  )
}

# read and clean the downloaded gmt file so that it can be handled by gsea
cleaned_gmt_file = paste0(data_dir, "/cleaned_", BiocGenerics::basename(dest_gmt_file))
if (!file.exists(cleaned_gmt_file)) {
  gmt_lines <- readLines(dest_gmt_file, warn = FALSE)
  # remove non-ASCII characters
  clean_lines <- stringi::stri_trans_general(gmt_lines, id = "Any-Latin; Latin-ASCII")
  # remove duplicate terms 
  unique_clean_lines <- clean_lines[!data.table::duplicated(clean_lines)]
  writeLines(unique_clean_lines, cleaned_gmt_file)
}

With all our data prepared, we use gprofiler2::gost to run ORA on each of our gene lists. For multiple testing correction we use gprofiler’s g:SCS (set counts and sizes) method. SCS correction specifically takes into account the structure behind functional annotations, and functional profiling methods where significance is determined from set intersections in 2 x 2 contingency tables. SCS estimations were demonstrated in simulations with randomly sampled queries to more closely align with empirical quantiles of p-values than the more general Bonferroni and Benjamini-Hochberg estimations (Reimand et al. 2007).

# upload the cleaned bader lab gmt file to g:profiler to use as annotation source 
if (!exists("custom_gmt")) {
  custom_gmt <- gprofiler2::upload_GMT_file(cleaned_gmt_file)
}

# define significance threshold as 0.05, term size bounds as 15 and 500
thresh <- 0.05
min_genes <- 15
max_genes <- 500

# ora of all differentially expressed genes
DE_ORA <- gprofiler2::gost(query = DE_genelist,
                                organism = custom_gmt,
                                ordered_query = FALSE,
                                user_threshold = thresh,
                                correction_method = "g_SCS")
# extract analysis results 
DE_enriched_genesets <- DE_ORA$result
num_enriched <- nrow(DE_enriched_genesets)
# filter for geneset size between min_genes and max_genes
DE_enriched_filtered <- DE_enriched_genesets %>% 
  dplyr::filter(term_size >= min_genes & term_size <= max_genes)
num_enriched_filtered <- nrow(DE_enriched_filtered)

# ora of upregulated genes only and get results 
upreg_ORA <- gprofiler2::gost(query = upreg_genelist,
                                organism = custom_gmt,
                                ordered_query = FALSE,
                                user_threshold = thresh,
                                correction_method = "g_SCS")
upreg_enriched_genesets <- upreg_ORA$result
num_enriched_up <- nrow(upreg_enriched_genesets)
upreg_enriched_filtered <- upreg_enriched_genesets %>% 
  dplyr::filter(term_size >= min_genes & term_size <= max_genes)
num_filtered_up <- nrow(upreg_enriched_filtered)

# ora of downregulated genes only and get results
downreg_ORA <- gprofiler2::gost(query = downreg_genelist,
                                organism = custom_gmt,
                                ordered_query = FALSE,
                                user_threshold = thresh,
                                correction_method = "g_SCS")
downreg_enriched_genesets <- downreg_ORA$result
num_enriched_down <- nrow(downreg_enriched_genesets)
downreg_enriched_filtered <- downreg_enriched_genesets %>% 
  dplyr::filter(term_size >= min_genes & term_size <= max_genes)
num_filtered_down <- nrow(downreg_enriched_filtered)

Filtering for SCS-corrected p-values below the threshold of 0.05, we get 9 terms enriched in the list of all our differentially expressed genes. 5 of these have between 15 and 500 genes, and the rest are larger. (3)

We get 5 terms enriched with SCS-corrected p-value < 0.05 in the list of R+ genes, and 5 terms enriched with SCS-corrected p-value < 0.05 in the list of R- genes. Filtering for term size between 15 and 500, we have 3 terms enriched in the R+ genes and 4 terms enriched in the R- genes. In Table 1, we compare the terms enriched in the three gene lists.

all_enriched <- dplyr::bind_rows(DE_enriched_genesets, upreg_enriched_genesets, 
                          downreg_enriched_genesets) %>% 
  dplyr::distinct(term_id, .keep_all = TRUE)

results_table <- all_enriched %>% 
  dplyr::mutate(enriched_allDE = term_id %in% DE_enriched_genesets$term_id,
                enriched_Rplus = term_id %in% upreg_enriched_genesets$term_id,
                enriched_Rminus = term_id %in% downreg_enriched_genesets$term_id,
                annot_source = sapply(strsplit(term_id, "%"), function(x) x[2]),
                ID = sapply(strsplit(term_id, "%"), function(x) x[3])) %>% 
  dplyr::select(c(term_name, term_size, annot_source, enriched_allDE,
                  enriched_Rplus, enriched_Rminus, ID)) %>% 
  dplyr::arrange(!enriched_allDE, term_size)

#knitr::kable(results_table, format = "html", align = "c")
results_table %>%
  gt::gt() %>%
  gt::opt_table_lines(extent = "all")
term_name term_size annot_source enriched_allDE enriched_Rplus enriched_Rminus ID
regulation of T cell receptor signaling pathway 52 GOBP TRUE FALSE TRUE GO:0050856
regulation of antigen receptor-mediated signaling pathway 67 GOBP TRUE FALSE TRUE GO:0050854
negative regulation of cell migration 252 GOBP TRUE TRUE FALSE GO:0030336
negative regulation of cell motility 263 GOBP TRUE TRUE FALSE GO:2000146
negative regulation of locomotion 268 GOBP TRUE TRUE FALSE GO:0040013
regulation of immune response 888 GOBP TRUE FALSE TRUE GO:0050776
regulation of immune system process 1387 GOBP TRUE FALSE FALSE GO:0002682
regulation of cellular process 10154 GOBP TRUE FALSE FALSE GO:0050794
regulation of biological process 10596 GOBP TRUE FALSE FALSE GO:0050789
negative regulation of T cell receptor signaling pathway 33 GOBP FALSE FALSE TRUE GO:0050860
Immunoregulatory interactions between a Lymphoid and a non-Lymphoid cell 217 REACTOME DATABASE ID RELEASE 95 FALSE FALSE TRUE 198933
positive regulation of developmental process 969 GOBP FALSE TRUE FALSE GO:0051094
regulation of multicellular organismal process 2359 GOBP FALSE TRUE FALSE GO:0051239
Table 1: Pathway terms identified as significantly enriched (multiple test corrected p-value lesser than 0.05) in the set of all differentially expressed genes, in the set of only R+ genes, and in the set of only R- genes, term size (number of genes), annotation source and term ID. Enrichment analyzed using g:profiler.


Among the three set of terms, the DE terms, the R+ terms, and the R- terms, there are 13 unique terms. R+ terms and R- terms each overlap partially with DE terms, and all DE terms with term size between min_genes and max_genes are in either R+ or R-, but there are no shared terms between the R+ and R- groups. (4)

The disparity between the DE group and the R+ and R- groups highlights the fallibility of thresholded enrichment analysis: the sizes of small gene lists can impact the estimated significance of a signal. Large terms identified as enriched in the DE group are not identified in analysis of the smaller response-specific groups, and some terms identified as enriched in the R+ or R- group when analyzed separately do not pass the significance threshold when the groups are analyzed together. Terms identified in enrichment analysis of both the DE group and either the R+ or R- group may be especially significant. Terms identified in independent analysis of the R+ or R- group may aid in interpreting terms identified in the analysis of the full DE group.

Interpreting ORA results

All the terms identified as enriched in the DE genes are involved in regulation of biological processes. Specifically, several terms involving regulation of immune response and cell motility are enriched. Genes involved in regulation of immune response, T-cell receptor signalling pathways and antigen receptor-mediated signalling pathways in particular, are enriched, and are specifically enriched in R- genes. The term ‘negative regulation of T cell receptor signaling pathway,’ was furthermore identified as enriched in the R- gene list, though not in the full DE gene list due to the presence of R+ genes weakening the signal, and suggests that the R- genes involved in regulation of T-cell receptor signalling pathways specifically negatively regulate these pathways, and that their downregulation in R patients corresponds to positive regulation of T-cell related pathways. Genes involving negative regulation of cell migration, motility and locomotion are enriched, and are specifically enriched in R+ genes.

The enrichment of terms related to immune response regulation, especially negative regulation of T-cell pathways in R- genes, supports Barcella et al’s conclusions that R patients specifically modulate genes involved in T-cell activation while NR patients do not, including their identification of genes involved in signal transduction in the T-cell antigen receptor complex being upregulated in R patients, and genes inhibiting T-cell activation being downregulated.

On the other hand, the enrichment of terms related to negative regulation of cell migration in R+ genes does not support the paper’s conclusions or suggested mechanisms, as Barcella et al do not discuss enrichment of genes related to cell motility or their potential role in the biological mechanisms of therapy-modulated septic shock response. (1)

However, Barcella et al’s analysis identifies the GO terms ‘positive regulation of cell migration,’ and ‘regulation of cell migration’ as being enriched from T1 to T2 in NR patients exclusively, with the latter term highlighted as especially significant. Although this result is not factored into their conclusions, it stands in support of our observation of the enrichment of genes negatively regulating cell migration in the R- group.

Other studies have demonstrated that genes involved in activation of leukocyte migration are be overexpressed in the endothelial cells of septic shock patients (Langston et al. 2022) (Cao and Robinson 2014), and that the inflammatory cascade caused by sepsis is known to cause dysregulated neutrophil migration into critical organs(Joffre et al. 2020), where they can damage the endothelium and drive inflammation (Hattori et al. 2017). The role of increased cell migration in septic symptoms supports the enrichment of genes negatively regulating cell migration in patients who have responded positively to hemodynamic therapy. (2)

Non-thresholded gene set enrichment analysis

Analysis with GSEA

Next, we’ll perform non-thresholded gene set enrichment analysis on the entire list of genes in the data. We’ll analyze the distribution of terms throughout our entire list of genes. We begin by ranking the genes. We assign ranks according to significance, with genes that saw higher expression in R patients receiving a positive number, and genes that saw lower expression in R patients receiving a negative number.

#get all genes, calculate ranks, and arrange by rank
ranked_genes <- as.data.frame(response_T2) %>% 
  dplyr::mutate(rank = -log(padj, base = 10) * sign(log2FoldChange)) %>% 
  dplyr::arrange(desc(rank)) %>% 
  tibble::rownames_to_column("geneid") %>% 
  dplyr::select(c(geneid, rank))

#write the ranked gene list to a file to input into gsea algorithm
rank_file <- file.path(data_dir, "ranked_genes.rnk")
write.table(ranked_genes, rank_file, quote = FALSE, sep = "\t", row.names = FALSE)

To perform gene set enrichment analysis, we use the original GSEA algorithm (Subramanian et al. 2005), implemented via the GSEAPreRanked function in the GSEA 4.4.0 jar file for the command line. For the genesets, we’ll use the same Bader lab .gmt file that we used for the thresholded analysis. (1)

gsea_jar <- file.path(data_dir, "GSEA_4.4.0", "gsea-cli.sh")
analysis_name <- "T2_R_vs_NR"

gsea_cmd <- paste("", gsea_jar,
                   "GSEAPreRanked -gmx", cleaned_gmt_file,
                   "-rnk" , rank_file,
                   "-collapse false -nperm 1000 -scoring_scheme weighted",
                   "-rpt_label", analysis_name,
                   "-plot_top_x 20 -rnd_seed 6789 -set_max", max_genes,
                   "-set_min", min_genes, "-zip_report false",
                   "-out", data_dir,
                   "> gsea_output.txt",sep = " ")

gsea_run <- FALSE
if(length(list.files(data_dir, pattern = "^T2_R_vs_NR\\.GseaPreranked.")) == 0 & !gsea_run) {
  suppressWarnings(system(gsea_cmd))
  gsea_run <- TRUE
}

The most significantly enriched terms identified in the non-thresholded GSEA include many of the same terms identified in the thresholded ORA relate to RNA processing and DNA and protein synthesis. Most of the highly significant terms are enriched specifically among R- genes, with only few highly significant terms, related to insulin signalling and autophagy, enriched among the R+ genes. (2)

The terms identified in the thresholded analysis do not appear among the top significant terms identified in the non-thresholded analysis. However, as shown in figure 2, many terms relating to immune cell regulation are identified as significantly enriched in the GSEA. Although this comparison is not straightforward, since ORA results are binary while GSEA results are extensive and continuous, the high signal from terms related to RNA processing in the GSEA results that are not present in the ORA results show that the GSEA has identified genesets that were hidden by the arbitrary nature of a thresholded analysis. (3)

Visualization of results

In Cytoscape (Shannon et al. 2003), we create an EnrichmentMap (Merico et al. 2010) of GSEA results with FDR-corrected p-value lesser than 0.05 and edge similarity greater than 0.375. The resulting network, shown in figure 1, has 249 nodes and 2547 edges. (1) Figure 1

Figure 1: EnrichmentMap of GSEA results, with FDR-corrected p-value lesser than 0.03 and edge similarity greater than 0.375, before manual annotation.


We annotate this network using AutoAnnotate (Kucera et al. 2016), using GS_DESCR as our label column, selecting ‘Layout network to minimize cluster overlap’, and setting the amount of clusters one notch from the fewest. After manually reorganizing nodes and relabelling clusters, we get figure 2. (2)(3)

Figure 2
Figure 2
Figure 2: EnrichmentMap of GSEA results, with FDR-corrected p-value lesser than 0.03 and edge similarity greater than 0.375, clustered with AutoAnnotate. Terms enriched in upregulated genes are represented by red nodes, and terms enriched in downregulated genes are represented by blue nodes.


We collapse the network to a theme network in Cytoscape and note major themes. The main themes are RNA processing, regulation of immune cell mediated pathways, DNA repair and autophagy. The high enrichment of terms relating to RNA processing pathways, DNA repair pathways and autophagous pathways is novel to the non-thresholded analysis, but these results do align with the model and the mechanisms involved in septic shock therapy response. (4)

Interpreting GSEA results

As with the thresholded ORA results, the enrichment of terms relating to regulation of immune cell response, especially regulation of T-cell and antigen receptor mediated pathways supports Barcella et al’s conclusions.

The non-thresholded analysis also detected enrichment of terms related to regulation of interleukin-10 production, which supports Barcella et al’s identification of interleukin receptor genes exclusively downregulated in the R group.

Terms related to cell migration were not highlighted in the non-thresholded analysis, but many terms related to RNA processing, DNA repair and autophagy, mechanisms which Barcella et al did not explicitly discuss or note, were identified as significant. (1)

Genes related to DNA repair have been identified as biomarkers for sepsis (Gu et al. 2025), which supports the enrichment of DNA repair related terms in R- genes in our analysis, suggesting that hemodynamic therapy reduces expression of these biomarkers among R patients, but not NR patients.

In general, the signalling pathways activated in cases of sepsis are associated with the upregulation of many common gene classes associated with inflamation and cellular metabolism (Bushra et al. 2024), which supports the highly significant enrichment of many nondescript terms related to RNA synthesis and processing in R- genes in our analysis, and the observation of more significantly enriched terms among our R- genes than among our R+ genes, suggesting that many sepsis-associated pathways causing dysfunctional upregulation of genes are downregulated by hemodynamic therapy in R patients, but not in NR patients.

Autophagy has been identified to play a multifarious role in sepsis cases, with potential both to modulate inflammation and promote cell survival (Iba et al. 2024), and to be dysregulated in sepsis signalling pathways and contribute to tissue damage(Yin et al. 2019). This supports our GSEA’s identification of terms related to the regulation of autophagy as enriched among our R+ genes, and suggests that hemodynamic therapy successfully mediates autophagy in responders, but not in non-responders. (2)

Bibliography

Agrawal, Ayushi, Hasan Balcı, Kristina Hanspers, et al. 2023. “WikiPathways 2024: Next Generation Pathway Database.” Nucleic Acids Research 52 (D1): D679–89. https://doi.org/10.1093/nar/gkad960.
Aleksander, Suzi A, James P Balhoff, Seth Carbon, et al. 2025. “The Gene Ontology Knowledgebase in 2026.” Nucleic Acids Research 54 (D1): D1779–92. https://doi.org/10.1093/nar/gkaf1292.
Barrett, Tanya, Stephen E. Wilhite, Pierre Ledoux, et al. 2012. “NCBI GEO: Archive for Functional Genomics Data Sets—Update.” Nucleic Acids Research 41 (D1): D991–95. https://doi.org/10.1093/nar/gks1193.
Barrett, Tyson, Matt Dowle, Arun Srinivasan, et al. 2006. “Data.table: Extension of ‘Data.frame‘.” In CRAN: Contributed Packages. The R Foundation. https://doi.org/10.32614/cran.package.data.table.
Bushra, Shaik Iqbal Ahmed, Safia Begum, et al. 2024. “Molecular Basis of Sepsis: A New Insight into the Role of Mitochondrial DNA as a Damage-Associated Molecular Pattern.” Mitochondrion 79 (November): 101967. https://doi.org/10.1016/j.mito.2024.101967.
Cao, Zhiyun, and Renã A. S. Robinson. 2014. “The Role of Proteomics in Understanding Biological Mechanisms of Sepsis.” PROTEOMICS – Clinical Applications 8 (1–2): 35–52. https://doi.org/10.1002/prca.201300101.
Chen, Yunshun, Lizhong Chen, Aaron T L Lun, Pedro Baldoni, and Gordon K Smyth. 2025. edgeR V4: Powerful Differential Analysis of Sequencing Data with Expanded Functionality and Improved Support for Small Counts and Larger Datasets.” Nucleic Acids Research 53 (2): gkaf018. https://doi.org/10.1093/nar/gkaf018.
Croft, D., G. O’Kelly, G. Wu, et al. 2010. “Reactome: A Database of Reactions, Pathways and Biological Processes.” Nucleic Acids Research 39 (Database): D691–97. https://doi.org/10.1093/nar/gkq1018.
Davis, Sean, and Paul S. Meltzer. 2007. “GEOquery: A Bridge Between the Gene Expression Omnibus (GEO) and BioConductor.” Bioinformatics 23 (14): 1846–47. https://doi.org/10.1093/bioinformatics/btm254.
Durinck, Steffen, Yves Moreau, Arek Kasprzyk, et al. 2005. “BioMart and Bioconductor: A Powerful Link Between Biological Databases and Microarray Data Analysis.” Bioinformatics 21: 3439–40.
Gagolewski, Marek. 2022. stringi: Fast and Portable Character String Processing in R.” Journal of Statistical Software 103 (2): 1–59. https://doi.org/10.18637/jss.v103.i02.
Gu, Jin, Dong-Fang Wang, and Jian-Ying Lou. 2025. “Identification of DNA Damage Repair-Related Genes in Sepsis Using Bioinformatics and Machine Learning: An Observational Study.” Medicine 104 (5): e41354. https://doi.org/10.1097/md.0000000000041354.
Gu, Zuguang. 2022. “Complex Heatmap Visualization.” iMeta, ahead of print. https://doi.org/10.1002/imt2.43.
Gu, Zuguang, Lei Gu, Roland Eils, Matthias Schlesner, and Benedikt Brors. 2014. “Circlize Implements and Enhances Circular Visualization in r.” Bioinformatics, ahead of print. https://doi.org/10.1093/bioinformatics/btu393.
Hattori, Yuichi, Kohshi Hattori, Tokiko Suzuki, and Naoyuki Matsuda. 2017. “Recent Advances in the Pathophysiology and Molecular Basis of Sepsis-Associated Organ Dysfunction: Novel Therapeutic Implications and Challenges.” Pharmacology &Amp; Therapeutics 177 (September): 56–66. https://doi.org/10.1016/j.pharmthera.2017.02.040.
Huber, W., Carey, et al. 2015. Orchestrating High-Throughput Genomic Analysis with Bioconductor.” Nature Methods 12 (2): 115–21. http://www.nature.com/nmeth/journal/v12/n2/full/nmeth.3252.html.
Iannone, Richard, Joe Cheng, Barret Schloerke, et al. 2026. Gt: Easily Create Presentation-Ready Display Tables. https://gt.rstudio.com.
Iba, Toshiaki, Julie Helms, Cheryl L. Maier, Ricard Ferrer, and Jerrold H. Levy. 2024. “Autophagy and Autophagic Cell Death in Sepsis: Friend or Foe?” Journal of Intensive Care 12 (1). https://doi.org/10.1186/s40560-024-00754-y.
Joffre, Jérémie, Judith Hellman, Can Ince, and Hafid Ait-Oufella. 2020. “Endothelial Responses in Sepsis.” American Journal of Respiratory and Critical Care Medicine 202 (3): 361–70. https://doi.org/10.1164/rccm.201910-1911tr.
Kandasamy, Kumaran, S Sujatha Mohan, Rajesh Raju, et al. 2010. “NetPath: A Public Resource of Curated Signal Transduction Pathways.” Genome Biology 11 (1). https://doi.org/10.1186/gb-2010-11-1-r3.
Kolberg, Liis, Uku Raudvere, Ivan Kuzmin, Jaak Vilo, and Hedi Peterson. 2020. “Gprofiler2– an r Package for Gene List Functional Enrichment Analysis and Namespace Conversion Toolset g:profiler.” F1000Research 9 (ELIXIR) (709).
Kucera, Mike, Ruth Isserlin, Arkady Arkhangorodsky, and Gary D. Bader. 2016. “AutoAnnotate: A Cytoscape App for Summarizing Networks with Semantic Annotations.” F1000Research 5 (July): 1717. https://doi.org/10.12688/f1000research.9090.1.
Langston, Jordan C, Michael T Rossi, Qingliang Yang, et al. 2022. “Omics of Endothelial Cell Dysfunction in Sepsis.” Vascular Biology 4 (1): R15–34. https://doi.org/10.1530/vb-22-0003.
Liberzon, Arthur, Chet Birger, Helga Thorvaldsdóttir, Mahmoud Ghandi, Jill P. Mesirov, and Pablo Tamayo. 2015. “The Molecular Signatures Database Hallmark Gene Set Collection.” Cell Systems 1 (6): 417–25. https://doi.org/10.1016/j.cels.2015.12.004.
Love, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.” Genome Biology 15: 550. https://doi.org/10.1186/s13059-014-0550-8.
Merico, Daniele, Ruth Isserlin, Oliver Stueker, Andrew Emili, and Gary D. Bader. 2010. “Enrichment Map: A Network-Based Method for Gene-Set Enrichment Visualization and Interpretation.” PLoS ONE 5 (11): e13984. https://doi.org/10.1371/journal.pone.0013984.
Mi, Huaiyu, Anushya Muruganujan, John T Casagrande, and Paul D Thomas. 2013. “Large-Scale Gene Function Analysis with the PANTHER Classification System.” Nature Protocols 8 (8): 1551–66. https://doi.org/10.1038/nprot.2013.092.
Morgan, Martin, Valerie Obenchain, Jim Hester, and Hervé Pagès. 2025. SummarizedExperiment: A Container (S4 Class) for Matrix-Like Assays. https://doi.org/10.18129/B9.bioc.SummarizedExperiment.
Müller, Kirill, and Hadley Wickham. 2025. Tibble: Simple Data Frames. https://tibble.tidyverse.org/.
Reimand, Jüri, Ruth Isserlin, Veronique Voisin, et al. 2019. “Pathway Enrichment Analysis and Visualization of Omics Data Using g:profiler, GSEA, Cytoscape and EnrichmentMap.” Nature Protocols 14 (2): 482–517. https://doi.org/10.1038/s41596-018-0103-9.
Reimand, Jüri, Meelis Kull, Hedi Peterson, Jaanus Hansen, and Jaak Vilo. 2007. “G:profiler—a Web-Based Toolset for Functional Profiling of Gene Lists from Large-Scale Experiments.” Nucleic Acids Research 35 (suppl_2): W193–200. https://doi.org/10.1093/nar/gkm226.
Rodchenkov, Igor, Ozgun Babur, Augustin Luna, et al. 2019. “Pathway Commons 2019 Update: Integration, Analysis and Exploration of Pathway Data.” Nucleic Acids Research, ahead of print, October. https://doi.org/10.1093/nar/gkz946.
Shannon, Paul, Andrew Markiel, Owen Ozier, et al. 2003. “Cytoscape: A Software Environment for Integrated Models of Biomolecular Interaction Networks.” Genome Research 13 (11): 2498–504. https://doi.org/10.1101/gr.1239303.
Subramanian, Aravind, Pablo Tamayo, Vamsi K. Mootha, et al. 2005. “Gene Set Enrichment Analysis: A Knowledge-Based Approach for Interpreting Genome-Wide Expression Profiles.” Proceedings of the National Academy of Sciences 102 (43): 15545–50. https://doi.org/10.1073/pnas.0506580102.
Temple Lang, Duncan. 2025. RCurl: General Network (HTTP/FTP/...) Client Interface for r. https://doi.org/10.32614/CRAN.package.RCurl.
Trupp, Miles, Tomer Altman, Carol A Fulcher, et al. 2010. “Beyond the Genome (BTG) Is a (PGDB) Pathway Genome Database: HumanCyc.” Genome Biology 11 (Suppl 1): O12. https://doi.org/10.1186/gb-2010-11-s1-o12.
Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
Wickham, Hadley, and Jennifer Bryan. 2025. Readxl: Read Excel Files. https://readxl.tidyverse.org.
Wickham, Hadley, Romain François, Lionel Henry, Kirill Müller, and Davis Vaughan. 2023. Dplyr: A Grammar of Data Manipulation. https://doi.org/10.32614/CRAN.package.dplyr.
Wickham, Hadley, Davis Vaughan, and Maximilian Girlich. 2025. Tidyr: Tidy Messy Data. https://doi.org/10.32614/CRAN.package.tidyr.
Wishart, David S, Ray Kruger, Aadhavya Sivakumaran, et al. 2023. “PathBank 2.0—the Pathway Database for Model Organism Metabolomics.” Nucleic Acids Research 52 (D1): D654–62. https://doi.org/10.1093/nar/gkad1041.
Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
Yin, Xin, Huang Xin, Shuai Mao, Guangping Wu, and Liheng Guo. 2019. “The Role of Autophagy in Sepsis: Protection and Injury to Organs.” Frontiers in Physiology 10 (August). https://doi.org/10.3389/fphys.2019.01071.
LS0tCnRpdGxlOiAiRGlmZmVyZW50aWFsIEdlbmUgRXhwcmVzc2lvbiBpbiBTZXB0aWMgU2hvY2sgUGF0aWVudHMgQmFzZWQgb24gUmVzcG9uc2UgdG8gRWFybHkgU3VwcG9ydGl2ZSBIZW1vZHluYW1pYyBUaGVyYXB5IgpzdWJ0aXRsZTogIkFzc2lnbm1lbnQgMiIKYXV0aG9yOiAiT3dlbiBMbyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDIKICAgIGNvZGVfZm9sZGluZzogc2hvdwpiaWJsaW9ncmFwaHk6IEEyX2JpYi5iaWIKbGluay1jaXRhdGlvbnM6IHRydWUKLS0tCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJrbml0ciIsIHF1aWV0bHkgPSBUUlVFKSkgewogIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikKfQppZighcmVxdWlyZU5hbWVzcGFjZSgicmVhZHhsIiwgcXVpZXRseSA9IFRSVUUpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikKfQppZighcmVxdWlyZU5hbWVzcGFjZSgiZ3QiLCBxdWlldGx5ID0gVFJVRSkpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJndCIpCn0KbGlicmFyeShrbml0cikKbGlicmFyeShSQ3VybCkKbGlicmFyeShncHJvZmlsZXIyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpYmJsZSkKbGlicmFyeShzdHJpbmdpKQpsaWJyYXJ5KEJpb2NHZW5lcmljcykKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KEdFT3F1ZXJ5KQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShiaW9tYVJ0KQpsaWJyYXJ5KGVkZ2VSKQpsaWJyYXJ5KFN1bW1hcml6ZWRFeHBlcmltZW50KQpsaWJyYXJ5KERFU2VxMikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KENvbXBsZXhIZWF0bWFwKQpsaWJyYXJ5KGNpcmNsaXplKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGd0KQpgYGAKClRoaXMgd29ya2Jvb2sgdXNlcyB0aGUgR0VPUXVlcnkgW0BEYXZpczIwMDddLCBiaW9tYVJ0IFtARHVyaW5jazIwMDVdLCB0aWJibGUgW0BNdWVsbGVyMjAyNV0sIHJlYWR4bFtAV2lja2hhbTIwMjVdLCBkcGx5ciBbQFdpY2toYW0yMDIzXSwgdGlkeXIgW0BXaWNraGFtMjAyNWFdLCBrbml0ciBbQFhpZTIwMTRdLCBERVNlcTIgW0BMb3ZlMjAxNF0sIGVkZ2VSIFtAQ2hlbjIwMjVdLCBTdW1tYXJpemVkRXhwZXJpbWVudFtATW9yZ2FuMjAyNV0sIGdncGxvdDIgW0BXaWNraGFtMjAxNl0sIENvbXBsZXhIZWF0bWFwIFtAR3UyMDIyXSwgZGF0YS50YWJsZSBbQEJhcnJldHQyMDA2XSwgUkN1cmwgW0BUZW1wbGVMYW5nMjAyNV0sIEJpb2NHZW5lcmljcyBbQEh1YmVyMjAxNV0sIHN0cmluZ2kgW0BHYWdvbGV3c2tpMjAyMl0sIGd0IFtASWFubm9uZTIwMjZdIGFuZCBjaXJjbGl6ZSBbQEd1MjAxNF0gcGFja2FnZXMgaW4gaXRzIGNvZGUgY2h1bmtzLgoKIyBJbnRyb2R1Y3Rpb24KClNlcHRpYyBzaG9jayBpcyBhIGNvbXBsaWNhdGlvbiBvZiBzZXBzaXMgd2l0aCBzZXZlcmUgYW5kIHBvdGVudGlhbGx5IGZhdGFsIGNvbnNlcXVlbmNlcy4gVHJlYXRtZW50IGZvciBzZXB0aWMgc2hvY2sgaXMgbGFyZ2VseSBkZXBlbmRlbnQgb24gc3VwcG9ydGl2ZSBoZW1vZHluYW1pYyB0aGVyYXB5LCBidXQgcGF0aWVudCByZXNwb25zZSB0byBzdWNoIHRoZXJhcGllcyBpcyB2YXJpYWJsZSwgYW5kIHdoaWxlIHNvbWUgc2VwdGljIHNob2NrIHBhdGllbnRzLCByZXNwb25kZXJzLCBleGhpYml0IHNpZ25pZmljYW50IGltcHJvdmVtZW50IG9mIG9yZ2FuIGZ1bmN0aW9uIHdpdGhpbiBhIGZldyBkYXlzIG9mIHRyZWF0bWVudCBpbiB0aGUgSUNVLCBvdGhlciBwYXRpZW50cywgbm9uLXJlc3BvbmRlcnMsIGRvIG5vdCBleGhpYml0IGVhcmx5IGltcHJvdmVtZW50LiBDaGFuZ2VzIGluIG9yZ2FuIGZ1bmN0aW9uIGR1cmluZyB0aGUgZWFybHkgc3RhZ2VzIG9mIHRyZWF0bWVudCBhcmUgaGlnaGx5IHByZWRpY3RpdmUgb2YgZmluYWwgb3V0Y29tZSwgYW5kIGZhdGFsIGNhc2VzIG9mIHNlcHRpYyBzaG9jayBhcmUgYXNzb2NpYXRlZCB3aXRoIG1ham9yIHRyYW5zY3JpcHRvbWljIGNoYW5nZXMgaW4gdGhlIGluaXRpYWwgc3RhZ2VzIG9mIHRoZSBjb25kaXRpb24sIHNvIHRoZSBkaXN0aW5jdGlvbiBvZiBnZW5lIGV4cHJlc3Npb24gcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHJlc3BvbmRlcnMgYW5kIG5vbi1yZXNwb25kZXJzIGlzIGluZm9ybWF0aXZlIGFzIHRvIHRoZSBtZWNoYW5pc21zIHVuZGVybHlpbmcgc2VwdGljIHNob2NrIG1vcnRhbGl0eS4KClRoZSBOQ0JJIEdlbmUgRXhwcmVzc2lvbiBPbW5pYnVzIChHRU8pIFtAQmFycmV0dDIwMTJdIHNlcmllcyBHU0UxMTA0ODcgaXMgYSBkYXRhc2V0IGZyb20gMjAxOCBjb25zaXN0aW5nIG9mIFJOQSBzZXF1ZW5jaW5nIHJlYWQgY291bnRzIG9mIHdob2xlIGJsb29kIHNhbXBsZXMgdGFrZW4gZnJvbSAxNCBzZXB0aWMgc2hvY2sgcGF0aWVudHMgd2hvIHJlc3BvbmRlZCB0byBoZW1vZHluYW1pYyB0aGVyYXB5IChSIGdyb3VwKSBhbmQgMTcgbm9uLXJlc3BvbmRlcnMgKE5SIGdyb3VwKSwgYXQgdHdvIHRpbWUgcG9pbnRzOiBpbW1lZGlhdGVseSBhZnRlciBJQ1UgYWRtaXNzaW9uIChUMSksIGFuZCA0OCBob3VycyBsYXRlciAoVDIpLCBhZnRlciBzb21lIHRpbWUgdW5kZXJnb2luZyB0cmVhdG1lbnQuCgpJbiBBc3NpZ25tZW50IDEsIHdlIGRvd25sb2FkZWQgdGhlIGRhdGFzZXQgb2YgNTgwOTYgZ2VuZXMgYW5kIDYyIHNhbXBsZXMuIFNpbmNlIHRoZSBkYXRhIHVzZWQgSEdOQyBpZGVudGlmaWVycyBmb3IgdGhlIGdlbmVzLCB3ZSBtYXBwZWQgdGhlc2UgdG8gRU5TRyBpZGVudGlmaWVycyBhbmQgY2xlYW5lZCBvdXQgbG93IGV4cHJlc3Npb24gZ2VuZXMsIGxlYXZpbmcgdXMgd2l0aCAxMzY3MyBnZW5lcy4gV2UgdmlzdWFsaXplZCBhbmQgY29tcGFyZWQgcmF3IGFuZCBub3JtYWxpemVkIHJlYWQgY291bnRzIHdpdGggTURTIHBsb3RzLCBhbmQgbm90ZWQgdGhlIHNpbWlsYXJpdHkgb2YgdGhlaXIgZGlzdHJpYnV0aW9uLiBXZSB0aGVuIGFuYWx5emVkIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGJldHdlZW4gdGhlIFIgcGF0aWVudHMgYW5kIHRoZSBOUiBwYXRpZW50cyBhdCBlYWNoIHRpbWUgcG9pbnQsIGFuZCB3ZSBhbmFseXplZCBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBiZXR3ZWVuIFQxIGFuZCBUMiBpbiBlYWNoIGdyb3VwLiBXZSBub3RlZCBubyBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgYWJvdmUgb3VyIHNpZ25pZmljYW5jZSB0aHJlc2hvbGQgYmV0d2VlbiB0aGUgUiBhbmQgTlIgZ3JvdXBzIGF0IFQxLCBhbmQgNjcgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGJldHdlZW4gdGhlIHBhdGllbnQgZ3JvdXBzIGF0IFQyLCBzbyB3ZSBkZXRlcm1pbmVkIHRoYXQgYW5hbHl6aW5nIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGJldHdlZW4gUiBhbmQgTlIgYXQgVDIgd291bGQgcHJvdmlkZSBpbnNpZ2h0IGludG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHJhbnNjcmlwdG9taWMgcmVzcG9uc2VzIG9mIHRoZSB0d28gZ3JvdXBzIHRvIGhlbW9keW5hbWljIHRoZXJhcHkuIFdlIGNvbmNsdWRlZCBieSB2aXN1YWxpemluZyB0aGUgZ2VuZXMgdGhhdCB3ZXJlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBpbiBSIHZzLiBOUiBhdCBUMiB3aXRoIGEgdm9sY2FubyBwbG90IGFuZCBhIGhlYXRtYXAuIFRoZSBjb2RlIHVzZWQgaW4gYXNzaWdubWVudCAxIGlzIGNvbnRhaW5lZCBhbmQgaGlkZGVuIGluIHRoaXMgbm90ZWJvb2suCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KZ2VvX2lkIDwtICJHU0UxMTA0ODciCgojIGdldCBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggZ3NlIGFuZCBzdXBwbGVtZW50YXJ5IGZpbGVzCmdzZSA8LSBHRU9xdWVyeTo6Z2V0R0VPKGdlb19pZCwgR1NFTWF0cml4PUZBTFNFKQpzdXBwIDwtIEdFT3F1ZXJ5OjpnZXRHRU9TdXBwRmlsZXMoZ2VvX2lkLCBmZXRjaF9maWxlcz1GQUxTRSkKCiMgZG93bmxvYWQgZGF0YSBpZiBub3QgYWxyZWFkeSBkb3dubG9hZGVkCmN1cnJlbnRfZGlyIDwtIGZpbGUucGF0aChnZXR3ZCgpKQpzdXBwX2ZpbGVfcGF0aCA8LSBmaWxlLnBhdGgoY3VycmVudF9kaXIsIGdlb19pZCwgc3VwcCRmbmFtZVsxXSkKaWYgKCFmaWxlLmV4aXN0cyhzdXBwX2ZpbGVfcGF0aCkpIHsKICBkYXRhX2ZpbGUgPC0gR0VPcXVlcnk6OmdldEdFT1N1cHBGaWxlcyhHRU8gPSBnZW9faWQpCn0KCiMgcmVhZCBkYXRhIGludG8gYSBkYXRhZnJhbWUKcmF3X2NvdW50cyA8LSByZWFkeGw6OnJlYWRfeGxzeChzdXBwX2ZpbGVfcGF0aCkKCiMgdGFrZSBhIHBlZWsKa25pdHI6OmthYmxlKHJhd19jb3VudHNbMTo1LCAxOjEwXSwgZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9ICJjIikKCiMgY291bnQgZ2VuZXMgYW5kIHNhbXBsZXMKY2F0KHBhc3RlKCJOdW1iZXIgb2YgZ2VuZXM6ICIsIG5yb3cocmF3X2NvdW50cyksCiAgICAgICAgICAiXG5OdW1iZXIgb2Ygc2FtcGxlczogIiwgbmNvbChyYXdfY291bnRzKS0xKSkKCiMgcmV0cmlldmUgbGlzdCBvZiBzYW1wbGVzIGluIHRoZSBzZXJpZXMsIGFuZCBjb21waWxlIGNvbmRpdGlvbiBkYXRhIGZvciBlYWNoCnNhbXBsZXMgPC0gZ3NlQGdzbXMKc2FtcGxlX3NvdXJjZXMgPC0gZG8uY2FsbChyYmluZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFwcGx5KHNhbXBsZXMsIEZVTj1mdW5jdGlvbih4KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoeEBoZWFkZXIkdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhAaGVhZGVyJHNvdXJjZV9uYW1lX2NoMSl9KSkKCiMgVXNlIHRoaXMgZGF0YSB0byBjcmVhdGUgYSBkYXRhZnJhbWUgbWFwcGluZyBzYW1wbGUgdGl0bGVzIHRvIHJlc3BvbmRlciBzdGF0dXMgYW5kIHRpbWUgcG9pbnQKc2FtcGxlX21ldGFkYXRhIDwtIGFzLmRhdGEuZnJhbWUoc2FtcGxlX3NvdXJjZXMsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKY29sbmFtZXMoc2FtcGxlX21ldGFkYXRhKSA9IGMoInNhbXBsZSIsICJzb3VyY2UiKQpzYW1wbGVfbWV0YWRhdGEgPC0gc2FtcGxlX21ldGFkYXRhICU+JSAKICBtYWdyaXR0cjo6c2V0X3Jvd25hbWVzKC4kc2FtcGxlKSAlPiUgCiAgbXV0YXRlKAogICAgcmVzcG9uc2UgPSBpZmVsc2UoZ3JlcGwoIl5SZXNwb25kZXIiLCBzb3VyY2UpLCAiUiIsICJOUiIpLAogICAgdGltZV9wb2ludCA9IGlmZWxzZShncmVwbCgiVDEiLCBzb3VyY2UpLCAiVDEiLCAiVDIiKSwKICApICU+JSAKICBkcGx5cjo6c2VsZWN0KHJlc3BvbnNlLCB0aW1lX3BvaW50KQoKIyB0YWtlIGEgcGVlawprbml0cjo6a2FibGUoc2FtcGxlX21ldGFkYXRhWzE6NSxdLCBmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gImMiKQoKIyBjYWxjdWxhdGluZyBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIGVhY2ggc2FtcGxlCnNhbXBsZV9zdW1tYXJpZXMgPC0gZGF0YS5mcmFtZShkby5jYWxsKGNiaW5kLCBsYXBwbHkocmF3X2NvdW50c1ssIDI6bmNvbChyYXdfY291bnRzKV0sIHN1bW1hcnkpKSkKcXVhbF9vdmVydmlldyA8LSBhcy5kYXRhLmZyYW1lKHQoc2FtcGxlX3N1bW1hcmllcykpCgojIEFkZGluZyBleHRyYSBzdGF0aXN0aWNzIGZvciB0b3RhbCByZWFkcywgbnVtYmVyIG9mIGdlbmVzIHdpdGggemVybyBleHByZXNzaW9uLCBudW1iZXIgb2YgZ2VuZXMgd2l0aCBsb3cgZXhwcmVzc2lvbgpxdWFsX292ZXJ2aWV3IDwtIHF1YWxfb3ZlcnZpZXcgJT4lIAogIGRwbHlyOjptdXRhdGUodG90YWxfcmVhZHMgPSBjb2xTdW1zKHJhd19jb3VudHNbMjpuY29sKHJhd19jb3VudHMpXSksCiAgICAgICAgICAgICAgICB6ZXJvX2V4cCA9IGNvbFN1bXMocmF3X2NvdW50c1syOm5jb2wocmF3X2NvdW50cyldID09IDApLAogICAgICAgICAgICAgICAgbG93X2V4cCA9IGNvbFN1bXMocmF3X2NvdW50c1syOm5jb2wocmF3X2NvdW50cyldPDEwKSwKICAgICAgICAgICAgICAgICkKCiMgYWRkaW5nIG1ldGFkYXRhIHRvIHNvcnQgYnkgY29uZGl0aW9ucwpxdWFsX292ZXJ2aWV3IDwtIG1lcmdlKHF1YWxfb3ZlcnZpZXcsIHNhbXBsZV9tZXRhZGF0YSwgYnkgPSAwKQoKIyBvdmVydmlldyBzdGF0cyBmb3Igc2FtcGxlcyBmcm9tIG5vbi1yZXNwb25kZXJzIGFuZCByZXNwb25kZXJzCnN0YXRzX2J5X3Jlc3BvbnNlIDwtIHF1YWxfb3ZlcnZpZXcgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHJlc3BvbnNlLCkgJT4lCiAgc3VtbWFyaXplKAogICAgTnVtU2FtcGxlcyA9IG4oKSwKICAgIE1lYW5MaWJTaXplID0gbWVhbih0b3RhbF9yZWFkcyksCiAgICBTRExpYlNpemUgPSBzZCh0b3RhbF9yZWFkcyksCiAgICBQcm9wWmVyb0V4cCA9IG1lYW4oemVyb19leHApIC8gbnJvdyhyYXdfY291bnRzKSwKICAgIFByb3BMb3dFeHAgPSBtZWFuKGxvd19leHApIC8gbnJvdyhyYXdfY291bnRzKSwKICApCgojIG92ZXJ2aWV3IHN0YXRzIGZvciBzYW1wbGVzIGZyb20gdGltZSBwb2ludCAxIGFuZCB0aW1lIHBvaW50IDIKc3RhdHNfYnlfdGltZSA8LSBxdWFsX292ZXJ2aWV3ICU+JQogIGRwbHlyOjpncm91cF9ieSh0aW1lX3BvaW50LCkgJT4lCiAgc3VtbWFyaXplKAogICAgTnVtU2FtcGxlcyA9IG4oKSwKICAgIE1lYW5MaWJTaXplID0gbWVhbih0b3RhbF9yZWFkcyksCiAgICBTRExpYlNpemUgPSBzZCh0b3RhbF9yZWFkcyksCiAgICBQcm9wWmVyb0V4cCA9IG1lYW4oemVyb19leHApIC8gbnJvdyhyYXdfY291bnRzKSwKICAgIFByb3BMb3dFeHAgPSBtZWFuKGxvd19leHApIC8gbnJvdyhyYXdfY291bnRzKSwKICApCgojIG1lcmdpbmcgdGFibGVzIGFuZCBkaXNwbGF5aW5nCnN0YXRzX2J5X2NvbmRpdGlvbiA8LSBiaW5kX3Jvd3MoCiAgICBzdGF0c19ieV9yZXNwb25zZSAlPiUgCiAgICAgICAgZHBseXI6Om11dGF0ZShncm91cF90eXBlID0gInJlc3BvbnNlIikgJT4lCiAgICAgICAgZHBseXI6OnJlbmFtZShjb25kaXRpb24gPSByZXNwb25zZSksCiAgICBzdGF0c19ieV90aW1lICU+JSAKICAgICAgICBkcGx5cjo6bXV0YXRlKGdyb3VwX3R5cGUgPSAidGltZV9wb2ludCIpICU+JQogICAgICAgIGRwbHlyOjpyZW5hbWUoY29uZGl0aW9uID0gdGltZV9wb2ludCkKICAgICkKa25pdHI6OmthYmxlKHN0YXRzX2J5X2NvbmRpdGlvblssMTo2XSwgZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9ICJjIikKCiMgZ2V0IGVuc2VtYmwgdmVyc2lvbiAxMDAgYW5kIHRoZSBodW1hbiBnZW5lIGRhdGFzZXQKZW5zZW1ibCA8LSBiaW9tYVJ0Ojp1c2VFbnNlbWJsKGJpb21hcnQgPSAiZW5zZW1ibCIpCmVuc2VtYmwgPC0gYmlvbWFSdDo6dXNlRGF0YXNldCgiaHNhcGllbnNfZ2VuZV9lbnNlbWJsIiwgbWFydCA9IGVuc2VtYmwpCgojIHN0b3JlIGVuc2VtYmwgSURzIGZyb20gdGhlIGRhdGEgYXMgYSB2ZWN0b3IKZW5zZW1ibF9pZHMgPC0gcmF3X2NvdW50cyRHZW5laWQKCiMgY2hlY2sgaWYgYW4gZW5zZW1ibCB0byBoZ25jIGNvbnZlcnNpb24gZmlsZSBleGlzdHMgYWxyZWFkeQpjb252ZXJzaW9uX3N0YXNoIDwtICJlbnNlbWJsX3RvX2hnbmMucmRzIgppZiAoZmlsZS5leGlzdHMoY29udmVyc2lvbl9zdGFzaCkpIHsKICAKICAjIGlmIHRoZSBmaWxlIGV4aXN0cywgcmVhZCBjb252ZXJzaW9uIGRhdGEgZnJvbSB0aGF0CiAgZW5zZW1ibF90b19oZ25jIDwtIHJlYWRSRFMoY29udmVyc2lvbl9zdGFzaCkKfSBlbHNlIHsKICAKICAjIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBnZXQgY29udmVyc2lvbiBkYXRhIGZyb20gYmlvbWFSdCBhbmQgY2FjaGUgaXQKICBlbnNlbWJsX3RvX2hnbmMgPC0gYmlvbWFSdDo6Z2V0Qk0oYXR0cmlidXRlcyA9IGMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVycyA9IGMoImVuc2VtYmxfZ2VuZV9pZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gZW5zZW1ibF9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBtYXJ0ID0gZW5zZW1ibCkKICBzYXZlUkRTKGVuc2VtYmxfdG9faGduYywgY29udmVyc2lvbl9zdGFzaCkKfQoKIyBtZXJnZSBjb252ZXJzaW9uIGRmIHdpdGggZGF0YSBhbmQgcmVhcnJhbmdlIHN1Y2ggdGhhdCBib3RoIGlkIGNvbHVtbnMgY29tZSBiZWZvcmUgc2FtcGxlcwpyYXdfY291bnRzX2Fubm90IDwtIGRwbHlyOjpsZWZ0X2pvaW4ocmF3X2NvdW50cywgZW5zZW1ibF90b19oZ25jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiR2VuZWlkIiA9ICJlbnNlbWJsX2dlbmVfaWQiKSkKcmF3X2NvdW50c19jb2xzIDwtIGRwbHlyOjpzZXRkaWZmKG5hbWVzKHJhd19jb3VudHMpLCAiR2VuZWlkIikKY29sbmFtZXMocmF3X2NvdW50c19hbm5vdClbMV0gPSAiZW5zZW1ibF9nZW5lX2lkIgpyYXdfY291bnRzX2Fubm90IDwtIHJhd19jb3VudHNfYW5ub3RbLCBjKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCByYXdfY291bnRzX2NvbHMpXQoKIyBwZWVrIGF0IGFubm90YXRlZCBjb3VudHMKa25pdHI6OmthYmxlKHJhd19jb3VudHNfYW5ub3RbMTo1LCAxOjEwXSwgZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9ICJjIikKCiMgc3Vic2V0IHJvd3Mgd2hlcmUgb25lIGVuc2VtYmwgaWQgbWFwcyB0byBtdWx0aXBsZSBoZ25jIHN5bWJvbHMKZW5zZW1ibF9kdXBzIDwtIHJhd19jb3VudHNfYW5ub3QkZW5zZW1ibF9nZW5lX2lkW2R1cGxpY2F0ZWQocmF3X2NvdW50c19hbm5vdCRlbnNlbWJsX2dlbmVfaWQpXQptdWx0aXBsZV9oZ25jIDwtIHJhd19jb3VudHNfYW5ub3QgJT4lIAogIGZpbHRlcihlbnNlbWJsX2dlbmVfaWQgJWluJSBlbnNlbWJsX2R1cHMpCgojIHN1YnNldCByb3dzIHdoZXJlIG11bHRpcGxlIGVuc2VtYmwgaWRzIG1hcCB0byBvbmUgaGduYyBzeW1ib2wKaGduY19kdXBzIDwtIHJhd19jb3VudHNfYW5ub3QkaGduY19zeW1ib2xbZHVwbGljYXRlZChyYXdfY291bnRzX2Fubm90JGhnbmNfc3ltYm9sKV0Kc2FtZV9oZ25jIDwtIHJhd19jb3VudHNfYW5ub3QgJT4lIAogIGZpbHRlcihoZ25jX3N5bWJvbCAlaW4lIGhnbmNfZHVwcyAmIGhnbmNfc3ltYm9sICE9ICIiKQoKIyBzdWJzZXQgcm93cyB3aGVyZSBlbnNlbWJsIGlkIGRvZXMgbm90IG1hcCB0byBhIGhnbmMgc3ltYm9sIAp1bm1hcHBlZCA8LSByYXdfY291bnRzX2Fubm90ICU+JSAKICBmaWx0ZXIoaXMubmEoaGduY19zeW1ib2wpIHwgaGduY19zeW1ib2wgPT0gIiIpCgpjYXQocGFzdGUobnJvdyh1bm1hcHBlZCksICJ1bm1hcHBlZCByb3dzXG4iLAogICAgICAgICAgbnJvdyhtdWx0aXBsZV9oZ25jKSwgCiAgICAgICAgICAicm93cyB3aGVyZSBvbmUgRU5TRyBJRCBtYXBzIHRvIG11bHRpcGxlIEhHTkMgc3ltYm9scyBcbiIsCiAgICAgICAgICBucm93KHNhbWVfaGduYyksIAogICAgICAgICAgInJvd3Mgd2hlcmUgbXVsdGlwbGUgRU5TRyBJRHMgbWFwIHRvIHRoZSBzYW1lIEhHTkMgc3ltYm9sIikpCgojIHNpemUgb2Ygc21hbGxlc3QgY29uZGl0aW9uIGdyb3VwIGluIHRoZSBkYXRhc2V0OiBub24tcmVzcG9uZGVycyBhdCB0aW1lIHBvaW50IDEvMgpzbWFsbGVzdF9ncm91cF9zaXplIDwtIDExCgojIGtlZXAgb25seSB1bm1hcHBlZCByb3dzIHRoYXQgaGF2ZSBhIGNvdW50IG9mIGF0IGxlYXN0IDEwIGluIDExIHNhbXBsZXMKcm93c190b19rZWVwIDwtIHJvd1N1bXModW5tYXBwZWQgPj0gMTApID49IHNtYWxsZXN0X2dyb3VwX3NpemUKY2xlYW5fdW5tYXBwZWQgPC0gdW5tYXBwZWRbcm93c190b19rZWVwLF0KCiMgc3Vic2V0IG1hcHBlZCBjb3VudHMgCm1hcHBlZCA8LSByYXdfY291bnRzX2Fubm90ICU+JSAKICBmaWx0ZXIoIWlzLm5hKGhnbmNfc3ltYm9sKSAmIGhnbmNfc3ltYm9sICE9ICIiKQoKIyBhcHBseSBzYW1lIGV4cHJlc3Npb24gZmlsdGVyIHRvIG1hcHBlZCBjb3VudHMgCnJvd3NfdG9fa2VlcCA8LSByb3dTdW1zKG1hcHBlZCA+PSAxMCkgPj0gc21hbGxlc3RfZ3JvdXBfc2l6ZQpjbGVhbl9tYXBwZWQgPC0gbWFwcGVkW3Jvd3NfdG9fa2VlcCxdCgojIGNvbGxhdGUgYW5kIGRpc3BsYXkgcmVzdWx0cyBvZiBmaWx0ZXJpbmcKY2xlYW5pbmdfcmVzdWx0cyA8LSBkYXRhLmZyYW1lKAogIFR5cGUgPSBjKCJtYXBwZWQgZ2VuZXMiLCAidW5tYXBwZWQgZ2VuZXMiKSwKICBQcmVDbGVhbkNvdW50ID0gYyhucm93KG1hcHBlZCksIG5yb3codW5tYXBwZWQpKSwKICBQb3N0Q2xlYW5Db3VudCA9IGMobnJvdyhjbGVhbl9tYXBwZWQpLCBucm93KGNsZWFuX3VubWFwcGVkKSksCiAgU2lnbmlmaWNhbnRQcm9wb3J0aW9uID0gYyhucm93KGNsZWFuX21hcHBlZCkvbnJvdyhtYXBwZWQpLCAKICAgICAgICAgICAgICAgICAgICAgbnJvdyhjbGVhbl91bm1hcHBlZCkvbnJvdyh1bm1hcHBlZCkpCikKa25pdHI6OmthYmxlKGNsZWFuaW5nX3Jlc3VsdHMsIGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSAiYyIpCgojIGNyZWF0ZSBhIG5ldyBkYXRhZnJhbWUgd2hlcmUgcm93cyBjb3JyZXNwb25kIHRvIHVuaXF1ZSBoZ25jIHN5bWJvbHMKY2xlYW5fY291bnRzX2J5aGduYyA8LSBjbGVhbl9tYXBwZWQgJT4lIAogIGRwbHlyOjpncm91cF9ieShoZ25jX3N5bWJvbCkgJT4lIAogICMgc3VtIHJvd3MgdGhhdCBtYXAgdG8gdGhlIHNhbWUgaGduYyBzeW1ib2wKICBkcGx5cjo6c3VtbWFyaXNlKGRwbHlyOjphY3Jvc3MoZHBseXI6OndoZXJlKGlzLm51bWVyaWMpLCB+IHN1bSgueCwgbmEucm0gPSBUUlVFKSkpCgprbml0cjo6a2FibGUoY2xlYW5fY291bnRzX2J5aGduY1sxOjUsIDE6MTBdLCBmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gImMiKQoKY2F0KHBhc3RlKCJOdW1iZXIgb2YgZ2VuZXM6ICIsIG5yb3coY2xlYW5fY291bnRzX2J5aGduYyksCiAgICAgICAgICAiXG5OdW1iZXIgb2Ygc2FtcGxlczogIiwgbmNvbChjbGVhbl9jb3VudHNfYnloZ25jKS0xKSkKCiMgZXh0cmFjdCBjb3VudHMgYXMgYSBtYXRyaXggYW5kIHNldCByb3cgYW5kIGNvbHVtbiBuYW1lcwpjbGVhbl9jb3VudF9tYXRyaXggPC0gYXMubWF0cml4KGNsZWFuX2NvdW50c19ieWhnbmNbLDI6bmNvbChjbGVhbl9jb3VudHNfYnloZ25jKV0pCnJvd25hbWVzKGNsZWFuX2NvdW50X21hdHJpeCkgPC0gY2xlYW5fY291bnRzX2J5aGduYyRoZ25jX3N5bWJvbApjb2xuYW1lcyhjbGVhbl9jb3VudF9tYXRyaXgpIDwtIGNvbG5hbWVzKGNsZWFuX2NvdW50c19ieWhnbmMpWzI6bmNvbChjbGVhbl9jb3VudHNfYnloZ25jKV0KCiNjcmVhdGUgYSB2YXJpYWJsZSBpbiB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgaW50ZXJhY3Rpb24gb2YgcmVzcG9uc2UgYW5kIHRpbWVfcG9pbnQKc2FtcGxlX21ldGFkYXRhJGdyb3VwID0gaW50ZXJhY3Rpb24oc2FtcGxlX21ldGFkYXRhJHJlc3BvbnNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfbWV0YWRhdGEkdGltZV9wb2ludCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIl8iKQoKIyBjcmVhdGUgYSBERVNlcURhdGFTZXQgb2JqZWN0IGZyb20gdGhlIGNvdW50cyBtYXRyaXggYW5kIHRoZSBzYW1wbGUgbWV0YWRhdGEsIHVzaW5nIHRoZSBpbnRlcmFjdGlvbiBvZiByZXNwb25zZSBhbmQgdGltZSBwb2ludCBhcyB0aGUgZGVzaWduLiAKY291bnRzX2RkcyA8LSBERVNlcTI6OkRFU2VxRGF0YVNldEZyb21NYXRyaXgoY291bnREYXRhID0gY2xlYW5fY291bnRfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhID0gc2FtcGxlX21ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSB+Z3JvdXApCgojIGVzdGltYXRlIG5vcm1hbGl6YXRpb24gZmFjdG9ycyBhbmQgYXBwbHkgdGhlbSB0byBjb3VudHMKY291bnRzX2RkcyA8LSBERVNlcTI6OmVzdGltYXRlU2l6ZUZhY3RvcnMoY291bnRzX2RkcykKbm9ybV9jb3VudHMgPC0gREVTZXEyOjpjb3VudHMoY291bnRzX2Rkcywgbm9ybWFsaXplZCA9IFRSVUUpCgojIGNyZWF0ZSBTdW1tYXJpemVkRXhwZXJpbWVudCBvYmplY3RzIHdpdGggdW4tbm9ybWFsaXplZCBhbmQgbm9ybWFsaXplZCBjb3VudHMKdW5ub3JtX2NvdW50cyA8LSBERVNlcTI6OmNvdW50cyhjb3VudHNfZGRzLCBub3JtYWxpemVkID0gRkFMU0UpCnVubm9ybV9jb3VudHNfc2UgPC0gU3VtbWFyaXplZEV4cGVyaW1lbnQoYXNzYXlzID0gbGlzdChjb3VudHMgPSB1bm5vcm1fY291bnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhID0gc2FtcGxlX21ldGFkYXRhKQpub3JtX2NvdW50c19zZSA8LSBTdW1tYXJpemVkRXhwZXJpbWVudChhc3NheXMgPSBsaXN0KGNvdW50cyA9IG5vcm1fY291bnRzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEgPSBzYW1wbGVfbWV0YWRhdGEpCgojIGdlbmVyYXRlIE1EUyBkYXRhIHdpdGggdW4tbm9ybWFsaXplZCBjb3VudHMKdW5ub3JtX21kcyA8LSBlZGdlUjo6cGxvdE1EUy5TdW1tYXJpemVkRXhwZXJpbWVudCh1bm5vcm1fY291bnRzX3NlLCBwbG90ID0gRkFMU0UpCnVubm9ybV9tZHNfZGYgPC0gZGF0YS5mcmFtZSgKICBEaW0xID0gdW5ub3JtX21kcyR4LAogIERpbTIgPSB1bm5vcm1fbWRzJHksCiAgR3JvdXAgPSB1bm5vcm1fY291bnRzX3NlJGdyb3VwLAogIFNhbXBsZSA9IGNvbG5hbWVzKHVubm9ybV9jb3VudHNfc2UpCikKCiMgZ2VuZXJhdGUgTURTIGRhdGEgd2l0aCBub3JtYWxpemVkIGNvdW50cwpub3JtX21kcyA8LSBlZGdlUjo6cGxvdE1EUy5TdW1tYXJpemVkRXhwZXJpbWVudChub3JtX2NvdW50c19zZSwgcGxvdCA9IEZBTFNFKQpub3JtX21kc19kZiA8LSBkYXRhLmZyYW1lKAogIERpbTEgPSBub3JtX21kcyR4LAogIERpbTIgPSBub3JtX21kcyR5LAogIEdyb3VwID0gbm9ybV9jb3VudHNfc2UkZ3JvdXAsCiAgU2FtcGxlID0gY29sbmFtZXMobm9ybV9jb3VudHNfc2UpCikKCiMgcGxvdCB1bi1ub3JtYWxpemVkIE1EUyAgCmdncGxvdDI6OmdncGxvdCh1bm5vcm1fbWRzX2RmLCBhZXMoeCA9IERpbTEsIHkgPSBEaW0yLCBjb2xvciA9IEdyb3VwKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoCiAgICB4ID0gcGFzdGUoIkRpbTEgKCIsIHJvdW5kKHVubm9ybV9tZHMkdmFyLmV4cGxhaW5lZFsxXSoxMDAsIDEpLCAiJSkiKSwKICAgIHkgPSBwYXN0ZSgiRGltMiAoIiwgcm91bmQodW5ub3JtX21kcyR2YXIuZXhwbGFpbmVkWzJdKjEwMCwgMSksICIlKSIpLAogICAgdGl0bGUgPSAiTURTIHBsb3Q6IHVuLW5vcm1hbGl6ZWQgY291bnRzIgogICkKCiMgcGxvdCBub3JtYWxpemVkIE1EUwpnZ3Bsb3QyOjpnZ3Bsb3Qobm9ybV9tZHNfZGYsIGFlcyh4ID0gRGltMSwgeSA9IERpbTIsIGNvbG9yID0gR3JvdXApKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicygKICAgIHggPSBwYXN0ZSgiRGltMSAoIiwgcm91bmQobm9ybV9tZHMkdmFyLmV4cGxhaW5lZFsxXSoxMDAsIDEpLCAiJSkiKSwKICAgIHkgPSBwYXN0ZSgiRGltMiAoIiwgcm91bmQobm9ybV9tZHMkdmFyLmV4cGxhaW5lZFsyXSoxMDAsIDEpLCAiJSkiKSwKICAgIHRpdGxlID0gIk1EUyBwbG90OiBub3JtYWxpemVkIGNvdW50cyIKICApCgojIGV2YWx1YXRlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uLiBBcHByb3ByaWF0ZSBkZXNpZ24gYWxyZWFkeSBzcGVjaWZpZWQgaW4gY291bnRzX2Rkcwpjb3VudHNfZGRzIDwtIERFU2VxMjo6REVTZXEoY291bnRzX2RkcykKCiMgREUgYmV0d2VlbiBSIGFuZCBOUiBhdCBUMQpyZXNwb25zZV9UMSA8LSBERVNlcTI6OnJlc3VsdHMoY291bnRzX2RkcywgY29udHJhc3QgPSBjKCJncm91cCIsICJOUl9UMSIsICJSX1QxIiksIGFscGhhID0gMC4wNSkKc3VtbWFyeShyZXNwb25zZV9UMSkKCiMgREUgYmV0d2VlbiBSIGFuZCBOUiBhdCBUMiAKcmVzcG9uc2VfVDIgPC0gREVTZXEyOjpyZXN1bHRzKGNvdW50c19kZHMsIGNvbnRyYXN0ID0gYygiZ3JvdXAiLCAiTlJfVDIiLCAiUl9UMiIpLCBhbHBoYSA9IDAuMDUpCnN1bW1hcnkocmVzcG9uc2VfVDIpCgojIERFIGJldHdlZW4gVDEgYW5kIFQyIGZvciBOUiBwYXRpZW50cwp0aW1lX05SIDwtIERFU2VxMjo6cmVzdWx0cyhjb3VudHNfZGRzLCBjb250cmFzdCA9IGMoImdyb3VwIiwgIk5SX1QxIiwgIk5SX1QyIiksIGFscGhhID0wLjA1KQpzdW1tYXJ5KHRpbWVfTlIpCgojIERFIGJldHdlZW4gVDEgYW5kIFQyIGZvciBSIHBhdGllbnRzCnRpbWVfUiA8LSBERVNlcTI6OnJlc3VsdHMoY291bnRzX2RkcywgY29udHJhc3QgPSBjKCJncm91cCIsICJSX1QxIiwgIlJfVDIiKSwgYWxwaGEgPSAwLjA1KQpzdW1tYXJ5KHRpbWVfUikKCiMgZ2V0IGdlbmVzIHdpdGggYWRqdXN0ZWQgcC12YWx1ZSA8IDAuMDUgZm9yIGVhY2ggdGVzdApzaWdfVDEgPC0gcmVzcG9uc2VfVDFbcmVzcG9uc2VfVDEkcGFkaiA8IDAuMDUsXQpzaWdfVDIgPC0gcmVzcG9uc2VfVDJbcmVzcG9uc2VfVDIkcGFkaiA8IDAuMDUsXQpzaWdfTlIgPC0gdGltZV9OUlt0aW1lX05SJHBhZGogPCAwLjA1LF0Kc2lnX1IgPC0gdGltZV9SW3RpbWVfUiRwYWRqIDwgMC4wNSxdCgpjYXQocGFzdGUobnJvdyhzaWdfVDEpLCAiREUgZ2VuZXMgYmV0d2VlbiBSIGFuZCBOUiBhdCBUMVxuIiwKICAgICAgICAgIG5yb3coc2lnX1QyKSwgIkRFIGdlbmVzIGJldHdlZW4gUiBhbmQgTlIgYXQgVDJcbiIsCiAgICAgICAgICBucm93KHNpZ19OUiksICJERSBnZW5lcyBmcm9tIFQxIHRvIFQyIGluIE5SXG4iLAogICAgICAgICAgbnJvdyhzaWdfUiksICJERSBnZW5lcyBmcm9tIFQxIHRvIFQyIGluIFIiKSkKCiMgY29udmVydCBERSByZXN1bHRzIHRvIGRhdGEgZnJhbWUKZGlmZXhwX2luZm8gPC0gYXMuZGF0YS5mcmFtZShyZXNwb25zZV9UMikKCiMgYWRkIGNvbHVtbiBpbmRpY2F0aW5nIHdoZXRoZXIgZ2VuZXMgYXJlIHNpZ25pZmljYW50bHkgdXAgb3IgZG93bnJlZ3VsYXRlZApkaWZleHBfaW5mbyRERSA8LSAibm8iCmRpZmV4cF9pbmZvJERFW2RpZmV4cF9pbmZvJGxvZzJGb2xkQ2hhbmdlID4gMCAmIGRpZmV4cF9pbmZvJHBhZGogPCAwLjA1XSA8LSAidXAiCmRpZmV4cF9pbmZvJERFW2RpZmV4cF9pbmZvJGxvZzJGb2xkQ2hhbmdlIDwgMCAmIGRpZmV4cF9pbmZvJHBhZGogPCAwLjA1XSA8LSAiZG93biIKCiMgZ2VuZXJhdGUgdm9sY2FubyBwbG90LCAtbG9nMTAgb2YgYWRqdXN0ZWQgcC12YWwgdnMgbG9nMiBvZiBGQwpnZ3Bsb3QyOjpnZ3Bsb3QoZGF0YSA9IGRpZmV4cF9pbmZvLCBtYXBwaW5nID0gYWVzKHggPSBsb2cyRm9sZENoYW5nZSwgeSA9IC1sb2cxMChwYWRqKSwgY29sID0gREUpKSArIAogIGdlb21fcG9pbnQoKSArCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWxvZzEwKDAuMDUpLCBjb2wgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgImdyZXkiLCAicmVkIiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkRvd25yZWd1bGF0ZWQgaW4gUiBncm91cCIsICJOb3QgREUiLCAiVXByZWd1bGF0ZWQgaW4gUiBncm91cCIpKSArCiAgbGFicyhjb2xvciA9ICJFeHByZXNzaW9uIiwgCiAgICAgICB4ID0gImxvZyAyIGZvbGQgY2hhbmdlIiwKICAgICAgIHkgPSAibG9nIDEwIGNvcnJlY3RlZCBwLXZhbHVlIiwKICAgICAgIHRpdGxlID0gIkV4cHJlc3Npb24gb2YgZ2VuZXMgaW4gUiB2cy4gTlIgc2FtcGxlcyBhdCBUMiIpCgojIHVzZSBub3JtYWxpemVkIGNvdW50cyBmb3IgaGVhdG1hcCBtYXRyaXgsIGZpbHRlciBmb3IgREUgZ2VuZXMKbm9ybWNvdW50c19oZWF0bWFwIDwtIG5vcm1fY291bnRzW3Jvd25hbWVzKG5vcm1fY291bnRzKSAlaW4lIHJvd25hbWVzKHNpZ19UMiksXQoKIyBub3JtYWxpemUgcm93cwpub3JtY291bnRzX2hlYXRtYXAgPC0gdChzY2FsZSh0KG5vcm1jb3VudHNfaGVhdG1hcCkpKQoKIyBzZXQgY29sb3VycyB0byBzY2FsZSBmcm9tIGJsdWUgYXQgbWluIHZhbHVlcyB0byB3aGl0ZSBhdCAwIHRvIHJlZCBhdCBtYXggdmFsdWVzCmhlYXRtYXBfY29sID0gY2lyY2xpemU6OmNvbG9yUmFtcDIoYyhtaW4obm9ybWNvdW50c19oZWF0bWFwKSwgMCwgbWF4KG5vcm1jb3VudHNfaGVhdG1hcCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpCgojIHNldCBjb2xvdXJzIHRvIGNvcnJlc3BvbmQgdG8gZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMKZ3JvdXBfY29sb3VycyA8LSByYWluYm93KG4gPSA0KQpuYW1lcyhncm91cF9jb2xvdXJzKSA8LSB1bmlxdWUoc2FtcGxlX21ldGFkYXRhJGdyb3VwKQoKIyBhZGQgYW5ub3RhdGlvbiB3aXRoIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIGFuZCBjb3JyZXNwb25kaW5nIGNvbG91cnMKaGFubm90IDwtIENvbXBsZXhIZWF0bWFwOjpIZWF0bWFwQW5ub3RhdGlvbihkZiA9IGRhdGEuZnJhbWUoCiAgR3JvdXAgPSBzYW1wbGVfbWV0YWRhdGEkZ3JvdXApLAogIGNvbCA9IGxpc3QoCiAgICBHcm91cCA9IGdyb3VwX2NvbG91cnMKICApLApzaG93X2xlZ2VuZCA9IFRSVUUpCgojIGdlbmVyYXRlIGhlYXRtYXAKREVfaGVhdG1hcCA8LSBDb21wbGV4SGVhdG1hcDo6SGVhdG1hcChub3JtY291bnRzX2hlYXRtYXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGhlYXRtYXBfY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfY29sdW1uX25hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19yb3dfbmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BfYW5ub3RhdGlvbiA9IGhhbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3RpdGxlID0gIkdlbmVzIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBpbiBSIHZzLiBOUiBncm91cHMgYXQgVDEiKQoKREVfaGVhdG1hcApgYGAKCiMgVGhyZXNob2xkZWQgb3Zlci1yZXByZXNlbnRhdGlvbiBhbmFseXNpcyAoT1JBKQoKIyMgQW5hbHlzaXMgd2l0aCBnOnByb2ZpbGVyCgpXZSdsbCBtYWtlIGxpc3RzIG9mIHRoZSBnZW5lcyBpZGVudGlmaWVkIGluIEFzc2lnbm1lbnQgMSBhcyBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQsIHdpdGggY29ycmVjdGVkIHAtdmFsdWVzIGJlbG93IHRoZSBzaWduaWZpY2FuY2UgdGhyZXNob2xkIG9mIDAuMDUuCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBnZXQgbGlzdCBvZiBzaWduaWZpY2FudGx5IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcwpERV9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHNpZ19UMikgJT4lIGRwbHlyOjphcnJhbmdlKHBhZGopCkRFX2dlbmVsaXN0IDwtIHJvd25hbWVzKERFX2dlbmVzKQoKIyBnZXQgc2VwYXJhdGUgbGlzdHMgb2YgdGhlIHVwcmVndWxhdGVkIGFuZCBkb3ducmVndWxhdGVkIGdlbmVzCnVwcmVnX2dlbmVsaXN0IDwtIHJvd25hbWVzKERFX2dlbmVzW0RFX2dlbmVzJGxvZzJGb2xkQ2hhbmdlID4gMCxdKQpkb3ducmVnX2dlbmVsaXN0IDwtIHJvd25hbWVzKERFX2dlbmVzW0RFX2dlbmVzJGxvZzJGb2xkQ2hhbmdlIDwgMCxdKQpgYGAKCldlIGhhdmUgKipgciBsZW5ndGgoREVfZ2VuZWxpc3QpYCoqIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcywgKipgciBsZW5ndGgodXByZWdfZ2VuZWxpc3QpYCoqIG9mIHdoaWNoIGFyZSB1cHJlZ3VsYXRlZCBpbiB0aGUgUiBncm91cCAoUisgZ2VuZXMpIGFuZCAqKmByIGxlbmd0aChkb3ducmVnX2dlbmVsaXN0KWAqKiBvZiB3aGljaCBhcmUgZG93bnJlZ3VsYXRlZCBpbiB0aGUgUiBncm91cCAoUi0gZ2VuZXMpLgoKRHJhd2luZyBmcm9tIHByb3RvY29sIGRlbW9uc3RyYXRlZCBieSBbQFJlaW1hbmQyMDE5XSwgd2UnbGwgdXNlIGEgb25lLXRhaWxlZCBGaXNoZXIncyBleGFjdCB0ZXN0LCBhcyBpbXBsZW1lbnRlZCBpbiB0aGUgZ3Byb2ZpbGVyMiBwYWNrYWdlIFtAS29sYmVyZzIwMjBdLCB0byBhbmFseXplIGVucmljaG1lbnQuIFRoaXMgbWV0aG9kIGlzIHN1aXRhYmxlIGZvciB0aHJlc2hvbGRlZCBvdmVyLXJlcHJlc2VudGF0aW9uIGFuYWx5c2lzIGJlY2F1c2Ugd2UgYXJlIGNhbGN1bGF0aW5nIGVucmljaG1lbnQgdXNpbmcgYSBiaW5hcnkgY29uZGl0aW9uLCB3aGV0aGVyIG9yIG5vdCBhIGdlbmUgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQsIG1lYW5pbmcgZGF0YSBmaXRzIHRoZSAyIHggMiBjb250aW5nZW5jeSB0YWJsZXMgdXNlZCBieSB0aGUgRmlzaGVyJ3MgZXhhY3QgdGVzdCwgYW5kIHdlIHdpc2ggdG8gYXNzZXNzIGEgZGlyZWN0aW9uYWwgZWZmZWN0LCB3aGV0aGVyIHRlcm1zIGFyZSAqbW9yZSogZW5yaWNoZWQgaW4gdGhlIHJlc3VsdHMgdGhhbiBleHBlY3RlZCBbQFJvZGNoZW5rb3YyMDE5XS4gKDEpCgpXZSB1c2UgdGhlIEJhZGVyIGxhYiBlbnJpY2htZW50IG1hcCBnZW5lIHNldCBmaWxlIFtATWVyaWNvMjAxMF0gY29udGFpbmluZyBhbGwgaHVtYW4gZ2VuZXNldHMgZnJvbSB0aGUgbW9zdCByZWNlbnQgcmVsZWFzZXMsIGFzIG9mIDIwMjYtMDMtMDIsIG9mIEdPIGJpb2xvZ2ljYWwgcHJvY2VzcyBbQEFsZWtzYW5kZXIyMDI1XSBleGNsdWRpbmcgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gcHVibGljIHBhdGh3YXkgZmlndXJlcywgaW5mZXJyZWQgZnJvbSBlbGVjdHJvbmljIGFubm90YXRpb24sIGluZmVycmVkIGZyb20gcmV2aWV3ZWQgY29tcHV0YXRpb25hbCBhbmFseXNpcywgb3IgaGF2ZSBubyBiaW9sb2dpY2FsIGRhdGEgYXZhaWxhYmxlLCBhbmQgYWxsIHBhdGh3YXkgcmVzb3VyY2VzLCBpbmNsdWRpbmcgUmVhY3RvbWUgW0BDcm9mdDIwMTBdLCBNU2lnREIgW0BMaWJlcnpvbjIwMTVdLCBOZXRQYXRoIFtAS2FuZGFzYW15MjAxMF0sIFBBTlRIRVIgW0BNaTIwMTNdLCBXaWtpUGF0aHdheXMgW0BBZ3Jhd2FsMjAyM10sIFBhdGhCYW5rIFtAV2lzaGFydDIwMjNdLCBhbmQgSHVtYW5DeWMgW0BUcnVwcDIwMTBdLiBUaGlzIGlzIGEgaGlnaGx5IGNvbXByZWhlbnNpdmUsIHVwLXRvLWRhdGUgY29tcGlsYXRpb24gb2YgYW5ub3RhdGlvbiBzb3VyY2VzIHRoYXQgd2lsbCBhbGxvdyBmb3IgZ3JlYXRlciBjb3ZlcmFnZSB0aGFuIHVzaW5nIGFueSBvbmUgZGF0YWJhc2UgYWxvbmUuICgyKQoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdGFfZGlyID0gcGFzdGUwKGdldHdkKCksIi9kYXRhIikKCiMgYWNjZXNzIGFuZCBwYXJzZSB0aGUgbmFtZXMgb2YgdGhlIGJhZGVyIGxhYiBodW1hbiBnZW5lIHNldCBmaWxlcwpnbXRfdXJsID0gImh0dHBzOi8vZG93bmxvYWQuYmFkZXJsYWIub3JnL0VNX0dlbmVzZXRzL2N1cnJlbnRfcmVsZWFzZS9IdW1hbi9zeW1ib2wvIgpmaWxlbmFtZXMgPSBSQ3VybDo6Z2V0VVJMKGdtdF91cmwpCnRjID0gdGV4dENvbm5lY3Rpb24oZmlsZW5hbWVzKQpjb250ZW50cyA9IHJlYWRMaW5lcyh0YykKY2xvc2UodGMpCgojIGZpbmQgdGhlIGdtdCBmaWxlIHdpdGggYWxsIEdPQlAgYW5kIHBhdGh3YXkgdGVybXMsIGV4Y2x1ZGluZyB0aG9zZSBleHRyYWN0ZWQgCiMgZnJvbSBwdWJsaXNoZWQgcGF0aHdheSBmaWd1cmVzIGFuZCBpbmZlcnJlZCBmcm9tIGVsZWN0cm9uaWMgYW5ub3RhdGlvbgpyeCA9IGdyZWdleHByKCIoPzw9PGEgaHJlZj1cIikoLiouR09CUF9BbGxQYXRod2F5c19ub1BGT0NSX25vX0dPX2llYS4qLikoLmdtdCkoPz1cIj4pIiwKICAgICAgICAgICAgICBjb250ZW50cywgcGVybCA9IFRSVUUpCmdtdF9maWxlID0gdW5saXN0KHJlZ21hdGNoZXMoY29udGVudHMsIHJ4KSkKZGVzdF9nbXRfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsZ210X2ZpbGUpCgojIGlmIHRoZSBmaWxlIGhhcyBub3QgYWxyZWFkeSBiZWVuIGRvd25sb2FkZWQsIGRvd25sb2FkCmlmKCFmaWxlLmV4aXN0cyhkZXN0X2dtdF9maWxlKSl7CiAgZG93bmxvYWQuZmlsZSgKICAgIHBhc3RlKGdtdF91cmwsZ210X2ZpbGUsc2VwPSIiKSwKICAgIGRlc3RmaWxlPWRlc3RfZ210X2ZpbGUKICApCn0KCiMgcmVhZCBhbmQgY2xlYW4gdGhlIGRvd25sb2FkZWQgZ210IGZpbGUgc28gdGhhdCBpdCBjYW4gYmUgaGFuZGxlZCBieSBnc2VhCmNsZWFuZWRfZ210X2ZpbGUgPSBwYXN0ZTAoZGF0YV9kaXIsICIvY2xlYW5lZF8iLCBCaW9jR2VuZXJpY3M6OmJhc2VuYW1lKGRlc3RfZ210X2ZpbGUpKQppZiAoIWZpbGUuZXhpc3RzKGNsZWFuZWRfZ210X2ZpbGUpKSB7CiAgZ210X2xpbmVzIDwtIHJlYWRMaW5lcyhkZXN0X2dtdF9maWxlLCB3YXJuID0gRkFMU0UpCiAgIyByZW1vdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMKICBjbGVhbl9saW5lcyA8LSBzdHJpbmdpOjpzdHJpX3RyYW5zX2dlbmVyYWwoZ210X2xpbmVzLCBpZCA9ICJBbnktTGF0aW47IExhdGluLUFTQ0lJIikKICAjIHJlbW92ZSBkdXBsaWNhdGUgdGVybXMgCiAgdW5pcXVlX2NsZWFuX2xpbmVzIDwtIGNsZWFuX2xpbmVzWyFkYXRhLnRhYmxlOjpkdXBsaWNhdGVkKGNsZWFuX2xpbmVzKV0KICB3cml0ZUxpbmVzKHVuaXF1ZV9jbGVhbl9saW5lcywgY2xlYW5lZF9nbXRfZmlsZSkKfQpgYGAKCldpdGggYWxsIG91ciBkYXRhIHByZXBhcmVkLCB3ZSB1c2UgZ3Byb2ZpbGVyMjo6Z29zdCB0byBydW4gT1JBIG9uIGVhY2ggb2Ygb3VyIGdlbmUgbGlzdHMuIEZvciBtdWx0aXBsZSB0ZXN0aW5nIGNvcnJlY3Rpb24gd2UgdXNlIGdwcm9maWxlcidzIGc6U0NTIChzZXQgY291bnRzIGFuZCBzaXplcykgbWV0aG9kLiBTQ1MgY29ycmVjdGlvbiBzcGVjaWZpY2FsbHkgdGFrZXMgaW50byBhY2NvdW50IHRoZSBzdHJ1Y3R1cmUgYmVoaW5kIGZ1bmN0aW9uYWwgYW5ub3RhdGlvbnMsIGFuZCBmdW5jdGlvbmFsIHByb2ZpbGluZyBtZXRob2RzIHdoZXJlIHNpZ25pZmljYW5jZSBpcyBkZXRlcm1pbmVkIGZyb20gc2V0IGludGVyc2VjdGlvbnMgaW4gMiB4IDIgY29udGluZ2VuY3kgdGFibGVzLiBTQ1MgZXN0aW1hdGlvbnMgd2VyZSBkZW1vbnN0cmF0ZWQgaW4gc2ltdWxhdGlvbnMgd2l0aCByYW5kb21seSBzYW1wbGVkIHF1ZXJpZXMgdG8gbW9yZSBjbG9zZWx5IGFsaWduIHdpdGggZW1waXJpY2FsIHF1YW50aWxlcyBvZiBwLXZhbHVlcyB0aGFuIHRoZSBtb3JlIGdlbmVyYWwgQm9uZmVycm9uaSBhbmQgQmVuamFtaW5pLUhvY2hiZXJnIGVzdGltYXRpb25zIFtAUmVpbWFuZDIwMDddLgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgdXBsb2FkIHRoZSBjbGVhbmVkIGJhZGVyIGxhYiBnbXQgZmlsZSB0byBnOnByb2ZpbGVyIHRvIHVzZSBhcyBhbm5vdGF0aW9uIHNvdXJjZSAKaWYgKCFleGlzdHMoImN1c3RvbV9nbXQiKSkgewogIGN1c3RvbV9nbXQgPC0gZ3Byb2ZpbGVyMjo6dXBsb2FkX0dNVF9maWxlKGNsZWFuZWRfZ210X2ZpbGUpCn0KCiMgZGVmaW5lIHNpZ25pZmljYW5jZSB0aHJlc2hvbGQgYXMgMC4wNSwgdGVybSBzaXplIGJvdW5kcyBhcyAxNSBhbmQgNTAwCnRocmVzaCA8LSAwLjA1Cm1pbl9nZW5lcyA8LSAxNQptYXhfZ2VuZXMgPC0gNTAwCgojIG9yYSBvZiBhbGwgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzCkRFX09SQSA8LSBncHJvZmlsZXIyOjpnb3N0KHF1ZXJ5ID0gREVfZ2VuZWxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc20gPSBjdXN0b21fZ210LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWRfcXVlcnkgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX3RocmVzaG9sZCA9IHRocmVzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0aW9uX21ldGhvZCA9ICJnX1NDUyIpCiMgZXh0cmFjdCBhbmFseXNpcyByZXN1bHRzIApERV9lbnJpY2hlZF9nZW5lc2V0cyA8LSBERV9PUkEkcmVzdWx0Cm51bV9lbnJpY2hlZCA8LSBucm93KERFX2VucmljaGVkX2dlbmVzZXRzKQojIGZpbHRlciBmb3IgZ2VuZXNldCBzaXplIGJldHdlZW4gbWluX2dlbmVzIGFuZCBtYXhfZ2VuZXMKREVfZW5yaWNoZWRfZmlsdGVyZWQgPC0gREVfZW5yaWNoZWRfZ2VuZXNldHMgJT4lIAogIGRwbHlyOjpmaWx0ZXIodGVybV9zaXplID49IG1pbl9nZW5lcyAmIHRlcm1fc2l6ZSA8PSBtYXhfZ2VuZXMpCm51bV9lbnJpY2hlZF9maWx0ZXJlZCA8LSBucm93KERFX2VucmljaGVkX2ZpbHRlcmVkKQoKIyBvcmEgb2YgdXByZWd1bGF0ZWQgZ2VuZXMgb25seSBhbmQgZ2V0IHJlc3VsdHMgCnVwcmVnX09SQSA8LSBncHJvZmlsZXIyOjpnb3N0KHF1ZXJ5ID0gdXByZWdfZ2VuZWxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc20gPSBjdXN0b21fZ210LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWRfcXVlcnkgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX3RocmVzaG9sZCA9IHRocmVzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0aW9uX21ldGhvZCA9ICJnX1NDUyIpCnVwcmVnX2VucmljaGVkX2dlbmVzZXRzIDwtIHVwcmVnX09SQSRyZXN1bHQKbnVtX2VucmljaGVkX3VwIDwtIG5yb3codXByZWdfZW5yaWNoZWRfZ2VuZXNldHMpCnVwcmVnX2VucmljaGVkX2ZpbHRlcmVkIDwtIHVwcmVnX2VucmljaGVkX2dlbmVzZXRzICU+JSAKICBkcGx5cjo6ZmlsdGVyKHRlcm1fc2l6ZSA+PSBtaW5fZ2VuZXMgJiB0ZXJtX3NpemUgPD0gbWF4X2dlbmVzKQpudW1fZmlsdGVyZWRfdXAgPC0gbnJvdyh1cHJlZ19lbnJpY2hlZF9maWx0ZXJlZCkKCiMgb3JhIG9mIGRvd25yZWd1bGF0ZWQgZ2VuZXMgb25seSBhbmQgZ2V0IHJlc3VsdHMKZG93bnJlZ19PUkEgPC0gZ3Byb2ZpbGVyMjo6Z29zdChxdWVyeSA9IGRvd25yZWdfZ2VuZWxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc20gPSBjdXN0b21fZ210LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWRfcXVlcnkgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX3RocmVzaG9sZCA9IHRocmVzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0aW9uX21ldGhvZCA9ICJnX1NDUyIpCmRvd25yZWdfZW5yaWNoZWRfZ2VuZXNldHMgPC0gZG93bnJlZ19PUkEkcmVzdWx0Cm51bV9lbnJpY2hlZF9kb3duIDwtIG5yb3coZG93bnJlZ19lbnJpY2hlZF9nZW5lc2V0cykKZG93bnJlZ19lbnJpY2hlZF9maWx0ZXJlZCA8LSBkb3ducmVnX2VucmljaGVkX2dlbmVzZXRzICU+JSAKICBkcGx5cjo6ZmlsdGVyKHRlcm1fc2l6ZSA+PSBtaW5fZ2VuZXMgJiB0ZXJtX3NpemUgPD0gbWF4X2dlbmVzKQpudW1fZmlsdGVyZWRfZG93biA8LSBucm93KGRvd25yZWdfZW5yaWNoZWRfZmlsdGVyZWQpCgoKCmBgYAoKRmlsdGVyaW5nIGZvciBTQ1MtY29ycmVjdGVkIHAtdmFsdWVzIGJlbG93IHRoZSB0aHJlc2hvbGQgb2YgKipgciB0aHJlc2hgKiosIHdlIGdldCAqKmByIG51bV9lbnJpY2hlZGAqKiB0ZXJtcyBlbnJpY2hlZCBpbiB0aGUgbGlzdCBvZiBhbGwgb3VyIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcy4gKipgciBudW1fZW5yaWNoZWRfZmlsdGVyZWRgKiogb2YgdGhlc2UgaGF2ZSBiZXR3ZWVuICoqYHIgbWluX2dlbmVzYCoqIGFuZCAqKmByIG1heF9nZW5lc2AqKiBnZW5lcywgYW5kIHRoZSByZXN0IGFyZSBsYXJnZXIuICgzKQoKV2UgZ2V0ICoqYHIgbnVtX2VucmljaGVkX3VwYCoqIHRlcm1zIGVucmljaGVkIHdpdGggU0NTLWNvcnJlY3RlZCBwLXZhbHVlIDwgKipgciB0aHJlc2hgKiogaW4gdGhlIGxpc3Qgb2YgUisgZ2VuZXMsIGFuZCBgciBudW1fZW5yaWNoZWRfZG93bmAgdGVybXMgZW5yaWNoZWQgd2l0aCBTQ1MtY29ycmVjdGVkIHAtdmFsdWUgPCAqKmByIHRocmVzaGAqKiBpbiB0aGUgbGlzdCBvZiBSLSBnZW5lcy4gRmlsdGVyaW5nIGZvciB0ZXJtIHNpemUgYmV0d2VlbiAqKmByIG1pbl9nZW5lc2AqKiBhbmQgKipgciBtYXhfZ2VuZXNgKiosIHdlIGhhdmUgKipgciBudW1fZmlsdGVyZWRfdXBgKiogdGVybXMgZW5yaWNoZWQgaW4gdGhlIFIrIGdlbmVzIGFuZCAqKmByIG51bV9maWx0ZXJlZF9kb3duYCoqIHRlcm1zIGVucmljaGVkIGluIHRoZSBSLSBnZW5lcy4gSW4gVGFibGUgMSwgd2UgY29tcGFyZSB0aGUgdGVybXMgZW5yaWNoZWQgaW4gdGhlIHRocmVlIGdlbmUgbGlzdHMuCgpgYGB7ciwgcmVzdWx0cyA9ICdzaG93JywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYWxsX2VucmljaGVkIDwtIGRwbHlyOjpiaW5kX3Jvd3MoREVfZW5yaWNoZWRfZ2VuZXNldHMsIHVwcmVnX2VucmljaGVkX2dlbmVzZXRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkb3ducmVnX2VucmljaGVkX2dlbmVzZXRzKSAlPiUgCiAgZHBseXI6OmRpc3RpbmN0KHRlcm1faWQsIC5rZWVwX2FsbCA9IFRSVUUpCgpyZXN1bHRzX3RhYmxlIDwtIGFsbF9lbnJpY2hlZCAlPiUgCiAgZHBseXI6Om11dGF0ZShlbnJpY2hlZF9hbGxERSA9IHRlcm1faWQgJWluJSBERV9lbnJpY2hlZF9nZW5lc2V0cyR0ZXJtX2lkLAogICAgICAgICAgICAgICAgZW5yaWNoZWRfUnBsdXMgPSB0ZXJtX2lkICVpbiUgdXByZWdfZW5yaWNoZWRfZ2VuZXNldHMkdGVybV9pZCwKICAgICAgICAgICAgICAgIGVucmljaGVkX1JtaW51cyA9IHRlcm1faWQgJWluJSBkb3ducmVnX2VucmljaGVkX2dlbmVzZXRzJHRlcm1faWQsCiAgICAgICAgICAgICAgICBhbm5vdF9zb3VyY2UgPSBzYXBwbHkoc3Ryc3BsaXQodGVybV9pZCwgIiUiKSwgZnVuY3Rpb24oeCkgeFsyXSksCiAgICAgICAgICAgICAgICBJRCA9IHNhcHBseShzdHJzcGxpdCh0ZXJtX2lkLCAiJSIpLCBmdW5jdGlvbih4KSB4WzNdKSkgJT4lIAogIGRwbHlyOjpzZWxlY3QoYyh0ZXJtX25hbWUsIHRlcm1fc2l6ZSwgYW5ub3Rfc291cmNlLCBlbnJpY2hlZF9hbGxERSwKICAgICAgICAgICAgICAgICAgZW5yaWNoZWRfUnBsdXMsIGVucmljaGVkX1JtaW51cywgSUQpKSAlPiUgCiAgZHBseXI6OmFycmFuZ2UoIWVucmljaGVkX2FsbERFLCB0ZXJtX3NpemUpCgoja25pdHI6OmthYmxlKHJlc3VsdHNfdGFibGUsIGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSAiYyIpCnJlc3VsdHNfdGFibGUgJT4lCiAgZ3Q6Omd0KCkgJT4lCiAgZ3Q6Om9wdF90YWJsZV9saW5lcyhleHRlbnQgPSAiYWxsIikKYGBgCgo8Y2VudGVyPioqKlRhYmxlIDE6KioqIFBhdGh3YXkgdGVybXMgaWRlbnRpZmllZCBhcyBzaWduaWZpY2FudGx5IGVucmljaGVkIChtdWx0aXBsZSB0ZXN0IGNvcnJlY3RlZCBwLXZhbHVlIGxlc3NlciB0aGFuIDAuMDUpIGluIHRoZSBzZXQgb2YgYWxsIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcywgaW4gdGhlIHNldCBvZiBvbmx5IFIrIGdlbmVzLCBhbmQgaW4gdGhlIHNldCBvZiBvbmx5IFItIGdlbmVzLCB0ZXJtIHNpemUgKG51bWJlciBvZiBnZW5lcyksIGFubm90YXRpb24gc291cmNlIGFuZCB0ZXJtIElELiBFbnJpY2htZW50IGFuYWx5emVkIHVzaW5nIGc6cHJvZmlsZXIuPC9jZW50ZXI+Cjxicj4KQW1vbmcgdGhlIHRocmVlIHNldCBvZiB0ZXJtcywgdGhlIERFIHRlcm1zLCB0aGUgUisgdGVybXMsIGFuZCB0aGUgUi0gdGVybXMsIHRoZXJlIGFyZSAqKmByIG5yb3cocmVzdWx0c190YWJsZSlgKiogdW5pcXVlIHRlcm1zLiBSKyB0ZXJtcyBhbmQgUi0gdGVybXMgZWFjaCBvdmVybGFwIHBhcnRpYWxseSB3aXRoIERFIHRlcm1zLCBhbmQgYWxsIERFIHRlcm1zIHdpdGggdGVybSBzaXplIGJldHdlZW4gKipgbWluX2dlbmVzYCoqIGFuZCAqKmBtYXhfZ2VuZXNgKiogYXJlIGluIGVpdGhlciBSKyBvciBSLSwgYnV0IHRoZXJlIGFyZSBubyBzaGFyZWQgdGVybXMgYmV0d2VlbiB0aGUgUisgYW5kIFItIGdyb3Vwcy4gKDQpCgpUaGUgZGlzcGFyaXR5IGJldHdlZW4gdGhlIERFIGdyb3VwIGFuZCB0aGUgUisgYW5kIFItIGdyb3VwcyBoaWdobGlnaHRzIHRoZSBmYWxsaWJpbGl0eSBvZiB0aHJlc2hvbGRlZCBlbnJpY2htZW50IGFuYWx5c2lzOiB0aGUgc2l6ZXMgb2Ygc21hbGwgZ2VuZSBsaXN0cyBjYW4gaW1wYWN0IHRoZSBlc3RpbWF0ZWQgc2lnbmlmaWNhbmNlIG9mIGEgc2lnbmFsLiBMYXJnZSB0ZXJtcyBpZGVudGlmaWVkIGFzIGVucmljaGVkIGluIHRoZSBERSBncm91cCBhcmUgbm90IGlkZW50aWZpZWQgaW4gYW5hbHlzaXMgb2YgdGhlIHNtYWxsZXIgcmVzcG9uc2Utc3BlY2lmaWMgZ3JvdXBzLCBhbmQgc29tZSB0ZXJtcyBpZGVudGlmaWVkIGFzIGVucmljaGVkIGluIHRoZSBSKyBvciBSLSBncm91cCB3aGVuIGFuYWx5emVkIHNlcGFyYXRlbHkgZG8gbm90IHBhc3MgdGhlIHNpZ25pZmljYW5jZSB0aHJlc2hvbGQgd2hlbiB0aGUgZ3JvdXBzIGFyZSBhbmFseXplZCB0b2dldGhlci4gVGVybXMgaWRlbnRpZmllZCBpbiBlbnJpY2htZW50IGFuYWx5c2lzIG9mIGJvdGggdGhlIERFIGdyb3VwIGFuZCBlaXRoZXIgdGhlIFIrIG9yIFItIGdyb3VwIG1heSBiZSBlc3BlY2lhbGx5IHNpZ25pZmljYW50LiBUZXJtcyBpZGVudGlmaWVkIGluIGluZGVwZW5kZW50IGFuYWx5c2lzIG9mIHRoZSBSKyBvciBSLSBncm91cCBtYXkgYWlkIGluIGludGVycHJldGluZyB0ZXJtcyBpZGVudGlmaWVkIGluIHRoZSBhbmFseXNpcyBvZiB0aGUgZnVsbCBERSBncm91cC4KCiMjIEludGVycHJldGluZyBPUkEgcmVzdWx0cwoKQWxsIHRoZSB0ZXJtcyBpZGVudGlmaWVkIGFzIGVucmljaGVkIGluIHRoZSBERSBnZW5lcyBhcmUgaW52b2x2ZWQgaW4gcmVndWxhdGlvbiBvZiBiaW9sb2dpY2FsIHByb2Nlc3Nlcy4gU3BlY2lmaWNhbGx5LCBzZXZlcmFsIHRlcm1zIGludm9sdmluZyByZWd1bGF0aW9uIG9mIGltbXVuZSByZXNwb25zZSBhbmQgY2VsbCBtb3RpbGl0eSBhcmUgZW5yaWNoZWQuIEdlbmVzIGludm9sdmVkIGluIHJlZ3VsYXRpb24gb2YgaW1tdW5lIHJlc3BvbnNlLCBULWNlbGwgcmVjZXB0b3Igc2lnbmFsbGluZyBwYXRod2F5cyBhbmQgYW50aWdlbiByZWNlcHRvci1tZWRpYXRlZCBzaWduYWxsaW5nIHBhdGh3YXlzIGluIHBhcnRpY3VsYXIsIGFyZSBlbnJpY2hlZCwgYW5kIGFyZSBzcGVjaWZpY2FsbHkgZW5yaWNoZWQgaW4gUi0gZ2VuZXMuIFRoZSB0ZXJtICduZWdhdGl2ZSByZWd1bGF0aW9uIG9mIFQgY2VsbCByZWNlcHRvciBzaWduYWxpbmcgcGF0aHdheSwnIHdhcyBmdXJ0aGVybW9yZSBpZGVudGlmaWVkIGFzIGVucmljaGVkIGluIHRoZSBSLSBnZW5lIGxpc3QsIHRob3VnaCBub3QgaW4gdGhlIGZ1bGwgREUgZ2VuZSBsaXN0IGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgUisgZ2VuZXMgd2Vha2VuaW5nIHRoZSBzaWduYWwsIGFuZCBzdWdnZXN0cyB0aGF0IHRoZSBSLSBnZW5lcyBpbnZvbHZlZCBpbiByZWd1bGF0aW9uIG9mIFQtY2VsbCByZWNlcHRvciBzaWduYWxsaW5nIHBhdGh3YXlzIHNwZWNpZmljYWxseSBuZWdhdGl2ZWx5IHJlZ3VsYXRlIHRoZXNlIHBhdGh3YXlzLCBhbmQgdGhhdCB0aGVpciBkb3ducmVndWxhdGlvbiBpbiBSIHBhdGllbnRzIGNvcnJlc3BvbmRzIHRvIHBvc2l0aXZlIHJlZ3VsYXRpb24gb2YgVC1jZWxsIHJlbGF0ZWQgcGF0aHdheXMuIEdlbmVzIGludm9sdmluZyBuZWdhdGl2ZSByZWd1bGF0aW9uIG9mIGNlbGwgbWlncmF0aW9uLCBtb3RpbGl0eSBhbmQgbG9jb21vdGlvbiBhcmUgZW5yaWNoZWQsIGFuZCBhcmUgc3BlY2lmaWNhbGx5IGVucmljaGVkIGluIFIrIGdlbmVzLgoKVGhlIGVucmljaG1lbnQgb2YgdGVybXMgcmVsYXRlZCB0byBpbW11bmUgcmVzcG9uc2UgcmVndWxhdGlvbiwgZXNwZWNpYWxseSBuZWdhdGl2ZSByZWd1bGF0aW9uIG9mIFQtY2VsbCBwYXRod2F5cyBpbiBSLSBnZW5lcywgc3VwcG9ydHMgQmFyY2VsbGEgZXQgYWwncyBjb25jbHVzaW9ucyB0aGF0IFIgcGF0aWVudHMgc3BlY2lmaWNhbGx5IG1vZHVsYXRlIGdlbmVzIGludm9sdmVkIGluIFQtY2VsbCBhY3RpdmF0aW9uIHdoaWxlIE5SIHBhdGllbnRzIGRvIG5vdCwgaW5jbHVkaW5nIHRoZWlyIGlkZW50aWZpY2F0aW9uIG9mIGdlbmVzIGludm9sdmVkIGluIHNpZ25hbCB0cmFuc2R1Y3Rpb24gaW4gdGhlIFQtY2VsbCBhbnRpZ2VuIHJlY2VwdG9yIGNvbXBsZXggYmVpbmcgdXByZWd1bGF0ZWQgaW4gUiBwYXRpZW50cywgYW5kIGdlbmVzIGluaGliaXRpbmcgVC1jZWxsIGFjdGl2YXRpb24gYmVpbmcgZG93bnJlZ3VsYXRlZC4KCk9uIHRoZSBvdGhlciBoYW5kLCB0aGUgZW5yaWNobWVudCBvZiB0ZXJtcyByZWxhdGVkIHRvIG5lZ2F0aXZlIHJlZ3VsYXRpb24gb2YgY2VsbCBtaWdyYXRpb24gaW4gUisgZ2VuZXMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcGFwZXIncyBjb25jbHVzaW9ucyBvciBzdWdnZXN0ZWQgbWVjaGFuaXNtcywgYXMgQmFyY2VsbGEgZXQgYWwgZG8gbm90IGRpc2N1c3MgZW5yaWNobWVudCBvZiBnZW5lcyByZWxhdGVkIHRvIGNlbGwgbW90aWxpdHkgb3IgdGhlaXIgcG90ZW50aWFsIHJvbGUgaW4gdGhlIGJpb2xvZ2ljYWwgbWVjaGFuaXNtcyBvZiB0aGVyYXB5LW1vZHVsYXRlZCBzZXB0aWMgc2hvY2sgcmVzcG9uc2UuICgxKQoKSG93ZXZlciwgQmFyY2VsbGEgZXQgYWwncyBhbmFseXNpcyBpZGVudGlmaWVzIHRoZSBHTyB0ZXJtcyAncG9zaXRpdmUgcmVndWxhdGlvbiBvZiBjZWxsIG1pZ3JhdGlvbiwnIGFuZCAncmVndWxhdGlvbiBvZiBjZWxsIG1pZ3JhdGlvbicgYXMgYmVpbmcgZW5yaWNoZWQgZnJvbSBUMSB0byBUMiBpbiBOUiBwYXRpZW50cyBleGNsdXNpdmVseSwgd2l0aCB0aGUgbGF0dGVyIHRlcm0gaGlnaGxpZ2h0ZWQgYXMgZXNwZWNpYWxseSBzaWduaWZpY2FudC4gQWx0aG91Z2ggdGhpcyByZXN1bHQgaXMgbm90IGZhY3RvcmVkIGludG8gdGhlaXIgY29uY2x1c2lvbnMsIGl0IHN0YW5kcyBpbiBzdXBwb3J0IG9mIG91ciBvYnNlcnZhdGlvbiBvZiB0aGUgZW5yaWNobWVudCBvZiBnZW5lcyBuZWdhdGl2ZWx5IHJlZ3VsYXRpbmcgY2VsbCBtaWdyYXRpb24gaW4gdGhlIFItIGdyb3VwLgoKT3RoZXIgc3R1ZGllcyBoYXZlIGRlbW9uc3RyYXRlZCB0aGF0IGdlbmVzIGludm9sdmVkIGluIGFjdGl2YXRpb24gb2YgbGV1a29jeXRlIG1pZ3JhdGlvbiBhcmUgYmUgb3ZlcmV4cHJlc3NlZCBpbiB0aGUgZW5kb3RoZWxpYWwgY2VsbHMgb2Ygc2VwdGljIHNob2NrIHBhdGllbnRzIFtATGFuZ3N0b24yMDIyXSBbQENhbzIwMTRdLCBhbmQgdGhhdCB0aGUgaW5mbGFtbWF0b3J5IGNhc2NhZGUgY2F1c2VkIGJ5IHNlcHNpcyBpcyBrbm93biB0byBjYXVzZSBkeXNyZWd1bGF0ZWQgbmV1dHJvcGhpbCBtaWdyYXRpb24gaW50byBjcml0aWNhbCBvcmdhbnNbQEpvZmZyZTIwMjBdLCB3aGVyZSB0aGV5IGNhbiBkYW1hZ2UgdGhlIGVuZG90aGVsaXVtIGFuZCBkcml2ZSBpbmZsYW1tYXRpb24gW0BIYXR0b3JpMjAxN10uIFRoZSByb2xlIG9mIGluY3JlYXNlZCBjZWxsIG1pZ3JhdGlvbiBpbiBzZXB0aWMgc3ltcHRvbXMgc3VwcG9ydHMgdGhlIGVucmljaG1lbnQgb2YgZ2VuZXMgbmVnYXRpdmVseSByZWd1bGF0aW5nIGNlbGwgbWlncmF0aW9uIGluIHBhdGllbnRzIHdobyBoYXZlIHJlc3BvbmRlZCBwb3NpdGl2ZWx5IHRvIGhlbW9keW5hbWljIHRoZXJhcHkuICgyKQoKIyBOb24tdGhyZXNob2xkZWQgZ2VuZSBzZXQgZW5yaWNobWVudCBhbmFseXNpcwoKIyMgQW5hbHlzaXMgd2l0aCBHU0VBCgpOZXh0LCB3ZSdsbCBwZXJmb3JtIG5vbi10aHJlc2hvbGRlZCBnZW5lIHNldCBlbnJpY2htZW50IGFuYWx5c2lzIG9uIHRoZSBlbnRpcmUgbGlzdCBvZiBnZW5lcyBpbiB0aGUgZGF0YS4gV2UnbGwgYW5hbHl6ZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHRlcm1zIHRocm91Z2hvdXQgb3VyIGVudGlyZSBsaXN0IG9mIGdlbmVzLiBXZSBiZWdpbiBieSByYW5raW5nIHRoZSBnZW5lcy4gV2UgYXNzaWduIHJhbmtzIGFjY29yZGluZyB0byBzaWduaWZpY2FuY2UsIHdpdGggZ2VuZXMgdGhhdCBzYXcgaGlnaGVyIGV4cHJlc3Npb24gaW4gUiBwYXRpZW50cyByZWNlaXZpbmcgYSBwb3NpdGl2ZSBudW1iZXIsIGFuZCBnZW5lcyB0aGF0IHNhdyBsb3dlciBleHByZXNzaW9uIGluIFIgcGF0aWVudHMgcmVjZWl2aW5nIGEgbmVnYXRpdmUgbnVtYmVyLgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNnZXQgYWxsIGdlbmVzLCBjYWxjdWxhdGUgcmFua3MsIGFuZCBhcnJhbmdlIGJ5IHJhbmsKcmFua2VkX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUocmVzcG9uc2VfVDIpICU+JSAKICBkcGx5cjo6bXV0YXRlKHJhbmsgPSAtbG9nKHBhZGosIGJhc2UgPSAxMCkgKiBzaWduKGxvZzJGb2xkQ2hhbmdlKSkgJT4lIAogIGRwbHlyOjphcnJhbmdlKGRlc2MocmFuaykpICU+JSAKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbigiZ2VuZWlkIikgJT4lIAogIGRwbHlyOjpzZWxlY3QoYyhnZW5laWQsIHJhbmspKQoKI3dyaXRlIHRoZSByYW5rZWQgZ2VuZSBsaXN0IHRvIGEgZmlsZSB0byBpbnB1dCBpbnRvIGdzZWEgYWxnb3JpdGhtCnJhbmtfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJyYW5rZWRfZ2VuZXMucm5rIikKd3JpdGUudGFibGUocmFua2VkX2dlbmVzLCByYW5rX2ZpbGUsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICJcdCIsIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKClRvIHBlcmZvcm0gZ2VuZSBzZXQgZW5yaWNobWVudCBhbmFseXNpcywgd2UgdXNlIHRoZSBvcmlnaW5hbCBHU0VBIGFsZ29yaXRobSBbQFN1YnJhbWFuaWFuMjAwNV0sIGltcGxlbWVudGVkIHZpYSB0aGUgR1NFQVByZVJhbmtlZCBmdW5jdGlvbiBpbiB0aGUgR1NFQSA0LjQuMCBqYXIgZmlsZSBmb3IgdGhlIGNvbW1hbmQgbGluZS4gRm9yIHRoZSBnZW5lc2V0cywgd2UnbGwgdXNlIHRoZSBzYW1lIEJhZGVyIGxhYiAuZ210IGZpbGUgdGhhdCB3ZSB1c2VkIGZvciB0aGUgdGhyZXNob2xkZWQgYW5hbHlzaXMuICgxKQoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQpnc2VhX2phciA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJHU0VBXzQuNC4wIiwgImdzZWEtY2xpLnNoIikKYW5hbHlzaXNfbmFtZSA8LSAiVDJfUl92c19OUiIKCmdzZWFfY21kIDwtIHBhc3RlKCIiLCBnc2VhX2phciwKICAgICAgICAgICAgICAgICAgICJHU0VBUHJlUmFua2VkIC1nbXgiLCBjbGVhbmVkX2dtdF9maWxlLAogICAgICAgICAgICAgICAgICAgIi1ybmsiICwgcmFua19maWxlLAogICAgICAgICAgICAgICAgICAgIi1jb2xsYXBzZSBmYWxzZSAtbnBlcm0gMTAwMCAtc2NvcmluZ19zY2hlbWUgd2VpZ2h0ZWQiLAogICAgICAgICAgICAgICAgICAgIi1ycHRfbGFiZWwiLCBhbmFseXNpc19uYW1lLAogICAgICAgICAgICAgICAgICAgIi1wbG90X3RvcF94IDIwIC1ybmRfc2VlZCA2Nzg5IC1zZXRfbWF4IiwgbWF4X2dlbmVzLAogICAgICAgICAgICAgICAgICAgIi1zZXRfbWluIiwgbWluX2dlbmVzLCAiLXppcF9yZXBvcnQgZmFsc2UiLAogICAgICAgICAgICAgICAgICAgIi1vdXQiLCBkYXRhX2RpciwKICAgICAgICAgICAgICAgICAgICI+IGdzZWFfb3V0cHV0LnR4dCIsc2VwID0gIiAiKQoKZ3NlYV9ydW4gPC0gRkFMU0UKaWYobGVuZ3RoKGxpc3QuZmlsZXMoZGF0YV9kaXIsIHBhdHRlcm4gPSAiXlQyX1JfdnNfTlJcXC5Hc2VhUHJlcmFua2VkLiIpKSA9PSAwICYgIWdzZWFfcnVuKSB7CiAgc3VwcHJlc3NXYXJuaW5ncyhzeXN0ZW0oZ3NlYV9jbWQpKQogIGdzZWFfcnVuIDwtIFRSVUUKfQpgYGAKClRoZSBtb3N0IHNpZ25pZmljYW50bHkgZW5yaWNoZWQgdGVybXMgaWRlbnRpZmllZCBpbiB0aGUgbm9uLXRocmVzaG9sZGVkIEdTRUEgaW5jbHVkZSBtYW55IG9mIHRoZSBzYW1lIHRlcm1zIGlkZW50aWZpZWQgaW4gdGhlIHRocmVzaG9sZGVkIE9SQSByZWxhdGUgdG8gUk5BIHByb2Nlc3NpbmcgYW5kIEROQSBhbmQgcHJvdGVpbiBzeW50aGVzaXMuIE1vc3Qgb2YgdGhlIGhpZ2hseSBzaWduaWZpY2FudCB0ZXJtcyBhcmUgZW5yaWNoZWQgc3BlY2lmaWNhbGx5IGFtb25nIFItIGdlbmVzLCB3aXRoIG9ubHkgZmV3IGhpZ2hseSBzaWduaWZpY2FudCB0ZXJtcywgcmVsYXRlZCB0byBpbnN1bGluIHNpZ25hbGxpbmcgYW5kIGF1dG9waGFneSwgZW5yaWNoZWQgYW1vbmcgdGhlIFIrIGdlbmVzLiAoMikKClRoZSB0ZXJtcyBpZGVudGlmaWVkIGluIHRoZSB0aHJlc2hvbGRlZCBhbmFseXNpcyBkbyBub3QgYXBwZWFyIGFtb25nIHRoZSB0b3Agc2lnbmlmaWNhbnQgdGVybXMgaWRlbnRpZmllZCBpbiB0aGUgbm9uLXRocmVzaG9sZGVkIGFuYWx5c2lzLiBIb3dldmVyLCBhcyBzaG93biBpbiBmaWd1cmUgMiwgbWFueSB0ZXJtcyByZWxhdGluZyB0byBpbW11bmUgY2VsbCByZWd1bGF0aW9uIGFyZSBpZGVudGlmaWVkIGFzIHNpZ25pZmljYW50bHkgZW5yaWNoZWQgaW4gdGhlIEdTRUEuIEFsdGhvdWdoIHRoaXMgY29tcGFyaXNvbiBpcyBub3Qgc3RyYWlnaHRmb3J3YXJkLCBzaW5jZSBPUkEgcmVzdWx0cyBhcmUgYmluYXJ5IHdoaWxlIEdTRUEgcmVzdWx0cyBhcmUgZXh0ZW5zaXZlIGFuZCBjb250aW51b3VzLCB0aGUgaGlnaCBzaWduYWwgZnJvbSB0ZXJtcyByZWxhdGVkIHRvIFJOQSBwcm9jZXNzaW5nIGluIHRoZSBHU0VBIHJlc3VsdHMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIE9SQSByZXN1bHRzIHNob3cgdGhhdCB0aGUgR1NFQSBoYXMgaWRlbnRpZmllZCBnZW5lc2V0cyB0aGF0IHdlcmUgaGlkZGVuIGJ5IHRoZSBhcmJpdHJhcnkgbmF0dXJlIG9mIGEgdGhyZXNob2xkZWQgYW5hbHlzaXMuICgzKQoKIyMgVmlzdWFsaXphdGlvbiBvZiByZXN1bHRzCgpJbiBDeXRvc2NhcGUgW0BTaGFubm9uMjAwM10sIHdlIGNyZWF0ZSBhbiBFbnJpY2htZW50TWFwIFtATWVyaWNvMjAxMF0gb2YgR1NFQSByZXN1bHRzIHdpdGggRkRSLWNvcnJlY3RlZCBwLXZhbHVlIGxlc3NlciB0aGFuIDAuMDUgYW5kIGVkZ2Ugc2ltaWxhcml0eSBncmVhdGVyIHRoYW4gMC4zNzUuIFRoZSByZXN1bHRpbmcgbmV0d29yaywgc2hvd24gaW4gZmlndXJlIDEsIGhhcyAyNDkgbm9kZXMgYW5kIDI1NDcgZWRnZXMuICgxKSAhW0ZpZ3VyZSAxXShmaWd1cmVzL0VNX3VuYW5ub3QucG5nKQoKPGNlbnRlcj4qKipGaWd1cmUgMToqKiogRW5yaWNobWVudE1hcCBvZiBHU0VBIHJlc3VsdHMsIHdpdGggRkRSLWNvcnJlY3RlZCBwLXZhbHVlIGxlc3NlciB0aGFuIDAuMDMgYW5kIGVkZ2Ugc2ltaWxhcml0eSBncmVhdGVyIHRoYW4gMC4zNzUsIGJlZm9yZSBtYW51YWwgYW5ub3RhdGlvbi48L2NlbnRlcj4KPGJyPgpXZSBhbm5vdGF0ZSB0aGlzIG5ldHdvcmsgdXNpbmcgQXV0b0Fubm90YXRlIFtAS3VjZXJhMjAxNl0sIHVzaW5nIEdTX0RFU0NSIGFzIG91ciBsYWJlbCBjb2x1bW4sIHNlbGVjdGluZyAnTGF5b3V0IG5ldHdvcmsgdG8gbWluaW1pemUgY2x1c3RlciBvdmVybGFwJywgYW5kIHNldHRpbmcgdGhlIGFtb3VudCBvZiBjbHVzdGVycyBvbmUgbm90Y2ggZnJvbSB0aGUgZmV3ZXN0LiBBZnRlciBtYW51YWxseSByZW9yZ2FuaXppbmcgbm9kZXMgYW5kIHJlbGFiZWxsaW5nIGNsdXN0ZXJzLCB3ZSBnZXQgZmlndXJlIDIuICgyKSgzKQoKIVtGaWd1cmUgMl0oZmlndXJlcy9FTV9hbm5vdF9sZWcucG5nKQoKPGNlbnRlcj4qKipGaWd1cmUgMjoqKiogRW5yaWNobWVudE1hcCBvZiBHU0VBIHJlc3VsdHMsIHdpdGggRkRSLWNvcnJlY3RlZCBwLXZhbHVlIGxlc3NlciB0aGFuIDAuMDMgYW5kIGVkZ2Ugc2ltaWxhcml0eSBncmVhdGVyIHRoYW4gMC4zNzUsIGNsdXN0ZXJlZCB3aXRoIEF1dG9Bbm5vdGF0ZS4gVGVybXMgZW5yaWNoZWQgaW4gdXByZWd1bGF0ZWQgZ2VuZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHJlZCBub2RlcywgYW5kIHRlcm1zIGVucmljaGVkIGluIGRvd25yZWd1bGF0ZWQgZ2VuZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGJsdWUgbm9kZXMuPC9jZW50ZXI+Cjxicj4KV2UgY29sbGFwc2UgdGhlIG5ldHdvcmsgdG8gYSB0aGVtZSBuZXR3b3JrIGluIEN5dG9zY2FwZSBhbmQgbm90ZSBtYWpvciB0aGVtZXMuIFRoZSBtYWluIHRoZW1lcyBhcmUgUk5BIHByb2Nlc3NpbmcsIHJlZ3VsYXRpb24gb2YgaW1tdW5lIGNlbGwgbWVkaWF0ZWQgcGF0aHdheXMsIEROQSByZXBhaXIgYW5kIGF1dG9waGFneS4gVGhlIGhpZ2ggZW5yaWNobWVudCBvZiB0ZXJtcyByZWxhdGluZyB0byBSTkEgcHJvY2Vzc2luZyBwYXRod2F5cywgRE5BIHJlcGFpciBwYXRod2F5cyBhbmQgYXV0b3BoYWdvdXMgcGF0aHdheXMgaXMgbm92ZWwgdG8gdGhlIG5vbi10aHJlc2hvbGRlZCBhbmFseXNpcywgYnV0IHRoZXNlIHJlc3VsdHMgZG8gYWxpZ24gd2l0aCB0aGUgbW9kZWwgYW5kIHRoZSBtZWNoYW5pc21zIGludm9sdmVkIGluIHNlcHRpYyBzaG9jayB0aGVyYXB5IHJlc3BvbnNlLiAoNCkKCiMjIEludGVycHJldGluZyBHU0VBIHJlc3VsdHMKCkFzIHdpdGggdGhlIHRocmVzaG9sZGVkIE9SQSByZXN1bHRzLCB0aGUgZW5yaWNobWVudCBvZiB0ZXJtcyByZWxhdGluZyB0byByZWd1bGF0aW9uIG9mIGltbXVuZSBjZWxsIHJlc3BvbnNlLCBlc3BlY2lhbGx5IHJlZ3VsYXRpb24gb2YgVC1jZWxsIGFuZCBhbnRpZ2VuIHJlY2VwdG9yIG1lZGlhdGVkIHBhdGh3YXlzIHN1cHBvcnRzIEJhcmNlbGxhIGV0IGFsJ3MgY29uY2x1c2lvbnMuCgpUaGUgbm9uLXRocmVzaG9sZGVkIGFuYWx5c2lzIGFsc28gZGV0ZWN0ZWQgZW5yaWNobWVudCBvZiB0ZXJtcyByZWxhdGVkIHRvIHJlZ3VsYXRpb24gb2YgaW50ZXJsZXVraW4tMTAgcHJvZHVjdGlvbiwgd2hpY2ggc3VwcG9ydHMgQmFyY2VsbGEgZXQgYWwncyBpZGVudGlmaWNhdGlvbiBvZiBpbnRlcmxldWtpbiByZWNlcHRvciBnZW5lcyBleGNsdXNpdmVseSBkb3ducmVndWxhdGVkIGluIHRoZSBSIGdyb3VwLgoKVGVybXMgcmVsYXRlZCB0byBjZWxsIG1pZ3JhdGlvbiB3ZXJlIG5vdCBoaWdobGlnaHRlZCBpbiB0aGUgbm9uLXRocmVzaG9sZGVkIGFuYWx5c2lzLCBidXQgbWFueSB0ZXJtcyByZWxhdGVkIHRvIFJOQSBwcm9jZXNzaW5nLCBETkEgcmVwYWlyIGFuZCBhdXRvcGhhZ3ksIG1lY2hhbmlzbXMgd2hpY2ggQmFyY2VsbGEgZXQgYWwgZGlkIG5vdCBleHBsaWNpdGx5IGRpc2N1c3Mgb3Igbm90ZSwgd2VyZSBpZGVudGlmaWVkIGFzIHNpZ25pZmljYW50LiAoMSkKCkdlbmVzIHJlbGF0ZWQgdG8gRE5BIHJlcGFpciBoYXZlIGJlZW4gaWRlbnRpZmllZCBhcyBiaW9tYXJrZXJzIGZvciBzZXBzaXMgW0BHdTIwMjVdLCB3aGljaCBzdXBwb3J0cyB0aGUgZW5yaWNobWVudCBvZiBETkEgcmVwYWlyIHJlbGF0ZWQgdGVybXMgaW4gUi0gZ2VuZXMgaW4gb3VyIGFuYWx5c2lzLCBzdWdnZXN0aW5nIHRoYXQgaGVtb2R5bmFtaWMgdGhlcmFweSByZWR1Y2VzIGV4cHJlc3Npb24gb2YgdGhlc2UgYmlvbWFya2VycyBhbW9uZyBSIHBhdGllbnRzLCBidXQgbm90IE5SIHBhdGllbnRzLgoKSW4gZ2VuZXJhbCwgdGhlIHNpZ25hbGxpbmcgcGF0aHdheXMgYWN0aXZhdGVkIGluIGNhc2VzIG9mIHNlcHNpcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1cHJlZ3VsYXRpb24gb2YgbWFueSBjb21tb24gZ2VuZSBjbGFzc2VzIGFzc29jaWF0ZWQgd2l0aCBpbmZsYW1hdGlvbiBhbmQgY2VsbHVsYXIgbWV0YWJvbGlzbSBbQEJ1c2hyYTIwMjRdLCB3aGljaCBzdXBwb3J0cyB0aGUgaGlnaGx5IHNpZ25pZmljYW50IGVucmljaG1lbnQgb2YgbWFueSBub25kZXNjcmlwdCB0ZXJtcyByZWxhdGVkIHRvIFJOQSBzeW50aGVzaXMgYW5kIHByb2Nlc3NpbmcgaW4gUi0gZ2VuZXMgaW4gb3VyIGFuYWx5c2lzLCBhbmQgdGhlIG9ic2VydmF0aW9uIG9mIG1vcmUgc2lnbmlmaWNhbnRseSBlbnJpY2hlZCB0ZXJtcyBhbW9uZyBvdXIgUi0gZ2VuZXMgdGhhbiBhbW9uZyBvdXIgUisgZ2VuZXMsIHN1Z2dlc3RpbmcgdGhhdCBtYW55IHNlcHNpcy1hc3NvY2lhdGVkIHBhdGh3YXlzIGNhdXNpbmcgZHlzZnVuY3Rpb25hbCB1cHJlZ3VsYXRpb24gb2YgZ2VuZXMgYXJlIGRvd25yZWd1bGF0ZWQgYnkgaGVtb2R5bmFtaWMgdGhlcmFweSBpbiBSIHBhdGllbnRzLCBidXQgbm90IGluIE5SIHBhdGllbnRzLgoKQXV0b3BoYWd5IGhhcyBiZWVuIGlkZW50aWZpZWQgdG8gcGxheSBhIG11bHRpZmFyaW91cyByb2xlIGluIHNlcHNpcyBjYXNlcywgd2l0aCBwb3RlbnRpYWwgYm90aCB0byBtb2R1bGF0ZSBpbmZsYW1tYXRpb24gYW5kIHByb21vdGUgY2VsbCBzdXJ2aXZhbCBbQEliYTIwMjRdLCBhbmQgdG8gYmUgZHlzcmVndWxhdGVkIGluIHNlcHNpcyBzaWduYWxsaW5nIHBhdGh3YXlzIGFuZCBjb250cmlidXRlIHRvIHRpc3N1ZSBkYW1hZ2VbQFlpbjIwMTldLiBUaGlzIHN1cHBvcnRzIG91ciBHU0VBJ3MgaWRlbnRpZmljYXRpb24gb2YgdGVybXMgcmVsYXRlZCB0byB0aGUgcmVndWxhdGlvbiBvZiBhdXRvcGhhZ3kgYXMgZW5yaWNoZWQgYW1vbmcgb3VyIFIrIGdlbmVzLCBhbmQgc3VnZ2VzdHMgdGhhdCBoZW1vZHluYW1pYyB0aGVyYXB5IHN1Y2Nlc3NmdWxseSBtZWRpYXRlcyBhdXRvcGhhZ3kgaW4gcmVzcG9uZGVycywgYnV0IG5vdCBpbiBub24tcmVzcG9uZGVycy4gKDIpCgojIEJpYmxpb2dyYXBoeQo=