1. load libraries

#Differential Expression Analysis # 2. load seurat object

#Load Seurat Object L7
load("../../../0-IMP-OBJECTS/Harmony_integrated_All_samples_Merged_with_PBMC10x_with_harmony_clustering.Robj")


All_samples_Merged
An object of class Seurat 
64169 features across 59355 samples within 6 assays 
Active assay: SCT (27417 features, 3000 variable features)
 3 layers present: counts, data, scale.data
 5 other assays present: RNA, ADT, prediction.score.celltype.l1, prediction.score.celltype.l2, prediction.score.celltype.l3
 6 dimensional reductions calculated: integrated_dr, ref.umap, pca, umap, harmony, umap.harmony
DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "cell_line",label = T, label.box = T)

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "Harmony_snn_res.0.9",label = T, label.box = T)

#Celltype tables based on cluster

3. celltype_l1

# Create a table of clusters vs. cell types
cluster_celltype_l1_table <- table(All_samples_Merged$Harmony_snn_res.0.9, All_samples_Merged$predicted.celltype.l1)

# View the table
print(cluster_celltype_l1_table)
    
        B CD4 T CD8 T   DC Mono   NK other other T
  0     1  4659  1439    0    0    0     0      15
  1     4  5215     1    1    2    0     0       0
  2     1  4357     0    0    2    9    54       0
  3     0  1910     1    0    0 2373     0       0
  4     0  3545     0    3    0    5   703       0
  5     4  3580   285    0    1    0     0      31
  6   212  3441    13   69   35    8    30       5
  7     8  3041     0    5    0    6   751       0
  8     0  3277    15    1    9  443     0       0
  9     0  3198     0    0    0  218   197       0
  10    1  3035    12    0   19    0     2       1
  11   18    19     1  194 2627    0     7       0
  12 2109    77     5    0    0    1     2       0
  13    1  1953     0    0    1   15     0       0
  14    2    87   416    0    0  534     5     304
  15   19    33     1    0  831    1     1       2
  16    1   826     0    0    0   38     1       0
  17   18   475    24    1  218    6     2      13
  18    0   627     9    0    6    0     6       0
  19   15   542     0    6    0   11    38       0
  20    5   480    18    0    0   42     7      20
  21    7    24     2    2  183    5     0       2
  22    7     9     0   72    4    0     2       0
  23    1     0     1    0    3    1    37       0
  24    0    13     1    0    0    0     5       0
# Save the table as a CSV file
write.csv(cluster_celltype_l1_table, "cluster_celltype_l1_table.csv")


# Load the pheatmap library
library(pheatmap)

# Generate the cluster-cell type table
cluster_celltype_l1_table <- table(All_samples_Merged$Harmony_snn_res.0.9, All_samples_Merged$predicted.celltype.l1)

# Convert the table to a numeric matrix
cluster_celltype_l1_matrix <- as.matrix(cluster_celltype_l1_table)

# Create the heatmap
pheatmap(cluster_celltype_l1_matrix,
         cluster_rows = TRUE,   # Cluster rows (clusters)
         cluster_cols = TRUE,   # Cluster columns (cell types)
         display_numbers = TRUE, # Display cell counts in the heatmap
         color = colorRampPalette(c("white", "red"))(50), # Color gradient
         main = "Cluster vs Cell Type (L1) Heatmap")

# Save the heatmap as a PNG
png("cluster_celltype_l1_heatmap.png", width = 800, height = 600)

pheatmap(cluster_celltype_l1_matrix,
         cluster_rows = TRUE,
         cluster_cols = TRUE,
         display_numbers = TRUE,
         color = colorRampPalette(c("white", "red"))(50),
         main = "Cluster vs Cell Type (l1) Heatmap")
dev.off()
png 
  3 
# Save the heatmap as a PDF
pdf("cluster_celltype_l1_heatmap.pdf", width = 10, height = 8)

pheatmap(cluster_celltype_l1_matrix,
         cluster_rows = TRUE,
         cluster_cols = TRUE,
         display_numbers = TRUE,
         color = colorRampPalette(c("white", "red"))(50),
         main = "Cluster vs Cell Type (l1) Heatmap")
dev.off()
png 
  3 

##. celltype_l2


# Create a table of clusters vs. cell types
cluster_celltype_l2_table <- table(All_samples_Merged$Harmony_snn_res.0.9, All_samples_Merged$predicted.celltype.l2)

