load libraries————————————

1. Load and Subset Normal CD4 T Cells

Idents(All_samples_Merged) <- "seurat_clusters"
table(All_samples_Merged@active.ident)

   0    1    2    3    4    5    6    7    8    9   10   11   12   13 
6789 5275 4663 4661 4086 3634 3536 3409 3338 3273 3212 1675 1063  691 

make sure your labels are present


colnames(scATOMIC_obj@meta.data)
 [1] "orig.ident"                         "nCount_RNA"                        
 [3] "nFeature_RNA"                       "nCount_ADT"                        
 [5] "nFeature_ADT"                       "nUMI"                              
 [7] "ngene"                              "cell_line"                         
 [9] "Patient_origin"                     "Patient_Immunophenotype"           
[11] "condition_of_amplification_in_vivo" "culture_medium"                    
[13] "Stromal_cells"                      "Cell_line_Immunophenotype"         
[15] "TP53_mutation"                      "age_at_diagnosis"                  
[17] "stage_diagnosis"                    "stage_analysis"                    
[19] "Treatments_analysis"                "TCRVB2"                            
[21] "CD3_M"                              "CD30_M"                            
[23] "CCR4_M"                             "CD162_BL"                          
[25] "CD26_BL"                            "CD7_M"                             
[27] "CLA_BD"                             "CD4_BD"                            
[29] "CCR7_M"                             "CD45RO_BD"                         
[31] "CD45RA_BD"                          "CellName"                          
[33] "percent.mt"                         "CD26_BD"                           
[35] "CD45RA_M"                           "predicted.celltype.l1.score"       
[37] "predicted.celltype.l1"              "predicted.celltype.l2.score"       
[39] "predicted.celltype.l2"              "predicted.celltype.l3.score"       
[41] "predicted.celltype.l3"              "mapping.score"                     
[43] "percent.rb"                         "nCount_SCT"                        
[45] "nFeature_SCT"                       "S.Score"                           
[47] "G2M.Score"                          "Phase"                             
[49] "old.ident"                          "CC.Difference"                     
[51] "SCT_snn_res.0.4"                    "SCT_snn_res.0.5"                   
[53] "SCT_snn_res.0.6"                    "SCT_snn_res.0.7"                   
[55] "SCT_snn_res.0.8"                    "seurat_clusters"                   
[57] "harmony_res_0.1"                    "harmony_res_0.2"                   
[59] "harmony_res_0.3"                    "harmony_res_0.4"                   
[61] "harmony_res_0.5"                    "harmony_res_0.6"                   
[63] "harmony_res_0.7"                    "harmony_res_0.8"                   
[65] "harmony_res_0.9"                    "harmony_res_1"                     
[67] "harmony_res_1.2"                    "predicted.celltype.l1_backup"      
[69] "predicted.celltype.l2_backup"       "predicted.celltype.l3_backup"      
[71] "Prediction"                         "Cluster"                           
[73] "Uncertainty_score"                  "Condition"                         
[75] "scATOMIC_pred"                     

Transfer scATOMIC labels into your main object


All_samples_Merged$scATOMIC_annotation <- scATOMIC_obj@meta.data[colnames(All_samples_Merged), "scATOMIC_pred"]

2. Create the annotation summary table


library(dplyr)
library(tidyr)
library(purrr)

methods <- c(
  "predicted.id",             #scPred
  "predicted.celltype.l2",    # Azimuth (l2 prediction)
  "singler.immune",           # Example of other annotation methods like SingleR
  "Prediction",               #STCAT
  "scATOMIC_annotation"      #scATOMIC
  )

annotation_summary <- map_dfr(methods, function(m) {
  df <- All_samples_Merged@meta.data
  df %>%
    group_by(seurat_clusters, label = .data[[m]]) %>%
    summarise(n = n(), .groups = "drop") %>%
    group_by(seurat_clusters) %>%
    slice_max(n, n = 1, with_ties = FALSE) %>%
    mutate(method = m)
})



# Set the order of methods
annotation_summary$method <- factor(annotation_summary$method, levels = methods)

head(annotation_summary)
# Should show columns: seurat_clusters | label | n | method

3. Convert to matrix format for plotting

library(tidyr)
library(ggplot2)

annotation_matrix <- annotation_summary %>%
  select(method, seurat_clusters, label) %>%
  pivot_wider(names_from = seurat_clusters, values_from = label)

