1 Introduction

This document is intended to provide an overview of TMRC3 samples which have been sequenced. It includes some plots and analyses showing the relationships among the samples as well as some differential analyses when possible.

2 Annotation

We take the annotation data from ensembl’s biomart instance. The genome which was used to map the data was hg38 revision 91. My default when using biomart is to load the data from 1 year before the current date, which provides annotations which match hg38 91 almost perfectly.

hs_annot <- load_biomart_annotations()
## The biomart annotations file already exists, loading from it.
hs_annot <- hs_annot[["annotation"]]
hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".", hs_annot[["version"]])
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique=TRUE)
tx_gene_map <- hs_annot[, c("transcript", "ensembl_gene_id")]

3 Sample Estimation

I used two mapping methods for this data, hisat2 and salmon. Most analyses use hisat2, which is a more traditional map-and-count method. In contrast, salmon uses what may be thought of as a indexed voting method (so that multi-matches are discounted and the votes split among all matches). Salmon also required a pre-existing database of known transcripts (though later versions may actually use mapping from things like hisat), while hisat uses the genome and a database of known transcripts (and optionally can search for splicing junctions to find new transcripts).

3.1 Generate expressionsets

The first thing to note is the large range in coverage. There are multiple samples with coverage which is too low to use. These will be removed shortly.

macr <- create_expt("sample_sheets/tmrc3_samples_20210512.xlsx",
                    file_column = "hg38100hisatfile",
                    savefile = "hs_expt_all.rda",
                    gene_info = hs_annot) %>%
  exclude_genes_expt(column = "gene_biotype", method = "keep",
                     pattern = "protein_coding") %>%
  subset_expt(nonzero = 11000) %>%
  subset_expt(subset = "typeofcells=='Macrophages'") %>%
  set_expt_conditions(fact = "infectionzymodeme") %>%
  set_expt_batches(fact = "infectiondrug")
## Reading the sample metadata.
## Dropped 113 rows from the sample metadata because they were blank.
## The sample definitions comprises: 131 rows(samples) and 80 columns(metadata fields).
## Warning in create_expt("sample_sheets/tmrc3_samples_20210512.xlsx", file_column
## = "hg38100hisatfile", : Some samples were removed when cross referencing the
## samples against the count data.
## Matched 21452 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 rows and 119 columns.
## Before removal, there were 21481 genes, now there are 19941.
## There are 13 samples which kept less than 90 percent counts.
## TMRC30015 TMRC30017 TMRC30019 TMRC30044 TMRC30045 TMRC30097 TMRC30075 TMRC30087 
##     79.24     85.72     89.75     80.34     73.33     89.90     86.97     83.63 
## TMRC30101 TMRC30104 TMRC30114 TMRC30131 TMRC30073 
##     88.41     80.29     87.62     86.82     89.26
## The samples (and read coverage) removed when filtering 11000 non-zero genes are:
## TMRC30010 TMRC30050 TMRC30052 
##     52471    808149   3087347
## subset_expt(): There were 119, now there are 116 samples.
## subset_expt(): There were 116, now there are 12 samples.

4 Macrophages

These samples are rather different from all of the others. The following section is therefore written primarily in response to a separate set of emails from Olga and Maria Adelaida; here is a snippet:

Dear all, about the samples corresponding to infected macrophages with three sensitive (2.2) and three resistant (2.3) clinical strains of L. (V.) panamensis, I send you the results of parasite burden by detection of 7SLRNA. I think these results are interesting, but the sample size is very small. Doctor Najib or Trey could you please send me the quality data and PCA analysis of these samples?

and

Hi Doctor, thank you. These samples corresponding to primary macrophages infected with clinical strains 2.2 (n=3) and 2.3 (n = 3). These information is in the file: TMRC project 3: excel Host TMRC3 v1.1, rows 137 to 150.

Thus I added 3 columns to the end of the sample sheet which seek to include this information. The first is ‘drug’ and encodes both the infection state (no for the two controls and yes for everything else), the second is zymodeme which I took from the tmrc2 sample sheet, the last is drug, which is either no or sb.

macr_norm <- sm(normalize_expt(macr, transform="log2", norm="quant", convert="cpm", filter=TRUE))
norm_pca <- plot_pca(macr_norm, plot_labels=FALSE)
pp(file="macrophage_side_experiment/norm_pca.png", image=norm_pca$plot)