# View the table
print(cluster_celltype_l2_table)
    
     ASDC B intermediate B memory B naive CD14 Mono CD16 Mono CD4 CTL CD4 Naive CD4 Proliferating CD4 TCM CD4 TEM CD8 Naive
  0     0              0        1       0         0         0       0      1953                 1    2606       6      1315
  1     0              0        5       0         1         1       0         0              4409     805       0         0
  2     0              0        1       0         2         0       0         0              4338      19       0         0
  3     0              0        0       0         0         0       0         0              1901       8       0         0
  4     0              0        0       0         0         0       0         0              3476      69       0         0
  5     0              1        2       1         1         0       0        35                 6    3290      69        15
  6     0              0      218       0        38         0       0         0              1977    1458       0         0
  7     0              0        7       0         0         0       0         0              2989      52       0         0
  8     0              0        0       0         9         0       0         0              2946     331       0         0
  9     0              0        0       0         0         0       0         0              3183      15       0         0
  10    0              0        0       0        20         0       0         0               402    2643       1         0
  11    3              3        3       7      2522       105       0         0                 1      18       0         0
  12    0            664      260    1170         0         0       0         7                 2      65       0         2
  13    0              0        1       0         1         0       0         0              1846     107       0         0
  14    0              1        0       1         0         0      16         0                 1      53      15         1
  15    0             17        2       0       812        19       0         0                 0      32       0         1
  16    0              0        1       0         0         0       0         0               825       1       0         0
  17    0              4        5       6       218         0       0         6                28     392       3        18
  18    0              0        0       0         6         0       0         0                48     580       0         1
  19    0              2       13       0         0         0       0         0               498      44       0         0
  20    0              2        1       1         0         0       0        40               133     256       0        17
  21    0              0        0       6       183         1       1         1                 0      20       0         2
  22    0              2        2       0         7         0       0         0                 1       3       0         0
  23    0              0        1       0         3         0       0         0                 0       0       0         1
  24    0              0        0       0         0         0       0         1                 0      11       0         0
    
     CD8 Proliferating CD8 TCM CD8 TEM cDC1 cDC2  dnT  gdT HSPC  ILC MAIT   NK NK Proliferating NK_CD56bright  pDC Plasmablast
  0                  0     121       5    0    0    7    9    0    0    0    0                0             0    0           0
  1                  0       1       0    0    0    0    0    1    0    0    0                0             0    0           0
  2                  0       0       0    0    0    0    0   54    0    0    0                9             0    0           0
  3                  0       0       1    0    0    0    0    0    0    0    0             2374             0    0           0
  4                  0       0       0    0    1    0    0  705    0    0    0                5             0    0           0
  5                  0     237      40    0    0   24    6    0    0    8    0                0             0    0           0
  6                  2       0       7    5   47    7    0   37    0    0    0                8             0    0           0
  7                  0       0       0    0    0    0    0  757    0    0    0                6             0    0           0
  8                  0       9       5    0    1    0    0    0    0    0    0              443             0    0           0
  9                  0       0       0    0    0    0    0  197    0    0    0              218             0    0           0
  10                 0       0       0    0    0    1    0    3    0    0    0                0             0    0           0
  11                 0       0       1   13  122    0    0    6    0    0    0                0             0   56           5
  12                 0       2       1    0    0    2    0    1    1    0    1                0             0    0          11
  13                 0       0       0    0    0    0    0    0    0    0    0               15             0    0           0
  14                 0      92     324    0    0    0   77    1    4  228  518                2            14    0           0
  15                 0       0       0    0    0    3    0    0    0    0    1                0             0    0           0
  16                 0       0       0    0    0    0    0    1    0    0    0               38             0    0           0
  17                 0       6       0    0    0   17    0    3    1    1    1                5             0    0           2
  18                 0       7       0    0    0    0    0    6    0    0    0                0             0    0           0
  19                 0       0       0    2    3    0    0   39    0    0    0               11             0    0           0
  20                 0       1       7    1    0   20    1    7    1    3    7               32             2    0           1
  21                 0       0       0    0    2    0    0    0    0    2    6                0             0    0           0
  22                 0       0       0   21   53    0    0    4    0    0    0                0             0    0           0
  23                 0       0       0    0    0    0    0    7    0    0    0                1             0    0           0
  24                 0       1       0    0    0    1    0    5    0    0    0                0             0    0           0
    
     Platelet Treg
  0         0   90
  1         0    0
  2         0    0
  3         0    0
  4         0    0
  5         0  166
  6         0    9
  7         0    0
  8         0    1
  9         0    0
  10        0    0
  11        1    0
  12        0    5
  13        0    0
  14        0    0
  15        1    0
  16        0    0
  17        0   41
  18        0    0
  19        0    0
  20        0   39
  21        0    1
  22        0    1
  23       30    0
  24        0    0
# Save the table as a CSV file
write.csv(cluster_celltype_l2_table, "cluster_celltype_l2_table.csv")


# Load the pheatmap library
library(pheatmap)

