1. load libraries
2. Load Seurat Object
#Load Seurat Object merged from cell lines and a control after filtration
load("../22-Seurat_Integrate/0-R_Objects/CD4Tcells_SCTnormalized_done_on_HPC_inluding_Patient_origin.robj")
# Visualize before Harmony integration
DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "Patient_origin",
label = TRUE,
label.box = TRUE) +
ggtitle("Before Harmony - By Cell Line")

before <- DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "cell_line",
label = TRUE,
label.box = TRUE) +
ggtitle("Before Harmony - By Cell Line")
DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "cell_line",
label = TRUE,
label.box = TRUE) +
ggtitle("Before Harmony - By Cell Line")

DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "SCT_snn_res.0.5",
label = TRUE,
label.box = TRUE) +
ggtitle("Before Harmony - By Clusters")

DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "predicted.celltype.l1",
label = TRUE,
label.box = TRUE) +
ggtitle("Before Harmony - By Annotation.l1")

DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "predicted.celltype.l2",
label = TRUE,
label.box = TRUE) +
ggtitle("Before Harmony - By Annotation.l2")

DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "predicted.celltype.l3",
label = TRUE,
label.box = TRUE) +
ggtitle("Before Harmony - By Annotation.l3")

table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$SCT_snn_res.0.5)
0 1 2 3 4 5 6 7 8 9 10 11 12 13
B intermediate 0 3 0 0 0 0 2 0 0 0 0 0 2 0
B memory 8 6 1 0 85 0 30 2 0 115 4 0 1 0
CD14 Mono 0 1 0 0 0 0 4 0 0 7 0 0 0 0
CD4 CTL 0 0 0 0 0 12 0 0 0 0 0 0 0 1
CD4 Naive 0 8 0 0 0 517 0 0 1479 0 0 37 0 1
CD4 Proliferating 5448 2474 5388 2852 3954 0 3256 2863 6 1270 1407 0 93 0
CD4 TCM 871 3414 522 269 536 4214 106 29 1838 457 46 425 49 54
CD4 TEM 0 1 0 0 0 61 0 0 21 0 0 1 0 0
CD8 Proliferating 0 0 0 0 1 0 0 0 0 1 0 0 0 0
CD8 TCM 0 1 0 16 0 0 0 0 0 0 0 0 0 0
CD8 TEM 0 1 0 8 3 0 2 0 0 1 0 0 0 0
cDC1 0 0 0 0 5 0 2 0 0 0 0 0 1 0
cDC2 0 1 2 0 3 0 10 0 0 36 0 0 0 1
dnT 0 3 1 1 1 0 2 0 0 3 0 1 3 0
HSPC 57 10 1 0 211 0 678 483 0 5 358 0 2 0
NK Proliferating 4 40 23 2785 237 0 10 12 0 22 1 0 27 0
Treg 15 14 1 0 1 0 0 0 0 0 0 1 13 0
3. Perform Harmony Integration
# Perform Harmony integration
All_samples_Merged <- RunHarmony(All_samples_Merged,
group.by.vars = c( "Patient_origin"),
reduction.use = "pca",
dim.use = 1:15,
theta = c(0.5),
assay.use = "SCT")
Transposing data matrix
Initializing state using k-means centroids initialization
Harmony 1/10
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Harmony 2/10
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Harmony converged after 2 iterations
# Check if Harmony integration ran successfully
print(names(All_samples_Merged@reductions)) # Should include "harmony"
[1] "integrated_dr" "ref.umap" "pca" "umap" "harmony"
# Find neighbors using the Harmony reduction and explicitly name the graph
All_samples_Merged <- FindNeighbors(All_samples_Merged,
reduction = "harmony", # Harmony reduction used
dims = 1:15, # Use first 15 dimensions of the Harmony reduction
graph.name = "harmony_snn") # Explicitly name the graph
Computing nearest neighbor graph
Computing SNN
Only one graph name supplied, storing nearest-neighbor graph only
# Check if the "harmony_snn" graph is present
print(names(All_samples_Merged@graphs)) # Should now include "harmony_snn"
[1] "SCT_nn" "SCT_snn" "harmony_snn"
# Find clusters for each resolution and store them
resolutions <- c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2)
for (res in resolutions) {
cluster_name <- paste0("harmony_res_", res) # Dynamic cluster name
All_samples_Merged <- FindClusters(
object = All_samples_Merged,
graph.name = "harmony_snn", # Graph created in FindNeighbors
resolution = res, # Resolution for clustering
verbose = FALSE
)
# Add cluster identities to metadata
All_samples_Merged[[cluster_name]] <- Idents(All_samples_Merged)
}
# Run UMAP on the new Harmony reduction
All_samples_Merged <- RunUMAP(All_samples_Merged,
reduction = "harmony",
dims = 1:15)
18:40:51 UMAP embedding parameters a = 0.9922 b = 1.112
18:40:51 Read 49372 rows and found 15 numeric columns
18:40:51 Using Annoy for neighbor search, n_neighbors = 30
18:40:51 Building Annoy index with metric = cosine, n_trees = 50
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
18:40:55 Writing NN index file to temp file /tmp/RtmpW4aDAH/file1480618918435
18:40:55 Searching Annoy index using 1 thread, search_k = 3000
18:41:06 Annoy recall = 100%
18:41:07 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
18:41:09 Initializing from normalized Laplacian + noise (using RSpectra)
18:41:10 Commencing optimization for 200 epochs, with 2020710 positive edges
Using method 'umap'
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
18:41:26 Optimization finished
4. Visualize Harmony Integrated Data
# Visualization after Harmony
# By cell line
p3 <- DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "cell_line",
label = TRUE,
label.box = TRUE) +
ggtitle("After Harmony - By Cell Line")
# By clusters
p4 <- DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "harmony_res_0.7",
label = TRUE,
label.box = TRUE) +
ggtitle("After Harmony - By Clusters")
# By cell type annotations
p5 <- DimPlot(All_samples_Merged,
reduction = "umap",
group.by = "predicted.celltype.l2",
label = TRUE,
label.box = TRUE) +
ggtitle("After Harmony - Cell Type Annotations")
# Print comparison plots
p3 + p4