plot_3d_pca(norm_pca)$plot
macr_nb <- sm(normalize_expt(macr, norm = "quant", convert = "cpm",
                             transform = "log2", batch = "svaseq", filter = TRUE))
nb_pca <- plot_pca(macr_nb, plot_labels=FALSE)
pp(file="macrophage_side_experiment/normbatch_pca.png", image=nb_pca$plot)

4.1 Write the data

macr_written <- sm(write_expt(macr, excel="macrophage_side_experiment/macrophage_expt.xlsx"))
## Error in checkModelStatus(fit, showWarnings = showWarnings, colinearityCutoff = colinearityCutoff) : 
##   The variables specified in this model are redundant,
## so the design matrix is not full rank
## Error in checkModelStatus(fit, showWarnings = showWarnings, colinearityCutoff = colinearityCutoff) : 
##   The variables specified in this model are redundant,
## so the design matrix is not full rank

4.2 Perform DE

There were a couple of contrasts explicitly requested for this data:

  • Macrophages infected with 2.3 without SbV vs macrophagues infected with 2.2 without SbV
  • Macrophages infected with 2.3 without SbV vs macrophages uninfected (M0)

Unfortunately, I think to really answer these questions we will require more replicates of a few of these conditions, most notably the uninfected samples.

##tmp <- normalize_expt(macr, filter=TRUE)
##zy_de <- deseq_pairwise(tmp, model_batch="svaseq")
##zy_ed <- edger_pairwise(tmp, model_batch="svaseq")
combined_condition <- paste0(pData(macr)[["infectiondrug"]],
                             pData(macr)[["infectionzymodeme"]])
pData(macr[["expressionset"]])[["combined"]] <- combined_condition
macr <- set_expt_conditions(macr, fact = "combined")
keepers <- list(
    "zymo_nodrug" = c("infz23", "infz22"),
    "z23_uninf" = c("infz23", "uninfnozymo"))
    
zymo_de <- all_pairwise(macr, model_batch = "svaseq", filter = TRUE,
                        do_ebseq = FALSE)
## batch_counts: Before batch/surrogate estimation, 57 entries are x==0: 0%.
## Plotting a PCA before surrogate/batch inclusion.
## Using svaseq to visualize before/after batch inclusion.
## Performing a test normalization with: raw
## Removing 0 low-count genes (11030 remaining).
## batch_counts: Before batch/surrogate estimation, 57 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 3668 entries are 0<x<1: 3%.
## Error in solve.default(t(mod) %*% mod) : 
##   system is computationally singular: reciprocal condition number = 2.27998e-18
## Warning in all_adjusters(count_table, design = design, estimate_type = method, :
## It is highly likely that the underlying reason for this error is too many 0's in
## the dataset, please try doing a filtering of the data and retry.
## Error in solve.default(t(mod) %*% mod) : 
##   system is computationally singular: reciprocal condition number = 2.27072e-18
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, :
## The batch_counts call failed. Returning non-batch reduced data.
## transform_counts: Found 57 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
zymo_table <- combine_de_tables(zymo_de, keepers=keepers,
                                excel="macrophage_side_experiment/macrophage_de.xlsx")