# Generate the cluster-cell type table
cluster_celltype_l2_table <- table(All_samples_Merged$Harmony_snn_res.0.9, All_samples_Merged$predicted.celltype.l2)

# Convert the table to a numeric matrix
cluster_celltype_l2_matrix <- as.matrix(cluster_celltype_l2_table)

# Create the heatmap
pheatmap(cluster_celltype_l2_matrix,
         cluster_rows = TRUE,   # Cluster rows (clusters)
         cluster_cols = TRUE,   # Cluster columns (cell types)
         display_numbers = TRUE, # Display cell counts in the heatmap
         color = colorRampPalette(c("white", "red"))(50), # Color gradient
         main = "Cluster vs Cell Type (l2) Heatmap")

# Save the heatmap as a PNG
png("cluster_celltype_l2_heatmap.png", width = 1200, height = 800)

pheatmap(cluster_celltype_l2_matrix,
         cluster_rows = TRUE,
         cluster_cols = TRUE,
         display_numbers = TRUE,
         color = colorRampPalette(c("white", "red"))(50),
         main = "Cluster vs Cell Type (l2) Heatmap")
dev.off()
png 
  3 
# Save the heatmap as a PDF
pdf("cluster_celltype_l2_heatmap.pdf", width = 16, height = 12)

pheatmap(cluster_celltype_l2_matrix,
         cluster_rows = TRUE,
         cluster_cols = TRUE,
         display_numbers = TRUE,
         color = colorRampPalette(c("white", "red"))(50),
         main = "Cluster vs Cell Type (l2) Heatmap")
dev.off()
png 
  3 

##. celltype_l3

# Create a table of clusters vs. cell types
cluster_celltype_l3_table <- table(All_samples_Merged$Harmony_snn_res.0.9, All_samples_Merged$predicted.celltype.l3)

