1 Introduction

I want to use this document to examine our first round of persistence samples. I checked my email from Najib and did not find a sample sheet but did find an explanation of the three sample types we expect.

In preparation for this, I downloaded a new hg38 genome. Since the panamensis asembly has not significantly changed (excepting the putative long read genome which I have not yet seen), I am just using the same one.

2 Loading annotation

The hg38 genome I got is brand new (202405), so do not use the archive for a while.

## Ok, so useast.ensembl is failing today, let us use the jan2024 archive?
#hs_annot <- load_biomart_annotations(archive = FALSE, species = "hsapiens")
## Seems like the 202401 archive is a good choice, it is explicitly the hg38_111 release.
## and it is waaaaay faster (like 100x) than useast right now.
hs_annot <- load_biomart_annotations(archive = FALSE, species = "hsapiens", overwrite = TRUE,
                                     year = 2025, month = "08")
## Using mart: ENSEMBL_MART_ENSEMBL from host: useast.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' and taking the first.
## Found 2 potential symbol columns, using the first:hgnc_symbol.
## Including symbols, there are 86371 vs the 533740 gene annotations.
## Not dropping haplotype chromosome annotations, set drop_haplotypes = TRUE if this is bad.
## Saving annotations to hsapiens_biomart_annotations.rda.
## Finished save().
panamensis_orgdb_idx <- grep(pattern = "^org.+panamen.+MHOM.+db$", x = rownames(installed.packages()))
panamensis_orgdb <- tail(rownames(installed.packages())[panamensis_orgdb_idx], n = 1)
lp_annot <- load_orgdb_annotations(panamensis_orgdb, keytype = "gid")
## Loading required package: AnnotationDbi
## Loading required package: stats4
## Loading required package: BiocGenerics
## 
## Attaching package: 'BiocGenerics'
## The following objects are masked from 'package:hpgltools':
## 
##     annotation, annotation<-, conditions, conditions<-
## The following objects are masked from 'package:stats':
## 
##     IQR, mad, sd, var, xtabs
## The following objects are masked from 'package:base':
## 
##     anyDuplicated, aperm, append, as.data.frame, basename, cbind, colnames, dirname,
##     do.call, duplicated, eval, evalq, Filter, Find, get, grep, grepl, intersect,
##     is.unsorted, lapply, Map, mapply, match, mget, order, paste, pmax, pmax.int, pmin,
##     pmin.int, Position, rank, rbind, Reduce, rownames, sapply, saveRDS, setdiff,
##     table, tapply, union, unique, unsplit, which.max, which.min
## Loading required package: Biobase
## Welcome to Bioconductor
## 
##     Vignettes contain introductory material; view with 'browseVignettes()'. To cite
##     Bioconductor, see 'citation("Biobase")', and for packages 'citation("pkgname")'.
## Loading required package: IRanges
## Loading required package: S4Vectors
## 
## Attaching package: 'S4Vectors'
## The following object is masked from 'package:utils':
## 
##     findMatches
## The following objects are masked from 'package:base':
## 
##     expand.grid, I, unname
## 
## Unable to find CDSNAME, setting it to ANNOT_EXTERNAL_DB_NAME.
## Unable to find CDSCHROM in the db, removing it.
## Unable to find CDSSTRAND in the db, removing it.
## Unable to find CDSSTART in the db, removing it.
## Unable to find CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: ANNOT_EXTERNAL_DB_NAME, GENE_TYPE
## 'select()' returned 1:1 mapping between keys and columns

This is a little silly, but I am going to reload the annotations using the previous invocation to extract the annotation table without having to think. The previous block loads the orgdb for me, so I can just use that to get the fun annotations.

