1 Introduction

I aim to demonstrate the similarities/differences between a series of libraries which were prepared once using polydT beads and again using the ribozero kit. We have on hand 6 samples for which both methods were employed.

I therefore took a new download of our persistence shared sample sheet and culled it to just these 6 pairs: ‘compare_mRNA_ribozero.xlsx’.

sample_sheet <- "sample_sheets/compare_mRNA_ribozero.xlsx"
modified_sheet <- "sample_sheets/compare_mRNA_ribozero_modified.xlsx"

I should only need to run gather_metadata once in order to generate a new xlsx file which I will read in the future. There is one caveat, I need to either delete the first column of the original sample sheet or fill in some arguments. Because I am lazy and cannot remember the argument for setting the rownames… I deleted the first column.

modified <- gather_preprocessing_metadata(sample_sheet)

2 Grab the annotation data

hs_annot <- load_biomart_annotations(year = "2023")
## The biomart annotations file already exists, loading from it.
specification <- make_rnaseq_spec()
basedir <- "preprocessing"
species <- "hg38_111"
modified <- gather_preprocessing_metadata(sample_sheet, specification = specification,
                                          species = species, feature_type = "gene")
head(modified[["new_meta"]])
ncRNA_gene_spec <- list(
  "hisat_observed_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*ncRNA_gene*.count.xz",
    "column" = "ncRNA_genes_observed"),
  "hisat_sum_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*ncRNA_gene*.count.xz",
    "column" = "ncRNA_gene_reads"),
  "hisat_count_table" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*ncRNA_gene*.count.xz",
    "column" = "ncRNA_gene_count_table"))
appended <- gather_preprocessing_metadata(modified[["new_meta"]], species = species,
                                          type = "genome", specification = ncRNA_gene_spec,
                                          feature_type = "ncRNA_gene",
                                          new_metadata = "sample_sheets/minimal_with_gene_nc.xlsx")
head(appended[["new_meta"]])
sno_spec <- list(
  "hisat_observed_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*snoRNA*.count.xz",
    "column" = "snoRNA_observed"),
  "hisat_sum_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*snoRNA*.count.xz",
    "column" = "snoRNA_reads"),
  "hisat_count_table" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*snoRNA*.count.xz",
    "column" = "snoRNA_count_table"))
appended <- gather_preprocessing_metadata(appended[["new_meta"]], species = species,
                                          type = "genome", specification = sno_spec,
                                          feature_type = "snoRNA",
                                          new_metadata = "sample_sheets/minimal_with_gene_nc_sno.xlsx")
head(appended[["new_meta"]])
exon_spec <- list(
  "hisat_observed_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*exon*.count.xz",
    "column" = "exons_observed"),
  "hisat_sum_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*exon*.count.xz",
    "column" = "exon_reads"),
  "hisat_count_table" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*exon*.count.xz",
    "column" = "exon_count_table"))
appended <- gather_preprocessing_metadata(appended[["new_meta"]], species = species,
                                          type = "genome", specification = exon_spec,
                                          feature_type = "exon",
                                          new_metadata = "sample_sheets/minimal_with_gene_nc_sno_exon.xlsx")
head(appended[["new_meta"]])
pseudogenic_transcript_spec <- list(
  "hisat_observed_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*pseudogenic_transcript*.count.xz",
    "column" = "pseudogenic_transcripts_observed"),
  "hisat_sum_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*pseudogenic_transcript*.count.xz",
    "column" = "pseudogenic_transcript_reads"),
  "hisat_count_table" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*pseudogenic_transcript*.count.xz",
    "column" = "pseudogenic_transcript_count_table"))
appended <- gather_preprocessing_metadata(appended[["new_meta"]], species = species,
                                          type = "genome", specification = pseudogenic_transcript_spec,
                                          feature_type = "pseudogenic_transcript",
                                          new_metadata = "sample_sheets/minimal_with_gene_nc_sno_exon_pseudo.xlsx")
head(appended[["new_meta"]])
lnc_RNA_spec <- list(
  "hisat_observed_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*lnc_RNA*.count.xz",
    "column" = "lnc_RNAs_observed"),
  "hisat_sum_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*lnc_RNA*.count.xz",
    "column" = "lnc_RNA_reads"),
  "hisat_count_table" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*lnc_RNA*.count.xz",
    "column" = "lnc_RNA_count_table"))
appended <- gather_preprocessing_metadata(appended[["new_meta"]], species = species,
                                          type = "genome", specification = lnc_RNA_spec,
                                          feature_type = "lnc_RNA", verbose = TRUE,
                                          new_metadata = "sample_sheets/minimal_with_gene_nc_sno_exon_pseudo_lnc.xlsx")
head(appended[["new_meta"]])
five_prime_UTR_spec <- list(
  "hisat_observed_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*five_prime_UTR*.count.xz",
    "column" = "five_prime_UTRs_observed"),
  "hisat_sum_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*five_prime_UTR*.count.xz",
    "column" = "five_prime_UTR_reads"),
  "hisat_count_table" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*five_prime_UTR*.count.xz",
    "column" = "five_prime_UTR_count_table"))
appended <- gather_preprocessing_metadata(appended[["new_meta"]], species = species,
                                          type = "genome", specification = five_prime_UTR_spec,
                                          feature_type = "five_prime_UTR",
                                          new_metadata = "sample_sheets/minimal_with_gene_nc_sno_exon_pseudo_lnc_fivep.xlsx")
head(appended[["new_meta"]])
three_prime_UTR_spec <- list(
  "hisat_observed_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*three_prime_UTR*.count.xz",
    "column" = "three_prime_UTRs_observed"),
  "hisat_sum_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*three_prime_UTR*.count.xz",
    "column" = "three_prime_UTR_reads"),
  "hisat_count_table" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*three_prime_UTR*.count.xz",
    "column" = "three_prime_UTR_count_table"))
appended <- gather_preprocessing_metadata(appended[["new_meta"]], species = species,
                                          type = "genome", specification = three_prime_UTR_spec,
                                          feature_type = "three_prime_UTR",
                                          new_metadata = "sample_sheets/minimal_with_gene_nc_sno_exon_pseudo_lnc_fivep_threep.xlsx")
head(appended[["new_meta"]])
pre_rRNA_spec <- list(
  "hisat_rrna_single_concordant" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/hisat*_*rRNA*.stderr",
    "column" = "rRNA_reads_pre"),
  "hisat_rrna_percent_log" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/hisat*_*rRNA*.stderr",
    "column" = "rRNA_pct_log_pre"))
appended <- gather_preprocessing_metadata(appended[["new_meta"]], species = "hglp",
                                          type = "rRNA", specification = pre_rRNA_spec,
                                          feature_type = "rRNA", verbose = verbose,
                                          new_metadata = "sample_sheets/minimal_with_gene_nc_sno_exon_pseudo_lnc_fivep_threep_rRNApre.xlsx")
head(appended[["new_meta"]])
post_rRNA_spec <- list(
  "hisat_observed_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*rRNA*.count.xz",
    "column" = "rRNAs_observed"),
  "hisat_sum_genes" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*rRNA*.count.xz",
    "column" = "rRNA_reads"),
  "hisat_count_table" = list(
    "file" = "{basedir}/{meta[['sampleid']]}/outputs/*hisat*_{species}/{species}_*rRNA*.count.xz",
    "column" = "rRNA_count_table"))