# View the table
print(cluster_celltype_l3_table)
    
     ASDC_pDC B intermediate kappa B intermediate lambda B memory kappa B memory lambda B naive kappa B naive lambda CD14 Mono
  0         0                    0                     0              0               1             0              0         0
  1         0                    0                     0              2               1             0              0         1
  2         0                    0                     0              0               1             0              0         2
  3         0                    0                     0              0               0             0              0         0
  4         0                    0                     0              0               0             0              0         0
  5         0                    0                     2              0               0             0              1         1
  6         0                    0                     6             84              51             0              0        58
  7         0                    0                     0              2               4             0              0         0
  8         0                    0                     0              0               0             0              0         9
  9         0                    0                     0              0               0             0              0         0
  10        0                    0                     0              0               0             0              0        20
  11        3                    0                     3              1               1             6              2      2523
  12        0                  127                   520             78             200           899            266         0
  13        0                    0                     0              1               0             0              0         1
  14        0                    0                     1              0               0             0              1         0
  15        0                    0                    17              1               1             0              0       813
  16        0                    0                     0              1               0             0              0         0
  17        0                    0                     5              0               1             0              6       218
  18        0                    0                     0              0               0             0              0         6
  19        0                    0                     2              1               5             0              0         0
    
     CD16 Mono CD4 CTL CD4 Naive CD4 Proliferating CD4 TCM_1 CD4 TCM_2 CD4 TCM_3 CD4 TEM_1 CD4 TEM_2 CD4 TEM_3 CD8 Naive
  0          0       0      1961                 1      2594         6        11         0         4         2      1247
  1          1       0         0              4409         0       802         2         0         0         0         0
  2          0       0         0              4338         1        18         0         0         0         0         0
  3          0       0         0              1901         0         8         0         0         0         0         0
  4          0       0         0              3476         0        69         0         0         0         0         0
  5          0       0        35                 6      2344       364       559         6        22        47         4
  6          0       0         0              1977         3      1389        58         0         0         0         0
  7          0       0         0              2989         1        51         0         0         0         0         0
  8          0       0         0              2946         1       315        12         0         0         0         0
  9          0       0         0              3183         0        15         0         0         0         0         0
  10         0       0         0               402      1410       527       423         1         0         0         0
  11       105       0         0                 1        16         0         0         0         0         0         0
  12         0       0         9                 2        65         1         2         0         0         0         2
  13         0       0         0              1846         0       107         0         0         0         0         0
  14         0      26         0                 1        12         1        35         5         5         2         0
  15        19       1         0                 0        28         0         3         0         0         0         1
  16         0       0         0               825         0         1         0         0         0         0         0
  17         0       0         6                28       323        44        12         1         3         0         2
  18         0       0         0                49       513        40        12         0         0         0         1
  19         0       0         0               498         8        36         0         0         0         0         0
    
     CD8 Naive_2 CD8 Proliferating CD8 TCM_1 CD8 TCM_2 CD8 TCM_3 CD8 TEM_1 CD8 TEM_2 CD8 TEM_3 CD8 TEM_4 CD8 TEM_5 CD8 TEM_6
  0           64                 0        65        52         3         2         0         0         0         0         3
  1            0                 0         1         0         0         0         0         0         0         0         0
  2            0                 0         0         0         0         0         0         0         0         0         0
  3            0                 0         0         0         0         0         0         0         0         0         1
  4            0                 0         0         0         0         0         0         0         0         0         0
  5           11                 0       151        63        25        35         0         1         0         0         9
  6            2                 2         0         0         1         1         1         0         0         0         3
  7            0                 0         0         0         0         0         0         0         0         0         0
  8            0                 0         3         5         1         0         0         0         0         0         6
  9            0                 0         0         0         0         0         0         0         0         0         0
  10           0                 0         0       281         0         0         0         0         0         0         1
  11           0                 0         0         0         0         0         1         0         0         0         0
  12           0                 0         1         0         1         0         0         0         0         0         0
  13           0                 0         0         0         0         0         0         0         0         0         0
  14           2                 0        31         4        63       119        93        31        14        28        24
  15           0                 0         0         0         0         0         0         0         0         0         0
  16           0                 0         0         0         0         0         0         0         0         0         0
  17          15                 0         2         5         1         0         0         0         0         0         0
  18           0                 0         4        17         0         0         0         0         0         0         0
  19           0                 0         0         0         0         0         0         0         0         0         0
    
     cDC1 cDC2_1 cDC2_2 dnT_2 gdT_1 gdT_3 HSPC  ILC MAIT NK Proliferating NK_1 NK_2 NK_3 NK_4 NK_CD56bright  pDC Plasma
  0     0      0      0     7     0     9    0    0    0                0    0    0    0    0             0    0      0
  1     1      0      1     0     0     0    1    0    0                0    0    0    0    0             0    0      0
  2     0      0      0     0     0     0   54    0    0                9    0    0    0    0             0    0      0
  3     0      0      0     0     0     0    0    0    0             2374    0    0    0    0             0    0      0
  4     0      0      1     0     0     0  705    0    0                5    0    0    0    0             0    0      0
  5     1      0      0    23     0     6    0    0    9                0    0    0    0    0             0    0      0
  6    57      5     45     7     0     0   40    3    0                8    0    0    0    0             0    0      0
  7     1      0      0     0     0     0  757    0    0                6    0    0    0    0             0    0      0
  8     0      0      1     0     0     0    0    0    0              443    0    0    0    0             0    0      0
  9     0      0      0     0     0     0  197    0    0              218    0    0    0    0             0    0      0
  10    0      0      0     1     0     0    3    0    0                0    0    0    0    0             0    0      0
  11   13     38     83     0     0     0    6    1    0                0    0    0    0    0             0   56      5
  12    0      0      0     2     0     0    1    1    0                0    0    1    0    0             0    0     11
  13    0      0      0     0     0     0    0    0    0               15    0    0    0    0             0    0      0
  14    0      0      0     0    84     1    1    4  230                2   46  393   42   33            14    0      0
  15    0      0      0     3     0     0    0    0    0                0    0    0    0    0             0    0      0
  16    0      0      0     0     0     0    1    0    0               38    0    0    0    0             0    0      0
  17    2      0      0    18     0     0    4    1    1                5    1    0    0    0             0    0      2
  18    0      0      0     0     0     0    6    0    0                0    0    0    0    0             0    0      0
  19    7      0      5     0     0     0   39    0    0               11    0    0    0    0             0    0      0
    
     Platelet Treg Memory Treg Naive
  0         0          55         27
  1         0           1          0
  2         0           0          0
  3         0           0          0
  4         0           0          0
  5         0         175          1
  6         0          12          0
  7         0           0          0
  8         0           3          0
  9         0           0          0
  10        0           1          0
  11        1           1          0
  12        0           5          0
  13        0           0          0
  14        0           0          0
  15        1           0          0
  16        0           0          0
  17        0          51          0
  18        0           0          0
  19        0           0          0
 [ getOption("max.print") est atteint -- 5 lignes omises ]
# Save the table as a CSV file
write.csv(cluster_celltype_l3_table, "cluster_celltype_l3_table.csv")


# Load the pheatmap library
library(pheatmap)

# Generate the cluster-cell type table
cluster_celltype_l3_table <- table(All_samples_Merged$Harmony_snn_res.0.9, All_samples_Merged$predicted.celltype.l3)

# Convert the table to a numeric matrix
cluster_celltype_l3_matrix <- as.matrix(cluster_celltype_l3_table)

