1. load libraries

2. Load Seurat Object


#Load Seurat Object merged from cell lines and a control after filtration
load("../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", "cell_line"), 
                                 reduction.use = "pca", 
                                 dim.use = 1:15,
                                 theta = c(0.5, 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)
Avis : The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session14:51:39 UMAP embedding parameters a = 0.9922 b = 1.112
14:51:39 Read 49372 rows and found 15 numeric columns
14:51:39 Using Annoy for neighbor search, n_neighbors = 30
14:51:39 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:51:45 Writing NN index file to temp file /tmp/Rtmp3E68VM/file1786257cb83092
14:51:45 Searching Annoy index using 1 thread, search_k = 3000
14:52:06 Annoy recall = 100%
14:52:07 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
14:52:10 Initializing from normalized Laplacian + noise (using RSpectra)
14:52:12 Commencing optimization for 200 epochs, with 2029576 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:52:42 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
  B intermediate       0    0    0    0    0    0    2    1    0    0    0    2    2    0
  B memory            14    0    5    0    0    3   12    8    3    0    0  194   13    0
  CD14 Mono            0    0    0    0    0    0    0    0    0    0    0   11    0    1
  CD4 CTL              0    0    0    0    2    0    1    0    0    7    0    2    0    1
  CD4 Naive            0 1748    0    0    2    0    8   51    0  231    0    1    0    1
  CD4 Proliferating 5690    3 3924 3942 1736 3912 1499 1847 2576   25 2669  732  456    0
  CD4 TCM            261 3120  826   11   37  148 2168 1609   33 2730   92 1697   46   52
  CD4 TEM              0   26    0    0    1    0    0    4    0   53    0    0    0    0
  CD8 Proliferating    0    0    0    0    0    0    0    0    0    0    0    2    0    0
  CD8 TCM              0    0    1    0    0    1   15    0    0    0    0    0    0    0
  CD8 TEM              0    0    0    0    0    0    5    4    0    0    0    6    0    0
  cDC1                 0    0    0    0    0    0    0    1    0    0    0    5    2    0
  cDC2                 2    0    0    0    0    0    0    0    1    0    0   44    4    2
  dnT                  1    0    0    0    0    0    0    8    0    0    0    6    0    0
  HSPC               987    0   29    9    1   59   37    8  633    0    1   10   31    0
  NK Proliferating   132    0    0  318 2496    3   53  107    7    5   23    5   12    0
  Treg                 0    0    0    0    0    0    2   41    0    0    1    1    0    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
  B intermediate       0    0    0    0    0    0    2    1    0    0    0    2    2    0
  B memory            14    0    5    0    0    3   12    8    3    0    0  194   13    0
  CD14 Mono            0    0    0    0    0    0    0    0    0    0    0   11    0    1
  CD4 CTL              0    0    0    0    2    0    1    0    0    7    0    2    0    1
  CD4 Naive            0 1748    0    0    2    0    8   51    0  231    0    1    0    1
  CD4 Proliferating 5690    3 3924 3942 1736 3912 1499 1847 2576   25 2669  732  456    0
  CD4 TCM            261 3120  826   11   37  148 2168 1609   33 2730   92 1697   46   52
  CD4 TEM              0   26    0    0    1    0    0    4    0   53    0    0    0    0
  CD8 Proliferating    0    0    0    0    0    0    0    0    0    0    0    2    0    0
  CD8 TCM              0    0    1    0    0    1   15    0    0    0    0    0    0    0
  CD8 TEM              0    0    0    0    0    0    5    4    0    0    0    6    0    0
  cDC1                 0    0    0    0    0    0    0    1    0    0    0    5    2    0
  cDC2                 2    0    0    0    0    0    0    0    1    0    0   44    4    2
  dnT                  1    0    0    0    0    0    0    8    0    0    0    6    0    0
  HSPC               987    0   29    9    1   59   37    8  633    0    1   10   31    0
  NK Proliferating   132    0    0  318 2496    3   53  107    7    5   23    5   12    0
  Treg                 0    0    0    0    0    0    2   41    0    0    1    1    0    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
  L1          6    4  187  456   22   89 1926 2636    1   18    2  476    2    0
  L2          3    0   22  537 4224    9 1016  101    1    5    0   14    3    0
  L3          8    0 2624   28    2 3228  204   49   12    0   53  134   85    1
  L4          0    0 1681   44    1  681  118   34    2    1 2720  641   82    2
  L5       1721    0   98  416    2   29  232   34 3032    0    8  181  269    0
  L6       2545    0   46 1557    2   60  110  175   31    0    0  547   75    0
  L7       2802    0  127 1242    6   28  155   68  174    0    1  683   45    0
  PBMC        1 2303    0    0   16    2   37  434    0 2302    2   37    5   32
  PBMC_10x    1 2590    0    0    0    0    4  158    0  725    0    5    0   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()
