3. Escape
# # 1: Molecular Signture Database
# GS.hallmark <- getGeneSets(
# species = "Homo sapiens",
# library = c("H","C1", "C2", "C3", "C4" ,"C5", "C6","C7","C8"))
#
#
#
# #2: Built-In gene sets
# data("escape.gene.sets", package="escape")
# gene.sets <- escape.gene.sets
#
# #3: Define personal gene sets
# gene.sets <- list(Bcells = c("MS4A1","CD79B","CD79A","IGH1","IGH2"),
# Myeloid = c("SPI1","FCER1G","CSF1R"),
# Tcells = c("CD3E", "CD3D", "CD3G", "CD7","CD8A"))
# # Enrichment
# enrichment.scores <- escape.matrix(SS_escape,
# gene.sets = GS.hallmark,
# groups = 5000,
# min.size = 5)
# ggplot(data = as.data.frame(enrichment.scores),
# mapping = aes(x = `HALLMARK-DNA-REPAIR`, `HALLMARK-G2M-CHECKPOINT`)) +
# geom_point() +
# theme_classic() +
# theme()
# Alternatively, we can use runEscape() to calculate the enrichment score and directly attach the output to a single-cell object.
# SS_escape <- runEscape(SS_escape,
# method = "ssGSEA",
# gene.sets = GS.hallmark,
# groups = 5000,
# min.size = 0,
# new.assay.name = "escape.ssGSEA")
#
# # if working with a Seurat object
# #SS_escape <- Seurat::AddMetaData(SS_escape , ES.seurat)
#
#
# #Define color palette
# colorblind_vector <- hcl.colors(n=7, palette = "inferno", fixup = TRUE)
#
# FeaturePlot(SS_escape, "HALLMARK-APOPTOSIS") +
# scale_color_gradientn(colors = colorblind_vector) +
# theme(plot.title = element_blank())
#
# # perform Normalization
# SS_escape <- performNormalization(SS_escape,
# assay = "escape.ssGSEA",
# gene.sets = GS.hallmark)
#
# #scaling
# SS_escape <- performNormalization(SS_escape,
# assay = "escape.ssGSEA",
# gene.sets = GS.hallmark,
# scale.factor = SS_escape$nFeature_RNA)
4. Escape Visualization
# Visualizations
#gene.set.use set to first 12 gene sets. Alternatively, we can plot all gene sets using gene.set.use = “all”.
pathway_set <- c(
"HALLMARK_TNFA_SIGNALING_VIA_NFKB",
"HALLMARK_E2F_TARGETS",
"HALLMARK_G2M_CHECKPOINT",
"HALLMARK_ALLOGRAFT_REJECTION",
"HALLMARK_IL2_STAT5_SIGNALING",
"HALLMARK_INFLAMMATORY_RESPONSE",
"HALLMARK_MYC_TARGETS_V2",
"HALLMARK_CHOLESTEROL_HOMEOSTASIS",
"HALLMARK_APOPTOSIS",
"HALLMARK_IL6_JAK_STAT3_SIGNALING",
"HALLMARK_MTORC1_SIGNALING",
"HALLMARK_INTERFERON_GAMMA_RESPONSE"
)
pathway_set <- gsub("_", "-", pathway_set)
heatmapEnrichment(
SS_escape,
group.by = "seurat_clusters",
gene.set.use = pathway_set,
assay = "escape.ssGSEA",
palette = "Spectral",
scale = TRUE
)

heatmapEnrichment(
SS_escape,
group.by = "seurat_clusters",
gene.set.use = pathway_set,
assay = "escape.ssGSEA",
palette = "Spectral",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)

heatmapEnrichment(
SS_escape,
group.by = "orig.ident",
gene.set.use = pathway_set,
assay = "escape.ssGSEA",
palette = "Spectral",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)

heatmapEnrichment(
SS_escape,
group.by = "Patient_origin",
gene.set.use = pathway_set,
assay = "escape.ssGSEA",
palette = "Spectral",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)