# Create the heatmap
pheatmap(cluster_celltype_l3_matrix,
         cluster_rows = TRUE,   # Cluster rows (clusters)
         cluster_cols = TRUE,   # Cluster columns (cell types)
         display_numbers = TRUE, # Display cell counts in the heatmap
         color = colorRampPalette(c("white", "red"))(50), # Color gradient
         main = "Cluster vs Cell Type (l3) Heatmap")

# Save the heatmap as a PNG
png("cluster_celltype_l3_heatmap.png", width = 1600, height = 800)

# Create the heatmap
pheatmap(cluster_celltype_l3_matrix,
         cluster_rows = TRUE,   # Cluster rows (clusters)
         cluster_cols = TRUE,   # Cluster columns (cell types)
         display_numbers = TRUE, # Display cell counts in the heatmap
         color = colorRampPalette(c("white", "red"))(50),
         main = "Cluster vs Cell Type (l3) Heatmap")
dev.off()
png 
  3 
# Save the heatmap as a PDF
pdf("cluster_celltype_l3_heatmap.pdf", width = 20, height = 16)

pheatmap(cluster_celltype_l3_matrix,
         cluster_rows = TRUE,
         cluster_cols = TRUE,
         display_numbers = TRUE,
         color = colorRampPalette(c("white", "red"))(50),

         main = "Cluster vs Cell Type (l3) Heatmap")
dev.off()
png 
  3 
