1 TODO

  1. Ensure no columns have names like ‘etnia’ but instead ‘ethnicity_cat’
  2. Decide how to handle the retirement of tritrypdb.org

2 Changelog

  • 202408: Made demographics data more available for the new regression analyses.
  • 202405: Reworked handling of the demographics data
  • 202308: Small reorganization to more closely adhere to the flow of the manuscript’s text.
  • 202305: Updated default image format.
  • 202304: Added a series of stanzas printing out the Cali-only data.
  • Updated input metadata sheets

3 Notes

  • Interferon score for severity. A few different sets are available, may need to choose a specific paper, then modify it?

4 Introduction

This document takes the various outputs produced by salmon/hisat/htseq/etc and generates the data which will be used in all of the following analyses.

4.1 Metadata Sources

Periodically, the shared metadata sheet was downloaded locally to the sample_sheets/ directory, given a suffix corresponding to the current worksheet revision, and the various trimming/alignment/etc statistics were manually added. Finally, some demographics were appended to the sample metadata. The resulting modified metadata was used as the input for all following analyses.

samplesheet <- "sample_sheets/tmrc3_samples.xlsx"
testthat::expect_true(file.exists(samplesheet))
demographics <- "sample_sheets/tmrc3_demographicsv2.xlsx"
hslp_samplesheet <- "sample_sheets/tmrc3_samples_pruned.xlsx"
species_identities <- "sample_sheets/identified_parasite_species.xlsx"
data_structures <- c(data_structures, "samplesheet", "demographics")

5 Annotation Collection

The primary annotation sources are:

  1. Ensembl’s biomart archive from 2020 for human annotations (“Homo Sapiens - Ensembl Genome Browser 100” (n.d.)).
  2. The TriTrypDB release 36 for parasite annotations (TriTrypDB Leishmania Panamensis, Version 46” (n.d.)).

Both provide GO data. They also provide helpful links to other data sources. For the moment, we are focusing on the human annotations. In the first instance, the annotations are acquired via some functions in hpgltools which seek to make biomaRt (Smedley et al. (2009)) a little more robust. In the second instance, the annotations are extracted from a locally generated orgDB/annotationDbi (AnnotationDbi (n.d.)) instance.

5.1 Gene annotations

These analyses have focused on gene-level abundances/differences. Thus, when htseq-count was invoked against the hisat2-based mappings, parameters were chosen to count genes rather than transcripts. In this context, a gene refers to the non-redundant union of the transcripts’ exons. Similarly, when salmon counts were used via tximport, a mapping of genes to transcripts was used to collapse the matrix to gene-level abundances. This decision may be revisited.

The parasite annotations were downloaded from the tritrypdb via the provided REST interface, exported into an OrgDB instance, and extracted via the EuPathDB package.

hs_annot <- load_biomart_annotations(year = "2020", month = "jan")
## Using mart: ENSEMBL_MART_ENSEMBL from host: jan2020.archive.ensembl.org.
## Successfully connected to the hsapiens_gene_ensembl database.
## Finished downloading ensembl gene annotations.
## Finished downloading ensembl structure annotations.
## symbol columns is null, pattern matching 'symbol'.
## Including symbols, there are 68435 vs the 249606 gene annotations.
## Not dropping haplotype chromosome annotations, set drop_haplotypes = TRUE if this is bad.
## Saving annotations to hsapiens_biomart_annotations.rda.
## Finished save().
hs_annot <- hs_annot[["annotation"]]
## The next two lines make a bridge between the gff file used by hisat2
## and the gene IDs.

The following lines may be used if one wishes to use the relatively strict ID.version system (optionally) enforced by salmon. It should be noted that newer versions of tximport have options which ignore this, and I also now have a function which will set the ID.version for the gene annotations to be the same as what was observed in the count tables. Either of those strategies makes the following not necessary; but if you wish to be a little bit pedantic about the gene<->Tx IDs, then this should give you a sense of how well matched are the downloaded annotations and gene IDs used by salmon.

hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".", hs_annot[["version"]])
hs_annot <- group_mean_cds_length(hs_annot)
hs_tx_annot <- hs_annot ## Make a copy so I don't lose transcript IDs for salmon
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique = TRUE)
not_unique_idx <- grepl(x = rownames(hs_annot), pattern = "\\.\\d+$")
hs_annot <- hs_annot[!not_unique_idx, ]

5.1.1 Also collect parasite annotations

The following block will stop working soon. Its purpose is to download the current (or a specific version) annotations from one of the eupathdb.org websites. These are being retired/moved soon. My version of the EuPathDB package creates installable orgdb packages; so I presumably will just need to include the appropriate tarballs in the recipe for this container. In response to the retirement of eupathdb, I spun up an instance of my eupathdb package to download everything; hopefully it will finish before the various servers go down. I was too late for schistodb, it is already offline (I am pretty sure I have an older copy though).

Given that I recently included the parasite transcripts to the data, I should also spend a moment and figure out how to include the annotations.

As a starting point, I will just grab the EuPathDB panamensis annotations. I think I will need to limit them to just the shared columns and drop the rest.

meta <- sm(download_eupath_metadata(webservice = "tritrypdb"))
panamensis_entry <- get_eupath_entry("MHOM", metadata = meta[["valid"]])

panamensis_db <- make_eupath_orgdb(panamensis_entry)
panamensis_pkg <- panamensis_db[["pkgname"]]
package_name <- panamensis_db[["pkgname"]]
if (is.null(panamensis_pkg)) {
  panamensis_pkg <- panamensis_db[["orgdb_name"]]
  package_name <- panamensis_pkg
}
tt <- library(panamensis_pkg, character.only = TRUE)
panamensis_pkg <- get0(panamensis_pkg)
all_fields <- columns(panamensis_pkg)
all_lp_annot <- sm(load_orgdb_annotations(
    panamensis_pkg,
    keytype = "gid",
    fields = c("annot_gene_entrez_id", "annot_gene_name",
               "annot_strand", "annot_chromosome", "annot_cds_length",
               "annot_gene_location_text", "annot_gene_product")))$genes

Ok, I added the orgdb tarball and an entry to install it to my bootstrap for this container. So let us load the annotations for our Leishmanial strain of interest!

package_name <- "org.Lpanamensis.MHOMCOL81L13.v68.eg.db"
tt <- library(package_name, character.only = TRUE)
## Loading required package: AnnotationDbi
## 
## Attaching package: 'AnnotationDbi'
## The following object is masked from 'package:dplyr':
## 
##     select
## 
panamensis_pkg <- get0(package_name)
all_fields <- columns(panamensis_pkg)
all_lp_annot <- sm(load_orgdb_annotations(
  package_name,
  keytype = "gid",
  fields = c("annot_gene_entrez_id", "annot_gene_name",
             "annot_strand", "annot_chromosome", "annot_cds_length",
             "annot_gene_location_text", "annot_gene_product")))[["genes"]]

The following was added to support the possibility of making a single expressionset using the mappings against a genome of concatenated hg38 and lpanamensis sequence. In order to do that, one must have an annotation set with consistent columns across all genes from both species.

I am not sure if I copied those count tables to the container (I suspect I did not), but I will leave the code here as an example of how one might make a concatenated expressionset/summarizedexperiment.

all_lp_annot[["end"]] <- gsub(x = all_lp_annot[["annot_gene_location_text"]],
                              pattern = "^.*\\.\\.", replacement = "")
all_lp_annot[["end"]] <- gsub(x = all_lp_annot[["end"]],
                              pattern = "\\(.*$", replacement = "")
all_lp_annot[["end"]] <- gsub(x = all_lp_annot[["end"]],
                              pattern = "\\,", replacement = "")
all_lp_annot[["start"]] <- gsub(x = all_lp_annot[["annot_gene_location_text"]],
                                pattern = "^.*:", replacement = "")
all_lp_annot[["start"]] <- gsub(x = all_lp_annot[["start"]],
                                pattern = "\\.\\..*$", replacement = "")
all_lp_annot[["start"]] <- gsub(x = all_lp_annot[["start"]],
                                pattern = "\\,", replacement = "")
all_lp_annot[["mean_cds_len"]] <- all_lp_annot[["annot_cds_length"]]
all_lp_annot[["version"]] <- 1
all_lp_annot[["transcript_version"]] <- 1
all_lp_annot[["hgnc_symbol"]] <- ""
all_lp_annot[["uniprot_gn_symbol"]] <- ""
all_lp_annot[["transcript"]] <- all_lp_annot[["gid"]]
all_lp_annot[["ensembl_transcript_id"]] <- all_lp_annot[["gid"]]

colnames(hs_tx_annot)
##  [1] "ensembl_gene_id"       "ensembl_transcript_id" "version"              
##  [4] "transcript_version"    "description"           "gene_biotype"         
##  [7] "cds_length"            "chromosome_name"       "strand"               
## [10] "start_position"        "end_position"          "hgnc_symbol"          
## [13] "uniprot_gn_symbol"     "transcript"            "mean_cds_len"
colnames(all_lp_annot)
##  [1] "gid"                      "annot_external_db_name"  
##  [3] "gene_type"                "annot_gene_entrez_id"    
##  [5] "annot_gene_name"          "annot_strand"            
##  [7] "annot_chromosome"         "annot_cds_length"        
##  [9] "annot_gene_location_text" "annot_gene_product"      
## [11] "end"                      "start"                   
## [13] "mean_cds_len"             "version"                 
## [15] "transcript_version"       "hgnc_symbol"             
## [17] "uniprot_gn_symbol"        "transcript"              
## [19] "ensembl_transcript_id"
wanted_columns <- c("gid", "ensembl_transcript_id", "version", "transcript_version", "annot_gene_product",
                    "gene_type", "annot_cds_length", "annot_chromosome", "annot_strand", "start",
                    "end", "hgnc_symbol", "uniprot_gn_symbol", "transcript", "mean_cds_len")
all_lp_annot <- all_lp_annot[, wanted_columns]
colnames(all_lp_annot) <- colnames(hs_tx_annot)

hslp_annot <- rbind(hs_tx_annot, all_lp_annot)

Finally, dump the current gene ontology data from the EuPathDB-generated orgdb instance. This may be used by goseq/topgo/gostats/etc…

Just as a lark, grab orthologs across the EuPathDB as well in the following block.

One might reasonably ask why in the heck the gene ID column was changed to ‘ensembl_gene_id’, this is to make it easier (possible) to merge these annotations with the ensembl human annotations, if one chooses to combine the two genomes and examine them together.

lp_go <- load_orgdb_go(package_name)
## The chosen keytype was not available.  Using 'GID'.
## This is an orgdb, good.
lp_go <- lp_go[, c("GID", "GO")]
lp_lengths <- all_lp_annot[, c("ensembl_gene_id", "mean_cds_len")]
colnames(lp_lengths)  <- c("gid", "length")
all_lp_annot[["description"]] <- tolower(all_lp_annot[["description"]])

## extract_eupath_orthologs is from EuPathDB and isn't really
## being used for anything in this document afaik.
##orthos <- extract_eupath_orthologs(db = panamensis_pkg)
data_structures <- c(data_structures, "lp_lengths", "lp_go", "all_lp_annot", "meta")

5.1.2 Set up gene->transcript mappings

One should pay careful attention to the columns used to concatenate the gene/version and transcript/version. If these do not match exactly, many genes will be dropped by tximport without any output to signify something is wrong.

Note to self, I made a fun function which grabs the ids from salmon results. In addition I found that tximport can optionally ignore them.

## The tx_gene_map is used for tximport and salmon quantifications.
hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".",
                                   hs_annot[["transcript_version"]])
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique = TRUE)
hs_tx_gene_map <- hs_annot[, c("transcript", "ensembl_gene_id")]

5.2 Gene ontology data

The set of GO categories has not been limited to the 2020 data at the time of this writing. The GO categories is collected along with lengths for goseq. The other methods either have built-in databases of human data (gProfiler) or support orgDB data (org.Hs.eg.db) (clusterProfiler/topGO/gostats).

hs_go <- try(load_biomart_go()[["go"]])
## Using mart: ENSEMBL_MART_ENSEMBL from host: useast.ensembl.org.
## Successfully connected to the hsapiens_gene_ensembl database.
## Finished downloading ensembl go annotations, saving to hsapiens_go_annotations.rda.
## Saving ontologies to hsapiens_go_annotations.rda.
## Finished save().
if ("try-error" %in% class(hs_go)) {
  hs_go <- NULL
}

hs_length <- hs_annot[, c("ensembl_gene_id", "cds_length")]
colnames(hs_length) <- c("ID", "length")
data_structures <- c(data_structures, "hs_length", "hs_go", "hs_annot")

6 Dataset: Create the parent data structure of all samples

Before we do any of the following subsets/analyses of the data, we need to collect it all in one place. Let’s do that here and name it ‘hs_expt’, it will comprise the full set of human data. When we cull some samples it will be renamed to ‘hs_valid’.

The variable ‘data_structures’ will contain the names of every variable I create in this document which I wish to save to disk.

Similarly, the character vector ‘sanitize_columns’ is the list of metadata columns over which I will iterate and sanitize the data, removing any spurious spaces, capitalization, etc.

6.1 Create Expressionset

The primary function used is ‘create_expt()’, which is responsible for combining the metadata (from the first block of code), the gene annotations (from the 2nd/3rd), and count tables (included in the metadata as a column of filenames) into a single expressionset (Huber et al. (2015)). The sanitize_columns variable defines the metadata columns which will be explicitly sanitized beyond the general checks performed. ‘subset_genes()’ is responsible for including only the protein coding genes in the data; it records the amount of information lost to the metadata as column ‘ncrna_lost’. ‘sanitize_metadata()’ will perform some sanity checks of the metadata to ensure that excel did not do anything untoward to the metadata. The ’set_expt_*()’ functions modify the metadata to make it more friendly for future tasks, including setting some columns to factors, defining the column of interest vs. known surrogate(s). Finally, ‘subset_expt()’ is used to drop samples which are known to not be of interest, like the few samples from people who presented as healthy in the clinic (when the clinicalpresentation column of the metadata is ‘h’).

One note if anyone actually reads this, I have a sister function which creates summarizedExperiments (SummarizedExperiment (n.d.)) instead of expressionSets, and I think all of my code should move to that; but it just has not happened because I just haven’t had a chance to finish writing the tests and making whatever little changes would be required to get them to all pass. If my fictitious reader is interested, I would love help completing the switch from exprs->se.

sanitize_columns <- c("visitnumber", "finaloutcome", "donor",
                      "typeofcells", "clinicalpresentation", "drug",
                      "condition", "batch", "clinic")
hs_expt <- create_expt(samplesheet,
                       file_column = "hg38100hisatfile",
                       savefile = glue("rda/tmrc3_hs_expt_all_raw-v{ver}.rda"),
                       gene_info = hs_annot) %>%
  subset_genes(column = "gene_biotype", method = "keep",
               pattern = "protein_coding", meta_column = "ncrna_lost") %>%
  sanitize_expt_pData(columns = sanitize_columns)  %>%
  set_expt_factors(columns = sanitize_columns, class = "factor") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  set_expt_batches(fact = "visitnumber") %>%
  subset_expt(subset = "typeofcells!='pbmcs'") %>%
  subset_expt(subset = "typeofcells!='macrophages'") %>%
  subset_expt(subset = "clinicalpresentation!='h'")
## Reading the sample metadata.
## Error in eval(expr, envir, enclos) : 
##   basic_string::substr: __pos (which is 8) > this->size() (which is 5)
## Did not find the column: sampleid.
## Setting the ID column to the first column.
## Dropped 69 rows from the sample metadata because the sample ID is blank.
## Warning in extract_metadata(metadata, id_column = id_column, ...): There were
## NA values in the condition column, setting them to 'undefined'.

## Warning in extract_metadata(metadata, id_column = id_column, ...): There were
## NA values in the condition column, setting them to 'undefined'.
## The sample definitions comprises: 254 rows(samples) and 88 columns(metadata fields).
## Warning in create_expt(samplesheet, file_column = "hg38100hisatfile", savefile
## = glue("rda/tmrc3_hs_expt_all_raw-v{ver}.rda"), : Some samples were removed
## when cross referencing the samples against the count data.
## Matched 21476 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 21481 features and 246 samples.
## remove_genes_expt(), before removal, there were 21481 genes, now there are 19952.
## There are 8 samples which kept less than 90 percent counts.
## TMRC30015 TMRC30269 TMRC30017 TMRC30019 TMRC30044 TMRC30045 TMRC30154 TMRC30241 
##     79.21     89.19     85.69     89.70     80.30     73.32     83.18     89.42
## The numbers of samples by condition are:
## 
##          cure       failure          lost notapplicable 
##           130            64            16            36
## The number of samples by batch are:
## 
##             1             2             3 notapplicable 
##           108            56            54            28
## The samples excluded are: TMRC30001, TMRC30002, TMRC30003, TMRC30004, TMRC30005, TMRC30006.
## subset_expt(): There were 246, now there are 240 samples.
## The samples excluded are: TMRC30059, TMRC30060, TMRC30061, TMRC30062, TMRC30063, TMRC30051, TMRC30064, TMRC30065, TMRC30162, TMRC30066, TMRC30067, TMRC30117, TMRC30057, TMRC30069, TMRC30266, TMRC30268, TMRC30286, TMRC30249, TMRC30267, TMRC30252, TMRC30250, TMRC30251, TMRC30245, TMRC30246, TMRC30247, TMRC30248, TMRC30243, TMRC30244.
## subset_expt(): There were 240, now there are 212 samples.
## The samples excluded are: TMRC30007, TMRC30008.
## subset_expt(): There were 212, now there are 210 samples.
data_structures <- c(data_structures, "hs_expt")

## The following should make visit 1 the largest if one uses that column as a size factor when plotting.
meta <- pData(hs_expt) %>%
  mutate(visitnumber = fct_relevel(visitnumber, c("3", "2", "1")))
start_order <- rownames(meta)
## Incorporate the identified strains
identified <- openxlsx::read.xlsx(species_identities)
no_data_idx <- identified[["Species"]] == "No hay dato"
identified <- identified[!no_data_idx, ]
identified <- identified[, c("Patient", "Species")]
colnames(identified) <- c("Patient", "ParasiteSpecies")
meta <- merge(meta, identified, by.x = "tubelabelorigin", by.y = "Patient", all.x = TRUE)
meta <- sanitize_metadata(meta, columns = "ParasiteSpecies", spaces = TRUE)
## Note that the merge removes the rownames and maybe changes sample order.
rownames(meta) <- meta[["tmrcidentifier"]]
meta <- meta[start_order, ]

pData(hs_expt) <- meta
save(list = "hs_expt", file = glue("rda/tmrc3_hs_expt_all_sanitized-v{ver}.rda"))

6.2 Add the patient demographics

There are some parameters provided by the clinicians which may prove to be of interest. I therefore am adding the demographics here. I will also run some simple checks to try to make sure that the clinician’s metadata agrees with the sample metadata.

In this first block, read the demographics and sanitize out the encoded NAs (999 and 888 or whatever) and add a column to join it to the sample sheet data.

hs_demographics <- openxlsx::read.xlsx(demographics)
hs_demographics[["join"]] <- tolower(hs_demographics[["Patient_ID"]])

columns_with_encoded_na <- c("Adherence_Glucantime", "Adherence_Miltefosine",
                             "Total_Ampules_Prescribed_Milt", "Prescribed_Daily_Dose_Milt",
                             "Total_Ampules_Prescribed_Gluc", "Prescribed_Daily_Dose_Gluc",
                             "V5_Total_Area_Ulcer", "V5_Vertical_Axis_Ulcer",
                             "V5_Horizontal_Axis_Ulcer", "V5_Total_Area_Lesion",
                             "V5_Vertical_Axis_Lesion", "V5_Horizontal_Axis_Lesion",
                             "V4_Total_Area_Ulcer", "V4_Vertical_Axis_Ulcer",
                             "V4_Horizontal_Axis_Ulcer", "V4_Total_Area_Lesion",
                             "V4_Vertical_Axis_Lesion", "V4_Horizontal_Axis_Lesion",
                             "V3_Total_Area_Ulcer", "V3_Vertical_Axis_Ulcer",
                             "V3_Horizontal_Axis_Ulcer", "V3_Total_Area_Lesion",
                             "V3_Vertical_Axis_Lesion", "V3_Horizontal_Axis_Lesion",
                             "V2_Total_Area_Ulcer", "V2_Vertical_Axis_Ulcer",
                             "V2_Horizontal_Axis_Ulcer", "V2_Total_Area_Lesion",
                             "V2_Vertical_Axis_Lesion", "V2_Horizontal_Axis_Lesion",
                             "V5_New_Lesions", "V4_New_Lesions", "V3_New_Lesions",
                             "V2_New_Lesions")
for (col in columns_with_encoded_na) {
  na_idx <- hs_demographics[[col]] == 999
  message("Column ", col, " contains ", sum(na_idx), " encoded NA values.")
  hs_demographics[na_idx, col] <- NA
}
## Column Adherence_Glucantime contains 5 encoded NA values.
## Column Adherence_Miltefosine contains 35 encoded NA values.
## Column Total_Ampules_Prescribed_Milt contains 35 encoded NA values.
## Column Prescribed_Daily_Dose_Milt contains 35 encoded NA values.
## Column Total_Ampules_Prescribed_Gluc contains 5 encoded NA values.
## Column Prescribed_Daily_Dose_Gluc contains 5 encoded NA values.
## Column V5_Total_Area_Ulcer contains 38 encoded NA values.
## Column V5_Vertical_Axis_Ulcer contains 38 encoded NA values.
## Column V5_Horizontal_Axis_Ulcer contains 38 encoded NA values.
## Column V5_Total_Area_Lesion contains 38 encoded NA values.
## Column V5_Vertical_Axis_Lesion contains 38 encoded NA values.
## Column V5_Horizontal_Axis_Lesion contains 38 encoded NA values.
## Column V4_Total_Area_Ulcer contains 35 encoded NA values.
## Column V4_Vertical_Axis_Ulcer contains 35 encoded NA values.
## Column V4_Horizontal_Axis_Ulcer contains 35 encoded NA values.
## Column V4_Total_Area_Lesion contains 35 encoded NA values.
## Column V4_Vertical_Axis_Lesion contains 35 encoded NA values.
## Column V4_Horizontal_Axis_Lesion contains 35 encoded NA values.
## Column V3_Total_Area_Ulcer contains 10 encoded NA values.
## Column V3_Vertical_Axis_Ulcer contains 10 encoded NA values.
## Column V3_Horizontal_Axis_Ulcer contains 10 encoded NA values.
## Column V3_Total_Area_Lesion contains 10 encoded NA values.
## Column V3_Vertical_Axis_Lesion contains 10 encoded NA values.
## Column V3_Horizontal_Axis_Lesion contains 10 encoded NA values.
## Column V2_Total_Area_Ulcer contains 4 encoded NA values.
## Column V2_Vertical_Axis_Ulcer contains 4 encoded NA values.
## Column V2_Horizontal_Axis_Ulcer contains 4 encoded NA values.
## Column V2_Total_Area_Lesion contains 4 encoded NA values.
## Column V2_Vertical_Axis_Lesion contains 4 encoded NA values.
## Column V2_Horizontal_Axis_Lesion contains 4 encoded NA values.
## Column V5_New_Lesions contains 21 encoded NA values.
## Column V4_New_Lesions contains 14 encoded NA values.
## Column V3_New_Lesions contains 4 encoded NA values.
## Column V2_New_Lesions contains 2 encoded NA values.
factor_columns <- c("Sex", "Ethnicity", "Infection_Location", "Previously_Diagnosed",
                    "Adverse_Effects_V3", "Adverse_Effects_V4", "Therapeutic_Outcome_V3",
                    "Therapeutic_Outcome_V4", "Therapeutic_Outcome_V5",
                    "Therapeutic_Outcome_Final")
for (col in factor_columns) {
  hs_demographics[[col]] <- as.factor(hs_demographics[[col]])
}

## Extract the clinic from the patient id via a cheeseball regex.
hs_demographics[["Clinic"]] <- gsub(x = hs_demographics[["Patient_ID"]],
                                    pattern = "^SU(\\d){1}.*$", replacement = "\\1")
data_structures <- c(data_structures, "hs_demographics")

6.3 Get the Sample sheet data ready for joining and perform the merge

In the following we add a column ‘join’ analagous to that added to the demographics, this will be used to add the various columns across each person’s samples. I guess I could have done this with merge(all.x = TRUE, all.y = TRUE)

hs_pd <- pData(hs_expt)
hs_pd[["join"]] <- hs_pd[["tubelabelorigin"]]

hs_pd_demographics <- plyr::join(hs_pd, hs_demographics, by = "join")
hs_pd_demographics[["join"]] <- NULL
rownames(hs_pd_demographics) <- rownames(hs_pd)
na_idx <- is.na(hs_pd_demographics)
sum(na_idx)
## [1] 8651
hs_pd_demographics[na_idx] <- "undefined"

data_structures <- c(data_structures, "hs_pd_demographics")

6.4 Add the demographics to the expressionset

In addition we will create a series of composite variables from combinations of extant factors.

pData(hs_expt) <- hs_pd_demographics

## Now add in the ethnicity and sex
## Add a combination of the ethnicity and clinic
## While I am at it, do sex+clinic
table(pData(hs_expt)[["Sex"]])
## 
##   1   2 
## 173  37
table(pData(hs_expt)[["Ethnicity"]])
## 
##   1   2   3 
## 101  62  47
table(pData(hs_expt)[["clinic"]])
## 
##   cali tumaco 
##     67    143
etnia_names <- as.character(pData(hs_expt)[["Ethnicity"]])
etnia_idx <- etnia_names == 1
etnia_names[etnia_idx] <- "afrocol"
etnia_idx <- etnia_names == 2
etnia_names[etnia_idx] <- "indigena"
etnia_idx <- etnia_names == 3
etnia_names[etnia_idx] <- "mestiza"
pData(hs_expt)[["etnia"]] <- as.factor(etnia_names)
table(pData(hs_expt)[["etnia"]])
## 
##  afrocol indigena  mestiza 
##      101       62       47
table(pData(hs_expt)[["Ethnicity"]])
## 
##   1   2   3 
## 101  62  47
etnia_factor <- paste0(pData(hs_expt)[["clinic"]], "_",
                       etnia_names)
pData(hs_expt)[["clinic_etnia"]] <- as.factor(etnia_factor)
table(pData(hs_expt)[["clinic_etnia"]])
## 
##    cali_afrocol   cali_indigena    cali_mestiza  tumaco_afrocol tumaco_indigena 
##              15              33              19              86              29 
##  tumaco_mestiza 
##              28
pData(hs_expt)[["sex"]] <- "female"
male_idx <- pData(hs_expt)[["Sex"]] == 1
pData(hs_expt)[male_idx, "sex"] <- "male"
pData(hs_expt)[["sex"]] <- as.factor(pData(hs_expt)[["sex"]])
sex_factor <- paste0(pData(hs_expt)[["clinic"]], "_",
                     pData(hs_expt)[["sex"]])
pData(hs_expt)[["clinic_sex"]] <- as.factor(sex_factor)
table(pData(hs_expt)[["clinic_sex"]])
## 
##   cali_female     cali_male tumaco_female   tumaco_male 
##            12            55            25           118
pData(hs_expt)[["etnia_sex"]] <- paste0(pData(hs_expt)[["etnia"]], "_",
                                        pData(hs_expt)[["sex"]])
pData(hs_expt)[["etnia_sex"]] <- as.factor(pData(hs_expt)[["etnia_sex"]])
table(pData(hs_expt)[["etnia_sex"]])
## 
##  afrocol_female    afrocol_male indigena_female   indigena_male  mestiza_female 
##              22              79               6              56               9 
##    mestiza_male 
##              38
## Set a factor of samples which are visit 1 vs. 2/3.
v1_samples <- pData(hs_expt)[["visitnumber"]] == "1"
pData(hs_expt)[v1_samples, "visitbipart"] <- "v1"
pData(hs_expt)[!v1_samples, "visitbipart"] <- "vother"
table(pData(hs_expt)[["visitbipart"]])
## 
##     v1 vother 
##    100    110
pData(hs_expt)[["cell_visit_cf"]] <- paste0(pData(hs_expt)[["typeofcells"]], "_",
                                            pData(hs_expt)[["visitnumber"]], "_",
                                            pData(hs_expt)[["finaloutcome"]])

age_vector <- pData(hs_expt)[["Age"]]
pData(hs_expt)[["age_cat"]] <- make_quartile_factor(age_vector)

save(list = "hs_expt", file = glue("rda/tmrc3_hs_expt_all_sanitized_demographics-v{ver}.rda"))

6.5 Sanity check, clinical outcome vs. demographics

Check to make sure the demographics agrees with the metadata. I really want this block to return NULL upon completion.

two_columns <- pData(hs_expt)[, c("finaloutcome", "Therapeutic_Outcome_Final")]
undef_idx <- two_columns[[2]] == "undefined"
two_columns <- two_columns[!undef_idx, ]
two_columns[["rewritten"]] <- "undef"
cure_idx <- two_columns[[2]] == 0
two_columns[cure_idx, "rewritten"] <- "cure"
fail_idx <- two_columns[[2]] == 1
two_columns[fail_idx, "rewritten"] <- "failure"
lost_idx <- two_columns[[2]] == 2
two_columns[lost_idx, "rewritten"] <- "lost"
same_idx <- two_columns[["finaloutcome"]] == two_columns[["rewritten"]]
broken <- two_columns[!same_idx, ]
## I very much want the following line to evaluate to 0 rows.
broken
## [1] finaloutcome              Therapeutic_Outcome_Final
## [3] rewritten                
## <0 rows> (or 0-length row.names)

6.6 Summarize: Collect sample numbers before filtering

There are some metadata factors for which I think it will be nice to see the numbers before and after our filters. The following shows how many samples we have of the primary types before filtering.

dim(pData(hs_expt))
## [1] 210 163
table(pData(hs_expt)[["drug"]])
## 
##    antimony miltefosine 
##         202           8
table(pData(hs_expt)[["clinic"]])
## 
##   cali tumaco 
##     67    143
table(pData(hs_expt)[["finaloutcome"]])
## 
##    cure failure    lost 
##     130      64      16
table(pData(hs_expt)[["typeofcells"]])
## 
##      biopsy eosinophils   monocytes neutrophils 
##          21          45          73          71
table(pData(hs_expt)[["visitnumber"]])
## 
##   3   2   1 
##  54  56 100
summary(as.numeric(pData(hs_expt)[["Evolution_Time"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    4.00    6.00    8.25   12.00   21.00
summary(as.numeric(pData(hs_expt)[["Prescribed_Daily_Dose_Gluc"]]))
## Warning in summary(as.numeric(pData(hs_expt)[["Prescribed_Daily_Dose_Gluc"]])):
## NAs introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    13.0    14.0    18.0    17.2    20.0    20.0       8
summary(as.numeric(pData(hs_expt)[["V3_Vertical_Axis_Lesion"]]))
## Warning in summary(as.numeric(pData(hs_expt)[["V3_Vertical_Axis_Lesion"]])):
## NAs introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0     7.0    18.1    23.2    32.7    90.0      53
summary(as.numeric(pData(hs_expt)[["V3_Total_Area_Lesion"]]))
## Warning in summary(as.numeric(pData(hs_expt)[["V3_Total_Area_Lesion"]])): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##       0     222    1761    2889    4315   16965      53
summary(as.numeric(pData(hs_expt)[["V3_Horizontal_Axis_Lesion"]]))
## Warning in summary(as.numeric(pData(hs_expt)[["V3_Horizontal_Axis_Lesion"]])):
## NAs introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     3.6     9.8    28.0    28.7    41.6    80.1      53
table(pData(hs_expt)[["sex"]])
## 
## female   male 
##     37    173
table(pData(hs_expt)[["etnia"]])
## 
##  afrocol indigena  mestiza 
##      101       62       47
table(pData(hs_expt)[["Ethnicity"]])
## 
##   1   2   3 
## 101  62  47
summary(as.numeric(pData(hs_expt)[["Age"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    25.0    28.5    30.7    36.0    51.0
summary(pData(hs_expt)[["Weight"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    53.9    59.0    74.7    72.4    82.0   100.8
summary(pData(hs_expt)[["Height"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     145     160     166     167     174     183
table(pData(hs_expt)[["Therapeutic_Outcome_Final"]])
## 
##   0   1   2   3 
## 130  64  16   0
table(pData(hs_expt)[["finaloutcome"]])
## 
##    cure failure    lost 
##     130      64      16
unique(pData(hs_expt)[["Patient_ID"]])
##  [1] "SU1034" "SU1154" "SU1167" "SU1168" "SU1174" "SU1176" "SU1175" "SU2050"
##  [9] "SU2052" "SU2065" "SU1195" "SU1196" "SU1197" "SU2066" "SU1198" "SU2068"
## [17] "SU2071" "SU2072" "SU2073" "SU2159" "SU2162" "SU2161" "SU2164" "SU2167"
## [25] "SU2168" "SU2172" "SU2173" "SU2183" "SU2184" "SU2195" "SU2188" "SU2190"
## [33] "SU2194" "SU2201"
length(unique(pData(hs_expt)[["Patient_ID"]]))
## [1] 34

Get the sex of the unique patients.

unique_people <- unique(pData(hs_expt)[["Patient_ID"]])
unique_people
##  [1] "SU1034" "SU1154" "SU1167" "SU1168" "SU1174" "SU1176" "SU1175" "SU2050"
##  [9] "SU2052" "SU2065" "SU1195" "SU1196" "SU1197" "SU2066" "SU1198" "SU2068"
## [17] "SU2071" "SU2072" "SU2073" "SU2159" "SU2162" "SU2161" "SU2164" "SU2167"
## [25] "SU2168" "SU2172" "SU2173" "SU2183" "SU2184" "SU2195" "SU2188" "SU2190"
## [33] "SU2194" "SU2201"
length(unique_people)
## [1] 34
df <- pData(hs_expt)
people <- df[["Patient_ID"]]
first_indices <- order(people)[!duplicated(sort(people))]
table(df[first_indices, "sex"])
## 
## female   male 
##      7     27
table(df[first_indices, "finaloutcome"])
## 
##    cure failure    lost 
##      22      10       2

6.7 Define desired colors for the various subsets

There are lots of ways which we will categorize the data, here are some potential color choices for them.

color_choices <- list(
    "cf" = list(
      "cure" = "#998EC3",
      "failure" = "#F1A340"),
    "cflost" = list(
      "cure" = "#998EC3",
      "failure" = "#F1A340",
      "lost" = "#343434"),
    "type_visit" = list(
      "monocytes_v1" = "#DD1C77",
      "monocytes_v2" = "#C994C7",
      "monocytes_v3" = "#E7E1EF",
      "eosinophils_v1" = "#31A354",
      "eosinophils_v2" = "#ADDD8E",
      "eosinophils_v3" = "#F7FCD9",
      "neutrophils_v1" = "#3182BD",
      "neutrophils_v2" = "#9ECAE1",
      "neutrophils_v3" = "#DEEBF7",
      "biopsy_v1" = "#D95F0E"),
    "type" = list(
      "monocytes" = "#DD1C77",
      "eosinophils" = "#31A354",
      "neutrophils" = "#3182BD",
      "biopsy" = "#D95F0E"),
    "two_visit" = list(
      "first" = "#33EE33",
      "later" = "#023302"),
    "visit" = list(
      "v1" = "#CCCCCC",
      "v2" = "#666666",
      "v3" = "#111111"),
    "visit2" = list(
      "1" = "#CCCCCC",
      "2" = "#666666",
      "3" = "#111111"),
    "visitbi" = list(
      "v1" = "#BB0000",
      "vother" = "#0000BB"),
    "labs" = list(
      "Brazil" = "#FFC300",
      "Colombia" = "#525252"),
    "clinic" = list(
      "tumaco" = "#3182AA",
      "cali" = "#C994AA"),
    "clinic_cf" = list(
      "tumaco_cure" = "#7670B3",
      "tumaco_failure" = "#E7298A",
      "cali_cure" = "#1B9E77",
      "cali_failure" = "#D95F02"),
    "ethnicity" = list(
      "afrocol" = "#4293CE",
      "indigena" = "#BDBDBD",
      "mestiza" = "#FEB24C"),
    "clinic_etnia" = list(
      "cali_afrocol" = "#3182BD",
      "cali_indigena" = "#636363",
      "cali_mestiza" = "#F03B20",
      "tumaco_afrocol" = "#9ECAE1",
      "tumaco_indigena" = "#BDBDBD",
      "tumaco_mestiza" = "#FEB24C"),
    "sex" = list(
      "female" = "#3182BD",
      "male" = "#C994C7"),
    "clinic_sex" = list(
      "cali_female" = "#0000CC",
      "tumaco_female" = "#3182BD",
      "cali_male" = "#E7298A",
      "tumaco_male" = "#C994C7"),
    "cf_type" = list(
      "cure_biopsy" = "#D95F0E",
      "failure_biopsy" = "#FEC44F",
      "cure_monocytes" = "#DD1C77",
      "failure_monocytes" = "#C994C7",
      "cure_eosinophils" = "#31A354",
      "failure_eosinophils" = "#ADDD8E",
      "cure_neutrophils" = "#3182BD",
      "failure_neutrophils" = "#9ECAE1"),
    "parasite" = list(
      "notapplicable" = "#000000",
      "lvbraziliensis" = "#AA0000",
      "lvguyanensis" = "#660066",
      "lvpanamensis" = "#3160AC"))
data_structures <- c(data_structures, "color_choices")

7 Define the starting data

Given the starting point above, we will start extracting groups of samples of interest.

7.1 Set our initial coverage goal

The first set of samples removed from the data are those with too many missing genes.

7.2 Figure S2: Non-zero genes before sample filtering

all_nz <- plot_nonzero(hs_expt)
## The following samples have less than 12968.8 genes.
##  [1] "TMRC30010" "TMRC30140" "TMRC30280" "TMRC30284" "TMRC30050" "TMRC30056"
##  [7] "TMRC30052" "TMRC30058" "TMRC30031" "TMRC30038" "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
pp(file = "figures/S2_nonzero_all_samples.svg")
all_nz$plot
## Warning: ggrepel: 192 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
dev.off()
## png 
##   2
all_nz
## A non-zero genes plot of 210 samples.
## These samples have an average 45.18 CPM coverage and 14385 genes observed, ranging from 7647 to
## 16739.
## Warning: ggrepel: 194 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

7.2.1 Save CPM, all samples

We should save a cpm and rpkm copy of the raw data for every subset in order to make it easier for folks to work with WGCNA and other tools (STRING).

dir.create("cpm/3_Cali_and_Tumaco", recursive = TRUE)
dir.create("rpkm")
## Warning in dir.create("rpkm"): 'rpkm' already exists
cpm_data <- normalize_expt(hs_expt, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/3_Cali_and_Tumaco/all_samples-v{ver}.xlsx"))

rpkm_data <- normalize_expt(hs_expt, filter = TRUE, convert = "rpkm",
                            column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5168 low-count genes (14784 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/hs_expt_rpkm-v{ver}.csv"))

7.3 Subset: Filter out problematic samples

To my eyes, there are 3 or 4 samples which are likely candidates for removal. In addition, we will remove samples which were lost during the treatment and/or ones which were used in other experiments but included in the TMRC3 sample sheet (thus the ‘notapplicable’ or ‘null’).

I think this is stated elsewhere: variables prefixed with ‘tc’ are Tumaco and Cali; ‘t’ or ‘c’ correspond.

tc_nolost <- subset_expt(hs_expt, subset = "finaloutcome!='lost'")
## The samples excluded are: TMRC30009, TMRC30010, TMRC30015, TMRC30011, TMRC30012, TMRC30013, TMRC30025, TMRC30023, TMRC30033, TMRC30038, TMRC30036, TMRC30024, TMRC30034, TMRC30039, TMRC30040, TMRC30035.
## subset_expt(): There were 210, now there are 194 samples.
tc_nomilt <- subset_expt(tc_nolost, subset = "drug=='antimony'")
## The samples excluded are: TMRC30188, TMRC30189, TMRC30190, TMRC30242, TMRC30260, TMRC30262, TMRC30261, TMRC30263.
## subset_expt(): There were 194, now there are 186 samples.
plot_legend(tc_nomilt)
## The colors used in the expressionset are: #1B9E77, #D95F02.

nomilt_nonzero <- plot_nonzero(tc_nomilt, plot_labels = TRUE)
## The following samples have less than 12968.8 genes.
## [1] "TMRC30140" "TMRC30280" "TMRC30284" "TMRC30050" "TMRC30056" "TMRC30052"
## [7] "TMRC30058" "TMRC30031" "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
nomilt_nonzero
## A non-zero genes plot of 186 samples.
## These samples have an average 48.28 CPM coverage and 14418 genes observed, ranging from 9934 to
## 16739.
## Warning: ggrepel: 166 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

pp(file = "figures/figs2_nonzero.svg")
nomilt_nonzero
## A non-zero genes plot of 186 samples.
## These samples have an average 48.28 CPM coverage and 14418 genes observed, ranging from 9934 to
## 16739.
## Warning: ggrepel: 166 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
dev.off()
## png 
##   2
tc_valid <- subset_expt(tc_nomilt, nonzero = 11000) %>%
  set_expt_colors(colors = color_choices[["cf"]])
## The samples (and read coverage) removed when filtering 11000 non-zero genes are:
## TMRC30050 TMRC30052 
##    807589   3086380
## by number of genes.
## subset_expt(): There were 186, now there are 184 samples.
save(list = "tc_valid", file = glue("rda/tmrc3_tc_valid-v{ver}.rda"))
data_structures <- c(data_structures, "tc_valid")

8 Visualize the sample breakdown

clinic_type_outcome_sankey <- plot_meta_sankey(
  tc_valid, factors = c("clinic", "typeofcells", "finaloutcome"),
  drill_down = TRUE, color_choices = color_choices)
## Warning: attributes are not identical across measure variables; they will be
## dropped
clinic_type_outcome_sankey
## A sankey plot describing the metadata of 184 samples,
## including 24 out of 0 nodes and traversing metadata factors:
## .

clinic_ethnicity_outcome_sankey <- plot_meta_sankey(
  tc_valid, factors = c("clinic", "etnia", "finaloutcome"),
  drill_down = TRUE, color_choices = color_choices)
## Warning: attributes are not identical across measure variables; they will be
## dropped
clinic_ethnicity_outcome_sankey
## A sankey plot describing the metadata of 184 samples,
## including 17 out of 0 nodes and traversing metadata factors:
## .

clinic_sex_outcome_sankey <- plot_meta_sankey(
  tc_valid, factors = c("clinic", "sex", "finaloutcome"),
  drill_down = TRUE, color_choices = color_choices)
## Warning: attributes are not identical across measure variables; they will be
## dropped
clinic_sex_outcome_sankey
## A sankey plot describing the metadata of 184 samples,
## including 13 out of 0 nodes and traversing metadata factors:
## .

8.1 Figure XX + 1: Non-zero genes after sample filtering

The following plot is essentially identical to the previous with two exceptions:

  1. The samples with too few genes (11,000 currently) are gone.
  2. The samples are colored by cure(purple)/fail(yellow)
nz_post <- plot_nonzero(tc_valid)
## The following samples have less than 12968.8 genes.
## [1] "TMRC30140" "TMRC30280" "TMRC30284" "TMRC30056" "TMRC30058" "TMRC30031"
## [7] "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
nz_post
## A non-zero genes plot of 184 samples.
## These samples have an average 48.79 CPM coverage and 14466 genes observed, ranging from 11448 to
## 16739.
## Warning: ggrepel: 164 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

pp(file = "figures/figS2v2_post.svg")
nz_post
## A non-zero genes plot of 184 samples.
## These samples have an average 48.79 CPM coverage and 14466 genes observed, ranging from 11448 to
## 16739.
## Warning: ggrepel: 155 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
dev.off()
## png 
##   2

8.2 Summarize: Tally samples after filtering

We need to keep track of how many of each sample type is lost when we do our various filters. Thus I am repeating the same set of tallies. This will likely happen one more time, following the removal of samples which came from Cali.

table(pData(tc_valid)[["drug"]])
## 
## antimony 
##      184
table(pData(tc_valid)[["clinic"]])
## 
##   cali tumaco 
##     61    123
table(pData(tc_valid)[["finaloutcome"]])
## 
##    cure failure 
##     122      62
table(pData(tc_valid)[["typeofcells"]])
## 
##      biopsy eosinophils   monocytes neutrophils 
##          18          41          63          62
table(pData(tc_valid)[["visit"]])
## < table of extent 0 >
summary(as.numeric(pData(tc_valid)[["Evolution_Time"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    4.00    6.00    8.19   12.00   21.00
summary(as.numeric(pData(tc_valid)[["Prescribed_Daily_Dose_Gluc"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    13.0    14.8    19.0    17.5    20.0    20.0
summary(as.numeric(pData(tc_valid)[["V3_Vertical_Axis_Lesion"]]))
## Warning in summary(as.numeric(pData(tc_valid)[["V3_Vertical_Axis_Lesion"]])):
## NAs introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0     4.1    11.7    22.0    32.7    90.0      53
summary(as.numeric(pData(tc_valid)[["V3_Total_Area_Lesion"]]))
## Warning in summary(as.numeric(pData(tc_valid)[["V3_Total_Area_Lesion"]])): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##       0      56     507    2866    4315   16965      53
summary(as.numeric(pData(tc_valid)[["V3_Horizontal_Axis_Ulcer"]]))
## Warning in summary(as.numeric(pData(tc_valid)[["V3_Horizontal_Axis_Ulcer"]])):
## NAs introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0     0.0     0.0    11.4    16.9    49.7      53
table(pData(tc_valid)[["sex"]])
## 
## female   male 
##     28    156
table(pData(tc_valid)[["etnia"]])
## 
##  afrocol indigena  mestiza 
##       91       46       47
summary(as.numeric(pData(tc_valid)[["Age"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    25.0    28.5    30.7    36.0    51.0
summary(pData(tc_valid)[["Weight"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    53.9    61.4    77.0    73.8    83.3   100.8
summary(pData(tc_valid)[["Height"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     152     162     166     167     174     183
length(unique(pData(tc_valid)[["Patient_ID"]]))
## [1] 29

8.3 Extract the demographics from the remaining samples

When we perform the logistic/linear models examining variables in the demographics, we need to ensure that we are working with only the people who are included in the final dataset.

people_remaining <- unique(pData(tc_valid)[["Patient_ID"]])
demographics_filtered_idx <- hs_demographics[["Patient_ID"]] %in% people_remaining
demographics_filtered <- hs_demographics[demographics_filtered_idx, ]
data_structures <- c(data_structures, "demographics_filtered")

8.4 Split the data by cure/fail for some counting

We now have two datasets which are comprised of only the cure/fail samples. It is worth considering if there are ways we can leverage this separation.

tc_cure <- subset_expt(tc_valid, subset = "finaloutcome=='cure'")
## The samples excluded are: TMRC30178, TMRC30179, TMRC30221, TMRC30222, TMRC30223, TMRC30224, TMRC30017, TMRC30019, TMRC30071, TMRC30056, TMRC30105, TMRC30058, TMRC30094, TMRC30119, TMRC30122, TMRC30107, TMRC30096, TMRC30083, TMRC30115, TMRC30118, TMRC30121, TMRC30026, TMRC30048, TMRC30054, TMRC30046, TMRC30070, TMRC30049, TMRC30055, TMRC30047, TMRC30053, TMRC30068, TMRC30123, TMRC30072, TMRC30078, TMRC30116, TMRC30076, TMRC30088, TMRC30197, TMRC30199, TMRC30198, TMRC30201, TMRC30200, TMRC30203, TMRC30202, TMRC30205, TMRC30204, TMRC30177, TMRC30241, TMRC30237, TMRC30206, TMRC30207, TMRC30238, TMRC30074, TMRC30217, TMRC30208, TMRC30077, TMRC30219, TMRC30218, TMRC30079, TMRC30220, TMRC30264, TMRC30265.
## subset_expt(): There were 184, now there are 122 samples.
data_structures <- c(data_structures, "tc_cure")

table(pData(tc_cure)[["visitnumber"]])
## 
##  3  2  1 
## 32 33 57
tc_fail <- subset_expt(tc_valid, subset = "finaloutcome=='failure'")
## The samples excluded are: TMRC30156, TMRC30185, TMRC30186, TMRC30269, TMRC30148, TMRC30149, TMRC30253, TMRC30150, TMRC30140, TMRC30138, TMRC30176, TMRC30153, TMRC30151, TMRC30234, TMRC30235, TMRC30270, TMRC30225, TMRC30226, TMRC30227, TMRC30016, TMRC30228, TMRC30229, TMRC30230, TMRC30231, TMRC30232, TMRC30233, TMRC30018, TMRC30209, TMRC30210, TMRC30211, TMRC30212, TMRC30213, TMRC30216, TMRC30214, TMRC30215, TMRC30271, TMRC30273, TMRC30275, TMRC30272, TMRC30274, TMRC30276, TMRC30254, TMRC30255, TMRC30256, TMRC30277, TMRC30239, TMRC30240, TMRC30278, TMRC30279, TMRC30280, TMRC30257, TMRC30258, TMRC30281, TMRC30283, TMRC30284, TMRC30282, TMRC30285, TMRC30020, TMRC30113, TMRC30164, TMRC30080, TMRC30082, TMRC30103, TMRC30022, TMRC30169, TMRC30093, TMRC30029, TMRC30170, TMRC30032, TMRC30028, TMRC30180, TMRC30014, TMRC30196, TMRC30030, TMRC30021, TMRC30037, TMRC30031, TMRC30165, TMRC30027, TMRC30044, TMRC30194, TMRC30166, TMRC30195, TMRC30045, TMRC30191, TMRC30041, TMRC30171, TMRC30192, TMRC30139, TMRC30042, TMRC30158, TMRC30132, TMRC30160, TMRC30157, TMRC30183, TMRC30167, TMRC30181, TMRC30133, TMRC30043, TMRC30184, TMRC30159, TMRC30129, TMRC30172, TMRC30134, TMRC30174, TMRC30137, TMRC30161, TMRC30142, TMRC30175, TMRC30145, TMRC30143, TMRC30168, TMRC30146, TMRC30182, TMRC30152, TMRC30155, TMRC30154, TMRC30136, TMRC30135, TMRC30173, TMRC30144, TMRC30147.
## subset_expt(): There were 184, now there are 62 samples.
data_structures <- c(data_structures, "tc_fail")

table(pData(tc_fail)[["visitnumber"]])
## 
##  3  2  1 
## 19 17 26

10 Tumaco and Cali data structures

All data structures which start with the prefix ‘tc’ are Tumaco and Cali. Those with ‘t’ are only Tumaco, ‘c’ are only Cali.

tc_clinical <- tc_valid %>%
  set_expt_conditions(fact = "finaloutcome", colors = color_choices[["cf"]]) %>%
  set_expt_batches(fact = "typeofcells")
## The numbers of samples by condition are:
## 
##    cure failure 
##     122      62
## The number of samples by batch are:
## 
##      biopsy eosinophils   monocytes neutrophils 
##          18          41          63          62
save(list = "tc_clinical", file = glue("rda/tmrc3_tc_clinical-v{ver}.rda"))
data_structures <- c(data_structures, "tc_clinical")

10.1 Subset: Monocytes by clinic

For some of the following data structures, we will be concatenating various metadata factors of interest, usually the final outcome and one other metadatum.

10.2 Subset Monocytes

In the following block I am writing out the Monocytes in a couple different ways, once with the clinical outcome as the primary factor, and again using the concatenation of clinic/outcome.

clinic_cf <- paste0(pData(tc_monocytes)[["clinic"]], "_",
                    pData(tc_monocytes)[["finaloutcome"]])
table(clinic_cf)
## clinic_cf
##      cali_cure   cali_failure    tumaco_cure tumaco_failure 
##             18              3             21             21
tc_monocytes <- set_expt_conditions(
  tc_monocytes, fact = clinic_cf, colors = color_choices[["clinic_cf"]]) %>%
  set_expt_batches(fact = "visitnumber")
## The numbers of samples by condition are:
## 
##      cali_cure   cali_failure    tumaco_cure tumaco_failure 
##             18              3             21             21
## The number of samples by batch are:
## 
##  3  2  1 
## 19 18 26
save(list = "tc_monocytes", file = glue("rda/tmrc3_tc_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tc_monocytes")

tcv1_monocytes <- subset_expt(tc_monocytes, subset = "visitnumber=='1'")
## The samples excluded are: TMRC30178, TMRC30223, TMRC30150, TMRC30176, TMRC30228, TMRC30231, TMRC30212, TMRC30214, TMRC30274, TMRC30255, TMRC30279, TMRC30056, TMRC30105, TMRC30082, TMRC30169, TMRC30096, TMRC30115, TMRC30030, TMRC30037, TMRC30194, TMRC30049, TMRC30055, TMRC30171, TMRC30139, TMRC30157, TMRC30183, TMRC30072, TMRC30078, TMRC30129, TMRC30172, TMRC30142, TMRC30145, TMRC30199, TMRC30201, TMRC30205, TMRC30217, TMRC30219.
## subset_expt(): There were 63, now there are 26 samples.
save(list = "tcv1_monocytes", file = glue("rda/tmrc3_tcv1_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tcv1_monocytes")
tcv2_monocytes <- subset_expt(tc_monocytes, subset = "visitnumber=='2'")
## The samples excluded are: TMRC30185, TMRC30178, TMRC30221, TMRC30148, TMRC30176, TMRC30234, TMRC30225, TMRC30231, TMRC30209, TMRC30214, TMRC30273, TMRC30255, TMRC30239, TMRC30279, TMRC30258, TMRC30283, TMRC30105, TMRC30080, TMRC30169, TMRC30107, TMRC30115, TMRC30014, TMRC30037, TMRC30165, TMRC30046, TMRC30055, TMRC30191, TMRC30041, TMRC30139, TMRC30132, TMRC30183, TMRC30123, TMRC30078, TMRC30184, TMRC30172, TMRC30174, TMRC30145, TMRC30197, TMRC30201, TMRC30203, TMRC30205, TMRC30237, TMRC30207, TMRC30219, TMRC30264.
## subset_expt(): There were 63, now there are 18 samples.
save(list = "tcv2_monocytes", file = glue("rda/tmrc3_tcv2_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tcv2_monocytes")
tcv3_monocytes <- subset_expt(tc_monocytes, subset = "visitnumber=='3'")
## The samples excluded are: TMRC30185, TMRC30221, TMRC30223, TMRC30148, TMRC30150, TMRC30234, TMRC30225, TMRC30228, TMRC30209, TMRC30212, TMRC30273, TMRC30274, TMRC30239, TMRC30258, TMRC30283, TMRC30056, TMRC30080, TMRC30082, TMRC30107, TMRC30096, TMRC30014, TMRC30030, TMRC30165, TMRC30194, TMRC30046, TMRC30049, TMRC30191, TMRC30041, TMRC30171, TMRC30132, TMRC30157, TMRC30123, TMRC30072, TMRC30184, TMRC30129, TMRC30174, TMRC30142, TMRC30197, TMRC30199, TMRC30203, TMRC30237, TMRC30207, TMRC30217, TMRC30264.
## subset_expt(): There were 63, now there are 19 samples.
save(list = "tcv3_monocytes", file = glue("rda/tmrc3_tcv3_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tcv3_monocytes")

10.3 Subset: Biopsies

Followed by the Biopsy samples…

tc_clinical_nobiop <- subset_expt(tc_clinical, subset = "typeofcells!='biopsy'") %>%
  set_expt_colors(color_choices[["cf"]])
## The samples excluded are: TMRC30156, TMRC30269, TMRC30253, TMRC30270, TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30020, TMRC30022, TMRC30026, TMRC30044, TMRC30045, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241.
## subset_expt(): There were 184, now there are 166 samples.
save(list = "tc_clinical_nobiop", file = glue("rda/tmrc3_tc_clinical_nobiop-v{ver}.rda"))
data_structures <- c(data_structures, "tc_clinical_nobiop")

tc_biopsies <- tc_valid %>%
  set_expt_conditions(fact = "clinic") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells=='biopsy'")
## The numbers of samples by condition are:
## 
##   cali tumaco 
##     61    123
## The number of samples by batch are:
## 
##    cure failure 
##     122      62
## The samples excluded are: TMRC30185, TMRC30186, TMRC30178, TMRC30179, TMRC30221, TMRC30222, TMRC30223, TMRC30224, TMRC30148, TMRC30149, TMRC30150, TMRC30140, TMRC30138, TMRC30176, TMRC30153, TMRC30151, TMRC30234, TMRC30235, TMRC30225, TMRC30226, TMRC30227, TMRC30228, TMRC30229, TMRC30230, TMRC30231, TMRC30232, TMRC30233, TMRC30209, TMRC30210, TMRC30211, TMRC30212, TMRC30213, TMRC30216, TMRC30214, TMRC30215, TMRC30271, TMRC30273, TMRC30275, TMRC30272, TMRC30274, TMRC30276, TMRC30254, TMRC30255, TMRC30256, TMRC30277, TMRC30239, TMRC30240, TMRC30278, TMRC30279, TMRC30280, TMRC30257, TMRC30258, TMRC30281, TMRC30283, TMRC30284, TMRC30282, TMRC30285, TMRC30071, TMRC30056, TMRC30113, TMRC30105, TMRC30058, TMRC30164, TMRC30080, TMRC30094, TMRC30119, TMRC30082, TMRC30103, TMRC30122, TMRC30169, TMRC30093, TMRC30029, TMRC30107, TMRC30170, TMRC30032, TMRC30096, TMRC30083, TMRC30028, TMRC30115, TMRC30118, TMRC30180, TMRC30014, TMRC30121, TMRC30196, TMRC30030, TMRC30021, TMRC30037, TMRC30031, TMRC30165, TMRC30027, TMRC30194, TMRC30166, TMRC30195, TMRC30048, TMRC30054, TMRC30046, TMRC30070, TMRC30049, TMRC30055, TMRC30047, TMRC30191, TMRC30053, TMRC30041, TMRC30068, TMRC30171, TMRC30192, TMRC30139, TMRC30042, TMRC30158, TMRC30132, TMRC30160, TMRC30157, TMRC30183, TMRC30167, TMRC30123, TMRC30181, TMRC30072, TMRC30133, TMRC30043, TMRC30078, TMRC30116, TMRC30184, TMRC30076, TMRC30159, TMRC30129, TMRC30088, TMRC30172, TMRC30134, TMRC30174, TMRC30137, TMRC30161, TMRC30142, TMRC30175, TMRC30145, TMRC30143, TMRC30168, TMRC30197, TMRC30146, TMRC30182, TMRC30199, TMRC30198, TMRC30201, TMRC30200, TMRC30203, TMRC30202, TMRC30205, TMRC30204, TMRC30237, TMRC30206, TMRC30136, TMRC30207, TMRC30238, TMRC30074, TMRC30217, TMRC30208, TMRC30077, TMRC30219, TMRC30218, TMRC30079, TMRC30220, TMRC30135, TMRC30173, TMRC30264, TMRC30144, TMRC30147, TMRC30265.
## subset_expt(): There were 184, now there are 18 samples.
tc_cf <- paste0(pData(tc_biopsies)[["clinic"]], "_",
                pData(tc_biopsies)[["finaloutcome"]])
table(tc_cf)
## tc_cf
##      cali_cure    tumaco_cure tumaco_failure 
##              4              9              5
tc_biopsies <- set_expt_conditions(
  tc_biopsies, fact = tc_cf, colors = color_choices[["clinic_cf"]]) %>%
  set_expt_batches(fact = "visitnumber")
## The numbers of samples by condition are:
## 
##      cali_cure    tumaco_cure tumaco_failure 
##              4              9              5
## Warning in set_expt_colors(new_expt, colors = colors): Colors for the following
## categories are not being used: cali_failure.
## The number of samples by batch are:
## 
##  1 
## 18
save(list = "tc_biopsies", file = glue("rda/tmrc3_tc_biopsies-v{ver}.rda"))
data_structures <- c(data_structures, "tc_biopsies")

10.4 Subset: Eosinophils

… and the Eosinophils. These are noteworthy because they have fewer fails than some other cohorts.

clinic_cf <- paste0(pData(tc_eosinophils)[["clinic"]], "_",
                    pData(tc_eosinophils)[["finaloutcome"]])
table(clinic_cf)
## clinic_cf
##      cali_cure    tumaco_cure tumaco_failure 
##             15             17              9
tc_eosinophils <- set_expt_conditions(
  tc_eosinophils, fact = clinic_cf, colors = color_choices[["clinic_cf"]]) %>%
  set_expt_batches(fact = "visitnumber")
## The numbers of samples by condition are:
## 
##      cali_cure    tumaco_cure tumaco_failure 
##             15             17              9
## Warning in set_expt_colors(new_expt, colors = colors): Colors for the following
## categories are not being used: cali_failure.
## The number of samples by batch are:
## 
##  3  2  1 
## 13 14 14
save(list = "tc_eosinophils", file = glue("rda/tmrc3_tc_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tc_eosinophils")

tcv1_eosinophils <- subset_expt(tc_eosinophils, subset = "visitnumber=='1'")
## The samples excluded are: TMRC30151, TMRC30230, TMRC30233, TMRC30216, TMRC30272, TMRC30254, TMRC30277, TMRC30278, TMRC30282, TMRC30113, TMRC30164, TMRC30119, TMRC30122, TMRC30032, TMRC30028, TMRC30196, TMRC30054, TMRC30070, TMRC30159, TMRC30161, TMRC30182, TMRC30136, TMRC30077, TMRC30079, TMRC30173, TMRC30144, TMRC30147.
## subset_expt(): There were 41, now there are 14 samples.
save(list = "tcv1_eosinophils", file = glue("rda/tmrc3_tcv1_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv1_eosinophils")
tcv2_eosinophils <- subset_expt(tc_eosinophils, subset = "visitnumber=='2'")
## The samples excluded are: TMRC30138, TMRC30227, TMRC30233, TMRC30211, TMRC30216, TMRC30271, TMRC30254, TMRC30278, TMRC30257, TMRC30281, TMRC30071, TMRC30164, TMRC30122, TMRC30029, TMRC30028, TMRC30180, TMRC30048, TMRC30070, TMRC30043, TMRC30161, TMRC30168, TMRC30136, TMRC30074, TMRC30079, TMRC30135, TMRC30173, TMRC30147.
## subset_expt(): There were 41, now there are 14 samples.
save(list = "tcv2_eosinophils", file = glue("rda/tmrc3_tcv2_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv2_eosinophils")
tcv3_eosinophils <- subset_expt(tc_eosinophils, subset = "visitnumber=='3'")
## The samples excluded are: TMRC30138, TMRC30151, TMRC30227, TMRC30230, TMRC30211, TMRC30271, TMRC30272, TMRC30277, TMRC30257, TMRC30281, TMRC30282, TMRC30071, TMRC30113, TMRC30119, TMRC30029, TMRC30032, TMRC30180, TMRC30196, TMRC30048, TMRC30054, TMRC30043, TMRC30159, TMRC30168, TMRC30182, TMRC30074, TMRC30077, TMRC30135, TMRC30144.
## subset_expt(): There were 41, now there are 13 samples.
save(list = "tcv3_eosinophils", file = glue("rda/tmrc3_tcv3_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv3_eosinophils")

10.5 Subset: Neutrophils by clinic

Followed by the Neutrophils…

clinic_cf <- paste0(pData(tc_neutrophils)[["clinic"]], "_",
                    pData(tc_neutrophils)[["finaloutcome"]])
table(clinic_cf)
## clinic_cf
##      cali_cure   cali_failure    tumaco_cure tumaco_failure 
##             18              3             20             21
tc_neutrophils <- set_expt_conditions(
  tc_neutrophils, fact = clinic_cf, colors = color_choices[["clinic_cf"]]) %>%
  set_expt_batches(fact = "visitnumber")
## The numbers of samples by condition are:
## 
##      cali_cure   cali_failure    tumaco_cure tumaco_failure 
##             18              3             20             21
## The number of samples by batch are:
## 
##  3  2  1 
## 19 18 25
save(list = "tc_neutrophils", file = glue("rda/tmrc3_tc_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tc_neutrophils")

tcv1_neutrophils <- subset_expt(tc_neutrophils, subset = "visitnumber=='1'")
## The samples excluded are: TMRC30179, TMRC30224, TMRC30140, TMRC30153, TMRC30229, TMRC30232, TMRC30213, TMRC30215, TMRC30276, TMRC30256, TMRC30280, TMRC30285, TMRC30058, TMRC30094, TMRC30093, TMRC30170, TMRC30118, TMRC30121, TMRC30031, TMRC30027, TMRC30195, TMRC30053, TMRC30068, TMRC30158, TMRC30160, TMRC30181, TMRC30133, TMRC30076, TMRC30088, TMRC30137, TMRC30143, TMRC30146, TMRC30200, TMRC30202, TMRC30206, TMRC30218, TMRC30220.
## subset_expt(): There were 62, now there are 25 samples.
save(list = "tcv1_neutrophils", file = glue("rda/tmrc3_tcv1_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv1_neutrophils")
tcv2_neutrophils <- subset_expt(tc_neutrophils, subset = "visitnumber=='2'")
## The samples excluded are: TMRC30186, TMRC30179, TMRC30222, TMRC30149, TMRC30153, TMRC30235, TMRC30226, TMRC30232, TMRC30210, TMRC30215, TMRC30275, TMRC30256, TMRC30240, TMRC30280, TMRC30284, TMRC30285, TMRC30094, TMRC30103, TMRC30170, TMRC30083, TMRC30121, TMRC30021, TMRC30027, TMRC30166, TMRC30047, TMRC30068, TMRC30192, TMRC30042, TMRC30160, TMRC30167, TMRC30133, TMRC30116, TMRC30088, TMRC30134, TMRC30175, TMRC30146, TMRC30198, TMRC30202, TMRC30204, TMRC30206, TMRC30238, TMRC30208, TMRC30220, TMRC30265.
## subset_expt(): There were 62, now there are 18 samples.
save(list = "tcv2_neutrophils", file = glue("rda/tmrc3_tcv2_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv2_neutrophils")
tcv3_neutrophils <- subset_expt(tc_neutrophils, subset = "visitnumber=='3'")
## The samples excluded are: TMRC30186, TMRC30222, TMRC30224, TMRC30149, TMRC30140, TMRC30235, TMRC30226, TMRC30229, TMRC30210, TMRC30213, TMRC30275, TMRC30276, TMRC30240, TMRC30284, TMRC30058, TMRC30103, TMRC30093, TMRC30083, TMRC30118, TMRC30021, TMRC30031, TMRC30166, TMRC30195, TMRC30047, TMRC30053, TMRC30192, TMRC30042, TMRC30158, TMRC30167, TMRC30181, TMRC30116, TMRC30076, TMRC30134, TMRC30137, TMRC30175, TMRC30143, TMRC30198, TMRC30200, TMRC30204, TMRC30238, TMRC30208, TMRC30218, TMRC30265.
## subset_expt(): There were 62, now there are 19 samples.
save(list = "tcv3_neutrophils", file = glue("rda/tmrc3_tcv3_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv3_neutrophils")

10.6 By sex

tc_sex <- set_expt_conditions(tc_valid, fact = "sex", colors = color_choices[["sex"]])
## The numbers of samples by condition are:
## 
## female   male 
##     28    156
save(list = "tc_sex", file = glue("rda/tmrc3_tc_sex-v{ver}.rda"))
data_structures <- c(data_structures, "tc_sex")

11 Dataset: Only Tumaco samples

Our recent discussions have settled one big question regarding which samples to use: We will limit our analyses to only those samples from Tumaco.

The following block will therefore set that group as our default for future analyses. We will essentially repeat all of the above sample separations for the Tumaco-only cohort.

11.1 All cell types

t_clinical <- tc_clinical %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30156, TMRC30185, TMRC30186, TMRC30178, TMRC30179, TMRC30221, TMRC30222, TMRC30223, TMRC30224, TMRC30269, TMRC30148, TMRC30149, TMRC30253, TMRC30150, TMRC30140, TMRC30138, TMRC30176, TMRC30153, TMRC30151, TMRC30234, TMRC30235, TMRC30270, TMRC30225, TMRC30226, TMRC30227, TMRC30228, TMRC30229, TMRC30230, TMRC30231, TMRC30232, TMRC30233, TMRC30209, TMRC30210, TMRC30211, TMRC30212, TMRC30213, TMRC30216, TMRC30214, TMRC30215, TMRC30271, TMRC30273, TMRC30275, TMRC30272, TMRC30274, TMRC30276, TMRC30254, TMRC30255, TMRC30256, TMRC30277, TMRC30239, TMRC30240, TMRC30278, TMRC30279, TMRC30280, TMRC30257, TMRC30258, TMRC30281, TMRC30283, TMRC30284, TMRC30282, TMRC30285.
## subset_expt(): There were 184, now there are 123 samples.
save(list = "t_clinical", file = glue("rda/tmrc3_t_clinical-v{ver}.rda"))
data_structures <- c(data_structures, "t_clinical")

cpm_data <- normalize_expt(t_clinical, convert = "cpm")
t_clinical_cpm_variance <- variance_expt(cpm_data)
## Add variance by gene for all samples excluding biopsies (I assume also excluding Cali).
## This is intended to address a query from Maria Adelaida on 20230111

11.1.1 Write out the Tumaco Clinical with variance

written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_clinical-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_clinical, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 5796 low-count genes (14156 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("rpkm/t_clinical-v{ver}.csv"))
cpm_data <- normalize_expt(t_clinical, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 5796 low-count genes (14156 remaining).
## Setting 17331 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_clinical_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5796 low-count genes (14156 remaining).
## Setting 9184 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_clinical_sva-v{ver}.csv"))

12 Perform write_expt on the Tumaco clinical samples

written_expt <- write_expt(
    t_clinical,
    excel = glue("excel/t_clinical-v{ver}.xlsx"))
## Writing the first sheet, containing a legend and some summary data.
## The following samples have less than 12968.8 genes.
## [1] "TMRC30056" "TMRC30058" "TMRC30031" "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## 646953 entries are 0.  We are on a log scale, adding 1 to the data.
## 
## Naively calculating coefficient of variation/dispersion with respect to condition.
## 
## Finished calculating dispersion estimates.
## 
## `geom_smooth()` using formula = 'y ~ x'
## Removing 5796 low-count genes (14156 remaining).
## 
## transform_counts: Found 126745 values equal to 0, adding 1 to the matrix.
## 
## `geom_smooth()` using formula = 'y ~ x'

12.1 Without biopsies

dir.create("cpm/4_Tumaco", recursive = TRUE)
## Warning in dir.create("cpm/4_Tumaco", recursive = TRUE): 'cpm/4_Tumaco' already
## exists
t_clinical_nobiop <- subset_expt(t_clinical, subset = "typeofcells!='biopsy'")
## The samples excluded are: TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30020, TMRC30022, TMRC30026, TMRC30044, TMRC30045, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241.
## subset_expt(): There were 123, now there are 109 samples.
save(list = "t_clinical_nobiop", file = glue("rda/tmrc3_t_clinical_nobiop-v{ver}.rda"))
data_structures <- c(data_structures, "t_clinical_nobiop")

cpm_data <- normalize_expt(t_clinical_nobiop, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_clinical_nobiop-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5796 low-count genes (14156 remaining).
## Setting 9184 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_clinical_sva-v{ver}.csv"))

cpm_data <- normalize_expt(t_clinical_nobiop, convert = "cpm",
                           filter = TRUE, batch = "svaseq")
## Removing 8042 low-count genes (11910 remaining).
## Setting 9605 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_clinical_nobiop_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_clinical_nobiop, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8042 low-count genes (11910 remaining).
## Setting 1841 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_clinical_nobiop_sva-v{ver}.csv"))

12.1.1 Pull out the top-n most variant genes

I added a few columns to the gene annotations reflecting the variance/stdev/mean expression of each gene. This really highlights the extraordinary degree to which genes are changing in the data…

top_expt <- normalize_expt(t_clinical_cpm_variance, filter = TRUE) %>%
  variance_expt()
## Removing 5476 low-count genes (14476 remaining).
top_fd <- fData(top_expt)
top_ex <- exprs(top_expt)
idx <- order(top_fd[["exprs_gene_stdev"]], decreasing = TRUE)
top_df <- top_fd[idx, ]
written <- write_xlsx(
    data = head(top_fd, n = 100),
    excel = glue("excel/t_clinical_cpm_stdev_top100-v{ver}.xlsx"))

bottom_expt <- normalize_expt(t_clinical_cpm_variance, filter = "simple", threshold = 500) %>%
  variance_expt()
## This function generally expects the threshold argument to be used with 'thresh'.
## Removing 10013 low-count genes (9939 remaining).
bottom_fd <- fData(bottom_expt)
bottom_ex <- exprs(bottom_expt)
idx <- order(bottom_fd[["exprs_gene_stdev"]])
bottom <- bottom_fd[idx, ]
written <- write_xlsx(
    data = head(bottom_fd, n = 100),
    excel = glue("excel/t_clinical_cpm_stdev_bottom100-v{ver}.xlsx"))

12.2 Summarize: Collect Tumaco sample numbers.

At least in theory, everything which follows will be using the above ‘clinical’ data structure. Thus, let us count it up and get a sense of what we will work with.

table(pData(t_clinical)[["drug"]])
## 
## antimony 
##      123
table(pData(t_clinical)[["clinic"]])
## 
## tumaco 
##    123
table(pData(t_clinical)[["finaloutcome"]])
## 
##    cure failure 
##      67      56
table(pData(t_clinical)[["typeofcells"]])
## 
##      biopsy eosinophils   monocytes neutrophils 
##          14          26          42          41
table(pData(t_clinical)[["visitnumber"]])
## 
##  3  2  1 
## 34 35 54
summary(pData(t_clinical)[["Evolution_Time"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    4.00    4.00    7.03    8.00   21.00
summary(pData(t_clinical)[["Prescribed_Daily_Dose_Gluc"]])
##    Length     Class      Mode 
##       123 character character
summary(pData(t_clinical)[["V3_Vertical_Axis_Lesion"]])
##    Length     Class      Mode 
##       123 character character
summary(pData(t_clinical)[["V3_Total_Area_Lesion"]])
##    Length     Class      Mode 
##       123 character character
summary(pData(t_clinical)[["V3_Horizontal_Axis_Ulcer"]])
##    Length     Class      Mode 
##       123 character character
table(pData(t_clinical)[["Sex"]])
## 
##   1   2 
## 101  22
table(pData(t_clinical)[["Ethnicity"]])
## 
##  1  2  3 
## 76 19 28
summary(pData(t_clinical)[["Age"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    23.0    25.0    28.5    34.0    51.0
summary(pData(t_clinical)[["Weight"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    53.9    58.8    69.4    71.6    83.3   100.8
table(pData(t_clinical)[["Height"]])
## 
## 152 154 158 159 163 164 165 166 172 173 174 176 177 182 183 
##   1  10  15   2   9  15  12  10  10   4   8   1   7   9  10
length(unique(pData(t_clinical)[["Patient_ID"]]))
## [1] 19
only_cure <- pData(t_clinical)[["finaloutcome"]] == "cure"
c_meta <- pData(t_clinical)[only_cure, ]
length(unique(c_meta[["Patient_ID"]]))
## [1] 10
only_fail <- pData(t_clinical)[["finaloutcome"]] == "failure"
f_meta <- pData(t_clinical)[only_fail, ]
length(unique(f_meta[["Patient_ID"]]))
## [1] 9

12.3 Split the data by cure/fail for some counting

t_cure <- subset_expt(t_clinical, subset = "finaloutcome=='cure'")
## The samples excluded are: TMRC30017, TMRC30019, TMRC30071, TMRC30056, TMRC30105, TMRC30058, TMRC30094, TMRC30119, TMRC30122, TMRC30107, TMRC30096, TMRC30083, TMRC30115, TMRC30118, TMRC30121, TMRC30026, TMRC30048, TMRC30054, TMRC30046, TMRC30070, TMRC30049, TMRC30055, TMRC30047, TMRC30053, TMRC30068, TMRC30123, TMRC30072, TMRC30078, TMRC30116, TMRC30076, TMRC30088, TMRC30197, TMRC30199, TMRC30198, TMRC30201, TMRC30200, TMRC30203, TMRC30202, TMRC30205, TMRC30204, TMRC30177, TMRC30241, TMRC30237, TMRC30206, TMRC30207, TMRC30238, TMRC30074, TMRC30217, TMRC30208, TMRC30077, TMRC30219, TMRC30218, TMRC30079, TMRC30220, TMRC30264, TMRC30265.
## subset_expt(): There were 123, now there are 67 samples.
table(pData(t_cure)$visitnumber)
## 
##  3  2  1 
## 17 20 30
t_fail <- subset_expt(t_clinical, subset = "finaloutcome=='failure'")
## The samples excluded are: TMRC30016, TMRC30018, TMRC30020, TMRC30113, TMRC30164, TMRC30080, TMRC30082, TMRC30103, TMRC30022, TMRC30169, TMRC30093, TMRC30029, TMRC30170, TMRC30032, TMRC30028, TMRC30180, TMRC30014, TMRC30196, TMRC30030, TMRC30021, TMRC30037, TMRC30031, TMRC30165, TMRC30027, TMRC30044, TMRC30194, TMRC30166, TMRC30195, TMRC30045, TMRC30191, TMRC30041, TMRC30171, TMRC30192, TMRC30139, TMRC30042, TMRC30158, TMRC30132, TMRC30160, TMRC30157, TMRC30183, TMRC30167, TMRC30181, TMRC30133, TMRC30043, TMRC30184, TMRC30159, TMRC30129, TMRC30172, TMRC30134, TMRC30174, TMRC30137, TMRC30161, TMRC30142, TMRC30175, TMRC30145, TMRC30143, TMRC30168, TMRC30146, TMRC30182, TMRC30152, TMRC30155, TMRC30154, TMRC30136, TMRC30135, TMRC30173, TMRC30144, TMRC30147.
## subset_expt(): There were 123, now there are 56 samples.
table(pData(t_fail)$visitnumber)
## 
##  3  2  1 
## 17 15 24

12.4 Subset: Create Tumaco-only and cell-type specific data

I previously made a bunch of data subsets by visit, cell type, etc. So let us overwrite them all with versions which contain only the Tumaco samples.

12.4.1 Tumaco biopsies

The is a copy of the cell type extractions above, except we lead off with the removal of the Cali samples.

t_biopsies <- tc_biopsies %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30156, TMRC30269, TMRC30253, TMRC30270.
## subset_expt(): There were 18, now there are 14 samples.
save(list = "t_biopsies", file = glue("rda/tmrc3_t_biopsies-v{ver}.rda"))
data_structures <- c(data_structures, "t_biopsies")

cpm_data <- normalize_expt(t_biopsies, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_biopsies-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_biopsies, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 6439 low-count genes (13513 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_biopsies-v{ver}.csv"))

cpm_data <- normalize_expt(t_biopsies, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 6439 low-count genes (13513 remaining).
## Setting 146 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_biopsies_sva-v{ver}.xlsx"))

12.4.2 Tumaco Eosinophils

t_eosinophils <- tc_eosinophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30138, TMRC30151, TMRC30227, TMRC30230, TMRC30233, TMRC30211, TMRC30216, TMRC30271, TMRC30272, TMRC30254, TMRC30277, TMRC30278, TMRC30257, TMRC30281, TMRC30282.
## subset_expt(): There were 41, now there are 26 samples.
save(list = "t_eosinophils", file = glue("rda/tmrc3_t_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "t_eosinophils")

cpm_data <- normalize_expt(t_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_eosinophils-v{ver}.xlsx"))
cpm_data <- normalize_expt(t_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9420 low-count genes (10532 remaining).
## Setting 327 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_eosinophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9420 low-count genes (10532 remaining).
## Setting 106 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_eosinophils_sva-v{ver}.csv"))

12.4.3 Tumaco subsets monocytes

t_monocytes <- tc_monocytes %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30185, TMRC30178, TMRC30221, TMRC30223, TMRC30148, TMRC30150, TMRC30176, TMRC30234, TMRC30225, TMRC30228, TMRC30231, TMRC30209, TMRC30212, TMRC30214, TMRC30273, TMRC30274, TMRC30255, TMRC30239, TMRC30279, TMRC30258, TMRC30283.
## subset_expt(): There were 63, now there are 42 samples.
save(list = "t_monocytes", file = glue("rda/tmrc3_t_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "t_monocytes")

cpm_data <- normalize_expt(t_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_monocytes-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9090 low-count genes (10862 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(t_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9090 low-count genes (10862 remaining).
## Setting 736 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_monocytes_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9090 low-count genes (10862 remaining).
## Setting 295 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_monocytes_sva-v{ver}.csv"))

12.4.4 Tumaco subsets neutrophils

t_neutrophils <- tc_neutrophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30186, TMRC30179, TMRC30222, TMRC30224, TMRC30149, TMRC30140, TMRC30153, TMRC30235, TMRC30226, TMRC30229, TMRC30232, TMRC30210, TMRC30213, TMRC30215, TMRC30275, TMRC30276, TMRC30256, TMRC30240, TMRC30280, TMRC30284, TMRC30285.
## subset_expt(): There were 62, now there are 41 samples.
save(list = "t_neutrophils", file = glue("rda/tmrc3_t_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "t_neutrophils")

cpm_data <- normalize_expt(t_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_neutrophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 10851 low-count genes (9101 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("rpkm/t_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(t_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 10851 low-count genes (9101 remaining).
## Setting 754 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_neutrophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(t_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 10851 low-count genes (9101 remaining).
## Setting 214 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/t_neutrophils_sva-v{ver}.csv"))

12.4.5 Tumaco Visit 1 samples

tv1_samples <- tcv1_samples %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30156, TMRC30185, TMRC30186, TMRC30221, TMRC30222, TMRC30269, TMRC30148, TMRC30149, TMRC30253, TMRC30138, TMRC30234, TMRC30235, TMRC30270, TMRC30225, TMRC30226, TMRC30227, TMRC30209, TMRC30210, TMRC30211, TMRC30271, TMRC30273, TMRC30275, TMRC30239, TMRC30240, TMRC30257, TMRC30258, TMRC30281, TMRC30283, TMRC30284.
## subset_expt(): There were 83, now there are 54 samples.
save(list = "tv1_samples", file = glue("rda/tmrc3_tv1_samples-v{ver}.rda"))
data_structures <- c(data_structures, "tv1_samples")

cpm_data <- normalize_expt(tv1_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_samples-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv1_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 5929 low-count genes (14023 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_samples-v{ver}.csv"))
cpm_data <- normalize_expt(tv1_samples, convert="cpm", filter=TRUE, batch="svaseq")
## Removing 5929 low-count genes (14023 remaining).
## Setting 7655 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_samples_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv1_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5929 low-count genes (14023 remaining).
## Setting 2552 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_samples_sva-v{ver}.csv"))

12.4.6 Tumaco Visit 2 samples

tv2_samples <- tcv2_samples %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30223, TMRC30224, TMRC30150, TMRC30140, TMRC30151, TMRC30228, TMRC30229, TMRC30230, TMRC30212, TMRC30213, TMRC30272, TMRC30274, TMRC30276, TMRC30277, TMRC30282.
## subset_expt(): There were 50, now there are 35 samples.
save(list = "tv2_samples", file = glue("rda/tmrc3_tv2_samples-v{ver}.rda"))
data_structures <- c(data_structures, "tv2_samples")

cpm_data <- normalize_expt(tv2_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_samples-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv2_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8390 low-count genes (11562 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_samples-v{ver}.csv"))
cpm_data <- normalize_expt(tv2_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8390 low-count genes (11562 remaining).
## Setting 2857 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_samples_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv2_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8390 low-count genes (11562 remaining).
## Setting 415 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_samples_sva-v{ver}.csv"))

12.4.7 Tumaco visit 3 samples

tv3_samples <- tcv3_samples %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30178, TMRC30179, TMRC30176, TMRC30153, TMRC30231, TMRC30232, TMRC30233, TMRC30216, TMRC30214, TMRC30215, TMRC30254, TMRC30255, TMRC30256, TMRC30278, TMRC30279, TMRC30280, TMRC30285.
## subset_expt(): There were 51, now there are 34 samples.
save(list = "tv3_samples", file = glue("rda/tmrc3_tv3_samples-v{ver}.rda"))
data_structures <- c(data_structures, "tv3_samples")

cpm_data <- normalize_expt(tv3_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_samples-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv3_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8500 low-count genes (11452 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_samples-v{ver}.csv"))
cpm_data <- normalize_expt(tv3_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8500 low-count genes (11452 remaining).
## Setting 1887 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_samples_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv3_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8500 low-count genes (11452 remaining).
## Setting 247 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_samples_sva-v{ver}.csv"))

12.4.8 Tumaco visit 1 Eosinophils

tv1_eosinophils <- tcv1_eosinophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30138, TMRC30227, TMRC30211, TMRC30271, TMRC30257, TMRC30281.
## subset_expt(): There were 14, now there are 8 samples.
save(list = "tv1_eosinophils", file = glue("rda/tmrc3_tv1_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv1_eosinophils")

cpm_data <- normalize_expt(tv1_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_eosinophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv1_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9973 low-count genes (9979 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv1_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9973 low-count genes (9979 remaining).
## Setting 57 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_eosinophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv1_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9973 low-count genes (9979 remaining).
## Setting 20 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_eosinophils_sva-v{ver}.csv"))

12.4.9 Tumaco visit 2 samples

tv2_eosinophils <- tcv2_eosinophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30151, TMRC30230, TMRC30272, TMRC30277, TMRC30282.
## subset_expt(): There were 14, now there are 9 samples.
save(list = "tv2_eosinophils", file = glue("rda/tmrc3_tv2_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv2_eosinophils")

cpm_data <- normalize_expt(tv2_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_eosinophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv2_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9835 low-count genes (10117 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv2_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9835 low-count genes (10117 remaining).
## Setting 90 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_eosinophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv2_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9835 low-count genes (10117 remaining).
## Setting 39 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_eosinophils_sva-v{ver}.csv"))

12.4.10 Tumaco visit 3 eosinophil

tv3_eosinophils <- tcv3_eosinophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30233, TMRC30216, TMRC30254, TMRC30278.
## subset_expt(): There were 13, now there are 9 samples.
save(list = "tv3_eosinophils", file = glue("rda/tmrc3_tv3_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv3_eosinophils")

cpm_data <- normalize_expt(tv3_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_eosinophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv3_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9872 low-count genes (10080 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv3_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9872 low-count genes (10080 remaining).
## Setting 48 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_eosinophils_sva-v{ver}.xlsx"))
## Note, the cbcb filter left behind a sufficient number of zeros that it confused cpm.
rpkm_data <- normalize_expt(tv3_eosinophils, filter = "simple", batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 3353 low-count genes (16599 remaining).
## Setting 7019 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_eosinophils_sva-v{ver}.csv"))

12.4.11 Tumaco visit 1 monocytes

tv1_monocytes <- tcv1_monocytes %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30185, TMRC30221, TMRC30148, TMRC30234, TMRC30225, TMRC30209, TMRC30273, TMRC30239, TMRC30258, TMRC30283.
## subset_expt(): There were 26, now there are 16 samples.
save(list = "tv1_monocytes", file = glue("rda/tmrc3_tv1_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tv1_monocytes")

cpm_data <- normalize_expt(tv1_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_monocytes-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv1_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9470 low-count genes (10482 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(tv1_monocytes, convert="cpm", filter=TRUE, batch="svaseq")
## Removing 9470 low-count genes (10482 remaining).
## Setting 190 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_monocytes_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv1_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9470 low-count genes (10482 remaining).
## Setting 80 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_monocytes_sva-v{ver}.csv"))

12.4.12 Tumaco visit 2 monocytes

tv2_monocytes <- tcv2_monocytes %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30223, TMRC30150, TMRC30228, TMRC30212, TMRC30274.
## subset_expt(): There were 18, now there are 13 samples.
save(list = "tv2_monocytes", file = glue("rda/tmrc3_tv2_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tv2_monocytes")

cpm_data <- normalize_expt(tv2_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_monocytes-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv2_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9429 low-count genes (10523 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(tv2_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9429 low-count genes (10523 remaining).
## Setting 117 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_monocytes_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv2_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9429 low-count genes (10523 remaining).
## Setting 39 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_monocytes_sva-v{ver}.csv"))

12.4.13 Tumaco visit 3 monocytes

tv3_monocytes <- tcv3_monocytes %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30178, TMRC30176, TMRC30231, TMRC30214, TMRC30255, TMRC30279.
## subset_expt(): There were 19, now there are 13 samples.
save(list = "tv3_monocytes", file = glue("rda/tmrc3_tv3_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tv3_monocytes")

cpm_data <- normalize_expt(tv3_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_monocytes-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv3_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9575 low-count genes (10377 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(tv3_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9575 low-count genes (10377 remaining).
## Setting 58 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_monocytes_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv3_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9575 low-count genes (10377 remaining).
## Setting 28 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_monocytes_sva-v{ver}.csv"))

12.4.14 Tumaco visit 1 neutrophils

tv1_neutrophils <- tcv1_neutrophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30186, TMRC30222, TMRC30149, TMRC30235, TMRC30226, TMRC30210, TMRC30275, TMRC30240, TMRC30284.
## subset_expt(): There were 25, now there are 16 samples.
save(list = "tv1_neutrophils", file = glue("rda/tmrc3_tv1_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv1_neutrophils")

cpm_data <- normalize_expt(tv1_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_neutrophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv1_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11235 low-count genes (8717 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv1_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11235 low-count genes (8717 remaining).
## Setting 145 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv1_neutrophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv1_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11235 low-count genes (8717 remaining).
## Setting 41 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv1_neutrophils_sva-v{ver}.csv"))

12.4.15 Tumaco visit 2 neutrophils

tv2_neutrophils <- tcv2_neutrophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30224, TMRC30140, TMRC30229, TMRC30213, TMRC30276.
## subset_expt(): There were 18, now there are 13 samples.
save(list = "tv2_neutrophils", file = glue("rda/tmrc3_tv2_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv2_neutrophils")

cpm_data <- normalize_expt(tv2_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_neutrophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv2_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11500 low-count genes (8452 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv2_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11500 low-count genes (8452 remaining).
## Setting 78 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv2_neutrophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv2_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11500 low-count genes (8452 remaining).
## Setting 41 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv2_neutrophils_sva-v{ver}.csv"))

12.4.16 Tumaco visit 3 neutrophils

tv3_neutrophils <- tcv3_neutrophils %>%
  subset_expt(subset = "clinic=='tumaco'")
## The samples excluded are: TMRC30179, TMRC30153, TMRC30232, TMRC30215, TMRC30256, TMRC30280, TMRC30285.
## subset_expt(): There were 19, now there are 12 samples.
save(list = "tv3_neutrophils", file = glue("rda/tmrc3_tv3_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv3_neutrophils")

cpm_data <- normalize_expt(tv3_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_neutrophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv3_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11447 low-count genes (8505 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv3_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11447 low-count genes (8505 remaining).
## Setting 83 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/tv3_neutrophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(tv3_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11447 low-count genes (8505 remaining).
## Setting 18 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/tv3_neutrophils_sva-v{ver}.csv"))

13 Dataset: Only Cali samples

Even though we are only considering the Tumaco samples, one might wish to perform comparisons among the Cali samples. The following blocks therefore separate them out in a similar fashion.

dir.create("cpm/4_Cali", recursive = TRUE)
c_clinical <- tc_clinical %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30071, TMRC30020, TMRC30056, TMRC30113, TMRC30105, TMRC30058, TMRC30164, TMRC30080, TMRC30094, TMRC30119, TMRC30082, TMRC30103, TMRC30122, TMRC30022, TMRC30169, TMRC30093, TMRC30029, TMRC30107, TMRC30170, TMRC30032, TMRC30096, TMRC30083, TMRC30028, TMRC30115, TMRC30118, TMRC30180, TMRC30014, TMRC30121, TMRC30196, TMRC30030, TMRC30021, TMRC30026, TMRC30037, TMRC30031, TMRC30165, TMRC30027, TMRC30044, TMRC30194, TMRC30166, TMRC30195, TMRC30048, TMRC30054, TMRC30045, TMRC30046, TMRC30070, TMRC30049, TMRC30055, TMRC30047, TMRC30191, TMRC30053, TMRC30041, TMRC30068, TMRC30171, TMRC30192, TMRC30139, TMRC30042, TMRC30158, TMRC30132, TMRC30160, TMRC30157, TMRC30183, TMRC30167, TMRC30123, TMRC30181, TMRC30072, TMRC30133, TMRC30043, TMRC30078, TMRC30116, TMRC30184, TMRC30076, TMRC30159, TMRC30129, TMRC30088, TMRC30172, TMRC30134, TMRC30174, TMRC30137, TMRC30161, TMRC30142, TMRC30175, TMRC30145, TMRC30143, TMRC30168, TMRC30197, TMRC30146, TMRC30182, TMRC30199, TMRC30198, TMRC30201, TMRC30200, TMRC30203, TMRC30202, TMRC30205, TMRC30204, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241, TMRC30237, TMRC30206, TMRC30136, TMRC30207, TMRC30238, TMRC30074, TMRC30217, TMRC30208, TMRC30077, TMRC30219, TMRC30218, TMRC30079, TMRC30220, TMRC30135, TMRC30173, TMRC30264, TMRC30144, TMRC30147, TMRC30265.
## subset_expt(): There were 184, now there are 61 samples.
save(list = "c_clinical", file = glue("rda/tmrc3_c_clinical-v{ver}.rda"))
data_structures <- c(data_structures, "c_clinical")

cpm_data <- normalize_expt(c_clinical, convert = "cpm")
c_clinical_cpm_variance <- variance_expt(cpm_data)

written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_clinical-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_clinical, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 6553 low-count genes (13399 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("rpkm/t_clinical-v{ver}.csv"))
cpm_data <- normalize_expt(c_clinical, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 6553 low-count genes (13399 remaining).
## Setting 5038 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_clinical_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 6553 low-count genes (13399 remaining).
## Setting 3274 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_clinical_sva-v{ver}.csv"))

The Cali samples without biopsies.

c_clinical_nobiop <- subset_expt(c_clinical, subset = "typeofcells!='biopsy'")
## The samples excluded are: TMRC30156, TMRC30269, TMRC30253, TMRC30270.
## subset_expt(): There were 61, now there are 57 samples.
save(list = "c_clinical_nobiop", file = glue("rda/tmrc3_c_clinical_nobiop-v{ver}.rda"))
data_structures <- c(data_structures, "c_clinical_nobiop")

cpm_data <- normalize_expt(c_clinical_nobiop, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_clinical_nobiop-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 6553 low-count genes (13399 remaining).
## Setting 3274 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_clinical_sva-v{ver}.csv"))

cpm_data <- normalize_expt(c_clinical_nobiop, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8355 low-count genes (11597 remaining).
## Setting 3411 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_clinical_nobiop_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_clinical_nobiop, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8355 low-count genes (11597 remaining).
## Setting 637 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_clinical_nobiop_sva-v{ver}.csv"))

13.0.1 Pull out the top-n most variant genes

I added a few columns to the gene annotations reflecting the variance/stdev/mean expression of each gene. This really highlights the extraordinary degree to which genes are changing in the data…

top_expt <- normalize_expt(c_clinical_cpm_variance, filter = TRUE) %>%
  variance_expt()
## Removing 6223 low-count genes (13729 remaining).
top_fd <- fData(top_expt)
top_ex <- exprs(top_expt)
idx <- order(top_fd[["exprs_gene_stdev"]], decreasing = TRUE)
top_df <- top_fd[idx, ]

written <- write_xlsx(
    data = head(top_fd, n = 100),
    excel = glue("excel/c_clinical_cpm_stdev_top100-v{ver}.xlsx"))

bottom_expt <- normalize_expt(c_clinical_cpm_variance, filter = "simple", threshold = 500) %>%
  variance_expt()
## This function generally expects the threshold argument to be used with 'thresh'.
## Removing 11621 low-count genes (8331 remaining).
bottom_fd <- fData(bottom_expt)
bottom_ex <- exprs(bottom_expt)
idx <- order(bottom_fd[["exprs_gene_stdev"]])
bottom <- bottom_fd[idx, ]

written <- write_xlsx(
    data = head(bottom_fd, n = 100),
    excel = glue("excel/c_clinical_cpm_stdev_bottom100-v{ver}.xlsx"))

13.1 Summarize: Collect Cali sample numbers.

This is copy/pasted from above and prints out how many of each sample type there are of each category.

table(pData(c_clinical)[["drug"]])
## 
## antimony 
##       61
table(pData(c_clinical)[["clinic"]])
## 
## cali 
##   61
table(pData(c_clinical)[["finaloutcome"]])
## 
##    cure failure 
##      55       6
table(pData(c_clinical)[["typeofcells"]])
## 
##      biopsy eosinophils   monocytes neutrophils 
##           4          15          21          21
table(pData(c_clinical)[["visitnumber"]])
## 
##  3  2  1 
## 17 15 29
summary(pData(c_clinical)[["Evolution_Time"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     3.0     6.0     8.0    10.5    15.0    20.0
summary(pData(c_clinical)[["Prescribed_Daily_Dose_Gluc"]])
##    Length     Class      Mode 
##        61 character character
summary(pData(c_clinical)[["V3_Vertical_Axis_Lesion"]])
##    Length     Class      Mode 
##        61 character character
summary(pData(c_clinical)[["V3_Total_Area_Lesion"]])
##    Length     Class      Mode 
##        61 character character
summary(pData(c_clinical)[["V3_Horizontal_Axis_Ulcer"]])
##    Length     Class      Mode 
##        61 character character
table(pData(c_clinical)[["Sex"]])
## 
##  1  2 
## 55  6
table(pData(c_clinical)[["Ethnicity"]])
## 
##  1  2  3 
## 15 27 19
summary(pData(c_clinical)[["Age"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    28.0    33.0    36.0    35.2    37.0    44.0
summary(pData(c_clinical)[["Height"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     155     160     169     167     174     174
summary(pData(c_clinical)[["Weight"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    58.0    72.0    77.0    78.2    87.0   100.0
length(unique(pData(c_clinical)[["Patient_ID"]]))
## [1] 10
only_cure <- pData(c_clinical)[["finaloutcome"]] == "cure"
c_meta <- pData(c_clinical)[only_cure, ]
length(unique(c_meta[["Patient_ID"]]))
## [1] 9
only_fail <- pData(c_clinical)[["finaloutcome"]] == "failure"
f_meta <- pData(c_clinical)[only_fail, ]
length(unique(f_meta[["Patient_ID"]]))
## [1] 1

13.2 Split the data by cure/fail for some counting

cali_cure <- subset_expt(c_clinical, subset = "finaloutcome=='cure'")
## The samples excluded are: TMRC30178, TMRC30179, TMRC30221, TMRC30222, TMRC30223, TMRC30224.
## subset_expt(): There were 61, now there are 55 samples.
table(pData(cali_cure)[["visitnumber"]])
## 
##  3  2  1 
## 15 13 27
cali_fail <- subset_expt(c_clinical, subset = "finaloutcome=='failure'")
## The samples excluded are: TMRC30156, TMRC30185, TMRC30186, TMRC30269, TMRC30148, TMRC30149, TMRC30253, TMRC30150, TMRC30140, TMRC30138, TMRC30176, TMRC30153, TMRC30151, TMRC30234, TMRC30235, TMRC30270, TMRC30225, TMRC30226, TMRC30227, TMRC30228, TMRC30229, TMRC30230, TMRC30231, TMRC30232, TMRC30233, TMRC30209, TMRC30210, TMRC30211, TMRC30212, TMRC30213, TMRC30216, TMRC30214, TMRC30215, TMRC30271, TMRC30273, TMRC30275, TMRC30272, TMRC30274, TMRC30276, TMRC30254, TMRC30255, TMRC30256, TMRC30277, TMRC30239, TMRC30240, TMRC30278, TMRC30279, TMRC30280, TMRC30257, TMRC30258, TMRC30281, TMRC30283, TMRC30284, TMRC30282, TMRC30285.
## subset_expt(): There were 61, now there are 6 samples.
table(pData(cali_fail)[["visitnumber"]])
## 
## 3 2 1 
## 2 2 2

13.3 Subset: Create Cali-specific versions of the various structures

I previously made a bunch of data subsets by visit, cell type, etc. So let us overwrite them all with versions which contain only the Cali samples.

There is no going back to the Cali samples after this block unless we regenerate the data from the original expressionsets.

13.3.1 Cali biopsies

c_biopsies <- tc_biopsies %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30020, TMRC30022, TMRC30026, TMRC30044, TMRC30045, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241.
## subset_expt(): There were 18, now there are 4 samples.
save(list = "c_biopsies", file = glue("rda/tmrc3_c_biopsies-v{ver}.rda"))
data_structures <- c(data_structures, "c_biopsies")

cpm_data <- normalize_expt(c_biopsies, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_biopsies-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_biopsies, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 7380 low-count genes (12572 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_biopsies-v{ver}.csv"))

cpm_data <- normalize_expt(c_biopsies, convert = "cpm", filter = TRUE)
## Removing 7380 low-count genes (12572 remaining).
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_biopsies_nosva-v{ver}.xlsx"))

13.3.2 Cali Eosinophils

c_eosinophils <- tc_eosinophils %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30071, TMRC30113, TMRC30164, TMRC30119, TMRC30122, TMRC30029, TMRC30032, TMRC30028, TMRC30180, TMRC30196, TMRC30048, TMRC30054, TMRC30070, TMRC30043, TMRC30159, TMRC30161, TMRC30168, TMRC30182, TMRC30136, TMRC30074, TMRC30077, TMRC30079, TMRC30135, TMRC30173, TMRC30144, TMRC30147.
## subset_expt(): There were 41, now there are 15 samples.
save(list = "c_eosinophils", file = glue("rda/tmrc3_c_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "c_eosinophils")

cpm_data <- normalize_expt(c_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_eosinophils-v{ver}.xlsx"))
cpm_data <- normalize_expt(c_eosinophils, convert = "cpm", filter = TRUE)
## Removing 9602 low-count genes (10350 remaining).
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_eosinophils_nosva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_eosinophils, filter = TRUE) %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9602 low-count genes (10350 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_eosinophils_nosva-v{ver}.csv"))

13.3.3 Cali subsets monocytes

c_monocytes <- tc_monocytes %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30056, TMRC30105, TMRC30080, TMRC30082, TMRC30169, TMRC30107, TMRC30096, TMRC30115, TMRC30014, TMRC30030, TMRC30037, TMRC30165, TMRC30194, TMRC30046, TMRC30049, TMRC30055, TMRC30191, TMRC30041, TMRC30171, TMRC30139, TMRC30132, TMRC30157, TMRC30183, TMRC30123, TMRC30072, TMRC30078, TMRC30184, TMRC30129, TMRC30172, TMRC30174, TMRC30142, TMRC30145, TMRC30197, TMRC30199, TMRC30201, TMRC30203, TMRC30205, TMRC30237, TMRC30207, TMRC30217, TMRC30219, TMRC30264.
## subset_expt(): There were 63, now there are 21 samples.
save(list = "c_monocytes", file = glue("rda/tmrc3_c_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "c_monocytes")

cpm_data <- normalize_expt(c_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_monocytes-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9380 low-count genes (10572 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(c_monocytes, convert = "cpm", filter = TRUE)
## Removing 9380 low-count genes (10572 remaining).
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_monocytes_nosva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9380 low-count genes (10572 remaining).
## Setting 18 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_monocytes_sva-v{ver}.csv"))

13.3.4 Cali subsets neutrophils

c_neutrophils <- tc_neutrophils %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30058, TMRC30094, TMRC30103, TMRC30093, TMRC30170, TMRC30083, TMRC30118, TMRC30121, TMRC30021, TMRC30031, TMRC30027, TMRC30166, TMRC30195, TMRC30047, TMRC30053, TMRC30068, TMRC30192, TMRC30042, TMRC30158, TMRC30160, TMRC30167, TMRC30181, TMRC30133, TMRC30116, TMRC30076, TMRC30088, TMRC30134, TMRC30137, TMRC30175, TMRC30143, TMRC30146, TMRC30198, TMRC30200, TMRC30202, TMRC30204, TMRC30206, TMRC30238, TMRC30208, TMRC30218, TMRC30220, TMRC30265.
## subset_expt(): There were 62, now there are 21 samples.
save(list = "c_neutrophils", file = glue("rda/tmrc3_c_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "c_neutrophils")

cpm_data <- normalize_expt(c_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_neutrophil-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11521 low-count genes (8431 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("rpkm/c_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(c_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11521 low-count genes (8431 remaining).
## Setting 118 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_neutrophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(c_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11521 low-count genes (8431 remaining).
## Setting 30 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/c_neutrophils_sva-v{ver}.csv"))

13.3.5 Cali Visit 1 samples

cv1_samples <- tcv1_samples %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30071, TMRC30020, TMRC30080, TMRC30103, TMRC30022, TMRC30029, TMRC30107, TMRC30083, TMRC30180, TMRC30014, TMRC30021, TMRC30026, TMRC30165, TMRC30044, TMRC30166, TMRC30048, TMRC30045, TMRC30046, TMRC30047, TMRC30191, TMRC30041, TMRC30192, TMRC30042, TMRC30132, TMRC30167, TMRC30123, TMRC30043, TMRC30116, TMRC30184, TMRC30134, TMRC30174, TMRC30175, TMRC30168, TMRC30197, TMRC30198, TMRC30203, TMRC30204, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241, TMRC30237, TMRC30207, TMRC30238, TMRC30074, TMRC30208, TMRC30135, TMRC30264, TMRC30265.
## subset_expt(): There were 83, now there are 29 samples.
save(list = "cv1_samples", file = glue("rda/tmrc3_cv1_samples-v{ver}.rda"))
data_structures <- c(data_structures, "cv1_samples")

cpm_data <- normalize_expt(cv1_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_samples-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv1_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 6689 low-count genes (13263 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_samples-v{ver}.csv"))
cpm_data <- normalize_expt(cv1_samples, convert =  "cpm", filter = TRUE, batch = "svaseq")
## Removing 6689 low-count genes (13263 remaining).
## Setting 1987 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_samples_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv1_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 6689 low-count genes (13263 remaining).
## Setting 665 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_samples_sva-v{ver}.csv"))

13.3.6 Cali Visit 2 samples

cv2_samples <- tcv2_samples %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30056, TMRC30113, TMRC30058, TMRC30119, TMRC30082, TMRC30093, TMRC30032, TMRC30096, TMRC30118, TMRC30196, TMRC30030, TMRC30031, TMRC30194, TMRC30195, TMRC30054, TMRC30049, TMRC30053, TMRC30171, TMRC30158, TMRC30157, TMRC30181, TMRC30072, TMRC30076, TMRC30159, TMRC30129, TMRC30137, TMRC30142, TMRC30143, TMRC30182, TMRC30199, TMRC30200, TMRC30217, TMRC30077, TMRC30218, TMRC30144.
## subset_expt(): There were 50, now there are 15 samples.
save(list = "cv2_samples", file = glue("rda/tmrc3_cv2_samples-v{ver}.rda"))
data_structures <- c(data_structures, "cv2_samples")

cpm_data <- normalize_expt(cv2_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_samples-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv2_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8890 low-count genes (11062 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_samples-v{ver}.csv"))
cpm_data <- normalize_expt(cv2_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8890 low-count genes (11062 remaining).
## Setting 345 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_samples_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv2_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8890 low-count genes (11062 remaining).
## Setting 61 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_samples_sva-v{ver}.csv"))

13.3.7 Cali visit 3 samples

cv3_samples <- tcv3_samples %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30105, TMRC30164, TMRC30094, TMRC30122, TMRC30169, TMRC30170, TMRC30028, TMRC30115, TMRC30121, TMRC30037, TMRC30027, TMRC30070, TMRC30055, TMRC30068, TMRC30139, TMRC30160, TMRC30183, TMRC30133, TMRC30078, TMRC30088, TMRC30172, TMRC30161, TMRC30145, TMRC30146, TMRC30201, TMRC30202, TMRC30205, TMRC30206, TMRC30136, TMRC30219, TMRC30079, TMRC30220, TMRC30173, TMRC30147.
## subset_expt(): There were 51, now there are 17 samples.
save(list = "cv3_samples", file = glue("rda/tmrc3_cv3_samples-v{ver}.rda"))
data_structures <- c(data_structures, "cv3_samples")

cpm_data <- normalize_expt(cv3_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_samples-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv3_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8862 low-count genes (11090 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_samples-v{ver}.csv"))
cpm_data <- normalize_expt(cv3_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8862 low-count genes (11090 remaining).
## Setting 508 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_samples_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv3_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8862 low-count genes (11090 remaining).
## Setting 78 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_samples_sva-v{ver}.csv"))

13.3.8 Cali visit 1 Eosinophils

cv1_eosinophils <- tcv1_eosinophils %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30071, TMRC30029, TMRC30180, TMRC30048, TMRC30043, TMRC30168, TMRC30074, TMRC30135.
## subset_expt(): There were 14, now there are 6 samples.
save(list = "cv1_eosinophils", file = glue("rda/tmrc3_cv1_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv1_eosinophils")

cpm_data <- normalize_expt(cv1_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_eosinophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv1_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 10112 low-count genes (9840 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv1_eosinophils, convert = "cpm", filter = TRUE)
## Removing 10112 low-count genes (9840 remaining).
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_eosinophils_nosva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv1_eosinophils, filter = TRUE) %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 10112 low-count genes (9840 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_eosinophils_nosva-v{ver}.csv"))

13.3.9 Cali visit 2 samples

cv2_eosinophils <- tcv2_eosinophils %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30113, TMRC30119, TMRC30032, TMRC30196, TMRC30054, TMRC30159, TMRC30182, TMRC30077, TMRC30144.
## subset_expt(): There were 14, now there are 5 samples.
save(list = "cv2_eosinophils", file = glue("rda/tmrc3_cv2_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv2_eosinophils")

cpm_data <- normalize_expt(cv2_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_eosinophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv2_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 10131 low-count genes (9821 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv2_eosinophils, convert = "cpm", filter = TRUE)
## Removing 10131 low-count genes (9821 remaining).
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_eosinophils_nosva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv2_eosinophils, filter = TRUE) %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 10131 low-count genes (9821 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_eosinophils_nosva-v{ver}.csv"))

13.3.10 Cali visit 3 eosinophil

cv3_eosinophils <- tcv3_eosinophils %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30164, TMRC30122, TMRC30028, TMRC30070, TMRC30161, TMRC30136, TMRC30079, TMRC30173, TMRC30147.
## subset_expt(): There were 13, now there are 4 samples.
save(list = "cv3_eosinophils", file = glue("rda/tmrc3_cv3_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv3_eosinophils")

cpm_data <- normalize_expt(cv3_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_eosinophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv3_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 10257 low-count genes (9695 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv3_eosinophils, convert = "cpm", filter = TRUE)
## Removing 10257 low-count genes (9695 remaining).
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_eosinophils_nosva-v{ver}.xlsx"))
## Note, the cbcb filter left behind a sufficient number of zeros that it confused cpm.
rpkm_data <- normalize_expt(cv3_eosinophils, filter = "simple") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5292 low-count genes (14660 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_eosinophils_nosva-v{ver}.csv"))

13.3.11 Cali visit 1 monocytes

cv1_monocytes <- tcv1_monocytes %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30080, TMRC30107, TMRC30014, TMRC30165, TMRC30046, TMRC30191, TMRC30041, TMRC30132, TMRC30123, TMRC30184, TMRC30174, TMRC30197, TMRC30203, TMRC30237, TMRC30207, TMRC30264.
## subset_expt(): There were 26, now there are 10 samples.
save(list = "cv1_monocytes", file = glue("rda/tmrc3_cv1_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "cv1_monocytes")

cpm_data <- normalize_expt(cv1_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_monocytes-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv1_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9574 low-count genes (10378 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(cv1_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9574 low-count genes (10378 remaining).
## Setting 46 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_monocytes_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv1_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9574 low-count genes (10378 remaining).
## Setting 9 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_monocytes_sva-v{ver}.csv"))

13.3.12 Cali visit 2 monocytes

cv2_monocytes <- tcv2_monocytes %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30056, TMRC30082, TMRC30096, TMRC30030, TMRC30194, TMRC30049, TMRC30171, TMRC30157, TMRC30072, TMRC30129, TMRC30142, TMRC30199, TMRC30217.
## subset_expt(): There were 18, now there are 5 samples.
save(list = "cv2_monocytes", file = glue("rda/tmrc3_cv2_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "cv2_monocytes")

cpm_data <- normalize_expt(cv2_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_monocytes-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv2_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9817 low-count genes (10135 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(cv2_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9817 low-count genes (10135 remaining).
## Setting 5 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_monocytes_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv2_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9817 low-count genes (10135 remaining).
## Setting 2 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_monocytes_sva-v{ver}.csv"))

13.3.13 Cali visit 3 monocytes

cv3_monocytes <- tcv3_monocytes %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30105, TMRC30169, TMRC30115, TMRC30037, TMRC30055, TMRC30139, TMRC30183, TMRC30078, TMRC30172, TMRC30145, TMRC30201, TMRC30205, TMRC30219.
## subset_expt(): There were 19, now there are 6 samples.
save(list = "cv3_monocytes", file = glue("rda/tmrc3_cv3_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "cv3_monocytes")

cpm_data <- normalize_expt(cv3_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_monocytes-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv3_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9780 low-count genes (10172 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(cv3_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9780 low-count genes (10172 remaining).
## Setting 14 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_monocytes_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv3_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9780 low-count genes (10172 remaining).
## Setting 5 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_monocytes_sva-v{ver}.csv"))

13.3.14 Cali visit 1 neutrophils

cv1_neutrophils <- tcv1_neutrophils %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30103, TMRC30083, TMRC30021, TMRC30166, TMRC30047, TMRC30192, TMRC30042, TMRC30167, TMRC30116, TMRC30134, TMRC30175, TMRC30198, TMRC30204, TMRC30238, TMRC30208, TMRC30265.
## subset_expt(): There were 25, now there are 9 samples.
save(list = "cv1_neutrophils", file = glue("rda/tmrc3_cv1_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv1_neutrophils")

cpm_data <- normalize_expt(cv1_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_neutrophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv1_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11830 low-count genes (8122 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv1_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11830 low-count genes (8122 remaining).
## Setting 33 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv1_neutrophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv1_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11830 low-count genes (8122 remaining).
## Setting 9 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv1_neutrophils_sva-v{ver}.csv"))

13.3.15 Cali visit 2 neutrophils

cv2_neutrophils <- tcv2_neutrophils %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30058, TMRC30093, TMRC30118, TMRC30031, TMRC30195, TMRC30053, TMRC30158, TMRC30181, TMRC30076, TMRC30137, TMRC30143, TMRC30200, TMRC30218.
## subset_expt(): There were 18, now there are 5 samples.
save(list = "cv2_neutrophils", file = glue("rda/tmrc3_cv2_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv2_neutrophils")

cpm_data <- normalize_expt(cv2_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_neutrophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv2_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 12293 low-count genes (7659 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv2_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 12293 low-count genes (7659 remaining).
## Setting 10 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv2_neutrophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv2_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 12293 low-count genes (7659 remaining).
## Setting 1 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv2_neutrophils_sva-v{ver}.csv"))

13.3.16 Cali visit 3 neutrophils

cv3_neutrophils <- tcv3_neutrophils %>%
  subset_expt(subset = "clinic=='cali'")
## The samples excluded are: TMRC30094, TMRC30170, TMRC30121, TMRC30027, TMRC30068, TMRC30160, TMRC30133, TMRC30088, TMRC30146, TMRC30202, TMRC30206, TMRC30220.
## subset_expt(): There were 19, now there are 7 samples.
save(list = "cv3_neutrophils", file = glue("rda/tmrc3_cv3_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv3_neutrophils")

cpm_data <- normalize_expt(cv3_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_neutrophils-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv3_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11962 low-count genes (7990 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv3_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11962 low-count genes (7990 remaining).
## Setting 28 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/cv3_neutrophils_sva-v{ver}.xlsx"))
rpkm_data <- normalize_expt(cv3_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11962 low-count genes (7990 remaining).
## Setting 7 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("rpkm/cv3_neutrophils_sva-v{ver}.csv"))

13.3.17 Tumaco compare visits

Is this redundant?

tc_visit <- set_expt_conditions(
  tc_clinical, fact = "visitnumber", colors = color_choices[["visit2"]]) %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells!='biopsy'")
## The numbers of samples by condition are:
## 
##  3  2  1 
## 51 50 83
## The number of samples by batch are:
## 
##    cure failure 
##     122      62
## The samples excluded are: TMRC30156, TMRC30269, TMRC30253, TMRC30270, TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30020, TMRC30022, TMRC30026, TMRC30044, TMRC30045, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241.
## subset_expt(): There were 184, now there are 166 samples.
save(list = "tc_visit", file = glue("rda/tmrc3_tc_visit-v{ver}.rda"))
data_structures <- c(data_structures, "tc_visit")

tc_v1vs <- tc_visit
pData(tc_v1vs)[["visit"]] <- as.character(pData(tc_v1vs)[["visitnumber"]])
v1_samples <- pData(tc_v1vs)[["visit"]] == "1"
pData(tc_v1vs)[v1_samples, "visit"] <- "first"
pData(tc_v1vs)[!v1_samples, "visit"] <- "later"
pData(tc_v1vs)[["visit"]] <- as.factor(pData(tc_v1vs)[["visit"]])
tc_v1vs <- set_expt_conditions(
  tc_v1vs, fact = "visit", colors = color_choices[["two_visits"]])
## The numbers of samples by condition are:
## 
## first later 
##    65   101
save(list = "tc_v1vs", file = glue("rda/tmrc3_tc_v1vs-v{ver}.rda"))
data_structures <- c(data_structures, "tc_v1vs")
t_v1vs <- subset_expt(tc_v1vs, subset = "clinic == 'tumaco'")
## The samples excluded are: TMRC30185, TMRC30186, TMRC30178, TMRC30179, TMRC30221, TMRC30222, TMRC30223, TMRC30224, TMRC30148, TMRC30149, TMRC30150, TMRC30140, TMRC30138, TMRC30176, TMRC30153, TMRC30151, TMRC30234, TMRC30235, TMRC30225, TMRC30226, TMRC30227, TMRC30228, TMRC30229, TMRC30230, TMRC30231, TMRC30232, TMRC30233, TMRC30209, TMRC30210, TMRC30211, TMRC30212, TMRC30213, TMRC30216, TMRC30214, TMRC30215, TMRC30271, TMRC30273, TMRC30275, TMRC30272, TMRC30274, TMRC30276, TMRC30254, TMRC30255, TMRC30256, TMRC30277, TMRC30239, TMRC30240, TMRC30278, TMRC30279, TMRC30280, TMRC30257, TMRC30258, TMRC30281, TMRC30283, TMRC30284, TMRC30282, TMRC30285.
## subset_expt(): There were 166, now there are 109 samples.
save(list = "t_v1vs", file = glue("rda/tmrc3_t_v1vs-v{ver}.rda"))
data_structures <- c(data_structures, "t_v1vs")

t_visit <- set_expt_conditions(
  t_clinical, fact = "visitnumber", colors = color_choices[["visit2"]]) %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells!='biopsy'")
## The numbers of samples by condition are:
## 
##  3  2  1 
## 34 35 54
## The number of samples by batch are:
## 
##    cure failure 
##      67      56
## The samples excluded are: TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30020, TMRC30022, TMRC30026, TMRC30044, TMRC30045, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241.
## subset_expt(): There were 123, now there are 109 samples.
save(list = "t_visit", file = glue("rda/tmrc3_t_visit-v{ver}.rda"))
data_structures <- c(data_structures, "t_visit")
cpm_data <- normalize_expt(t_visit, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_visit-v{ver}.xlsx"))
cpm_data <- normalize_expt(t_visit, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8042 low-count genes (11910 remaining).
## Setting 9636 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/t_visit_sva-v{ver}.xlsx"))

13.3.18 Visit cure/fail contrasts

visit_cf_expt_factor <- paste0("v", pData(t_clinical)[["visitnumber"]],
                               pData(t_clinical)[["finaloutcome"]])
t_visitcf <- set_expt_conditions(t_clinical, fact = visit_cf_expt_factor)
## The numbers of samples by condition are:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##        30        24        20        15        17        17
save(list = "t_visitcf", file = glue("rda/tmrc3_t_visitcf-v{ver}.rda"))
data_structures <- c(data_structures, "t_visitcf")

t_visitcf_eosinophil <- subset_expt(t_visitcf, subset = "typeofcells=='eosinophils'")
## The samples excluded are: TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30020, TMRC30056, TMRC30105, TMRC30058, TMRC30080, TMRC30094, TMRC30082, TMRC30103, TMRC30022, TMRC30169, TMRC30093, TMRC30107, TMRC30170, TMRC30096, TMRC30083, TMRC30115, TMRC30118, TMRC30014, TMRC30121, TMRC30030, TMRC30021, TMRC30026, TMRC30037, TMRC30031, TMRC30165, TMRC30027, TMRC30044, TMRC30194, TMRC30166, TMRC30195, TMRC30045, TMRC30046, TMRC30049, TMRC30055, TMRC30047, TMRC30191, TMRC30053, TMRC30041, TMRC30068, TMRC30171, TMRC30192, TMRC30139, TMRC30042, TMRC30158, TMRC30132, TMRC30160, TMRC30157, TMRC30183, TMRC30167, TMRC30123, TMRC30181, TMRC30072, TMRC30133, TMRC30078, TMRC30116, TMRC30184, TMRC30076, TMRC30129, TMRC30088, TMRC30172, TMRC30134, TMRC30174, TMRC30137, TMRC30142, TMRC30175, TMRC30145, TMRC30143, TMRC30197, TMRC30146, TMRC30199, TMRC30198, TMRC30201, TMRC30200, TMRC30203, TMRC30202, TMRC30205, TMRC30204, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241, TMRC30237, TMRC30206, TMRC30207, TMRC30238, TMRC30217, TMRC30208, TMRC30219, TMRC30218, TMRC30220, TMRC30264, TMRC30265.
## subset_expt(): There were 123, now there are 26 samples.
save(list = "t_visitcf_eosinophil", file = glue("rda/tmrc3_t_visitcf_eosinophil-v{ver}.rda"))
data_structures <- c(data_structures, "t_visitcf_eosinophil")

t_visitcf_monocyte <- subset_expt(t_visitcf, subset = "typeofcells=='monocytes'")
## The samples excluded are: TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30071, TMRC30020, TMRC30113, TMRC30058, TMRC30164, TMRC30094, TMRC30119, TMRC30103, TMRC30122, TMRC30022, TMRC30093, TMRC30029, TMRC30170, TMRC30032, TMRC30083, TMRC30028, TMRC30118, TMRC30180, TMRC30121, TMRC30196, TMRC30021, TMRC30026, TMRC30031, TMRC30027, TMRC30044, TMRC30166, TMRC30195, TMRC30048, TMRC30054, TMRC30045, TMRC30070, TMRC30047, TMRC30053, TMRC30068, TMRC30192, TMRC30042, TMRC30158, TMRC30160, TMRC30167, TMRC30181, TMRC30133, TMRC30043, TMRC30116, TMRC30076, TMRC30159, TMRC30088, TMRC30134, TMRC30137, TMRC30161, TMRC30175, TMRC30143, TMRC30168, TMRC30146, TMRC30182, TMRC30198, TMRC30200, TMRC30202, TMRC30204, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241, TMRC30206, TMRC30136, TMRC30238, TMRC30074, TMRC30208, TMRC30077, TMRC30218, TMRC30079, TMRC30220, TMRC30135, TMRC30173, TMRC30144, TMRC30147, TMRC30265.
## subset_expt(): There were 123, now there are 42 samples.
save(list = "t_visitcf_monocyte", file = glue("rda/tmrc3_t_visitcf_monocyte-v{ver}.rda"))
data_structures <- c(data_structures, "t_visitcf_monocyte")

t_visitcf_neutrophil <- subset_expt(t_visitcf, subset = "typeofcells=='neutrophils'")
## The samples excluded are: TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30071, TMRC30020, TMRC30056, TMRC30113, TMRC30105, TMRC30164, TMRC30080, TMRC30119, TMRC30082, TMRC30122, TMRC30022, TMRC30169, TMRC30029, TMRC30107, TMRC30032, TMRC30096, TMRC30028, TMRC30115, TMRC30180, TMRC30014, TMRC30196, TMRC30030, TMRC30026, TMRC30037, TMRC30165, TMRC30044, TMRC30194, TMRC30048, TMRC30054, TMRC30045, TMRC30046, TMRC30070, TMRC30049, TMRC30055, TMRC30191, TMRC30041, TMRC30171, TMRC30139, TMRC30132, TMRC30157, TMRC30183, TMRC30123, TMRC30072, TMRC30043, TMRC30078, TMRC30184, TMRC30159, TMRC30129, TMRC30172, TMRC30174, TMRC30161, TMRC30142, TMRC30145, TMRC30168, TMRC30197, TMRC30182, TMRC30199, TMRC30201, TMRC30203, TMRC30205, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30241, TMRC30237, TMRC30136, TMRC30207, TMRC30074, TMRC30217, TMRC30077, TMRC30219, TMRC30079, TMRC30135, TMRC30173, TMRC30264, TMRC30144, TMRC30147.
## subset_expt(): There were 123, now there are 41 samples.
save(list = "t_visitcf_neutrophil", file = glue("rda/tmrc3_t_visitcf_neutrophil-v{ver}.rda"))
data_structures <- c(data_structures, "t_visitcf_neutrophil")

13.3.19 Cali compare visits

Is this redundant?

c_visit <- set_expt_conditions(c_clinical, fact = "visitnumber") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells!='biopsy'")
## The numbers of samples by condition are:
## 
##  3  2  1 
## 17 15 29
## The number of samples by batch are:
## 
##    cure failure 
##      55       6
## The samples excluded are: TMRC30156, TMRC30269, TMRC30253, TMRC30270.
## subset_expt(): There were 61, now there are 57 samples.
save(list = "c_visit", file = glue("rda/tmrc3_c_visit-v{ver}.rda"))
data_structures <- c(data_structures, "c_visit")

cpm_data <- normalize_expt(c_visit, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Tumaco/c_visit-v{ver}.xlsx"))
cpm_data <- normalize_expt(c_visit, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8355 low-count genes (11597 remaining).
## Setting 3410 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("cpm/4_Cali/c_visit_sva-v{ver}.xlsx"))

13.3.20 Visit cure/fail contrasts

visit_cf_expt_factor <- paste0("v", pData(c_clinical)[["visitnumber"]],
                               pData(c_clinical)[["finaloutcome"]])
c_visitcf <- set_expt_conditions(c_clinical, fact = visit_cf_expt_factor)
## The numbers of samples by condition are:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##        27         2        13         2        15         2
save(list = "c_visitcf", file = glue("rda/tmrc3_c_visitcf-v{ver}.rda"))
data_structures <- c(data_structures, "c_visitcf")

c_visitcf_eosinophil <- subset_expt(c_visitcf, subset = "typeofcells=='eosinophils'")
## The samples excluded are: TMRC30156, TMRC30185, TMRC30186, TMRC30178, TMRC30179, TMRC30221, TMRC30222, TMRC30223, TMRC30224, TMRC30269, TMRC30148, TMRC30149, TMRC30253, TMRC30150, TMRC30140, TMRC30176, TMRC30153, TMRC30234, TMRC30235, TMRC30270, TMRC30225, TMRC30226, TMRC30228, TMRC30229, TMRC30231, TMRC30232, TMRC30209, TMRC30210, TMRC30212, TMRC30213, TMRC30214, TMRC30215, TMRC30273, TMRC30275, TMRC30274, TMRC30276, TMRC30255, TMRC30256, TMRC30239, TMRC30240, TMRC30279, TMRC30280, TMRC30258, TMRC30283, TMRC30284, TMRC30285.
## subset_expt(): There were 61, now there are 15 samples.
save(list = "c_visitcf_eosinophil", file = glue("rda/tmrc3_c_visitcf_eosinophil-v{ver}.rda"))
data_structures <- c(data_structures, "c_visitcf_eosinophil")

c_visitcf_monocyte <- subset_expt(c_visitcf, subset = "typeofcells=='monocytes'")
## The samples excluded are: TMRC30156, TMRC30186, TMRC30179, TMRC30222, TMRC30224, TMRC30269, TMRC30149, TMRC30253, TMRC30140, TMRC30138, TMRC30153, TMRC30151, TMRC30235, TMRC30270, TMRC30226, TMRC30227, TMRC30229, TMRC30230, TMRC30232, TMRC30233, TMRC30210, TMRC30211, TMRC30213, TMRC30216, TMRC30215, TMRC30271, TMRC30275, TMRC30272, TMRC30276, TMRC30254, TMRC30256, TMRC30277, TMRC30240, TMRC30278, TMRC30280, TMRC30257, TMRC30281, TMRC30284, TMRC30282, TMRC30285.
## subset_expt(): There were 61, now there are 21 samples.
save(list = "c_visitcf_monocyte", file = glue("rda/tmrc3_c_visitcf_monocyte-v{ver}.rda"))
data_structures <- c(data_structures, "c_visitcf_monocyte")

c_visitcf_neutrophil <- subset_expt(c_visitcf, subset = "typeofcells=='neutrophils'")
## The samples excluded are: TMRC30156, TMRC30185, TMRC30178, TMRC30221, TMRC30223, TMRC30269, TMRC30148, TMRC30253, TMRC30150, TMRC30138, TMRC30176, TMRC30151, TMRC30234, TMRC30270, TMRC30225, TMRC30227, TMRC30228, TMRC30230, TMRC30231, TMRC30233, TMRC30209, TMRC30211, TMRC30212, TMRC30216, TMRC30214, TMRC30271, TMRC30273, TMRC30272, TMRC30274, TMRC30254, TMRC30255, TMRC30277, TMRC30239, TMRC30278, TMRC30279, TMRC30257, TMRC30258, TMRC30281, TMRC30283, TMRC30282.
## subset_expt(): There were 61, now there are 21 samples.
save(list = "c_visitcf_neutrophil", file = glue("rda/tmrc3_c_visitcf_neutrophil-v{ver}.rda"))
data_structures <- c(data_structures, "c_visitcf_neutrophil")

14 Summarize: Tabulate sample numbers

14.1 Both

ncol(exprs(tc_clinical))
## [1] 184
sum(pData(tc_clinical)[["finaloutcome"]] == "cure")
## [1] 122
sum(pData(tc_clinical)[["finaloutcome"]] == "failure")
## [1] 62
all_types[["biopsy"]]
## [1] 18
sum(pData(tc_biopsies)[["finaloutcome"]] == "cure")
## [1] 13
sum(pData(tc_biopsies)[["finaloutcome"]] == "failure")
## [1] 5
all_types[["eosinophils"]]
## [1] 41
sum(pData(tc_eosinophils)[["finaloutcome"]] == "cure")
## [1] 32
sum(pData(tc_eosinophils)[["finaloutcome"]] == "failure")
## [1] 9
nrow(pData(tcv1_eosinophils))
## [1] 14
sum(pData(tcv1_eosinophils)[["finaloutcome"]] == "cure")
## [1] 11
sum(pData(tcv1_eosinophils)[["finaloutcome"]] == "failure")
## [1] 3
nrow(pData(tcv2_eosinophils))
## [1] 14
sum(pData(tcv2_eosinophils)[["finaloutcome"]] == "cure")
## [1] 11
sum(pData(tcv2_eosinophils)[["finaloutcome"]] == "failure")
## [1] 3
nrow(pData(tcv3_eosinophils))
## [1] 13
sum(pData(tcv3_eosinophils)[["finaloutcome"]] == "cure")
## [1] 10
sum(pData(tcv3_eosinophils)[["finaloutcome"]] == "failure")
## [1] 3
all_types[["monocytes"]]
## [1] 63
sum(pData(tc_monocytes)[["finaloutcome"]] == "cure")
## [1] 39
sum(pData(tc_monocytes)[["finaloutcome"]] == "failure")
## [1] 24
nrow(pData(tcv1_monocytes))
## [1] 26
sum(pData(tcv1_monocytes)[["finaloutcome"]] == "cure")
## [1] 17
sum(pData(tcv1_monocytes)[["finaloutcome"]] == "failure")
## [1] 9
nrow(pData(tcv2_monocytes))
## [1] 18
sum(pData(tcv2_monocytes)[["finaloutcome"]] == "cure")
## [1] 11
sum(pData(tcv2_monocytes)[["finaloutcome"]] == "failure")
## [1] 7
nrow(pData(tcv3_monocytes))
## [1] 19
sum(pData(tcv3_monocytes)[["finaloutcome"]] == "cure")
## [1] 11
sum(pData(tcv3_monocytes)[["finaloutcome"]] == "failure")
## [1] 8
all_types[["neutrophils"]]
## [1] 62
sum(pData(tc_neutrophils)[["finaloutcome"]] == "cure")
## [1] 38
sum(pData(tc_neutrophils)[["finaloutcome"]] == "failure")
## [1] 24
nrow(pData(tcv1_neutrophils))
## [1] 25
sum(pData(tcv1_neutrophils)[["finaloutcome"]] == "cure")
## [1] 16
sum(pData(tcv1_neutrophils)[["finaloutcome"]] == "failure")
## [1] 9
nrow(pData(tcv2_monocytes))
## [1] 18
sum(pData(tcv2_neutrophils)[["finaloutcome"]] == "cure")
## [1] 11
sum(pData(tcv2_neutrophils)[["finaloutcome"]] == "failure")
## [1] 7
nrow(pData(tcv3_neutrophils))
## [1] 19
sum(pData(tcv3_neutrophils)[["finaloutcome"]] == "cure")
## [1] 11
sum(pData(tcv3_neutrophils)[["finaloutcome"]] == "failure")
## [1] 8

14.2 Tumaco

Here is an outline of the samples in their current state:

ncol(exprs(t_clinical))
## [1] 123
sum(pData(t_clinical)[["finaloutcome"]] == "cure")
## [1] 67
sum(pData(t_clinical)[["finaloutcome"]] == "failure")
## [1] 56
all_types[["biopsy"]]
## [1] 18
sum(pData(t_biopsies)[["finaloutcome"]] == "cure")
## [1] 9
sum(pData(t_biopsies)[["finaloutcome"]] == "failure")
## [1] 5
all_types[["eosinophils"]]
## [1] 41
sum(pData(t_eosinophils)[["finaloutcome"]] == "cure")
## [1] 17
sum(pData(t_eosinophils)[["finaloutcome"]] == "failure")
## [1] 9
nrow(pData(tv1_eosinophils))
## [1] 8
sum(pData(tv1_eosinophils)[["finaloutcome"]] == "cure")
## [1] 5
sum(pData(tv1_eosinophils)[["finaloutcome"]] == "failure")
## [1] 3
nrow(pData(tv2_eosinophils))
## [1] 9
sum(pData(tv2_eosinophils)[["finaloutcome"]] == "cure")
## [1] 6
sum(pData(tv2_eosinophils)[["finaloutcome"]] == "failure")
## [1] 3
nrow(pData(tv3_eosinophils))
## [1] 9
sum(pData(tv3_eosinophils)[["finaloutcome"]] == "cure")
## [1] 6
sum(pData(tv3_eosinophils)[["finaloutcome"]] == "failure")
## [1] 3
all_types[["monocytes"]]
## [1] 63
sum(pData(t_monocytes)[["finaloutcome"]] == "cure")
## [1] 21
sum(pData(t_monocytes)[["finaloutcome"]] == "failure")
## [1] 21
nrow(pData(tv1_monocytes))
## [1] 16
sum(pData(tv1_monocytes)[["finaloutcome"]] == "cure")
## [1] 8
sum(pData(tv1_monocytes)[["finaloutcome"]] == "failure")
## [1] 8
nrow(pData(tv2_monocytes))
## [1] 13
sum(pData(tv2_monocytes)[["finaloutcome"]] == "cure")
## [1] 7
sum(pData(tv2_monocytes)[["finaloutcome"]] == "failure")
## [1] 6
nrow(pData(tv3_monocytes))
## [1] 13
sum(pData(tv3_monocytes)[["finaloutcome"]] == "cure")
## [1] 6
sum(pData(tv3_monocytes)[["finaloutcome"]] == "failure")
## [1] 7
all_types[["neutrophils"]]
## [1] 62
sum(pData(t_neutrophils)[["finaloutcome"]] == "cure")
## [1] 20
sum(pData(t_neutrophils)[["finaloutcome"]] == "failure")
## [1] 21
nrow(pData(tv1_neutrophils))
## [1] 16
sum(pData(tv1_neutrophils)[["finaloutcome"]] == "cure")
## [1] 8
sum(pData(tv1_neutrophils)[["finaloutcome"]] == "failure")
## [1] 8
nrow(pData(tv2_monocytes))
## [1] 13
sum(pData(tv2_neutrophils)[["finaloutcome"]] == "cure")
## [1] 7
sum(pData(tv2_neutrophils)[["finaloutcome"]] == "failure")
## [1] 6
nrow(pData(tv3_neutrophils))
## [1] 12
sum(pData(tv3_neutrophils)[["finaloutcome"]] == "cure")
## [1] 5
sum(pData(tv3_neutrophils)[["finaloutcome"]] == "failure")
## [1] 7

14.3 Cali

ncol(exprs(c_clinical))
## [1] 61
sum(pData(c_clinical)[["finaloutcome"]] == "cure")
## [1] 55
sum(pData(c_clinical)[["finaloutcome"]] == "failure")
## [1] 6
#all_types[["biopsy"]]
sum(pData(c_biopsies)[["finaloutcome"]] == "cure")
## [1] 4
sum(pData(c_biopsies)[["finaloutcome"]] == "failure")
## [1] 0
#all_types[["eosinophils"]]
sum(pData(c_eosinophils)[["finaloutcome"]] == "cure")
## [1] 15
sum(pData(c_eosinophils)[["finaloutcome"]] == "failure")
## [1] 0
nrow(pData(cv1_eosinophils))
## [1] 6
sum(pData(cv1_eosinophils)[["finaloutcome"]] == "cure")
## [1] 6
sum(pData(cv1_eosinophils)[["finaloutcome"]] == "failure")
## [1] 0
nrow(pData(cv2_eosinophils))
## [1] 5
sum(pData(cv2_eosinophils)[["finaloutcome"]] == "cure")
## [1] 5
sum(pData(cv2_eosinophils)[["finaloutcome"]] == "failure")
## [1] 0
nrow(pData(cv3_eosinophils))
## [1] 4
sum(pData(cv3_eosinophils)[["finaloutcome"]] == "cure")
## [1] 4
sum(pData(cv3_eosinophils)[["finaloutcome"]] == "failure")
## [1] 0
#all_types[["monocytes"]]
sum(pData(c_monocytes)[["finaloutcome"]] == "cure")
## [1] 18
sum(pData(c_monocytes)[["finaloutcome"]] == "failure")
## [1] 3
nrow(pData(cv1_monocytes))
## [1] 10
sum(pData(cv1_monocytes)[["finaloutcome"]] == "cure")
## [1] 9
sum(pData(cv1_monocytes)[["finaloutcome"]] == "failure")
## [1] 1
nrow(pData(cv2_monocytes))
## [1] 5
sum(pData(cv2_monocytes)[["finaloutcome"]] == "cure")
## [1] 4
sum(pData(cv2_monocytes)[["finaloutcome"]] == "failure")
## [1] 1
nrow(pData(cv3_monocytes))
## [1] 6
sum(pData(cv3_monocytes)[["finaloutcome"]] == "cure")
## [1] 5
sum(pData(cv3_monocytes)[["finaloutcome"]] == "failure")
## [1] 1
#all_types[["neutrophils"]]
sum(pData(c_neutrophils)[["finaloutcome"]] == "cure")
## [1] 18
sum(pData(c_neutrophils)[["finaloutcome"]] == "failure")
## [1] 3
nrow(pData(cv1_neutrophils))
## [1] 9
sum(pData(cv1_neutrophils)[["finaloutcome"]] == "cure")
## [1] 8
sum(pData(cv1_neutrophils)[["finaloutcome"]] == "failure")
## [1] 1
nrow(pData(cv2_monocytes))
## [1] 5
sum(pData(cv2_neutrophils)[["finaloutcome"]] == "cure")
## [1] 4
sum(pData(cv2_neutrophils)[["finaloutcome"]] == "failure")
## [1] 1
nrow(pData(cv3_neutrophils))
## [1] 7
sum(pData(cv3_neutrophils)[["finaloutcome"]] == "cure")
## [1] 6
sum(pData(cv3_neutrophils)[["finaloutcome"]] == "failure")
## [1] 1

15 An external dataset

One potentially interesting comparisons point, especially vis a vis the Biopsy samples, is to compare with another set of recent L. braziliensis infected biopsy samples. The following sets up an expressionset using the raw data from bioproject PRJNA525604.

Note 202409: I just added the scott tsv metadata to this container and thus to this data structure; this only works because the samples are nicely in the same order.

new_sample_sheet <- sm(
  suppressWarnings(gather_preprocessing_metadata(
    "sample_sheets/scott_sra_samples.xlsx", specification = make_rnaseq_spec())))
scott_metadata <- as.data.frame(readr::read_tsv("sample_sheets/scott_capsule_studydesign.tsv"))
## Rows: 28 Columns: 8
## -- Column specification --------------------------------------------------------
## Delimiter: "\t"
## chr (8): sample, disease, treatment_outcome, age, sex, DTH, lesion_size, Tim...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
new_meta <- cbind.data.frame(new_sample_sheet[["new_meta"]], scott_metadata)

external_cf <- create_expt(new_meta,
                           gene_info = hs_annot, file_column = "hisatcounttable") %>%
  set_expt_conditions(fact = "treatmentoutcome") %>%
    set_expt_batches(fact = "sex") %>%
    subset_expt(subset = "condition!='na'")
## Reading the sample metadata.
## The sample definitions comprises: 28 rows(samples) and 46 columns(metadata fields).
## Matched 21476 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 21481 features and 28 samples.
## The numbers of samples by condition are:
## 
##    cure failure      na 
##      14       7       7
## The number of samples by batch are:
## 
## female   male     na 
##      4     17      7
## The samples excluded are: SRR8668755, SRR8668756, SRR8668757, SRR8668758, SRR8668759, SRR8668760, SRR8668761.
## subset_expt(): There were 28, now there are 21 samples.
pData(external_cf)[["ParasiteSpecies"]] <- "lvbraziliensis"
save(list = "external_cf", file = glue("rda/tmrc3_external_cf-v{ver}.rda"))
data_structures <- c(data_structures, "external_cf")

biopsy_cf <- set_expt_conditions(tc_biopsies, fact = "finaloutcome")
## The numbers of samples by condition are:
## 
##    cure failure 
##      13       5
pData(biopsy_cf)[["lab"]] <- "Colombia"
pData(external_cf)[["lab"]] <- "Brazil"
pData(external_cf)[["finaloutcome"]] <- pData(external_cf)[["treatmentoutcome"]]

tmrc3_external <- combine_expts(external_cf, biopsy_cf) %>%
  set_expt_conditions(fact = "lab", colors = color_choices[["labs"]]) %>%
  set_expt_batches(fact = "finaloutcome")
## The numbers of samples by condition are:
## 
## failure    cure 
##      12      27
## Warning in combine_expts(external_cf, biopsy_cf): There appear to be NA values
## in the new expressionset.  Beware.
## The numbers of samples by condition are:
## 
##   Brazil Colombia 
##       21       18
## The number of samples by batch are:
## 
## failure    cure 
##      12      27
save(list = "tmrc3_external", file = glue("rda/tmrc3_external-v{ver}.rda"))
data_structures <- c(data_structures, "tmrc3_external")

tmrc3_external_species <- set_expt_conditions(
  tmrc3_external, fact = "ParasiteSpecies", colors = color_choices[["parasite"]]) %>%
  set_expt_batches(fact = "lab")
## The numbers of samples by condition are:
## 
## lvbraziliensis   lvpanamensis  notapplicable 
##             22             14              3
## Warning in set_expt_colors(new_expt, colors = colors): Colors for the following
## categories are not being used: lvguyanensis.
## The number of samples by batch are:
## 
##   Brazil Colombia 
##       21       18
save(list = "tmrc3_external_species", file = glue("rda/tmrc3_external_sepcies-v{ver}.rda"))
data_structures <- c(data_structures, "tmrc3_external_species")

## In my singularity container, this fails with a pthread problem, not doing quant here.
#tt <- normalize_expt(tmrc3_external_species, filter = TRUE, transform = "log2",
#                     convert = "cpm", norm = "quant")
tt <- normalize_expt(tmrc3_external_species, filter = TRUE, transform = "log2",
                     convert = "cpm", norm = "tmm")
## Removing 6904 low-count genes (14577 remaining).
## transform_counts: Found 7483 values equal to 0, adding 1 to the matrix.
plot_pca(tt)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by lvbraziliensis, lvpanamensis, notapplicable
## Shapes are defined by Brazil, Colombia.

confused <- set_expt_conditions(
  hs_expt, fact = "ParasiteSpecies", colors = color_choices[["parasite"]])
## The numbers of samples by condition are:
## 
## lvbraziliensis   lvguyanensis   lvpanamensis  notapplicable 
##             15              2            114             79

15.1 Ethnicity

tc_etnia_expt <- set_expt_conditions(
  tc_clinical, fact = "etnia", colors = color_choices[["ethnicity"]])
## The numbers of samples by condition are:
## 
##  afrocol indigena  mestiza 
##       91       46       47
save(list = "tc_etnia_expt", file = glue("rda/tmrc3_tc_etnia-v{ver}.rda"))
data_structures <- c(data_structures, "tc_etnia_expt")

t_etnia_expt <- set_expt_conditions(
  t_clinical, fact = "etnia", colors = color_choices[["ethnicity"]])
## The numbers of samples by condition are:
## 
##  afrocol indigena  mestiza 
##       76       19       28
save(list = "t_etnia_expt", file = glue("rda/tmrc3_t_etnia-v{ver}.rda"))
data_structures <- c(data_structures, "t_etnia_expt")

16 Bring back the parasites

haha I knew I should not have removed the following block. In previous iterations of this I included a datastructure which pulled in the parasite reads from all samples with ‘sufficient’ coverage. This is not very many samples, for the simple reason that the drug treatment basically works! As a result, we removed the following section from the container (also for space). Oh, I may need to copy some more count tables into the container recipe for this to work.

It should be noted (if anyone ever reads this), that I also did a version of all of these analyses where I explicitly made a concatenated database (genome/gff/CDS) of human and parasite references (e.g. for salmon/hisat/bwa/etc) and did all of this using it in order to satisfy myself that the various treatments are similar enough to be called the same (I just saw that block while hunting for this parasite data and thought it was worth noting).

In any event, the following is copy/pasted from my working tree:

16.1 Dataset: Parasite reads

Make an expressionset of the parasite reads in the TMRC3 samples and distinguish between the faux and real reads. E.g: Are there samples which definitively contain parasites?

Later, I manually went through the mappings of samples with a significant number of parasite reads in IGV with some TMRC2 known zymodeme samples. In many cases it is possible to state definitively the classification of the parasite which infected an individual.

Note: I am renaming the resulting data structures a little because we generally do not call things ‘tmrc2/tmrc3/etc’ in the container.

lp_expt <- create_expt(
  samplesheet,
  file_column = "lpanamensisv36hisatfile", gene_info = all_lp_annot) %>%
  subset_expt(coverage = 30000) %>%
  subset_expt(nonzero = 3000) %>%
  set_expt_conditions(fact = "typeofcells") %>%
  subset_expt(subset = "clinic!='undefined'") %>%
  sanitize_expt_pData("finaloutcome")
## Reading the sample metadata.
## Error in eval(expr, envir, enclos) : 
##   basic_string::substr: __pos (which is 8) > this->size() (which is 5)
## Did not find the column: sampleid.
## Setting the ID column to the first column.
## Dropped 69 rows from the sample metadata because the sample ID is blank.
## Warning in extract_metadata(metadata, id_column = id_column, ...): There were
## NA values in the condition column, setting them to 'undefined'.

## Warning in extract_metadata(metadata, id_column = id_column, ...): There were
## NA values in the condition column, setting them to 'undefined'.
## The sample definitions comprises: 254 rows(samples) and 88 columns(metadata fields).
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30156/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30185/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30186/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30178/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30179/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30221/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30222/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30223/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30224/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30269/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30148/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30149/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30253/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30150/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30140/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30138/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30176/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30153/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30151/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30234/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30235/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30270/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30225/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30226/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30227/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30228/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30229/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30230/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30231/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30232/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30233/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30209/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30210/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30211/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30212/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30213/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30216/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30214/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30215/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30271/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30273/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30275/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30272/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30274/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30276/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30254/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30255/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30256/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30277/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30239/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30240/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30278/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30279/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30280/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30257/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30258/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30281/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30283/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30284/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30282/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30050/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30285/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30071/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30056/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30052/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30113/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30105/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30058/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30164/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30080/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30094/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30119/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30059/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30060/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30061/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30062/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30063/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30051/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30064/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30065/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30162/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30066/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30067/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30117/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30057/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30069/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30082/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30103/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30122/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30169/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30093/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30107/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30170/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30096/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30083/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30115/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30118/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30180/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30121/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30196/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30165/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30194/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30166/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30195/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30048/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30054/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30046/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30070/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30049/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30055/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30047/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30191/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30053/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30068/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30171/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30192/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30139/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30188/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30158/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30132/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30160/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30157/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30189/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30183/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30167/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30123/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30181/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30072/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30133/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30078/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30116/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30184/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30076/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30159/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30129/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30088/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30172/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30134/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30174/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30137/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30161/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30142/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30175/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30190/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30145/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30143/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30168/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30197/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30146/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30182/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30199/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30198/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30266/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30268/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30286/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30249/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30252/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30250/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30251/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30245/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30246/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30247/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30248/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30244/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30201/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30200/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30203/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30202/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30205/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30204/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30152/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30177/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30155/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30154/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30241/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30242/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30237/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30206/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30136/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30207/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30238/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30074/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30217/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30208/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30077/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30219/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30218/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30079/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30260/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30220/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30262/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30261/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30135/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30173/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30264/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30263/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30144/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30147/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, : The
## file:
## /mnt/nfs/z1/sw/singularity/cure_fail_host_analyses/202410071816_outputs/preprocessing/TMRC30265/outputs/03hisat2_lpanamensis_v36/sno_gene_gene_id.count.xz
## has mismatched rownames.
## Warning in create_expt(samplesheet, file_column = "lpanamensisv36hisatfile", :
## Some samples were removed when cross referencing the samples against the count
## data.
## Warning in create_expt(samplesheet, file_column = "lpanamensisv36hisatfile", :
## There are some NAs in this data, the 'handle_nas' parameter may be required.
## Warning in create_expt(samplesheet, file_column = "lpanamensisv36hisatfile", :
## The following samples have no counts: TMRC30010, TMRC30185, TMRC30221,
## TMRC30222, TMRC30223, TMRC30234, TMRC30235, TMRC30225, TMRC30226, TMRC30227,
## TMRC30228, TMRC30229, TMRC30230, TMRC30231, TMRC30233, TMRC30209, TMRC30210,
## TMRC30211, TMRC30212, TMRC30213, TMRC30216, TMRC30214, TMRC30272, TMRC30274,
## TMRC30278, TMRC30279, TMRC30285, TMRC30145, TMRC30146, TMRC30207, TMRC30217,
## TMRC30219, TMRC30220, TMRC30144
## If the handle_na parameter is 'drop', this will result in an empty dataset.
## Matched 8778 annotations and counts.
## Bringing together the count matrix and gene information.
## Warning in create_expt(samplesheet, file_column = "lpanamensisv36hisatfile", :
## The following samples have no counts!
## TMRC30010TMRC30185TMRC30221TMRC30222TMRC30223TMRC30234TMRC30235TMRC30225TMRC30226TMRC30227TMRC30228TMRC30229TMRC30230TMRC30231TMRC30233TMRC30209TMRC30210TMRC30211TMRC30212TMRC30213TMRC30216TMRC30214TMRC30272TMRC30274TMRC30278TMRC30279TMRC30285TMRC30145TMRC30146TMRC30207TMRC30217TMRC30219TMRC30220TMRC30144
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 8778 features and 244 samples.
## The samples removed (and read coverage) when filtering samples with less than 30000 reads are:
## TMRC30001 TMRC30002 TMRC30003 TMRC30004 TMRC30005 TMRC30006 TMRC30007 TMRC30008 
##        12         8         9        16        25        29         3        16 
## TMRC30009 TMRC30010 TMRC30015 TMRC30011 TMRC30012 TMRC30013 TMRC30185 TMRC30186 
##        16         0      1476         5         9        13         0       852 
## TMRC30178 TMRC30179 TMRC30221 TMRC30222 TMRC30223 TMRC30224 TMRC30269 TMRC30148 
##       420       515         0         0         0         2        58       706 
## TMRC30149 TMRC30150 TMRC30140 TMRC30138 TMRC30176 TMRC30153 TMRC30151 TMRC30234 
##      4713       470       153       156      1158      1497       480         0 
## TMRC30235 TMRC30270 TMRC30225 TMRC30226 TMRC30227 TMRC30228 TMRC30229 TMRC30230 
##         0        21         0         0         0         0         0         0 
## TMRC30231 TMRC30232 TMRC30233 TMRC30018 TMRC30209 TMRC30210 TMRC30211 TMRC30212 
##         0         1         0       110         0         0         0         0 
## TMRC30213 TMRC30216 TMRC30214 TMRC30215 TMRC30271 TMRC30273 TMRC30275 TMRC30272 
##         0         0         0         1         4         2         2         0 
## TMRC30274 TMRC30276 TMRC30254 TMRC30255 TMRC30256 TMRC30277 TMRC30239 TMRC30240 
##         0         1       208      8435     15767         6       209       314 
## TMRC30278 TMRC30279 TMRC30280 TMRC30257 TMRC30019 TMRC30258 TMRC30281 TMRC30283 
##         0         0         3       427      2300      5685       548        18 
## TMRC30284 TMRC30282 TMRC30050 TMRC30285 TMRC30020 TMRC30056 TMRC30052 TMRC30113 
##         4         1       345         0      1150      2679      1416      3106 
## TMRC30105 TMRC30058 TMRC30164 TMRC30080 TMRC30119 TMRC30059 TMRC30060 TMRC30066 
##     17794      8032       424      2775       419      9107     13418      3141 
## TMRC30117 TMRC30082 TMRC30103 TMRC30122 TMRC30169 TMRC30029 TMRC30025 TMRC30107 
##      1186      4915     16417      6325      4501      2267       954     12245 
## TMRC30170 TMRC30032 TMRC30096 TMRC30028 TMRC30115 TMRC30118 TMRC30180 TMRC30014 
##      4781        22     16058        93      2048       747      2781         4 
## TMRC30196 TMRC30030 TMRC30021 TMRC30023 TMRC30026 TMRC30037 TMRC30031 TMRC30165 
##       687         3        88       120      5047         9         8       433 
## TMRC30027 TMRC30194 TMRC30033 TMRC30038 TMRC30166 TMRC30036 TMRC30024 TMRC30195 
##       108       198        36       208       496        11        49       458 
## TMRC30048 TMRC30034 TMRC30039 TMRC30054 TMRC30045 TMRC30046 TMRC30040 TMRC30070 
##     14152        21      1147     10956       334     16608       896     17528 
## TMRC30049 TMRC30035 TMRC30055 TMRC30191 TMRC30053 TMRC30041 TMRC30068 TMRC30171 
##     14002       153     16987      1532     17035       264     12531       370 
## TMRC30192 TMRC30139 TMRC30042 TMRC30188 TMRC30158 TMRC30132 TMRC30160 TMRC30157 
##       384       140       545     20820       284      1448       296     18641 
## TMRC30189 TMRC30183 TMRC30167 TMRC30123 TMRC30181 TMRC30133 TMRC30043 TMRC30078 
##       307     11681      1208       304       613      1599       571      4351 
## TMRC30116 TMRC30184 TMRC30076 TMRC30159 TMRC30129 TMRC30088 TMRC30172 TMRC30134 
##      7522     16796      2828       405       353     11379       383     15577 
## TMRC30174 TMRC30137 TMRC30161 TMRC30142 TMRC30175 TMRC30190 TMRC30145 TMRC30143 
##       644       389       300         4      1191       537         0         1 
## TMRC30168 TMRC30197 TMRC30146 TMRC30182 TMRC30199 TMRC30198 TMRC30266 TMRC30268 
##     14823       202         0       468     15264       158       822      3444 
## TMRC30249 TMRC30246 TMRC30244 TMRC30201 TMRC30200 TMRC30203 TMRC30202 TMRC30205 
##     14507      2826      1662       149        96       104       145       169 
## TMRC30204 TMRC30152 TMRC30155 TMRC30154 TMRC30242 TMRC30237 TMRC30206 TMRC30136 
##      1298       495       508       398     15023      2792       125      2170 
## TMRC30207 TMRC30238 TMRC30074 TMRC30217 TMRC30208 TMRC30077 TMRC30219 TMRC30218 
##         0       335     13616         0         1     11313         0         2 
## TMRC30079 TMRC30260 TMRC30220 TMRC30262 TMRC30261 TMRC30135 TMRC30173 TMRC30264 
##      6629       291         0       905       500      3906       898       309 
## TMRC30263 TMRC30144 TMRC30147 TMRC30265 
##       431         0         1       596
## subset_expt(): There were 244, now there are 32 samples.
## No samples have fewer than 3000 observed genes.
## The numbers of samples by condition are:
## 
##      Biopsy Eosinophils Macrophages   Monocytes Neutrophils 
##           8           1          17           1           5
## The samples excluded are: TMRC30061, TMRC30062, TMRC30063, TMRC30051, TMRC30064, TMRC30065, TMRC30162, TMRC30067, TMRC30057, TMRC30069, TMRC30286, TMRC30252, TMRC30250, TMRC30251, TMRC30245, TMRC30247, TMRC30248.
## subset_expt(): There were 32, now there are 15 samples.
visit_fact <- pData(lp_expt)[["visitnumber"]]
batch_na <- is.na(visit_fact)
visit_fact[batch_na] <- "undefined"
lp_expt <- set_expt_batches(lp_expt, fact = visit_fact)
## The number of samples by batch are:
## 
##  1  2  3 
## 11  2  2
save(list = "lp_expt", file = glue("rda/lp_expt_all_sanitized-v{ver}.rda"))
data_structures <- c(data_structures, "lp_expt")

The above block is similar in concept to the previous expressionset creation. It uses a different column and currently ignores the gene annotations. Given that many of the samples have essentially 0 reads, I set a cutoff of only 20 observed genes. Finally, I did a quick and dirty PCA plot of this peculiar data structure in the hopes of being able to ‘see’ the difference between what are assumed to be ‘real’ samples with a significant number of ‘real’ parasite reads vs. those samples which just have a couple of potentially spurious reads.

17 Save all data structures into one big pile

found_idx <- data_structures %in% ls()
if (sum(!found_idx) > 0) {
  not_found <- data_structures[!found_idx]
  warning("Some datastructures were not generated: ", toString(not_found), ".")
  data_structures <- data_structures[found_idx]
}
save(list = data_structures, file = glue("rda/tmrc3_data_structures-v{ver}.rda"))
pander::pander(sessionInfo())

R version 4.4.1 (2024-06-14)

Platform: x86_64-conda-linux-gnu

locale: C

attached base packages: stats4, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: BiocParallel(v.1.36.0), variancePartition(v.1.32.5), ruv(v.0.9.7.1), org.Lpanamensis.MHOMCOL81L13.v68.eg.db(v.2024.09), AnnotationDbi(v.1.64.1), tidyr(v.1.3.1), hpgltools(v.1.0), Matrix(v.1.6-5), SummarizedExperiment(v.1.32.0), GenomicRanges(v.1.54.1), GenomeInfoDb(v.1.38.6), IRanges(v.2.36.0), S4Vectors(v.0.40.2), MatrixGenerics(v.1.14.0), matrixStats(v.1.2.0), Biobase(v.2.62.0), BiocGenerics(v.0.48.1), glue(v.1.7.0), forcats(v.1.0.0) and dplyr(v.1.1.4)

loaded via a namespace (and not attached): splines(v.4.4.1), later(v.1.3.2), BiocIO(v.1.12.0), bitops(v.1.0-7), filelock(v.1.0.3), tibble(v.3.2.1), graph(v.1.80.0), XML(v.3.99-0.16.1), lifecycle(v.1.0.4), Rdpack(v.2.6), doParallel(v.1.0.17), fastcluster(v.1.2.6), edgeR(v.4.0.16), rprojroot(v.2.0.4), vroom(v.1.6.5), lattice(v.0.22-5), MASS(v.7.3-60.0.1), backports(v.1.4.1), magrittr(v.2.0.3), openxlsx(v.4.2.5.2), limma(v.3.58.1), plotly(v.4.10.4), sass(v.0.4.8), rmarkdown(v.2.25), jquerylib(v.0.1.4), yaml(v.2.3.8), httpuv(v.1.6.14), zip(v.2.3.1), minqa(v.1.2.6), cowplot(v.1.1.3), DBI(v.1.2.2), RColorBrewer(v.1.1-3), abind(v.1.4-5), pkgload(v.1.3.4), zlibbioc(v.1.48.0), EnvStats(v.2.8.1), Rtsne(v.0.17), purrr(v.1.0.2), RCurl(v.1.98-1.14), yulab.utils(v.0.1.7), rappdirs(v.0.3.3), sva(v.3.50.0), GenomeInfoDbData(v.1.2.11), pbkrtest(v.0.5.2), ggrepel(v.0.9.5), genefilter(v.1.84.0), testthat(v.3.2.1), annotate(v.1.80.0), codetools(v.0.2-19), DelayedArray(v.0.28.0), DOSE(v.3.28.2), xml2(v.1.3.6), tidyselect(v.1.2.0), farver(v.2.1.1), lme4(v.1.1-35.1), BiocFileCache(v.2.10.1), GenomicAlignments(v.1.38.2), jsonlite(v.1.8.8), ggsankey(v.0.0.99999), ellipsis(v.0.3.2), survival(v.3.5-8), iterators(v.1.0.14), foreach(v.1.5.2), tools(v.4.4.1), progress(v.1.2.3), Rcpp(v.1.0.12), gridExtra(v.2.3), SparseArray(v.1.2.4), mgcv(v.1.9-1), xfun(v.0.42), qvalue(v.2.34.0), numDeriv(v.2016.8-1.1), withr(v.3.0.0), fastmap(v.1.1.1), boot(v.1.3-29), fansi(v.1.0.6), caTools(v.1.18.2), digest(v.0.6.34), R6(v.2.5.1), mime(v.0.12), colorspace(v.2.1-0), GO.db(v.3.18.0), gtools(v.3.9.5), biomaRt(v.2.58.2), RSQLite(v.2.3.5), RhpcBLASctl(v.0.23-42), utf8(v.1.2.4), generics(v.0.1.3), data.table(v.1.15.0), corpcor(v.1.6.10), rtracklayer(v.1.62.0), prettyunits(v.1.2.0), httr(v.1.4.7), htmlwidgets(v.1.6.4), S4Arrays(v.1.2.0), pkgconfig(v.2.0.3), gtable(v.0.3.4), blob(v.1.2.4), XVector(v.0.42.0), remaCor(v.0.0.18), brio(v.1.1.4), htmltools(v.0.5.7), fgsea(v.1.28.0), GSEABase(v.1.64.0), scales(v.1.3.0), png(v.0.1-8), fANCOVA(v.0.6-1), knitr(v.1.45), tzdb(v.0.4.0), reshape2(v.1.4.4), rjson(v.0.2.21), nloptr(v.2.0.3), nlme(v.3.1-164), curl(v.5.2.0), cachem(v.1.0.8), stringr(v.1.5.1), KernSmooth(v.2.23-22), parallel(v.4.4.1), HDO.db(v.0.99.1), restfulr(v.0.0.15), desc(v.1.4.3), pillar(v.1.9.0), grid(v.4.4.1), vctrs(v.0.6.5), gplots(v.3.1.3.1), promises(v.1.2.1), dbplyr(v.2.4.0), xtable(v.1.8-4), waldo(v.0.5.2), evaluate(v.0.23), readr(v.2.1.5), GenomicFeatures(v.1.54.3), mvtnorm(v.1.2-4), cli(v.3.6.2), locfit(v.1.5-9.8), compiler(v.4.4.1), Rsamtools(v.2.18.0), rlang(v.1.1.3), crayon(v.1.5.2), labeling(v.0.4.3), plyr(v.1.8.9), fs(v.1.6.3), pander(v.0.6.5), stringi(v.1.8.3), viridisLite(v.0.4.2), lmerTest(v.3.1-3), munsell(v.0.5.0), Biostrings(v.2.70.2), lazyeval(v.0.2.2), aod(v.1.3.3), GOSemSim(v.2.28.1), hms(v.1.1.3), bit64(v.4.0.5), ggplot2(v.3.5.0), KEGGREST(v.1.42.0), statmod(v.1.5.0), varhandle(v.2.0.6), shiny(v.1.8.0), highr(v.0.10), rbibutils(v.2.2.16), broom(v.1.0.5), memoise(v.2.0.1), bslib(v.0.6.1), fastmatch(v.1.1-4) and bit(v.4.0.5)

message("This is hpgltools commit: ", get_git_commit())
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset e94559f9353874aac76346ceb4db55016a142abb
## This is hpgltools commit: Fri Sep 27 15:44:30 2024 -0400: e94559f9353874aac76346ceb4db55016a142abb
message("Saving to ", savefile)
## Saving to 01datasets.rda.xz
# tmp <- sm(saveme(filename = savefile))
tmp <- loadme(filename = savefile)

Bibliography

AnnotationDbi.” n.d. Bioconductor. http://bioconductor.org/packages/AnnotationDbi/. Accessed June 27, 2024.
“Homo Sapiens - Ensembl Genome Browser 100.” n.d. http://apr2020.archive.ensembl.org/Homo_sapiens/Info/Index. Accessed June 27, 2024.
Huber, Wolfgang, Vincent J. Carey, Robert Gentleman, Simon Anders, Marc Carlson, Benilton S. Carvalho, Hector Corrada Bravo, et al. 2015. “Orchestrating High-Throughput Genomic Analysis with Bioconductor.” Nature Methods 12 (2): 115–21. https://doi.org/10.1038/nmeth.3252.
Smedley, Damian, Syed Haider, Benoit Ballester, Richard Holland, Darin London, Gudmundur Thorisson, and Arek Kasprzyk. 2009. BioMart – Biological Queries Made Easy.” BMC Genomics 10 (1): 22. https://doi.org/10.1186/1471-2164-10-22.
SummarizedExperiment.” n.d. Bioconductor. http://bioconductor.org/packages/SummarizedExperiment/. Accessed June 27, 2024.
TriTrypDB Leishmania Panamensis, Version 46.” n.d. https://tritrypdb.org/common/downloads/release-46/LpanamensisMHOMCOL81L13/. Accessed June 27, 2024.
LS0tCnRpdGxlOiAiVE1SQzMgYHIgU3lzLmdldGVudignVkVSU0lPTicpYDogQ3JlYXRpbmcgRGF0YSBTdHJ1Y3R1cmVzIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpiaWJsaW9ncmFwaHk6IGF0Yi5iaWIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgbWF4LXdpZHRoOiAxNjAwcHg7Cn0KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnIgewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShnbHVlKQpsaWJyYXJ5KGhwZ2x0b29scykKbGlicmFyeSh0aWR5cikKCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIHdpZHRoID0gOTAsIGVjaG8gPSBUUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZXJyb3IgPSBUUlVFLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOCwgZmlnLnJldGluYSA9IDIsCiAgb3V0LndpZHRoID0gIjEwMCUiLCBkZXYgPSAicG5nIiwKICBkZXYuYXJncyA9IGxpc3QocG5nID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKSkKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHMgPSA0LCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbCA9ICJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemUgPSAxMikpCnZlciA8LSBTeXMuZ2V0ZW52KCJWRVJTSU9OIikKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0ID0gIiVZJW0lZCIpCgpybWRfZmlsZSA8LSAiMDFkYXRhc2V0cy5SbWQiCnNhdmVmaWxlIDwtIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLCByZXBsYWNlID0gIlxcLnJkYVxcLnh6IiwgeCA9IHJtZF9maWxlKQptZXRob2RzIDwtIGxpc3QoImJhc2ljIiA9IFRSVUUsICJkZXNlcSIgPSBUUlVFLCAiZHJlYW0iID0gRkFMU0UsCiAgICAgICAgICAgICAgICAiZWJzZXEiID0gRkFMU0UsICJlZGdlciIgPSBUUlVFLCAibGltbWEiID0gVFJVRSwgIm5vaXNlcSIgPSBUUlVFKQpkYXRhX3N0cnVjdHVyZXMgPC0gYygibWV0aG9kcyIpCmBgYAoKIyBUT0RPCgoxLiAgRW5zdXJlIG5vIGNvbHVtbnMgaGF2ZSBuYW1lcyBsaWtlICdldG5pYScgYnV0IGluc3RlYWQKICAgICdldGhuaWNpdHlfY2F0JwoyLiAgRGVjaWRlIGhvdyB0byBoYW5kbGUgdGhlIHJldGlyZW1lbnQgb2YgdHJpdHJ5cGRiLm9yZwoKIyBDaGFuZ2Vsb2cKCiogMjAyNDA4OiBNYWRlIGRlbW9ncmFwaGljcyBkYXRhIG1vcmUgYXZhaWxhYmxlIGZvciB0aGUgbmV3IHJlZ3Jlc3Npb24gYW5hbHlzZXMuCiogMjAyNDA1OiBSZXdvcmtlZCBoYW5kbGluZyBvZiB0aGUgZGVtb2dyYXBoaWNzIGRhdGEKKiAyMDIzMDg6IFNtYWxsIHJlb3JnYW5pemF0aW9uIHRvIG1vcmUgY2xvc2VseSBhZGhlcmUgdG8gdGhlIGZsb3cgb2YgdGhlIG1hbnVzY3JpcHQncyB0ZXh0LgoqIDIwMjMwNTogVXBkYXRlZCBkZWZhdWx0IGltYWdlIGZvcm1hdC4KKiAyMDIzMDQ6IEFkZGVkIGEgc2VyaWVzIG9mIHN0YW56YXMgcHJpbnRpbmcgb3V0IHRoZSBDYWxpLW9ubHkgZGF0YS4KKiBVcGRhdGVkIGlucHV0IG1ldGFkYXRhIHNoZWV0cwoKIyBOb3RlcwoKKiBJbnRlcmZlcm9uIHNjb3JlIGZvciBzZXZlcml0eS4gIEEgZmV3IGRpZmZlcmVudCBzZXRzIGFyZSBhdmFpbGFibGUsCiAgbWF5IG5lZWQgdG8gY2hvb3NlIGEgc3BlY2lmaWMgcGFwZXIsIHRoZW4gbW9kaWZ5IGl0PwoKIyBJbnRyb2R1Y3Rpb24KClRoaXMgZG9jdW1lbnQgdGFrZXMgdGhlIHZhcmlvdXMgb3V0cHV0cyBwcm9kdWNlZCBieQpzYWxtb24vaGlzYXQvaHRzZXEvZXRjIGFuZCBnZW5lcmF0ZXMgdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSB1c2VkIGluCmFsbCBvZiB0aGUgZm9sbG93aW5nIGFuYWx5c2VzLgoKIyMgTWV0YWRhdGEgU291cmNlcwoKUGVyaW9kaWNhbGx5LCB0aGUgc2hhcmVkIG1ldGFkYXRhIHNoZWV0IHdhcyBkb3dubG9hZGVkIGxvY2FsbHkgdG8gdGhlCnNhbXBsZV9zaGVldHMvIGRpcmVjdG9yeSwgZ2l2ZW4gYSBzdWZmaXggY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudAp3b3Jrc2hlZXQgcmV2aXNpb24sIGFuZCB0aGUgdmFyaW91cyB0cmltbWluZy9hbGlnbm1lbnQvZXRjIHN0YXRpc3RpY3MKd2VyZSBtYW51YWxseSBhZGRlZC4gIEZpbmFsbHksIHNvbWUgZGVtb2dyYXBoaWNzIHdlcmUKYXBwZW5kZWQgdG8gdGhlIHNhbXBsZSBtZXRhZGF0YS4gIFRoZSByZXN1bHRpbmcgbW9kaWZpZWQgbWV0YWRhdGEKd2FzIHVzZWQgYXMgdGhlIGlucHV0IGZvciBhbGwgZm9sbG93aW5nIGFuYWx5c2VzLgoKYGBge3J9CnNhbXBsZXNoZWV0IDwtICJzYW1wbGVfc2hlZXRzL3RtcmMzX3NhbXBsZXMueGxzeCIKdGVzdHRoYXQ6OmV4cGVjdF90cnVlKGZpbGUuZXhpc3RzKHNhbXBsZXNoZWV0KSkKZGVtb2dyYXBoaWNzIDwtICJzYW1wbGVfc2hlZXRzL3RtcmMzX2RlbW9ncmFwaGljc3YyLnhsc3giCmhzbHBfc2FtcGxlc2hlZXQgPC0gInNhbXBsZV9zaGVldHMvdG1yYzNfc2FtcGxlc19wcnVuZWQueGxzeCIKc3BlY2llc19pZGVudGl0aWVzIDwtICJzYW1wbGVfc2hlZXRzL2lkZW50aWZpZWRfcGFyYXNpdGVfc3BlY2llcy54bHN4IgpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJzYW1wbGVzaGVldCIsICJkZW1vZ3JhcGhpY3MiKQpgYGAKCiMgQW5ub3RhdGlvbiBDb2xsZWN0aW9uCgpUaGUgcHJpbWFyeSBhbm5vdGF0aW9uIHNvdXJjZXMgYXJlOgoKMS4gIEVuc2VtYmwncyBiaW9tYXJ0IGFyY2hpdmUgZnJvbSAyMDIwIGZvciBodW1hbiBhbm5vdGF0aW9ucyAoQEhvbW9TYXBpZW5zRW5zZW1ibGEpLgoyLiAgVGhlIFRyaVRyeXBEQiByZWxlYXNlIDM2IGZvciBwYXJhc2l0ZSBhbm5vdGF0aW9ucyAoQFRyaVRyeXBEQkxlaXNobWFuaWFQYW5hbWVuc2lzKS4KCkJvdGggcHJvdmlkZSBHTyBkYXRhLiAgVGhleSBhbHNvIHByb3ZpZGUgaGVscGZ1bCBsaW5rcyB0byBvdGhlciBkYXRhCnNvdXJjZXMuICBGb3IgdGhlIG1vbWVudCwgd2UgYXJlIGZvY3VzaW5nIG9uIHRoZSBodW1hbiBhbm5vdGF0aW9ucy4KSW4gdGhlIGZpcnN0IGluc3RhbmNlLCB0aGUgYW5ub3RhdGlvbnMgYXJlIGFjcXVpcmVkIHZpYSBzb21lIGZ1bmN0aW9ucwppbiBocGdsdG9vbHMgd2hpY2ggc2VlayB0byBtYWtlIGJpb21hUnQKKEBzbWVkbGV5QmlvTWFydEJpb2xvZ2ljYWxRdWVyaWVzMjAwOSkgYSBsaXR0bGUgbW9yZSByb2J1c3QuIEluIHRoZQpzZWNvbmQgaW5zdGFuY2UsIHRoZSBhbm5vdGF0aW9ucyBhcmUgZXh0cmFjdGVkIGZyb20gYSBsb2NhbGx5CmdlbmVyYXRlZCBvcmdEQi9hbm5vdGF0aW9uRGJpIChAQW5ub3RhdGlvbkRiaSkgaW5zdGFuY2UuCgojIyBHZW5lIGFubm90YXRpb25zCgpUaGVzZSBhbmFseXNlcyBoYXZlIGZvY3VzZWQgb24gZ2VuZS1sZXZlbCBhYnVuZGFuY2VzL2RpZmZlcmVuY2VzLgpUaHVzLCB3aGVuIGh0c2VxLWNvdW50IHdhcyBpbnZva2VkIGFnYWluc3QgdGhlIGhpc2F0Mi1iYXNlZCBtYXBwaW5ncywKcGFyYW1ldGVycyB3ZXJlIGNob3NlbiB0byBjb3VudCBnZW5lcyByYXRoZXIgdGhhbiB0cmFuc2NyaXB0cy4gIEluIHRoaXMKY29udGV4dCwgYSBnZW5lIHJlZmVycyB0byB0aGUgbm9uLXJlZHVuZGFudCB1bmlvbiBvZiB0aGUgdHJhbnNjcmlwdHMnIGV4b25zLgpTaW1pbGFybHksIHdoZW4gc2FsbW9uIGNvdW50cyB3ZXJlIHVzZWQgdmlhIHR4aW1wb3J0LCBhIG1hcHBpbmcgb2YKZ2VuZXMgdG8gdHJhbnNjcmlwdHMgd2FzIHVzZWQgdG8gY29sbGFwc2UgdGhlIG1hdHJpeCB0byBnZW5lLWxldmVsCmFidW5kYW5jZXMuICBUaGlzIGRlY2lzaW9uIG1heSBiZSByZXZpc2l0ZWQuCgpUaGUgcGFyYXNpdGUgYW5ub3RhdGlvbnMgd2VyZSBkb3dubG9hZGVkIGZyb20gdGhlIHRyaXRyeXBkYiB2aWEgdGhlCnByb3ZpZGVkIFJFU1QgaW50ZXJmYWNlLCBleHBvcnRlZCBpbnRvIGFuIE9yZ0RCIGluc3RhbmNlLCBhbmQKZXh0cmFjdGVkIHZpYSB0aGUgRXVQYXRoREIgcGFja2FnZS4KCmBgYHtyfQpoc19hbm5vdCA8LSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoeWVhciA9ICIyMDIwIiwgbW9udGggPSAiamFuIikKaHNfYW5ub3QgPC0gaHNfYW5ub3RbWyJhbm5vdGF0aW9uIl1dCiMjIFRoZSBuZXh0IHR3byBsaW5lcyBtYWtlIGEgYnJpZGdlIGJldHdlZW4gdGhlIGdmZiBmaWxlIHVzZWQgYnkgaGlzYXQyCiMjIGFuZCB0aGUgZ2VuZSBJRHMuCmBgYAoKVGhlIGZvbGxvd2luZyBsaW5lcyBtYXkgYmUgdXNlZCBpZiBvbmUgd2lzaGVzIHRvIHVzZSB0aGUgcmVsYXRpdmVseQpzdHJpY3QgSUQudmVyc2lvbiBzeXN0ZW0gKG9wdGlvbmFsbHkpIGVuZm9yY2VkIGJ5IHNhbG1vbi4gIEl0IHNob3VsZApiZSBub3RlZCB0aGF0IG5ld2VyIHZlcnNpb25zIG9mIHR4aW1wb3J0IGhhdmUgb3B0aW9ucyB3aGljaCBpZ25vcmUKdGhpcywgYW5kIEkgYWxzbyBub3cgaGF2ZSBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgc2V0IHRoZSBJRC52ZXJzaW9uIGZvcgp0aGUgZ2VuZSBhbm5vdGF0aW9ucyB0byBiZSB0aGUgc2FtZSBhcyB3aGF0IHdhcyBvYnNlcnZlZCBpbiB0aGUgY291bnQKdGFibGVzLiAgRWl0aGVyIG9mIHRob3NlIHN0cmF0ZWdpZXMgbWFrZXMgdGhlIGZvbGxvd2luZyBub3QgbmVjZXNzYXJ5OwpidXQgaWYgeW91IHdpc2ggdG8gYmUgYSBsaXR0bGUgYml0IHBlZGFudGljIGFib3V0IHRoZSBnZW5lPC0+VHggSURzLAp0aGVuIHRoaXMgc2hvdWxkIGdpdmUgeW91IGEgc2Vuc2Ugb2YgaG93IHdlbGwgbWF0Y2hlZCBhcmUgdGhlIGRvd25sb2FkZWQKYW5ub3RhdGlvbnMgYW5kIGdlbmUgSURzIHVzZWQgYnkgc2FsbW9uLgoKYGBge3J9CmhzX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBwYXN0ZTAocm93bmFtZXMoaHNfYW5ub3QpLCAiLiIsIGhzX2Fubm90W1sidmVyc2lvbiJdXSkKaHNfYW5ub3QgPC0gZ3JvdXBfbWVhbl9jZHNfbGVuZ3RoKGhzX2Fubm90KQpoc190eF9hbm5vdCA8LSBoc19hbm5vdCAjIyBNYWtlIGEgY29weSBzbyBJIGRvbid0IGxvc2UgdHJhbnNjcmlwdCBJRHMgZm9yIHNhbG1vbgpyb3duYW1lcyhoc19hbm5vdCkgPC0gbWFrZS5uYW1lcyhoc19hbm5vdFtbImVuc2VtYmxfZ2VuZV9pZCJdXSwgdW5pcXVlID0gVFJVRSkKbm90X3VuaXF1ZV9pZHggPC0gZ3JlcGwoeCA9IHJvd25hbWVzKGhzX2Fubm90KSwgcGF0dGVybiA9ICJcXC5cXGQrJCIpCmhzX2Fubm90IDwtIGhzX2Fubm90WyFub3RfdW5pcXVlX2lkeCwgXQpgYGAKCiMjIyBBbHNvIGNvbGxlY3QgcGFyYXNpdGUgYW5ub3RhdGlvbnMKClRoZSBmb2xsb3dpbmcgYmxvY2sgd2lsbCBzdG9wIHdvcmtpbmcgc29vbi4gIEl0cyBwdXJwb3NlIGlzIHRvCmRvd25sb2FkIHRoZSBjdXJyZW50IChvciBhIHNwZWNpZmljIHZlcnNpb24pIGFubm90YXRpb25zIGZyb20gb25lIG9mCnRoZSBldXBhdGhkYi5vcmcgd2Vic2l0ZXMuICBUaGVzZSBhcmUgYmVpbmcgcmV0aXJlZC9tb3ZlZCBzb29uLiAgTXkKdmVyc2lvbiBvZiB0aGUgRXVQYXRoREIgcGFja2FnZSBjcmVhdGVzIGluc3RhbGxhYmxlIG9yZ2RiIHBhY2thZ2VzOyBzbwpJIHByZXN1bWFibHkgd2lsbCBqdXN0IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgdGFyYmFsbHMgaW4gdGhlCnJlY2lwZSBmb3IgdGhpcyBjb250YWluZXIuICBJbiByZXNwb25zZSB0byB0aGUgcmV0aXJlbWVudCBvZiBldXBhdGhkYiwKSSBzcHVuIHVwIGFuIGluc3RhbmNlIG9mIG15IGV1cGF0aGRiIHBhY2thZ2UgdG8gZG93bmxvYWQgZXZlcnl0aGluZzsKaG9wZWZ1bGx5IGl0IHdpbGwgZmluaXNoIGJlZm9yZSB0aGUgdmFyaW91cyBzZXJ2ZXJzIGdvIGRvd24uICBJIHdhcwp0b28gbGF0ZSBmb3Igc2NoaXN0b2RiLCBpdCBpcyBhbHJlYWR5IG9mZmxpbmUgKEkgYW0gcHJldHR5IHN1cmUgSSBoYXZlCmFuIG9sZGVyIGNvcHkgdGhvdWdoKS4KCkdpdmVuIHRoYXQgSSByZWNlbnRseSBpbmNsdWRlZCB0aGUgcGFyYXNpdGUgdHJhbnNjcmlwdHMgdG8gdGhlIGRhdGEsIEkKc2hvdWxkIGFsc28gc3BlbmQgYSBtb21lbnQgYW5kIGZpZ3VyZSBvdXQgaG93IHRvIGluY2x1ZGUgdGhlCmFubm90YXRpb25zLgoKQXMgYSBzdGFydGluZyBwb2ludCwgSSB3aWxsIGp1c3QgZ3JhYiB0aGUgRXVQYXRoREIgcGFuYW1lbnNpcwphbm5vdGF0aW9ucy4gIEkgdGhpbmsgSSB3aWxsIG5lZWQgdG8gbGltaXQgdGhlbSB0byBqdXN0IHRoZSBzaGFyZWQKY29sdW1ucyBhbmQgZHJvcCB0aGUgcmVzdC4KCmBgYHtyLCBldmFsPUZBTFNFfQptZXRhIDwtIHNtKGRvd25sb2FkX2V1cGF0aF9tZXRhZGF0YSh3ZWJzZXJ2aWNlID0gInRyaXRyeXBkYiIpKQpwYW5hbWVuc2lzX2VudHJ5IDwtIGdldF9ldXBhdGhfZW50cnkoIk1IT00iLCBtZXRhZGF0YSA9IG1ldGFbWyJ2YWxpZCJdXSkKCnBhbmFtZW5zaXNfZGIgPC0gbWFrZV9ldXBhdGhfb3JnZGIocGFuYW1lbnNpc19lbnRyeSkKcGFuYW1lbnNpc19wa2cgPC0gcGFuYW1lbnNpc19kYltbInBrZ25hbWUiXV0KcGFja2FnZV9uYW1lIDwtIHBhbmFtZW5zaXNfZGJbWyJwa2duYW1lIl1dCmlmIChpcy5udWxsKHBhbmFtZW5zaXNfcGtnKSkgewogIHBhbmFtZW5zaXNfcGtnIDwtIHBhbmFtZW5zaXNfZGJbWyJvcmdkYl9uYW1lIl1dCiAgcGFja2FnZV9uYW1lIDwtIHBhbmFtZW5zaXNfcGtnCn0KdHQgPC0gbGlicmFyeShwYW5hbWVuc2lzX3BrZywgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQpwYW5hbWVuc2lzX3BrZyA8LSBnZXQwKHBhbmFtZW5zaXNfcGtnKQphbGxfZmllbGRzIDwtIGNvbHVtbnMocGFuYW1lbnNpc19wa2cpCmFsbF9scF9hbm5vdCA8LSBzbShsb2FkX29yZ2RiX2Fubm90YXRpb25zKAogICAgcGFuYW1lbnNpc19wa2csCiAgICBrZXl0eXBlID0gImdpZCIsCiAgICBmaWVsZHMgPSBjKCJhbm5vdF9nZW5lX2VudHJlel9pZCIsICJhbm5vdF9nZW5lX25hbWUiLAogICAgICAgICAgICAgICAiYW5ub3Rfc3RyYW5kIiwgImFubm90X2Nocm9tb3NvbWUiLCAiYW5ub3RfY2RzX2xlbmd0aCIsCiAgICAgICAgICAgICAgICJhbm5vdF9nZW5lX2xvY2F0aW9uX3RleHQiLCAiYW5ub3RfZ2VuZV9wcm9kdWN0IikpKSRnZW5lcwpgYGAKCk9rLCBJIGFkZGVkIHRoZSBvcmdkYiB0YXJiYWxsIGFuZCBhbiBlbnRyeSB0byBpbnN0YWxsIGl0IHRvIG15CmJvb3RzdHJhcCBmb3IgdGhpcyBjb250YWluZXIuICBTbyBsZXQgdXMgbG9hZCB0aGUgYW5ub3RhdGlvbnMgZm9yIG91cgpMZWlzaG1hbmlhbCBzdHJhaW4gb2YgaW50ZXJlc3QhCgpgYGB7cn0KcGFja2FnZV9uYW1lIDwtICJvcmcuTHBhbmFtZW5zaXMuTUhPTUNPTDgxTDEzLnY2OC5lZy5kYiIKdHQgPC0gbGlicmFyeShwYWNrYWdlX25hbWUsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkKcGFuYW1lbnNpc19wa2cgPC0gZ2V0MChwYWNrYWdlX25hbWUpCmFsbF9maWVsZHMgPC0gY29sdW1ucyhwYW5hbWVuc2lzX3BrZykKYWxsX2xwX2Fubm90IDwtIHNtKGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoCiAgcGFja2FnZV9uYW1lLAogIGtleXR5cGUgPSAiZ2lkIiwKICBmaWVsZHMgPSBjKCJhbm5vdF9nZW5lX2VudHJlel9pZCIsICJhbm5vdF9nZW5lX25hbWUiLAogICAgICAgICAgICAgImFubm90X3N0cmFuZCIsICJhbm5vdF9jaHJvbW9zb21lIiwgImFubm90X2Nkc19sZW5ndGgiLAogICAgICAgICAgICAgImFubm90X2dlbmVfbG9jYXRpb25fdGV4dCIsICJhbm5vdF9nZW5lX3Byb2R1Y3QiKSkpW1siZ2VuZXMiXV0KYGBgCgpUaGUgZm9sbG93aW5nIHdhcyBhZGRlZCB0byBzdXBwb3J0IHRoZSBwb3NzaWJpbGl0eSBvZiBtYWtpbmcgYSBzaW5nbGUKZXhwcmVzc2lvbnNldCB1c2luZyB0aGUgbWFwcGluZ3MgYWdhaW5zdCBhIGdlbm9tZSBvZiBjb25jYXRlbmF0ZWQgaGczOAphbmQgbHBhbmFtZW5zaXMgc2VxdWVuY2UuICBJbiBvcmRlciB0byBkbyB0aGF0LCBvbmUgbXVzdCBoYXZlIGFuCmFubm90YXRpb24gc2V0IHdpdGggY29uc2lzdGVudCBjb2x1bW5zIGFjcm9zcyBhbGwgZ2VuZXMgZnJvbSBib3RoCnNwZWNpZXMuCgpJIGFtIG5vdCBzdXJlIGlmIEkgY29waWVkIHRob3NlIGNvdW50IHRhYmxlcyB0byB0aGUgY29udGFpbmVyIChJCnN1c3BlY3QgSSBkaWQgbm90KSwgYnV0IEkgd2lsbCBsZWF2ZSB0aGUgY29kZSBoZXJlIGFzIGFuIGV4YW1wbGUgb2YKaG93IG9uZSBtaWdodCBtYWtlIGEgY29uY2F0ZW5hdGVkIGV4cHJlc3Npb25zZXQvc3VtbWFyaXplZGV4cGVyaW1lbnQuCgpgYGB7cn0KYWxsX2xwX2Fubm90W1siZW5kIl1dIDwtIGdzdWIoeCA9IGFsbF9scF9hbm5vdFtbImFubm90X2dlbmVfbG9jYXRpb25fdGV4dCJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICJeLipcXC5cXC4iLCByZXBsYWNlbWVudCA9ICIiKQphbGxfbHBfYW5ub3RbWyJlbmQiXV0gPC0gZ3N1Yih4ID0gYWxsX2xwX2Fubm90W1siZW5kIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIlxcKC4qJCIsIHJlcGxhY2VtZW50ID0gIiIpCmFsbF9scF9hbm5vdFtbImVuZCJdXSA8LSBnc3ViKHggPSBhbGxfbHBfYW5ub3RbWyJlbmQiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXFwsIiwgcmVwbGFjZW1lbnQgPSAiIikKYWxsX2xwX2Fubm90W1sic3RhcnQiXV0gPC0gZ3N1Yih4ID0gYWxsX2xwX2Fubm90W1siYW5ub3RfZ2VuZV9sb2NhdGlvbl90ZXh0Il1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXi4qOiIsIHJlcGxhY2VtZW50ID0gIiIpCmFsbF9scF9hbm5vdFtbInN0YXJ0Il1dIDwtIGdzdWIoeCA9IGFsbF9scF9hbm5vdFtbInN0YXJ0Il1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXFwuXFwuLiokIiwgcmVwbGFjZW1lbnQgPSAiIikKYWxsX2xwX2Fubm90W1sic3RhcnQiXV0gPC0gZ3N1Yih4ID0gYWxsX2xwX2Fubm90W1sic3RhcnQiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICJcXCwiLCByZXBsYWNlbWVudCA9ICIiKQphbGxfbHBfYW5ub3RbWyJtZWFuX2Nkc19sZW4iXV0gPC0gYWxsX2xwX2Fubm90W1siYW5ub3RfY2RzX2xlbmd0aCJdXQphbGxfbHBfYW5ub3RbWyJ2ZXJzaW9uIl1dIDwtIDEKYWxsX2xwX2Fubm90W1sidHJhbnNjcmlwdF92ZXJzaW9uIl1dIDwtIDEKYWxsX2xwX2Fubm90W1siaGduY19zeW1ib2wiXV0gPC0gIiIKYWxsX2xwX2Fubm90W1sidW5pcHJvdF9nbl9zeW1ib2wiXV0gPC0gIiIKYWxsX2xwX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBhbGxfbHBfYW5ub3RbWyJnaWQiXV0KYWxsX2xwX2Fubm90W1siZW5zZW1ibF90cmFuc2NyaXB0X2lkIl1dIDwtIGFsbF9scF9hbm5vdFtbImdpZCJdXQoKY29sbmFtZXMoaHNfdHhfYW5ub3QpCmNvbG5hbWVzKGFsbF9scF9hbm5vdCkKd2FudGVkX2NvbHVtbnMgPC0gYygiZ2lkIiwgImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsICJ2ZXJzaW9uIiwgInRyYW5zY3JpcHRfdmVyc2lvbiIsICJhbm5vdF9nZW5lX3Byb2R1Y3QiLAogICAgICAgICAgICAgICAgICAgICJnZW5lX3R5cGUiLCAiYW5ub3RfY2RzX2xlbmd0aCIsICJhbm5vdF9jaHJvbW9zb21lIiwgImFubm90X3N0cmFuZCIsICJzdGFydCIsCiAgICAgICAgICAgICAgICAgICAgImVuZCIsICJoZ25jX3N5bWJvbCIsICJ1bmlwcm90X2duX3N5bWJvbCIsICJ0cmFuc2NyaXB0IiwgIm1lYW5fY2RzX2xlbiIpCmFsbF9scF9hbm5vdCA8LSBhbGxfbHBfYW5ub3RbLCB3YW50ZWRfY29sdW1uc10KY29sbmFtZXMoYWxsX2xwX2Fubm90KSA8LSBjb2xuYW1lcyhoc190eF9hbm5vdCkKCmhzbHBfYW5ub3QgPC0gcmJpbmQoaHNfdHhfYW5ub3QsIGFsbF9scF9hbm5vdCkKYGBgCgpGaW5hbGx5LCBkdW1wIHRoZSBjdXJyZW50IGdlbmUgb250b2xvZ3kgZGF0YSBmcm9tIHRoZQpFdVBhdGhEQi1nZW5lcmF0ZWQgb3JnZGIgaW5zdGFuY2UuICBUaGlzIG1heSBiZSB1c2VkIGJ5Cmdvc2VxL3RvcGdvL2dvc3RhdHMvZXRjLi4uCgpKdXN0IGFzIGEgbGFyaywgZ3JhYiBvcnRob2xvZ3MgYWNyb3NzIHRoZSBFdVBhdGhEQiBhcyB3ZWxsIGluIHRoZQpmb2xsb3dpbmcgYmxvY2suCgpPbmUgbWlnaHQgcmVhc29uYWJseSBhc2sgd2h5IGluIHRoZSBoZWNrIHRoZSBnZW5lIElEIGNvbHVtbiB3YXMKY2hhbmdlZCB0byAnZW5zZW1ibF9nZW5lX2lkJywgdGhpcyBpcyB0byBtYWtlIGl0IGVhc2llciAocG9zc2libGUpIHRvCm1lcmdlIHRoZXNlIGFubm90YXRpb25zIHdpdGggdGhlIGVuc2VtYmwgaHVtYW4gYW5ub3RhdGlvbnMsIGlmIG9uZQpjaG9vc2VzIHRvIGNvbWJpbmUgdGhlIHR3byBnZW5vbWVzIGFuZCBleGFtaW5lIHRoZW0gdG9nZXRoZXIuCgpgYGB7cn0KbHBfZ28gPC0gbG9hZF9vcmdkYl9nbyhwYWNrYWdlX25hbWUpCmxwX2dvIDwtIGxwX2dvWywgYygiR0lEIiwgIkdPIildCmxwX2xlbmd0aHMgPC0gYWxsX2xwX2Fubm90WywgYygiZW5zZW1ibF9nZW5lX2lkIiwgIm1lYW5fY2RzX2xlbiIpXQpjb2xuYW1lcyhscF9sZW5ndGhzKSAgPC0gYygiZ2lkIiwgImxlbmd0aCIpCmFsbF9scF9hbm5vdFtbImRlc2NyaXB0aW9uIl1dIDwtIHRvbG93ZXIoYWxsX2xwX2Fubm90W1siZGVzY3JpcHRpb24iXV0pCgojIyBleHRyYWN0X2V1cGF0aF9vcnRob2xvZ3MgaXMgZnJvbSBFdVBhdGhEQiBhbmQgaXNuJ3QgcmVhbGx5CiMjIGJlaW5nIHVzZWQgZm9yIGFueXRoaW5nIGluIHRoaXMgZG9jdW1lbnQgYWZhaWsuCiMjb3J0aG9zIDwtIGV4dHJhY3RfZXVwYXRoX29ydGhvbG9ncyhkYiA9IHBhbmFtZW5zaXNfcGtnKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJscF9sZW5ndGhzIiwgImxwX2dvIiwgImFsbF9scF9hbm5vdCIsICJtZXRhIikKYGBgCgojIyMgU2V0IHVwIGdlbmUtPnRyYW5zY3JpcHQgbWFwcGluZ3MKCk9uZSBzaG91bGQgcGF5IGNhcmVmdWwgYXR0ZW50aW9uIHRvIHRoZSBjb2x1bW5zIHVzZWQgdG8gY29uY2F0ZW5hdGUKdGhlIGdlbmUvdmVyc2lvbiBhbmQgdHJhbnNjcmlwdC92ZXJzaW9uLiAgSWYgdGhlc2UgZG8gbm90IG1hdGNoCmV4YWN0bHksIG1hbnkgZ2VuZXMgd2lsbCBiZSBkcm9wcGVkIGJ5IHR4aW1wb3J0IHdpdGhvdXQgYW55IG91dHB1dCB0bwpzaWduaWZ5IHNvbWV0aGluZyBpcyB3cm9uZy4KCk5vdGUgdG8gc2VsZiwgSSBtYWRlIGEgZnVuIGZ1bmN0aW9uIHdoaWNoIGdyYWJzIHRoZSBpZHMgZnJvbSBzYWxtb24KcmVzdWx0cy4gIEluIGFkZGl0aW9uIEkgZm91bmQgdGhhdCB0eGltcG9ydCBjYW4gb3B0aW9uYWxseSBpZ25vcmUKdGhlbS4KCmBgYHtyfQojIyBUaGUgdHhfZ2VuZV9tYXAgaXMgdXNlZCBmb3IgdHhpbXBvcnQgYW5kIHNhbG1vbiBxdWFudGlmaWNhdGlvbnMuCmhzX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBwYXN0ZTAocm93bmFtZXMoaHNfYW5ub3QpLCAiLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNfYW5ub3RbWyJ0cmFuc2NyaXB0X3ZlcnNpb24iXV0pCnJvd25hbWVzKGhzX2Fubm90KSA8LSBtYWtlLm5hbWVzKGhzX2Fubm90W1siZW5zZW1ibF9nZW5lX2lkIl1dLCB1bmlxdWUgPSBUUlVFKQpoc190eF9nZW5lX21hcCA8LSBoc19hbm5vdFssIGMoInRyYW5zY3JpcHQiLCAiZW5zZW1ibF9nZW5lX2lkIildCmBgYAoKIyMgR2VuZSBvbnRvbG9neSBkYXRhCgpUaGUgc2V0IG9mIEdPIGNhdGVnb3JpZXMgaGFzIG5vdCBiZWVuIGxpbWl0ZWQgdG8gdGhlIDIwMjAgZGF0YSBhdCB0aGUKdGltZSBvZiB0aGlzIHdyaXRpbmcuICBUaGUgR08gY2F0ZWdvcmllcyBpcyBjb2xsZWN0ZWQgYWxvbmcgd2l0aApsZW5ndGhzIGZvciBnb3NlcS4gIFRoZSBvdGhlciBtZXRob2RzIGVpdGhlciBoYXZlIGJ1aWx0LWluIGRhdGFiYXNlcwpvZiBodW1hbiBkYXRhIChnUHJvZmlsZXIpIG9yIHN1cHBvcnQgb3JnREIgZGF0YSAob3JnLkhzLmVnLmRiKQooY2x1c3RlclByb2ZpbGVyL3RvcEdPL2dvc3RhdHMpLgoKYGBge3J9CmhzX2dvIDwtIHRyeShsb2FkX2Jpb21hcnRfZ28oKVtbImdvIl1dKQppZiAoInRyeS1lcnJvciIgJWluJSBjbGFzcyhoc19nbykpIHsKICBoc19nbyA8LSBOVUxMCn0KCmhzX2xlbmd0aCA8LSBoc19hbm5vdFssIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJjZHNfbGVuZ3RoIildCmNvbG5hbWVzKGhzX2xlbmd0aCkgPC0gYygiSUQiLCAibGVuZ3RoIikKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiaHNfbGVuZ3RoIiwgImhzX2dvIiwgImhzX2Fubm90IikKYGBgCgojIERhdGFzZXQ6IENyZWF0ZSB0aGUgcGFyZW50IGRhdGEgc3RydWN0dXJlIG9mIGFsbCBzYW1wbGVzCgpCZWZvcmUgd2UgZG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgc3Vic2V0cy9hbmFseXNlcyBvZiB0aGUgZGF0YSwgd2UKbmVlZCB0byBjb2xsZWN0IGl0IGFsbCBpbiBvbmUgcGxhY2UuICBMZXQncyBkbyB0aGF0IGhlcmUgYW5kIG5hbWUgaXQKJ2hzX2V4cHQnLCBpdCB3aWxsIGNvbXByaXNlIHRoZSBmdWxsIHNldCBvZiBodW1hbiBkYXRhLiAgV2hlbiB3ZSBjdWxsCnNvbWUgc2FtcGxlcyBpdCB3aWxsIGJlIHJlbmFtZWQgdG8gJ2hzX3ZhbGlkJy4KClRoZSB2YXJpYWJsZSAnZGF0YV9zdHJ1Y3R1cmVzJyB3aWxsIGNvbnRhaW4gdGhlIG5hbWVzIG9mIGV2ZXJ5CnZhcmlhYmxlIEkgY3JlYXRlIGluIHRoaXMgZG9jdW1lbnQgd2hpY2ggSSB3aXNoIHRvIHNhdmUgdG8gZGlzay4KClNpbWlsYXJseSwgdGhlIGNoYXJhY3RlciB2ZWN0b3IgJ3Nhbml0aXplX2NvbHVtbnMnIGlzIHRoZSBsaXN0IG9mCm1ldGFkYXRhIGNvbHVtbnMgb3ZlciB3aGljaCBJIHdpbGwgaXRlcmF0ZSBhbmQgc2FuaXRpemUgdGhlIGRhdGEsCnJlbW92aW5nIGFueSBzcHVyaW91cyBzcGFjZXMsIGNhcGl0YWxpemF0aW9uLCBldGMuCgojIyBDcmVhdGUgRXhwcmVzc2lvbnNldAoKVGhlIHByaW1hcnkgZnVuY3Rpb24gdXNlZCBpcyAnY3JlYXRlX2V4cHQoKScsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvcgpjb21iaW5pbmcgdGhlIG1ldGFkYXRhIChmcm9tIHRoZSBmaXJzdCBibG9jayBvZiBjb2RlKSwgdGhlIGdlbmUKYW5ub3RhdGlvbnMgKGZyb20gdGhlIDJuZC8zcmQpLCBhbmQgY291bnQgdGFibGVzIChpbmNsdWRlZCBpbiB0aGUKbWV0YWRhdGEgYXMgYSBjb2x1bW4gb2YgZmlsZW5hbWVzKSBpbnRvIGEgc2luZ2xlIGV4cHJlc3Npb25zZXQKKEBodWJlck9yY2hlc3RyYXRpbmdIaWdodGhyb3VnaHB1dEdlbm9taWMyMDE1KS4gIFRoZSBzYW5pdGl6ZV9jb2x1bW5zCnZhcmlhYmxlIGRlZmluZXMgdGhlIG1ldGFkYXRhIGNvbHVtbnMgd2hpY2ggd2lsbCBiZSBleHBsaWNpdGx5CnNhbml0aXplZCBiZXlvbmQgdGhlIGdlbmVyYWwgY2hlY2tzIHBlcmZvcm1lZC4gJ3N1YnNldF9nZW5lcygpJyBpcwpyZXNwb25zaWJsZSBmb3IgaW5jbHVkaW5nIF9vbmx5XyB0aGUgcHJvdGVpbiBjb2RpbmcgZ2VuZXMgaW4gdGhlIGRhdGE7Cml0IHJlY29yZHMgdGhlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBsb3N0IHRvIHRoZSBtZXRhZGF0YSBhcyBjb2x1bW4KJ25jcm5hX2xvc3QnLiAnc2FuaXRpemVfbWV0YWRhdGEoKScgd2lsbCBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcyBvZgp0aGUgbWV0YWRhdGEgdG8gZW5zdXJlIHRoYXQgZXhjZWwgZGlkIG5vdCBkbyBhbnl0aGluZyB1bnRvd2FyZCB0byB0aGUKbWV0YWRhdGEuIFRoZSAnc2V0X2V4cHRfKigpJyBmdW5jdGlvbnMgbW9kaWZ5IHRoZSBtZXRhZGF0YSB0byBtYWtlIGl0Cm1vcmUgZnJpZW5kbHkgZm9yIGZ1dHVyZSB0YXNrcywgaW5jbHVkaW5nIHNldHRpbmcgc29tZSBjb2x1bW5zIHRvCmZhY3RvcnMsIGRlZmluaW5nIHRoZSBjb2x1bW4gb2YgaW50ZXJlc3QgdnMuIGtub3duIHN1cnJvZ2F0ZShzKS4KRmluYWxseSwgJ3N1YnNldF9leHB0KCknIGlzIHVzZWQgdG8gZHJvcCBzYW1wbGVzIHdoaWNoIGFyZSBrbm93biB0bwpub3QgYmUgb2YgaW50ZXJlc3QsIGxpa2UgdGhlIGZldyBzYW1wbGVzIGZyb20gcGVvcGxlIHdobyBwcmVzZW50ZWQgYXMKaGVhbHRoeSBpbiB0aGUgY2xpbmljICh3aGVuIHRoZSBjbGluaWNhbHByZXNlbnRhdGlvbiBjb2x1bW4gb2YgdGhlCm1ldGFkYXRhIGlzICdoJykuCgpPbmUgbm90ZSBpZiBhbnlvbmUgYWN0dWFsbHkgcmVhZHMgdGhpcywgSSBoYXZlIGEgc2lzdGVyIGZ1bmN0aW9uIHdoaWNoCmNyZWF0ZXMgc3VtbWFyaXplZEV4cGVyaW1lbnRzIChAU3VtbWFyaXplZEV4cGVyaW1lbnQpIGluc3RlYWQgb2YKZXhwcmVzc2lvblNldHMsIGFuZCBJIHRoaW5rIGFsbCBvZiBteSBjb2RlIHNob3VsZCBtb3ZlIHRvIHRoYXQ7IGJ1dCBpdApqdXN0IGhhcyBub3QgaGFwcGVuZWQgYmVjYXVzZSBJIGp1c3QgaGF2ZW4ndCBoYWQgYSBjaGFuY2UgdG8gZmluaXNoCndyaXRpbmcgdGhlIHRlc3RzIGFuZCBtYWtpbmcgd2hhdGV2ZXIgbGl0dGxlIGNoYW5nZXMgd291bGQgYmUgcmVxdWlyZWQKdG8gZ2V0IHRoZW0gdG8gYWxsIHBhc3MuICBJZiBteSBmaWN0aXRpb3VzIHJlYWRlciBpcyBpbnRlcmVzdGVkLCBJCndvdWxkIGxvdmUgaGVscCBjb21wbGV0aW5nIHRoZSBzd2l0Y2ggZnJvbSBleHBycy0+c2UuCgpgYGB7cn0Kc2FuaXRpemVfY29sdW1ucyA8LSBjKCJ2aXNpdG51bWJlciIsICJmaW5hbG91dGNvbWUiLCAiZG9ub3IiLAogICAgICAgICAgICAgICAgICAgICAgInR5cGVvZmNlbGxzIiwgImNsaW5pY2FscHJlc2VudGF0aW9uIiwgImRydWciLAogICAgICAgICAgICAgICAgICAgICAgImNvbmRpdGlvbiIsICJiYXRjaCIsICJjbGluaWMiKQpoc19leHB0IDwtIGNyZWF0ZV9leHB0KHNhbXBsZXNoZWV0LAogICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uID0gImhnMzgxMDBoaXNhdGZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgIHNhdmVmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2hzX2V4cHRfYWxsX3Jhdy12e3Zlcn0ucmRhIiksCiAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvID0gaHNfYW5ub3QpICU+JQogIHN1YnNldF9nZW5lcyhjb2x1bW4gPSAiZ2VuZV9iaW90eXBlIiwgbWV0aG9kID0gImtlZXAiLAogICAgICAgICAgICAgICBwYXR0ZXJuID0gInByb3RlaW5fY29kaW5nIiwgbWV0YV9jb2x1bW4gPSAibmNybmFfbG9zdCIpICU+JQogIHNhbml0aXplX2V4cHRfcERhdGEoY29sdW1ucyA9IHNhbml0aXplX2NvbHVtbnMpICAlPiUKICBzZXRfZXhwdF9mYWN0b3JzKGNvbHVtbnMgPSBzYW5pdGl6ZV9jb2x1bW5zLCBjbGFzcyA9ICJmYWN0b3IiKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInZpc2l0bnVtYmVyIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInR5cGVvZmNlbGxzIT0ncGJtY3MnIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInR5cGVvZmNlbGxzIT0nbWFjcm9waGFnZXMnIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pY2FscHJlc2VudGF0aW9uIT0naCciKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJoc19leHB0IikKCiMjIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG1ha2UgdmlzaXQgMSB0aGUgbGFyZ2VzdCBpZiBvbmUgdXNlcyB0aGF0IGNvbHVtbiBhcyBhIHNpemUgZmFjdG9yIHdoZW4gcGxvdHRpbmcuCm1ldGEgPC0gcERhdGEoaHNfZXhwdCkgJT4lCiAgbXV0YXRlKHZpc2l0bnVtYmVyID0gZmN0X3JlbGV2ZWwodmlzaXRudW1iZXIsIGMoIjMiLCAiMiIsICIxIikpKQpzdGFydF9vcmRlciA8LSByb3duYW1lcyhtZXRhKQojIyBJbmNvcnBvcmF0ZSB0aGUgaWRlbnRpZmllZCBzdHJhaW5zCmlkZW50aWZpZWQgPC0gb3Blbnhsc3g6OnJlYWQueGxzeChzcGVjaWVzX2lkZW50aXRpZXMpCm5vX2RhdGFfaWR4IDwtIGlkZW50aWZpZWRbWyJTcGVjaWVzIl1dID09ICJObyBoYXkgZGF0byIKaWRlbnRpZmllZCA8LSBpZGVudGlmaWVkWyFub19kYXRhX2lkeCwgXQppZGVudGlmaWVkIDwtIGlkZW50aWZpZWRbLCBjKCJQYXRpZW50IiwgIlNwZWNpZXMiKV0KY29sbmFtZXMoaWRlbnRpZmllZCkgPC0gYygiUGF0aWVudCIsICJQYXJhc2l0ZVNwZWNpZXMiKQptZXRhIDwtIG1lcmdlKG1ldGEsIGlkZW50aWZpZWQsIGJ5LnggPSAidHViZWxhYmVsb3JpZ2luIiwgYnkueSA9ICJQYXRpZW50IiwgYWxsLnggPSBUUlVFKQptZXRhIDwtIHNhbml0aXplX21ldGFkYXRhKG1ldGEsIGNvbHVtbnMgPSAiUGFyYXNpdGVTcGVjaWVzIiwgc3BhY2VzID0gVFJVRSkKIyMgTm90ZSB0aGF0IHRoZSBtZXJnZSByZW1vdmVzIHRoZSByb3duYW1lcyBhbmQgbWF5YmUgY2hhbmdlcyBzYW1wbGUgb3JkZXIuCnJvd25hbWVzKG1ldGEpIDwtIG1ldGFbWyJ0bXJjaWRlbnRpZmllciJdXQptZXRhIDwtIG1ldGFbc3RhcnRfb3JkZXIsIF0KCnBEYXRhKGhzX2V4cHQpIDwtIG1ldGEKc2F2ZShsaXN0ID0gImhzX2V4cHQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2hzX2V4cHRfYWxsX3Nhbml0aXplZC12e3Zlcn0ucmRhIikpCmBgYAoKIyMgQWRkIHRoZSBwYXRpZW50IGRlbW9ncmFwaGljcwoKVGhlcmUgYXJlIHNvbWUgcGFyYW1ldGVycyBwcm92aWRlZCBieSB0aGUgY2xpbmljaWFucyB3aGljaCBtYXkgcHJvdmUKdG8gYmUgb2YgaW50ZXJlc3QuICBJIHRoZXJlZm9yZSBhbSBhZGRpbmcgdGhlIGRlbW9ncmFwaGljcyBoZXJlLiAgSQp3aWxsIGFsc28gcnVuIHNvbWUgc2ltcGxlIGNoZWNrcyB0byB0cnkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCmNsaW5pY2lhbidzIG1ldGFkYXRhIGFncmVlcyB3aXRoIHRoZSBzYW1wbGUgbWV0YWRhdGEuCgpJbiB0aGlzIGZpcnN0IGJsb2NrLCByZWFkIHRoZSBkZW1vZ3JhcGhpY3MgYW5kIHNhbml0aXplIG91dCB0aGUKZW5jb2RlZCBOQXMgKDk5OSBhbmQgODg4IG9yIHdoYXRldmVyKSBhbmQgYWRkIGEgY29sdW1uIHRvIGpvaW4gaXQgdG8KdGhlIHNhbXBsZSBzaGVldCBkYXRhLgoKYGBge3J9CmhzX2RlbW9ncmFwaGljcyA8LSBvcGVueGxzeDo6cmVhZC54bHN4KGRlbW9ncmFwaGljcykKaHNfZGVtb2dyYXBoaWNzW1siam9pbiJdXSA8LSB0b2xvd2VyKGhzX2RlbW9ncmFwaGljc1tbIlBhdGllbnRfSUQiXV0pCgpjb2x1bW5zX3dpdGhfZW5jb2RlZF9uYSA8LSBjKCJBZGhlcmVuY2VfR2x1Y2FudGltZSIsICJBZGhlcmVuY2VfTWlsdGVmb3NpbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbF9BbXB1bGVzX1ByZXNjcmliZWRfTWlsdCIsICJQcmVzY3JpYmVkX0RhaWx5X0Rvc2VfTWlsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRvdGFsX0FtcHVsZXNfUHJlc2NyaWJlZF9HbHVjIiwgIlByZXNjcmliZWRfRGFpbHlfRG9zZV9HbHVjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjVfVG90YWxfQXJlYV9VbGNlciIsICJWNV9WZXJ0aWNhbF9BeGlzX1VsY2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjVfSG9yaXpvbnRhbF9BeGlzX1VsY2VyIiwgIlY1X1RvdGFsX0FyZWFfTGVzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjVfVmVydGljYWxfQXhpc19MZXNpb24iLCAiVjVfSG9yaXpvbnRhbF9BeGlzX0xlc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlY0X1RvdGFsX0FyZWFfVWxjZXIiLCAiVjRfVmVydGljYWxfQXhpc19VbGNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlY0X0hvcml6b250YWxfQXhpc19VbGNlciIsICJWNF9Ub3RhbF9BcmVhX0xlc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlY0X1ZlcnRpY2FsX0F4aXNfTGVzaW9uIiwgIlY0X0hvcml6b250YWxfQXhpc19MZXNpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWM19Ub3RhbF9BcmVhX1VsY2VyIiwgIlYzX1ZlcnRpY2FsX0F4aXNfVWxjZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWM19Ib3Jpem9udGFsX0F4aXNfVWxjZXIiLCAiVjNfVG90YWxfQXJlYV9MZXNpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWM19WZXJ0aWNhbF9BeGlzX0xlc2lvbiIsICJWM19Ib3Jpem9udGFsX0F4aXNfTGVzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjJfVG90YWxfQXJlYV9VbGNlciIsICJWMl9WZXJ0aWNhbF9BeGlzX1VsY2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjJfSG9yaXpvbnRhbF9BeGlzX1VsY2VyIiwgIlYyX1RvdGFsX0FyZWFfTGVzaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjJfVmVydGljYWxfQXhpc19MZXNpb24iLCAiVjJfSG9yaXpvbnRhbF9BeGlzX0xlc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlY1X05ld19MZXNpb25zIiwgIlY0X05ld19MZXNpb25zIiwgIlYzX05ld19MZXNpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVjJfTmV3X0xlc2lvbnMiKQpmb3IgKGNvbCBpbiBjb2x1bW5zX3dpdGhfZW5jb2RlZF9uYSkgewogIG5hX2lkeCA8LSBoc19kZW1vZ3JhcGhpY3NbW2NvbF1dID09IDk5OQogIG1lc3NhZ2UoIkNvbHVtbiAiLCBjb2wsICIgY29udGFpbnMgIiwgc3VtKG5hX2lkeCksICIgZW5jb2RlZCBOQSB2YWx1ZXMuIikKICBoc19kZW1vZ3JhcGhpY3NbbmFfaWR4LCBjb2xdIDwtIE5BCn0KCmZhY3Rvcl9jb2x1bW5zIDwtIGMoIlNleCIsICJFdGhuaWNpdHkiLCAiSW5mZWN0aW9uX0xvY2F0aW9uIiwgIlByZXZpb3VzbHlfRGlhZ25vc2VkIiwKICAgICAgICAgICAgICAgICAgICAiQWR2ZXJzZV9FZmZlY3RzX1YzIiwgIkFkdmVyc2VfRWZmZWN0c19WNCIsICJUaGVyYXBldXRpY19PdXRjb21lX1YzIiwKICAgICAgICAgICAgICAgICAgICAiVGhlcmFwZXV0aWNfT3V0Y29tZV9WNCIsICJUaGVyYXBldXRpY19PdXRjb21lX1Y1IiwKICAgICAgICAgICAgICAgICAgICAiVGhlcmFwZXV0aWNfT3V0Y29tZV9GaW5hbCIpCmZvciAoY29sIGluIGZhY3Rvcl9jb2x1bW5zKSB7CiAgaHNfZGVtb2dyYXBoaWNzW1tjb2xdXSA8LSBhcy5mYWN0b3IoaHNfZGVtb2dyYXBoaWNzW1tjb2xdXSkKfQoKIyMgRXh0cmFjdCB0aGUgY2xpbmljIGZyb20gdGhlIHBhdGllbnQgaWQgdmlhIGEgY2hlZXNlYmFsbCByZWdleC4KaHNfZGVtb2dyYXBoaWNzW1siQ2xpbmljIl1dIDwtIGdzdWIoeCA9IGhzX2RlbW9ncmFwaGljc1tbIlBhdGllbnRfSUQiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXlNVKFxcZCl7MX0uKiQiLCByZXBsYWNlbWVudCA9ICJcXDEiKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJoc19kZW1vZ3JhcGhpY3MiKQpgYGAKCiMjIEdldCB0aGUgU2FtcGxlIHNoZWV0IGRhdGEgcmVhZHkgZm9yIGpvaW5pbmcgYW5kIHBlcmZvcm0gdGhlIG1lcmdlCgpJbiB0aGUgZm9sbG93aW5nIHdlIGFkZCBhIGNvbHVtbiAnam9pbicgYW5hbGFnb3VzIHRvIHRoYXQgYWRkZWQgdG8gdGhlCmRlbW9ncmFwaGljcywgdGhpcyB3aWxsIGJlIHVzZWQgdG8gYWRkIHRoZSB2YXJpb3VzIGNvbHVtbnMgYWNyb3NzIGVhY2gKcGVyc29uJ3Mgc2FtcGxlcy4gIEkgZ3Vlc3MgSSBjb3VsZCBoYXZlIGRvbmUgdGhpcyB3aXRoIG1lcmdlKGFsbC54ID0KVFJVRSwgYWxsLnkgPSBUUlVFKQoKYGBge3J9CmhzX3BkIDwtIHBEYXRhKGhzX2V4cHQpCmhzX3BkW1siam9pbiJdXSA8LSBoc19wZFtbInR1YmVsYWJlbG9yaWdpbiJdXQoKaHNfcGRfZGVtb2dyYXBoaWNzIDwtIHBseXI6OmpvaW4oaHNfcGQsIGhzX2RlbW9ncmFwaGljcywgYnkgPSAiam9pbiIpCmhzX3BkX2RlbW9ncmFwaGljc1tbImpvaW4iXV0gPC0gTlVMTApyb3duYW1lcyhoc19wZF9kZW1vZ3JhcGhpY3MpIDwtIHJvd25hbWVzKGhzX3BkKQpuYV9pZHggPC0gaXMubmEoaHNfcGRfZGVtb2dyYXBoaWNzKQpzdW0obmFfaWR4KQpoc19wZF9kZW1vZ3JhcGhpY3NbbmFfaWR4XSA8LSAidW5kZWZpbmVkIgoKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiaHNfcGRfZGVtb2dyYXBoaWNzIikKYGBgCgojIyBBZGQgdGhlIGRlbW9ncmFwaGljcyB0byB0aGUgZXhwcmVzc2lvbnNldAoKSW4gYWRkaXRpb24gd2Ugd2lsbCBjcmVhdGUgYSBzZXJpZXMgb2YgY29tcG9zaXRlIHZhcmlhYmxlcyBmcm9tCmNvbWJpbmF0aW9ucyBvZiBleHRhbnQgZmFjdG9ycy4KCmBgYHtyfQpwRGF0YShoc19leHB0KSA8LSBoc19wZF9kZW1vZ3JhcGhpY3MKCiMjIE5vdyBhZGQgaW4gdGhlIGV0aG5pY2l0eSBhbmQgc2V4CiMjIEFkZCBhIGNvbWJpbmF0aW9uIG9mIHRoZSBldGhuaWNpdHkgYW5kIGNsaW5pYwojIyBXaGlsZSBJIGFtIGF0IGl0LCBkbyBzZXgrY2xpbmljCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siU2V4Il1dKQp0YWJsZShwRGF0YShoc19leHB0KVtbIkV0aG5pY2l0eSJdXSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJjbGluaWMiXV0pCmV0bmlhX25hbWVzIDwtIGFzLmNoYXJhY3RlcihwRGF0YShoc19leHB0KVtbIkV0aG5pY2l0eSJdXSkKZXRuaWFfaWR4IDwtIGV0bmlhX25hbWVzID09IDEKZXRuaWFfbmFtZXNbZXRuaWFfaWR4XSA8LSAiYWZyb2NvbCIKZXRuaWFfaWR4IDwtIGV0bmlhX25hbWVzID09IDIKZXRuaWFfbmFtZXNbZXRuaWFfaWR4XSA8LSAiaW5kaWdlbmEiCmV0bmlhX2lkeCA8LSBldG5pYV9uYW1lcyA9PSAzCmV0bmlhX25hbWVzW2V0bmlhX2lkeF0gPC0gIm1lc3RpemEiCnBEYXRhKGhzX2V4cHQpW1siZXRuaWEiXV0gPC0gYXMuZmFjdG9yKGV0bmlhX25hbWVzKQp0YWJsZShwRGF0YShoc19leHB0KVtbImV0bmlhIl1dKQp0YWJsZShwRGF0YShoc19leHB0KVtbIkV0aG5pY2l0eSJdXSkKZXRuaWFfZmFjdG9yIDwtIHBhc3RlMChwRGF0YShoc19leHB0KVtbImNsaW5pYyJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgIGV0bmlhX25hbWVzKQpwRGF0YShoc19leHB0KVtbImNsaW5pY19ldG5pYSJdXSA8LSBhcy5mYWN0b3IoZXRuaWFfZmFjdG9yKQp0YWJsZShwRGF0YShoc19leHB0KVtbImNsaW5pY19ldG5pYSJdXSkKCnBEYXRhKGhzX2V4cHQpW1sic2V4Il1dIDwtICJmZW1hbGUiCm1hbGVfaWR4IDwtIHBEYXRhKGhzX2V4cHQpW1siU2V4Il1dID09IDEKcERhdGEoaHNfZXhwdClbbWFsZV9pZHgsICJzZXgiXSA8LSAibWFsZSIKcERhdGEoaHNfZXhwdClbWyJzZXgiXV0gPC0gYXMuZmFjdG9yKHBEYXRhKGhzX2V4cHQpW1sic2V4Il1dKQpzZXhfZmFjdG9yIDwtIHBhc3RlMChwRGF0YShoc19leHB0KVtbImNsaW5pYyJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICBwRGF0YShoc19leHB0KVtbInNleCJdXSkKcERhdGEoaHNfZXhwdClbWyJjbGluaWNfc2V4Il1dIDwtIGFzLmZhY3RvcihzZXhfZmFjdG9yKQp0YWJsZShwRGF0YShoc19leHB0KVtbImNsaW5pY19zZXgiXV0pCgpwRGF0YShoc19leHB0KVtbImV0bmlhX3NleCJdXSA8LSBwYXN0ZTAocERhdGEoaHNfZXhwdClbWyJldG5pYSJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoaHNfZXhwdClbWyJzZXgiXV0pCnBEYXRhKGhzX2V4cHQpW1siZXRuaWFfc2V4Il1dIDwtIGFzLmZhY3RvcihwRGF0YShoc19leHB0KVtbImV0bmlhX3NleCJdXSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJldG5pYV9zZXgiXV0pCgojIyBTZXQgYSBmYWN0b3Igb2Ygc2FtcGxlcyB3aGljaCBhcmUgdmlzaXQgMSB2cy4gMi8zLgp2MV9zYW1wbGVzIDwtIHBEYXRhKGhzX2V4cHQpW1sidmlzaXRudW1iZXIiXV0gPT0gIjEiCnBEYXRhKGhzX2V4cHQpW3YxX3NhbXBsZXMsICJ2aXNpdGJpcGFydCJdIDwtICJ2MSIKcERhdGEoaHNfZXhwdClbIXYxX3NhbXBsZXMsICJ2aXNpdGJpcGFydCJdIDwtICJ2b3RoZXIiCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1sidmlzaXRiaXBhcnQiXV0pCgpwRGF0YShoc19leHB0KVtbImNlbGxfdmlzaXRfY2YiXV0gPC0gcGFzdGUwKHBEYXRhKGhzX2V4cHQpW1sidHlwZW9mY2VsbHMiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YShoc19leHB0KVtbInZpc2l0bnVtYmVyIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoaHNfZXhwdClbWyJmaW5hbG91dGNvbWUiXV0pCgphZ2VfdmVjdG9yIDwtIHBEYXRhKGhzX2V4cHQpW1siQWdlIl1dCnBEYXRhKGhzX2V4cHQpW1siYWdlX2NhdCJdXSA8LSBtYWtlX3F1YXJ0aWxlX2ZhY3RvcihhZ2VfdmVjdG9yKQoKc2F2ZShsaXN0ID0gImhzX2V4cHQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2hzX2V4cHRfYWxsX3Nhbml0aXplZF9kZW1vZ3JhcGhpY3Mtdnt2ZXJ9LnJkYSIpKQpgYGAKCiMjIFNhbml0eSBjaGVjaywgY2xpbmljYWwgb3V0Y29tZSB2cy4gZGVtb2dyYXBoaWNzCgpDaGVjayB0byBtYWtlIHN1cmUgdGhlIGRlbW9ncmFwaGljcyBhZ3JlZXMgd2l0aCB0aGUgbWV0YWRhdGEuICBJIF9yZWFsbHlfIHdhbnQKdGhpcyBibG9jayB0byByZXR1cm4gTlVMTCB1cG9uIGNvbXBsZXRpb24uCgpgYGB7cn0KdHdvX2NvbHVtbnMgPC0gcERhdGEoaHNfZXhwdClbLCBjKCJmaW5hbG91dGNvbWUiLCAiVGhlcmFwZXV0aWNfT3V0Y29tZV9GaW5hbCIpXQp1bmRlZl9pZHggPC0gdHdvX2NvbHVtbnNbWzJdXSA9PSAidW5kZWZpbmVkIgp0d29fY29sdW1ucyA8LSB0d29fY29sdW1uc1shdW5kZWZfaWR4LCBdCnR3b19jb2x1bW5zW1sicmV3cml0dGVuIl1dIDwtICJ1bmRlZiIKY3VyZV9pZHggPC0gdHdvX2NvbHVtbnNbWzJdXSA9PSAwCnR3b19jb2x1bW5zW2N1cmVfaWR4LCAicmV3cml0dGVuIl0gPC0gImN1cmUiCmZhaWxfaWR4IDwtIHR3b19jb2x1bW5zW1syXV0gPT0gMQp0d29fY29sdW1uc1tmYWlsX2lkeCwgInJld3JpdHRlbiJdIDwtICJmYWlsdXJlIgpsb3N0X2lkeCA8LSB0d29fY29sdW1uc1tbMl1dID09IDIKdHdvX2NvbHVtbnNbbG9zdF9pZHgsICJyZXdyaXR0ZW4iXSA8LSAibG9zdCIKc2FtZV9pZHggPC0gdHdvX2NvbHVtbnNbWyJmaW5hbG91dGNvbWUiXV0gPT0gdHdvX2NvbHVtbnNbWyJyZXdyaXR0ZW4iXV0KYnJva2VuIDwtIHR3b19jb2x1bW5zWyFzYW1lX2lkeCwgXQojIyBJIHZlcnkgbXVjaCB3YW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBldmFsdWF0ZSB0byAwIHJvd3MuCmJyb2tlbgpgYGAKCiMjIFN1bW1hcml6ZTogQ29sbGVjdCBzYW1wbGUgbnVtYmVycyBiZWZvcmUgZmlsdGVyaW5nCgpUaGVyZSBhcmUgc29tZSBtZXRhZGF0YSBmYWN0b3JzIGZvciB3aGljaCBJIHRoaW5rIGl0IHdpbGwgYmUgbmljZSB0bwpzZWUgdGhlIG51bWJlcnMgYmVmb3JlIGFuZCBhZnRlciBvdXIgZmlsdGVycy4gIFRoZSBmb2xsb3dpbmcgc2hvd3MgaG93Cm1hbnkgc2FtcGxlcyB3ZSBoYXZlIG9mIHRoZSBwcmltYXJ5IHR5cGVzIGJlZm9yZSBmaWx0ZXJpbmcuCgpgYGB7cn0KZGltKHBEYXRhKGhzX2V4cHQpKQp0YWJsZShwRGF0YShoc19leHB0KVtbImRydWciXV0pCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siY2xpbmljIl1dKQp0YWJsZShwRGF0YShoc19leHB0KVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJ0eXBlb2ZjZWxscyJdXSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJ2aXNpdG51bWJlciJdXSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGhzX2V4cHQpW1siRXZvbHV0aW9uX1RpbWUiXV0pKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdClbWyJQcmVzY3JpYmVkX0RhaWx5X0Rvc2VfR2x1YyJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc19leHB0KVtbIlYzX1ZlcnRpY2FsX0F4aXNfTGVzaW9uIl1dKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGhzX2V4cHQpW1siVjNfVG90YWxfQXJlYV9MZXNpb24iXV0pKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdClbWyJWM19Ib3Jpem9udGFsX0F4aXNfTGVzaW9uIl1dKSkKdGFibGUocERhdGEoaHNfZXhwdClbWyJzZXgiXV0pCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siZXRuaWEiXV0pCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siRXRobmljaXR5Il1dKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdClbWyJBZ2UiXV0pKQpzdW1tYXJ5KHBEYXRhKGhzX2V4cHQpW1siV2VpZ2h0Il1dKQpzdW1tYXJ5KHBEYXRhKGhzX2V4cHQpW1siSGVpZ2h0Il1dKQp0YWJsZShwRGF0YShoc19leHB0KVtbIlRoZXJhcGV1dGljX091dGNvbWVfRmluYWwiXV0pCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siZmluYWxvdXRjb21lIl1dKQoKdW5pcXVlKHBEYXRhKGhzX2V4cHQpW1siUGF0aWVudF9JRCJdXSkKbGVuZ3RoKHVuaXF1ZShwRGF0YShoc19leHB0KVtbIlBhdGllbnRfSUQiXV0pKQpgYGAKCkdldCB0aGUgc2V4IG9mIHRoZSB1bmlxdWUgcGF0aWVudHMuCgpgYGB7cn0KdW5pcXVlX3Blb3BsZSA8LSB1bmlxdWUocERhdGEoaHNfZXhwdClbWyJQYXRpZW50X0lEIl1dKQp1bmlxdWVfcGVvcGxlCmxlbmd0aCh1bmlxdWVfcGVvcGxlKQoKZGYgPC0gcERhdGEoaHNfZXhwdCkKcGVvcGxlIDwtIGRmW1siUGF0aWVudF9JRCJdXQpmaXJzdF9pbmRpY2VzIDwtIG9yZGVyKHBlb3BsZSlbIWR1cGxpY2F0ZWQoc29ydChwZW9wbGUpKV0KdGFibGUoZGZbZmlyc3RfaW5kaWNlcywgInNleCJdKQp0YWJsZShkZltmaXJzdF9pbmRpY2VzLCAiZmluYWxvdXRjb21lIl0pCmBgYAoKIyMgRGVmaW5lIGRlc2lyZWQgY29sb3JzIGZvciB0aGUgdmFyaW91cyBzdWJzZXRzCgpUaGVyZSBhcmUgbG90cyBvZiB3YXlzIHdoaWNoIHdlIHdpbGwgY2F0ZWdvcml6ZSB0aGUgZGF0YSwgaGVyZSBhcmUKc29tZSBwb3RlbnRpYWwgY29sb3IgY2hvaWNlcyBmb3IgdGhlbS4KCmBgYHtyfQpjb2xvcl9jaG9pY2VzIDwtIGxpc3QoCiAgICAiY2YiID0gbGlzdCgKICAgICAgImN1cmUiID0gIiM5OThFQzMiLAogICAgICAiZmFpbHVyZSIgPSAiI0YxQTM0MCIpLAogICAgImNmbG9zdCIgPSBsaXN0KAogICAgICAiY3VyZSIgPSAiIzk5OEVDMyIsCiAgICAgICJmYWlsdXJlIiA9ICIjRjFBMzQwIiwKICAgICAgImxvc3QiID0gIiMzNDM0MzQiKSwKICAgICJ0eXBlX3Zpc2l0IiA9IGxpc3QoCiAgICAgICJtb25vY3l0ZXNfdjEiID0gIiNERDFDNzciLAogICAgICAibW9ub2N5dGVzX3YyIiA9ICIjQzk5NEM3IiwKICAgICAgIm1vbm9jeXRlc192MyIgPSAiI0U3RTFFRiIsCiAgICAgICJlb3Npbm9waGlsc192MSIgPSAiIzMxQTM1NCIsCiAgICAgICJlb3Npbm9waGlsc192MiIgPSAiI0FEREQ4RSIsCiAgICAgICJlb3Npbm9waGlsc192MyIgPSAiI0Y3RkNEOSIsCiAgICAgICJuZXV0cm9waGlsc192MSIgPSAiIzMxODJCRCIsCiAgICAgICJuZXV0cm9waGlsc192MiIgPSAiIzlFQ0FFMSIsCiAgICAgICJuZXV0cm9waGlsc192MyIgPSAiI0RFRUJGNyIsCiAgICAgICJiaW9wc3lfdjEiID0gIiNEOTVGMEUiKSwKICAgICJ0eXBlIiA9IGxpc3QoCiAgICAgICJtb25vY3l0ZXMiID0gIiNERDFDNzciLAogICAgICAiZW9zaW5vcGhpbHMiID0gIiMzMUEzNTQiLAogICAgICAibmV1dHJvcGhpbHMiID0gIiMzMTgyQkQiLAogICAgICAiYmlvcHN5IiA9ICIjRDk1RjBFIiksCiAgICAidHdvX3Zpc2l0IiA9IGxpc3QoCiAgICAgICJmaXJzdCIgPSAiIzMzRUUzMyIsCiAgICAgICJsYXRlciIgPSAiIzAyMzMwMiIpLAogICAgInZpc2l0IiA9IGxpc3QoCiAgICAgICJ2MSIgPSAiI0NDQ0NDQyIsCiAgICAgICJ2MiIgPSAiIzY2NjY2NiIsCiAgICAgICJ2MyIgPSAiIzExMTExMSIpLAogICAgInZpc2l0MiIgPSBsaXN0KAogICAgICAiMSIgPSAiI0NDQ0NDQyIsCiAgICAgICIyIiA9ICIjNjY2NjY2IiwKICAgICAgIjMiID0gIiMxMTExMTEiKSwKICAgICJ2aXNpdGJpIiA9IGxpc3QoCiAgICAgICJ2MSIgPSAiI0JCMDAwMCIsCiAgICAgICJ2b3RoZXIiID0gIiMwMDAwQkIiKSwKICAgICJsYWJzIiA9IGxpc3QoCiAgICAgICJCcmF6aWwiID0gIiNGRkMzMDAiLAogICAgICAiQ29sb21iaWEiID0gIiM1MjUyNTIiKSwKICAgICJjbGluaWMiID0gbGlzdCgKICAgICAgInR1bWFjbyIgPSAiIzMxODJBQSIsCiAgICAgICJjYWxpIiA9ICIjQzk5NEFBIiksCiAgICAiY2xpbmljX2NmIiA9IGxpc3QoCiAgICAgICJ0dW1hY29fY3VyZSIgPSAiIzc2NzBCMyIsCiAgICAgICJ0dW1hY29fZmFpbHVyZSIgPSAiI0U3Mjk4QSIsCiAgICAgICJjYWxpX2N1cmUiID0gIiMxQjlFNzciLAogICAgICAiY2FsaV9mYWlsdXJlIiA9ICIjRDk1RjAyIiksCiAgICAiZXRobmljaXR5IiA9IGxpc3QoCiAgICAgICJhZnJvY29sIiA9ICIjNDI5M0NFIiwKICAgICAgImluZGlnZW5hIiA9ICIjQkRCREJEIiwKICAgICAgIm1lc3RpemEiID0gIiNGRUIyNEMiKSwKICAgICJjbGluaWNfZXRuaWEiID0gbGlzdCgKICAgICAgImNhbGlfYWZyb2NvbCIgPSAiIzMxODJCRCIsCiAgICAgICJjYWxpX2luZGlnZW5hIiA9ICIjNjM2MzYzIiwKICAgICAgImNhbGlfbWVzdGl6YSIgPSAiI0YwM0IyMCIsCiAgICAgICJ0dW1hY29fYWZyb2NvbCIgPSAiIzlFQ0FFMSIsCiAgICAgICJ0dW1hY29faW5kaWdlbmEiID0gIiNCREJEQkQiLAogICAgICAidHVtYWNvX21lc3RpemEiID0gIiNGRUIyNEMiKSwKICAgICJzZXgiID0gbGlzdCgKICAgICAgImZlbWFsZSIgPSAiIzMxODJCRCIsCiAgICAgICJtYWxlIiA9ICIjQzk5NEM3IiksCiAgICAiY2xpbmljX3NleCIgPSBsaXN0KAogICAgICAiY2FsaV9mZW1hbGUiID0gIiMwMDAwQ0MiLAogICAgICAidHVtYWNvX2ZlbWFsZSIgPSAiIzMxODJCRCIsCiAgICAgICJjYWxpX21hbGUiID0gIiNFNzI5OEEiLAogICAgICAidHVtYWNvX21hbGUiID0gIiNDOTk0QzciKSwKICAgICJjZl90eXBlIiA9IGxpc3QoCiAgICAgICJjdXJlX2Jpb3BzeSIgPSAiI0Q5NUYwRSIsCiAgICAgICJmYWlsdXJlX2Jpb3BzeSIgPSAiI0ZFQzQ0RiIsCiAgICAgICJjdXJlX21vbm9jeXRlcyIgPSAiI0REMUM3NyIsCiAgICAgICJmYWlsdXJlX21vbm9jeXRlcyIgPSAiI0M5OTRDNyIsCiAgICAgICJjdXJlX2Vvc2lub3BoaWxzIiA9ICIjMzFBMzU0IiwKICAgICAgImZhaWx1cmVfZW9zaW5vcGhpbHMiID0gIiNBREREOEUiLAogICAgICAiY3VyZV9uZXV0cm9waGlscyIgPSAiIzMxODJCRCIsCiAgICAgICJmYWlsdXJlX25ldXRyb3BoaWxzIiA9ICIjOUVDQUUxIiksCiAgICAicGFyYXNpdGUiID0gbGlzdCgKICAgICAgIm5vdGFwcGxpY2FibGUiID0gIiMwMDAwMDAiLAogICAgICAibHZicmF6aWxpZW5zaXMiID0gIiNBQTAwMDAiLAogICAgICAibHZndXlhbmVuc2lzIiA9ICIjNjYwMDY2IiwKICAgICAgImx2cGFuYW1lbnNpcyIgPSAiIzMxNjBBQyIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjb2xvcl9jaG9pY2VzIikKYGBgCgojIERlZmluZSB0aGUgc3RhcnRpbmcgZGF0YQoKR2l2ZW4gdGhlIHN0YXJ0aW5nIHBvaW50IGFib3ZlLCB3ZSB3aWxsIHN0YXJ0IGV4dHJhY3RpbmcgZ3JvdXBzIG9mCnNhbXBsZXMgb2YgaW50ZXJlc3QuCgojIyBTZXQgb3VyIGluaXRpYWwgY292ZXJhZ2UgZ29hbAoKVGhlIGZpcnN0IHNldCBvZiBzYW1wbGVzIHJlbW92ZWQgZnJvbSB0aGUgZGF0YSBhcmUgdGhvc2Ugd2l0aCB0b28gbWFueQptaXNzaW5nIGdlbmVzLgoKIyMgRmlndXJlIFMyOiBOb24temVybyBnZW5lcyBiZWZvcmUgc2FtcGxlIGZpbHRlcmluZwoKYGBge3J9CmFsbF9ueiA8LSBwbG90X25vbnplcm8oaHNfZXhwdCkKcHAoZmlsZSA9ICJmaWd1cmVzL1MyX25vbnplcm9fYWxsX3NhbXBsZXMuc3ZnIikKYWxsX256JHBsb3QKZGV2Lm9mZigpCmFsbF9uegpgYGAKCiMjIyBTYXZlIENQTSwgYWxsIHNhbXBsZXMKCldlIHNob3VsZCBzYXZlIGEgY3BtIGFuZCBycGttIGNvcHkgb2YgdGhlIHJhdyBkYXRhIGZvciBldmVyeSBzdWJzZXQgaW4Kb3JkZXIgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIGZvbGtzIHRvIHdvcmsgd2l0aCBXR0NOQSBhbmQgb3RoZXIgdG9vbHMKKFNUUklORykuCgpgYGB7cn0KZGlyLmNyZWF0ZSgiY3BtLzNfQ2FsaV9hbmRfVHVtYWNvIiwgcmVjdXJzaXZlID0gVFJVRSkKZGlyLmNyZWF0ZSgicnBrbSIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2V4cHQsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vM19DYWxpX2FuZF9UdW1hY28vYWxsX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChoc19leHB0LCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9oc19leHB0X3Jwa20tdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIFN1YnNldDogRmlsdGVyIG91dCBwcm9ibGVtYXRpYyBzYW1wbGVzCgpUbyBteSBleWVzLCB0aGVyZSBhcmUgMyBvciA0IHNhbXBsZXMgd2hpY2ggYXJlIGxpa2VseSBjYW5kaWRhdGVzIGZvcgpyZW1vdmFsLiAgSW4gYWRkaXRpb24sIHdlIHdpbGwgcmVtb3ZlIHNhbXBsZXMgd2hpY2ggd2VyZSBsb3N0IGR1cmluZwp0aGUgdHJlYXRtZW50IGFuZC9vciBvbmVzIHdoaWNoIHdlcmUgdXNlZCBpbiBvdGhlciBleHBlcmltZW50cyBidXQKaW5jbHVkZWQgaW4gdGhlIFRNUkMzIHNhbXBsZSBzaGVldCAodGh1cyB0aGUgJ25vdGFwcGxpY2FibGUnIG9yCidudWxsJykuCgpJIHRoaW5rIHRoaXMgaXMgc3RhdGVkIGVsc2V3aGVyZTogdmFyaWFibGVzIHByZWZpeGVkIHdpdGggJ3RjJyBhcmUKVHVtYWNvIGFuZCBDYWxpOyAndCcgb3IgJ2MnIGNvcnJlc3BvbmQuCgpgYGB7cn0KdGNfbm9sb3N0IDwtIHN1YnNldF9leHB0KGhzX2V4cHQsIHN1YnNldCA9ICJmaW5hbG91dGNvbWUhPSdsb3N0JyIpCnRjX25vbWlsdCA8LSBzdWJzZXRfZXhwdCh0Y19ub2xvc3QsIHN1YnNldCA9ICJkcnVnPT0nYW50aW1vbnknIikKcGxvdF9sZWdlbmQodGNfbm9taWx0KQpub21pbHRfbm9uemVybyA8LSBwbG90X25vbnplcm8odGNfbm9taWx0LCBwbG90X2xhYmVscyA9IFRSVUUpCm5vbWlsdF9ub256ZXJvCnBwKGZpbGUgPSAiZmlndXJlcy9maWdzMl9ub256ZXJvLnN2ZyIpCm5vbWlsdF9ub256ZXJvCmRldi5vZmYoKQp0Y192YWxpZCA8LSBzdWJzZXRfZXhwdCh0Y19ub21pbHQsIG5vbnplcm8gPSAxMTAwMCkgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJjZiJdXSkKCnNhdmUobGlzdCA9ICJ0Y192YWxpZCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfdmFsaWQtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y192YWxpZCIpCmBgYAoKIyBWaXN1YWxpemUgdGhlIHNhbXBsZSBicmVha2Rvd24KCmBgYHtyfQpjbGluaWNfdHlwZV9vdXRjb21lX3NhbmtleSA8LSBwbG90X21ldGFfc2Fua2V5KAogIHRjX3ZhbGlkLCBmYWN0b3JzID0gYygiY2xpbmljIiwgInR5cGVvZmNlbGxzIiwgImZpbmFsb3V0Y29tZSIpLAogIGRyaWxsX2Rvd24gPSBUUlVFLCBjb2xvcl9jaG9pY2VzID0gY29sb3JfY2hvaWNlcykKY2xpbmljX3R5cGVfb3V0Y29tZV9zYW5rZXkKCmNsaW5pY19ldGhuaWNpdHlfb3V0Y29tZV9zYW5rZXkgPC0gcGxvdF9tZXRhX3NhbmtleSgKICB0Y192YWxpZCwgZmFjdG9ycyA9IGMoImNsaW5pYyIsICJldG5pYSIsICJmaW5hbG91dGNvbWUiKSwKICBkcmlsbF9kb3duID0gVFJVRSwgY29sb3JfY2hvaWNlcyA9IGNvbG9yX2Nob2ljZXMpCmNsaW5pY19ldGhuaWNpdHlfb3V0Y29tZV9zYW5rZXkKCmNsaW5pY19zZXhfb3V0Y29tZV9zYW5rZXkgPC0gcGxvdF9tZXRhX3NhbmtleSgKICB0Y192YWxpZCwgZmFjdG9ycyA9IGMoImNsaW5pYyIsICJzZXgiLCAiZmluYWxvdXRjb21lIiksCiAgZHJpbGxfZG93biA9IFRSVUUsIGNvbG9yX2Nob2ljZXMgPSBjb2xvcl9jaG9pY2VzKQpjbGluaWNfc2V4X291dGNvbWVfc2Fua2V5CmBgYAoKIyMgRmlndXJlIFhYICsgMTogTm9uLXplcm8gZ2VuZXMgYWZ0ZXIgc2FtcGxlIGZpbHRlcmluZwoKVGhlIGZvbGxvd2luZyBwbG90IGlzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMgd2l0aCB0d28KZXhjZXB0aW9uczoKCjEuICBUaGUgc2FtcGxlcyB3aXRoIHRvbyBmZXcgZ2VuZXMgKDExLDAwMCBjdXJyZW50bHkpIGFyZSBnb25lLgoyLiAgVGhlIHNhbXBsZXMgYXJlIGNvbG9yZWQgYnkgY3VyZShwdXJwbGUpL2ZhaWwoeWVsbG93KQoKYGBge3J9Cm56X3Bvc3QgPC0gcGxvdF9ub256ZXJvKHRjX3ZhbGlkKQpuel9wb3N0CnBwKGZpbGUgPSAiZmlndXJlcy9maWdTMnYyX3Bvc3Quc3ZnIikKbnpfcG9zdApkZXYub2ZmKCkKYGBgCgojIyBTdW1tYXJpemU6IFRhbGx5IHNhbXBsZXMgYWZ0ZXIgZmlsdGVyaW5nCgpXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgb2YgZWFjaCBzYW1wbGUgdHlwZSBpcyBsb3N0IHdoZW4gd2UKZG8gb3VyIHZhcmlvdXMgZmlsdGVycy4gIFRodXMgSSBhbSByZXBlYXRpbmcgdGhlIHNhbWUgc2V0IG9mIHRhbGxpZXMuClRoaXMgd2lsbCBsaWtlbHkgaGFwcGVuIG9uZSBtb3JlIHRpbWUsIGZvbGxvd2luZyB0aGUgcmVtb3ZhbCBvZgpzYW1wbGVzIHdoaWNoIGNhbWUgZnJvbSBDYWxpLgoKYGBge3J9CnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImRydWciXV0pCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImNsaW5pYyJdXSkKdGFibGUocERhdGEodGNfdmFsaWQpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZShwRGF0YSh0Y192YWxpZClbWyJ0eXBlb2ZjZWxscyJdXSkKdGFibGUocERhdGEodGNfdmFsaWQpW1sidmlzaXQiXV0pCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJFdm9sdXRpb25fVGltZSJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJQcmVzY3JpYmVkX0RhaWx5X0Rvc2VfR2x1YyJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJWM19WZXJ0aWNhbF9BeGlzX0xlc2lvbiJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJWM19Ub3RhbF9BcmVhX0xlc2lvbiJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJWM19Ib3Jpem9udGFsX0F4aXNfVWxjZXIiXV0pKQp0YWJsZShwRGF0YSh0Y192YWxpZClbWyJzZXgiXV0pCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImV0bmlhIl1dKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodGNfdmFsaWQpW1siQWdlIl1dKSkKc3VtbWFyeShwRGF0YSh0Y192YWxpZClbWyJXZWlnaHQiXV0pCnN1bW1hcnkocERhdGEodGNfdmFsaWQpW1siSGVpZ2h0Il1dKQoKbGVuZ3RoKHVuaXF1ZShwRGF0YSh0Y192YWxpZClbWyJQYXRpZW50X0lEIl1dKSkKYGBgCgojIyBFeHRyYWN0IHRoZSBkZW1vZ3JhcGhpY3MgZnJvbSB0aGUgcmVtYWluaW5nIHNhbXBsZXMKCldoZW4gd2UgcGVyZm9ybSB0aGUgbG9naXN0aWMvbGluZWFyIG1vZGVscyBleGFtaW5pbmcgdmFyaWFibGVzIGluIHRoZQpkZW1vZ3JhcGhpY3MsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgd2UgYXJlIHdvcmtpbmcgd2l0aCBvbmx5IHRoZQpwZW9wbGUgd2hvIGFyZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgZGF0YXNldC4KCmBgYHtyfQpwZW9wbGVfcmVtYWluaW5nIDwtIHVuaXF1ZShwRGF0YSh0Y192YWxpZClbWyJQYXRpZW50X0lEIl1dKQpkZW1vZ3JhcGhpY3NfZmlsdGVyZWRfaWR4IDwtIGhzX2RlbW9ncmFwaGljc1tbIlBhdGllbnRfSUQiXV0gJWluJSBwZW9wbGVfcmVtYWluaW5nCmRlbW9ncmFwaGljc19maWx0ZXJlZCA8LSBoc19kZW1vZ3JhcGhpY3NbZGVtb2dyYXBoaWNzX2ZpbHRlcmVkX2lkeCwgXQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJkZW1vZ3JhcGhpY3NfZmlsdGVyZWQiKQpgYGAKCiMjIFNwbGl0IHRoZSBkYXRhIGJ5IGN1cmUvZmFpbCBmb3Igc29tZSBjb3VudGluZwoKV2Ugbm93IGhhdmUgdHdvIGRhdGFzZXRzIHdoaWNoIGFyZSBjb21wcmlzZWQgb2Ygb25seSB0aGUKY3VyZS9mYWlsIHNhbXBsZXMuICBJdCBpcyB3b3J0aCBjb25zaWRlcmluZyBpZiB0aGVyZSBhcmUgd2F5cyB3ZQpjYW4gbGV2ZXJhZ2UgdGhpcyBzZXBhcmF0aW9uLgoKYGBge3J9CnRjX2N1cmUgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdjdXJlJyIpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2N1cmUiKQoKdGFibGUocERhdGEodGNfY3VyZSlbWyJ2aXNpdG51bWJlciJdXSkKCnRjX2ZhaWwgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdmYWlsdXJlJyIpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2ZhaWwiKQoKdGFibGUocERhdGEodGNfZmFpbClbWyJ2aXNpdG51bWJlciJdXSkKYGBgCgojIFByaW50IG91dCBjZWxsIHR5cGUgYW5kIHZpc2l0IG51bWJlcnMKCmBgYHtyfQphbGxfdHlwZXMgPC0gdGFibGUocERhdGEodGNfdmFsaWQpW1sidHlwZW9mY2VsbHMiXV0pCmFsbF90eXBlcwphbGxfdGltZXMgPC0gdGFibGUocERhdGEodGNfdmFsaWQpW1sidmlzaXRudW1iZXIiXV0pCmFsbF90aW1lcwpgYGAKCiMjIyBXcml0ZSB2YWxpZCBzYW1wbGVzCgpXZSBjb21wbGV0ZWQgdGhlIGluaXRpYWwgZmlsdGVyIG9mIHRoZSBkYXRhLiAgV3JpdGUgaXQgb3V0LiAgVGhpcwpkYXRhIHNob3VsZCBpbmNsdWRlIGFsbCBzYW1wbGVzIGV4Y2VwdCB0aG9zZSB3ZSBleHBsaWNpdGx5IHJlbW92ZWQgZHVlCnRvIHBvb3IgY292ZXJhZ2UsIGxvc3Qtc3RhdHVzLCBvciBub24tY2Fub25pY2FsIGNlbGwgdHlwZSAodGhlIHBpbG90CnN0dWR5KS4KCmBgYHtyfQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y192YWxpZCwgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS8zX0NhbGlfYW5kX1R1bWFjby9hbGxfdmFsaWRfc2FtcGxlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfdmFsaWQsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3RjX2FsbF92YWxpZF9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyBFeHRyYWN0IGNlbGwgdHlwZXMKCkV4dHJhY3QgdGhlIHNhbXBsZXMgb2YgZWFjaCBjZWxsIHR5cGUsIHRoZXNlIHdpbGwgYmUgdGhlIGJhc2lzIGZvciBhCnNpZ25pZmljYW50IG51bWJlciBvZiB0aGUgY2xpbmljYWwgb3V0Y29tZSBjb21wYXJpc29ucy4KCmBgYHtyfQojIyBOb3RlLCBJIHdpbGwgc2F2ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMgaW4gYSBsaXR0bGUgYml0IHdoZW4gSQojIyBkZWNpZGUgaG93IEkgd2FudCB0byBzZXQgdGhlIGNvbmRpdGlvbnMsIGJhdGNoZXMsIGFuZCBjb2xvcnMuCnRjX2Vvc2lub3BoaWxzIDwtIHN1YnNldF9leHB0KHRjX3ZhbGlkLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQp0Y19tb25vY3l0ZXMgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J21vbm9jeXRlcyciKQp0Y19uZXV0cm9waGlscyA8LSBzdWJzZXRfZXhwdCh0Y192YWxpZCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKYGBgCgojIyMgV3JpdGUgY2VsbCB0eXBlIGNwbQoKVGhlIGZvbGxvd2luZyB3cml0ZXMgb3V0IHJwa20vY3BtIHZhbHVlcyBmb3IgZWFjaCBjZWxsdHlwZSBmcm9tIGJvdGgKY2xpbmljcyh0YyBwcmVmaXgpLgoKYGBge3J9CmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzNfQ2FsaV9hbmRfVHVtYWNvL3RjX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y19lb3Npbm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdGNfZW9zaW5vcGhpbHMtdnt2ZXJ9LmNzdiIpKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzNfQ2FsaV9hbmRfVHVtYWNvL3RjX21vbm9jeXRlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90Y19tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vM19DYWxpX2FuZF9UdW1hY28vdGNfbmV1dHJvcGhpbHMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90Y19uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmBgYAoKIyMgVHVtYWNvIGFuZCBDYWxpIHNhbXBsZXMgYnkgdmlzaXQKClRoZSBwcmVmaXhlcyBvZiB0aGUgZm9sbG93aW5nIGRhdGFzdHJ1Y3R1cmVzIHN0YXRlIHRoYXQgdGhlc2UgYXJlIGZyb20KYm90aCBjbGluaWNzICh0YykgYW5kIGEgc3BlY2lmaWMgdmlzaXQgKHYxL3YyL3YzKS4gIFRoZSBycGttL2NwbQp2YWx1ZXMgd2lsbCBiZSB3cml0dGVuIGltbWVkaWF0ZWx5IHRoZXJlYWZ0ZXIuCgpgYGB7cn0KdGN2MV9zYW1wbGVzIDwtIHN1YnNldF9leHB0KHRjX3ZhbGlkLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScxJyIpCnNhdmUobGlzdCA9ICJ0Y3YxX3NhbXBsZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjFfc2FtcGxlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjFfc2FtcGxlcyIpCgp0Y3YyX3NhbXBsZXMgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzInIikKc2F2ZShsaXN0ID0gInRjdjJfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2Ml9zYW1wbGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2Ml9zYW1wbGVzIikKCnRjdjNfc2FtcGxlcyA8LSBzdWJzZXRfZXhwdCh0Y192YWxpZCwgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMyciKQpzYXZlKGxpc3QgPSAidGN2M19zYW1wbGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YzX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YzX3NhbXBsZXMiKQpgYGAKCiMjIyBDYWxpIGFuZCBUdW1hY28gYnkgdmlzaXQsIHdyaXRlIGNwbQoKYGBge3J9CmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjFfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS8zX0NhbGlfYW5kX1R1bWFjby90Y3YxX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjFfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdGN2MV9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjJfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS8zX0NhbGlfYW5kX1R1bWFjby90Y3YyX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjJfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdGN2Ml9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjNfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS8zX0NhbGlfYW5kX1R1bWFjby90Y3YzX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjNfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdGN2M19zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKYGBgCgojIFR1bWFjbyBhbmQgQ2FsaSBkYXRhIHN0cnVjdHVyZXMKCkFsbCBkYXRhIHN0cnVjdHVyZXMgd2hpY2ggc3RhcnQgd2l0aCB0aGUgcHJlZml4ICd0YycgYXJlIFR1bWFjbyBhbmQKQ2FsaS4gIFRob3NlIHdpdGggJ3QnIGFyZSBvbmx5IFR1bWFjbywgJ2MnIGFyZSBvbmx5IENhbGkuCgpgYGB7cn0KdGNfY2xpbmljYWwgPC0gdGNfdmFsaWQgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJjZiJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInR5cGVvZmNlbGxzIikKc2F2ZShsaXN0ID0gInRjX2NsaW5pY2FsIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y19jbGluaWNhbC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2NsaW5pY2FsIikKYGBgCgojIyBTdWJzZXQ6IE1vbm9jeXRlcyBieSBjbGluaWMKCkZvciBzb21lIG9mIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmVzLCB3ZSB3aWxsIGJlIGNvbmNhdGVuYXRpbmcKdmFyaW91cyBtZXRhZGF0YSBmYWN0b3JzIG9mIGludGVyZXN0LCB1c3VhbGx5IHRoZSBmaW5hbCBvdXRjb21lIGFuZApvbmUgb3RoZXIgbWV0YWRhdHVtLgoKIyMgU3Vic2V0IE1vbm9jeXRlcwoKSW4gdGhlIGZvbGxvd2luZyBibG9jayBJIGFtIHdyaXRpbmcgb3V0IHRoZSBNb25vY3l0ZXMgaW4gYSBjb3VwbGUKZGlmZmVyZW50IHdheXMsIG9uY2Ugd2l0aCB0aGUgY2xpbmljYWwgb3V0Y29tZSBhcyB0aGUgcHJpbWFyeSBmYWN0b3IsCmFuZCBhZ2FpbiB1c2luZyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBjbGluaWMvb3V0Y29tZS4KCmBgYHtyfQpjbGluaWNfY2YgPC0gcGFzdGUwKHBEYXRhKHRjX21vbm9jeXRlcylbWyJjbGluaWMiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICBwRGF0YSh0Y19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZShjbGluaWNfY2YpCnRjX21vbm9jeXRlcyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKAogIHRjX21vbm9jeXRlcywgZmFjdCA9IGNsaW5pY19jZiwgY29sb3JzID0gY29sb3JfY2hvaWNlc1tbImNsaW5pY19jZiJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInZpc2l0bnVtYmVyIikKc2F2ZShsaXN0ID0gInRjX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfbW9ub2N5dGVzIikKCnRjdjFfbW9ub2N5dGVzIDwtIHN1YnNldF9leHB0KHRjX21vbm9jeXRlcywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMSciKQpzYXZlKGxpc3QgPSAidGN2MV9tb25vY3l0ZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjFfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2MV9tb25vY3l0ZXMiKQp0Y3YyX21vbm9jeXRlcyA8LSBzdWJzZXRfZXhwdCh0Y19tb25vY3l0ZXMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzInIikKc2F2ZShsaXN0ID0gInRjdjJfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YyX21vbm9jeXRlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjJfbW9ub2N5dGVzIikKdGN2M19tb25vY3l0ZXMgPC0gc3Vic2V0X2V4cHQodGNfbW9ub2N5dGVzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PSczJyIpCnNhdmUobGlzdCA9ICJ0Y3YzX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2M19tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YzX21vbm9jeXRlcyIpCmBgYAoKIyMgU3Vic2V0OiBCaW9wc2llcwoKRm9sbG93ZWQgYnkgdGhlIEJpb3BzeSBzYW1wbGVzLi4uCgpgYGB7cn0KdGNfY2xpbmljYWxfbm9iaW9wIDwtIHN1YnNldF9leHB0KHRjX2NsaW5pY2FsLCBzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJjZiJdXSkKc2F2ZShsaXN0ID0gInRjX2NsaW5pY2FsX25vYmlvcCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfY2xpbmljYWxfbm9iaW9wLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfY2xpbmljYWxfbm9iaW9wIikKCnRjX2Jpb3BzaWVzIDwtIHRjX3ZhbGlkICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJjbGluaWMiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nYmlvcHN5JyIpCnRjX2NmIDwtIHBhc3RlMChwRGF0YSh0Y19iaW9wc2llcylbWyJjbGluaWMiXV0sICJfIiwKICAgICAgICAgICAgICAgIHBEYXRhKHRjX2Jpb3BzaWVzKVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUodGNfY2YpCnRjX2Jpb3BzaWVzIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoCiAgdGNfYmlvcHNpZXMsIGZhY3QgPSB0Y19jZiwgY29sb3JzID0gY29sb3JfY2hvaWNlc1tbImNsaW5pY19jZiJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInZpc2l0bnVtYmVyIikKc2F2ZShsaXN0ID0gInRjX2Jpb3BzaWVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y19iaW9wc2llcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2Jpb3BzaWVzIikKYGBgCgojIyBTdWJzZXQ6IEVvc2lub3BoaWxzCgouLi4gYW5kIHRoZSBFb3Npbm9waGlscy4gIFRoZXNlIGFyZSBub3Rld29ydGh5IGJlY2F1c2UgdGhleSBoYXZlIGZld2VyCmZhaWxzIHRoYW4gc29tZSBvdGhlciBjb2hvcnRzLgoKYGBge3J9CmNsaW5pY19jZiA8LSBwYXN0ZTAocERhdGEodGNfZW9zaW5vcGhpbHMpW1siY2xpbmljIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgcERhdGEodGNfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZShjbGluaWNfY2YpCnRjX2Vvc2lub3BoaWxzIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoCiAgdGNfZW9zaW5vcGhpbHMsIGZhY3QgPSBjbGluaWNfY2YsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJjbGluaWNfY2YiXV0pICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJ2aXNpdG51bWJlciIpCnNhdmUobGlzdCA9ICJ0Y19lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y19lb3Npbm9waGlscyIpCgp0Y3YxX2Vvc2lub3BoaWxzIDwtIHN1YnNldF9leHB0KHRjX2Vvc2lub3BoaWxzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScxJyIpCnNhdmUobGlzdCA9ICJ0Y3YxX2Vvc2lub3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YxX2Vvc2lub3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2MV9lb3Npbm9waGlscyIpCnRjdjJfZW9zaW5vcGhpbHMgPC0gc3Vic2V0X2V4cHQodGNfZW9zaW5vcGhpbHMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzInIikKc2F2ZShsaXN0ID0gInRjdjJfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjJfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YyX2Vvc2lub3BoaWxzIikKdGN2M19lb3Npbm9waGlscyA8LSBzdWJzZXRfZXhwdCh0Y19lb3Npbm9waGlscywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMyciKQpzYXZlKGxpc3QgPSAidGN2M19lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2M19lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjNfZW9zaW5vcGhpbHMiKQpgYGAKCiMjIFN1YnNldDogTmV1dHJvcGhpbHMgYnkgY2xpbmljCgpGb2xsb3dlZCBieSB0aGUgTmV1dHJvcGhpbHMuLi4KCmBgYHtyfQpjbGluaWNfY2YgPC0gcGFzdGUwKHBEYXRhKHRjX25ldXRyb3BoaWxzKVtbImNsaW5pYyJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgIHBEYXRhKHRjX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUoY2xpbmljX2NmKQp0Y19uZXV0cm9waGlscyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKAogIHRjX25ldXRyb3BoaWxzLCBmYWN0ID0gY2xpbmljX2NmLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1siY2xpbmljX2NmIl1dKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAidmlzaXRudW1iZXIiKQpzYXZlKGxpc3QgPSAidGNfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfbmV1dHJvcGhpbHMiKQoKdGN2MV9uZXV0cm9waGlscyA8LSBzdWJzZXRfZXhwdCh0Y19uZXV0cm9waGlscywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMSciKQpzYXZlKGxpc3QgPSAidGN2MV9uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2MV9uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjFfbmV1dHJvcGhpbHMiKQp0Y3YyX25ldXRyb3BoaWxzIDwtIHN1YnNldF9leHB0KHRjX25ldXRyb3BoaWxzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScyJyIpCnNhdmUobGlzdCA9ICJ0Y3YyX25ldXRyb3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YyX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2Ml9uZXV0cm9waGlscyIpCnRjdjNfbmV1dHJvcGhpbHMgPC0gc3Vic2V0X2V4cHQodGNfbmV1dHJvcGhpbHMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzMnIikKc2F2ZShsaXN0ID0gInRjdjNfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjNfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YzX25ldXRyb3BoaWxzIikKYGBgCgojIyBCeSBzZXgKCmBgYHtyfQp0Y19zZXggPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y192YWxpZCwgZmFjdCA9ICJzZXgiLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1sic2V4Il1dKQpzYXZlKGxpc3QgPSAidGNfc2V4IiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y19zZXgtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y19zZXgiKQpgYGAKCiMgRGF0YXNldDogT25seSBUdW1hY28gc2FtcGxlcwoKT3VyIHJlY2VudCBkaXNjdXNzaW9ucyBoYXZlIHNldHRsZWQgb25lIGJpZyBxdWVzdGlvbiByZWdhcmRpbmcgd2hpY2gKc2FtcGxlcyB0byB1c2U6ICBXZSB3aWxsIGxpbWl0IG91ciBhbmFseXNlcyB0byBvbmx5IHRob3NlIHNhbXBsZXMgZnJvbQpUdW1hY28uCgpUaGUgZm9sbG93aW5nIGJsb2NrIHdpbGwgdGhlcmVmb3JlIHNldCB0aGF0IGdyb3VwIGFzIG91ciBkZWZhdWx0IGZvcgpmdXR1cmUgYW5hbHlzZXMuICBXZSB3aWxsIGVzc2VudGlhbGx5IHJlcGVhdCBhbGwgb2YgdGhlIGFib3ZlIHNhbXBsZQpzZXBhcmF0aW9ucyBmb3IgdGhlIFR1bWFjby1vbmx5IGNvaG9ydC4KCiMjIEFsbCBjZWxsIHR5cGVzCgpgYGB7cn0KdF9jbGluaWNhbCA8LSB0Y19jbGluaWNhbCAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0X2NsaW5pY2FsIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190X2NsaW5pY2FsLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF9jbGluaWNhbCIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsLCBjb252ZXJ0ID0gImNwbSIpCnRfY2xpbmljYWxfY3BtX3ZhcmlhbmNlIDwtIHZhcmlhbmNlX2V4cHQoY3BtX2RhdGEpCiMjIEFkZCB2YXJpYW5jZSBieSBnZW5lIGZvciBhbGwgc2FtcGxlcyBleGNsdWRpbmcgYmlvcHNpZXMgKEkgYXNzdW1lIGFsc28gZXhjbHVkaW5nIENhbGkpLgojIyBUaGlzIGlzIGludGVuZGVkIHRvIGFkZHJlc3MgYSBxdWVyeSBmcm9tIE1hcmlhIEFkZWxhaWRhIG9uIDIwMjMwMTExCmBgYAoKIyMjIFdyaXRlIG91dCB0aGUgVHVtYWNvIENsaW5pY2FsIHdpdGggdmFyaWFuY2UKCmBgYHtyfQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90X2NsaW5pY2FsLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9jbGluaWNhbC12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWwsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9jbGluaWNhbF9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9jbGluaWNhbF9zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMgUGVyZm9ybSB3cml0ZV9leHB0IG9uIHRoZSBUdW1hY28gY2xpbmljYWwgc2FtcGxlcwoKYGBge3J9CndyaXR0ZW5fZXhwdCA8LSB3cml0ZV9leHB0KAogICAgdF9jbGluaWNhbCwKICAgIGV4Y2VsID0gZ2x1ZSgiZXhjZWwvdF9jbGluaWNhbC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIFdpdGhvdXQgYmlvcHNpZXMKCmBgYHtyfQpkaXIuY3JlYXRlKCJjcG0vNF9UdW1hY28iLCByZWN1cnNpdmUgPSBUUlVFKQp0X2NsaW5pY2FsX25vYmlvcCA8LSBzdWJzZXRfZXhwdCh0X2NsaW5pY2FsLCBzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikKc2F2ZShsaXN0ID0gInRfY2xpbmljYWxfbm9iaW9wIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190X2NsaW5pY2FsX25vYmlvcC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfY2xpbmljYWxfbm9iaW9wIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWxfbm9iaW9wLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfY2xpbmljYWxfbm9iaW9wLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3RfY2xpbmljYWxfc3ZhLXZ7dmVyfS5jc3YiKSkKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWxfbm9iaW9wLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfY2xpbmljYWxfbm9iaW9wX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9jbGluaWNhbF9ub2Jpb3AsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9jbGluaWNhbF9ub2Jpb3Bfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgUHVsbCBvdXQgdGhlIHRvcC1uIG1vc3QgdmFyaWFudCBnZW5lcwoKSSBhZGRlZCBhIGZldyBjb2x1bW5zIHRvIHRoZSBnZW5lIGFubm90YXRpb25zIHJlZmxlY3RpbmcgdGhlCnZhcmlhbmNlL3N0ZGV2L21lYW4gZXhwcmVzc2lvbiBvZiBlYWNoIGdlbmUuICBUaGlzIHJlYWxseSBoaWdobGlnaHRzCnRoZSBleHRyYW9yZGluYXJ5IGRlZ3JlZSB0byB3aGljaCBnZW5lcyBhcmUgY2hhbmdpbmcgaW4gdGhlIGRhdGEuLi4KCmBgYHtyfQp0b3BfZXhwdCA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsX2NwbV92YXJpYW5jZSwgZmlsdGVyID0gVFJVRSkgJT4lCiAgdmFyaWFuY2VfZXhwdCgpCnRvcF9mZCA8LSBmRGF0YSh0b3BfZXhwdCkKdG9wX2V4IDwtIGV4cHJzKHRvcF9leHB0KQppZHggPC0gb3JkZXIodG9wX2ZkW1siZXhwcnNfZ2VuZV9zdGRldiJdXSwgZGVjcmVhc2luZyA9IFRSVUUpCnRvcF9kZiA8LSB0b3BfZmRbaWR4LCBdCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGRhdGEgPSBoZWFkKHRvcF9mZCwgbiA9IDEwMCksCiAgICBleGNlbCA9IGdsdWUoImV4Y2VsL3RfY2xpbmljYWxfY3BtX3N0ZGV2X3RvcDEwMC12e3Zlcn0ueGxzeCIpKQoKYm90dG9tX2V4cHQgPC0gbm9ybWFsaXplX2V4cHQodF9jbGluaWNhbF9jcG1fdmFyaWFuY2UsIGZpbHRlciA9ICJzaW1wbGUiLCB0aHJlc2hvbGQgPSA1MDApICU+JQogIHZhcmlhbmNlX2V4cHQoKQpib3R0b21fZmQgPC0gZkRhdGEoYm90dG9tX2V4cHQpCmJvdHRvbV9leCA8LSBleHBycyhib3R0b21fZXhwdCkKaWR4IDwtIG9yZGVyKGJvdHRvbV9mZFtbImV4cHJzX2dlbmVfc3RkZXYiXV0pCmJvdHRvbSA8LSBib3R0b21fZmRbaWR4LCBdCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGRhdGEgPSBoZWFkKGJvdHRvbV9mZCwgbiA9IDEwMCksCiAgICBleGNlbCA9IGdsdWUoImV4Y2VsL3RfY2xpbmljYWxfY3BtX3N0ZGV2X2JvdHRvbTEwMC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIFN1bW1hcml6ZTogQ29sbGVjdCBUdW1hY28gc2FtcGxlIG51bWJlcnMuCgpBdCBsZWFzdCBpbiB0aGVvcnksIGV2ZXJ5dGhpbmcgd2hpY2ggZm9sbG93cyB3aWxsIGJlIHVzaW5nIHRoZSBhYm92ZQonY2xpbmljYWwnIGRhdGEgc3RydWN0dXJlLiAgVGh1cywgbGV0IHVzIGNvdW50IGl0IHVwIGFuZCBnZXQgYSBzZW5zZQpvZiB3aGF0IHdlIHdpbGwgd29yayB3aXRoLgoKYGBge3J9CnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpW1siZHJ1ZyJdXSkKdGFibGUocERhdGEodF9jbGluaWNhbClbWyJjbGluaWMiXV0pCnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKVtbInR5cGVvZmNlbGxzIl1dKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKVtbInZpc2l0bnVtYmVyIl1dKQpzdW1tYXJ5KHBEYXRhKHRfY2xpbmljYWwpW1siRXZvbHV0aW9uX1RpbWUiXV0pCnN1bW1hcnkocERhdGEodF9jbGluaWNhbClbWyJQcmVzY3JpYmVkX0RhaWx5X0Rvc2VfR2x1YyJdXSkKc3VtbWFyeShwRGF0YSh0X2NsaW5pY2FsKVtbIlYzX1ZlcnRpY2FsX0F4aXNfTGVzaW9uIl1dKQpzdW1tYXJ5KHBEYXRhKHRfY2xpbmljYWwpW1siVjNfVG90YWxfQXJlYV9MZXNpb24iXV0pCnN1bW1hcnkocERhdGEodF9jbGluaWNhbClbWyJWM19Ib3Jpem9udGFsX0F4aXNfVWxjZXIiXV0pCnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpW1siU2V4Il1dKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKVtbIkV0aG5pY2l0eSJdXSkKc3VtbWFyeShwRGF0YSh0X2NsaW5pY2FsKVtbIkFnZSJdXSkKc3VtbWFyeShwRGF0YSh0X2NsaW5pY2FsKVtbIldlaWdodCJdXSkKdGFibGUocERhdGEodF9jbGluaWNhbClbWyJIZWlnaHQiXV0pCgpsZW5ndGgodW5pcXVlKHBEYXRhKHRfY2xpbmljYWwpW1siUGF0aWVudF9JRCJdXSkpCm9ubHlfY3VyZSA8LSBwRGF0YSh0X2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIKY19tZXRhIDwtIHBEYXRhKHRfY2xpbmljYWwpW29ubHlfY3VyZSwgXQpsZW5ndGgodW5pcXVlKGNfbWV0YVtbIlBhdGllbnRfSUQiXV0pKQpvbmx5X2ZhaWwgPC0gcERhdGEodF9jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiCmZfbWV0YSA8LSBwRGF0YSh0X2NsaW5pY2FsKVtvbmx5X2ZhaWwsIF0KbGVuZ3RoKHVuaXF1ZShmX21ldGFbWyJQYXRpZW50X0lEIl1dKSkKYGBgCgojIyBTcGxpdCB0aGUgZGF0YSBieSBjdXJlL2ZhaWwgZm9yIHNvbWUgY291bnRpbmcKCmBgYHtyfQp0X2N1cmUgPC0gc3Vic2V0X2V4cHQodF9jbGluaWNhbCwgc3Vic2V0ID0gImZpbmFsb3V0Y29tZT09J2N1cmUnIikKdGFibGUocERhdGEodF9jdXJlKSR2aXNpdG51bWJlcikKCnRfZmFpbCA8LSBzdWJzZXRfZXhwdCh0X2NsaW5pY2FsLCBzdWJzZXQgPSAiZmluYWxvdXRjb21lPT0nZmFpbHVyZSciKQp0YWJsZShwRGF0YSh0X2ZhaWwpJHZpc2l0bnVtYmVyKQpgYGAKCiMjIFN1YnNldDogQ3JlYXRlIFR1bWFjby1vbmx5IGFuZCBjZWxsLXR5cGUgc3BlY2lmaWMgZGF0YQoKSSBwcmV2aW91c2x5IG1hZGUgYSBidW5jaCBvZiBkYXRhIHN1YnNldHMgYnkgdmlzaXQsIGNlbGwgdHlwZSwgZXRjLgpTbyBsZXQgdXMgb3ZlcndyaXRlIHRoZW0gYWxsIHdpdGggdmVyc2lvbnMgd2hpY2ggY29udGFpbiBvbmx5IHRoZQpUdW1hY28gc2FtcGxlcy4KCiMjIyBUdW1hY28gYmlvcHNpZXMKClRoZSBpcyBhIGNvcHkgb2YgdGhlIGNlbGwgdHlwZSBleHRyYWN0aW9ucyBhYm92ZSwgZXhjZXB0IHdlIGxlYWQgb2ZmCndpdGggdGhlIHJlbW92YWwgb2YgdGhlIENhbGkgc2FtcGxlcy4KCmBgYHtyfQp0X2Jpb3BzaWVzIDwtIHRjX2Jpb3BzaWVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSd0dW1hY28nIikKc2F2ZShsaXN0ID0gInRfYmlvcHNpZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfYmlvcHNpZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X2Jpb3BzaWVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfYmlvcHNpZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9iaW9wc2llcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9iaW9wc2llcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9iaW9wc2llcy12e3Zlcn0uY3N2IikpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2Jpb3BzaWVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfYmlvcHNpZXNfc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIFR1bWFjbyBFb3Npbm9waGlscwoKYGBge3J9CnRfZW9zaW5vcGhpbHMgPC0gdGNfZW9zaW5vcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J3R1bWFjbyciKQpzYXZlKGxpc3QgPSAidF9lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfZW9zaW5vcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90X2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9lb3Npbm9waGlsc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9lb3Npbm9waGlsc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gc3Vic2V0cyBtb25vY3l0ZXMKCmBgYHtyfQp0X21vbm9jeXRlcyA8LSB0Y19tb25vY3l0ZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J3R1bWFjbyciKQpzYXZlKGxpc3QgPSAidF9tb25vY3l0ZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF9tb25vY3l0ZXMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90X21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfbW9ub2N5dGVzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdF9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHN1YnNldHMgbmV1dHJvcGhpbHMKCmBgYHtyfQp0X25ldXRyb3BoaWxzIDwtIHRjX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSd0dW1hY28nIikKc2F2ZShsaXN0ID0gInRfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X25ldXRyb3BoaWxzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdF9uZXV0cm9waGlscy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3RfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3RfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIFZpc2l0IDEgc2FtcGxlcwoKYGBge3J9CnR2MV9zYW1wbGVzIDwtIHRjdjFfc2FtcGxlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djFfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYxX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0djFfc2FtcGxlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djFfc2FtcGxlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYxX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYxX3NhbXBsZXMsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFLCBiYXRjaD0ic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYxX3NhbXBsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djFfc2FtcGxlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gVmlzaXQgMiBzYW1wbGVzCgpgYGB7cn0KdHYyX3NhbXBsZXMgPC0gdGN2Ml9zYW1wbGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSd0dW1hY28nIikKc2F2ZShsaXN0ID0gInR2Ml9zYW1wbGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djJfc2FtcGxlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2Ml9zYW1wbGVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2Ml9zYW1wbGVzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYyX3NhbXBsZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfc2FtcGxlcywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djJfc2FtcGxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9zYW1wbGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAzIHNhbXBsZXMKCmBgYHtyfQp0djNfc2FtcGxlcyA8LSB0Y3YzX3NhbXBsZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J3R1bWFjbyciKQpzYXZlKGxpc3QgPSAidHYzX3NhbXBsZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2M19zYW1wbGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYzX3NhbXBsZXMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX3NhbXBsZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYzX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djNfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2M19zYW1wbGVzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYzX3NhbXBsZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDEgRW9zaW5vcGhpbHMKCmBgYHtyfQp0djFfZW9zaW5vcGhpbHMgPC0gdGN2MV9lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djFfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2MV9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2MV9lb3Npbm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYxX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djFfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYxX2Vvc2lub3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAyIHNhbXBsZXMKCmBgYHtyfQp0djJfZW9zaW5vcGhpbHMgPC0gdGN2Ml9lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djJfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2Ml9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2Ml9lb3Npbm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYyX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djJfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYyX2Vvc2lub3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAzIGVvc2lub3BoaWwKCmBgYHtyfQp0djNfZW9zaW5vcGhpbHMgPC0gdGN2M19lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djNfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2M19lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2M19lb3Npbm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYzX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2M19lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djNfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCiMjIE5vdGUsIHRoZSBjYmNiIGZpbHRlciBsZWZ0IGJlaGluZCBhIHN1ZmZpY2llbnQgbnVtYmVyIG9mIHplcm9zIHRoYXQgaXQgY29uZnVzZWQgY3BtLgpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSAic2ltcGxlIiwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djNfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDEgbW9ub2N5dGVzCgpgYGB7cn0KdHYxX21vbm9jeXRlcyA8LSB0Y3YxX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djFfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djFfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYxX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2MV9tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbW9ub2N5dGVzLCBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSwgYmF0Y2g9InN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2MV9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDIgbW9ub2N5dGVzCgpgYGB7cn0KdHYyX21vbm9jeXRlcyA8LSB0Y3YyX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djJfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djJfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYyX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2Ml9tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2Ml9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDMgbW9ub2N5dGVzCgpgYGB7cn0KdHYzX21vbm9jeXRlcyA8LSB0Y3YzX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djNfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djNfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYzX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2M19tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2M19tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2M19tb25vY3l0ZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2M19tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDEgbmV1dHJvcGhpbHMKCmBgYHtyfQp0djFfbmV1dHJvcGhpbHMgPC0gdGN2MV9uZXV0cm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0ndHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djFfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3R2MV9uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2MV9uZXV0cm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYxX25ldXRyb3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2MV9uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djFfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYxX25ldXRyb3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAyIG5ldXRyb3BoaWxzCgpgYGB7cn0KdHYyX25ldXRyb3BoaWxzIDwtIHRjdjJfbmV1dHJvcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J3R1bWFjbyciKQpzYXZlKGxpc3QgPSAidHYyX25ldXRyb3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djJfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0djJfbmV1dHJvcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2Ml9uZXV0cm9waGlscy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djJfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9UdW1hY28vdHYyX25ldXRyb3BoaWxzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL3R2Ml9uZXV0cm9waGlsc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gdmlzaXQgMyBuZXV0cm9waGlscwoKYGBge3J9CnR2M19uZXV0cm9waGlscyA8LSB0Y3YzX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSd0dW1hY28nIikKc2F2ZShsaXN0ID0gInR2M19uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYzX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYzX25ldXRyb3BoaWxzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90djNfbmV1dHJvcGhpbHMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vdHYzX25ldXRyb3BoaWxzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3R2M19uZXV0cm9waGlsc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90djNfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIERhdGFzZXQ6IE9ubHkgQ2FsaSBzYW1wbGVzCgpFdmVuIHRob3VnaCB3ZSBhcmUgb25seSBjb25zaWRlcmluZyB0aGUgVHVtYWNvIHNhbXBsZXMsIG9uZSBtaWdodCB3aXNoCnRvIHBlcmZvcm0gY29tcGFyaXNvbnMgYW1vbmcgdGhlIENhbGkgc2FtcGxlcy4gIFRoZSBmb2xsb3dpbmcgYmxvY2tzCnRoZXJlZm9yZSBzZXBhcmF0ZSB0aGVtIG91dCBpbiBhIHNpbWlsYXIgZmFzaGlvbi4KCmBgYHtyfQpkaXIuY3JlYXRlKCJjcG0vNF9DYWxpIiwgcmVjdXJzaXZlID0gVFJVRSkKY19jbGluaWNhbCA8LSB0Y19jbGluaWNhbCAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY19jbGluaWNhbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19jbGluaWNhbC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfY2xpbmljYWwiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19jbGluaWNhbCwgY29udmVydCA9ICJjcG0iKQpjX2NsaW5pY2FsX2NwbV92YXJpYW5jZSA8LSB2YXJpYW5jZV9leHB0KGNwbV9kYXRhKQoKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2NfY2xpbmljYWwtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS90X2NsaW5pY2FsLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19jbGluaWNhbCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19jbGluaWNhbF9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY19jbGluaWNhbF9zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKClRoZSBDYWxpIHNhbXBsZXMgd2l0aG91dCBiaW9wc2llcy4KCmBgYHtyfQpjX2NsaW5pY2FsX25vYmlvcCA8LSBzdWJzZXRfZXhwdChjX2NsaW5pY2FsLCBzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikKc2F2ZShsaXN0ID0gImNfY2xpbmljYWxfbm9iaW9wIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jX2NsaW5pY2FsX25vYmlvcC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfY2xpbmljYWxfbm9iaW9wIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWxfbm9iaW9wLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jX2NsaW5pY2FsX25vYmlvcC12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19jbGluaWNhbCwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jX2NsaW5pY2FsX3N2YS12e3Zlcn0uY3N2IikpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsX25vYmlvcCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19jbGluaWNhbF9ub2Jpb3Bfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsX25vYmlvcCwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jX2NsaW5pY2FsX25vYmlvcF9zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBQdWxsIG91dCB0aGUgdG9wLW4gbW9zdCB2YXJpYW50IGdlbmVzCgpJIGFkZGVkIGEgZmV3IGNvbHVtbnMgdG8gdGhlIGdlbmUgYW5ub3RhdGlvbnMgcmVmbGVjdGluZyB0aGUKdmFyaWFuY2Uvc3RkZXYvbWVhbiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZS4gIFRoaXMgcmVhbGx5IGhpZ2hsaWdodHMKdGhlIGV4dHJhb3JkaW5hcnkgZGVncmVlIHRvIHdoaWNoIGdlbmVzIGFyZSBjaGFuZ2luZyBpbiB0aGUgZGF0YS4uLgoKCmBgYHtyfQp0b3BfZXhwdCA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsX2NwbV92YXJpYW5jZSwgZmlsdGVyID0gVFJVRSkgJT4lCiAgdmFyaWFuY2VfZXhwdCgpCnRvcF9mZCA8LSBmRGF0YSh0b3BfZXhwdCkKdG9wX2V4IDwtIGV4cHJzKHRvcF9leHB0KQppZHggPC0gb3JkZXIodG9wX2ZkW1siZXhwcnNfZ2VuZV9zdGRldiJdXSwgZGVjcmVhc2luZyA9IFRSVUUpCnRvcF9kZiA8LSB0b3BfZmRbaWR4LCBdCgp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBkYXRhID0gaGVhZCh0b3BfZmQsIG4gPSAxMDApLAogICAgZXhjZWwgPSBnbHVlKCJleGNlbC9jX2NsaW5pY2FsX2NwbV9zdGRldl90b3AxMDAtdnt2ZXJ9Lnhsc3giKSkKCmJvdHRvbV9leHB0IDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWxfY3BtX3ZhcmlhbmNlLCBmaWx0ZXIgPSAic2ltcGxlIiwgdGhyZXNob2xkID0gNTAwKSAlPiUKICB2YXJpYW5jZV9leHB0KCkKYm90dG9tX2ZkIDwtIGZEYXRhKGJvdHRvbV9leHB0KQpib3R0b21fZXggPC0gZXhwcnMoYm90dG9tX2V4cHQpCmlkeCA8LSBvcmRlcihib3R0b21fZmRbWyJleHByc19nZW5lX3N0ZGV2Il1dKQpib3R0b20gPC0gYm90dG9tX2ZkW2lkeCwgXQoKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZGF0YSA9IGhlYWQoYm90dG9tX2ZkLCBuID0gMTAwKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZXhjZWwvY19jbGluaWNhbF9jcG1fc3RkZXZfYm90dG9tMTAwLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgU3VtbWFyaXplOiBDb2xsZWN0IENhbGkgc2FtcGxlIG51bWJlcnMuCgpUaGlzIGlzIGNvcHkvcGFzdGVkIGZyb20gYWJvdmUgYW5kIHByaW50cyBvdXQgaG93IG1hbnkgb2YgZWFjaCBzYW1wbGUKdHlwZSB0aGVyZSBhcmUgb2YgZWFjaCBjYXRlZ29yeS4KCmBgYHtyfQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKVtbImRydWciXV0pCnRhYmxlKHBEYXRhKGNfY2xpbmljYWwpW1siY2xpbmljIl1dKQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUocERhdGEoY19jbGluaWNhbClbWyJ0eXBlb2ZjZWxscyJdXSkKdGFibGUocERhdGEoY19jbGluaWNhbClbWyJ2aXNpdG51bWJlciJdXSkKc3VtbWFyeShwRGF0YShjX2NsaW5pY2FsKVtbIkV2b2x1dGlvbl9UaW1lIl1dKQpzdW1tYXJ5KHBEYXRhKGNfY2xpbmljYWwpW1siUHJlc2NyaWJlZF9EYWlseV9Eb3NlX0dsdWMiXV0pCnN1bW1hcnkocERhdGEoY19jbGluaWNhbClbWyJWM19WZXJ0aWNhbF9BeGlzX0xlc2lvbiJdXSkKc3VtbWFyeShwRGF0YShjX2NsaW5pY2FsKVtbIlYzX1RvdGFsX0FyZWFfTGVzaW9uIl1dKQpzdW1tYXJ5KHBEYXRhKGNfY2xpbmljYWwpW1siVjNfSG9yaXpvbnRhbF9BeGlzX1VsY2VyIl1dKQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKVtbIlNleCJdXSkKdGFibGUocERhdGEoY19jbGluaWNhbClbWyJFdGhuaWNpdHkiXV0pCnN1bW1hcnkocERhdGEoY19jbGluaWNhbClbWyJBZ2UiXV0pCnN1bW1hcnkocERhdGEoY19jbGluaWNhbClbWyJIZWlnaHQiXV0pCnN1bW1hcnkocERhdGEoY19jbGluaWNhbClbWyJXZWlnaHQiXV0pCgpsZW5ndGgodW5pcXVlKHBEYXRhKGNfY2xpbmljYWwpW1siUGF0aWVudF9JRCJdXSkpCm9ubHlfY3VyZSA8LSBwRGF0YShjX2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIKY19tZXRhIDwtIHBEYXRhKGNfY2xpbmljYWwpW29ubHlfY3VyZSwgXQpsZW5ndGgodW5pcXVlKGNfbWV0YVtbIlBhdGllbnRfSUQiXV0pKQpvbmx5X2ZhaWwgPC0gcERhdGEoY19jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiCmZfbWV0YSA8LSBwRGF0YShjX2NsaW5pY2FsKVtvbmx5X2ZhaWwsIF0KbGVuZ3RoKHVuaXF1ZShmX21ldGFbWyJQYXRpZW50X0lEIl1dKSkKYGBgCgojIyBTcGxpdCB0aGUgZGF0YSBieSBjdXJlL2ZhaWwgZm9yIHNvbWUgY291bnRpbmcKCmBgYHtyfQpjYWxpX2N1cmUgPC0gc3Vic2V0X2V4cHQoY19jbGluaWNhbCwgc3Vic2V0ID0gImZpbmFsb3V0Y29tZT09J2N1cmUnIikKdGFibGUocERhdGEoY2FsaV9jdXJlKVtbInZpc2l0bnVtYmVyIl1dKQoKY2FsaV9mYWlsIDwtIHN1YnNldF9leHB0KGNfY2xpbmljYWwsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdmYWlsdXJlJyIpCnRhYmxlKHBEYXRhKGNhbGlfZmFpbClbWyJ2aXNpdG51bWJlciJdXSkKYGBgCgojIyBTdWJzZXQ6IENyZWF0ZSBDYWxpLXNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSB2YXJpb3VzIHN0cnVjdHVyZXMKCkkgcHJldmlvdXNseSBtYWRlIGEgYnVuY2ggb2YgZGF0YSBzdWJzZXRzIGJ5IHZpc2l0LCBjZWxsIHR5cGUsIGV0Yy4KU28gbGV0IHVzIG92ZXJ3cml0ZSB0aGVtIGFsbCB3aXRoIHZlcnNpb25zIHdoaWNoIGNvbnRhaW4gb25seSB0aGUKQ2FsaSBzYW1wbGVzLgoKVGhlcmUgaXMgbm8gZ29pbmcgYmFjayB0byB0aGUgQ2FsaSBzYW1wbGVzIGFmdGVyIHRoaXMgYmxvY2sgdW5sZXNzIHdlCnJlZ2VuZXJhdGUgdGhlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgZXhwcmVzc2lvbnNldHMuCgojIyMgQ2FsaSBiaW9wc2llcwoKYGBge3J9CmNfYmlvcHNpZXMgPC0gdGNfYmlvcHNpZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImNfYmlvcHNpZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfYmlvcHNpZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX2Jpb3BzaWVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfYmlvcHNpZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2NfYmlvcHNpZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfYmlvcHNpZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2NfYmlvcHNpZXMtdnt2ZXJ9LmNzdiIpKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19iaW9wc2llcywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19iaW9wc2llc19ub3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBDYWxpIEVvc2lub3BoaWxzCgpgYGB7cn0KY19lb3Npbm9waGlscyA8LSB0Y19lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY19lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfZW9zaW5vcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19lb3Npbm9waGlscy12e3Zlcn0ueGxzeCIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jX2Vvc2lub3BoaWxzX25vc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2NfZW9zaW5vcGhpbHNfbm9zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBDYWxpIHN1YnNldHMgbW9ub2N5dGVzCgpgYGB7cn0KY19tb25vY3l0ZXMgPC0gdGNfbW9ub2N5dGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX21vbm9jeXRlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jX21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jX21vbm9jeXRlc19ub3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY19tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSBzdWJzZXRzIG5ldXRyb3BoaWxzCgpgYGB7cn0KY19uZXV0cm9waGlscyA8LSB0Y19uZXV0cm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY19uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfbmV1dHJvcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY19uZXV0cm9waGlsLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY19uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2NfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2NfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSBWaXNpdCAxIHNhbXBsZXMKCmBgYHtyfQpjdjFfc2FtcGxlcyA8LSB0Y3YxX3NhbXBsZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImN2MV9zYW1wbGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjFfc2FtcGxlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2MV9zYW1wbGVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjFfc2FtcGxlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2MV9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX3NhbXBsZXMsIGNvbnZlcnQgPSAgImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjFfc2FtcGxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2MV9zYW1wbGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgVmlzaXQgMiBzYW1wbGVzCgpgYGB7cn0KY3YyX3NhbXBsZXMgPC0gdGN2Ml9zYW1wbGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjJfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YyX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjJfc2FtcGxlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjJfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjJfc2FtcGxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9zYW1wbGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMyBzYW1wbGVzCgpgYGB7cn0KY3YzX3NhbXBsZXMgPC0gdGN2M19zYW1wbGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjNfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YzX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfc2FtcGxlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YzX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjNfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfc2FtcGxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2M19zYW1wbGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMSBFb3Npbm9waGlscwoKYGBge3J9CmN2MV9lb3Npbm9waGlscyA8LSB0Y3YxX2Vvc2lub3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjFfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2MV9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2MV9lb3Npbm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2MV9lb3Npbm9waGlscy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjFfZW9zaW5vcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2MV9lb3Npbm9waGlsc19ub3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2MV9lb3Npbm9waGlsc19ub3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMiBzYW1wbGVzCgpgYGB7cn0KY3YyX2Vvc2lub3BoaWxzIDwtIHRjdjJfZW9zaW5vcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImN2Ml9lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YyX2Vvc2lub3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YyX2Vvc2lub3BoaWxzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX2Vvc2lub3BoaWxzX25vc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YyX2Vvc2lub3BoaWxzX25vc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdCAzIGVvc2lub3BoaWwKCmBgYHtyfQpjdjNfZW9zaW5vcGhpbHMgPC0gdGN2M19lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY3YzX2Vvc2lub3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjNfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfZW9zaW5vcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfZW9zaW5vcGhpbHMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19lb3Npbm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YzX2Vvc2lub3BoaWxzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfZW9zaW5vcGhpbHNfbm9zdmEtdnt2ZXJ9Lnhsc3giKSkKIyMgTm90ZSwgdGhlIGNiY2IgZmlsdGVyIGxlZnQgYmVoaW5kIGEgc3VmZmljaWVudCBudW1iZXIgb2YgemVyb3MgdGhhdCBpdCBjb25mdXNlZCBjcG0uCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfZW9zaW5vcGhpbHMsIGZpbHRlciA9ICJzaW1wbGUiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2M19lb3Npbm9waGlsc19ub3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMSBtb25vY3l0ZXMKCmBgYHtyfQpjdjFfbW9ub2N5dGVzIDwtIHRjdjFfbW9ub2N5dGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjFfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjFfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YxX21vbm9jeXRlcyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjFfbW9ub2N5dGVzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjFfbW9ub2N5dGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX21vbm9jeXRlcywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YxX21vbm9jeXRlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YxX21vbm9jeXRlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBDYWxpIHZpc2l0IDIgbW9ub2N5dGVzCgpgYGB7cn0KY3YyX21vbm9jeXRlcyA8LSB0Y3YyX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY3YyX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YyX21vbm9jeXRlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2Ml9tb25vY3l0ZXMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX21vbm9jeXRlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX21vbm9jeXRlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YyX21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2Ml9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdCAzIG1vbm9jeXRlcwoKYGBge3J9CmN2M19tb25vY3l0ZXMgPC0gdGN2M19tb25vY3l0ZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImN2M19tb25vY3l0ZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2M19tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfbW9ub2N5dGVzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2M19tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2M19tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfbW9ub2N5dGVzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjNfbW9ub2N5dGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMSBuZXV0cm9waGlscwoKYGBge3J9CmN2MV9uZXV0cm9waGlscyA8LSB0Y3YxX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdjYWxpJyIpCnNhdmUobGlzdCA9ICJjdjFfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2MV9uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2MV9uZXV0cm9waGlscyIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2MV9uZXV0cm9waGlscy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjFfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJjcG0vNF9DYWxpL2N2MV9uZXV0cm9waGlsc19zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgicnBrbS9jdjFfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdCAyIG5ldXRyb3BoaWxzCgpgYGB7cn0KY3YyX25ldXRyb3BoaWxzIDwtIHRjdjJfbmV1dHJvcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J2NhbGknIikKc2F2ZShsaXN0ID0gImN2Ml9uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YyX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YyX25ldXRyb3BoaWxzIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX25ldXRyb3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY3YyX25ldXRyb3BoaWxzX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJycGttL2N2Ml9uZXV0cm9waGlsc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBDYWxpIHZpc2l0IDMgbmV1dHJvcGhpbHMKCmBgYHtyfQpjdjNfbmV1dHJvcGhpbHMgPC0gdGN2M19uZXV0cm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nY2FsaSciKQpzYXZlKGxpc3QgPSAiY3YzX25ldXRyb3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjNfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfbmV1dHJvcGhpbHMiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfbmV1dHJvcGhpbHMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YzX25ldXRyb3BoaWxzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfQ2FsaS9jdjNfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoInJwa20vY3YzX25ldXRyb3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyBjb21wYXJlIHZpc2l0cwoKSXMgdGhpcyByZWR1bmRhbnQ/CgpgYGB7cn0KdGNfdmlzaXQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucygKICB0Y19jbGluaWNhbCwgZmFjdCA9ICJ2aXNpdG51bWJlciIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJ2aXNpdDIiXV0pICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikKc2F2ZShsaXN0ID0gInRjX3Zpc2l0IiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y192aXNpdC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX3Zpc2l0IikKCnRjX3YxdnMgPC0gdGNfdmlzaXQKcERhdGEodGNfdjF2cylbWyJ2aXNpdCJdXSA8LSBhcy5jaGFyYWN0ZXIocERhdGEodGNfdjF2cylbWyJ2aXNpdG51bWJlciJdXSkKdjFfc2FtcGxlcyA8LSBwRGF0YSh0Y192MXZzKVtbInZpc2l0Il1dID09ICIxIgpwRGF0YSh0Y192MXZzKVt2MV9zYW1wbGVzLCAidmlzaXQiXSA8LSAiZmlyc3QiCnBEYXRhKHRjX3YxdnMpWyF2MV9zYW1wbGVzLCAidmlzaXQiXSA8LSAibGF0ZXIiCnBEYXRhKHRjX3YxdnMpW1sidmlzaXQiXV0gPC0gYXMuZmFjdG9yKHBEYXRhKHRjX3YxdnMpW1sidmlzaXQiXV0pCnRjX3YxdnMgPC0gc2V0X2V4cHRfY29uZGl0aW9ucygKICB0Y192MXZzLCBmYWN0ID0gInZpc2l0IiwgY29sb3JzID0gY29sb3JfY2hvaWNlc1tbInR3b192aXNpdHMiXV0pCnNhdmUobGlzdCA9ICJ0Y192MXZzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y192MXZzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfdjF2cyIpCnRfdjF2cyA8LSBzdWJzZXRfZXhwdCh0Y192MXZzLCBzdWJzZXQgPSAiY2xpbmljID09ICd0dW1hY28nIikKc2F2ZShsaXN0ID0gInRfdjF2cyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF92MXZzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF92MXZzIikKCnRfdmlzaXQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucygKICB0X2NsaW5pY2FsLCBmYWN0ID0gInZpc2l0bnVtYmVyIiwgY29sb3JzID0gY29sb3JfY2hvaWNlc1tbInZpc2l0MiJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J2Jpb3BzeSciKQpzYXZlKGxpc3QgPSAidF92aXNpdCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF92aXNpdC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfdmlzaXQiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X3Zpc2l0LCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL3RfdmlzaXQtdnt2ZXJ9Lnhsc3giKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF92aXNpdCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X1R1bWFjby90X3Zpc2l0X3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBWaXNpdCBjdXJlL2ZhaWwgY29udHJhc3RzCgpgYGB7cn0KdmlzaXRfY2ZfZXhwdF9mYWN0b3IgPC0gcGFzdGUwKCJ2IiwgcERhdGEodF9jbGluaWNhbClbWyJ2aXNpdG51bWJlciJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKHRfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dKQp0X3Zpc2l0Y2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0X2NsaW5pY2FsLCBmYWN0ID0gdmlzaXRfY2ZfZXhwdF9mYWN0b3IpCnNhdmUobGlzdCA9ICJ0X3Zpc2l0Y2YiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfdmlzaXRjZi12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfdmlzaXRjZiIpCgp0X3Zpc2l0Y2ZfZW9zaW5vcGhpbCA8LSBzdWJzZXRfZXhwdCh0X3Zpc2l0Y2YsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J2Vvc2lub3BoaWxzJyIpCnNhdmUobGlzdCA9ICJ0X3Zpc2l0Y2ZfZW9zaW5vcGhpbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF92aXNpdGNmX2Vvc2lub3BoaWwtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X3Zpc2l0Y2ZfZW9zaW5vcGhpbCIpCgp0X3Zpc2l0Y2ZfbW9ub2N5dGUgPC0gc3Vic2V0X2V4cHQodF92aXNpdGNmLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdtb25vY3l0ZXMnIikKc2F2ZShsaXN0ID0gInRfdmlzaXRjZl9tb25vY3l0ZSIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF92aXNpdGNmX21vbm9jeXRlLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF92aXNpdGNmX21vbm9jeXRlIikKCnRfdmlzaXRjZl9uZXV0cm9waGlsIDwtIHN1YnNldF9leHB0KHRfdmlzaXRjZiwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKc2F2ZShsaXN0ID0gInRfdmlzaXRjZl9uZXV0cm9waGlsIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190X3Zpc2l0Y2ZfbmV1dHJvcGhpbC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfdmlzaXRjZl9uZXV0cm9waGlsIikKYGBgCgojIyMgQ2FsaSBjb21wYXJlIHZpc2l0cwoKSXMgdGhpcyByZWR1bmRhbnQ/CgpgYGB7cn0KY192aXNpdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGNfY2xpbmljYWwsIGZhY3QgPSAidmlzaXRudW1iZXIiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInR5cGVvZmNlbGxzIT0nYmlvcHN5JyIpCnNhdmUobGlzdCA9ICJjX3Zpc2l0IiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jX3Zpc2l0LXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY192aXNpdCIpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX3Zpc2l0LCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiY3BtLzRfVHVtYWNvL2NfdmlzaXQtdnt2ZXJ9Lnhsc3giKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY192aXNpdCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImNwbS80X0NhbGkvY192aXNpdF9zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgVmlzaXQgY3VyZS9mYWlsIGNvbnRyYXN0cwoKYGBge3J9CnZpc2l0X2NmX2V4cHRfZmFjdG9yIDwtIHBhc3RlMCgidiIsIHBEYXRhKGNfY2xpbmljYWwpW1sidmlzaXRudW1iZXIiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YShjX2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSkKY192aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoY19jbGluaWNhbCwgZmFjdCA9IHZpc2l0X2NmX2V4cHRfZmFjdG9yKQpzYXZlKGxpc3QgPSAiY192aXNpdGNmIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jX3Zpc2l0Y2Ytdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX3Zpc2l0Y2YiKQoKY192aXNpdGNmX2Vvc2lub3BoaWwgPC0gc3Vic2V0X2V4cHQoY192aXNpdGNmLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQpzYXZlKGxpc3QgPSAiY192aXNpdGNmX2Vvc2lub3BoaWwiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfdmlzaXRjZl9lb3Npbm9waGlsLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY192aXNpdGNmX2Vvc2lub3BoaWwiKQoKY192aXNpdGNmX21vbm9jeXRlIDwtIHN1YnNldF9leHB0KGNfdmlzaXRjZiwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnNhdmUobGlzdCA9ICJjX3Zpc2l0Y2ZfbW9ub2N5dGUiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfdmlzaXRjZl9tb25vY3l0ZS12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfdmlzaXRjZl9tb25vY3l0ZSIpCgpjX3Zpc2l0Y2ZfbmV1dHJvcGhpbCA8LSBzdWJzZXRfZXhwdChjX3Zpc2l0Y2YsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J25ldXRyb3BoaWxzJyIpCnNhdmUobGlzdCA9ICJjX3Zpc2l0Y2ZfbmV1dHJvcGhpbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY192aXNpdGNmX25ldXRyb3BoaWwtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX3Zpc2l0Y2ZfbmV1dHJvcGhpbCIpCmBgYAoKIyBTdW1tYXJpemU6IFRhYnVsYXRlIHNhbXBsZSBudW1iZXJzCgojIyBCb3RoCgpgYGB7cn0KbmNvbChleHBycyh0Y19jbGluaWNhbCkpCnN1bShwRGF0YSh0Y19jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGNfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCmFsbF90eXBlc1tbImJpb3BzeSJdXQpzdW0ocERhdGEodGNfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjX2Jpb3BzaWVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJlb3Npbm9waGlscyJdXQpzdW0ocERhdGEodGNfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHRjdjFfZW9zaW5vcGhpbHMpKQpzdW0ocERhdGEodGN2MV9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGN2MV9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0Y3YyX2Vvc2lub3BoaWxzKSkKc3VtKHBEYXRhKHRjdjJfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjdjJfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodGN2M19lb3Npbm9waGlscykpCnN1bShwRGF0YSh0Y3YzX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0Y3YzX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJtb25vY3l0ZXMiXV0Kc3VtKHBEYXRhKHRjX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHRjdjFfbW9ub2N5dGVzKSkKc3VtKHBEYXRhKHRjdjFfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0Y3YxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0Y3YyX21vbm9jeXRlcykpCnN1bShwRGF0YSh0Y3YyX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGN2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodGN2M19tb25vY3l0ZXMpKQpzdW0ocERhdGEodGN2M19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjdjNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJuZXV0cm9waGlscyJdXQpzdW0ocERhdGEodGNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRjX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHRjdjFfbmV1dHJvcGhpbHMpKQpzdW0ocERhdGEodGN2MV9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGN2MV9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0Y3YyX21vbm9jeXRlcykpCnN1bShwRGF0YSh0Y3YyX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0Y3YyX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHRjdjNfbmV1dHJvcGhpbHMpKQpzdW0ocERhdGEodGN2M19uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodGN2M19uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQpgYGAKCiMjIFR1bWFjbwoKSGVyZSBpcyBhbiBvdXRsaW5lIG9mIHRoZSBzYW1wbGVzIGluIHRoZWlyIGN1cnJlbnQgc3RhdGU6CgpgYGB7cn0KbmNvbChleHBycyh0X2NsaW5pY2FsKSkKc3VtKHBEYXRhKHRfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCmFsbF90eXBlc1tbImJpb3BzeSJdXQpzdW0ocERhdGEodF9iaW9wc2llcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodF9iaW9wc2llcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKYWxsX3R5cGVzW1siZW9zaW5vcGhpbHMiXV0Kc3VtKHBEYXRhKHRfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYxX2Vvc2lub3BoaWxzKSkKc3VtKHBEYXRhKHR2MV9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodHYxX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHR2Ml9lb3Npbm9waGlscykpCnN1bShwRGF0YSh0djJfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHR2Ml9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djNfZW9zaW5vcGhpbHMpKQpzdW0ocERhdGEodHYzX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djNfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCmFsbF90eXBlc1tbIm1vbm9jeXRlcyJdXQpzdW0ocERhdGEodF9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHR2MV9tb25vY3l0ZXMpKQpzdW0ocERhdGEodHYxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodHYxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djJfbW9ub2N5dGVzKSkKc3VtKHBEYXRhKHR2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHR2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYzX21vbm9jeXRlcykpCnN1bShwRGF0YSh0djNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJuZXV0cm9waGlscyJdXQpzdW0ocERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djFfbmV1dHJvcGhpbHMpKQpzdW0ocERhdGEodHYxX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djFfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYyX21vbm9jeXRlcykpCnN1bShwRGF0YSh0djJfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHR2Ml9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djNfbmV1dHJvcGhpbHMpKQpzdW0ocERhdGEodHYzX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKYGBgCgojIyBDYWxpCgpgYGB7cn0KbmNvbChleHBycyhjX2NsaW5pY2FsKSkKc3VtKHBEYXRhKGNfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGNfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCiNhbGxfdHlwZXNbWyJiaW9wc3kiXV0Kc3VtKHBEYXRhKGNfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGNfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCiNhbGxfdHlwZXNbWyJlb3Npbm9waGlscyJdXQpzdW0ocERhdGEoY19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YShjdjFfZW9zaW5vcGhpbHMpKQpzdW0ocERhdGEoY3YxX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YShjdjFfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEoY3YyX2Vvc2lub3BoaWxzKSkKc3VtKHBEYXRhKGN2Ml9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY3YyX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKGN2M19lb3Npbm9waGlscykpCnN1bShwRGF0YShjdjNfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGN2M19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKI2FsbF90eXBlc1tbIm1vbm9jeXRlcyJdXQpzdW0ocERhdGEoY19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKGN2MV9tb25vY3l0ZXMpKQpzdW0ocERhdGEoY3YxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY3YxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YShjdjJfbW9ub2N5dGVzKSkKc3VtKHBEYXRhKGN2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGN2Ml9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEoY3YzX21vbm9jeXRlcykpCnN1bShwRGF0YShjdjNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YShjdjNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgojYWxsX3R5cGVzW1sibmV1dHJvcGhpbHMiXV0Kc3VtKHBEYXRhKGNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKGNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEoY3YxX25ldXRyb3BoaWxzKSkKc3VtKHBEYXRhKGN2MV9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY3YxX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKGN2Ml9tb25vY3l0ZXMpKQpzdW0ocERhdGEoY3YyX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YShjdjJfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEoY3YzX25ldXRyb3BoaWxzKSkKc3VtKHBEYXRhKGN2M19uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEoY3YzX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCmBgYAoKIyBBbiBleHRlcm5hbCBkYXRhc2V0CgpPbmUgcG90ZW50aWFsbHkgaW50ZXJlc3RpbmcgY29tcGFyaXNvbnMgcG9pbnQsIGVzcGVjaWFsbHkgdmlzIGEgdmlzCnRoZSBCaW9wc3kgc2FtcGxlcywgaXMgdG8gY29tcGFyZSB3aXRoIGFub3RoZXIgc2V0IG9mIHJlY2VudApMLiBicmF6aWxpZW5zaXMgaW5mZWN0ZWQgYmlvcHN5IHNhbXBsZXMuICBUaGUgZm9sbG93aW5nIHNldHMgdXAgYW4KZXhwcmVzc2lvbnNldCB1c2luZyB0aGUgcmF3IGRhdGEgZnJvbSBiaW9wcm9qZWN0IFBSSk5BNTI1NjA0LgoKTm90ZSAyMDI0MDk6IEkganVzdCBhZGRlZCB0aGUgc2NvdHQgdHN2IG1ldGFkYXRhIHRvIHRoaXMgY29udGFpbmVyIGFuZAp0aHVzIHRvIHRoaXMgZGF0YSBzdHJ1Y3R1cmU7IHRoaXMgb25seSB3b3JrcyBiZWNhdXNlIHRoZSBzYW1wbGVzIGFyZQpuaWNlbHkgaW4gdGhlIHNhbWUgb3JkZXIuCgpgYGB7cn0KbmV3X3NhbXBsZV9zaGVldCA8LSBzbSgKICBzdXBwcmVzc1dhcm5pbmdzKGdhdGhlcl9wcmVwcm9jZXNzaW5nX21ldGFkYXRhKAogICAgInNhbXBsZV9zaGVldHMvc2NvdHRfc3JhX3NhbXBsZXMueGxzeCIsIHNwZWNpZmljYXRpb24gPSBtYWtlX3JuYXNlcV9zcGVjKCkpKSkKc2NvdHRfbWV0YWRhdGEgPC0gYXMuZGF0YS5mcmFtZShyZWFkcjo6cmVhZF90c3YoInNhbXBsZV9zaGVldHMvc2NvdHRfY2Fwc3VsZV9zdHVkeWRlc2lnbi50c3YiKSkKbmV3X21ldGEgPC0gY2JpbmQuZGF0YS5mcmFtZShuZXdfc2FtcGxlX3NoZWV0W1sibmV3X21ldGEiXV0sIHNjb3R0X21ldGFkYXRhKQoKZXh0ZXJuYWxfY2YgPC0gY3JlYXRlX2V4cHQobmV3X21ldGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbyA9IGhzX2Fubm90LCBmaWxlX2NvbHVtbiA9ICJoaXNhdGNvdW50dGFibGUiKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAidHJlYXRtZW50b3V0Y29tZSIpICU+JQogICAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInNleCIpICU+JQogICAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNvbmRpdGlvbiE9J25hJyIpCnBEYXRhKGV4dGVybmFsX2NmKVtbIlBhcmFzaXRlU3BlY2llcyJdXSA8LSAibHZicmF6aWxpZW5zaXMiCnNhdmUobGlzdCA9ICJleHRlcm5hbF9jZiIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfZXh0ZXJuYWxfY2Ytdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJleHRlcm5hbF9jZiIpCgpiaW9wc3lfY2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y19iaW9wc2llcywgZmFjdCA9ICJmaW5hbG91dGNvbWUiKQpwRGF0YShiaW9wc3lfY2YpW1sibGFiIl1dIDwtICJDb2xvbWJpYSIKcERhdGEoZXh0ZXJuYWxfY2YpW1sibGFiIl1dIDwtICJCcmF6aWwiCnBEYXRhKGV4dGVybmFsX2NmKVtbImZpbmFsb3V0Y29tZSJdXSA8LSBwRGF0YShleHRlcm5hbF9jZilbWyJ0cmVhdG1lbnRvdXRjb21lIl1dCgp0bXJjM19leHRlcm5hbCA8LSBjb21iaW5lX2V4cHRzKGV4dGVybmFsX2NmLCBiaW9wc3lfY2YpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJsYWIiLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1sibGFicyJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpCgpzYXZlKGxpc3QgPSAidG1yYzNfZXh0ZXJuYWwiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2V4dGVybmFsLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidG1yYzNfZXh0ZXJuYWwiKQoKdG1yYzNfZXh0ZXJuYWxfc3BlY2llcyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKAogIHRtcmMzX2V4dGVybmFsLCBmYWN0ID0gIlBhcmFzaXRlU3BlY2llcyIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJwYXJhc2l0ZSJdXSkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImxhYiIpCnNhdmUobGlzdCA9ICJ0bXJjM19leHRlcm5hbF9zcGVjaWVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19leHRlcm5hbF9zZXBjaWVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidG1yYzNfZXh0ZXJuYWxfc3BlY2llcyIpCgojIyBJbiBteSBzaW5ndWxhcml0eSBjb250YWluZXIsIHRoaXMgZmFpbHMgd2l0aCBhIHB0aHJlYWQgcHJvYmxlbSwgbm90IGRvaW5nIHF1YW50IGhlcmUuCiN0dCA8LSBub3JtYWxpemVfZXhwdCh0bXJjM19leHRlcm5hbF9zcGVjaWVzLCBmaWx0ZXIgPSBUUlVFLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiMgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIG5vcm0gPSAicXVhbnQiKQp0dCA8LSBub3JtYWxpemVfZXhwdCh0bXJjM19leHRlcm5hbF9zcGVjaWVzLCBmaWx0ZXIgPSBUUlVFLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQgPSAiY3BtIiwgbm9ybSA9ICJ0bW0iKQpwbG90X3BjYSh0dCkKCmNvbmZ1c2VkIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoCiAgaHNfZXhwdCwgZmFjdCA9ICJQYXJhc2l0ZVNwZWNpZXMiLCBjb2xvcnMgPSBjb2xvcl9jaG9pY2VzW1sicGFyYXNpdGUiXV0pCmBgYAoKIyMgRXRobmljaXR5CgpgYGB7ciB0X2V0bmlhX2V4cHR9CnRjX2V0bmlhX2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucygKICB0Y19jbGluaWNhbCwgZmFjdCA9ICJldG5pYSIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJldGhuaWNpdHkiXV0pCnNhdmUobGlzdCA9ICJ0Y19ldG5pYV9leHB0IiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y19ldG5pYS12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2V0bmlhX2V4cHQiKQoKdF9ldG5pYV9leHB0IDwtIHNldF9leHB0X2NvbmRpdGlvbnMoCiAgdF9jbGluaWNhbCwgZmFjdCA9ICJldG5pYSIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJldGhuaWNpdHkiXV0pCnNhdmUobGlzdCA9ICJ0X2V0bmlhX2V4cHQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfZXRuaWEtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X2V0bmlhX2V4cHQiKQpgYGAKCiMgQnJpbmcgYmFjayB0aGUgcGFyYXNpdGVzCgpoYWhhIEkga25ldyBJIHNob3VsZCBub3QgaGF2ZSByZW1vdmVkIHRoZSBmb2xsb3dpbmcgYmxvY2suICBJbgpwcmV2aW91cyBpdGVyYXRpb25zIG9mIHRoaXMgSSBpbmNsdWRlZCBhIGRhdGFzdHJ1Y3R1cmUgd2hpY2ggcHVsbGVkIGluCnRoZSBwYXJhc2l0ZSByZWFkcyBmcm9tIGFsbCBzYW1wbGVzIHdpdGggJ3N1ZmZpY2llbnQnIGNvdmVyYWdlLiAgVGhpcwppcyBub3QgdmVyeSBtYW55IHNhbXBsZXMsIGZvciB0aGUgc2ltcGxlIHJlYXNvbiB0aGF0IHRoZSBkcnVnCnRyZWF0bWVudCBiYXNpY2FsbHkgd29ya3MhICBBcyBhIHJlc3VsdCwgd2UgcmVtb3ZlZCB0aGUgZm9sbG93aW5nCnNlY3Rpb24gZnJvbSB0aGUgY29udGFpbmVyIChhbHNvIGZvciBzcGFjZSkuICBPaCwgSSBtYXkgbmVlZCB0byBjb3B5CnNvbWUgbW9yZSBjb3VudCB0YWJsZXMgaW50byB0aGUgY29udGFpbmVyIHJlY2lwZSBmb3IgdGhpcyB0byB3b3JrLgoKSXQgc2hvdWxkIGJlIG5vdGVkIChpZiBhbnlvbmUgZXZlciByZWFkcyB0aGlzKSwgdGhhdCBJIGFsc28gZGlkIGEKdmVyc2lvbiBvZiBhbGwgb2YgdGhlc2UgYW5hbHlzZXMgd2hlcmUgSSBleHBsaWNpdGx5IG1hZGUgYQpjb25jYXRlbmF0ZWQgZGF0YWJhc2UgKGdlbm9tZS9nZmYvQ0RTKSBvZiBodW1hbiBhbmQgcGFyYXNpdGUKcmVmZXJlbmNlcyAoZS5nLiBmb3Igc2FsbW9uL2hpc2F0L2J3YS9ldGMpIGFuZCBkaWQgYWxsIG9mIHRoaXMgdXNpbmcKaXQgaW4gb3JkZXIgdG8gc2F0aXNmeSBteXNlbGYgdGhhdCB0aGUgdmFyaW91cyB0cmVhdG1lbnRzIGFyZSBzaW1pbGFyCmVub3VnaCB0byBiZSBjYWxsZWQgdGhlIHNhbWUgKEkganVzdCBzYXcgdGhhdCBibG9jayB3aGlsZSBodW50aW5nIGZvcgp0aGlzIHBhcmFzaXRlIGRhdGEgYW5kIHRob3VnaHQgaXQgd2FzIHdvcnRoIG5vdGluZykuCgpJbiBhbnkgZXZlbnQsIHRoZSBmb2xsb3dpbmcgaXMgY29weS9wYXN0ZWQgZnJvbSBteSB3b3JraW5nIHRyZWU6CgojIyBEYXRhc2V0OiBQYXJhc2l0ZSByZWFkcwoKTWFrZSBhbiBleHByZXNzaW9uc2V0IG9mIHRoZSBwYXJhc2l0ZSByZWFkcyBpbiB0aGUgVE1SQzMgc2FtcGxlcyBhbmQKZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgZmF1eCBhbmQgcmVhbCByZWFkcy4KRS5nOiBBcmUgdGhlcmUgc2FtcGxlcyB3aGljaCBkZWZpbml0aXZlbHkgY29udGFpbiBwYXJhc2l0ZXM/CgpMYXRlciwgSSBtYW51YWxseSB3ZW50IHRocm91Z2ggdGhlIG1hcHBpbmdzIG9mIHNhbXBsZXMgd2l0aCBhCnNpZ25pZmljYW50IG51bWJlciBvZiBwYXJhc2l0ZSByZWFkcyBpbiBJR1Ygd2l0aCBzb21lIFRNUkMyIGtub3duCnp5bW9kZW1lIHNhbXBsZXMuICBJbiBtYW55IGNhc2VzIGl0IGlzIHBvc3NpYmxlIHRvIHN0YXRlIGRlZmluaXRpdmVseQp0aGUgY2xhc3NpZmljYXRpb24gb2YgdGhlIHBhcmFzaXRlIHdoaWNoIGluZmVjdGVkIGFuIGluZGl2aWR1YWwuCgpOb3RlOiBJIGFtIHJlbmFtaW5nIHRoZSByZXN1bHRpbmcgZGF0YSBzdHJ1Y3R1cmVzIGEgbGl0dGxlIGJlY2F1c2Ugd2UKZ2VuZXJhbGx5IGRvIG5vdCBjYWxsIHRoaW5ncyAndG1yYzIvdG1yYzMvZXRjJyBpbiB0aGUgY29udGFpbmVyLgoKYGBge3J9CmxwX2V4cHQgPC0gY3JlYXRlX2V4cHQoCiAgc2FtcGxlc2hlZXQsCiAgZmlsZV9jb2x1bW4gPSAibHBhbmFtZW5zaXN2MzZoaXNhdGZpbGUiLCBnZW5lX2luZm8gPSBhbGxfbHBfYW5ub3QpICU+JQogIHN1YnNldF9leHB0KGNvdmVyYWdlID0gMzAwMDApICU+JQogIHN1YnNldF9leHB0KG5vbnplcm8gPSAzMDAwKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAidHlwZW9mY2VsbHMiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljIT0ndW5kZWZpbmVkJyIpICU+JQogIHNhbml0aXplX2V4cHRfcERhdGEoImZpbmFsb3V0Y29tZSIpCgp2aXNpdF9mYWN0IDwtIHBEYXRhKGxwX2V4cHQpW1sidmlzaXRudW1iZXIiXV0KYmF0Y2hfbmEgPC0gaXMubmEodmlzaXRfZmFjdCkKdmlzaXRfZmFjdFtiYXRjaF9uYV0gPC0gInVuZGVmaW5lZCIKbHBfZXhwdCA8LSBzZXRfZXhwdF9iYXRjaGVzKGxwX2V4cHQsIGZhY3QgPSB2aXNpdF9mYWN0KQoKc2F2ZShsaXN0ID0gImxwX2V4cHQiLCBmaWxlID0gZ2x1ZSgicmRhL2xwX2V4cHRfYWxsX3Nhbml0aXplZC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImxwX2V4cHQiKQpgYGAKClRoZSBhYm92ZSBibG9jayBpcyBzaW1pbGFyIGluIGNvbmNlcHQgdG8gdGhlIHByZXZpb3VzIGV4cHJlc3Npb25zZXQKY3JlYXRpb24uICBJdCB1c2VzIGEgZGlmZmVyZW50IGNvbHVtbiBhbmQgY3VycmVudGx5IGlnbm9yZXMgdGhlIGdlbmUKYW5ub3RhdGlvbnMuICBHaXZlbiB0aGF0IG1hbnkgb2YgdGhlIHNhbXBsZXMgaGF2ZSBlc3NlbnRpYWxseSAwIHJlYWRzLApJIHNldCBhIGN1dG9mZiBvZiBvbmx5IDIwIG9ic2VydmVkIGdlbmVzLiAgRmluYWxseSwgSSBkaWQgYSBxdWljayBhbmQKZGlydHkgUENBIHBsb3Qgb2YgdGhpcyBwZWN1bGlhciBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgaG9wZXMgb2YgYmVpbmcKYWJsZSB0byAnc2VlJyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHdoYXQgYXJlIGFzc3VtZWQgdG8gYmUgJ3JlYWwnCnNhbXBsZXMgd2l0aCBhIHNpZ25pZmljYW50IG51bWJlciBvZiAncmVhbCcgcGFyYXNpdGUgcmVhZHMgdnMuIHRob3NlCnNhbXBsZXMgd2hpY2gganVzdCBoYXZlIGEgY291cGxlIG9mIHBvdGVudGlhbGx5IHNwdXJpb3VzIHJlYWRzLgoKIyBTYXZlIGFsbCBkYXRhIHN0cnVjdHVyZXMgaW50byBvbmUgYmlnIHBpbGUKCmBgYHtyfQpmb3VuZF9pZHggPC0gZGF0YV9zdHJ1Y3R1cmVzICVpbiUgbHMoKQppZiAoc3VtKCFmb3VuZF9pZHgpID4gMCkgewogIG5vdF9mb3VuZCA8LSBkYXRhX3N0cnVjdHVyZXNbIWZvdW5kX2lkeF0KICB3YXJuaW5nKCJTb21lIGRhdGFzdHJ1Y3R1cmVzIHdlcmUgbm90IGdlbmVyYXRlZDogIiwgdG9TdHJpbmcobm90X2ZvdW5kKSwgIi4iKQogIGRhdGFfc3RydWN0dXJlcyA8LSBkYXRhX3N0cnVjdHVyZXNbZm91bmRfaWR4XQp9CnNhdmUobGlzdCA9IGRhdGFfc3RydWN0dXJlcywgZmlsZSA9IGdsdWUoInJkYS90bXJjM19kYXRhX3N0cnVjdHVyZXMtdnt2ZXJ9LnJkYSIpKQpgYGAKCmBgYHtyfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpCm1lc3NhZ2UoIlNhdmluZyB0byAiLCBzYXZlZmlsZSkKIyB0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lID0gc2F2ZWZpbGUpKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQp0bXAgPC0gbG9hZG1lKGZpbGVuYW1lID0gc2F2ZWZpbGUpCmBgYAoKIyBCaWJsaW9ncmFwaHkK