KEGG_list <- c(
"KEGG-GRAFT-VERSUS-HOST-DISEASE",
"KEGG-TYPE-I-DIABETES-MELLITUS",
"KEGG-ALLOGRAFT-REJECTION",
"KEGG-PRIMARY-IMMUNODEFICIENCY",
"KEGG-DNA-REPLICATION",
"KEGG-CELL-CYCLE",
"KEGG-CELL-ADHESION-MOLECULES-CAMS",
"KEGG-HEMATOPOIETIC-CELL-LINEAGE",
"KEGG-CYTOKINE-CYTOKINE-RECEPTOR-INTERACTION",
"KEGG-P53-SIGNALING-PATHWAY",
"KEGG-NATURAL-KILLER-CELL-MEDIATED-CYTOTOXICITY",
"KEGG-ANTIGEN-PROCESSING-AND-PRESENTATION",
"KEGG-T-CELL-RECEPTOR-SIGNALING-PATHWAY",
"KEGG-SYSTEMIC-LUPUS-ERYTHEMATOSUS"
)
heatmapEnrichment(
SS_escape,
group.by = "Patient_origin",
gene.set.use = KEGG_list,
assay = "escape.ssGSEA_C2",
palette = "Spectral",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)

heatmapEnrichment(
SS_escape,
group.by = "cell_line",
gene.set.use = KEGG_list,
assay = "escape.ssGSEA_C2",
palette = "Spectral",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)
gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 16298357 870.5 27909668 1490.6 27909668 1490.6
Vcells 1579266846 12048.9 2727668158 20810.5 2212444142 16879.7

heatmapEnrichment(
SS_escape,
group.by = "seurat_clusters",
gene.set.use = KEGG_list,
assay = "escape.ssGSEA_C2",
palette = "Spectral",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)

heatmapEnrichment(
SS_escape,
group.by = "Patient_origin",
gene.set.use = "all",
assay = "escape2.ssGSEA",
palette = "Spectral",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)

heatmapEnrichment(
SS_escape,
group.by = "Patient_origin",
gene.set.use = "all",
assay = "escape2.ssGSEA",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)

heatmapEnrichment(
SS_escape,
group.by = "seurat_clusters",
gene.set.use = "all",
assay = "escape2.ssGSEA",
palette = "Spectral",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)

heatmapEnrichment(
SS_escape,
group.by = "cell_line",
gene.set.use = "all",
assay = "escape2.ssGSEA",
palette = "Spectral",
scale = TRUE,
cluster.rows = TRUE,
cluster.columns = TRUE
)

NA
NA
## geyserEnrichment
geyserEnrichment(SS_escape,
assay = "escape.ssGSEA",
gene.set = "HALLMARK-INTERFERON-GAMMA-RESPONSE")

geyserEnrichment(SS_escape,
assay = "escape.ssGSEA",
gene.set = "HALLMARK-INTERFERON-GAMMA-RESPONSE",
order.by = "mean")

NA
NA
NA
# ridgeEnrichment
ridgeEnrichment(
SS_escape,
assay = "escape.ssGSEA",
gene.set = "HALLMARK-IL2-STAT5-SIGNALING"
)

ridgeEnrichment(
SS_escape,
assay = "escape.ssGSEA",
gene.set = "HALLMARK-IL2-STAT5-SIGNALING",
add.rug = TRUE,
scale = TRUE
)

# scatterEnrichment
scatterEnrichment(
SS_escape,
assay = "escape.ssGSEA",
x.axis = "HALLMARK-INTERFERON-GAMMA-RESPONSE",
y.axis = "HALLMARK-IL6-JAK-STAT3-SIGNALING"
)

scatterEnrichment(
SS_escape,
assay = "escape.ssGSEA",
x.axis = "HALLMARK-INTERFERON-GAMMA-RESPONSE",
y.axis = "HALLMARK-IL6-JAK-STAT3-SIGNALING",
style = "hex"
)