LS0tCnRpdGxlOiAiVGFibGVzIG9mIGNlbGx0eXBlcyBiYXNlZCBvbiBjbHVzdGVycyAgaGFybW9ueTAuOSIKYXV0aG9yOiBOYXNpciBNYWhtb29kIEFiYmFzaQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICAjIHBkZl9kb2N1bWVudDogZGVmYXVsdAogICMgd29yZF9kb2N1bWVudDogZGVmYXVsdAogICMgaHRtbF9kb2N1bWVudDogZGVmYXVsdAogICNybWRmb3JtYXRzOjpyZWFkdGhlZG93bgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCiMgMS4gbG9hZCBsaWJyYXJpZXMKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CgpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHBoZWF0bWFwKQpsaWJyYXJ5KGNsdXN0ZXJQcm9maWxlcikKbGlicmFyeShvcmcuSHMuZWcuZGIpCmxpYnJhcnkoZW5yaWNocGxvdCkKbGlicmFyeShlbnJpY2hwbG90KQpsaWJyYXJ5KEVuaGFuY2VkVm9sY2FubykKCmBgYAoKI0RpZmZlcmVudGlhbCBFeHByZXNzaW9uIEFuYWx5c2lzCiMgMi4gbG9hZCBzZXVyYXQgb2JqZWN0CmBgYHtyIGxvYWRfc2V1cmF0fQojTG9hZCBTZXVyYXQgT2JqZWN0IEw3CmxvYWQoIi4uLy4uLy4uLzAtSU1QLU9CSkVDVFMvSGFybW9ueV9pbnRlZ3JhdGVkX0FsbF9zYW1wbGVzX01lcmdlZF93aXRoX1BCTUMxMHhfd2l0aF9oYXJtb255X2NsdXN0ZXJpbmcuUm9iaiIpCgoKQWxsX3NhbXBsZXNfTWVyZ2VkCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsIGdyb3VwLmJ5ID0gImNlbGxfbGluZSIsbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsIGdyb3VwLmJ5ID0gIkhhcm1vbnlfc25uX3Jlcy4wLjkiLGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCmBgYAoKI0NlbGx0eXBlIHRhYmxlcyBiYXNlZCBvbiBjbHVzdGVyCgojIDMuIGNlbGx0eXBlX2wxCmBgYHtyIFQxLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KIyBDcmVhdGUgYSB0YWJsZSBvZiBjbHVzdGVycyB2cy4gY2VsbCB0eXBlcwpjbHVzdGVyX2NlbGx0eXBlX2wxX3RhYmxlIDwtIHRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRIYXJtb255X3Nubl9yZXMuMC45LCBBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwxKQoKIyBWaWV3IHRoZSB0YWJsZQpwcmludChjbHVzdGVyX2NlbGx0eXBlX2wxX3RhYmxlKQoKIyBTYXZlIHRoZSB0YWJsZSBhcyBhIENTViBmaWxlCndyaXRlLmNzdihjbHVzdGVyX2NlbGx0eXBlX2wxX3RhYmxlLCAiY2x1c3Rlcl9jZWxsdHlwZV9sMV90YWJsZS5jc3YiKQoKCiMgTG9hZCB0aGUgcGhlYXRtYXAgbGlicmFyeQpsaWJyYXJ5KHBoZWF0bWFwKQoKIyBHZW5lcmF0ZSB0aGUgY2x1c3Rlci1jZWxsIHR5cGUgdGFibGUKY2x1c3Rlcl9jZWxsdHlwZV9sMV90YWJsZSA8LSB0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkSGFybW9ueV9zbm5fcmVzLjAuOSwgQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMSkKCiMgQ29udmVydCB0aGUgdGFibGUgdG8gYSBudW1lcmljIG1hdHJpeApjbHVzdGVyX2NlbGx0eXBlX2wxX21hdHJpeCA8LSBhcy5tYXRyaXgoY2x1c3Rlcl9jZWxsdHlwZV9sMV90YWJsZSkKCiMgQ3JlYXRlIHRoZSBoZWF0bWFwCnBoZWF0bWFwKGNsdXN0ZXJfY2VsbHR5cGVfbDFfbWF0cml4LAogICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLCAgICMgQ2x1c3RlciByb3dzIChjbHVzdGVycykKICAgICAgICAgY2x1c3Rlcl9jb2xzID0gVFJVRSwgICAjIENsdXN0ZXIgY29sdW1ucyAoY2VsbCB0eXBlcykKICAgICAgICAgZGlzcGxheV9udW1iZXJzID0gVFJVRSwgIyBEaXNwbGF5IGNlbGwgY291bnRzIGluIHRoZSBoZWF0bWFwCiAgICAgICAgIGNvbG9yID0gY29sb3JSYW1wUGFsZXR0ZShjKCJ3aGl0ZSIsICJyZWQiKSkoNTApLCAjIENvbG9yIGdyYWRpZW50CiAgICAgICAgIG1haW4gPSAiQ2x1c3RlciB2cyBDZWxsIFR5cGUgKEwxKSBIZWF0bWFwIikKCiMgU2F2ZSB0aGUgaGVhdG1hcCBhcyBhIFBORwpwbmcoImNsdXN0ZXJfY2VsbHR5cGVfbDFfaGVhdG1hcC5wbmciLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQpwaGVhdG1hcChjbHVzdGVyX2NlbGx0eXBlX2wxX21hdHJpeCwKICAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwKICAgICAgICAgY2x1c3Rlcl9jb2xzID0gVFJVRSwKICAgICAgICAgZGlzcGxheV9udW1iZXJzID0gVFJVRSwKICAgICAgICAgY29sb3IgPSBjb2xvclJhbXBQYWxldHRlKGMoIndoaXRlIiwgInJlZCIpKSg1MCksCiAgICAgICAgIG1haW4gPSAiQ2x1c3RlciB2cyBDZWxsIFR5cGUgKGwxKSBIZWF0bWFwIikKZGV2Lm9mZigpCgojIFNhdmUgdGhlIGhlYXRtYXAgYXMgYSBQREYKcGRmKCJjbHVzdGVyX2NlbGx0eXBlX2wxX2hlYXRtYXAucGRmIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKcGhlYXRtYXAoY2x1c3Rlcl9jZWxsdHlwZV9sMV9tYXRyaXgsCiAgICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsCiAgICAgICAgIGNsdXN0ZXJfY29scyA9IFRSVUUsCiAgICAgICAgIGRpc3BsYXlfbnVtYmVycyA9IFRSVUUsCiAgICAgICAgIGNvbG9yID0gY29sb3JSYW1wUGFsZXR0ZShjKCJ3aGl0ZSIsICJyZWQiKSkoNTApLAogICAgICAgICBtYWluID0gIkNsdXN0ZXIgdnMgQ2VsbCBUeXBlIChsMSkgSGVhdG1hcCIpCmRldi5vZmYoKQoKCgoKYGBgCgoKIyMuIGNlbGx0eXBlX2wyCmBgYHtyIFQyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xNn0KCiMgQ3JlYXRlIGEgdGFibGUgb2YgY2x1c3RlcnMgdnMuIGNlbGwgdHlwZXMKY2x1c3Rlcl9jZWxsdHlwZV9sMl90YWJsZSA8LSB0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkSGFybW9ueV9zbm5fcmVzLjAuOSwgQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMikKCiMgVmlldyB0aGUgdGFibGUKcHJpbnQoY2x1c3Rlcl9jZWxsdHlwZV9sMl90YWJsZSkKCiMgU2F2ZSB0aGUgdGFibGUgYXMgYSBDU1YgZmlsZQp3cml0ZS5jc3YoY2x1c3Rlcl9jZWxsdHlwZV9sMl90YWJsZSwgImNsdXN0ZXJfY2VsbHR5cGVfbDJfdGFibGUuY3N2IikKCgojIExvYWQgdGhlIHBoZWF0bWFwIGxpYnJhcnkKbGlicmFyeShwaGVhdG1hcCkKCiMgR2VuZXJhdGUgdGhlIGNsdXN0ZXItY2VsbCB0eXBlIHRhYmxlCmNsdXN0ZXJfY2VsbHR5cGVfbDJfdGFibGUgPC0gdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJEhhcm1vbnlfc25uX3Jlcy4wLjksIEFsbF9zYW1wbGVzX01lcmdlZCRwcmVkaWN0ZWQuY2VsbHR5cGUubDIpCgojIENvbnZlcnQgdGhlIHRhYmxlIHRvIGEgbnVtZXJpYyBtYXRyaXgKY2x1c3Rlcl9jZWxsdHlwZV9sMl9tYXRyaXggPC0gYXMubWF0cml4KGNsdXN0ZXJfY2VsbHR5cGVfbDJfdGFibGUpCgojIENyZWF0ZSB0aGUgaGVhdG1hcApwaGVhdG1hcChjbHVzdGVyX2NlbGx0eXBlX2wyX21hdHJpeCwKICAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwgICAjIENsdXN0ZXIgcm93cyAoY2x1c3RlcnMpCiAgICAgICAgIGNsdXN0ZXJfY29scyA9IFRSVUUsICAgIyBDbHVzdGVyIGNvbHVtbnMgKGNlbGwgdHlwZXMpCiAgICAgICAgIGRpc3BsYXlfbnVtYmVycyA9IFRSVUUsICMgRGlzcGxheSBjZWxsIGNvdW50cyBpbiB0aGUgaGVhdG1hcAogICAgICAgICBjb2xvciA9IGNvbG9yUmFtcFBhbGV0dGUoYygid2hpdGUiLCAicmVkIikpKDUwKSwgIyBDb2xvciBncmFkaWVudAogICAgICAgICBtYWluID0gIkNsdXN0ZXIgdnMgQ2VsbCBUeXBlIChsMikgSGVhdG1hcCIpCgojIFNhdmUgdGhlIGhlYXRtYXAgYXMgYSBQTkcKcG5nKCJjbHVzdGVyX2NlbGx0eXBlX2wyX2hlYXRtYXAucG5nIiwgd2lkdGggPSAxMjAwLCBoZWlnaHQgPSA4MDApCnBoZWF0bWFwKGNsdXN0ZXJfY2VsbHR5cGVfbDJfbWF0cml4LAogICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgICBjbHVzdGVyX2NvbHMgPSBUUlVFLAogICAgICAgICBkaXNwbGF5X251bWJlcnMgPSBUUlVFLAogICAgICAgICBjb2xvciA9IGNvbG9yUmFtcFBhbGV0dGUoYygid2hpdGUiLCAicmVkIikpKDUwKSwKICAgICAgICAgbWFpbiA9ICJDbHVzdGVyIHZzIENlbGwgVHlwZSAobDIpIEhlYXRtYXAiKQpkZXYub2ZmKCkKCiMgU2F2ZSB0aGUgaGVhdG1hcCBhcyBhIFBERgpwZGYoImNsdXN0ZXJfY2VsbHR5cGVfbDJfaGVhdG1hcC5wZGYiLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSAxMikKcGhlYXRtYXAoY2x1c3Rlcl9jZWxsdHlwZV9sMl9tYXRyaXgsCiAgICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsCiAgICAgICAgIGNsdXN0ZXJfY29scyA9IFRSVUUsCiAgICAgICAgIGRpc3BsYXlfbnVtYmVycyA9IFRSVUUsCiAgICAgICAgIGNvbG9yID0gY29sb3JSYW1wUGFsZXR0ZShjKCJ3aGl0ZSIsICJyZWQiKSkoNTApLAogICAgICAgICBtYWluID0gIkNsdXN0ZXIgdnMgQ2VsbCBUeXBlIChsMikgSGVhdG1hcCIpCmRldi5vZmYoKQoKCgoKYGBgCgojIy4gY2VsbHR5cGVfbDMKYGBge3IgVDMsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTE4fQojIENyZWF0ZSBhIHRhYmxlIG9mIGNsdXN0ZXJzIHZzLiBjZWxsIHR5cGVzCmNsdXN0ZXJfY2VsbHR5cGVfbDNfdGFibGUgPC0gdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJEhhcm1vbnlfc25uX3Jlcy4wLjksIEFsbF9zYW1wbGVzX01lcmdlZCRwcmVkaWN0ZWQuY2VsbHR5cGUubDMpCgojIFZpZXcgdGhlIHRhYmxlCnByaW50KGNsdXN0ZXJfY2VsbHR5cGVfbDNfdGFibGUpCgojIFNhdmUgdGhlIHRhYmxlIGFzIGEgQ1NWIGZpbGUKd3JpdGUuY3N2KGNsdXN0ZXJfY2VsbHR5cGVfbDNfdGFibGUsICJjbHVzdGVyX2NlbGx0eXBlX2wzX3RhYmxlLmNzdiIpCgoKIyBMb2FkIHRoZSBwaGVhdG1hcCBsaWJyYXJ5CmxpYnJhcnkocGhlYXRtYXApCgojIEdlbmVyYXRlIHRoZSBjbHVzdGVyLWNlbGwgdHlwZSB0YWJsZQpjbHVzdGVyX2NlbGx0eXBlX2wzX3RhYmxlIDwtIHRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRIYXJtb255X3Nubl9yZXMuMC45LCBBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwzKQoKIyBDb252ZXJ0IHRoZSB0YWJsZSB0byBhIG51bWVyaWMgbWF0cml4CmNsdXN0ZXJfY2VsbHR5cGVfbDNfbWF0cml4IDwtIGFzLm1hdHJpeChjbHVzdGVyX2NlbGx0eXBlX2wzX3RhYmxlKQoKIyBDcmVhdGUgdGhlIGhlYXRtYXAKcGhlYXRtYXAoY2x1c3Rlcl9jZWxsdHlwZV9sM19tYXRyaXgsCiAgICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsICAgIyBDbHVzdGVyIHJvd3MgKGNsdXN0ZXJzKQogICAgICAgICBjbHVzdGVyX2NvbHMgPSBUUlVFLCAgICMgQ2x1c3RlciBjb2x1bW5zIChjZWxsIHR5cGVzKQogICAgICAgICBkaXNwbGF5X251bWJlcnMgPSBUUlVFLCAjIERpc3BsYXkgY2VsbCBjb3VudHMgaW4gdGhlIGhlYXRtYXAKICAgICAgICAgY29sb3IgPSBjb2xvclJhbXBQYWxldHRlKGMoIndoaXRlIiwgInJlZCIpKSg1MCksICMgQ29sb3IgZ3JhZGllbnQKICAgICAgICAgbWFpbiA9ICJDbHVzdGVyIHZzIENlbGwgVHlwZSAobDMpIEhlYXRtYXAiKQoKIyBTYXZlIHRoZSBoZWF0bWFwIGFzIGEgUE5HCnBuZygiY2x1c3Rlcl9jZWxsdHlwZV9sM19oZWF0bWFwLnBuZyIsIHdpZHRoID0gMTYwMCwgaGVpZ2h0ID0gODAwKQojIENyZWF0ZSB0aGUgaGVhdG1hcApwaGVhdG1hcChjbHVzdGVyX2NlbGx0eXBlX2wzX21hdHJpeCwKICAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwgICAjIENsdXN0ZXIgcm93cyAoY2x1c3RlcnMpCiAgICAgICAgIGNsdXN0ZXJfY29scyA9IFRSVUUsICAgIyBDbHVzdGVyIGNvbHVtbnMgKGNlbGwgdHlwZXMpCiAgICAgICAgIGRpc3BsYXlfbnVtYmVycyA9IFRSVUUsICMgRGlzcGxheSBjZWxsIGNvdW50cyBpbiB0aGUgaGVhdG1hcAogICAgICAgICBjb2xvciA9IGNvbG9yUmFtcFBhbGV0dGUoYygid2hpdGUiLCAicmVkIikpKDUwKSwKICAgICAgICAgbWFpbiA9ICJDbHVzdGVyIHZzIENlbGwgVHlwZSAobDMpIEhlYXRtYXAiKQpkZXYub2ZmKCkKCiMgU2F2ZSB0aGUgaGVhdG1hcCBhcyBhIFBERgpwZGYoImNsdXN0ZXJfY2VsbHR5cGVfbDNfaGVhdG1hcC5wZGYiLCB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNikKcGhlYXRtYXAoY2x1c3Rlcl9jZWxsdHlwZV9sM19tYXRyaXgsCiAgICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsCiAgICAgICAgIGNsdXN0ZXJfY29scyA9IFRSVUUsCiAgICAgICAgIGRpc3BsYXlfbnVtYmVycyA9IFRSVUUsCiAgICAgICAgIGNvbG9yID0gY29sb3JSYW1wUGFsZXR0ZShjKCJ3aGl0ZSIsICJyZWQiKSkoNTApLAoKICAgICAgICAgbWFpbiA9ICJDbHVzdGVyIHZzIENlbGwgVHlwZSAobDMpIEhlYXRtYXAiKQpkZXYub2ZmKCkKCgoKCgpgYGA=