print(p5)

after <- DimPlot(All_samples_Merged, reduction = "umap", group.by = "cell_line", label = T, label.box = T, repel = T) +
ggtitle("Harmony Integration - By Cell Line")
before|after

DimPlot(All_samples_Merged, reduction = "umap", group.by = "cell_line", label = T, label.box = T, repel = T) +
ggtitle("Harmony Integration - By Cell Line")

DimPlot(All_samples_Merged, reduction = "umap", group.by = "harmony_res_0.7",label = T, label.box = T, repel = T) +
ggtitle("Harmony Integration - By Clusters")

DimPlot(All_samples_Merged, reduction = "umap", group.by = "predicted.celltype.l2",label = T, label.box = T, repel = T) +
ggtitle("Harmony Integration - Annotations")

table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$cell_line)
L1 L2 L3 L4 L5 L6 L7 PBMC PBMC_10x
B intermediate 0 0 2 1 2 2 0 0 0
B memory 0 0 11 1 38 82 120 0 0
CD14 Mono 0 0 1 0 5 0 6 0 0
CD4 CTL 0 0 0 0 0 0 0 12 1
CD4 Naive 0 0 0 7 0 0 0 523 1512
CD4 Proliferating 2461 2852 5452 5391 4732 4002 4115 0 6
CD4 TCM 3320 270 887 562 178 557 517 4576 1963
CD4 TEM 1 0 0 0 0 0 0 60 23
CD8 Proliferating 0 0 0 0 0 1 1 0 0
CD8 TCM 1 16 0 0 0 0 0 0 0
CD8 TEM 1 8 0 0 2 3 1 0 0
cDC1 0 0 0 0 2 6 0 0 0
cDC2 0 0 0 4 11 3 35 0 0
dnT 2 3 0 1 2 5 2 0 0
HSPC 0 0 60 7 1035 213 490 0 0
NK Proliferating 38 2785 6 24 11 259 38 0 0
Treg 1 1 9 9 4 15 6 0 0
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$harmony_res_0.7)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
B intermediate 0 0 0 0 0 3 0 0 0 2 0 0 0 2 0
B memory 10 0 0 1 77 14 7 1 107 8 0 2 20 5 0
CD14 Mono 0 0 0 0 0 0 0 0 5 0 0 0 6 0 1
CD4 CTL 0 2 8 0 0 1 0 0 0 0 1 0 0 0 1
CD4 Naive 0 2 1268 0 0 47 0 0 0 8 716 0 0 0 1
CD4 Proliferating 5328 2846 6 5093 3939 1945 2889 2877 1731 316 0 1395 108 538 0
CD4 TCM 916 284 4554 151 519 1904 35 24 420 1811 1286 40 791 43 52
CD4 TEM 0 1 69 0 0 4 0 0 0 0 10 0 0 0 0
CD8 Proliferating 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
CD8 TCM 1 16 0 0 0 0 0 0 0 0 0 0 0 0 0
CD8 TEM 0 6 0 0 2 4 1 0 1 0 0 0 1 0 0
cDC1 0 0 0 0 5 1 0 0 0 0 0 0 1 1 0
cDC2 0 0 0 0 4 0 3 2 33 0 0 0 7 2 2
dnT 0 0 0 0 2 8 0 0 2 0 0 0 3 0 0
HSPC 56 0 0 1 210 10 659 478 6 8 0 354 1 22 0
NK Proliferating 3 2783 0 23 238 66 10 15 21 0 0 1 0 1 0
Treg 0 0 0 1 1 40 0 0 0 2 0 0 0 1 0
Visualize Harmony Integrated Data distribution
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$cell_line)
L1 L2 L3 L4 L5 L6 L7 PBMC PBMC_10x
B intermediate 0 0 2 1 2 2 0 0 0
B memory 0 0 11 1 38 82 120 0 0
CD14 Mono 0 0 1 0 5 0 6 0 0
CD4 CTL 0 0 0 0 0 0 0 12 1
CD4 Naive 0 0 0 7 0 0 0 523 1512
CD4 Proliferating 2461 2852 5452 5391 4732 4002 4115 0 6
CD4 TCM 3320 270 887 562 178 557 517 4576 1963
CD4 TEM 1 0 0 0 0 0 0 60 23
CD8 Proliferating 0 0 0 0 0 1 1 0 0
CD8 TCM 1 16 0 0 0 0 0 0 0
CD8 TEM 1 8 0 0 2 3 1 0 0
cDC1 0 0 0 0 2 6 0 0 0
cDC2 0 0 0 4 11 3 35 0 0
dnT 2 3 0 1 2 5 2 0 0
HSPC 0 0 60 7 1035 213 490 0 0
NK Proliferating 38 2785 6 24 11 259 38 0 0
Treg 1 1 9 9 4 15 6 0 0
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$harmony_res_0.7)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
B intermediate 0 0 0 0 0 3 0 0 0 2 0 0 0 2 0
B memory 10 0 0 1 77 14 7 1 107 8 0 2 20 5 0
CD14 Mono 0 0 0 0 0 0 0 0 5 0 0 0 6 0 1
CD4 CTL 0 2 8 0 0 1 0 0 0 0 1 0 0 0 1
CD4 Naive 0 2 1268 0 0 47 0 0 0 8 716 0 0 0 1
CD4 Proliferating 5328 2846 6 5093 3939 1945 2889 2877 1731 316 0 1395 108 538 0
CD4 TCM 916 284 4554 151 519 1904 35 24 420 1811 1286 40 791 43 52
CD4 TEM 0 1 69 0 0 4 0 0 0 0 10 0 0 0 0
CD8 Proliferating 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
CD8 TCM 1 16 0 0 0 0 0 0 0 0 0 0 0 0 0
CD8 TEM 0 6 0 0 2 4 1 0 1 0 0 0 1 0 0
cDC1 0 0 0 0 5 1 0 0 0 0 0 0 1 1 0
cDC2 0 0 0 0 4 0 3 2 33 0 0 0 7 2 2
dnT 0 0 0 0 2 8 0 0 2 0 0 0 3 0 0
HSPC 56 0 0 1 210 10 659 478 6 8 0 354 1 22 0
NK Proliferating 3 2783 0 23 238 66 10 15 21 0 0 1 0 1 0
Treg 0 0 0 1 1 40 0 0 0 2 0 0 0 1 0
table(All_samples_Merged$cell_line, All_samples_Merged$harmony_res_0.7)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
L1 222 0 0 0 1 3021 1 0 445 1750 0 21 364 0 0
L2 0 5918 0 0 0 13 0 0 2 1 0 0 0 1 0
L3 6065 0 0 0 1 69 0 0 15 200 0 0 16 61 1
L4 0 1 0 5264 0 26 0 0 26 52 0 4 375 257 2
L5 17 0 0 1 4 36 3603 15 194 65 0 1694 159 234 0
L6 6 0 0 5 4899 179 0 0 11 28 0 4 2 14 0
L7 4 0 0 0 91 85 0 3382 1629 19 0 69 17 35 0
PBMC 0 21 3843 0 2 469 0 0 4 31 753 0 4 12 32
PBMC_10x 0 0 2062 0 0 149 0 0 1 9 1260 0 1 1 22
5. Marker Gene Visualization
# Set marker genes specific to requested immune cell types
myfeatures1 <- c("CD19", "CD79A", "MS4A1", # B cells
"CD14", "LYZ", "FCGR3A", # Monocytes
"CSF1R", "CD68", # Macrophages
"NKG7", "GNLY", "KIR3DL1", # NK cells
"MKI67", # Proliferating NK cells
"CD34", "KIT", # HSPCs
"CD3E", "CCR7", # T cells
"SELL", "CD45RO", # Tnaive, Tcm
"CD44", "CD45RA") # Tem, Temra
cd4_feature_plot1 <- FeaturePlot(
All_samples_Merged,
features = myfeatures1,
reduction = "umap",
ncol = 4
) +
ggtitle("CD4 T Cell Marker Expression - Harmony Integration") +
NoLegend()
Warning: Could not find CD45RO in the default search locations, found in 'ADT' assay insteadWarning: Could not find CD45RA in the default search locations, found in 'ADT' assay instead
# Display the plot
print(cd4_feature_plot1)