LS0tCnRpdGxlOiAiRW5yaWNobWVudF9lc2NhcGUtVmlzdWFsaXphdGlvbiBOb3RlYm9vayIKYXV0aG9yOiBOYXNpciBNYWhtb29kIEFiYmFzaQpkYXRlOiAiMjAyNC0wNC0yMiIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKICAgIHRoZW1lOiBkYXJrbHkKICAgCi0tLQoKCiMgMS4gbG9hZCBsaWJyYXJpZXMKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgc2V1cmF0IGFuZCB2aXN1YWxpemF0aW9uCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KFNldXJhdE9iamVjdCkKbGlicmFyeShTZXVyYXRPYmplY3QpCmxpYnJhcnkoU2V1cmF0RGF0YSkKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoQXppbXV0aCkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkodGlueXRleCkKIyBERSBsaWJyYXJpZXMKbGlicmFyeShncmlkKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkocHJlc3RvKQojZW5yaWNobWVudApsaWJyYXJ5KGVzY2FwZSkKbGlicmFyeShCaW9jU3R5bGUpCmxpYnJhcnkocGFja2FnZSA9ICJkaXR0b1NlcSIpCmBgYAoKCiMgMi4gTG9hZCBTZXVyYXQgT2JqZWN0IApgYGB7ciBsb2FkX3NldXJhdCwgaW5jbHVkZT0gVFJVRX0KCiNMb2FkIFNldXJhdCBPYmplY3QgbWVyZ2VkIGZyb20gY2VsbCBsaW5lcyBhbmQgYSBjb250cm9sKFBCTUMpIGFmdGVyIGZpbHRyYXRpb24KU1NfQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIGxvYWQoIi4uL1NTX0VzY2FwZV9maW5hbC1jMi5Sb2JqIikKCgpgYGAKCiMgMy4gRXNjYXBlIApgYGB7ciBlc2NhcGUsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTZ9CgojICMgMTogTW9sZWN1bGFyIFNpZ250dXJlIERhdGFiYXNlCiMgR1MuaGFsbG1hcmsgPC0gZ2V0R2VuZVNldHMoCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAiSG9tbyBzYXBpZW5zIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSA9IGMoIkgiLCJDMSIsICJDMiIsICJDMyIsICJDNCIgLCJDNSIsICJDNiIsIkM3IiwiQzgiKSkKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIyAgICAgICAgICAgICAgICAgICAgICAgICAKIyAKIyAjMjogQnVpbHQtSW4gZ2VuZSBzZXRzCiMgIGRhdGEoImVzY2FwZS5nZW5lLnNldHMiLCBwYWNrYWdlPSJlc2NhcGUiKQojICBnZW5lLnNldHMgPC0gZXNjYXBlLmdlbmUuc2V0cwojIAojICMzOiBEZWZpbmUgcGVyc29uYWwgZ2VuZSBzZXRzCiMgZ2VuZS5zZXRzIDwtIGxpc3QoQmNlbGxzID0gYygiTVM0QTEiLCJDRDc5QiIsIkNENzlBIiwiSUdIMSIsIklHSDIiKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICBNeWVsb2lkID0gYygiU1BJMSIsIkZDRVIxRyIsIkNTRjFSIiksCiMgICAgICAgICAgICAgICAgICAgICAgICAgVGNlbGxzID0gYygiQ0QzRSIsICJDRDNEIiwgIkNEM0ciLCAiQ0Q3IiwiQ0Q4QSIpKQoKYGBgCgoKCmBgYHtyIEUyLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQojICMgRW5yaWNobWVudAojIGVucmljaG1lbnQuc2NvcmVzIDwtIGVzY2FwZS5tYXRyaXgoU1NfZXNjYXBlLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUuc2V0cyA9IEdTLmhhbGxtYXJrLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcyA9IDUwMDAsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLnNpemUgPSA1KQoKIyBnZ3Bsb3QoZGF0YSA9IGFzLmRhdGEuZnJhbWUoZW5yaWNobWVudC5zY29yZXMpLCAKIyAgICAgICBtYXBwaW5nID0gYWVzKHggPSBgSEFMTE1BUkstRE5BLVJFUEFJUmAsIGBIQUxMTUFSSy1HMk0tQ0hFQ0tQT0lOVGApKSArIAojICAgICAgIGdlb21fcG9pbnQoKSArIAojICAgICAgIHRoZW1lX2NsYXNzaWMoKSArIAojICAgICAgIHRoZW1lKCkKYGBgCgpgYGB7ciBFMywgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9Nn0KIyBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gdXNlIHJ1bkVzY2FwZSgpIHRvIGNhbGN1bGF0ZSB0aGUgZW5yaWNobWVudCBzY29yZSBhbmQgZGlyZWN0bHkgYXR0YWNoIHRoZSBvdXRwdXQgdG8gYSBzaW5nbGUtY2VsbCBvYmplY3QuCiMgU1NfZXNjYXBlIDwtIHJ1bkVzY2FwZShTU19lc2NhcGUsIAojICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzc0dTRUEiLAojICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmUuc2V0cyA9IEdTLmhhbGxtYXJrLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMgPSA1MDAwLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICBtaW4uc2l6ZSA9IDAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LmFzc2F5Lm5hbWUgPSAiZXNjYXBlLnNzR1NFQSIpCiMgCiMgIyBpZiB3b3JraW5nIHdpdGggYSBTZXVyYXQgb2JqZWN0CiMgI1NTX2VzY2FwZSAgPC0gU2V1cmF0OjpBZGRNZXRhRGF0YShTU19lc2NhcGUgLCBFUy5zZXVyYXQpCiMgCiMgCiMgI0RlZmluZSBjb2xvciBwYWxldHRlIAojIGNvbG9yYmxpbmRfdmVjdG9yIDwtIGhjbC5jb2xvcnMobj03LCBwYWxldHRlID0gImluZmVybm8iLCBmaXh1cCA9IFRSVUUpCiMgCiMgRmVhdHVyZVBsb3QoU1NfZXNjYXBlLCAiSEFMTE1BUkstQVBPUFRPU0lTIikgKyAKIyAgIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvcnMgPSBjb2xvcmJsaW5kX3ZlY3RvcikgKyAKIyAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCiMgCiMgIyBwZXJmb3JtIE5vcm1hbGl6YXRpb24KIyBTU19lc2NhcGUgPC0gcGVyZm9ybU5vcm1hbGl6YXRpb24oU1NfZXNjYXBlLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiZXNjYXBlLnNzR1NFQSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lLnNldHMgPSBHUy5oYWxsbWFyaykKIyAKIyAjc2NhbGluZyAKIyBTU19lc2NhcGUgPC0gcGVyZm9ybU5vcm1hbGl6YXRpb24oU1NfZXNjYXBlLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiZXNjYXBlLnNzR1NFQSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lLnNldHMgPSBHUy5oYWxsbWFyaywgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLmZhY3RvciA9IFNTX2VzY2FwZSRuRmVhdHVyZV9STkEpCmBgYAoKIyA0LiBFc2NhcGUgVmlzdWFsaXphdGlvbgpgYGB7ciBWaXN1YWxpemF0aW9uLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQojIFZpc3VhbGl6YXRpb25zCiNnZW5lLnNldC51c2Ugc2V0IHRvIGZpcnN0IDEyIGdlbmUgc2V0cy4gQWx0ZXJuYXRpdmVseSwgd2UgY2FuIHBsb3QgYWxsIGdlbmUgc2V0cyB1c2luZyBnZW5lLnNldC51c2UgPSDigJxhbGzigJ0uCgpwYXRod2F5X3NldCA8LSBjKAogICAgIkhBTExNQVJLX1RORkFfU0lHTkFMSU5HX1ZJQV9ORktCIiwKICAgICJIQUxMTUFSS19FMkZfVEFSR0VUUyIsCiAgICAiSEFMTE1BUktfRzJNX0NIRUNLUE9JTlQiLAogICAgIkhBTExNQVJLX0FMTE9HUkFGVF9SRUpFQ1RJT04iLAogICAgIkhBTExNQVJLX0lMMl9TVEFUNV9TSUdOQUxJTkciLAogICAgIkhBTExNQVJLX0lORkxBTU1BVE9SWV9SRVNQT05TRSIsCiAgICAiSEFMTE1BUktfTVlDX1RBUkdFVFNfVjIiLAogICAgIkhBTExNQVJLX0NIT0xFU1RFUk9MX0hPTUVPU1RBU0lTIiwKICAgICJIQUxMTUFSS19BUE9QVE9TSVMiLAogICAgIkhBTExNQVJLX0lMNl9KQUtfU1RBVDNfU0lHTkFMSU5HIiwKICAgICJIQUxMTUFSS19NVE9SQzFfU0lHTkFMSU5HIiwKICAgICJIQUxMTUFSS19JTlRFUkZFUk9OX0dBTU1BX1JFU1BPTlNFIgopCgpwYXRod2F5X3NldCA8LSBnc3ViKCJfIiwgIi0iLCBwYXRod2F5X3NldCkKCgoKaGVhdG1hcEVucmljaG1lbnQoCiAgU1NfZXNjYXBlLAogIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIsCiAgZ2VuZS5zZXQudXNlID0gcGF0aHdheV9zZXQsCiAgYXNzYXkgPSAiZXNjYXBlLnNzR1NFQSIsCiAgcGFsZXR0ZSA9ICJTcGVjdHJhbCIsCiAgc2NhbGUgPSBUUlVFCikKCmhlYXRtYXBFbnJpY2htZW50KAogIFNTX2VzY2FwZSwKICBncm91cC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiLAogIGdlbmUuc2V0LnVzZSA9IHBhdGh3YXlfc2V0LAogIGFzc2F5ID0gImVzY2FwZS5zc0dTRUEiLAogIHBhbGV0dGUgPSAiU3BlY3RyYWwiLAogIHNjYWxlID0gVFJVRSwKICBjbHVzdGVyLnJvd3MgPSBUUlVFLAogIGNsdXN0ZXIuY29sdW1ucyA9IFRSVUUKKQoKCgpoZWF0bWFwRW5yaWNobWVudCgKICBTU19lc2NhcGUsCiAgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsCiAgZ2VuZS5zZXQudXNlID0gcGF0aHdheV9zZXQsCiAgYXNzYXkgPSAiZXNjYXBlLnNzR1NFQSIsCiAgcGFsZXR0ZSA9ICJTcGVjdHJhbCIsCiAgc2NhbGUgPSBUUlVFLAogIGNsdXN0ZXIucm93cyA9IFRSVUUsCiAgY2x1c3Rlci5jb2x1bW5zID0gVFJVRQopCgoKCmhlYXRtYXBFbnJpY2htZW50KAogIFNTX2VzY2FwZSwKICBncm91cC5ieSA9ICJQYXRpZW50X29yaWdpbiIsCiAgZ2VuZS5zZXQudXNlID0gcGF0aHdheV9zZXQsCiAgYXNzYXkgPSAiZXNjYXBlLnNzR1NFQSIsCiAgcGFsZXR0ZSA9ICJTcGVjdHJhbCIsCiAgc2NhbGUgPSBUUlVFLAogIGNsdXN0ZXIucm93cyA9IFRSVUUsCiAgY2x1c3Rlci5jb2x1bW5zID0gVFJVRQopCgpLRUdHX2xpc3QgPC0gYygKICAgICJLRUdHLUdSQUZULVZFUlNVUy1IT1NULURJU0VBU0UiLAogICAgIktFR0ctVFlQRS1JLURJQUJFVEVTLU1FTExJVFVTIiwKICAgICJLRUdHLUFMTE9HUkFGVC1SRUpFQ1RJT04iLAogICAgIktFR0ctUFJJTUFSWS1JTU1VTk9ERUZJQ0lFTkNZIiwKICAgICJLRUdHLUROQS1SRVBMSUNBVElPTiIsCiAgICAiS0VHRy1DRUxMLUNZQ0xFIiwKICAgICJLRUdHLUNFTEwtQURIRVNJT04tTU9MRUNVTEVTLUNBTVMiLAogICAgIktFR0ctSEVNQVRPUE9JRVRJQy1DRUxMLUxJTkVBR0UiLAogICAgIktFR0ctQ1lUT0tJTkUtQ1lUT0tJTkUtUkVDRVBUT1ItSU5URVJBQ1RJT04iLAogICAgIktFR0ctUDUzLVNJR05BTElORy1QQVRIV0FZIiwKICAgICJLRUdHLU5BVFVSQUwtS0lMTEVSLUNFTEwtTUVESUFURUQtQ1lUT1RPWElDSVRZIiwKICAgICJLRUdHLUFOVElHRU4tUFJPQ0VTU0lORy1BTkQtUFJFU0VOVEFUSU9OIiwKICAgICJLRUdHLVQtQ0VMTC1SRUNFUFRPUi1TSUdOQUxJTkctUEFUSFdBWSIsCiAgICAiS0VHRy1TWVNURU1JQy1MVVBVUy1FUllUSEVNQVRPU1VTIgopCgoKCmhlYXRtYXBFbnJpY2htZW50KAogIFNTX2VzY2FwZSwKICBncm91cC5ieSA9ICJQYXRpZW50X29yaWdpbiIsCiAgZ2VuZS5zZXQudXNlID0gS0VHR19saXN0LAogIGFzc2F5ID0gImVzY2FwZS5zc0dTRUFfQzIiLAogIHBhbGV0dGUgPSAiU3BlY3RyYWwiLAogIHNjYWxlID0gVFJVRSwKICBjbHVzdGVyLnJvd3MgPSBUUlVFLAogIGNsdXN0ZXIuY29sdW1ucyA9IFRSVUUKKQoKaGVhdG1hcEVucmljaG1lbnQoCiAgU1NfZXNjYXBlLAogIGdyb3VwLmJ5ID0gImNlbGxfbGluZSIsCiAgZ2VuZS5zZXQudXNlID0gS0VHR19saXN0LAogIGFzc2F5ID0gImVzY2FwZS5zc0dTRUFfQzIiLAogIHBhbGV0dGUgPSAiU3BlY3RyYWwiLAogIHNjYWxlID0gVFJVRSwKICBjbHVzdGVyLnJvd3MgPSBUUlVFLAogIGNsdXN0ZXIuY29sdW1ucyA9IFRSVUUKKQoKaGVhdG1hcEVucmljaG1lbnQoCiAgU1NfZXNjYXBlLAogIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIsCiAgZ2VuZS5zZXQudXNlID0gS0VHR19saXN0LAogIGFzc2F5ID0gImVzY2FwZS5zc0dTRUFfQzIiLAogIHBhbGV0dGUgPSAiU3BlY3RyYWwiLAogIHNjYWxlID0gVFJVRSwKICBjbHVzdGVyLnJvd3MgPSBUUlVFLAogIGNsdXN0ZXIuY29sdW1ucyA9IFRSVUUKKQoKaGVhdG1hcEVucmljaG1lbnQoCiAgU1NfZXNjYXBlLAogIGdyb3VwLmJ5ID0gIlBhdGllbnRfb3JpZ2luIiwKICBnZW5lLnNldC51c2UgPSAiYWxsIiwKICBhc3NheSA9ICJlc2NhcGUyLnNzR1NFQSIsCiAgcGFsZXR0ZSA9ICJTcGVjdHJhbCIsCiAgc2NhbGUgPSBUUlVFLAogIGNsdXN0ZXIucm93cyA9IFRSVUUsCiAgY2x1c3Rlci5jb2x1bW5zID0gVFJVRQopCgpoZWF0bWFwRW5yaWNobWVudCgKICBTU19lc2NhcGUsCiAgZ3JvdXAuYnkgPSAiUGF0aWVudF9vcmlnaW4iLAogIGdlbmUuc2V0LnVzZSA9ICJhbGwiLAogIGFzc2F5ID0gImVzY2FwZTIuc3NHU0VBIiwKICBzY2FsZSA9IFRSVUUsCiAgY2x1c3Rlci5yb3dzID0gVFJVRSwKICBjbHVzdGVyLmNvbHVtbnMgPSBUUlVFCikKCmhlYXRtYXBFbnJpY2htZW50KAogIFNTX2VzY2FwZSwKICBncm91cC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiLAogIGdlbmUuc2V0LnVzZSA9ICJhbGwiLAogIGFzc2F5ID0gImVzY2FwZTIuc3NHU0VBIiwKICBwYWxldHRlID0gIlNwZWN0cmFsIiwKICBzY2FsZSA9IFRSVUUsCiAgY2x1c3Rlci5yb3dzID0gVFJVRSwKICBjbHVzdGVyLmNvbHVtbnMgPSBUUlVFCikKCmhlYXRtYXBFbnJpY2htZW50KAogIFNTX2VzY2FwZSwKICBncm91cC5ieSA9ICJjZWxsX2xpbmUiLAogIGdlbmUuc2V0LnVzZSA9ICJhbGwiLAogIGFzc2F5ID0gImVzY2FwZTIuc3NHU0VBIiwKICBwYWxldHRlID0gIlNwZWN0cmFsIiwKICBzY2FsZSA9IFRSVUUsCiAgY2x1c3Rlci5yb3dzID0gVFJVRSwKICBjbHVzdGVyLmNvbHVtbnMgPSBUUlVFCikKCgpgYGAKCgpgYGB7ciBWMiwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CiMjIGdleXNlckVucmljaG1lbnQKCmdleXNlckVucmljaG1lbnQoU1NfZXNjYXBlLAogICAgICAgICAgICAgICAgIGFzc2F5ID0gImVzY2FwZS5zc0dTRUEiLAogICAgICAgICAgICAgICAgIGdlbmUuc2V0ID0gIkhBTExNQVJLLUlOVEVSRkVST04tR0FNTUEtUkVTUE9OU0UiKQoKCmdleXNlckVucmljaG1lbnQoU1NfZXNjYXBlLAogICAgICAgICAgICAgICAgIGFzc2F5ID0gImVzY2FwZS5zc0dTRUEiLAogICAgICAgICAgICAgICAgIGdlbmUuc2V0ID0gIkhBTExNQVJLLUlOVEVSRkVST04tR0FNTUEtUkVTUE9OU0UiLAogICAgICAgICAgICAgICAgIG9yZGVyLmJ5ID0gIm1lYW4iKQoKCgpgYGAKCgpgYGB7ciBWMywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CiMgcmlkZ2VFbnJpY2htZW50CgpyaWRnZUVucmljaG1lbnQoCiAgU1NfZXNjYXBlLAogIGFzc2F5ID0gImVzY2FwZS5zc0dTRUEiLAogIGdlbmUuc2V0ID0gIkhBTExNQVJLLUlMMi1TVEFUNS1TSUdOQUxJTkciCikKCgpyaWRnZUVucmljaG1lbnQoCiAgU1NfZXNjYXBlLAogIGFzc2F5ID0gImVzY2FwZS5zc0dTRUEiLAogIGdlbmUuc2V0ID0gIkhBTExNQVJLLUlMMi1TVEFUNS1TSUdOQUxJTkciLAogIGFkZC5ydWcgPSBUUlVFLAogIHNjYWxlID0gVFJVRQopCgpgYGAKCgoKYGBge3IgVjQsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQojIHNjYXR0ZXJFbnJpY2htZW50CgpzY2F0dGVyRW5yaWNobWVudCgKICBTU19lc2NhcGUsCiAgYXNzYXkgPSAiZXNjYXBlLnNzR1NFQSIsCiAgeC5heGlzID0gIkhBTExNQVJLLUlOVEVSRkVST04tR0FNTUEtUkVTUE9OU0UiLAogIHkuYXhpcyA9ICJIQUxMTUFSSy1JTDYtSkFLLVNUQVQzLVNJR05BTElORyIKICApCgpzY2F0dGVyRW5yaWNobWVudCgKICBTU19lc2NhcGUsCiAgYXNzYXkgPSAiZXNjYXBlLnNzR1NFQSIsCiAgeC5heGlzID0gIkhBTExNQVJLLUlOVEVSRkVST04tR0FNTUEtUkVTUE9OU0UiLAogIHkuYXhpcyA9ICJIQUxMTUFSSy1JTDYtSkFLLVNUQVQzLVNJR05BTElORyIsCiAgc3R5bGUgPSAiaGV4IgopCmBgYAoKCgoKCgo=