library(ithi.utils)
load_base_libs()

## grid graphics
library(grid)
library(gridExtra)
library(gridGraphics)
library(extrafont)
library(gridBase)
library(ape)
library(phylobase)
library(phytools)
library(OutbreakTools)
library(colorspace)
library(RColorBrewer)
library(igraph)

library(ithi.meta)
library(ithi.xcr)
library(ithi.clones)
library(ithi.expr)
library(ithi.figures)
library(ithi.seq)

Colour palettes

pal_patient <- select_palette("patient")

Parameters

db_path <- snakemake@params$db

ihc_table_path <- snakemake@input$ihc_table
xcr_table_path <- snakemake@input$xcr_table
nanostring_data_path <- snakemake@input$nanostring_data
nanostring_annotations_path <- snakemake@input$nanostring_annotations
master_variant_file <- snakemake@input$master_variant_file
trb_annotated_path <- snakemake@input$trb_annotated

# igpartition_outdir <- snakemake@input$igpartition_outdir
bcrphylo_figure <- snakemake@input$bcrphylo_png
mutsig_figure <- snakemake@input$mutsig_png
immune_cancer_figure <- snakemake@input$immune_cancer_png
immune_overview_figure <- snakemake@input$immune_overview_png
merged_figures_path <- snakemake@input$merged_figures

Metadata

db <- src_sqlite(db_path, create = FALSE)

samples <- collect(tbl(db, "samples"))

Data

ihc_table <- fread(ihc_table_path)
xcr_table <- read_clonotypes(xcr_table_path, duplicates = FALSE, db_path)

Read 19.7% of 304822 rows
Read 45.9% of 304822 rows
Read 88.6% of 304822 rows
Read 304822 rows and 18 (of 18) columns from 0.070 GB file in 00:00:06
exprs <- fread(nanostring_data_path)
labels <- fread(nanostring_annotations_path)
trb_annotated <- fread(trb_annotated_path)
master_variant_table <- read_variant_file(master_variant_file, db_path)

Figures