appended <- gather_preprocessing_metadata(appended[["new_meta"]], species = species,
                                          type = "genome", specification = post_rRNA_spec,
                                          feature_type = "rRNA", verbose = TRUE,
                                          new_metadata = "sample_sheets/minimal_with_gene_nc_sno_exon_pseudo_lnc_fivep_threep_rRNApre_rRNApost.xlsx")
head(appended[["new_meta"]])

3 Make a summarizedExperiment

hs_se <- create_se(modified_sheet, gene_info = hs_annot,
                   file_column = "hisat_count_table") %>%
  set_se_conditions(fact = "library_type")
## Reading the sample metadata.
## Checking the state of the condition column.
## Checking the state of the batch column.
## Checking the condition factor.
## The sample definitions comprises: 12 rows(samples) and 72 columns(metadata fields).
## Defauting to the gene annotations.
## Matched 21557 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final summarized experiment has 21557 rows and 72 columns.
## The numbers of samples by condition are:
## 
## mRNA   RZ 
##    6    6
plot_libsize(hs_se)
## Library sizes of 12 samples, 
## ranging from 10,852,469 to 16,751,053.

plot_legend(hs_se)
## Warning in RColorBrewer::brewer.pal(12, "Dark2"): n too large, allowed maximum for palette Dark2 is 8
## Returning the palette you asked for with that many colors
## The colors used in the expressionset are: #7570B3, #1B9E77.

hs_se_ncrna <- create_se(appended[["new_meta"]], gene_info = hs_annot,
                         file_column = "ncRNA_gene_count_table")
## Error: object 'appended' not found
hs_se_ncrna <- set_se_conditions(hs_se_ncrna, fact = "library_type")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hs_se_ncrna' not found
plot_libsize(hs_se_ncrna)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_libsize': object 'hs_se_ncrna' not found
hs_se_snorna <- create_se(appended[["new_meta"]], gene_info = hs_annot,
                         file_column = "snoRNA_count_table")
## Error: object 'appended' not found
hs_se_snorna <- set_se_conditions(hs_se_snorna, fact = "library_type")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hs_se_snorna' not found
plot_libsize(hs_se_snorna)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_libsize': object 'hs_se_snorna' not found
hs_se_exons <- create_se(appended[["new_meta"]],
                         file_column = "exon_count_table")
## Error: object 'appended' not found
hs_se_exons <- set_se_conditions(hs_se_exons, fact = "library_type")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hs_se_exons' not found
plot_libsize(hs_se_exons)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_libsize': object 'hs_se_exons' not found
hs_lnc <- create_se(appended[["new_meta"]],
                    file_column = "lnc_RNA_count_table")
## Error: object 'appended' not found
hs_lnc <- set_se_conditions(hs_lnc, fact = "library_type")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hs_lnc' not found
plot_libsize(hs_lnc)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_libsize': object 'hs_lnc' not found
hs_pseudo <- create_se(appended[["new_meta"]],
                       file_column = "pseudogenic_transcript_count_table")
## Error: object 'appended' not found
hs_pseudo <- set_se_conditions(hs_pseudo, fact = "library_type")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hs_pseudo' not found
plot_libsize(hs_pseudo)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_libsize': object 'hs_pseudo' not found
hs_fivep <- create_se(appended[["new_meta"]],
                       file_column = "five_prime_UTR_count_table")
## Error: object 'appended' not found
hs_fivep <- set_se_conditions(hs_fivep, fact = "library_type")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hs_fivep' not found
plot_libsize(hs_fivep)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_libsize': object 'hs_fivep' not found
hs_threep <- create_se(appended[["new_meta"]],
                       file_column = "three_prime_UTR_count_table")
## Error: object 'appended' not found
hs_threep <- set_se_conditions(hs_threep, fact = "library_type")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'colData': object 'hs_threep' not found
plot_libsize(hs_threep)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'data' in selecting a method for function 'plot_libsize': object 'hs_threep' not found

4 Play with the metadata

meta <- pData(hs_se)
meta[["nc_vs_gene"]] <- meta[["ncRNA_genes_observed"]] / meta[["hisat_observed_genes"]]
## Error in `[[<-`(`*tmp*`, "nc_vs_gene", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["lnc_vs_gene"]] <- meta[["lnc_RNAs_observed"]] / meta[["hisat_observed_genes"]]
## Error in `[[<-`(`*tmp*`, "lnc_vs_gene", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["sno_vs_gene"]] <- meta[["snoRNA_observed"]] / meta[["hisat_observed_genes"]]
## Error in `[[<-`(`*tmp*`, "sno_vs_gene", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["exon_vs_gene"]] <- meta[["exons_observed"]] / meta[["hisat_observed_genes"]]
## Error in `[[<-`(`*tmp*`, "exon_vs_gene", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["pseudo_vs_gene"]] <- meta[["pseudogenic_transcripts_observed"]] / meta[["hisat_observed_genes"]]
## Error in `[[<-`(`*tmp*`, "pseudo_vs_gene", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["fivep_vs_gene"]] <- meta[["five_prime_UTRs_observed"]] / meta[["hisat_observed_genes"]]
## Error in `[[<-`(`*tmp*`, "fivep_vs_gene", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["threep_vs_gene"]] <- meta[["three_prime_UTRs_observed"]] / meta[["hisat_observed_genes"]]
## Error in `[[<-`(`*tmp*`, "threep_vs_gene", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["nc_vs_gene_reads"]] <- meta[["ncRNA_gene_reads"]] / meta[["hisat_sum_genes"]]
## Error in `[[<-`(`*tmp*`, "nc_vs_gene_reads", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["lnc_vs_gene_reads"]] <- meta[["lnc_RNA_reads"]] / meta[["hisat_sum_genes"]]
## Error in `[[<-`(`*tmp*`, "lnc_vs_gene_reads", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["sno_vs_gene_reads"]] <- meta[["snoRNA_reads"]] / meta[["hisat_sum_genes"]]
## Error in `[[<-`(`*tmp*`, "sno_vs_gene_reads", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["exon_vs_gene_reads"]] <- meta[["exon_reads"]] / meta[["hisat_sum_genes"]]
## Error in `[[<-`(`*tmp*`, "exon_vs_gene_reads", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["pseudo_vs_gene_reads"]] <- meta[["pseudogenic_transcript_reads"]] / meta[["hisat_sum_genes"]]
## Error in `[[<-`(`*tmp*`, "pseudo_vs_gene_reads", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["fivep_vs_gene_reads"]] <- meta[["five_prime_UTR_reads"]] / meta[["hisat_sum_genes"]]
## Error in `[[<-`(`*tmp*`, "fivep_vs_gene_reads", value = numeric(0)): 0 elements in value to replace 12 elements
meta[["threep_vs_gene_reads"]] <- meta[["three_prime_UTR_reads"]] / meta[["hisat_sum_genes"]]
## Error in `[[<-`(`*tmp*`, "threep_vs_gene_reads", value = numeric(0)): 0 elements in value to replace 12 elements
pData(hs_se) <- meta
hs_se <- set_se_conditions(hs_se, fact = "library_type")
## The numbers of samples by condition are:
## 
## mRNA   RZ 
##    6    6
genes_obs <- plot_metadata_factors(hs_se, column = "hisat_observed_genes")
genes_obs