# Rename methods for the plot
annotation_summary <- annotation_summary %>%
  mutate(method = recode(method,
                         "predicted.id" = "scPred",
                         "predicted.celltype.l2" = "Azimuth.l2",
                         "singler.immune" = "SingleR(Immune)",
                         "Prediction" = "STCAT",
                         "scATOMIC_annotation" = "scATOMIC"))

#4. Creating a Table for All Annotations


# Summarize the number of cells assigned to each label by method and cell line
annotation_table <- annotation_summary %>%
  group_by(seurat_clusters, method, label) %>%
  summarise(n_cells = n(), .groups = 'drop') %>%
  spread(key = label, value = n_cells, fill = 0)  # Pivot the table to have labels as columns

# Display the summary table
annotation_table

#  Save the table to a CSV file
write.csv(annotation_table, "annotation_summary_table_clusters-5-12-2025.csv", row.names = FALSE)

#5. Plot categorical heatmap (tile plot)


library(ggplot2)

ggplot(annotation_summary, aes(x = seurat_clusters, y = method, fill = label)) +
  geom_tile(color = "white", linewidth = 0.5) +
  scale_fill_discrete() +   # You can assign your own palette later
  labs(
    x = "Sézary cell line",
    y = "Annotation method",
    fill = "Assigned state",
    title = "Cross-method comparison of T-cell state annotations"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.title = element_text(face = "bold")
  )

#6. Plot categorical heatmap (tile plot)


library(RColorBrewer)

num_colors <- length(unique(annotation_summary$label))
my_colors <- colorRampPalette(brewer.pal(8, "Set2"))(num_colors)

ggplot(annotation_summary, aes(x = seurat_clusters, y = method, fill = label)) +
  geom_tile(color = "white", linewidth = 0.5) +
  scale_fill_manual(values = my_colors) +   # 22 or more colors here
  labs(
    x = "Sézary cell line clusters",
    y = "Annotation method",
    fill = "Assigned state",
    title = "Cross-method comparison of T-cell state annotations"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.title = element_text(face = "bold")
  )


library(RColorBrewer)

num_colors <- length(unique(annotation_summary$label))
my_colors <- colorRampPalette(brewer.pal(8, "Set2"))(num_colors)

p <- ggplot(annotation_summary, aes(x = seurat_clusters, y = method, fill = label)) +
  geom_tile(color = "white", linewidth = 0.5) +
  scale_fill_manual(values = my_colors) +
  labs(
    x = "Sézary cell line clusters",
    y = "Annotation method",
    fill = "Assigned state",
    title = "Cross-method comparison of T-cell state annotations"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.title = element_text(face = "bold")
  )