Will be updated as I work on more of these. Note: Fonts will always be ugly on here because genesis doesn’t have ANY truetype fonts :(

Figure 1

Landscape figure showing sample statistics. Base R graphics are very fast!

condensed_ids <- unique(subset(samples, project_code == "ITH" & !source %in% 
    c("blood", "normal"))$condensed_id)
condensed_ids <- as.character(sort(factor_id(condensed_ids, type = "condensed_id", 
    db_path)))

plot_landscape_figure(db_path, condensed_ids = condensed_ids, ihc_table = ihc_table, 
    xcr_table = xcr_table, variant_table = master_variant_table, separate_opt = "zebra")
WGS 
IHC 
TCR/BCR-seq 

plot_landscape_figure(db_path, condensed_ids = condensed_ids, ihc_table = ihc_table, 
    xcr_table = xcr_table, variant_table = master_variant_table, separate_opt = "line")
WGS 
IHC 
TCR/BCR-seq 

Plotted w/ zebra and line separators in case you like one better. Also added patient labels.

Figure 2

Immune overview figure. If you have any suggestions on what to include/remove please let me know!

Top to bottom:

  • Patient colour label legend
  • TCR (left) and BCR (right) clonotype sharing illustrated by Circos plots
  • Mean expression of certain pathways as indicated by Nanostring annotations
  • Intrapatient similarity in TCR repertoire
  • High correlation between TCR repertoire similarity and CD8+ TIL density (left), lower correlation with CD4+ TIL density (middle) and CD8+’s are more broadly distributed across tumour sites than CD4+’s (right)

Figure 3

B-cell phylogenetics.

Subfigures:

  • Evidence of either B-cell exchange or parallel affinity maturation across tumour sites
  • Evidence of lineage divergence by tumour site
  • Evidence of phylogenetic signal in readcounts (sequence-dependent expansion)
  • Correlations between GSI/phylosignal and CD20+ TIL densities
# plot_bcrphylo_figure(resultdir = igpartition_outdir, ihc_table, parts =
# list(A=list(patient=2,clust=7), B=list(patient=18, clust=10),
# C=list(patient=9, clust=14)))

Figure 4

Mutational signatures and immune activity.

Subfigures:

  • SNV signatures
  • SV signatures
  • Clustering by mutation signature proportions
  • Expression-derived immune covariates overlaid on mutation signature-based clusters
  • TCGA survival analysis

Figure 5

Immune-cancer interaction.

Figure 6

LS0tCnRpdGxlOiAiRmlndXJlIGdhbGxlcnkiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IHRydWUKcGFyYW1zOgogIHJtZDogImZpZ3VyZXMuUm1kIgotLS0KICAgICAgICAgICAgICAgICAgICAgICAgYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIyMjIyMjIyBTbmFrZW1ha2UgaGVhZGVyICMjIyMjIyMjCmxpYnJhcnkobWV0aG9kcykKU25ha2VtYWtlIDwtIHNldENsYXNzKAogICAgIlNuYWtlbWFrZSIsCiAgICBzbG90cyA9IGMoCiAgICAgICAgaW5wdXQgPSAibGlzdCIsCiAgICAgICAgb3V0cHV0ID0gImxpc3QiLAogICAgICAgIHBhcmFtcyA9ICJsaXN0IiwKICAgICAgICB3aWxkY2FyZHMgPSAibGlzdCIsCiAgICAgICAgdGhyZWFkcyA9ICJudW1lcmljIiwKICAgICAgICBsb2cgPSAibGlzdCIsCiAgICAgICAgcmVzb3VyY2VzID0gImxpc3QiLAogICAgICAgIGNvbmZpZyA9ICJsaXN0IiwKICAgICAgICBydWxlID0gImNoYXJhY3RlciIKICAgICkKKQpzbmFrZW1ha2UgPC0gU25ha2VtYWtlKAogICAgaW5wdXQgPSBsaXN0KCcvc2hhaGxhYi9hbWNwaGVyc29uL3Byb2plY3RzL2l0aDMvaXRoMy9ub3RlYm9va3MvYmVzcG9rZS9pdGhfc252cy50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvd2ViL3Jlc291cmNlcy9pbW11bmVfY2FuY2VyX2ZpZ3VyZS5wbmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvdHJiX3RhYmxlX2Fubm90YXRlZC50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbmFub3N0cmluZ19yZXN1bHRzL2l0aF9mdWxsL3FjL2xpbW1hX3F1YW50aWxlL25vcm1hbGl6ZWRfZXhwcmVzc2lvbl92b2FfbGFiZWxzX2ZpbHRlcmVkLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy93ZWIvcmVzb3VyY2VzL2ltbXVuZV9vdmVydmlld19maWd1cmUucG5nJywgJ1JtZC9maWd1cmVzLlJtZCcsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9paGNfdGFibGUudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9hbmFseXNpcy9SbWQvX3NpdGUueW1sJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vbmFub3N0cmluZy9wYW5jYW5jZXJfYW5ub3RhdGlvbnMudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3dlYi9yZXNvdXJjZXMvbXV0c2lnX2ZpZ3VyZS5wbmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvd2ViL3Jlc291cmNlcy9maWd1cmVzX21lcmdlZC5wZGYnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIveGNyX3RhYmxlLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy93ZWIvcmVzb3VyY2VzL2JjcnBoeWxvX2ZpZ3VyZS5wbmcnLCAibWFzdGVyX3ZhcmlhbnRfZmlsZSIgPSAnL3NoYWhsYWIvYW1jcGhlcnNvbi9wcm9qZWN0cy9pdGgzL2l0aDMvbm90ZWJvb2tzL2Jlc3Bva2UvaXRoX3NudnMudHN2JywgImltbXVuZV9jYW5jZXJfcG5nIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy93ZWIvcmVzb3VyY2VzL2ltbXVuZV9jYW5jZXJfZmlndXJlLnBuZycsICJ0cmJfYW5ub3RhdGVkIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi90cmJfdGFibGVfYW5ub3RhdGVkLnRzdicsICJuYW5vc3RyaW5nX2RhdGEiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL25hbm9zdHJpbmdfcmVzdWx0cy9pdGhfZnVsbC9xYy9saW1tYV9xdWFudGlsZS9ub3JtYWxpemVkX2V4cHJlc3Npb25fdm9hX2xhYmVsc19maWx0ZXJlZC50c3YnLCAiaW1tdW5lX292ZXJ2aWV3X3BuZyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvd2ViL3Jlc291cmNlcy9pbW11bmVfb3ZlcnZpZXdfZmlndXJlLnBuZycsICJub3RlYm9vayIgPSAnUm1kL2ZpZ3VyZXMuUm1kJywgImloY190YWJsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvaWhjX3RhYmxlLnRzdicsICJzaXRlX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9hbmFseXNpcy9SbWQvX3NpdGUueW1sJywgIm5hbm9zdHJpbmdfYW5ub3RhdGlvbnMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vbmFub3N0cmluZy9wYW5jYW5jZXJfYW5ub3RhdGlvbnMudHN2JywgIm11dHNpZ19wbmciID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3dlYi9yZXNvdXJjZXMvbXV0c2lnX2ZpZ3VyZS5wbmcnLCAibWVyZ2VkX2ZpZ3VyZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3dlYi9yZXNvdXJjZXMvZmlndXJlc19tZXJnZWQucGRmJywgInhjcl90YWJsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIveGNyX3RhYmxlLnRzdicsICJiY3JwaHlsb19wbmciID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3dlYi9yZXNvdXJjZXMvYmNycGh5bG9fZmlndXJlLnBuZycpLAogICAgb3V0cHV0ID0gbGlzdCgnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvd2ViL2ZpZ3VyZXMubmIuaHRtbCcpLAogICAgcGFyYW1zID0gbGlzdCgnaXRoaS1hbmFseXNpcy1maWd1cmUtZ2FsbGVyeScsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvbWV0YWRhdGEvZGIvaW1tdW5lX3Byb2plY3Quc3FsaXRlMycsICJuYW1lIiA9ICdpdGhpLWFuYWx5c2lzLWZpZ3VyZS1nYWxsZXJ5JywgImRiIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvbWV0YWRhdGEvZGIvaW1tdW5lX3Byb2plY3Quc3FsaXRlMycpLAogICAgd2lsZGNhcmRzID0gbGlzdCgpLAogICAgdGhyZWFkcyA9IDEsCiAgICBsb2cgPSBsaXN0KCcvc2hhaGxhYi9hbHpoYW5nL2NsdXN0dG1wL3BhcGVyYW5hbHlzaXMyL2ZpZ3VyZV9nYWxsZXJ5LmxvZycpLAogICAgcmVzb3VyY2VzID0gbGlzdCgpLAogICAgY29uZmlnID0gbGlzdCgidGNnYV9vdl9hbm5vdGF0aW9ucyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL1RDR0EvdGNnYV9vdl9hbm5vdGF0aW9uX3N1cDEzLnR4dCcsICJqX2RpY3Rpb25hcnkiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9zdWJwcm9qZWN0cy9pbW10eXBlci9tZXRhZGF0YS9pbWd0L0hvbW9fc2FwaWVuc19UUkJKLmZhc3RhJywgInNhZF9ub3RlYm9vayIgPSAnUm1kL3NwZWNpZXNfYWJ1bmRhbmNlX2Rpc3RyaWJ1dGlvbnMuUm1kJywgIm5hbm9zdHJpbmdfc2lnbmF0dXJlX25vdGVib29rIiA9ICdSbWQvbmFub3N0cmluZ19zaWduYXR1cmVzLlJtZCcsICJpdGhfc3RhdF90eXBlcyIgPSBjKCdlbnRyb3B5JywgJ3Bvc3Rwcm9jZXNzZWRfZGl2ZXJnZW5jZScsICdjb21iaW5lZF9pdGhfbm9ybWFsaXplZCcsICdwcm9wb3J0aW9uX3N1YmNsb25hbCcpLCAiaXRoX3N0YXRpc3RpY3Nfbm90ZWJvb2siID0gJ1JtZC9pdGhfc3RhdGlzdGljcy5SbWQnLCAiaWNnY19zcGVjaW1lbl9maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9zcGVjaW1lbi50c3YnLCAiY2xvbmVfcHJldmFsZW5jZV9maWxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9pdGgvY29tcGxldGUvY2xvbmVfZGF0YS50c3YnLCAibW1jdG1fcGF0aWVudF9hbmNlc3RyYWxfZGVzY2VuZGFudF9yZXN1bHRfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2l0aF9ieS1wYXRpZW50LWFuY2VzdHJ5L291dHB1dCcsICJQTkdfUVVBTElUWSIgPSAzMDAsICJ4Y3JtYXBzY2FwZV9maWxlcyIgPSBjKCcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzIuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8zLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvNC5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzcuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS85LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMTAuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8xMS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzEyLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMTMuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8xNC5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL3hjcm1hcHNjYXBlLzE1LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIveGNybWFwc2NhcGUvMTYuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi94Y3JtYXBzY2FwZS8xNy5zdmcnKSwgInNtb290aF90eXBlIiA9ICdnbG0nLCAiYmNyX2Nsb25vdHlwZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL21peGNyL21peGNyX3J1bnMvaXRoXzFfMl8zL21peGNyNS9jbG9ub3R5cGVzL0lHSF9jbG9ub3R5cGVzX2ZpbHRlcmVkLnR4dCcsICJjbG9uYWxfZmlndXJlX3RlbXBsYXRlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvYW5hbHlzaXMvdGVtcGxhdGVzL2Nsb25hbF9maWd1cmVfNGJ5NC5zdmcnLCAibWFzdGVyX2JyZWFrcG9pbnRfZmlsZSIgPSAnL3NoYWhsYWIvYW1jcGhlcnNvbi9wcm9qZWN0cy9pdGgzL2l0aDMvbm90ZWJvb2tzL2Jlc3Bva2UvaXRoX2JyZWFrcG9pbnRzLnRzdicsICJtbWN0bV9zYW1wbGVfc2lncGxvdCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktc2FtcGxlL3Bsb3RzL2l0aC1ieS1zYW1wbGVfc252LXN2X3NpZ3NfbXVsdGlwYW5lbC5wZGYnLCAiaWdwYXJ0aXRpb25fb3V0ZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9pZ3BhcnRpdGlvbi9ydW4yMicsICJkZWZhdWx0X3NhbXBsZXIiID0gJ0hNQycsICJtdmNsdXN0X25jbHVzdCIgPSAzLCAiaWhjX3hjcl90aWx0eXBlcyIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScsICdUX0NEOF9kZW5zaXR5JywgJ1RfQ0Q0X2RlbnNpdHknLCAnVF9DRDIwX2RlbnNpdHknLCAnVF9QbGFzbWFfZGVuc2l0eScpLCAibW1jdG1fYW5jZXN0cmFsX2Rlc2NlbmRhbnRfcmVzdWx0X2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktYW5jZXN0cnktc2FtcGxlL291dHB1dCcsICJiY3JtYXBzY2FwZV9maWxlcyIgPSBjKCcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzIuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8zLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvNC5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzcuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS85LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMTAuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8xMS5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzEyLnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMTMuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8xNC5zdmcnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvaW50ZXJtZWRpYXRlcy9ydW4yL2Jjcm1hcHNjYXBlLzE1LnN2ZycsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjIvYmNybWFwc2NhcGUvMTYuc3ZnJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9iY3JtYXBzY2FwZS8xNy5zdmcnKSwgIm5hbm9zdHJpbmdfYW5ub3RhdGlvbnMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vbmFub3N0cmluZy9wYW5jYW5jZXJfYW5ub3RhdGlvbnMudHN2JywgImNsb25lX3RyZWVfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvaXRoL2NvbXBsZXRlL3RyZWVfZGF0YS50c3YnLCAiZmlndXJlX2dhbGxlcnlfbm90ZWJvb2siID0gJ1JtZC9maWd1cmVzLlJtZCcsICJiY3JwaHlsb19jb3JyZWxhdGlvbnNfbm90ZWJvb2siID0gJ1JtZC9iY3JfcGh5bG9fY29ycmVsYXRpb25zLlJtZCcsICJ4Y3JtYXBzY2FwZV9iY3JfcGF0aWVudF9vcmRlciIgPSBjKDksIDQsIDExLCAxNCwgMTUsIDEyLCAxLCAxMCwgMiwgMywgMTYsIDE3LCAxMywgNyksICJpbW10eXBlcl9tb2RlbHMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL2ltbXR5cGVyX3Jlc3VsdHMva2xhcmVuYmVlay9hYV92ai9ncmFkYm9vc3QnLCAibmVvYW50aWdlbl9lZGl0aW5nX25vdGVib29rIiA9ICdSbWQvaW1tdW5vZWRpdGluZy5SbWQnLCAidGNyX2Nsb25vdHlwZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL21peGNyL21peGNyX3J1bnMvaXRoXzFfMl8zL21peGNyNS9jbG9ub3R5cGVzL1RSQl9jbG9ub3R5cGVzX2ZpbHRlcmVkLnR4dCcsICJpbnRlcm1lZGlhdGVfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy9pbnRlcm1lZGlhdGVzL3J1bjInLCAiaXRoX3RpbF9ub3RlYm9vayIgPSAnUm1kL2l0aF90aWxfZGVuc2l0aWVzLlJtZCcsICJpaGNfeGNyX3N0YXRzX25vdGVib29rIiA9ICdSbWQvaWhjX3hjcl9zdGF0cy5SbWQnLCAibXVsdGl2aWV3Y2x1c3RlcmluZ19ub3RlYm9vayIgPSAnUm1kL211bHRpdmlld2NsdXN0ZXJpbmcuUm1kJywgIm1vbHN1YnR5cGVfbm90ZWJvb2siID0gJ1JtZC9tb2xlY3VsYXJfc3VidHlwZXMuUm1kJywgImV4YW1wbGVfbXNhX3Bsb3QiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL2lncGFydGl0aW9uL3J1bjEzL29sZC9hbGlnbm1lbnRfcGxvdHMvbXNhL2l0aDJfMi9jbHVzdDkvaW5kZWxfcmV2ZXJzZWQuaHRtbCcsICJpbW10eXBlcl9sZW5ndGhzIiA9ICcxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCcsICJtYXBzY2FwZV9ub3RlYm9vayIgPSAnUm1kL21hcHNjYXBlLlJtZCcsICJiY3JwaHlsb19leGFtcGxlc19ub3RlYm9vayIgPSAnUm1kL2Jjcl9waHlsb19leGFtcGxlcy5SbWQnLCAiY2xvbmFsX3NhbXBsZXJzIiA9IGMoJ0hNQycsICdOVVRTJyksICJpdGhfc3RhdHNfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvaXRoL2NvbXBsZXRlL2Nsb25hbF9tZWFzdXJlcy50c3YnLCAibXV0c2lnX3RpbHR5cGVzIiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JywgJ1RfQ0Q4X2RlbnNpdHknLCAnVF9DRDRfZGVuc2l0eScsICdUX0NEMjBfZGVuc2l0eScsICdUX1BsYXNtYV9kZW5zaXR5JyksICJpdGhpX2NsaW5pY2FsX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9pdGhpL2NsaW5pY2FsX3RhYmxlXzIwMTcwODE2XzIudHh0JywgIm1hcHNjYXBlX3BhdGllbnRfb3JkZXIiID0gYygxLCAyLCAzLCA0LCA3LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcpLCAibXZjbHVzdF90aWx0eXBlcyIgPSBjKCdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScpLCAiY2NzcmlfbWFwc2NhcGVfbm90ZWJvb2siID0gJ1JtZC9tYXBzY2FwZV9jY3NyaS5SbWQnLCAid2FuZ19mYmlfc3RhdHVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9uZy4zODQ5LVMxMi50eHQnLCAibW1jdG1fZmluYWxfcGF0aWVudF9zaWdwbG90IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2l0aF9ieS1wYXRpZW50X3dpdGgtb3YvcGxvdHMvaXRoLWJ5LXBhdGllbnRfc252LXN2X3NpZ3NfbXVsdGlwYW5lbC5wZGYnLCAiYmNyX2RpdmVyc2l0eSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L3Bvc3Rwcm9jZXNzL0lHSC9wb3N0ZmlsdGVyX2RpdmVyc2l0eV9zdGF0cy9kaXZlcnNpdHkuc3RyaWN0LnJlc2FtcGxlZC50eHQnLCAiZHJpdmVyX2FuYWx5c2lzX25vdGVib29rIiA9ICdSbWQvZHJpdmVyX2FuYWx5c2lzLlJtZCcsICJ4Y3JtYXBzY2FwZV9ub3RlYm9vayIgPSAnUm1kL3hjcm1hcHNjYXBlLlJtZCcsICJpbW11bmVfdmFyaWFiaWxpdHlfbm90ZWJvb2siID0gJ1JtZC9pbW11bmVfdmFyaWFiaWxpdHkuUm1kJywgIml0aGlfbmV1dHJhbGl0eV9zYW1wbGVzIiA9IGMoJzFfT20xJywgJzFfUk92MScsICcxX1JPdjInLCAnMV9ST3YzJywgJzFfUk92NCcsICcxX1NCd2wxJywgJzEwX1JPdjEnLCAnMTBfUk92MicsICcxMF9ST3YzJywgJzEwX1JPdjQnLCAnMTFfTE92MScsICcxMV9MT3YzJywgJzExX1B2MScsICcxMV9SY3QxJywgJzExX1JjdDInLCAnMTJfTE92MScsICcxMl9MT3YyJywgJzEyX09tMScsICcxMl9PbTInLCAnMTJfUk92MScsICcxM19PbTEnLCAnMTNfUkdybjEnLCAnMTNfUk92MScsICcxM19ST3YyJywgJzEzX1JPdjMnLCAnMTRfQmxkMScsICcxNF9DRFMxJywgJzE0X0xPdjEnLCAnMTRfT20xJywgJzE0X1JPdjEnLCAnMTVfQ0RTMScsICcxNV9MT3YxJywgJzE1X1JPdjEnLCAnMTVfUk92MicsICcxNV9TQndsMScsICcxNl9MT3YxJywgJzE2X0xPdlNmYzEnLCAnMTZfT20xJywgJzE2X1B0bjEnLCAnMTZfUk92MScsICcxN19PbTEnLCAnMTdfT20yJywgJzE3X09tMycsICcxN19PdjEnLCAnMTdfT3YyJywgJzJfT20xJywgJzJfT20yJywgJzJfUk92MScsICcyX1JPdjInLCAnM19BZG54MScsICczX09tMScsICczX1JPdjEnLCAnM19ST3YyJywgJzRfTFB2U3cxJywgJzRfUk92MScsICc0X1JPdjInLCAnNF9ST3YzJywgJzRfUk92NCcsICc3X0Jybk0nLCAnN19MT3YxJywgJzdfUlB2TScsICc5X0xPdjEnLCAnOV9MT3YyJywgJzlfT20xJywgJzlfT20yJywgJzlfUk92MScpLCAic3BhdGlhbF9yZXN1bHRfZGlycyIgPSBsaXN0KCJzdHJvbWFsIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9zcGF0c2ltL2l0aDUvYWJjJywgImVwaXRoZWxpYWwiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL3NwYXRzaW0vaXRoMy9hYmMnKSwgInBoZW5vdHlwZV90aHJlc2hvbGQiID0gMC44NSwgIm1hc3Rlcl92YXJpYW50X2ZpbGUiID0gJy9zaGFobGFiL2FtY3BoZXJzb24vcHJvamVjdHMvaXRoMy9pdGgzL25vdGVib29rcy9iZXNwb2tlL2l0aF9zbnZzLnRzdicsICJuZW9lZGl0aW5nX291dGRpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbmVvZWRpdGluZy9ydW40JywgIm1tY3RtX3NhbXBsZV9yZXN1bHRfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2l0aF9ieS1zYW1wbGUvb3V0cHV0JywgImxvZ2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9jbHVzdHRtcC9wYXBlcmFuYWx5c2lzMicsICJpY2djX25vcm1hbGl6ZWRfcmVhZHNfbWF0cml4IiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvSUNHQy9PVkFVX2V4cHJfbWF0cml4LnRzdicsICJ0Y3JfZGl2ZXJzaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvVFJCL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcsICJwcmV2YWxlbmNlX3RocmVzaG9sZCIgPSAwLjAxLCAibGlicmFyeV9zaXplcyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L2xpYnJhcnlfc2l6ZXMudHN2JywgInRpbHNfZm9yX3ZhcmlhYmlsaXR5IiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICJrbm93bl9zdWJ0eXBlX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vYXJyYXkvc3VidHlwZXMva25vd25fc3VidHlwZXMudHN2JywgInByb3BvcnRpb25fc3ViY2xvbmFsX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2l0aC9jb21wbGV0ZS9vbGRfcHJvcG9ydGlvbl9zdWJjbG9uYWwudHN2JywgIm1tY3RtX292X2NvbWJpbmVkX3Jlc3VsdF9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL21tY3RtX3Jlc3VsdHMvY29tYmluZWRfb3ZfbW1jdG0vb3V0cHV0JywgInlpbnlpbl9pbWFnZV9zdW1tYXJ5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvaXRoaS95dWFuX2hlY3JfaW1hZ2VfcmVzdWx0cy5jc3YnLCAibWFzdGVyX2NvcHludW1iZXJfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2l0aGkvbWFzdGVyX2NvcHludW1iZXJfZmlsZS50c3YnLCAic3VidHlwZV9tYXJrZXJfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvZXhwcmVzc2lvbi9uYW5vc3RyaW5nL3N1YnR5cGVfbWFya2Vycy50c3YnLCAidGNnYV9leHByX21hdHJpeCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL1RDR0EvZXhwcl9tYXRyaXhfbm9ybWFsaXplX3N0YW5kYXJkaXplX25vZHVwbGljYXRlcy50c3YnLCAidmFyaWFiaWxpdHlfdHlwZSIgPSAnc3RhYmlsaXplJywgInhjcl9tYXBwaW5nX25vdGVib29rIiA9ICdSbWQveGNyX21hcHBpbmcuUm1kJywgInhjcl9xY19ub3RlYm9vayIgPSAnUm1kL3JlcGxpY2F0ZXMuUm1kJywgImJjcnBoeWxvX3RpbHR5cGVzIiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JywgJ1RfQ0Q4X2RlbnNpdHknLCAnVF9DRDRfZGVuc2l0eScsICdUX0NEMjBfZGVuc2l0eScsICdUX1BsYXNtYV9kZW5zaXR5JyksICJiY3JfY2xvbmFsX2ZpZ3VyZV90ZW1wbGF0ZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL2FuYWx5c2lzL3RlbXBsYXRlcy9jbG9uYWxfZmlndXJlXzRieTRfbm9ib3R0b20uc3ZnJywgInhjcm1hcHNjYXBlX3Rjcl9wYXRpZW50X29yZGVyIiA9IGMoOSwgMiwgMTUsIDEsIDEyLCAxNCwgMTEsIDE3LCAzLCA0LCAxMCwgMTMsIDE2LCA3KSwgImtub3duX3N1YnR5cGVzX21lcmdlZCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvZXhwcmVzc2lvbi9rbm93bl9zdWJ0eXBlc19tZXJnZWQudHN2JywgIm5hbm9zdHJpbmdfZGF0YSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbmFub3N0cmluZ19yZXN1bHRzL2l0aF9mdWxsL3FjL2xpbW1hX3F1YW50aWxlL25vcm1hbGl6ZWRfZXhwcmVzc2lvbl92b2FfbGFiZWxzX2ZpbHRlcmVkLnRzdicsICJuc2NhdHRlcnMiID0gMSwgImljZ2NfY2xpbmljYWwiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9JQ0dDL2Rvbm9yLk9WLUFVLnRzdicsICJtbWN0bV9vdl9jb21iaW5lZF9zaWdwbG90IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2NvbWJpbmVkX292X21tY3RtL3Bsb3RzL292X3Nudi1zdl9zaWdzX211bHRpcGFuZWwucGRmJywgImljZ2NfZXhwcl9tZWx0ZWQiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9JQ0dDL09WQVVfZXhwcl9tZWx0ZWQudHN2JywgInRleF9yZXNvdXJjZV9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RleF9yZXNvdXJjZXMvcnVuMicsICJpbWFnZV9hbmFseXNpc19ub3RlYm9vayIgPSAnUm1kL2ltYWdlX2FuYWx5c2lzLlJtZCcsICJtbWN0bV9zYW1wbGVfYWRfc2lncGxvdCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktYW5jZXN0cnktc2FtcGxlL3Bsb3RzL2l0aC1ieS1hbmNlc3RyYWwtc2FtcGxlX3Nudi1zdl9zaWdzX211bHRpcGFuZWwucGRmJywgIm1tY3RtX2ZpbmFsX3BhdGllbnRfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcmVzdWx0cy9tbWN0bV9yZXN1bHRzL2l0aF9ieS1wYXRpZW50X3dpdGgtb3YnLCAidGFibGVfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMicsICJpbmRleF9ub3RlYm9vayIgPSAnUm1kL2luZGV4LlJtZCcsICJuY2x1c3RzIiA9IDMsICJkcml2ZXJfbWFwIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvc3VicHJvamVjdHMvZHJpdmVycy9kYXRhL2dlbmVfbGlzdF9tYXBwZWQuYmVkJywgInRpbHNfZm9yX2NsdXN0ZXIiID0gYygnRV9DRDhfZGVuc2l0eScsICdFX0NENF9kZW5zaXR5JywgJ0VfQ0QyMF9kZW5zaXR5JywgJ0VfUGxhc21hX2RlbnNpdHknLCAnU19DRDhfZGVuc2l0eScsICdTX0NENF9kZW5zaXR5JywgJ1NfQ0QyMF9kZW5zaXR5JywgJ1NfUGxhc21hX2RlbnNpdHknKSwgInRpbF9jbGFzc2lmaWVyX25vdGVib29rIiA9ICdSbWQvdGlsX2NsYXNzaWZpZXIuUm1kJywgImloY19ydW4yIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9paGMvY2Q3OWNkMTM4Y2Q2OC92YWxpZGF0ZWRfc3RhdHNfd2VpZ2h0ZWQucmRhdGEnLCAiZXhhbXBsZV9hbm5vdGF0aW9ucyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvaWdwYXJ0aXRpb24vcnVuMTMvZmluYWxfcGFydGl0aW9ucy9pdGgyXzIvY2x1c3Q5L2Fubm90YXRpb25zX2ZsYWdnZWQudHN2JywgIm1tY3RtX3BhdGllbnRfYWRfc2lncGxvdCIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3Jlc3VsdHMvbW1jdG1fcmVzdWx0cy9pdGhfYnktcGF0aWVudC1hbmNlc3RyeS9wbG90cy9pdGgtYnktcGF0aWVudC1hbmNlc3RyeV9zbnYtc3Zfc2lnc19tdWx0aXBhbmVsLnBkZicsICJ4Y3JfZGlzdGFuY2VfbWV0aG9kIiA9ICdob3JuJywgInRjZ2FfY2xpbmljYWwiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9UQ0dBL3N5bmFwc2VfY2xpbkFsbF9kYXRhLnRzdicsICJtdXRhdGlvbl9zaWduYXR1cmVfbm90ZWJvb2siID0gJ1JtZC9tdXRhdGlvbl9zaWduYXR1cmVzLlJtZCcsICJkcml2ZXJfcGF0aWVudHMiID0gYygxLCAyLCAzLCA0LCA3LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcpLCAiYmVuY2htYXJrZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2JlbmNobWFya3MvcGFwZXJhbmFseXNpczInLCAieGNyX2Nsb25lc19ub3RlYm9vayIgPSAnUm1kL3hjcl9jbG9uZXNfYW5hbHlzaXMuUm1kJywgIlBOR19ERU5TSVRZIiA9IDMwMCwgInBhdGllbnRzX2Zvcl9jbG9uYWwiID0gYygxLCAyLCAzLCA0LCA3LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcpLCAic3BhdGlhbF9ub3RlYm9vayIgPSAnUm1kL3NwYXRpYWxfYW5hbHlzaXMuUm1kJywgImRiIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvbWV0YWRhdGEvZGIvaW1tdW5lX3Byb2plY3Quc3FsaXRlMycsICJpaGNfcnVuMSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvaWhjL2NkOGNkM2NkMjAvdmFsaWRhdGVkX3N0YXRzX3dlaWdodGVkX25ldy5yZGF0YScsICJtb2xzdWJ0eXBlX3RpbHR5cGVzIiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICJjbGFzc2lmaWVyX3R5cGUiID0gJ2tubicsICJpdGhfcHJvamVjdF9yZXN1bHRzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL2l0aDMvZGF0YS9yZXN1bHRzJywgInZfZGljdGlvbmFyeSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3N1YnByb2plY3RzL2ltbXR5cGVyL21ldGFkYXRhL2ltZ3QvSG9tb19zYXBpZW5zX1RSQlYuZmFzdGEnLCAibWFwc2NhcGVfdGVtcGxhdGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9hbmFseXNpcy90ZW1wbGF0ZXMvY2xvbmFsX2ZpZ3VyZV80Ynk0X25vYm90dG9tX3RpbGNsdXN0ZXIuc3ZnJywgImNsb25lX2JyYW5jaF9sZW5ndGhfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL2RhdGEvaXRoL2NvbXBsZXRlL2JyYW5jaF9kYXRhLnRzdicsICJvdjEzM19mYmlfc3RhdHVzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL2RhdGEvT1YxMzMvb3YxMzNfaGdzY19mYmlfY2xhc3MudHN2JywgInNpdGVfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL2FuYWx5c2lzL1JtZC9fc2l0ZS55bWwnLCAiaWNnY19tb2xlY3VsYXJfc3VidHlwZXMiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9JQ0dDL2ljZ2NfcHJpbWFyeV90dW1vdXJfc3VidHlwZXMudHN2JywgIm5ldXRyYWxfb3B0aW9ucyIgPSBjKCdyZXN0cmljdCcsICdmcmVlJyksICJub3RlYm9va19kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3dlYicpLAogICAgcnVsZSA9ICdmaWd1cmVfZ2FsbGVyeScKKQojIyMjIyMjIyBPcmlnaW5hbCBzY3JpcHQgIyMjIyMjIyMjCgogICAgICAgICAgICAgICAgICAgICAgICBgYGAKCgpgYGB7ciBnbG9iYWxfY2h1bmtfb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB0aWR5PVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UpCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGl0aGkudXRpbHMpCmxvYWRfYmFzZV9saWJzKCkKCiMjIGdyaWQgZ3JhcGhpY3MKbGlicmFyeShncmlkKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShncmlkR3JhcGhpY3MpCmxpYnJhcnkoZXh0cmFmb250KQpsaWJyYXJ5KGdyaWRCYXNlKQpsaWJyYXJ5KGFwZSkKbGlicmFyeShwaHlsb2Jhc2UpCmxpYnJhcnkocGh5dG9vbHMpCmxpYnJhcnkoT3V0YnJlYWtUb29scykKbGlicmFyeShjb2xvcnNwYWNlKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShpZ3JhcGgpCgpsaWJyYXJ5KGl0aGkubWV0YSkKbGlicmFyeShpdGhpLnhjcikKbGlicmFyeShpdGhpLmNsb25lcykKbGlicmFyeShpdGhpLmV4cHIpCmxpYnJhcnkoaXRoaS5maWd1cmVzKQpsaWJyYXJ5KGl0aGkuc2VxKQpgYGAKCiMjIENvbG91ciBwYWxldHRlcwoKYGBge3J9CnBhbF9wYXRpZW50IDwtIHNlbGVjdF9wYWxldHRlKCJwYXRpZW50IikKYGBgCgojIyBQYXJhbWV0ZXJzCgpgYGB7cn0KZGJfcGF0aCA8LSBzbmFrZW1ha2VAcGFyYW1zJGRiCgppaGNfdGFibGVfcGF0aCA8LSBzbmFrZW1ha2VAaW5wdXQkaWhjX3RhYmxlCnhjcl90YWJsZV9wYXRoIDwtIHNuYWtlbWFrZUBpbnB1dCR4Y3JfdGFibGUKbmFub3N0cmluZ19kYXRhX3BhdGggPC0gc25ha2VtYWtlQGlucHV0JG5hbm9zdHJpbmdfZGF0YQpuYW5vc3RyaW5nX2Fubm90YXRpb25zX3BhdGggPC0gc25ha2VtYWtlQGlucHV0JG5hbm9zdHJpbmdfYW5ub3RhdGlvbnMKbWFzdGVyX3ZhcmlhbnRfZmlsZSA8LSBzbmFrZW1ha2VAaW5wdXQkbWFzdGVyX3ZhcmlhbnRfZmlsZQp0cmJfYW5ub3RhdGVkX3BhdGggPC0gc25ha2VtYWtlQGlucHV0JHRyYl9hbm5vdGF0ZWQKCiNpZ3BhcnRpdGlvbl9vdXRkaXIgPC0gc25ha2VtYWtlQGlucHV0JGlncGFydGl0aW9uX291dGRpcgpiY3JwaHlsb19maWd1cmUgPC0gc25ha2VtYWtlQGlucHV0JGJjcnBoeWxvX3BuZwptdXRzaWdfZmlndXJlIDwtIHNuYWtlbWFrZUBpbnB1dCRtdXRzaWdfcG5nCmltbXVuZV9jYW5jZXJfZmlndXJlIDwtIHNuYWtlbWFrZUBpbnB1dCRpbW11bmVfY2FuY2VyX3BuZwppbW11bmVfb3ZlcnZpZXdfZmlndXJlIDwtIHNuYWtlbWFrZUBpbnB1dCRpbW11bmVfb3ZlcnZpZXdfcG5nCm1lcmdlZF9maWd1cmVzX3BhdGggPC0gc25ha2VtYWtlQGlucHV0JG1lcmdlZF9maWd1cmVzCmBgYAoKIyMgTWV0YWRhdGEKCmBgYHtyfQpkYiA8LSBzcmNfc3FsaXRlKGRiX3BhdGgsIGNyZWF0ZT1GQUxTRSkKCnNhbXBsZXMgPC0gY29sbGVjdCh0YmwoZGIsICJzYW1wbGVzIikpCmBgYAoKIyMgRGF0YQoKYGBge3J9CmloY190YWJsZSA8LSBmcmVhZChpaGNfdGFibGVfcGF0aCkKeGNyX3RhYmxlIDwtIHJlYWRfY2xvbm90eXBlcyh4Y3JfdGFibGVfcGF0aCwgZHVwbGljYXRlcyA9IEZBTFNFLCBkYl9wYXRoKQpleHBycyA8LSBmcmVhZChuYW5vc3RyaW5nX2RhdGFfcGF0aCkKbGFiZWxzIDwtIGZyZWFkKG5hbm9zdHJpbmdfYW5ub3RhdGlvbnNfcGF0aCkKdHJiX2Fubm90YXRlZCA8LSBmcmVhZCh0cmJfYW5ub3RhdGVkX3BhdGgpCm1hc3Rlcl92YXJpYW50X3RhYmxlIDwtIHJlYWRfdmFyaWFudF9maWxlKG1hc3Rlcl92YXJpYW50X2ZpbGUsIGRiX3BhdGgpCmBgYAoKIyMgRmlndXJlcwoKV2lsbCBiZSB1cGRhdGVkIGFzIEkgd29yayBvbiBtb3JlIG9mIHRoZXNlLiAqKk5vdGUqKjogRm9udHMgd2lsbCBhbHdheXMgYmUgdWdseSBvbiBoZXJlIGJlY2F1c2UgZ2VuZXNpcyBkb2Vzbid0IGhhdmUgQU5ZIHRydWV0eXBlIGZvbnRzIDooCgojIyMgTWVyZ2VkCgpbTGluayB0byBtZXJnZWQgZmlndXJlc10ocmVzb3VyY2VzL2ZpZ3VyZXNfbWVyZ2VkLnBkZikKCiMjIyBGaWd1cmUgMQoKTGFuZHNjYXBlIGZpZ3VyZSBzaG93aW5nIHNhbXBsZSBzdGF0aXN0aWNzLiBCYXNlIFIgZ3JhcGhpY3MgYXJlIHZlcnkgZmFzdCEgCgpgYGB7ciwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9Nn0KY29uZGVuc2VkX2lkcyA8LSB1bmlxdWUoc3Vic2V0KHNhbXBsZXMsIHByb2plY3RfY29kZSA9PSAiSVRIIiAmICFzb3VyY2UgJWluJSBjKCJibG9vZCIsICJub3JtYWwiKSkkY29uZGVuc2VkX2lkKQpjb25kZW5zZWRfaWRzIDwtIGFzLmNoYXJhY3Rlcihzb3J0KGZhY3Rvcl9pZChjb25kZW5zZWRfaWRzLCB0eXBlID0gImNvbmRlbnNlZF9pZCIsIGRiX3BhdGgpKSkKCnBsb3RfbGFuZHNjYXBlX2ZpZ3VyZShkYl9wYXRoLCBjb25kZW5zZWRfaWRzID0gY29uZGVuc2VkX2lkcywKICAgICAgICAgICAgICAgICAgICAgIGloY190YWJsZSA9IGloY190YWJsZSwgeGNyX3RhYmxlID0geGNyX3RhYmxlLAogICAgICAgICAgICAgICAgICAgICAgdmFyaWFudF90YWJsZSA9IG1hc3Rlcl92YXJpYW50X3RhYmxlLCBzZXBhcmF0ZV9vcHQgPSAiemVicmEiKQoKcGxvdF9sYW5kc2NhcGVfZmlndXJlKGRiX3BhdGgsIGNvbmRlbnNlZF9pZHMgPSBjb25kZW5zZWRfaWRzLAogICAgICAgICAgICAgICAgICAgICAgaWhjX3RhYmxlID0gaWhjX3RhYmxlLCB4Y3JfdGFibGUgPSB4Y3JfdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50X3RhYmxlID0gbWFzdGVyX3ZhcmlhbnRfdGFibGUsIHNlcGFyYXRlX29wdCA9ICJsaW5lIikKYGBgCgpQbG90dGVkIHcvIHplYnJhIGFuZCBsaW5lIHNlcGFyYXRvcnMgaW4gY2FzZSB5b3UgbGlrZSBvbmUgYmV0dGVyLiBBbHNvIGFkZGVkIHBhdGllbnQgbGFiZWxzLiAKCiMjIyBGaWd1cmUgMgoKSW1tdW5lIG92ZXJ2aWV3IGZpZ3VyZS4gSWYgeW91IGhhdmUgYW55IHN1Z2dlc3Rpb25zIG9uIHdoYXQgdG8gaW5jbHVkZS9yZW1vdmUgcGxlYXNlIGxldCBtZSBrbm93IQoKVG9wIHRvIGJvdHRvbToKCiogUGF0aWVudCBjb2xvdXIgbGFiZWwgbGVnZW5kCiogVENSIChsZWZ0KSBhbmQgQkNSIChyaWdodCkgY2xvbm90eXBlIHNoYXJpbmcgaWxsdXN0cmF0ZWQgYnkgQ2lyY29zIHBsb3RzCiogTWVhbiBleHByZXNzaW9uIG9mIGNlcnRhaW4gcGF0aHdheXMgYXMgaW5kaWNhdGVkIGJ5IE5hbm9zdHJpbmcgYW5ub3RhdGlvbnMKKiBJbnRyYXBhdGllbnQgc2ltaWxhcml0eSBpbiBUQ1IgcmVwZXJ0b2lyZQoqIEhpZ2ggY29ycmVsYXRpb24gYmV0d2VlbiBUQ1IgcmVwZXJ0b2lyZSBzaW1pbGFyaXR5IGFuZCBDRDgrIFRJTCBkZW5zaXR5IChsZWZ0KSwgbG93ZXIgY29ycmVsYXRpb24gd2l0aCBDRDQrIFRJTCBkZW5zaXR5IChtaWRkbGUpIGFuZCBDRDgrJ3MgYXJlIG1vcmUgYnJvYWRseSBkaXN0cmlidXRlZCBhY3Jvc3MgdHVtb3VyIHNpdGVzIHRoYW4gQ0Q0KydzIChyaWdodCkKCgohW10oYHIgaW1tdW5lX292ZXJ2aWV3X2ZpZ3VyZWApCgoKIyMjIEZpZ3VyZSAzCgpCLWNlbGwgcGh5bG9nZW5ldGljcy4gCgpTdWJmaWd1cmVzOgoKKiBFdmlkZW5jZSBvZiBlaXRoZXIgQi1jZWxsIGV4Y2hhbmdlIG9yIHBhcmFsbGVsIGFmZmluaXR5IG1hdHVyYXRpb24gYWNyb3NzIHR1bW91ciBzaXRlcwoqIEV2aWRlbmNlIG9mIGxpbmVhZ2UgZGl2ZXJnZW5jZSBieSB0dW1vdXIgc2l0ZQoqIEV2aWRlbmNlIG9mIHBoeWxvZ2VuZXRpYyBzaWduYWwgaW4gcmVhZGNvdW50cyAoc2VxdWVuY2UtZGVwZW5kZW50IGV4cGFuc2lvbikKKiBDb3JyZWxhdGlvbnMgYmV0d2VlbiBHU0kvcGh5bG9zaWduYWwgYW5kIENEMjArIFRJTCBkZW5zaXRpZXMKCiFbXShgciBiY3JwaHlsb19maWd1cmVgKQoKYGBge3J9CiNwbG90X2JjcnBoeWxvX2ZpZ3VyZShyZXN1bHRkaXIgPSBpZ3BhcnRpdGlvbl9vdXRkaXIsIGloY190YWJsZSwgcGFydHMgPSAKIyAgICAgICAgICAgICAgICAgICAgICAgbGlzdChBPWxpc3QocGF0aWVudD0yLGNsdXN0PTcpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIEI9bGlzdChwYXRpZW50PTE4LCBjbHVzdD0xMCksCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQz1saXN0KHBhdGllbnQ9OSwgY2x1c3Q9MTQpKSkKYGBgCgoKCiMjIyBGaWd1cmUgNAoKTXV0YXRpb25hbCBzaWduYXR1cmVzIGFuZCBpbW11bmUgYWN0aXZpdHkuIAoKU3ViZmlndXJlczoKCiogU05WIHNpZ25hdHVyZXMKKiBTViBzaWduYXR1cmVzCiogQ2x1c3RlcmluZyBieSBtdXRhdGlvbiBzaWduYXR1cmUgcHJvcG9ydGlvbnMKKiBFeHByZXNzaW9uLWRlcml2ZWQgaW1tdW5lIGNvdmFyaWF0ZXMgb3ZlcmxhaWQgb24gbXV0YXRpb24gc2lnbmF0dXJlLWJhc2VkIGNsdXN0ZXJzCiogVENHQSBzdXJ2aXZhbCBhbmFseXNpcwoKIVtdKGByIG11dHNpZ19maWd1cmVgKQoKCiMjIyBGaWd1cmUgNQoKSW1tdW5lLWNhbmNlciBpbnRlcmFjdGlvbi4gCgohW10oYHIgaW1tdW5lX2NhbmNlcl9maWd1cmVgKQoKIyMjIEZpZ3VyZSA2CgoKCg==