# Define markers specific to CD4 T cells and their subsets
cd4_markers <- c(
"CD4", # General CD4 T cells
"IL7R", # Naive T cells
"CCR7", # T central memory (Tcm) cells
"SELL", # T naive cells
"FOXP3", # Regulatory T cells (Tregs)
"IL2RA", # Activated T cells
"PDCD1", # Exhausted T cells
"LAG3", # Exhausted T cells
"TIGIT", # Exhausted T cells
"GATA3", # Th2 cells
"TBX21", # Th1 cells
"RORC", # Th17 cells
"BCL6" # T follicular helper (Tfh) cells
)
# Visualize marker genes for CD4 T cells
cd4_feature_plot2 <- FeaturePlot(
All_samples_Merged,
features = cd4_markers,
reduction = "umap",
ncol = 4
) +
ggtitle("CD4 T Cell Marker Expression - Harmony Integration") +
NoLegend()
# Display the plot
print(cd4_feature_plot2)

CD4 T Cell Marker Visualization
# Set marker genes specific to CD4 T cell biology and states
cd4_markers <- c(
# Core T cell markers
"CD3E", # T cell marker
"CD4", # CD4 T cell marker
# Naive/Memory markers
"CCR7", # Naive/Central memory
"SELL", # L-selectin, naive marker
"CD27", # Memory marker
"IL7R", # Naive/Memory marker
# Activation/State markers
"IL2RA", # CD25, activation marker
"CD69", # Early activation
"HLA-DRA", # Activation marker
# Exhaustion markers
"PDCD1", # PD-1
"LAG3", # Exhaustion marker
"TIGIT", # Exhaustion marker
# Regulatory T cell markers
"FOXP3", # Treg marker
"IL2RA", # CD25, Treg marker
"CTLA4", # Treg/exhaustion marker
# Effector/Function markers
"IL2", # T cell function
"IFNG", # Th1
"IL4", # Th2
"IL13", # Th2
"IL17A" # Th17
)
# Create feature plots with better visualization
FeaturePlot(All_samples_Merged,
features = cd4_markers,
reduction = "umap",
ncol = 4,
pt.size = 0.1, # Smaller point size for better resolution
min.cutoff = "q1", # Remove bottom 1% of expression
max.cutoff = "q99", # Remove top 1% of expression
order = TRUE) + # Plot highest expressing cells on top
ggtitle("CD4 T Cell Marker Expression - Harmony Integration") +
theme(plot.title = element_text(size = 16, face = "bold")) +
NoLegend()