## Deleting the file macrophage_side_experiment/macrophage_de.xlsx before writing the tables.
if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  message(paste0("Saving to ", savefile))
  tmp <- sm(saveme(filename=savefile))
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 68b1ce610bf0c750d9a3ed2f6bd2a529b1744c29
## This is hpgltools commit: Thu May 27 17:01:01 2021 -0400: 68b1ce610bf0c750d9a3ed2f6bd2a529b1744c29
## Saving to macrophage_experiment_202105.rda.xz
tmp <- loadme(filename=savefile)
LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDIxMDU6IEEgU2VwYXJhdGUgTWFjcm9waGFnZSBFeHBlcmltZW50IgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiBodG1sX2RvY3VtZW50OgogIGNvZGVfZG93bmxvYWQ6IHRydWUKICBjb2RlX2ZvbGRpbmc6IHNob3cKICBmaWdfY2FwdGlvbjogdHJ1ZQogIGZpZ19oZWlnaHQ6IDcKICBmaWdfd2lkdGg6IDcKICBoaWdobGlnaHQ6IGRlZmF1bHQKICBrZWVwX21kOiBmYWxzZQogIG1vZGU6IHNlbGZjb250YWluZWQKICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHRoZW1lOiByZWFkYWJsZQogIHRvYzogdHJ1ZQogIHRvY19mbG9hdDoKICAgY29sbGFwc2VkOiBmYWxzZQogICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZT4KICBib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgICBtYXgtd2lkdGg6IDE2MDBweDsKICB9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGhwZ2x0b29scykKdHQgPC0gc20oZGV2dG9vbHM6OmxvYWRfYWxsKCIvZGF0YS9ocGdsdG9vbHMiKSkKa25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICB3aWR0aD05MCwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy53aWR0aD04LAogICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodD04LAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTIpKQp2ZXIgPC0gIjIwMjEwNSIKcHJldmlvdXNfZmlsZSA8LSBwYXN0ZTAoIm5vbmUiLCB2ZXIsICIuUm1kIikKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlWSVtJWQiKQp0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1nc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IlxcLnJkYVxcLnh6IiwgeD1wcmV2aW91c19maWxlKSkpKQpybWRfZmlsZSA8LSAibWFjcm9waGFnZV9leHBlcmltZW50XzIwMjEwNS5SbWQiCnNhdmVmaWxlIDwtIGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iXFwucmRhXFwueHoiLCB4PXJtZF9maWxlKQpgYGAKCiMgSW50cm9kdWN0aW9uCgpUaGlzIGRvY3VtZW50IGlzIGludGVuZGVkIHRvIHByb3ZpZGUgYW4gb3ZlcnZpZXcgb2YgVE1SQzMgc2FtcGxlcyB3aGljaCBoYXZlCmJlZW4gc2VxdWVuY2VkLiAgSXQgaW5jbHVkZXMgc29tZSBwbG90cyBhbmQgYW5hbHlzZXMgc2hvd2luZyB0aGUgcmVsYXRpb25zaGlwcwphbW9uZyB0aGUgc2FtcGxlcyBhcyB3ZWxsIGFzIHNvbWUgZGlmZmVyZW50aWFsIGFuYWx5c2VzIHdoZW4gcG9zc2libGUuCgojIEFubm90YXRpb24KCldlIHRha2UgdGhlIGFubm90YXRpb24gZGF0YSBmcm9tIGVuc2VtYmwncyBiaW9tYXJ0IGluc3RhbmNlLiAgVGhlIGdlbm9tZSB3aGljaAp3YXMgdXNlZCB0byBtYXAgdGhlIGRhdGEgd2FzIGhnMzggcmV2aXNpb24gOTEuICBNeSBkZWZhdWx0IHdoZW4gdXNpbmcgYmlvbWFydCBpcwp0byBsb2FkIHRoZSBkYXRhIGZyb20gMSB5ZWFyIGJlZm9yZSB0aGUgY3VycmVudCBkYXRlLCB3aGljaCBwcm92aWRlcyBhbm5vdGF0aW9ucwp3aGljaCBtYXRjaCBoZzM4IDkxIGFsbW9zdCBwZXJmZWN0bHkuCgpgYGB7ciBoc19hbm5vdH0KaHNfYW5ub3QgPC0gbG9hZF9iaW9tYXJ0X2Fubm90YXRpb25zKCkKaHNfYW5ub3QgPC0gaHNfYW5ub3RbWyJhbm5vdGF0aW9uIl1dCmhzX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBwYXN0ZTAocm93bmFtZXMoaHNfYW5ub3QpLCAiLiIsIGhzX2Fubm90W1sidmVyc2lvbiJdXSkKcm93bmFtZXMoaHNfYW5ub3QpIDwtIG1ha2UubmFtZXMoaHNfYW5ub3RbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQp0eF9nZW5lX21hcCA8LSBoc19hbm5vdFssIGMoInRyYW5zY3JpcHQiLCAiZW5zZW1ibF9nZW5lX2lkIildCmBgYAoKIyBTYW1wbGUgRXN0aW1hdGlvbgoKSSB1c2VkIHR3byBtYXBwaW5nIG1ldGhvZHMgZm9yIHRoaXMgZGF0YSwgaGlzYXQyIGFuZCBzYWxtb24uICBNb3N0IGFuYWx5c2VzIHVzZQpoaXNhdDIsIHdoaWNoIGlzIGEgbW9yZSB0cmFkaXRpb25hbCBtYXAtYW5kLWNvdW50IG1ldGhvZC4gIEluIGNvbnRyYXN0LCBzYWxtb24KdXNlcyB3aGF0IG1heSBiZSB0aG91Z2h0IG9mIGFzIGEgaW5kZXhlZCB2b3RpbmcgbWV0aG9kIChzbyB0aGF0IG11bHRpLW1hdGNoZXMgYXJlCmRpc2NvdW50ZWQgYW5kIHRoZSB2b3RlcyBzcGxpdCBhbW9uZyBhbGwgbWF0Y2hlcykuICBTYWxtb24gYWxzbyByZXF1aXJlZCBhCnByZS1leGlzdGluZyBkYXRhYmFzZSBvZiBrbm93biB0cmFuc2NyaXB0cyAodGhvdWdoIGxhdGVyIHZlcnNpb25zIG1heSBhY3R1YWxseQp1c2UgbWFwcGluZyBmcm9tIHRoaW5ncyBsaWtlIGhpc2F0KSwgd2hpbGUgaGlzYXQgdXNlcyB0aGUgZ2Vub21lIGFuZCBhIGRhdGFiYXNlCm9mIGtub3duIHRyYW5zY3JpcHRzIChhbmQgb3B0aW9uYWxseSBjYW4gc2VhcmNoIGZvciBzcGxpY2luZyBqdW5jdGlvbnMgdG8gZmluZApuZXcgdHJhbnNjcmlwdHMpLgoKIyMgR2VuZXJhdGUgZXhwcmVzc2lvbnNldHMKClRoZSBmaXJzdCB0aGluZyB0byBub3RlIGlzIHRoZSBsYXJnZSByYW5nZSBpbiBjb3ZlcmFnZS4gIFRoZXJlIGFyZSBtdWx0aXBsZQpzYW1wbGVzIHdpdGggY292ZXJhZ2Ugd2hpY2ggaXMgdG9vIGxvdyB0byB1c2UuICBUaGVzZSB3aWxsIGJlIHJlbW92ZWQgc2hvcnRseS4KCmBgYHtyIGFsbF9uZXdfaGlzYXQyfQptYWNyIDwtIGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL3RtcmMzX3NhbXBsZXNfMjAyMTA1MTIueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW4gPSAiaGczODEwMGhpc2F0ZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGUgPSAiaHNfZXhwdF9hbGwucmRhIiwKICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm8gPSBoc19hbm5vdCkgJT4lCiAgZXhjbHVkZV9nZW5lc19leHB0KGNvbHVtbiA9ICJnZW5lX2Jpb3R5cGUiLCBtZXRob2QgPSAia2VlcCIsCiAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAicHJvdGVpbl9jb2RpbmciKSAlPiUKICBzdWJzZXRfZXhwdChub256ZXJvID0gMTEwMDApICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J01hY3JvcGhhZ2VzJyIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJpbmZlY3Rpb256eW1vZGVtZSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJpbmZlY3Rpb25kcnVnIikKYGBgCgojIE1hY3JvcGhhZ2VzCgpUaGVzZSBzYW1wbGVzIGFyZSByYXRoZXIgZGlmZmVyZW50IGZyb20gYWxsIG9mIHRoZSBvdGhlcnMuICBUaGUgZm9sbG93aW5nCnNlY3Rpb24gaXMgdGhlcmVmb3JlIHdyaXR0ZW4gcHJpbWFyaWx5IGluIHJlc3BvbnNlIHRvIGEgc2VwYXJhdGUgc2V0IG9mIGVtYWlscwpmcm9tIE9sZ2EgYW5kIE1hcmlhIEFkZWxhaWRhOyBoZXJlIGlzIGEgc25pcHBldDoKCiBEZWFyIGFsbCwgYWJvdXQgdGhlIHNhbXBsZXMgY29ycmVzcG9uZGluZyB0byBpbmZlY3RlZCBtYWNyb3BoYWdlcyB3aXRoIHRocmVlCiBzZW5zaXRpdmUgKDIuMikgYW5kIHRocmVlIHJlc2lzdGFudCAoMi4zKSBjbGluaWNhbCBzdHJhaW5zIG9mIEwuIChWLikKIHBhbmFtZW5zaXMsIEkgc2VuZCB5b3UgdGhlIHJlc3VsdHMgb2YgcGFyYXNpdGUgYnVyZGVuIGJ5IGRldGVjdGlvbiBvZiA3U0xSTkEuIEkKIHRoaW5rIHRoZXNlIHJlc3VsdHMgYXJlIGludGVyZXN0aW5nLCBidXQgdGhlIHNhbXBsZSBzaXplIGlzIHZlcnkgc21hbGwuCkRvY3RvciBOYWppYiBvciBUcmV5IGNvdWxkIHlvdSBwbGVhc2Ugc2VuZCBtZSB0aGUgcXVhbGl0eSBkYXRhIGFuZCBQQ0EgYW5hbHlzaXMKIG9mIHRoZXNlIHNhbXBsZXM/CgphbmQKCiBIaSBEb2N0b3IsIHRoYW5rIHlvdS4gIFRoZXNlIHNhbXBsZXMgY29ycmVzcG9uZGluZyB0byBwcmltYXJ5IG1hY3JvcGhhZ2VzCiBpbmZlY3RlZCB3aXRoIGNsaW5pY2FsIHN0cmFpbnMgMi4yIChuPTMpIGFuZCAyLjMgKG4gPSAzKS4gVGhlc2UgaW5mb3JtYXRpb24gaXMKIGluIHRoZSBmaWxlOiBUTVJDIHByb2plY3QgMzogZXhjZWwgSG9zdCBUTVJDMyB2MS4xLCByb3dzIDEzNyB0byAxNTAuCgpUaHVzIEkgYWRkZWQgMyBjb2x1bW5zIHRvIHRoZSBlbmQgb2YgdGhlIHNhbXBsZSBzaGVldCB3aGljaCBzZWVrIHRvCmluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbi4gIFRoZSBmaXJzdCBpcyAnZHJ1ZycgYW5kIGVuY29kZXMgYm90aCB0aGUgaW5mZWN0aW9uCnN0YXRlIChubyBmb3IgdGhlIHR3byBjb250cm9scyBhbmQgeWVzIGZvciBldmVyeXRoaW5nIGVsc2UpLCB0aGUgc2Vjb25kIGlzCnp5bW9kZW1lIHdoaWNoIEkgdG9vayBmcm9tIHRoZSB0bXJjMiBzYW1wbGUgc2hlZXQsIHRoZSBsYXN0IGlzIGRydWcsIHdoaWNoIGlzCmVpdGhlciBubyBvciBzYi4KCmBgYHtyIG1hY3JvcGhhZ2Vfenltb2RlbWVfZXhwZXJpbWVudH0KbWFjcl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KG1hY3IsIHRyYW5zZm9ybT0ibG9nMiIsIG5vcm09InF1YW50IiwgY29udmVydD0iY3BtIiwgZmlsdGVyPVRSVUUpKQpub3JtX3BjYSA8LSBwbG90X3BjYShtYWNyX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFKQpwcChmaWxlPSJtYWNyb3BoYWdlX3NpZGVfZXhwZXJpbWVudC9ub3JtX3BjYS5wbmciLCBpbWFnZT1ub3JtX3BjYSRwbG90KQpwbG90XzNkX3BjYShub3JtX3BjYSkkcGxvdAoKbWFjcl9uYiA8LSBzbShub3JtYWxpemVfZXhwdChtYWNyLCBub3JtID0gInF1YW50IiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkpCm5iX3BjYSA8LSBwbG90X3BjYShtYWNyX25iLCBwbG90X2xhYmVscz1GQUxTRSkKcHAoZmlsZT0ibWFjcm9waGFnZV9zaWRlX2V4cGVyaW1lbnQvbm9ybWJhdGNoX3BjYS5wbmciLCBpbWFnZT1uYl9wY2EkcGxvdCkKYGBgCgojIyBXcml0ZSB0aGUgZGF0YQoKYGBge3Igd3JpdGUsIGZpZy5zaG93PSJoaWRlIn0KbWFjcl93cml0dGVuIDwtIHNtKHdyaXRlX2V4cHQobWFjciwgZXhjZWw9Im1hY3JvcGhhZ2Vfc2lkZV9leHBlcmltZW50L21hY3JvcGhhZ2VfZXhwdC54bHN4IikpCmBgYAoKIyMgUGVyZm9ybSBERQoKVGhlcmUgd2VyZSBhIGNvdXBsZSBvZiBjb250cmFzdHMgZXhwbGljaXRseSByZXF1ZXN0ZWQgZm9yIHRoaXMgZGF0YToKCiogTWFjcm9waGFnZXMgaW5mZWN0ZWQgd2l0aCAyLjMgd2l0aG91dCBTYlYgdnMgbWFjcm9waGFndWVzIGluZmVjdGVkIHdpdGggMi4yIHdpdGhvdXQgU2JWCiogTWFjcm9waGFnZXMgaW5mZWN0ZWQgd2l0aCAyLjMgd2l0aG91dCBTYlYgdnMgbWFjcm9waGFnZXMgdW5pbmZlY3RlZCAoTTApCgpVbmZvcnR1bmF0ZWx5LCBJIHRoaW5rIHRvIHJlYWxseSBhbnN3ZXIgdGhlc2UgcXVlc3Rpb25zIHdlIHdpbGwKcmVxdWlyZSBtb3JlIHJlcGxpY2F0ZXMgb2YgYSBmZXcgb2YgdGhlc2UgY29uZGl0aW9ucywgbW9zdCBub3RhYmx5IHRoZQp1bmluZmVjdGVkIHNhbXBsZXMuCgpgYGB7ciBkZSwgZmlnLnNob3c9ImhpZGUifQojI3RtcCA8LSBub3JtYWxpemVfZXhwdChtYWNyLCBmaWx0ZXI9VFJVRSkKIyN6eV9kZSA8LSBkZXNlcV9wYWlyd2lzZSh0bXAsIG1vZGVsX2JhdGNoPSJzdmFzZXEiKQojI3p5X2VkIDwtIGVkZ2VyX3BhaXJ3aXNlKHRtcCwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpCmNvbWJpbmVkX2NvbmRpdGlvbiA8LSBwYXN0ZTAocERhdGEobWFjcilbWyJpbmZlY3Rpb25kcnVnIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKG1hY3IpW1siaW5mZWN0aW9uenltb2RlbWUiXV0pCnBEYXRhKG1hY3JbWyJleHByZXNzaW9uc2V0Il1dKVtbImNvbWJpbmVkIl1dIDwtIGNvbWJpbmVkX2NvbmRpdGlvbgptYWNyIDwtIHNldF9leHB0X2NvbmRpdGlvbnMobWFjciwgZmFjdCA9ICJjb21iaW5lZCIpCmtlZXBlcnMgPC0gbGlzdCgKICAgICJ6eW1vX25vZHJ1ZyIgPSBjKCJpbmZ6MjMiLCAiaW5mejIyIiksCiAgICAiejIzX3VuaW5mIiA9IGMoImluZnoyMyIsICJ1bmluZm5venltbyIpKQogICAgCnp5bW9fZGUgPC0gYWxsX3BhaXJ3aXNlKG1hY3IsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvX2Vic2VxID0gRkFMU0UpCnp5bW9fdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoenltb19kZSwga2VlcGVycz1rZWVwZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPSJtYWNyb3BoYWdlX3NpZGVfZXhwZXJpbWVudC9tYWNyb3BoYWdlX2RlLnhsc3giKQpgYGAKCmBgYHtyIHNhdmVtZX0KaWYgKCFpc1RSVUUoZ2V0MCgic2tpcF9sb2FkIikpKSB7CiAgcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKICBtZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKICBtZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHNhdmVmaWxlKSkKICB0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXNhdmVmaWxlKSkKfQpgYGAKCmBgYHtyIGxvYWRtZV9hZnRlciwgZXZhbD1GQUxTRX0KdG1wIDwtIGxvYWRtZShmaWxlbmFtZT1zYXZlZmlsZSkKYGBgCg==