nc_vs_gene <- plot_metadata_factors(hs_se, column = "nc_vs_gene")
nc_vs_gene
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["nc_vs_gene"]]`:
## ! Column `nc_vs_gene` not found in `.data`.
lnc_vs_gene <- plot_metadata_factors(hs_se, column = "lnc_vs_gene")
lnc_vs_gene
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["lnc_vs_gene"]]`:
## ! Column `lnc_vs_gene` not found in `.data`.
sno_vs_gene <- plot_metadata_factors(hs_se, column = "sno_vs_gene")
sno_vs_gene
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["sno_vs_gene"]]`:
## ! Column `sno_vs_gene` not found in `.data`.
exon_vs_gene <- plot_metadata_factors(hs_se, column = "exon_vs_gene")
exon_vs_gene
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["exon_vs_gene"]]`:
## ! Column `exon_vs_gene` not found in `.data`.
fivep_vs_gene <- plot_metadata_factors(hs_se, column = "fivep_vs_gene")
fivep_vs_gene
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["fivep_vs_gene"]]`:
## ! Column `fivep_vs_gene` not found in `.data`.
threep_vs_gene <- plot_metadata_factors(hs_se, column = "threep_vs_gene")
threep_vs_gene
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["threep_vs_gene"]]`:
## ! Column `threep_vs_gene` not found in `.data`.
reads_obs <- plot_metadata_factors(hs_se, column = "hisat_sum_genes")
reads_obs