ggsave("annotation_heatmap.png", plot = p, width = 14, height = 6, units = "in", dpi = 300)
ggsave("annotation_heatmap.pdf", plot = p, width = 14, height = 6, units = "in")
LS0tCnRpdGxlOiAiQmVuY2htYXJrIGNlbGwgUHJlZGljdGlvbiBNZXRob2RzLTUtMDEyLTIwMjUgb24gQ2x1c3RlcnMiCmF1dGhvcjogTmFzaXIgTWFobW9vZCBBYmJhc2kKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgI3JtZGZvcm1hdHM6OnJlYWR0aGVkb3duCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0b2NfY29sbGFwc2VkOiB0cnVlCi0tLQoKCiMjIGxvYWQgbGlicmFyaWVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKICAgIGxpYnJhcnkoU2V1cmF0KQogICAgbGlicmFyeShkcGx5cikKICAgIGxpYnJhcnkocGF0Y2h3b3JrKQogICAgbGlicmFyeShnZ3Bsb3QyKQogICAgbGlicmFyeShwaGVhdG1hcCkKICAgIGxpYnJhcnkoc2NQcmVkKQogICAgbGlicmFyeShjZWxsZGV4KQogICAgbGlicmFyeShTaW5nbGVSKQogICAgbGlicmFyeShyZW1vdGVzKQogICAgbGlicmFyeShwcmVzdG8pCiAgICBsaWJyYXJ5KFNldXJhdERpc2spCiAgICBsaWJyYXJ5KFNldXJhdERhdGEpCiAgICBsaWJyYXJ5KEF6aW11dGgpCgpgYGAKCgoKCiMgMS4gTG9hZCBhbmQgU3Vic2V0IE5vcm1hbCBDRDQgVCBDZWxscwpgYGB7ciBsb2FkU2V1cmF0fQoKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIHJlYWRSRFMoIi9ob21lL2Jpb2luZm8vMS1UaGVzaXNfRmluYWxfWWVhcl8yMDI1LzIwMjUtWWVhcjNfQW5hbHlzaXMvMS1zY1JOQV9SRVNVTFRTLTE5LTExLTIwMjUvMy1DRUxMVFlQRV9QUkVESUNUSU9OLTE4LTA5LTIwMjUvQWxsX3NhbXBsZXNfTWVyZ2VkX3dpdGhfYWxsX2Fubm90YXRpb25zX0FUTEFTLTE4LTA5LTIwMjUucmRzIikKCklkZW50cyhBbGxfc2FtcGxlc19NZXJnZWQpIDwtICJzZXVyYXRfY2x1c3RlcnMiCnRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZEBhY3RpdmUuaWRlbnQpCgoKc2NBVE9NSUNfb2JqIDwtIHJlYWRSRFMoIi9ob21lL2Jpb2luZm8vMS1UaGVzaXNfRmluYWxfWWVhcl8yMDI1LzIwMjUtWWVhcjNfQW5hbHlzaXMvMS1zY1JOQV9SRVNVTFRTLTE5LTExLTIwMjUvOS1SVU5fc2NBVE9NSUNfQW5ub3RhdGlvbl9hbmQgTUFDRS0yNC0wOS0yMDI1L0FsbF9zYW1wbGVzX21lcmdlZF9zY0FUT01JQ19TUy9BbGxfc2FtcGxlc19NZXJnZWRfc2NBVE9NSUNfMjYtMDktMjAyNS5yZHMiKQoKYGBgCiMjIG1ha2Ugc3VyZSB5b3VyIGxhYmVscyBhcmUgcHJlc2VudApgYGB7cn0KCmNvbG5hbWVzKHNjQVRPTUlDX29iakBtZXRhLmRhdGEpCgoKYGBgCgoKIyMgVHJhbnNmZXIgc2NBVE9NSUMgbGFiZWxzIGludG8geW91ciBtYWluIG9iamVjdApgYGB7cn0KCkFsbF9zYW1wbGVzX01lcmdlZCRzY0FUT01JQ19hbm5vdGF0aW9uIDwtIHNjQVRPTUlDX29iakBtZXRhLmRhdGFbY29sbmFtZXMoQWxsX3NhbXBsZXNfTWVyZ2VkKSwgInNjQVRPTUlDX3ByZWQiXQoKCgpgYGAKCgoKCiMgMi4gQ3JlYXRlIHRoZSBhbm5vdGF0aW9uIHN1bW1hcnkgdGFibGUKYGBge3J9CgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHB1cnJyKQoKbWV0aG9kcyA8LSBjKAogICJwcmVkaWN0ZWQuaWQiLCAgICAgICAgICAgICAjc2NQcmVkCiAgInByZWRpY3RlZC5jZWxsdHlwZS5sMiIsICAgICMgQXppbXV0aCAobDIgcHJlZGljdGlvbikKICAic2luZ2xlci5pbW11bmUiLCAgICAgICAgICAgIyBFeGFtcGxlIG9mIG90aGVyIGFubm90YXRpb24gbWV0aG9kcyBsaWtlIFNpbmdsZVIKICAiUHJlZGljdGlvbiIsICAgICAgICAgICAgICAgI1NUQ0FUCiAgInNjQVRPTUlDX2Fubm90YXRpb24iICAgICAgI3NjQVRPTUlDCiAgKQoKYW5ub3RhdGlvbl9zdW1tYXJ5IDwtIG1hcF9kZnIobWV0aG9kcywgZnVuY3Rpb24obSkgewogIGRmIDwtIEFsbF9zYW1wbGVzX01lcmdlZEBtZXRhLmRhdGEKICBkZiAlPiUKICAgIGdyb3VwX2J5KHNldXJhdF9jbHVzdGVycywgbGFiZWwgPSAuZGF0YVtbbV1dKSAlPiUKICAgIHN1bW1hcmlzZShuID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgIGdyb3VwX2J5KHNldXJhdF9jbHVzdGVycykgJT4lCiAgICBzbGljZV9tYXgobiwgbiA9IDEsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUKICAgIG11dGF0ZShtZXRob2QgPSBtKQp9KQoKCgojIFNldCB0aGUgb3JkZXIgb2YgbWV0aG9kcwphbm5vdGF0aW9uX3N1bW1hcnkkbWV0aG9kIDwtIGZhY3Rvcihhbm5vdGF0aW9uX3N1bW1hcnkkbWV0aG9kLCBsZXZlbHMgPSBtZXRob2RzKQoKaGVhZChhbm5vdGF0aW9uX3N1bW1hcnkpCiMgU2hvdWxkIHNob3cgY29sdW1uczogc2V1cmF0X2NsdXN0ZXJzIHwgbGFiZWwgfCBuIHwgbWV0aG9kCmBgYAoKCiMgMy4gQ29udmVydCB0byBtYXRyaXggZm9ybWF0IGZvciBwbG90dGluZwpgYGB7cn0KbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQoKYW5ub3RhdGlvbl9tYXRyaXggPC0gYW5ub3RhdGlvbl9zdW1tYXJ5ICU+JQogIHNlbGVjdChtZXRob2QsIHNldXJhdF9jbHVzdGVycywgbGFiZWwpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzZXVyYXRfY2x1c3RlcnMsIHZhbHVlc19mcm9tID0gbGFiZWwpCgojIFJlbmFtZSBtZXRob2RzIGZvciB0aGUgcGxvdAphbm5vdGF0aW9uX3N1bW1hcnkgPC0gYW5ub3RhdGlvbl9zdW1tYXJ5ICU+JQogIG11dGF0ZShtZXRob2QgPSByZWNvZGUobWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgInByZWRpY3RlZC5pZCIgPSAic2NQcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVkaWN0ZWQuY2VsbHR5cGUubDIiID0gIkF6aW11dGgubDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZXIuaW1tdW5lIiA9ICJTaW5nbGVSKEltbXVuZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIlByZWRpY3Rpb24iID0gIlNUQ0FUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJzY0FUT01JQ19hbm5vdGF0aW9uIiA9ICJzY0FUT01JQyIpKQoKCgpgYGAKCiM0LiBDcmVhdGluZyBhIFRhYmxlIGZvciBBbGwgQW5ub3RhdGlvbnMKYGBge3IsZmlnLndpZHRoPTE0LCBmaWcuaGVpZ2h0PTZ9CgojIFN1bW1hcml6ZSB0aGUgbnVtYmVyIG9mIGNlbGxzIGFzc2lnbmVkIHRvIGVhY2ggbGFiZWwgYnkgbWV0aG9kIGFuZCBjZWxsIGxpbmUKYW5ub3RhdGlvbl90YWJsZSA8LSBhbm5vdGF0aW9uX3N1bW1hcnkgJT4lCiAgZ3JvdXBfYnkoc2V1cmF0X2NsdXN0ZXJzLCBtZXRob2QsIGxhYmVsKSAlPiUKICBzdW1tYXJpc2Uobl9jZWxscyA9IG4oKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgc3ByZWFkKGtleSA9IGxhYmVsLCB2YWx1ZSA9IG5fY2VsbHMsIGZpbGwgPSAwKSAgIyBQaXZvdCB0aGUgdGFibGUgdG8gaGF2ZSBsYWJlbHMgYXMgY29sdW1ucwoKIyBEaXNwbGF5IHRoZSBzdW1tYXJ5IHRhYmxlCmFubm90YXRpb25fdGFibGUKCiMgIFNhdmUgdGhlIHRhYmxlIHRvIGEgQ1NWIGZpbGUKd3JpdGUuY3N2KGFubm90YXRpb25fdGFibGUsICJhbm5vdGF0aW9uX3N1bW1hcnlfdGFibGVfY2x1c3RlcnMtNS0xMi0yMDI1LmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQoKCmBgYAoKIzUuIFBsb3QgY2F0ZWdvcmljYWwgaGVhdG1hcCAodGlsZSBwbG90KQpgYGB7cixmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9Nn0KCmxpYnJhcnkoZ2dwbG90MikKCmdncGxvdChhbm5vdGF0aW9uX3N1bW1hcnksIGFlcyh4ID0gc2V1cmF0X2NsdXN0ZXJzLCB5ID0gbWV0aG9kLCBmaWxsID0gbGFiZWwpKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gIndoaXRlIiwgbGluZXdpZHRoID0gMC41KSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZSgpICsgICAjIFlvdSBjYW4gYXNzaWduIHlvdXIgb3duIHBhbGV0dGUgbGF0ZXIKICBsYWJzKAogICAgeCA9ICJTw6l6YXJ5IGNlbGwgbGluZSIsCiAgICB5ID0gIkFubm90YXRpb24gbWV0aG9kIiwKICAgIGZpbGwgPSAiQXNzaWduZWQgc3RhdGUiLAogICAgdGl0bGUgPSAiQ3Jvc3MtbWV0aG9kIGNvbXBhcmlzb24gb2YgVC1jZWxsIHN0YXRlIGFubm90YXRpb25zIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpCiAgKQoKYGBgCgoKIzYuIFBsb3QgY2F0ZWdvcmljYWwgaGVhdG1hcCAodGlsZSBwbG90KQpgYGB7cixmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9Nn0KCmxpYnJhcnkoUkNvbG9yQnJld2VyKQoKbnVtX2NvbG9ycyA8LSBsZW5ndGgodW5pcXVlKGFubm90YXRpb25fc3VtbWFyeSRsYWJlbCkpCm15X2NvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoOCwgIlNldDIiKSkobnVtX2NvbG9ycykKCmdncGxvdChhbm5vdGF0aW9uX3N1bW1hcnksIGFlcyh4ID0gc2V1cmF0X2NsdXN0ZXJzLCB5ID0gbWV0aG9kLCBmaWxsID0gbGFiZWwpKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gIndoaXRlIiwgbGluZXdpZHRoID0gMC41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbXlfY29sb3JzKSArICAgIyAyMiBvciBtb3JlIGNvbG9ycyBoZXJlCiAgbGFicygKICAgIHggPSAiU8OpemFyeSBjZWxsIGxpbmUgY2x1c3RlcnMiLAogICAgeSA9ICJBbm5vdGF0aW9uIG1ldGhvZCIsCiAgICBmaWxsID0gIkFzc2lnbmVkIHN0YXRlIiwKICAgIHRpdGxlID0gIkNyb3NzLW1ldGhvZCBjb21wYXJpc29uIG9mIFQtY2VsbCBzdGF0ZSBhbm5vdGF0aW9ucyIKICApICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArCiAgdGhlbWUoCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKQogICkKCmxpYnJhcnkoUkNvbG9yQnJld2VyKQoKbnVtX2NvbG9ycyA8LSBsZW5ndGgodW5pcXVlKGFubm90YXRpb25fc3VtbWFyeSRsYWJlbCkpCm15X2NvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoOCwgIlNldDIiKSkobnVtX2NvbG9ycykKCnAgPC0gZ2dwbG90KGFubm90YXRpb25fc3VtbWFyeSwgYWVzKHggPSBzZXVyYXRfY2x1c3RlcnMsIHkgPSBtZXRob2QsIGZpbGwgPSBsYWJlbCkpICsKICBnZW9tX3RpbGUoY29sb3IgPSAid2hpdGUiLCBsaW5ld2lkdGggPSAwLjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBteV9jb2xvcnMpICsKICBsYWJzKAogICAgeCA9ICJTw6l6YXJ5IGNlbGwgbGluZSBjbHVzdGVycyIsCiAgICB5ID0gIkFubm90YXRpb24gbWV0aG9kIiwKICAgIGZpbGwgPSAiQXNzaWduZWQgc3RhdGUiLAogICAgdGl0bGUgPSAiQ3Jvc3MtbWV0aG9kIGNvbXBhcmlzb24gb2YgVC1jZWxsIHN0YXRlIGFubm90YXRpb25zIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpCiAgKQpnZ3NhdmUoImFubm90YXRpb25faGVhdG1hcC5wbmciLCBwbG90ID0gcCwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gNiwgdW5pdHMgPSAiaW4iLCBkcGkgPSAzMDApCmdnc2F2ZSgiYW5ub3RhdGlvbl9oZWF0bWFwLnBkZiIsIHBsb3QgPSBwLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSA2LCB1bml0cyA9ICJpbiIpCgpgYGA=