# Optional: Add violin plots to see expression distribution across clusters
VlnPlot(All_samples_Merged,
features = cd4_markers[1:20], # First 8 markers
stack = TRUE,
flip = TRUE) +
ggtitle("CD4 T Cell Marker Distribution Across Clusters")

NA
NA
6. Save the Seurat object as an Robj file
save(All_samples_Merged, file = "CD4Tcells_harmony_integrated_0.5_theta_patientorigin_orig_ident.Robj")
LS0tCnRpdGxlOiAiSGFybW9ueSBpbnRlZ3JhdGlvbnMgb2YgUEJNQzEweCBieSBQYXRpZW50IC10aGV0YS0wLjUgYm90aCIKYXV0aG9yOiBOYXNpciBNYWhtb29kIEFiYmFzaQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICAjcm1kZm9ybWF0czo6cmVhZHRoZWRvd24KICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKLS0tCgoKIyAxLiBsb2FkIGxpYnJhcmllcwpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoU2V1cmF0V3JhcHBlcnMpCmxpYnJhcnkoU2V1cmF0T2JqZWN0KQpsaWJyYXJ5KFNldXJhdERhdGEpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGhhcm1vbnkpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyZXRpY3VsYXRlKQpsaWJyYXJ5KEF6aW11dGgpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoUnRzbmUpCmxpYnJhcnkoaGFybW9ueSkKCgpgYGAKCgoKCiMgMi4gTG9hZCBTZXVyYXQgT2JqZWN0IApgYGB7ciBsb2FkX3NldXJhdCwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTB9CgojTG9hZCBTZXVyYXQgT2JqZWN0IG1lcmdlZCBmcm9tIGNlbGwgbGluZXMgYW5kIGEgY29udHJvbCBhZnRlciBmaWx0cmF0aW9uCmxvYWQoIi4uLzIyLVNldXJhdF9JbnRlZ3JhdGUvMC1SX09iamVjdHMvQ0Q0VGNlbGxzX1NDVG5vcm1hbGl6ZWRfZG9uZV9vbl9IUENfaW5sdWRpbmdfUGF0aWVudF9vcmlnaW4ucm9iaiIpCgoKCiMgVmlzdWFsaXplIGJlZm9yZSBIYXJtb255IGludGVncmF0aW9uCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gIlBhdGllbnRfb3JpZ2luIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQ2VsbCBMaW5lIikKCgpiZWZvcmUgPC0gRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQ2VsbCBMaW5lIikKCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLCAKICAgICAgICAgICAgICBncm91cC5ieSA9ICJjZWxsX2xpbmUiLAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgbGFiZWwuYm94ID0gVFJVRSkgKyAKICAgICAgZ2d0aXRsZSgiQmVmb3JlIEhhcm1vbnkgLSBCeSBDZWxsIExpbmUiKQoKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gIlNDVF9zbm5fcmVzLjAuNSIsCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFKSArIAogICAgICBnZ3RpdGxlKCJCZWZvcmUgSGFybW9ueSAtIEJ5IENsdXN0ZXJzIikKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMSIsCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFKSArIAogICAgICBnZ3RpdGxlKCJCZWZvcmUgSGFybW9ueSAtIEJ5IEFubm90YXRpb24ubDEiKQoKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMiIsCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFKSArIAogICAgICBnZ3RpdGxlKCJCZWZvcmUgSGFybW9ueSAtIEJ5IEFubm90YXRpb24ubDIiKQoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwzIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQW5ub3RhdGlvbi5sMyIpCgoKdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMiwgQWxsX3NhbXBsZXNfTWVyZ2VkJFNDVF9zbm5fcmVzLjAuNSkKCgpgYGAKCgojIDMuICBQZXJmb3JtIEhhcm1vbnkgSW50ZWdyYXRpb24KYGBge3IgaGFybW9ueS1pbnRlZ3JhdGlvbiwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTJ9CgojIFBlcmZvcm0gSGFybW9ueSBpbnRlZ3JhdGlvbgpBbGxfc2FtcGxlc19NZXJnZWQgPC0gUnVuSGFybW9ueShBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5ieS52YXJzID0gYyggIlBhdGllbnRfb3JpZ2luIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y3Rpb24udXNlID0gInBjYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0udXNlID0gMToxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhldGEgPSBjKDAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2F5LnVzZSA9ICJTQ1QiKQoKIyBDaGVjayBpZiBIYXJtb255IGludGVncmF0aW9uIHJhbiBzdWNjZXNzZnVsbHkKcHJpbnQobmFtZXMoQWxsX3NhbXBsZXNfTWVyZ2VkQHJlZHVjdGlvbnMpKSAgIyBTaG91bGQgaW5jbHVkZSAiaGFybW9ueSIKCiMgRmluZCBuZWlnaGJvcnMgdXNpbmcgdGhlIEhhcm1vbnkgcmVkdWN0aW9uIGFuZCBleHBsaWNpdGx5IG5hbWUgdGhlIGdyYXBoCkFsbF9zYW1wbGVzX01lcmdlZCA8LSBGaW5kTmVpZ2hib3JzKEFsbF9zYW1wbGVzX01lcmdlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gImhhcm1vbnkiLCAgICMgSGFybW9ueSByZWR1Y3Rpb24gdXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1zID0gMToxNSwgICAgICAgICAgICAgIyBVc2UgZmlyc3QgMTUgZGltZW5zaW9ucyBvZiB0aGUgSGFybW9ueSByZWR1Y3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGgubmFtZSA9ICJoYXJtb255X3NubiIpICAjIEV4cGxpY2l0bHkgbmFtZSB0aGUgZ3JhcGgKCiMgQ2hlY2sgaWYgdGhlICJoYXJtb255X3NubiIgZ3JhcGggaXMgcHJlc2VudApwcmludChuYW1lcyhBbGxfc2FtcGxlc19NZXJnZWRAZ3JhcGhzKSkgICMgU2hvdWxkIG5vdyBpbmNsdWRlICJoYXJtb255X3NubiIKCgojIEZpbmQgY2x1c3RlcnMgZm9yIGVhY2ggcmVzb2x1dGlvbiBhbmQgc3RvcmUgdGhlbQpyZXNvbHV0aW9ucyA8LSBjKDAuMSwgMC4yLCAwLjMsIDAuNCwgMC41LCAwLjYsIDAuNywgMC44LCAwLjksIDEsIDEuMikKZm9yIChyZXMgaW4gcmVzb2x1dGlvbnMpIHsKICBjbHVzdGVyX25hbWUgPC0gcGFzdGUwKCJoYXJtb255X3Jlc18iLCByZXMpICAjIER5bmFtaWMgY2x1c3RlciBuYW1lCiAgQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIEZpbmRDbHVzdGVycygKICAgIG9iamVjdCA9IEFsbF9zYW1wbGVzX01lcmdlZCwKICAgIGdyYXBoLm5hbWUgPSAiaGFybW9ueV9zbm4iLCAgICAgICAgICAgICAgICMgR3JhcGggY3JlYXRlZCBpbiBGaW5kTmVpZ2hib3JzCiAgICByZXNvbHV0aW9uID0gcmVzLCAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlc29sdXRpb24gZm9yIGNsdXN0ZXJpbmcKICAgIHZlcmJvc2UgPSBGQUxTRQogICkKICAjIEFkZCBjbHVzdGVyIGlkZW50aXRpZXMgdG8gbWV0YWRhdGEKICBBbGxfc2FtcGxlc19NZXJnZWRbW2NsdXN0ZXJfbmFtZV1dIDwtIElkZW50cyhBbGxfc2FtcGxlc19NZXJnZWQpCn0KCiMgUnVuIFVNQVAgb24gdGhlIG5ldyBIYXJtb255IHJlZHVjdGlvbgpBbGxfc2FtcGxlc19NZXJnZWQgPC0gUnVuVU1BUChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAiaGFybW9ueSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1zID0gMToxNSkKCgpgYGAKCiMgNC4gIFZpc3VhbGl6ZSBIYXJtb255IEludGVncmF0ZWQgRGF0YQpgYGB7ciBoYXJtb255LXZpc3VhbGl6YXRpb24xLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCiMgVmlzdWFsaXphdGlvbiBhZnRlciBIYXJtb255CgojIEJ5IGNlbGwgbGluZQpwMyA8LSBEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLCAKICAgICAgICAgICAgICBncm91cC5ieSA9ICJjZWxsX2xpbmUiLAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgbGFiZWwuYm94ID0gVFJVRSkgKyAKICAgICAgZ2d0aXRsZSgiQWZ0ZXIgSGFybW9ueSAtIEJ5IENlbGwgTGluZSIpCgojIEJ5IGNsdXN0ZXJzCnA0IDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gImhhcm1vbnlfcmVzXzAuNyIsCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFKSArIAogICAgICBnZ3RpdGxlKCJBZnRlciBIYXJtb255IC0gQnkgQ2x1c3RlcnMiKQoKIyBCeSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMKcDUgPC0gRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwyIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkFmdGVyIEhhcm1vbnkgLSBDZWxsIFR5cGUgQW5ub3RhdGlvbnMiKQoKIyBQcmludCBjb21wYXJpc29uIHBsb3RzCnAzICsgcDQKcHJpbnQocDUpCgphZnRlciA8LSBEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJjZWxsX2xpbmUiLCBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQsIHJlcGVsID0gVCkgKyAKICBnZ3RpdGxlKCJIYXJtb255IEludGVncmF0aW9uIC0gQnkgQ2VsbCBMaW5lIikKCmJlZm9yZXxhZnRlcgoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBULCByZXBlbCA9IFQpICsgCiAgZ2d0aXRsZSgiSGFybW9ueSBJbnRlZ3JhdGlvbiAtIEJ5IENlbGwgTGluZSIpCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImhhcm1vbnlfcmVzXzAuNyIsbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBULCByZXBlbCA9IFQpICsgCiAgZ2d0aXRsZSgiSGFybW9ueSBJbnRlZ3JhdGlvbiAtIEJ5IENsdXN0ZXJzIikKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwyIixsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQsIHJlcGVsID0gVCkgKyAKICBnZ3RpdGxlKCJIYXJtb255IEludGVncmF0aW9uIC0gQW5ub3RhdGlvbnMiKQoKdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMiwgQWxsX3NhbXBsZXNfTWVyZ2VkJGNlbGxfbGluZSkKCnRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRwcmVkaWN0ZWQuY2VsbHR5cGUubDIsIEFsbF9zYW1wbGVzX01lcmdlZCRoYXJtb255X3Jlc18wLjcpCgpgYGAKCiMjICBWaXN1YWxpemUgSGFybW9ueSBJbnRlZ3JhdGVkIERhdGEgZGlzdHJpYnV0aW9uCmBgYHtyIGhhcm1vbnktdGFibGVzLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCgp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkY2VsbF9saW5lKQoKdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMiwgQWxsX3NhbXBsZXNfTWVyZ2VkJGhhcm1vbnlfcmVzXzAuNykKCnRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUsIEFsbF9zYW1wbGVzX01lcmdlZCRoYXJtb255X3Jlc18wLjcpCgpgYGAKIyA1LiAgTWFya2VyIEdlbmUgVmlzdWFsaXphdGlvbgpgYGB7ciBmZWF0dXJlcGxvdC1oYXJtb255MSwgZmlnLmhlaWdodD0xNCwgZmlnLndpZHRoPTE4fQoKCiMgU2V0IG1hcmtlciBnZW5lcyBzcGVjaWZpYyB0byByZXF1ZXN0ZWQgaW1tdW5lIGNlbGwgdHlwZXMKbXlmZWF0dXJlczEgPC0gYygiQ0QxOSIsICJDRDc5QSIsICJNUzRBMSIsICMgQiBjZWxscwogICAgICAgICAgICAgICAgIkNEMTQiLCAiTFlaIiwgIkZDR1IzQSIsICMgTW9ub2N5dGVzCiAgICAgICAgICAgICAgICAiQ1NGMVIiLCAiQ0Q2OCIsICMgTWFjcm9waGFnZXMKICAgICAgICAgICAgICAgICJOS0c3IiwgIkdOTFkiLCAiS0lSM0RMMSIsICMgTksgY2VsbHMKICAgICAgICAgICAgICAgICJNS0k2NyIsICMgUHJvbGlmZXJhdGluZyBOSyBjZWxscwogICAgICAgICAgICAgICAgIkNEMzQiLCAiS0lUIiwgIyBIU1BDcwogICAgICAgICAgICAgICAgIkNEM0UiLCAiQ0NSNyIsICMgVCBjZWxscwogICAgICAgICAgICAgICAgIlNFTEwiLCAiQ0Q0NVJPIiwgIyBUbmFpdmUsIFRjbQogICAgICAgICAgICAgICAgIkNENDQiLCAiQ0Q0NVJBIikgIyBUZW0sIFRlbXJhCgpjZDRfZmVhdHVyZV9wbG90MSA8LSBGZWF0dXJlUGxvdCgKICBBbGxfc2FtcGxlc19NZXJnZWQsIAogIGZlYXR1cmVzID0gbXlmZWF0dXJlczEsIAogIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgbmNvbCA9IDQKKSArIAogIGdndGl0bGUoIkNENCBUIENlbGwgTWFya2VyIEV4cHJlc3Npb24gLSBIYXJtb255IEludGVncmF0aW9uIikgKwogIE5vTGVnZW5kKCkKCiMgRGlzcGxheSB0aGUgcGxvdApwcmludChjZDRfZmVhdHVyZV9wbG90MSkKCiMgRGVmaW5lIG1hcmtlcnMgc3BlY2lmaWMgdG8gQ0Q0IFQgY2VsbHMgYW5kIHRoZWlyIHN1YnNldHMKY2Q0X21hcmtlcnMgPC0gYygKICAiQ0Q0IiwgICAgICAgICAgIyBHZW5lcmFsIENENCBUIGNlbGxzCiAgIklMN1IiLCAgICAgICAgICMgTmFpdmUgVCBjZWxscwogICJDQ1I3IiwgICAgICAgICAjIFQgY2VudHJhbCBtZW1vcnkgKFRjbSkgY2VsbHMKICAiU0VMTCIsICAgICAgICAgIyBUIG5haXZlIGNlbGxzCiAgIkZPWFAzIiwgICAgICAgICMgUmVndWxhdG9yeSBUIGNlbGxzIChUcmVncykKICAiSUwyUkEiLCAgICAgICAgIyBBY3RpdmF0ZWQgVCBjZWxscwogICJQRENEMSIsICAgICAgICAjIEV4aGF1c3RlZCBUIGNlbGxzCiAgIkxBRzMiLCAgICAgICAgICMgRXhoYXVzdGVkIFQgY2VsbHMKICAiVElHSVQiLCAgICAgICAgIyBFeGhhdXN0ZWQgVCBjZWxscwogICJHQVRBMyIsICAgICAgICAjIFRoMiBjZWxscwogICJUQlgyMSIsICAgICAgICAjIFRoMSBjZWxscwogICJST1JDIiwgICAgICAgICAjIFRoMTcgY2VsbHMKICAiQkNMNiIgICAgICAgICAgIyBUIGZvbGxpY3VsYXIgaGVscGVyIChUZmgpIGNlbGxzCikKCiMgVmlzdWFsaXplIG1hcmtlciBnZW5lcyBmb3IgQ0Q0IFQgY2VsbHMKY2Q0X2ZlYXR1cmVfcGxvdDIgPC0gRmVhdHVyZVBsb3QoCiAgQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICBmZWF0dXJlcyA9IGNkNF9tYXJrZXJzLCAKICByZWR1Y3Rpb24gPSAidW1hcCIsIAogIG5jb2wgPSA0CikgKyAKICBnZ3RpdGxlKCJDRDQgVCBDZWxsIE1hcmtlciBFeHByZXNzaW9uIC0gSGFybW9ueSBJbnRlZ3JhdGlvbiIpICsKICBOb0xlZ2VuZCgpCgojIERpc3BsYXkgdGhlIHBsb3QKcHJpbnQoY2Q0X2ZlYXR1cmVfcGxvdDIpCmBgYAoKIyMgIENENCBUIENlbGwgTWFya2VyIFZpc3VhbGl6YXRpb24KYGBge3IgZmVhdHVyZXBsb3QtaGFybW9ueTIsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xNn0KIyBTZXQgbWFya2VyIGdlbmVzIHNwZWNpZmljIHRvIENENCBUIGNlbGwgYmlvbG9neSBhbmQgc3RhdGVzCmNkNF9tYXJrZXJzIDwtIGMoCiAgICAjIENvcmUgVCBjZWxsIG1hcmtlcnMKICAgICJDRDNFIiwgICAgICMgVCBjZWxsIG1hcmtlcgogICAgIkNENCIsICAgICAgIyBDRDQgVCBjZWxsIG1hcmtlcgogICAgCiAgICAjIE5haXZlL01lbW9yeSBtYXJrZXJzCiAgICAiQ0NSNyIsICAgICAjIE5haXZlL0NlbnRyYWwgbWVtb3J5CiAgICAiU0VMTCIsICAgICAjIEwtc2VsZWN0aW4sIG5haXZlIG1hcmtlcgogICAgIkNEMjciLCAgICAgIyBNZW1vcnkgbWFya2VyCiAgICAiSUw3UiIsICAgICAjIE5haXZlL01lbW9yeSBtYXJrZXIKICAgIAogICAgIyBBY3RpdmF0aW9uL1N0YXRlIG1hcmtlcnMKICAgICJJTDJSQSIsICAgICMgQ0QyNSwgYWN0aXZhdGlvbiBtYXJrZXIKICAgICJDRDY5IiwgICAgICMgRWFybHkgYWN0aXZhdGlvbgogICAgIkhMQS1EUkEiLCAgIyBBY3RpdmF0aW9uIG1hcmtlcgogICAgCiAgICAjIEV4aGF1c3Rpb24gbWFya2VycwogICAgIlBEQ0QxIiwgICAgIyBQRC0xCiAgICAiTEFHMyIsICAgICAjIEV4aGF1c3Rpb24gbWFya2VyCiAgICAiVElHSVQiLCAgICAjIEV4aGF1c3Rpb24gbWFya2VyCiAgICAKICAgICMgUmVndWxhdG9yeSBUIGNlbGwgbWFya2VycwogICAgIkZPWFAzIiwgICAgIyBUcmVnIG1hcmtlcgogICAgIklMMlJBIiwgICAgIyBDRDI1LCBUcmVnIG1hcmtlcgogICAgIkNUTEE0IiwgICAgIyBUcmVnL2V4aGF1c3Rpb24gbWFya2VyCiAgICAKICAgICMgRWZmZWN0b3IvRnVuY3Rpb24gbWFya2VycwogICAgIklMMiIsICAgICAgIyBUIGNlbGwgZnVuY3Rpb24KICAgICJJRk5HIiwgICAgICMgVGgxCiAgICAiSUw0IiwgICAgICAjIFRoMgogICAgIklMMTMiLCAgICAgIyBUaDIKICAgICJJTDE3QSIgICAgICMgVGgxNwopCgojIENyZWF0ZSBmZWF0dXJlIHBsb3RzIHdpdGggYmV0dGVyIHZpc3VhbGl6YXRpb24KRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgZmVhdHVyZXMgPSBjZDRfbWFya2VycywgCiAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgIG5jb2wgPSA0LAogICAgICAgICAgICBwdC5zaXplID0gMC4xLCAgICAgICAgICAgIyBTbWFsbGVyIHBvaW50IHNpemUgZm9yIGJldHRlciByZXNvbHV0aW9uCiAgICAgICAgICAgIG1pbi5jdXRvZmYgPSAicTEiLCAgICAgICAjIFJlbW92ZSBib3R0b20gMSUgb2YgZXhwcmVzc2lvbgogICAgICAgICAgICBtYXguY3V0b2ZmID0gInE5OSIsICAgICAgIyBSZW1vdmUgdG9wIDElIG9mIGV4cHJlc3Npb24KICAgICAgICAgICAgb3JkZXIgPSBUUlVFKSArICAgICAgICAgICMgUGxvdCBoaWdoZXN0IGV4cHJlc3NpbmcgY2VsbHMgb24gdG9wCiAgICBnZ3RpdGxlKCJDRDQgVCBDZWxsIE1hcmtlciBFeHByZXNzaW9uIC0gSGFybW9ueSBJbnRlZ3JhdGlvbiIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSkgKwogICAgTm9MZWdlbmQoKQoKIyBPcHRpb25hbDogQWRkIHZpb2xpbiBwbG90cyB0byBzZWUgZXhwcmVzc2lvbiBkaXN0cmlidXRpb24gYWNyb3NzIGNsdXN0ZXJzClZsblBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICBmZWF0dXJlcyA9IGNkNF9tYXJrZXJzWzE6MjBdLCAjIEZpcnN0IDggbWFya2VycwogICAgICAgIHN0YWNrID0gVFJVRSwKICAgICAgICBmbGlwID0gVFJVRSkgKwogICAgICAgIGdndGl0bGUoIkNENCBUIENlbGwgTWFya2VyIERpc3RyaWJ1dGlvbiBBY3Jvc3MgQ2x1c3RlcnMiKQoKCmBgYAoKCiMgNi4gU2F2ZSB0aGUgU2V1cmF0IG9iamVjdCBhcyBhbiBSb2JqIGZpbGUKYGBge3Igc2F2ZVJPQkp9Cgojc2F2ZShBbGxfc2FtcGxlc19NZXJnZWQsIGZpbGUgPSAiQ0Q0VGNlbGxzX2hhcm1vbnlfaW50ZWdyYXRlZF8wLjVfdGhldGFfcGF0aWVudG9yaWdpbl9vcmlnX2lkZW50LlJvYmoiKQoKYGBgCgoKCgo=