all_columns <- keytypes(get0(panamensis_orgdb))
annot_idx <- grep(pattern = "^ANNOT_", x = all_columns)
annot_columns <- all_columns[annot_idx]
lp_annot <- load_orgdb_annotations(panamensis_orgdb, keytype = "gid", fields = annot_columns)
## Unable to find CDSNAME, setting it to ANNOT_EXTERNAL_DB_NAME.
## Unable to find CDSCHROM in the db, removing it.
## Unable to find CDSSTRAND in the db, removing it.
## Unable to find CDSSTART in the db, removing it.
## Unable to find CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: ANNOT_EXTERNAL_DB_NAME, GENE_TYPE, ANNOT_AA_SEQUENCE_ID, ANNOT_ANNOTATED_GO_COMPONENT, ANNOT_ANNOTATED_GO_FUNCTION, ANNOT_ANNOTATED_GO_ID_COMPONENT, ANNOT_ANNOTATED_GO_ID_FUNCTION, ANNOT_ANNOTATED_GO_ID_PROCESS, ANNOT_ANNOTATED_GO_PROCESS, ANNOT_ANTICODON, ANNOT_APOLLO_LINK_OUT, ANNOT_APOLLO_TRANSCRIPT_DESCRIPTION, ANNOT_CDS, ANNOT_CDS_LENGTH, ANNOT_CHROMOSOME, ANNOT_CODING_END, ANNOT_CODING_START, ANNOT_EC_NUMBERS, ANNOT_EC_NUMBERS_DERIVED, ANNOT_END_MAX, ANNOT_EXON_COUNT, ANNOT_EXTERNAL_DB_NAME, ANNOT_EXTERNAL_DB_VERSION, ANNOT_FIVE_PRIME_UTR_LENGTH, ANNOT_GENE_CONTEXT_END, ANNOT_GENE_CONTEXT_START, ANNOT_GENE_END_MAX, ANNOT_GENE_END_MAX_TEXT, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_ENTREZ_LINK, ANNOT_GENE_EXON_COUNT, ANNOT_GENE_HTS_NONCODING_SNPS, ANNOT_GENE_HTS_NONSYN_SYN_RATIO, ANNOT_GENE_HTS_NONSYNONYMOUS_SNPS, ANNOT_GENE_HTS_STOP_CODON_SNPS, ANNOT_GENE_HTS_SYNONYMOUS_SNPS, ANNOT_GENE_LOCATION_TEXT, ANNOT_GENE_NAME, ANNOT_GENE_ORTHOLOG_NUMBER, ANNOT_GENE_ORTHOMCL_NAME, ANNOT_GENE_PARALOG_NUMBER, ANNOT_GENE_PREVIOUS_IDS, ANNOT_GENE_PRODUCT, ANNOT_GENE_START_MIN, ANNOT_GENE_START_MIN_TEXT, ANNOT_GENE_TOTAL_HTS_SNPS, ANNOT_GENE_TRANSCRIPT_COUNT, ANNOT_GENE_TYPE, ANNOT_GENOMIC_SEQUENCE_LENGTH, ANNOT_GENUS_SPECIES, ANNOT_HAS_MISSING_TRANSCRIPTS, ANNOT_INTERPRO_DESCRIPTION, ANNOT_INTERPRO_ID, ANNOT_IS_DEPRECATED, ANNOT_IS_PSEUDO, ANNOT_ISOELECTRIC_POINT, ANNOT_LOCATION_TEXT, ANNOT_MAP_LOCATION, ANNOT_MCMC_LOCATION, ANNOT_MOLECULAR_WEIGHT, ANNOT_NCBI_TAX_ID, ANNOT_ORTHOMCL_LINK, ANNOT_OVERVIEW, ANNOT_PFAM_DESCRIPTION, ANNOT_PFAM_ID, ANNOT_PIRSF_DESCRIPTION, ANNOT_PIRSF_ID, ANNOT_PREDICTED_GO_COMPONENT, ANNOT_PREDICTED_GO_FUNCTION, ANNOT_PREDICTED_GO_ID_COMPONENT, ANNOT_PREDICTED_GO_ID_FUNCTION, ANNOT_PREDICTED_GO_ID_PROCESS, ANNOT_PREDICTED_GO_PROCESS, ANNOT_PRIMARY_KEY, ANNOT_PROB_MAP, ANNOT_PROB_MCMC, ANNOT_PROSITEPROFILES_DESCRIPTION, ANNOT_PROSITEPROFILES_ID, ANNOT_PROTEIN_LENGTH, ANNOT_PROTEIN_SEQUENCE, ANNOT_PROTEIN_SOURCE_ID, ANNOT_PSEUDO_STRING, ANNOT_SEQUENCE_DATABASE_NAME, ANNOT_SEQUENCE_ID, ANNOT_SIGNALP_PEPTIDE, ANNOT_SMART_DESCRIPTION, ANNOT_SMART_ID, ANNOT_SNPOVERVIEW, ANNOT_SO_ID, ANNOT_SO_TERM_DEFINITION, ANNOT_SO_TERM_NAME, ANNOT_SO_VERSION, ANNOT_START_MIN, ANNOT_STRAND, ANNOT_STRAND_PLUS_MINUS, ANNOT_SUPERFAMILY_DESCRIPTION, ANNOT_SUPERFAMILY_ID, ANNOT_THREE_PRIME_UTR_LENGTH, ANNOT_TIGRFAM_DESCRIPTION, ANNOT_TIGRFAM_ID, ANNOT_TM_COUNT, ANNOT_TRANS_FOUND_PER_GENE_INTERNAL, ANNOT_TRANSCRIPT_INDEX_PER_GENE, ANNOT_TRANSCRIPT_LENGTH, ANNOT_TRANSCRIPT_LINK, ANNOT_TRANSCRIPT_PRODUCT, ANNOT_TRANSCRIPT_SEQUENCE, ANNOT_TRANSCRIPTS_FOUND_PER_GENE, ANNOT_UNIPROT_IDS, ANNOT_UNIPROT_LINKS
## 'select()' returned 1:1 mapping between keys and columns

3 Collect preprocessed metadata

first_spec <- make_rnaseq_spec()
input <- read_metadata("sample_sheets/persistence_hu_v2.1.3.xlsx")
## Error in read.xlsx.default(xlsxFile = file, sheet = sheet, detectDates = TRUE) : 
##   File does not exist.
## Error in read.xlsx.default(xlsxFile = file, sheet = sheet, detectDates = FALSE) : 
##   File does not exist.
## Error in read_metadata("sample_sheets/persistence_hu_v2.1.3.xlsx"): Unable to read the metadata file: sample_sheets/persistence_hu_v2.1.3.xlsx
colnames(input)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colnames': object 'input' not found
pre_meta <- gather_preprocessing_metadata(
  starting_metadata = input, id_column = "hpgl_identifier",
  specification = first_spec, new_metadata = "persistence_hu_modified.xlsx",
  basedir = "preprocessing", species = c("hg38_115", "lpanamensis_mhomcol_v68"))