nc_vs_gene_reads <- plot_metadata_factors(hs_se, column = "nc_vs_gene_reads")
nc_vs_gene_reads
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["nc_vs_gene_reads"]]`:
## ! Column `nc_vs_gene_reads` not found in `.data`.
lnc_vs_gene_reads <- plot_metadata_factors(hs_se, column = "lnc_vs_gene_reads")
lnc_vs_gene_reads
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["lnc_vs_gene_reads"]]`:
## ! Column `lnc_vs_gene_reads` not found in `.data`.
sno_vs_gene_reads <- plot_metadata_factors(hs_se, column = "sno_vs_gene_reads")
sno_vs_gene_reads
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["sno_vs_gene_reads"]]`:
## ! Column `sno_vs_gene_reads` not found in `.data`.
exon_vs_gene_reads <- plot_metadata_factors(hs_se, column = "exon_vs_gene_reads")
exon_vs_gene_reads
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["exon_vs_gene_reads"]]`:
## ! Column `exon_vs_gene_reads` not found in `.data`.
fivep_vs_gene_reads <- plot_metadata_factors(hs_se, column = "fivep_vs_gene_reads")
fivep_vs_gene_reads
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["fivep_vs_gene_reads"]]`:
## ! Column `fivep_vs_gene_reads` not found in `.data`.
threep_vs_gene_reads <- plot_metadata_factors(hs_se, column = "threep_vs_gene_reads")
threep_vs_gene_reads
## Error in `ggplot2::geom_violin()` at hpgltools/R/metadata.R:2018:5:
## ! Problem while computing aesthetics.
## ℹ Error occurred in the 1st layer.
## Caused by error in `.data[["threep_vs_gene_reads"]]`:
## ! Column `threep_vs_gene_reads` not found in `.data`.

5 Examine kraken bacterial data

hs_kraken <- create_expt(modified_sheet, file_type = "kraken", file_column = "kraken_matrix") %>%
  set_expt_conditions(fact = "library_type")
## Reading the sample metadata.
## Checking the state of the condition column.
## Checking the state of the batch column.
## Checking the condition factor.
## The sample definitions comprises: 12 rows(samples) and 72 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0038/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0004/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0031/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0008/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0037/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0006/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0035/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0007/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0036/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0005/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## 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:
## /lab/home/trey/sshfs/scratch/atb/rnaseq/lpanamensis_persistence_2023/preprocessing/PRHU0034/outputs/06kraken_bacteria/kraken_report_matrix.tsv
## has mismatched rownames.
## Warning in create_expt(modified_sheet, file_type = "kraken", file_column = "kraken_matrix"): There are
## some NAs in this data, the 'handle_nas' parameter may be required.
## Matched 175 annotations and counts.
## Bringing together the count matrix and gene information.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 175 features and 12 samples.
## The numbers of samples by condition are:
## 
## mRNA   RZ 
##    6    6
plot_libsize(hs_kraken)
## Library sizes of 12 samples, 
## ranging from 56,929 to 594,340.

hs_kraken_norm <- normalize_expt(hs_kraken, filter = TRUE, convert = "cpm", norm = "quant")
## Removing 0 low-count genes (175 remaining).
plot_pca(hs_kraken_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by mRNA, RZ
## Shapes are defined by undefined.

kraken_de <- all_pairwise(hs_kraken, filter = TRUE)
## 
## mRNA   RZ 
##    6    6 
## 
## undefined 
##        12
## Basic step 0/3: Normalizing data.
## Basic step 0/3: Converting data.
## Basic step 0/3: Transforming data.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## -- note: fitType='parametric', but the dispersion trend was not well captured by the
##    function: y = a/x + b, and a local regression fit was automatically substituted.
##    specify fitType='local' or 'mean' to avoid this message next time.
## final dispersion estimates
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$best_libsize.
## Warning in createContrastL(objFlt$formula, objFlt$data, L): Contrasts with only a single non-zero term are
## already evaluated by default.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$best_libsize.
kraken_table <- combine_de_tables(kraken_de, excel = "excel/kraken_compare.xlsx")
## Deleting the file excel/kraken_compare.xlsx before writing the tables.
LS0tCnRpdGxlOiAiQ29tcGFyZSBwb2x5ZFQgdG8gcmlib3plcm8gbGlicmFyeSBwcmVwYXJhdGlvbnMuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKYmlibGlvZ3JhcGh5OiAvaG9tZS90cmV5L3NjcmF0Y2gvem90ZXJvX2xpYnJhcnkvYXRiLmJpYgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKYGBge3Igb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkoZ2x1ZSkKbGlicmFyeShocGdsdG9vbHMpCmxpYnJhcnkodGlkeXIpCmRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQoKa25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3MgPSBUUlVFLCB2ZXJib3NlID0gVFJVRSwgd2lkdGggPSA5MCwgZWNobyA9IFRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlcnJvciA9IFRSVUUsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA4LCBmaWcucmV0aW5hID0gMiwKICBvdXQud2lkdGggPSAiMTAwJSIsIGRldiA9ICJwbmciLAogIGRldi5hcmdzID0gbGlzdChwbmcgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpKQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cyA9IDQsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSwga25pdHIuZHVwbGljYXRlLmxhYmVsID0gImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSkKdmVyIDwtIFN5cy5nZXRlbnYoIlZFUlNJT04iKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQgPSAiJVklbSVkIikKCnJtZF9maWxlIDwtICJjb21wYXJlX2xpYnJhcnlfbWV0aG9kcy5SbWQiCnNhdmVmaWxlIDwtIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLCByZXBsYWNlID0gIlxcLnJkYVxcLnh6IiwgeCA9IHJtZF9maWxlKQpgYGAKCiMgSW50cm9kdWN0aW9uCgpJIGFpbSB0byBkZW1vbnN0cmF0ZSB0aGUgc2ltaWxhcml0aWVzL2RpZmZlcmVuY2VzIGJldHdlZW4gYSBzZXJpZXMgb2YKbGlicmFyaWVzIHdoaWNoIHdlcmUgcHJlcGFyZWQgb25jZSB1c2luZyBwb2x5ZFQgYmVhZHMgYW5kIGFnYWluIHVzaW5nCnRoZSByaWJvemVybyBraXQuICBXZSBoYXZlIG9uIGhhbmQgNiBzYW1wbGVzIGZvciB3aGljaCBib3RoIG1ldGhvZHMKd2VyZSBlbXBsb3llZC4KCkkgdGhlcmVmb3JlIHRvb2sgYSBuZXcgZG93bmxvYWQgb2Ygb3VyIHBlcnNpc3RlbmNlIHNoYXJlZCBzYW1wbGUgc2hlZXQKYW5kIGN1bGxlZCBpdCB0byBqdXN0IHRoZXNlIDYgcGFpcnM6ICdjb21wYXJlX21STkFfcmlib3plcm8ueGxzeCcuCgpgYGB7cn0Kc2FtcGxlX3NoZWV0IDwtICJzYW1wbGVfc2hlZXRzL2NvbXBhcmVfbVJOQV9yaWJvemVyby54bHN4Igptb2RpZmllZF9zaGVldCA8LSAic2FtcGxlX3NoZWV0cy9jb21wYXJlX21STkFfcmlib3plcm9fbW9kaWZpZWQueGxzeCIKYGBgCgpJIHNob3VsZCBvbmx5IG5lZWQgdG8gcnVuIGdhdGhlcl9tZXRhZGF0YSBvbmNlIGluIG9yZGVyIHRvIGdlbmVyYXRlCmEgbmV3IHhsc3ggZmlsZSB3aGljaCBJIHdpbGwgcmVhZCBpbiB0aGUgZnV0dXJlLiAgVGhlcmUgaXMgb25lIGNhdmVhdCwKSSBuZWVkIHRvIGVpdGhlciBkZWxldGUgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgb3JpZ2luYWwgc2FtcGxlIHNoZWV0Cm9yIGZpbGwgaW4gc29tZSBhcmd1bWVudHMuICBCZWNhdXNlIEkgYW0gbGF6eSBhbmQgY2Fubm90IHJlbWVtYmVyIHRoZQphcmd1bWVudCBmb3Igc2V0dGluZyB0aGUgcm93bmFtZXMuLi4gIEkgZGVsZXRlZCB0aGUgZmlyc3QgY29sdW1uLgoKYGBge3IsIGV2YWw9RkFMU0V9Cm1vZGlmaWVkIDwtIGdhdGhlcl9wcmVwcm9jZXNzaW5nX21ldGFkYXRhKHNhbXBsZV9zaGVldCkKYGBgCgojIEdyYWIgdGhlIGFubm90YXRpb24gZGF0YQoKYGBge3J9CmhzX2Fubm90IDwtIGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucyh5ZWFyID0gIjIwMjMiKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQpzcGVjaWZpY2F0aW9uIDwtIG1ha2Vfcm5hc2VxX3NwZWMoKQpiYXNlZGlyIDwtICJwcmVwcm9jZXNzaW5nIgpzcGVjaWVzIDwtICJoZzM4XzExMSIKbW9kaWZpZWQgPC0gZ2F0aGVyX3ByZXByb2Nlc3NpbmdfbWV0YWRhdGEoc2FtcGxlX3NoZWV0LCBzcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2llcyA9IHNwZWNpZXMsIGZlYXR1cmVfdHlwZSA9ICJnZW5lIikKaGVhZChtb2RpZmllZFtbIm5ld19tZXRhIl1dKQpuY1JOQV9nZW5lX3NwZWMgPC0gbGlzdCgKICAiaGlzYXRfb2JzZXJ2ZWRfZ2VuZXMiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKm5jUk5BX2dlbmUqLmNvdW50Lnh6IiwKICAgICJjb2x1bW4iID0gIm5jUk5BX2dlbmVzX29ic2VydmVkIiksCiAgImhpc2F0X3N1bV9nZW5lcyIgPSBsaXN0KAogICAgImZpbGUiID0gIntiYXNlZGlyfS97bWV0YVtbJ3NhbXBsZWlkJ11dfS9vdXRwdXRzLypoaXNhdCpfe3NwZWNpZXN9L3tzcGVjaWVzfV8qbmNSTkFfZ2VuZSouY291bnQueHoiLAogICAgImNvbHVtbiIgPSAibmNSTkFfZ2VuZV9yZWFkcyIpLAogICJoaXNhdF9jb3VudF90YWJsZSIgPSBsaXN0KAogICAgImZpbGUiID0gIntiYXNlZGlyfS97bWV0YVtbJ3NhbXBsZWlkJ11dfS9vdXRwdXRzLypoaXNhdCpfe3NwZWNpZXN9L3tzcGVjaWVzfV8qbmNSTkFfZ2VuZSouY291bnQueHoiLAogICAgImNvbHVtbiIgPSAibmNSTkFfZ2VuZV9jb3VudF90YWJsZSIpKQphcHBlbmRlZCA8LSBnYXRoZXJfcHJlcHJvY2Vzc2luZ19tZXRhZGF0YShtb2RpZmllZFtbIm5ld19tZXRhIl1dLCBzcGVjaWVzID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJnZW5vbWUiLCBzcGVjaWZpY2F0aW9uID0gbmNSTkFfZ2VuZV9zcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX3R5cGUgPSAibmNSTkFfZ2VuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19tZXRhZGF0YSA9ICJzYW1wbGVfc2hlZXRzL21pbmltYWxfd2l0aF9nZW5lX25jLnhsc3giKQpoZWFkKGFwcGVuZGVkW1sibmV3X21ldGEiXV0pCnNub19zcGVjIDwtIGxpc3QoCiAgImhpc2F0X29ic2VydmVkX2dlbmVzIiA9IGxpc3QoCiAgICAiZmlsZSIgPSAie2Jhc2VkaXJ9L3ttZXRhW1snc2FtcGxlaWQnXV19L291dHB1dHMvKmhpc2F0Kl97c3BlY2llc30ve3NwZWNpZXN9Xypzbm9STkEqLmNvdW50Lnh6IiwKICAgICJjb2x1bW4iID0gInNub1JOQV9vYnNlcnZlZCIpLAogICJoaXNhdF9zdW1fZ2VuZXMiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKnNub1JOQSouY291bnQueHoiLAogICAgImNvbHVtbiIgPSAic25vUk5BX3JlYWRzIiksCiAgImhpc2F0X2NvdW50X3RhYmxlIiA9IGxpc3QoCiAgICAiZmlsZSIgPSAie2Jhc2VkaXJ9L3ttZXRhW1snc2FtcGxlaWQnXV19L291dHB1dHMvKmhpc2F0Kl97c3BlY2llc30ve3NwZWNpZXN9Xypzbm9STkEqLmNvdW50Lnh6IiwKICAgICJjb2x1bW4iID0gInNub1JOQV9jb3VudF90YWJsZSIpKQphcHBlbmRlZCA8LSBnYXRoZXJfcHJlcHJvY2Vzc2luZ19tZXRhZGF0YShhcHBlbmRlZFtbIm5ld19tZXRhIl1dLCBzcGVjaWVzID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJnZW5vbWUiLCBzcGVjaWZpY2F0aW9uID0gc25vX3NwZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfdHlwZSA9ICJzbm9STkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWV0YWRhdGEgPSAic2FtcGxlX3NoZWV0cy9taW5pbWFsX3dpdGhfZ2VuZV9uY19zbm8ueGxzeCIpCmhlYWQoYXBwZW5kZWRbWyJuZXdfbWV0YSJdXSkKZXhvbl9zcGVjIDwtIGxpc3QoCiAgImhpc2F0X29ic2VydmVkX2dlbmVzIiA9IGxpc3QoCiAgICAiZmlsZSIgPSAie2Jhc2VkaXJ9L3ttZXRhW1snc2FtcGxlaWQnXV19L291dHB1dHMvKmhpc2F0Kl97c3BlY2llc30ve3NwZWNpZXN9XypleG9uKi5jb3VudC54eiIsCiAgICAiY29sdW1uIiA9ICJleG9uc19vYnNlcnZlZCIpLAogICJoaXNhdF9zdW1fZ2VuZXMiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKmV4b24qLmNvdW50Lnh6IiwKICAgICJjb2x1bW4iID0gImV4b25fcmVhZHMiKSwKICAiaGlzYXRfY291bnRfdGFibGUiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKmV4b24qLmNvdW50Lnh6IiwKICAgICJjb2x1bW4iID0gImV4b25fY291bnRfdGFibGUiKSkKYXBwZW5kZWQgPC0gZ2F0aGVyX3ByZXByb2Nlc3NpbmdfbWV0YWRhdGEoYXBwZW5kZWRbWyJuZXdfbWV0YSJdXSwgc3BlY2llcyA9IHNwZWNpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiZ2Vub21lIiwgc3BlY2lmaWNhdGlvbiA9IGV4b25fc3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV90eXBlID0gImV4b24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWV0YWRhdGEgPSAic2FtcGxlX3NoZWV0cy9taW5pbWFsX3dpdGhfZ2VuZV9uY19zbm9fZXhvbi54bHN4IikKaGVhZChhcHBlbmRlZFtbIm5ld19tZXRhIl1dKQpwc2V1ZG9nZW5pY190cmFuc2NyaXB0X3NwZWMgPC0gbGlzdCgKICAiaGlzYXRfb2JzZXJ2ZWRfZ2VuZXMiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKnBzZXVkb2dlbmljX3RyYW5zY3JpcHQqLmNvdW50Lnh6IiwKICAgICJjb2x1bW4iID0gInBzZXVkb2dlbmljX3RyYW5zY3JpcHRzX29ic2VydmVkIiksCiAgImhpc2F0X3N1bV9nZW5lcyIgPSBsaXN0KAogICAgImZpbGUiID0gIntiYXNlZGlyfS97bWV0YVtbJ3NhbXBsZWlkJ11dfS9vdXRwdXRzLypoaXNhdCpfe3NwZWNpZXN9L3tzcGVjaWVzfV8qcHNldWRvZ2VuaWNfdHJhbnNjcmlwdCouY291bnQueHoiLAogICAgImNvbHVtbiIgPSAicHNldWRvZ2VuaWNfdHJhbnNjcmlwdF9yZWFkcyIpLAogICJoaXNhdF9jb3VudF90YWJsZSIgPSBsaXN0KAogICAgImZpbGUiID0gIntiYXNlZGlyfS97bWV0YVtbJ3NhbXBsZWlkJ11dfS9vdXRwdXRzLypoaXNhdCpfe3NwZWNpZXN9L3tzcGVjaWVzfV8qcHNldWRvZ2VuaWNfdHJhbnNjcmlwdCouY291bnQueHoiLAogICAgImNvbHVtbiIgPSAicHNldWRvZ2VuaWNfdHJhbnNjcmlwdF9jb3VudF90YWJsZSIpKQphcHBlbmRlZCA8LSBnYXRoZXJfcHJlcHJvY2Vzc2luZ19tZXRhZGF0YShhcHBlbmRlZFtbIm5ld19tZXRhIl1dLCBzcGVjaWVzID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJnZW5vbWUiLCBzcGVjaWZpY2F0aW9uID0gcHNldWRvZ2VuaWNfdHJhbnNjcmlwdF9zcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX3R5cGUgPSAicHNldWRvZ2VuaWNfdHJhbnNjcmlwdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19tZXRhZGF0YSA9ICJzYW1wbGVfc2hlZXRzL21pbmltYWxfd2l0aF9nZW5lX25jX3Nub19leG9uX3BzZXVkby54bHN4IikKaGVhZChhcHBlbmRlZFtbIm5ld19tZXRhIl1dKQpsbmNfUk5BX3NwZWMgPC0gbGlzdCgKICAiaGlzYXRfb2JzZXJ2ZWRfZ2VuZXMiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKmxuY19STkEqLmNvdW50Lnh6IiwKICAgICJjb2x1bW4iID0gImxuY19STkFzX29ic2VydmVkIiksCiAgImhpc2F0X3N1bV9nZW5lcyIgPSBsaXN0KAogICAgImZpbGUiID0gIntiYXNlZGlyfS97bWV0YVtbJ3NhbXBsZWlkJ11dfS9vdXRwdXRzLypoaXNhdCpfe3NwZWNpZXN9L3tzcGVjaWVzfV8qbG5jX1JOQSouY291bnQueHoiLAogICAgImNvbHVtbiIgPSAibG5jX1JOQV9yZWFkcyIpLAogICJoaXNhdF9jb3VudF90YWJsZSIgPSBsaXN0KAogICAgImZpbGUiID0gIntiYXNlZGlyfS97bWV0YVtbJ3NhbXBsZWlkJ11dfS9vdXRwdXRzLypoaXNhdCpfe3NwZWNpZXN9L3tzcGVjaWVzfV8qbG5jX1JOQSouY291bnQueHoiLAogICAgImNvbHVtbiIgPSAibG5jX1JOQV9jb3VudF90YWJsZSIpKQphcHBlbmRlZCA8LSBnYXRoZXJfcHJlcHJvY2Vzc2luZ19tZXRhZGF0YShhcHBlbmRlZFtbIm5ld19tZXRhIl1dLCBzcGVjaWVzID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJnZW5vbWUiLCBzcGVjaWZpY2F0aW9uID0gbG5jX1JOQV9zcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX3R5cGUgPSAibG5jX1JOQSIsIHZlcmJvc2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWV0YWRhdGEgPSAic2FtcGxlX3NoZWV0cy9taW5pbWFsX3dpdGhfZ2VuZV9uY19zbm9fZXhvbl9wc2V1ZG9fbG5jLnhsc3giKQpoZWFkKGFwcGVuZGVkW1sibmV3X21ldGEiXV0pCmZpdmVfcHJpbWVfVVRSX3NwZWMgPC0gbGlzdCgKICAiaGlzYXRfb2JzZXJ2ZWRfZ2VuZXMiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKmZpdmVfcHJpbWVfVVRSKi5jb3VudC54eiIsCiAgICAiY29sdW1uIiA9ICJmaXZlX3ByaW1lX1VUUnNfb2JzZXJ2ZWQiKSwKICAiaGlzYXRfc3VtX2dlbmVzIiA9IGxpc3QoCiAgICAiZmlsZSIgPSAie2Jhc2VkaXJ9L3ttZXRhW1snc2FtcGxlaWQnXV19L291dHB1dHMvKmhpc2F0Kl97c3BlY2llc30ve3NwZWNpZXN9XypmaXZlX3ByaW1lX1VUUiouY291bnQueHoiLAogICAgImNvbHVtbiIgPSAiZml2ZV9wcmltZV9VVFJfcmVhZHMiKSwKICAiaGlzYXRfY291bnRfdGFibGUiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKmZpdmVfcHJpbWVfVVRSKi5jb3VudC54eiIsCiAgICAiY29sdW1uIiA9ICJmaXZlX3ByaW1lX1VUUl9jb3VudF90YWJsZSIpKQphcHBlbmRlZCA8LSBnYXRoZXJfcHJlcHJvY2Vzc2luZ19tZXRhZGF0YShhcHBlbmRlZFtbIm5ld19tZXRhIl1dLCBzcGVjaWVzID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJnZW5vbWUiLCBzcGVjaWZpY2F0aW9uID0gZml2ZV9wcmltZV9VVFJfc3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV90eXBlID0gImZpdmVfcHJpbWVfVVRSIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21ldGFkYXRhID0gInNhbXBsZV9zaGVldHMvbWluaW1hbF93aXRoX2dlbmVfbmNfc25vX2V4b25fcHNldWRvX2xuY19maXZlcC54bHN4IikKaGVhZChhcHBlbmRlZFtbIm5ld19tZXRhIl1dKQp0aHJlZV9wcmltZV9VVFJfc3BlYyA8LSBsaXN0KAogICJoaXNhdF9vYnNlcnZlZF9nZW5lcyIgPSBsaXN0KAogICAgImZpbGUiID0gIntiYXNlZGlyfS97bWV0YVtbJ3NhbXBsZWlkJ11dfS9vdXRwdXRzLypoaXNhdCpfe3NwZWNpZXN9L3tzcGVjaWVzfV8qdGhyZWVfcHJpbWVfVVRSKi5jb3VudC54eiIsCiAgICAiY29sdW1uIiA9ICJ0aHJlZV9wcmltZV9VVFJzX29ic2VydmVkIiksCiAgImhpc2F0X3N1bV9nZW5lcyIgPSBsaXN0KAogICAgImZpbGUiID0gIntiYXNlZGlyfS97bWV0YVtbJ3NhbXBsZWlkJ11dfS9vdXRwdXRzLypoaXNhdCpfe3NwZWNpZXN9L3tzcGVjaWVzfV8qdGhyZWVfcHJpbWVfVVRSKi5jb3VudC54eiIsCiAgICAiY29sdW1uIiA9ICJ0aHJlZV9wcmltZV9VVFJfcmVhZHMiKSwKICAiaGlzYXRfY291bnRfdGFibGUiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKnRocmVlX3ByaW1lX1VUUiouY291bnQueHoiLAogICAgImNvbHVtbiIgPSAidGhyZWVfcHJpbWVfVVRSX2NvdW50X3RhYmxlIikpCmFwcGVuZGVkIDwtIGdhdGhlcl9wcmVwcm9jZXNzaW5nX21ldGFkYXRhKGFwcGVuZGVkW1sibmV3X21ldGEiXV0sIHNwZWNpZXMgPSBzcGVjaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImdlbm9tZSIsIHNwZWNpZmljYXRpb24gPSB0aHJlZV9wcmltZV9VVFJfc3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV90eXBlID0gInRocmVlX3ByaW1lX1VUUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19tZXRhZGF0YSA9ICJzYW1wbGVfc2hlZXRzL21pbmltYWxfd2l0aF9nZW5lX25jX3Nub19leG9uX3BzZXVkb19sbmNfZml2ZXBfdGhyZWVwLnhsc3giKQpoZWFkKGFwcGVuZGVkW1sibmV3X21ldGEiXV0pCnByZV9yUk5BX3NwZWMgPC0gbGlzdCgKICAiaGlzYXRfcnJuYV9zaW5nbGVfY29uY29yZGFudCIgPSBsaXN0KAogICAgImZpbGUiID0gIntiYXNlZGlyfS97bWV0YVtbJ3NhbXBsZWlkJ11dfS9vdXRwdXRzLypoaXNhdCpfe3NwZWNpZXN9L2hpc2F0Kl8qclJOQSouc3RkZXJyIiwKICAgICJjb2x1bW4iID0gInJSTkFfcmVhZHNfcHJlIiksCiAgImhpc2F0X3JybmFfcGVyY2VudF9sb2ciID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS9oaXNhdCpfKnJSTkEqLnN0ZGVyciIsCiAgICAiY29sdW1uIiA9ICJyUk5BX3BjdF9sb2dfcHJlIikpCmFwcGVuZGVkIDwtIGdhdGhlcl9wcmVwcm9jZXNzaW5nX21ldGFkYXRhKGFwcGVuZGVkW1sibmV3X21ldGEiXV0sIHNwZWNpZXMgPSAiaGdscCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiclJOQSIsIHNwZWNpZmljYXRpb24gPSBwcmVfclJOQV9zcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX3R5cGUgPSAiclJOQSIsIHZlcmJvc2UgPSB2ZXJib3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWV0YWRhdGEgPSAic2FtcGxlX3NoZWV0cy9taW5pbWFsX3dpdGhfZ2VuZV9uY19zbm9fZXhvbl9wc2V1ZG9fbG5jX2ZpdmVwX3RocmVlcF9yUk5BcHJlLnhsc3giKQpoZWFkKGFwcGVuZGVkW1sibmV3X21ldGEiXV0pCnBvc3RfclJOQV9zcGVjIDwtIGxpc3QoCiAgImhpc2F0X29ic2VydmVkX2dlbmVzIiA9IGxpc3QoCiAgICAiZmlsZSIgPSAie2Jhc2VkaXJ9L3ttZXRhW1snc2FtcGxlaWQnXV19L291dHB1dHMvKmhpc2F0Kl97c3BlY2llc30ve3NwZWNpZXN9XypyUk5BKi5jb3VudC54eiIsCiAgICAiY29sdW1uIiA9ICJyUk5Bc19vYnNlcnZlZCIpLAogICJoaXNhdF9zdW1fZ2VuZXMiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKnJSTkEqLmNvdW50Lnh6IiwKICAgICJjb2x1bW4iID0gInJSTkFfcmVhZHMiKSwKICAiaGlzYXRfY291bnRfdGFibGUiID0gbGlzdCgKICAgICJmaWxlIiA9ICJ7YmFzZWRpcn0ve21ldGFbWydzYW1wbGVpZCddXX0vb3V0cHV0cy8qaGlzYXQqX3tzcGVjaWVzfS97c3BlY2llc31fKnJSTkEqLmNvdW50Lnh6IiwKICAgICJjb2x1bW4iID0gInJSTkFfY291bnRfdGFibGUiKSkKYXBwZW5kZWQgPC0gZ2F0aGVyX3ByZXByb2Nlc3NpbmdfbWV0YWRhdGEoYXBwZW5kZWRbWyJuZXdfbWV0YSJdXSwgc3BlY2llcyA9IHNwZWNpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiZ2Vub21lIiwgc3BlY2lmaWNhdGlvbiA9IHBvc3RfclJOQV9zcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX3R5cGUgPSAiclJOQSIsIHZlcmJvc2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWV0YWRhdGEgPSAic2FtcGxlX3NoZWV0cy9taW5pbWFsX3dpdGhfZ2VuZV9uY19zbm9fZXhvbl9wc2V1ZG9fbG5jX2ZpdmVwX3RocmVlcF9yUk5BcHJlX3JSTkFwb3N0Lnhsc3giKQpoZWFkKGFwcGVuZGVkW1sibmV3X21ldGEiXV0pCmBgYAoKIyBNYWtlIGEgc3VtbWFyaXplZEV4cGVyaW1lbnQKCmBgYHtyfQpoc19zZSA8LSBjcmVhdGVfc2UobW9kaWZpZWRfc2hlZXQsIGdlbmVfaW5mbyA9IGhzX2Fubm90LAogICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW4gPSAiaGlzYXRfY291bnRfdGFibGUiKSAlPiUKICBzZXRfc2VfY29uZGl0aW9ucyhmYWN0ID0gImxpYnJhcnlfdHlwZSIpCgpwbG90X2xpYnNpemUoaHNfc2UpCnBsb3RfbGVnZW5kKGhzX3NlKQoKaHNfc2VfbmNybmEgPC0gY3JlYXRlX3NlKGFwcGVuZGVkW1sibmV3X21ldGEiXV0sIGdlbmVfaW5mbyA9IGhzX2Fubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW4gPSAibmNSTkFfZ2VuZV9jb3VudF90YWJsZSIpCmhzX3NlX25jcm5hIDwtIHNldF9zZV9jb25kaXRpb25zKGhzX3NlX25jcm5hLCBmYWN0ID0gImxpYnJhcnlfdHlwZSIpCnBsb3RfbGlic2l6ZShoc19zZV9uY3JuYSkKCmhzX3NlX3Nub3JuYSA8LSBjcmVhdGVfc2UoYXBwZW5kZWRbWyJuZXdfbWV0YSJdXSwgZ2VuZV9pbmZvID0gaHNfYW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJzbm9STkFfY291bnRfdGFibGUiKQpoc19zZV9zbm9ybmEgPC0gc2V0X3NlX2NvbmRpdGlvbnMoaHNfc2Vfc25vcm5hLCBmYWN0ID0gImxpYnJhcnlfdHlwZSIpCnBsb3RfbGlic2l6ZShoc19zZV9zbm9ybmEpCgpoc19zZV9leG9ucyA8LSBjcmVhdGVfc2UoYXBwZW5kZWRbWyJuZXdfbWV0YSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uID0gImV4b25fY291bnRfdGFibGUiKQpoc19zZV9leG9ucyA8LSBzZXRfc2VfY29uZGl0aW9ucyhoc19zZV9leG9ucywgZmFjdCA9ICJsaWJyYXJ5X3R5cGUiKQpwbG90X2xpYnNpemUoaHNfc2VfZXhvbnMpCgpoc19sbmMgPC0gY3JlYXRlX3NlKGFwcGVuZGVkW1sibmV3X21ldGEiXV0sCiAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW4gPSAibG5jX1JOQV9jb3VudF90YWJsZSIpCmhzX2xuYyA8LSBzZXRfc2VfY29uZGl0aW9ucyhoc19sbmMsIGZhY3QgPSAibGlicmFyeV90eXBlIikKcGxvdF9saWJzaXplKGhzX2xuYykKCmhzX3BzZXVkbyA8LSBjcmVhdGVfc2UoYXBwZW5kZWRbWyJuZXdfbWV0YSJdXSwKICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJwc2V1ZG9nZW5pY190cmFuc2NyaXB0X2NvdW50X3RhYmxlIikKaHNfcHNldWRvIDwtIHNldF9zZV9jb25kaXRpb25zKGhzX3BzZXVkbywgZmFjdCA9ICJsaWJyYXJ5X3R5cGUiKQpwbG90X2xpYnNpemUoaHNfcHNldWRvKQoKaHNfZml2ZXAgPC0gY3JlYXRlX3NlKGFwcGVuZGVkW1sibmV3X21ldGEiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW4gPSAiZml2ZV9wcmltZV9VVFJfY291bnRfdGFibGUiKQpoc19maXZlcCA8LSBzZXRfc2VfY29uZGl0aW9ucyhoc19maXZlcCwgZmFjdCA9ICJsaWJyYXJ5X3R5cGUiKQpwbG90X2xpYnNpemUoaHNfZml2ZXApCgpoc190aHJlZXAgPC0gY3JlYXRlX3NlKGFwcGVuZGVkW1sibmV3X21ldGEiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW4gPSAidGhyZWVfcHJpbWVfVVRSX2NvdW50X3RhYmxlIikKaHNfdGhyZWVwIDwtIHNldF9zZV9jb25kaXRpb25zKGhzX3RocmVlcCwgZmFjdCA9ICJsaWJyYXJ5X3R5cGUiKQpwbG90X2xpYnNpemUoaHNfdGhyZWVwKQpgYGAKCiMgUGxheSB3aXRoIHRoZSBtZXRhZGF0YQoKYGBge3J9Cm1ldGEgPC0gcERhdGEoaHNfc2UpCm1ldGFbWyJuY192c19nZW5lIl1dIDwtIG1ldGFbWyJuY1JOQV9nZW5lc19vYnNlcnZlZCJdXSAvIG1ldGFbWyJoaXNhdF9vYnNlcnZlZF9nZW5lcyJdXQptZXRhW1sibG5jX3ZzX2dlbmUiXV0gPC0gbWV0YVtbImxuY19STkFzX29ic2VydmVkIl1dIC8gbWV0YVtbImhpc2F0X29ic2VydmVkX2dlbmVzIl1dCm1ldGFbWyJzbm9fdnNfZ2VuZSJdXSA8LSBtZXRhW1sic25vUk5BX29ic2VydmVkIl1dIC8gbWV0YVtbImhpc2F0X29ic2VydmVkX2dlbmVzIl1dCm1ldGFbWyJleG9uX3ZzX2dlbmUiXV0gPC0gbWV0YVtbImV4b25zX29ic2VydmVkIl1dIC8gbWV0YVtbImhpc2F0X29ic2VydmVkX2dlbmVzIl1dCm1ldGFbWyJwc2V1ZG9fdnNfZ2VuZSJdXSA8LSBtZXRhW1sicHNldWRvZ2VuaWNfdHJhbnNjcmlwdHNfb2JzZXJ2ZWQiXV0gLyBtZXRhW1siaGlzYXRfb2JzZXJ2ZWRfZ2VuZXMiXV0KbWV0YVtbImZpdmVwX3ZzX2dlbmUiXV0gPC0gbWV0YVtbImZpdmVfcHJpbWVfVVRSc19vYnNlcnZlZCJdXSAvIG1ldGFbWyJoaXNhdF9vYnNlcnZlZF9nZW5lcyJdXQptZXRhW1sidGhyZWVwX3ZzX2dlbmUiXV0gPC0gbWV0YVtbInRocmVlX3ByaW1lX1VUUnNfb2JzZXJ2ZWQiXV0gLyBtZXRhW1siaGlzYXRfb2JzZXJ2ZWRfZ2VuZXMiXV0KCm1ldGFbWyJuY192c19nZW5lX3JlYWRzIl1dIDwtIG1ldGFbWyJuY1JOQV9nZW5lX3JlYWRzIl1dIC8gbWV0YVtbImhpc2F0X3N1bV9nZW5lcyJdXQptZXRhW1sibG5jX3ZzX2dlbmVfcmVhZHMiXV0gPC0gbWV0YVtbImxuY19STkFfcmVhZHMiXV0gLyBtZXRhW1siaGlzYXRfc3VtX2dlbmVzIl1dCm1ldGFbWyJzbm9fdnNfZ2VuZV9yZWFkcyJdXSA8LSBtZXRhW1sic25vUk5BX3JlYWRzIl1dIC8gbWV0YVtbImhpc2F0X3N1bV9nZW5lcyJdXQptZXRhW1siZXhvbl92c19nZW5lX3JlYWRzIl1dIDwtIG1ldGFbWyJleG9uX3JlYWRzIl1dIC8gbWV0YVtbImhpc2F0X3N1bV9nZW5lcyJdXQptZXRhW1sicHNldWRvX3ZzX2dlbmVfcmVhZHMiXV0gPC0gbWV0YVtbInBzZXVkb2dlbmljX3RyYW5zY3JpcHRfcmVhZHMiXV0gLyBtZXRhW1siaGlzYXRfc3VtX2dlbmVzIl1dCm1ldGFbWyJmaXZlcF92c19nZW5lX3JlYWRzIl1dIDwtIG1ldGFbWyJmaXZlX3ByaW1lX1VUUl9yZWFkcyJdXSAvIG1ldGFbWyJoaXNhdF9zdW1fZ2VuZXMiXV0KbWV0YVtbInRocmVlcF92c19nZW5lX3JlYWRzIl1dIDwtIG1ldGFbWyJ0aHJlZV9wcmltZV9VVFJfcmVhZHMiXV0gLyBtZXRhW1siaGlzYXRfc3VtX2dlbmVzIl1dCgpwRGF0YShoc19zZSkgPC0gbWV0YQpoc19zZSA8LSBzZXRfc2VfY29uZGl0aW9ucyhoc19zZSwgZmFjdCA9ICJsaWJyYXJ5X3R5cGUiKQoKZ2VuZXNfb2JzIDwtIHBsb3RfbWV0YWRhdGFfZmFjdG9ycyhoc19zZSwgY29sdW1uID0gImhpc2F0X29ic2VydmVkX2dlbmVzIikKZ2VuZXNfb2JzCm5jX3ZzX2dlbmUgPC0gcGxvdF9tZXRhZGF0YV9mYWN0b3JzKGhzX3NlLCBjb2x1bW4gPSAibmNfdnNfZ2VuZSIpCm5jX3ZzX2dlbmUKbG5jX3ZzX2dlbmUgPC0gcGxvdF9tZXRhZGF0YV9mYWN0b3JzKGhzX3NlLCBjb2x1bW4gPSAibG5jX3ZzX2dlbmUiKQpsbmNfdnNfZ2VuZQpzbm9fdnNfZ2VuZSA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHNfc2UsIGNvbHVtbiA9ICJzbm9fdnNfZ2VuZSIpCnNub192c19nZW5lCmV4b25fdnNfZ2VuZSA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHNfc2UsIGNvbHVtbiA9ICJleG9uX3ZzX2dlbmUiKQpleG9uX3ZzX2dlbmUKZml2ZXBfdnNfZ2VuZSA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHNfc2UsIGNvbHVtbiA9ICJmaXZlcF92c19nZW5lIikKZml2ZXBfdnNfZ2VuZQp0aHJlZXBfdnNfZ2VuZSA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHNfc2UsIGNvbHVtbiA9ICJ0aHJlZXBfdnNfZ2VuZSIpCnRocmVlcF92c19nZW5lCgpyZWFkc19vYnMgPC0gcGxvdF9tZXRhZGF0YV9mYWN0b3JzKGhzX3NlLCBjb2x1bW4gPSAiaGlzYXRfc3VtX2dlbmVzIikKcmVhZHNfb2JzCm5jX3ZzX2dlbmVfcmVhZHMgPC0gcGxvdF9tZXRhZGF0YV9mYWN0b3JzKGhzX3NlLCBjb2x1bW4gPSAibmNfdnNfZ2VuZV9yZWFkcyIpCm5jX3ZzX2dlbmVfcmVhZHMKbG5jX3ZzX2dlbmVfcmVhZHMgPC0gcGxvdF9tZXRhZGF0YV9mYWN0b3JzKGhzX3NlLCBjb2x1bW4gPSAibG5jX3ZzX2dlbmVfcmVhZHMiKQpsbmNfdnNfZ2VuZV9yZWFkcwpzbm9fdnNfZ2VuZV9yZWFkcyA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHNfc2UsIGNvbHVtbiA9ICJzbm9fdnNfZ2VuZV9yZWFkcyIpCnNub192c19nZW5lX3JlYWRzCmV4b25fdnNfZ2VuZV9yZWFkcyA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHNfc2UsIGNvbHVtbiA9ICJleG9uX3ZzX2dlbmVfcmVhZHMiKQpleG9uX3ZzX2dlbmVfcmVhZHMKZml2ZXBfdnNfZ2VuZV9yZWFkcyA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHNfc2UsIGNvbHVtbiA9ICJmaXZlcF92c19nZW5lX3JlYWRzIikKZml2ZXBfdnNfZ2VuZV9yZWFkcwp0aHJlZXBfdnNfZ2VuZV9yZWFkcyA8LSBwbG90X21ldGFkYXRhX2ZhY3RvcnMoaHNfc2UsIGNvbHVtbiA9ICJ0aHJlZXBfdnNfZ2VuZV9yZWFkcyIpCnRocmVlcF92c19nZW5lX3JlYWRzCmBgYAoKIyBFeGFtaW5lIGtyYWtlbiBiYWN0ZXJpYWwgZGF0YQoKYGBge3J9CmhzX2tyYWtlbiA8LSBjcmVhdGVfZXhwdChtb2RpZmllZF9zaGVldCwgZmlsZV90eXBlID0gImtyYWtlbiIsIGZpbGVfY29sdW1uID0gImtyYWtlbl9tYXRyaXgiKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAibGlicmFyeV90eXBlIikKcGxvdF9saWJzaXplKGhzX2tyYWtlbikKCmhzX2tyYWtlbl9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2tyYWtlbiwgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJjcG0iLCBub3JtID0gInF1YW50IikKcGxvdF9wY2EoaHNfa3Jha2VuX25vcm0pCgprcmFrZW5fZGUgPC0gYWxsX3BhaXJ3aXNlKGhzX2tyYWtlbiwgZmlsdGVyID0gVFJVRSkKa3Jha2VuX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKGtyYWtlbl9kZSwgZXhjZWwgPSAiZXhjZWwva3Jha2VuX2NvbXBhcmUueGxzeCIpCmBgYAo=