Avis : Could not find CD45RO in the default search locations, found in 'ADT' assay insteadAvis : 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 = "../0-R_Objects/CD4Tcells_harmony_integrated_0.5_theta_patientorigin_cell_line.Robj")
LS0tCnRpdGxlOiAiSGFybW9ueSBpbnRlZ3JhdGlvbnMgb2YgUEJNQzEweCBieSBwYXRpZW50IG9yaWdpbiBhbmQgY2VsbF9saW5lLXRoZXRhLTAuNSBib3RoIgphdXRob3I6IE5hc2lyIE1haG1vb2QgQWJiYXNpCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogICNybWRmb3JtYXRzOjpyZWFkdGhlZG93bgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCgojIDEuIGxvYWQgbGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShTZXVyYXRXcmFwcGVycykKbGlicmFyeShTZXVyYXRPYmplY3QpCmxpYnJhcnkoU2V1cmF0RGF0YSkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoaGFybW9ueSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJldGljdWxhdGUpCmxpYnJhcnkoQXppbXV0aCkKbGlicmFyeShkcGx5cikKbGlicmFyeShSdHNuZSkKbGlicmFyeShoYXJtb255KQoKCmBgYAoKCgoKIyAyLiBMb2FkIFNldXJhdCBPYmplY3QgCmBgYHtyIGxvYWRfc2V1cmF0LCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KCiNMb2FkIFNldXJhdCBPYmplY3QgbWVyZ2VkIGZyb20gY2VsbCBsaW5lcyBhbmQgYSBjb250cm9sIGFmdGVyIGZpbHRyYXRpb24KbG9hZCgiLi4vMC1SX09iamVjdHMvQ0Q0VGNlbGxzX1NDVG5vcm1hbGl6ZWRfZG9uZV9vbl9IUENfaW5sdWRpbmdfUGF0aWVudF9vcmlnaW4ucm9iaiIpCgoKCiMgVmlzdWFsaXplIGJlZm9yZSBIYXJtb255IGludGVncmF0aW9uCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gIlBhdGllbnRfb3JpZ2luIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQ2VsbCBMaW5lIikKCgpiZWZvcmUgPC0gRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQ2VsbCBMaW5lIikKCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLCAKICAgICAgICAgICAgICBncm91cC5ieSA9ICJjZWxsX2xpbmUiLAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgbGFiZWwuYm94ID0gVFJVRSkgKyAKICAgICAgZ2d0aXRsZSgiQmVmb3JlIEhhcm1vbnkgLSBCeSBDZWxsIExpbmUiKQoKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gIlNDVF9zbm5fcmVzLjAuNSIsCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFKSArIAogICAgICBnZ3RpdGxlKCJCZWZvcmUgSGFybW9ueSAtIEJ5IENsdXN0ZXJzIikKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMSIsCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFKSArIAogICAgICBnZ3RpdGxlKCJCZWZvcmUgSGFybW9ueSAtIEJ5IEFubm90YXRpb24ubDEiKQoKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMiIsCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFKSArIAogICAgICBnZ3RpdGxlKCJCZWZvcmUgSGFybW9ueSAtIEJ5IEFubm90YXRpb24ubDIiKQoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwzIiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkJlZm9yZSBIYXJtb255IC0gQnkgQW5ub3RhdGlvbi5sMyIpCgoKdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMiwgQWxsX3NhbXBsZXNfTWVyZ2VkJFNDVF9zbm5fcmVzLjAuNSkKCgpgYGAKCgojIDMuICBQZXJmb3JtIEhhcm1vbnkgSW50ZWdyYXRpb24KYGBge3IgaGFybW9ueS1pbnRlZ3JhdGlvbiwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTJ9CgojIFBlcmZvcm0gSGFybW9ueSBpbnRlZ3JhdGlvbgpBbGxfc2FtcGxlc19NZXJnZWQgPC0gUnVuSGFybW9ueShBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5ieS52YXJzID0gYygiUGF0aWVudF9vcmlnaW4iLCAiY2VsbF9saW5lIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y3Rpb24udXNlID0gInBjYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0udXNlID0gMToxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhldGEgPSBjKDAuNSwgMC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkudXNlID0gIlNDVCIpCgojIENoZWNrIGlmIEhhcm1vbnkgaW50ZWdyYXRpb24gcmFuIHN1Y2Nlc3NmdWxseQpwcmludChuYW1lcyhBbGxfc2FtcGxlc19NZXJnZWRAcmVkdWN0aW9ucykpICAjIFNob3VsZCBpbmNsdWRlICJoYXJtb255IgoKIyBGaW5kIG5laWdoYm9ycyB1c2luZyB0aGUgSGFybW9ueSByZWR1Y3Rpb24gYW5kIGV4cGxpY2l0bHkgbmFtZSB0aGUgZ3JhcGgKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIEZpbmROZWlnaGJvcnMoQWxsX3NhbXBsZXNfTWVyZ2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAiaGFybW9ueSIsICAgIyBIYXJtb255IHJlZHVjdGlvbiB1c2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOjE1LCAgICAgICAgICAgICAjIFVzZSBmaXJzdCAxNSBkaW1lbnNpb25zIG9mIHRoZSBIYXJtb255IHJlZHVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaC5uYW1lID0gImhhcm1vbnlfc25uIikgICMgRXhwbGljaXRseSBuYW1lIHRoZSBncmFwaAoKIyBDaGVjayBpZiB0aGUgImhhcm1vbnlfc25uIiBncmFwaCBpcyBwcmVzZW50CnByaW50KG5hbWVzKEFsbF9zYW1wbGVzX01lcmdlZEBncmFwaHMpKSAgIyBTaG91bGQgbm93IGluY2x1ZGUgImhhcm1vbnlfc25uIgoKCiMgRmluZCBjbHVzdGVycyBmb3IgZWFjaCByZXNvbHV0aW9uIGFuZCBzdG9yZSB0aGVtCnJlc29sdXRpb25zIDwtIGMoMC4xLCAwLjIsIDAuMywgMC40LCAwLjUsIDAuNiwgMC43LCAwLjgsIDAuOSwgMSwgMS4yKQpmb3IgKHJlcyBpbiByZXNvbHV0aW9ucykgewogIGNsdXN0ZXJfbmFtZSA8LSBwYXN0ZTAoImhhcm1vbnlfcmVzXyIsIHJlcykgICMgRHluYW1pYyBjbHVzdGVyIG5hbWUKICBBbGxfc2FtcGxlc19NZXJnZWQgPC0gRmluZENsdXN0ZXJzKAogICAgb2JqZWN0ID0gQWxsX3NhbXBsZXNfTWVyZ2VkLAogICAgZ3JhcGgubmFtZSA9ICJoYXJtb255X3NubiIsICAgICAgICAgICAgICAgIyBHcmFwaCBjcmVhdGVkIGluIEZpbmROZWlnaGJvcnMKICAgIHJlc29sdXRpb24gPSByZXMsICAgICAgICAgICAgICAgICAgICAgICAgICMgUmVzb2x1dGlvbiBmb3IgY2x1c3RlcmluZwogICAgdmVyYm9zZSA9IEZBTFNFCiAgKQogICMgQWRkIGNsdXN0ZXIgaWRlbnRpdGllcyB0byBtZXRhZGF0YQogIEFsbF9zYW1wbGVzX01lcmdlZFtbY2x1c3Rlcl9uYW1lXV0gPC0gSWRlbnRzKEFsbF9zYW1wbGVzX01lcmdlZCkKfQoKIyBSdW4gVU1BUCBvbiB0aGUgbmV3IEhhcm1vbnkgcmVkdWN0aW9uCkFsbF9zYW1wbGVzX01lcmdlZCA8LSBSdW5VTUFQKEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJoYXJtb255IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOjE1KQoKCmBgYAoKIyA0LiAgVmlzdWFsaXplIEhhcm1vbnkgSW50ZWdyYXRlZCBEYXRhCmBgYHtyIGhhcm1vbnktdmlzdWFsaXphdGlvbjEsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQoKIyBWaXN1YWxpemF0aW9uIGFmdGVyIEhhcm1vbnkKCiMgQnkgY2VsbCBsaW5lCnAzIDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gImNlbGxfbGluZSIsCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFKSArIAogICAgICBnZ3RpdGxlKCJBZnRlciBIYXJtb255IC0gQnkgQ2VsbCBMaW5lIikKCiMgQnkgY2x1c3RlcnMKcDQgPC0gRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgICAgICAgICAgICAgZ3JvdXAuYnkgPSAiaGFybW9ueV9yZXNfMC43IiwKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUpICsgCiAgICAgIGdndGl0bGUoIkFmdGVyIEhhcm1vbnkgLSBCeSBDbHVzdGVycyIpCgojIEJ5IGNlbGwgdHlwZSBhbm5vdGF0aW9ucwpwNSA8LSBEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLCAKICAgICAgICAgICAgICBncm91cC5ieSA9ICJwcmVkaWN0ZWQuY2VsbHR5cGUubDIiLAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgbGFiZWwuYm94ID0gVFJVRSkgKyAKICAgICAgZ2d0aXRsZSgiQWZ0ZXIgSGFybW9ueSAtIENlbGwgVHlwZSBBbm5vdGF0aW9ucyIpCgojIFByaW50IGNvbXBhcmlzb24gcGxvdHMKcDMgKyBwNApwcmludChwNSkKCmFmdGVyIDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImNlbGxfbGluZSIsIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCwgcmVwZWwgPSBUKSArIAogIGdndGl0bGUoIkhhcm1vbnkgSW50ZWdyYXRpb24gLSBCeSBDZWxsIExpbmUiKQoKYmVmb3JlfGFmdGVyCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJjZWxsX2xpbmUiLCBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQsIHJlcGVsID0gVCkgKyAKICBnZ3RpdGxlKCJIYXJtb255IEludGVncmF0aW9uIC0gQnkgQ2VsbCBMaW5lIikKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiaGFybW9ueV9yZXNfMC43IixsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQsIHJlcGVsID0gVCkgKyAKICBnZ3RpdGxlKCJIYXJtb255IEludGVncmF0aW9uIC0gQnkgQ2x1c3RlcnMiKQpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJwcmVkaWN0ZWQuY2VsbHR5cGUubDIiLGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCwgcmVwZWwgPSBUKSArIAogIGdndGl0bGUoIkhhcm1vbnkgSW50ZWdyYXRpb24gLSBBbm5vdGF0aW9ucyIpCgp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkY2VsbF9saW5lKQoKdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMiwgQWxsX3NhbXBsZXNfTWVyZ2VkJGhhcm1vbnlfcmVzXzAuNykKCmBgYAoKIyMgIFZpc3VhbGl6ZSBIYXJtb255IEludGVncmF0ZWQgRGF0YSBkaXN0cmlidXRpb24KYGBge3IgaGFybW9ueS10YWJsZXMsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQoKCnRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRwcmVkaWN0ZWQuY2VsbHR5cGUubDIsIEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUpCgp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkaGFybW9ueV9yZXNfMC43KQoKdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJGNlbGxfbGluZSwgQWxsX3NhbXBsZXNfTWVyZ2VkJGhhcm1vbnlfcmVzXzAuNykKCmBgYAojIDUuICBNYXJrZXIgR2VuZSBWaXN1YWxpemF0aW9uCmBgYHtyIGZlYXR1cmVwbG90LWhhcm1vbnkxLCBmaWcuaGVpZ2h0PTE0LCBmaWcud2lkdGg9MTh9CgoKIyBTZXQgbWFya2VyIGdlbmVzIHNwZWNpZmljIHRvIHJlcXVlc3RlZCBpbW11bmUgY2VsbCB0eXBlcwpteWZlYXR1cmVzMSA8LSBjKCJDRDE5IiwgIkNENzlBIiwgIk1TNEExIiwgIyBCIGNlbGxzCiAgICAgICAgICAgICAgICAiQ0QxNCIsICJMWVoiLCAiRkNHUjNBIiwgIyBNb25vY3l0ZXMKICAgICAgICAgICAgICAgICJDU0YxUiIsICJDRDY4IiwgIyBNYWNyb3BoYWdlcwogICAgICAgICAgICAgICAgIk5LRzciLCAiR05MWSIsICJLSVIzREwxIiwgIyBOSyBjZWxscwogICAgICAgICAgICAgICAgIk1LSTY3IiwgIyBQcm9saWZlcmF0aW5nIE5LIGNlbGxzCiAgICAgICAgICAgICAgICAiQ0QzNCIsICJLSVQiLCAjIEhTUENzCiAgICAgICAgICAgICAgICAiQ0QzRSIsICJDQ1I3IiwgIyBUIGNlbGxzCiAgICAgICAgICAgICAgICAiU0VMTCIsICJDRDQ1Uk8iLCAjIFRuYWl2ZSwgVGNtCiAgICAgICAgICAgICAgICAiQ0Q0NCIsICJDRDQ1UkEiKSAjIFRlbSwgVGVtcmEKCmNkNF9mZWF0dXJlX3Bsb3QxIDwtIEZlYXR1cmVQbG90KAogIEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgZmVhdHVyZXMgPSBteWZlYXR1cmVzMSwgCiAgcmVkdWN0aW9uID0gInVtYXAiLCAKICBuY29sID0gNAopICsgCiAgZ2d0aXRsZSgiQ0Q0IFQgQ2VsbCBNYXJrZXIgRXhwcmVzc2lvbiAtIEhhcm1vbnkgSW50ZWdyYXRpb24iKSArCiAgTm9MZWdlbmQoKQoKIyBEaXNwbGF5IHRoZSBwbG90CnByaW50KGNkNF9mZWF0dXJlX3Bsb3QxKQoKIyBEZWZpbmUgbWFya2VycyBzcGVjaWZpYyB0byBDRDQgVCBjZWxscyBhbmQgdGhlaXIgc3Vic2V0cwpjZDRfbWFya2VycyA8LSBjKAogICJDRDQiLCAgICAgICAgICAjIEdlbmVyYWwgQ0Q0IFQgY2VsbHMKICAiSUw3UiIsICAgICAgICAgIyBOYWl2ZSBUIGNlbGxzCiAgIkNDUjciLCAgICAgICAgICMgVCBjZW50cmFsIG1lbW9yeSAoVGNtKSBjZWxscwogICJTRUxMIiwgICAgICAgICAjIFQgbmFpdmUgY2VsbHMKICAiRk9YUDMiLCAgICAgICAgIyBSZWd1bGF0b3J5IFQgY2VsbHMgKFRyZWdzKQogICJJTDJSQSIsICAgICAgICAjIEFjdGl2YXRlZCBUIGNlbGxzCiAgIlBEQ0QxIiwgICAgICAgICMgRXhoYXVzdGVkIFQgY2VsbHMKICAiTEFHMyIsICAgICAgICAgIyBFeGhhdXN0ZWQgVCBjZWxscwogICJUSUdJVCIsICAgICAgICAjIEV4aGF1c3RlZCBUIGNlbGxzCiAgIkdBVEEzIiwgICAgICAgICMgVGgyIGNlbGxzCiAgIlRCWDIxIiwgICAgICAgICMgVGgxIGNlbGxzCiAgIlJPUkMiLCAgICAgICAgICMgVGgxNyBjZWxscwogICJCQ0w2IiAgICAgICAgICAjIFQgZm9sbGljdWxhciBoZWxwZXIgKFRmaCkgY2VsbHMKKQoKIyBWaXN1YWxpemUgbWFya2VyIGdlbmVzIGZvciBDRDQgVCBjZWxscwpjZDRfZmVhdHVyZV9wbG90MiA8LSBGZWF0dXJlUGxvdCgKICBBbGxfc2FtcGxlc19NZXJnZWQsIAogIGZlYXR1cmVzID0gY2Q0X21hcmtlcnMsIAogIHJlZHVjdGlvbiA9ICJ1bWFwIiwgCiAgbmNvbCA9IDQKKSArIAogIGdndGl0bGUoIkNENCBUIENlbGwgTWFya2VyIEV4cHJlc3Npb24gLSBIYXJtb255IEludGVncmF0aW9uIikgKwogIE5vTGVnZW5kKCkKCiMgRGlzcGxheSB0aGUgcGxvdApwcmludChjZDRfZmVhdHVyZV9wbG90MikKYGBgCgojIyAgQ0Q0IFQgQ2VsbCBNYXJrZXIgVmlzdWFsaXphdGlvbgpgYGB7ciBmZWF0dXJlcGxvdC1oYXJtb255MiwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTE2fQojIFNldCBtYXJrZXIgZ2VuZXMgc3BlY2lmaWMgdG8gQ0Q0IFQgY2VsbCBiaW9sb2d5IGFuZCBzdGF0ZXMKY2Q0X21hcmtlcnMgPC0gYygKICAgICMgQ29yZSBUIGNlbGwgbWFya2VycwogICAgIkNEM0UiLCAgICAgIyBUIGNlbGwgbWFya2VyCiAgICAiQ0Q0IiwgICAgICAjIENENCBUIGNlbGwgbWFya2VyCiAgICAKICAgICMgTmFpdmUvTWVtb3J5IG1hcmtlcnMKICAgICJDQ1I3IiwgICAgICMgTmFpdmUvQ2VudHJhbCBtZW1vcnkKICAgICJTRUxMIiwgICAgICMgTC1zZWxlY3RpbiwgbmFpdmUgbWFya2VyCiAgICAiQ0QyNyIsICAgICAjIE1lbW9yeSBtYXJrZXIKICAgICJJTDdSIiwgICAgICMgTmFpdmUvTWVtb3J5IG1hcmtlcgogICAgCiAgICAjIEFjdGl2YXRpb24vU3RhdGUgbWFya2VycwogICAgIklMMlJBIiwgICAgIyBDRDI1LCBhY3RpdmF0aW9uIG1hcmtlcgogICAgIkNENjkiLCAgICAgIyBFYXJseSBhY3RpdmF0aW9uCiAgICAiSExBLURSQSIsICAjIEFjdGl2YXRpb24gbWFya2VyCiAgICAKICAgICMgRXhoYXVzdGlvbiBtYXJrZXJzCiAgICAiUERDRDEiLCAgICAjIFBELTEKICAgICJMQUczIiwgICAgICMgRXhoYXVzdGlvbiBtYXJrZXIKICAgICJUSUdJVCIsICAgICMgRXhoYXVzdGlvbiBtYXJrZXIKICAgIAogICAgIyBSZWd1bGF0b3J5IFQgY2VsbCBtYXJrZXJzCiAgICAiRk9YUDMiLCAgICAjIFRyZWcgbWFya2VyCiAgICAiSUwyUkEiLCAgICAjIENEMjUsIFRyZWcgbWFya2VyCiAgICAiQ1RMQTQiLCAgICAjIFRyZWcvZXhoYXVzdGlvbiBtYXJrZXIKICAgIAogICAgIyBFZmZlY3Rvci9GdW5jdGlvbiBtYXJrZXJzCiAgICAiSUwyIiwgICAgICAjIFQgY2VsbCBmdW5jdGlvbgogICAgIklGTkciLCAgICAgIyBUaDEKICAgICJJTDQiLCAgICAgICMgVGgyCiAgICAiSUwxMyIsICAgICAjIFRoMgogICAgIklMMTdBIiAgICAgIyBUaDE3CikKCiMgQ3JlYXRlIGZlYXR1cmUgcGxvdHMgd2l0aCBiZXR0ZXIgdmlzdWFsaXphdGlvbgpGZWF0dXJlUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICBmZWF0dXJlcyA9IGNkNF9tYXJrZXJzLCAKICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLCAKICAgICAgICAgICAgbmNvbCA9IDQsCiAgICAgICAgICAgIHB0LnNpemUgPSAwLjEsICAgICAgICAgICAjIFNtYWxsZXIgcG9pbnQgc2l6ZSBmb3IgYmV0dGVyIHJlc29sdXRpb24KICAgICAgICAgICAgbWluLmN1dG9mZiA9ICJxMSIsICAgICAgICMgUmVtb3ZlIGJvdHRvbSAxJSBvZiBleHByZXNzaW9uCiAgICAgICAgICAgIG1heC5jdXRvZmYgPSAicTk5IiwgICAgICAjIFJlbW92ZSB0b3AgMSUgb2YgZXhwcmVzc2lvbgogICAgICAgICAgICBvcmRlciA9IFRSVUUpICsgICAgICAgICAgIyBQbG90IGhpZ2hlc3QgZXhwcmVzc2luZyBjZWxscyBvbiB0b3AKICAgIGdndGl0bGUoIkNENCBUIENlbGwgTWFya2VyIEV4cHJlc3Npb24gLSBIYXJtb255IEludGVncmF0aW9uIikgKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpKSArCiAgICBOb0xlZ2VuZCgpCgojIE9wdGlvbmFsOiBBZGQgdmlvbGluIHBsb3RzIHRvIHNlZSBleHByZXNzaW9uIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgY2x1c3RlcnMKVmxuUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgIGZlYXR1cmVzID0gY2Q0X21hcmtlcnNbMToyMF0sICMgRmlyc3QgOCBtYXJrZXJzCiAgICAgICAgc3RhY2sgPSBUUlVFLAogICAgICAgIGZsaXAgPSBUUlVFKSArCiAgICAgICAgZ2d0aXRsZSgiQ0Q0IFQgQ2VsbCBNYXJrZXIgRGlzdHJpYnV0aW9uIEFjcm9zcyBDbHVzdGVycyIpCgoKYGBgCgoKIyA2LiBTYXZlIHRoZSBTZXVyYXQgb2JqZWN0IGFzIGFuIFJvYmogZmlsZQpgYGB7ciBzYXZlUk9CSn0KCnNhdmUoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmaWxlID0gIi4uLzAtUl9PYmplY3RzL0NENFRjZWxsc19oYXJtb255X2ludGVncmF0ZWRfMC41X3RoZXRhX3BhdGllbnRvcmlnaW5fY2VsbF9saW5lLlJvYmoiKQoKYGBgCgoKCgo=