## Error: object 'input' not found
head(pre_meta$new_meta)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'head': object 'pre_meta' not found
summary(pre_meta$new_meta[["salmon_observed_genes"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'summary': object 'pre_meta' not found
hisat_idx <- grep(pattern = "^hisat", x = names(first_spec))
second_spec <- first_spec[hisat_idx]
post_meta <- gather_preprocessing_metadata(
  starting_metadata = pre_meta[["new_meta"]],
  specification = second_spec, basedir = "preprocessing/202405", species = "hg38_111",
  new_metadata = "sample_sheets/tmrc2_persistence_202405_lp_hg.xlsx")

both_meta <- gather_preprocessing_metadata(
  starting_metadata = "sample_sheets/tmrc_persistence_202405.xlsx",
  specification = first_spec,
  basedir = "preprocessing/202405", species= c("lpanamensis_v68", "hg38_111"),
  new_metadata = "sample_sheets/tmrc_persistence_202405_both.xlsx")

4 Collect gene annotations

I should have all my load_xyz_annotation functions return some of the same elements in their retlists.

lp_genes <- lp_annot[["genes"]]
hg_genes <- hs_annot[["gene_annotations"]]

5 Quick peek at the SL samples, hg38 release 111

hg_genes <- hs_annot[["annotation"]]
hg_map <- hs_annot[["gene_tx_map"]]
lp_genes <- lp_annot[["genes"]]

hu_se_salmon <- create_se(pre_meta[["new_meta"]], gene_info = hg_genes,
                          tx_gene_map = hg_map, file_column = "salmon_count_table_hg38_115")
## Error: object 'pre_meta' not found
hu_se_hisat_gene <- create_se(pre_meta[["new_meta"]], gene_info = hg_genes,
                              file_column = "hisat_count_table_hg38_115")
## Error: object 'pre_meta' not found
hu_se_salmon <- set_conditions(hu_se_salmon, fact = "sample_type") %>%
  set_batches("detectionparasiteby7sl")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'exp' in selecting a method for function 'set_batches': error in evaluating the argument 'exp' in selecting a method for function 'set_conditions': object 'hu_se_salmon' not found
undef_7sl <- is.na(colData(hu_se)[["detectionparasiteby7sl"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_se' not found
colData(hu_se)[undef_7sl, "detectionparasiteby7sl"] <- "unknown"
## Error: object 'hu_se' not found
table(colData(hu_se)[["library_type"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_se' not found
table(colData(hu_se)[["detectionparasiteby7sl"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_se' not found
table(colData(hu_se)[["clinical_presentation"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_se' not found
sample_7sl <- paste0(colData(hu_se)[["sample_type"]], "_", colData(hu_se)[["detectionparasiteby7sl"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_se' not found
colData(hu_se)[["sample_7sl"]] <- sample_7sl
## Error: object 'sample_7sl' not found
healthy_vs_scar <- gsub(x = colData(hu_se)[["condition"]], pattern = "^skin biopsy ", replacement = "")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'gsub': error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_se' not found
colData(hu_se)[["hs"]] <- healthy_vs_scar
## Error: object 'healthy_vs_scar' not found
hu_hs <- subset_se(hu_se, subset = "hs=='healthy'|hs=='scar'") %>%
  set_conditions(fact = "hs")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'exp' in selecting a method for function 'set_conditions': object 'hu_se' not found

6 HU Metadata

hu_mapped <- plot_metadata_factors(hu_se, column = "salmon_mapped")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_se' not found
hu_mapped
## Error: object 'hu_mapped' not found
hu_observed <- plot_metadata_factors(hu_se, column = "salmon_observed_genes")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_se' not found
hu_observed
## Error: object 'hu_observed' not found
hu_pct <- plot_metadata_factors(hu_se, column = "salmon_percent")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_se' not found
hu_pct
## Error: object 'hu_pct' not found
hu_sankey <- plot_meta_sankey(hu_se, factors = c("detectionparasiteby7sl", "sample_type", "library_type"))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'design' in selecting a method for function 'plot_meta_sankey': object 'hu_se' not found
hu_sankey
## Error: object 'hu_sankey' not found

7 nonzero/libsize/etc

plot_legend(hu_se)
## Error: object 'hu_se' not found
plot_libsize(hu_se)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_libsize': object 'hu_se' not found
plot_nonzero(hu_se, y_intercept = 0.4)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_nonzero': object 'hu_se' not found

8 Normalize

hu_norm <- normalize(hu_se, transform = "log2", convert = "cpm", filter = TRUE, norm = "quant")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'normalize': object 'hu_se' not found
plot_corheat(hu_norm)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'input_data' in selecting a method for function 'plot_heatmap': object 'hu_norm' not found
hu_norm_pca <- plot_pca(hu_norm)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_pca': object 'hu_norm' not found
pp(file = "images/hu_pca_sampletype.png")
hu_norm_pca$plot
## Error: object 'hu_norm_pca' not found
dev.off()
## png 
##   2
hu_norm_pca
## Error: object 'hu_norm_pca' not found
hu_detected <- subset_se(hu_se, subset = "detectionparasiteby7sl!='unknown'") %>%
  set_conditions(fact = "detectionparasiteby7sl") %>%
  set_batches("sample_type")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'exp' in selecting a method for function 'set_batches': error in evaluating the argument 'exp' in selecting a method for function 'set_conditions': object 'hu_se' not found
hu_detect_nb <- normalize(hu_detected, transform = "log2", convert = "cpm",
                          filter = TRUE, batch = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'normalize': object 'hu_detected' not found
hu_detect_pca <- plot_pca(hu_detect_nb)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_pca': object 'hu_detect_nb' not found
pp(file = "images/hu_pca_detect_sva.png")
hu_detect_pca$plot
## Error: object 'hu_detect_pca' not found
dev.off()
## png 
##   2
hu_detect_pca
## Error: object 'hu_detect_pca' not found

9 Look at sample type and 7sl

hu_s7sl <- set_conditions(hu_se, fact = "sample_7sl")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'exp' in selecting a method for function 'set_conditions': object 'hu_se' not found
hu_nasal <- subset_se(hu_s7sl, subset = "sample_type=='Nasal Swab'")
## Error: object 'hu_s7sl' not found
hu_nasal_nb <- normalize(hu_nasal, transform = "log2", convert = "cpm",
                          batch = "svaseq", filter = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'normalize': object 'hu_nasal' not found
pp(file = "images/nasal_sample_np.png")
plot_pca(hu_nasal_nb)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_pca': object 'hu_nasal_nb' not found
dev.off()
## png 
##   2
hu_wbc <- subset_se(hu_s7sl, subset = "sample_type=='WBCs'")
## Error: object 'hu_s7sl' not found
hu_wbc_nb <- normalize(hu_wbc, transform = "log2", convert = "cpm",
                          batch = "svaseq", filter = TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'normalize': object 'hu_wbc' not found
pp(file = "images/wbc_sample_np.png")
plot_pca(hu_wbc_nb)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_pca': object 'hu_wbc_nb' not found
dev.off()
## png 
##   2
short_factor <- gsub(x = as.character(colData(hu_nasal)[["condition"]]), pattern = ".*_(.*)$", replacement = "\\1")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'gsub': error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_nasal' not found
hu_nasal <- set_conditions(hu_nasal, fact = as.factor(short_factor))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'exp' in selecting a method for function 'set_conditions': object 'hu_nasal' not found
hu_nasal_np <- subset_se(hu_nasal, subset = "condition!='unknown'")
## Error: object 'hu_nasal' not found
hu_nasal_de <- all_pairwise(hu_nasal_np, filter = TRUE, force = TRUE,
                            model_fstring = "~ 0 + condition", model_svs = "svaseq")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hu_nasal_np' not found
hu_nasal_de
## Error: object 'hu_nasal_de' not found
hu_nasal_table <- combine_de_tables(hu_nasal_de, excel = "excel/persist_table.xlsx")
## Error: object 'hu_nasal_de' not found
hu_nasal_table
## Error: object 'hu_nasal_table' not found
hu_nasal_sig <- extract_significant_genes(hu_nasal_table, excel = "excel/persist_sig.xlsx")
## Error: object 'hu_nasal_table' not found
hu_nasal_sig
## Error: object 'hu_nasal_sig' not found

10 Healthy vs Scar samples

One query from our last meeting which I forgot about until I reread my TODO notes: compare the samples marked as healthy compared to those marked as scar. These are two distantly separate skin biopsies of the same person.

hu_hs_de <- all_pairwise(hu_hs, filter = TRUE, force = TRUE,
                         model_svs = "svaseq", model_fstring = "~ 0 + condition")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'hu_hs' not found
hu_hs_table <- combine_de_tables(hu_hs_de, excel = "excel/healthy_vs_scar_table.xlsx")
## Error: object 'hu_hs_de' not found
hu_hs_table
## Error: object 'hu_hs_table' not found
hu_hs_sig <- extract_significant_genes(hu_hs_table, excel = "excel/healthy_vs_scar_sig.xlsx")
## Error: object 'hu_hs_table' not found
hu_hs_sig
## Error: object 'hu_hs_sig' not found

11 Take a peek at the kraken results

hu_kraken <- create_se(pre_meta[["new_meta"]], file_column = "kraken_matrix", handle_na = "zero")
## Error: object 'pre_meta' not found
hu_kraken <- set_conditions(hu_kraken, fact = "sample_type") %>%
  set_batches("detectionparasiteby7sl")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'exp' in selecting a method for function 'set_batches': error in evaluating the argument 'exp' in selecting a method for function 'set_conditions': object 'hu_kraken' not found
kraken_norm <- normalize(hu_kraken, filter = TRUE, norm = "cpm", transform = "log2")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'normalize': object 'hu_kraken' not found
plot_corheat(kraken_norm)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'input_data' in selecting a method for function 'plot_heatmap': object 'kraken_norm' not found
plot_disheat(kraken_norm)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'input_data' in selecting a method for function 'plot_heatmap': object 'kraken_norm' not found
plot_pca(kraken_norm)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_pca': object 'kraken_norm' not found
nasal_kraken <- subset_se(hu_kraken, subset = "condition=='Nasal Swab'")
## Error: object 'hu_kraken' not found
nasal_norm <- normalize(nasal_kraken, filter = TRUE, norm = "cpm", transform = "log2")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'normalize': object 'nasal_kraken' not found
plot_corheat(nasal_norm)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'input_data' in selecting a method for function 'plot_heatmap': object 'nasal_norm' not found
kraken_bacteria <- gsub(x = colData(hu_kraken)[["kraken_matrix"]],
                        pattern = "viral", replacement = "bacteria")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'gsub': error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_kraken' not found
colData(hu_kraken)[["kraken_bacteria"]] <- kraken_bacteria
## Error: object 'kraken_bacteria' not found
hu_kraken_bac <- create_se(colData(hu_kraken), file_column = "kraken_bacteria", handle_na = "zero")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hu_kraken' not found
hu_kraken <- set_conditions(hu_kraken, fact = "sample_type") %>%
  set_batches("detectionparasiteby7sl")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'exp' in selecting a method for function 'set_batches': error in evaluating the argument 'exp' in selecting a method for function 'set_conditions': object 'hu_kraken' not found
LS0tCnRpdGxlOiAiRXhhbWluaW5nIGh1bWFuIHNhbXBsZXMiCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCmJpYmxpb2dyYXBoeTogYXRiLmJpYgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB6ZW5idXJuCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB6ZW5idXJuCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiAgZm9udC1zaXplOiAxNnB4Cn0KYm9keSAubWFpbi1jb250YWluZXIgewogIG1heC13aWR0aDogMTYwMHB4Owp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGhwZ2x0b29scykKCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyZXRpY3VsYXRlKQp0dCA8LSB0cnkoZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpKQprbml0cjo6b3B0c19rbml0JHNldCgKICBwcm9ncmVzcyA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFLCB3aWR0aCA9IDkwLCBlY2hvID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVycm9yID0gVFJVRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDgsIGZpZy5yZXRpbmEgPSAyLAogIG91dC53aWR0aCA9ICIxMDAlIiwgZGV2ID0gInBuZyIsCiAgZGV2LmFyZ3MgPSBsaXN0KHBuZyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzID0gNCwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLCBrbml0ci5kdXBsaWNhdGUubGFiZWwgPSAiYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplID0gMTIpKQp2ZXIgPC0gIjIwMjQwNSIKcHJldmlvdXNfZmlsZSA8LSAiIgp2ZXIgPC0gZm9ybWF0KFN5cy5EYXRlKCksICIlWSVtJWQiKQoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCnJtZF9maWxlIDwtICJodW1hbl9zYW1wbGVzXzIwMjUuUm1kIgpgYGAKCiMgSW50cm9kdWN0aW9uCgpJIHdhbnQgdG8gdXNlIHRoaXMgZG9jdW1lbnQgdG8gZXhhbWluZSBvdXIgZmlyc3Qgcm91bmQgb2YgcGVyc2lzdGVuY2UKc2FtcGxlcy4gIEkgY2hlY2tlZCBteSBlbWFpbCBmcm9tIE5hamliIGFuZCBkaWQgbm90IGZpbmQgYSBzYW1wbGUKc2hlZXQgYnV0IGRpZCBmaW5kIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSB0aHJlZSBzYW1wbGUgdHlwZXMgd2UgZXhwZWN0LgoKSW4gcHJlcGFyYXRpb24gZm9yIHRoaXMsIEkgZG93bmxvYWRlZCBhIG5ldyBoZzM4IGdlbm9tZS4gIFNpbmNlIHRoZQpwYW5hbWVuc2lzIGFzZW1ibHkgaGFzIG5vdCBzaWduaWZpY2FudGx5IGNoYW5nZWQgKGV4Y2VwdGluZyB0aGUKcHV0YXRpdmUgbG9uZyByZWFkIGdlbm9tZSB3aGljaCBJIGhhdmUgbm90IHlldCBzZWVuKSwgSSBhbSBqdXN0IHVzaW5nCnRoZSBzYW1lIG9uZS4KCiMgTG9hZGluZyBhbm5vdGF0aW9uCgpUaGUgaGczOCBnZW5vbWUgSSBnb3QgaXMgYnJhbmQgbmV3ICgyMDI0MDUpLCBzbyBkbyBub3QgdXNlIHRoZSBhcmNoaXZlCmZvciBhIHdoaWxlLgoKYGBge3J9CiMjIE9rLCBzbyB1c2Vhc3QuZW5zZW1ibCBpcyBmYWlsaW5nIHRvZGF5LCBsZXQgdXMgdXNlIHRoZSBqYW4yMDI0IGFyY2hpdmU/CiNoc19hbm5vdCA8LSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoYXJjaGl2ZSA9IEZBTFNFLCBzcGVjaWVzID0gImhzYXBpZW5zIikKIyMgU2VlbXMgbGlrZSB0aGUgMjAyNDAxIGFyY2hpdmUgaXMgYSBnb29kIGNob2ljZSwgaXQgaXMgZXhwbGljaXRseSB0aGUgaGczOF8xMTEgcmVsZWFzZS4KIyMgYW5kIGl0IGlzIHdhYWFhYXkgZmFzdGVyIChsaWtlIDEwMHgpIHRoYW4gdXNlYXN0IHJpZ2h0IG5vdy4KaHNfYW5ub3QgPC0gbG9hZF9iaW9tYXJ0X2Fubm90YXRpb25zKGFyY2hpdmUgPSBGQUxTRSwgc3BlY2llcyA9ICJoc2FwaWVucyIsIG92ZXJ3cml0ZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAyNSwgbW9udGggPSAiMDgiKQoKcGFuYW1lbnNpc19vcmdkYl9pZHggPC0gZ3JlcChwYXR0ZXJuID0gIl5vcmcuK3BhbmFtZW4uK01IT00uK2RiJCIsIHggPSByb3duYW1lcyhpbnN0YWxsZWQucGFja2FnZXMoKSkpCnBhbmFtZW5zaXNfb3JnZGIgPC0gdGFpbChyb3duYW1lcyhpbnN0YWxsZWQucGFja2FnZXMoKSlbcGFuYW1lbnNpc19vcmdkYl9pZHhdLCBuID0gMSkKbHBfYW5ub3QgPC0gbG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhwYW5hbWVuc2lzX29yZ2RiLCBrZXl0eXBlID0gImdpZCIpCmBgYAoKVGhpcyBpcyBhIGxpdHRsZSBzaWxseSwgYnV0IEkgYW0gZ29pbmcgdG8gcmVsb2FkIHRoZSBhbm5vdGF0aW9ucyB1c2luZwp0aGUgcHJldmlvdXMgaW52b2NhdGlvbiB0byBleHRyYWN0IHRoZSBhbm5vdGF0aW9uIHRhYmxlIHdpdGhvdXQgaGF2aW5nCnRvIHRoaW5rLiAgVGhlIHByZXZpb3VzIGJsb2NrIGxvYWRzIHRoZSBvcmdkYiBmb3IgbWUsIHNvIEkgY2FuIGp1c3QKdXNlIHRoYXQgdG8gZ2V0IHRoZSBmdW4gYW5ub3RhdGlvbnMuCgpgYGB7cn0KYWxsX2NvbHVtbnMgPC0ga2V5dHlwZXMoZ2V0MChwYW5hbWVuc2lzX29yZ2RiKSkKYW5ub3RfaWR4IDwtIGdyZXAocGF0dGVybiA9ICJeQU5OT1RfIiwgeCA9IGFsbF9jb2x1bW5zKQphbm5vdF9jb2x1bW5zIDwtIGFsbF9jb2x1bW5zW2Fubm90X2lkeF0KbHBfYW5ub3QgPC0gbG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhwYW5hbWVuc2lzX29yZ2RiLCBrZXl0eXBlID0gImdpZCIsIGZpZWxkcyA9IGFubm90X2NvbHVtbnMpCmBgYAoKIyBDb2xsZWN0IHByZXByb2Nlc3NlZCBtZXRhZGF0YQoKYGBge3J9CmZpcnN0X3NwZWMgPC0gbWFrZV9ybmFzZXFfc3BlYygpCmlucHV0IDwtIHJlYWRfbWV0YWRhdGEoInNhbXBsZV9zaGVldHMvcGVyc2lzdGVuY2VfaHVfdjIuMS4zLnhsc3giKQpjb2xuYW1lcyhpbnB1dCkKCnByZV9tZXRhIDwtIGdhdGhlcl9wcmVwcm9jZXNzaW5nX21ldGFkYXRhKAogIHN0YXJ0aW5nX21ldGFkYXRhID0gaW5wdXQsIGlkX2NvbHVtbiA9ICJocGdsX2lkZW50aWZpZXIiLAogIHNwZWNpZmljYXRpb24gPSBmaXJzdF9zcGVjLCBuZXdfbWV0YWRhdGEgPSAicGVyc2lzdGVuY2VfaHVfbW9kaWZpZWQueGxzeCIsCiAgYmFzZWRpciA9ICJwcmVwcm9jZXNzaW5nIiwgc3BlY2llcyA9IGMoImhnMzhfMTE1IiwgImxwYW5hbWVuc2lzX21ob21jb2xfdjY4IikpCmhlYWQocHJlX21ldGEkbmV3X21ldGEpCnN1bW1hcnkocHJlX21ldGEkbmV3X21ldGFbWyJzYWxtb25fb2JzZXJ2ZWRfZ2VuZXMiXV0pCmBgYAoKCmBgYHtyLCBldmFsPUZBTFNFfQpoaXNhdF9pZHggPC0gZ3JlcChwYXR0ZXJuID0gIl5oaXNhdCIsIHggPSBuYW1lcyhmaXJzdF9zcGVjKSkKc2Vjb25kX3NwZWMgPC0gZmlyc3Rfc3BlY1toaXNhdF9pZHhdCnBvc3RfbWV0YSA8LSBnYXRoZXJfcHJlcHJvY2Vzc2luZ19tZXRhZGF0YSgKICBzdGFydGluZ19tZXRhZGF0YSA9IHByZV9tZXRhW1sibmV3X21ldGEiXV0sCiAgc3BlY2lmaWNhdGlvbiA9IHNlY29uZF9zcGVjLCBiYXNlZGlyID0gInByZXByb2Nlc3NpbmcvMjAyNDA1Iiwgc3BlY2llcyA9ICJoZzM4XzExMSIsCiAgbmV3X21ldGFkYXRhID0gInNhbXBsZV9zaGVldHMvdG1yYzJfcGVyc2lzdGVuY2VfMjAyNDA1X2xwX2hnLnhsc3giKQoKYm90aF9tZXRhIDwtIGdhdGhlcl9wcmVwcm9jZXNzaW5nX21ldGFkYXRhKAogIHN0YXJ0aW5nX21ldGFkYXRhID0gInNhbXBsZV9zaGVldHMvdG1yY19wZXJzaXN0ZW5jZV8yMDI0MDUueGxzeCIsCiAgc3BlY2lmaWNhdGlvbiA9IGZpcnN0X3NwZWMsCiAgYmFzZWRpciA9ICJwcmVwcm9jZXNzaW5nLzIwMjQwNSIsIHNwZWNpZXM9IGMoImxwYW5hbWVuc2lzX3Y2OCIsICJoZzM4XzExMSIpLAogIG5ld19tZXRhZGF0YSA9ICJzYW1wbGVfc2hlZXRzL3RtcmNfcGVyc2lzdGVuY2VfMjAyNDA1X2JvdGgueGxzeCIpCmBgYAoKIyBDb2xsZWN0IGdlbmUgYW5ub3RhdGlvbnMKCkkgc2hvdWxkIGhhdmUgYWxsIG15IGxvYWRfeHl6X2Fubm90YXRpb24gZnVuY3Rpb25zIHJldHVybiBzb21lIG9mIHRoZQpzYW1lIGVsZW1lbnRzIGluIHRoZWlyIHJldGxpc3RzLgoKYGBge3J9CmxwX2dlbmVzIDwtIGxwX2Fubm90W1siZ2VuZXMiXV0KaGdfZ2VuZXMgPC0gaHNfYW5ub3RbWyJnZW5lX2Fubm90YXRpb25zIl1dCmBgYAoKIyBRdWljayBwZWVrIGF0IHRoZSBTTCBzYW1wbGVzLCBoZzM4IHJlbGVhc2UgMTExCgpgYGB7cn0KaGdfZ2VuZXMgPC0gaHNfYW5ub3RbWyJhbm5vdGF0aW9uIl1dCmhnX21hcCA8LSBoc19hbm5vdFtbImdlbmVfdHhfbWFwIl1dCmxwX2dlbmVzIDwtIGxwX2Fubm90W1siZ2VuZXMiXV0KCmh1X3NlX3NhbG1vbiA8LSBjcmVhdGVfc2UocHJlX21ldGFbWyJuZXdfbWV0YSJdXSwgZ2VuZV9pbmZvID0gaGdfZ2VuZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfZ2VuZV9tYXAgPSBoZ19tYXAsIGZpbGVfY29sdW1uID0gInNhbG1vbl9jb3VudF90YWJsZV9oZzM4XzExNSIpCmh1X3NlX2hpc2F0X2dlbmUgPC0gY3JlYXRlX3NlKHByZV9tZXRhW1sibmV3X21ldGEiXV0sIGdlbmVfaW5mbyA9IGhnX2dlbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJoaXNhdF9jb3VudF90YWJsZV9oZzM4XzExNSIpCgoKaHVfc2Vfc2FsbW9uIDwtIHNldF9jb25kaXRpb25zKGh1X3NlX3NhbG1vbiwgZmFjdCA9ICJzYW1wbGVfdHlwZSIpICU+JQogIHNldF9iYXRjaGVzKCJkZXRlY3Rpb25wYXJhc2l0ZWJ5N3NsIikKCnVuZGVmXzdzbCA8LSBpcy5uYShjb2xEYXRhKGh1X3NlKVtbImRldGVjdGlvbnBhcmFzaXRlYnk3c2wiXV0pCmNvbERhdGEoaHVfc2UpW3VuZGVmXzdzbCwgImRldGVjdGlvbnBhcmFzaXRlYnk3c2wiXSA8LSAidW5rbm93biIKCnRhYmxlKGNvbERhdGEoaHVfc2UpW1sibGlicmFyeV90eXBlIl1dKQp0YWJsZShjb2xEYXRhKGh1X3NlKVtbImRldGVjdGlvbnBhcmFzaXRlYnk3c2wiXV0pCnRhYmxlKGNvbERhdGEoaHVfc2UpW1siY2xpbmljYWxfcHJlc2VudGF0aW9uIl1dKQpzYW1wbGVfN3NsIDwtIHBhc3RlMChjb2xEYXRhKGh1X3NlKVtbInNhbXBsZV90eXBlIl1dLCAiXyIsIGNvbERhdGEoaHVfc2UpW1siZGV0ZWN0aW9ucGFyYXNpdGVieTdzbCJdXSkKY29sRGF0YShodV9zZSlbWyJzYW1wbGVfN3NsIl1dIDwtIHNhbXBsZV83c2wKCmhlYWx0aHlfdnNfc2NhciA8LSBnc3ViKHggPSBjb2xEYXRhKGh1X3NlKVtbImNvbmRpdGlvbiJdXSwgcGF0dGVybiA9ICJec2tpbiBiaW9wc3kgIiwgcmVwbGFjZW1lbnQgPSAiIikKY29sRGF0YShodV9zZSlbWyJocyJdXSA8LSBoZWFsdGh5X3ZzX3NjYXIKaHVfaHMgPC0gc3Vic2V0X3NlKGh1X3NlLCBzdWJzZXQgPSAiaHM9PSdoZWFsdGh5J3xocz09J3NjYXInIikgJT4lCiAgc2V0X2NvbmRpdGlvbnMoZmFjdCA9ICJocyIpCmBgYAoKIyBIVSBNZXRhZGF0YQoKYGBge3J9Cmh1X21hcHBlZCA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHVfc2UsIGNvbHVtbiA9ICJzYWxtb25fbWFwcGVkIikKaHVfbWFwcGVkCmh1X29ic2VydmVkIDwtIHBsb3RfbWV0YWRhdGFfZmFjdG9ycyhodV9zZSwgY29sdW1uID0gInNhbG1vbl9vYnNlcnZlZF9nZW5lcyIpCmh1X29ic2VydmVkCmh1X3BjdCA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHVfc2UsIGNvbHVtbiA9ICJzYWxtb25fcGVyY2VudCIpCmh1X3BjdApodV9zYW5rZXkgPC0gcGxvdF9tZXRhX3NhbmtleShodV9zZSwgZmFjdG9ycyA9IGMoImRldGVjdGlvbnBhcmFzaXRlYnk3c2wiLCAic2FtcGxlX3R5cGUiLCAibGlicmFyeV90eXBlIikpCmh1X3NhbmtleQpgYGAKCiMgbm9uemVyby9saWJzaXplL2V0YwoKYGBge3J9CnBsb3RfbGVnZW5kKGh1X3NlKQoKcGxvdF9saWJzaXplKGh1X3NlKQoKcGxvdF9ub256ZXJvKGh1X3NlLCB5X2ludGVyY2VwdCA9IDAuNCkKYGBgCgojIE5vcm1hbGl6ZQoKYGBge3J9Cmh1X25vcm0gPC0gbm9ybWFsaXplKGh1X3NlLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgbm9ybSA9ICJxdWFudCIpCnBsb3RfY29yaGVhdChodV9ub3JtKQoKaHVfbm9ybV9wY2EgPC0gcGxvdF9wY2EoaHVfbm9ybSkKCnBwKGZpbGUgPSAiaW1hZ2VzL2h1X3BjYV9zYW1wbGV0eXBlLnBuZyIpCmh1X25vcm1fcGNhJHBsb3QKZGV2Lm9mZigpCmh1X25vcm1fcGNhCgpodV9kZXRlY3RlZCA8LSBzdWJzZXRfc2UoaHVfc2UsIHN1YnNldCA9ICJkZXRlY3Rpb25wYXJhc2l0ZWJ5N3NsIT0ndW5rbm93biciKSAlPiUKICBzZXRfY29uZGl0aW9ucyhmYWN0ID0gImRldGVjdGlvbnBhcmFzaXRlYnk3c2wiKSAlPiUKICBzZXRfYmF0Y2hlcygic2FtcGxlX3R5cGUiKQpodV9kZXRlY3RfbmIgPC0gbm9ybWFsaXplKGh1X2RldGVjdGVkLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpodV9kZXRlY3RfcGNhIDwtIHBsb3RfcGNhKGh1X2RldGVjdF9uYikKcHAoZmlsZSA9ICJpbWFnZXMvaHVfcGNhX2RldGVjdF9zdmEucG5nIikKaHVfZGV0ZWN0X3BjYSRwbG90CmRldi5vZmYoKQpodV9kZXRlY3RfcGNhCmBgYAoKIyBMb29rIGF0IHNhbXBsZSB0eXBlIGFuZCA3c2wKCmBgYHtyfQpodV9zN3NsIDwtIHNldF9jb25kaXRpb25zKGh1X3NlLCBmYWN0ID0gInNhbXBsZV83c2wiKQoKaHVfbmFzYWwgPC0gc3Vic2V0X3NlKGh1X3M3c2wsIHN1YnNldCA9ICJzYW1wbGVfdHlwZT09J05hc2FsIFN3YWInIikKaHVfbmFzYWxfbmIgPC0gbm9ybWFsaXplKGh1X25hc2FsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwcChmaWxlID0gImltYWdlcy9uYXNhbF9zYW1wbGVfbnAucG5nIikKcGxvdF9wY2EoaHVfbmFzYWxfbmIpCmRldi5vZmYoKQoKaHVfd2JjIDwtIHN1YnNldF9zZShodV9zN3NsLCBzdWJzZXQgPSAic2FtcGxlX3R5cGU9PSdXQkNzJyIpCmh1X3diY19uYiA8LSBub3JtYWxpemUoaHVfd2JjLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwcChmaWxlID0gImltYWdlcy93YmNfc2FtcGxlX25wLnBuZyIpCnBsb3RfcGNhKGh1X3diY19uYikKZGV2Lm9mZigpCmBgYAoKYGBge3J9CnNob3J0X2ZhY3RvciA8LSBnc3ViKHggPSBhcy5jaGFyYWN0ZXIoY29sRGF0YShodV9uYXNhbClbWyJjb25kaXRpb24iXV0pLCBwYXR0ZXJuID0gIi4qXyguKikkIiwgcmVwbGFjZW1lbnQgPSAiXFwxIikKaHVfbmFzYWwgPC0gc2V0X2NvbmRpdGlvbnMoaHVfbmFzYWwsIGZhY3QgPSBhcy5mYWN0b3Ioc2hvcnRfZmFjdG9yKSkKaHVfbmFzYWxfbnAgPC0gc3Vic2V0X3NlKGh1X25hc2FsLCBzdWJzZXQgPSAiY29uZGl0aW9uIT0ndW5rbm93biciKQoKaHVfbmFzYWxfZGUgPC0gYWxsX3BhaXJ3aXNlKGh1X25hc2FsX25wLCBmaWx0ZXIgPSBUUlVFLCBmb3JjZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mc3RyaW5nID0gIn4gMCArIGNvbmRpdGlvbiIsIG1vZGVsX3N2cyA9ICJzdmFzZXEiKQpodV9uYXNhbF9kZQoKaHVfbmFzYWxfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoaHVfbmFzYWxfZGUsIGV4Y2VsID0gImV4Y2VsL3BlcnNpc3RfdGFibGUueGxzeCIpCmh1X25hc2FsX3RhYmxlCgpodV9uYXNhbF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhodV9uYXNhbF90YWJsZSwgZXhjZWwgPSAiZXhjZWwvcGVyc2lzdF9zaWcueGxzeCIpCmh1X25hc2FsX3NpZwpgYGAKCiMgSGVhbHRoeSB2cyBTY2FyIHNhbXBsZXMKCk9uZSBxdWVyeSBmcm9tIG91ciBsYXN0IG1lZXRpbmcgd2hpY2ggSSBmb3Jnb3QgYWJvdXQgdW50aWwgSSByZXJlYWQgbXkKVE9ETyBub3RlczogY29tcGFyZSB0aGUgc2FtcGxlcyBtYXJrZWQgYXMgaGVhbHRoeSBjb21wYXJlZCB0byB0aG9zZQptYXJrZWQgYXMgc2Nhci4gIFRoZXNlIGFyZSB0d28gZGlzdGFudGx5IHNlcGFyYXRlIHNraW4gYmlvcHNpZXMgb2YgdGhlCnNhbWUgcGVyc29uLgoKYGBge3J9Cmh1X2hzX2RlIDwtIGFsbF9wYWlyd2lzZShodV9ocywgZmlsdGVyID0gVFJVRSwgZm9yY2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfc3ZzID0gInN2YXNlcSIsIG1vZGVsX2ZzdHJpbmcgPSAifiAwICsgY29uZGl0aW9uIikKaHVfaHNfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoaHVfaHNfZGUsIGV4Y2VsID0gImV4Y2VsL2hlYWx0aHlfdnNfc2Nhcl90YWJsZS54bHN4IikKaHVfaHNfdGFibGUKaHVfaHNfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoaHVfaHNfdGFibGUsIGV4Y2VsID0gImV4Y2VsL2hlYWx0aHlfdnNfc2Nhcl9zaWcueGxzeCIpCmh1X2hzX3NpZwpgYGAKCiMgVGFrZSBhIHBlZWsgYXQgdGhlIGtyYWtlbiByZXN1bHRzCgpgYGB7cn0KaHVfa3Jha2VuIDwtIGNyZWF0ZV9zZShwcmVfbWV0YVtbIm5ld19tZXRhIl1dLCBmaWxlX2NvbHVtbiA9ICJrcmFrZW5fbWF0cml4IiwgaGFuZGxlX25hID0gInplcm8iKQpodV9rcmFrZW4gPC0gc2V0X2NvbmRpdGlvbnMoaHVfa3Jha2VuLCBmYWN0ID0gInNhbXBsZV90eXBlIikgJT4lCiAgc2V0X2JhdGNoZXMoImRldGVjdGlvbnBhcmFzaXRlYnk3c2wiKQoKa3Jha2VuX25vcm0gPC0gbm9ybWFsaXplKGh1X2tyYWtlbiwgZmlsdGVyID0gVFJVRSwgbm9ybSA9ICJjcG0iLCB0cmFuc2Zvcm0gPSAibG9nMiIpCnBsb3RfY29yaGVhdChrcmFrZW5fbm9ybSkKcGxvdF9kaXNoZWF0KGtyYWtlbl9ub3JtKQpwbG90X3BjYShrcmFrZW5fbm9ybSkKCm5hc2FsX2tyYWtlbiA8LSBzdWJzZXRfc2UoaHVfa3Jha2VuLCBzdWJzZXQgPSAiY29uZGl0aW9uPT0nTmFzYWwgU3dhYiciKQpuYXNhbF9ub3JtIDwtIG5vcm1hbGl6ZShuYXNhbF9rcmFrZW4sIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAiY3BtIiwgdHJhbnNmb3JtID0gImxvZzIiKQpwbG90X2NvcmhlYXQobmFzYWxfbm9ybSkKCmtyYWtlbl9iYWN0ZXJpYSA8LSBnc3ViKHggPSBjb2xEYXRhKGh1X2tyYWtlbilbWyJrcmFrZW5fbWF0cml4Il1dLAogICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gInZpcmFsIiwgcmVwbGFjZW1lbnQgPSAiYmFjdGVyaWEiKQpjb2xEYXRhKGh1X2tyYWtlbilbWyJrcmFrZW5fYmFjdGVyaWEiXV0gPC0ga3Jha2VuX2JhY3RlcmlhCmh1X2tyYWtlbl9iYWMgPC0gY3JlYXRlX3NlKGNvbERhdGEoaHVfa3Jha2VuKSwgZmlsZV9jb2x1bW4gPSAia3Jha2VuX2JhY3RlcmlhIiwgaGFuZGxlX25hID0gInplcm8iKQpodV9rcmFrZW4gPC0gc2V0X2NvbmRpdGlvbnMoaHVfa3Jha2VuLCBmYWN0ID0gInNhbXBsZV90eXBlIikgJT4lCiAgc2V0X2JhdGNoZXMoImRldGVjdGlvbnBhcmFzaXRlYnk3c2wiKQpgYGAK