1. load libraries

2. Load Seurat Object


#Load Seurat Object L2
load("../Documents/1-SS-STeps/4-Analysis_and_Robj_Marie/analyse juillet 2023/ObjetsR/L2.Robj")

L2
An object of class Seurat 
36629 features across 5935 samples within 2 assays 
Active assay: RNA (36601 features, 0 variable features)
 2 layers present: counts, data
 1 other assay present: ADT

3. QC

# Set identity classes to an existing column in meta data
Idents(object = L2) <- "cell_line"

L2[["percent.rb"]] <- PercentageFeatureSet(L2, pattern = "^RP[SL]")

VlnPlot(L2, features = c("nFeature_RNA", 
                                         "nCount_RNA", 
                                         "percent.mito",
                                         "percent.rb"), 
                            ncol = 4, pt.size = 0.1) & 
              theme(plot.title = element_text(size=10))


FeatureScatter(L2, feature1 = "percent.mito", 
                                  feature2 = "percent.rb")


VlnPlot(L2, features = c("nFeature_RNA", 
                                    "nCount_RNA", 
                                    "percent.mito"), 
                                      ncol = 3)


FeatureScatter(L2, 
               feature1 = "percent.mito", 
               feature2 = "percent.rb") +
        geom_smooth(method = 'lm')


FeatureScatter(L2, 
               feature1 = "nCount_RNA", 
               feature2 = "nFeature_RNA") +
        geom_smooth(method = 'lm')

##FeatureScatter is typically used to visualize feature-feature relationships ##for anything calculated by the object, ##i.e. columns in object metadata, PC scores etc.


FeatureScatter(L2, 
               feature1 = "nCount_RNA", 
               feature2 = "percent.mito")+
  geom_smooth(method = 'lm')


FeatureScatter(L2, 
               feature1 = "nCount_RNA", 
               feature2 = "nFeature_RNA")+
  geom_smooth(method = 'lm')

Assign Cell-Cycle Scores

Running SCTransform on assay: RNA
vst.flavor='v2' set. Using model with fixed slope and excluding poisson genes.
Calculating cell attributes from input UMI matrix: log_umi
Variance stabilizing transformation of count matrix of size 18709 by 5935
Model formula is y ~ log_umi
Get Negative Binomial regression parameters per gene
Using 2000 genes, 5000 cells
Found 111 outliers - those will be ignored in fitting/regularization step

Second step: Get residuals using fitted parameters for 18709 genes
Computing corrected count matrix for 18709 genes
Calculating gene attributes
Wall clock passed: Time difference of 22.73244 secs
Determine variable features

  |                                                                                                                                
  |                                                                                                                          |   0%
  |                                                                                                                                
  |==============================                                                                                            |  25%
  |                                                                                                                                
  |=============================================================                                                             |  50%
  |                                                                                                                                
  |============================================================================================                              |  75%
  |                                                                                                                                
  |==========================================================================================================================| 100%
Place corrected count matrix in counts slot
Set default assay to SCT
Warning: The following features are not present in the object: MLF1IP, not searching for symbol synonymsWarning: The following features are not present in the object: FAM64A, HN1, not searching for symbol synonyms

4. Normalize data



# Apply SCTransform
L2 <- SCTransform(L2, vars.to.regress = c("percent.rb","percent.mito", "CC.Difference"), 
                  do.scale=TRUE, 
                  do.center=TRUE, 
                  verbose = TRUE)
Running SCTransform on assay: RNA
vst.flavor='v2' set. Using model with fixed slope and excluding poisson genes.
Calculating cell attributes from input UMI matrix: log_umi
Variance stabilizing transformation of count matrix of size 18709 by 5935
Model formula is y ~ log_umi
Get Negative Binomial regression parameters per gene
Using 2000 genes, 5000 cells
Found 111 outliers - those will be ignored in fitting/regularization step

Second step: Get residuals using fitted parameters for 18709 genes
Computing corrected count matrix for 18709 genes
Calculating gene attributes
Wall clock passed: Time difference of 19.31813 secs
Determine variable features
Regressing out percent.rb, percent.mito, CC.Difference

  |                                                                                                                                
  |                                                                                                                          |   0%
  |                                                                                                                                
  |=                                                                                                                         |   0%
  |                                                                                                                                
  |=                                                                                                                         |   1%
  |                                                                                                                                
  |==                                                                                                                        |   1%
  |                                                                                                                                
  |==                                                                                                                        |   2%
  |                                                                                                                                
  |===                                                                                                                       |   2%
  |                                                                                                                                
  |===                                                                                                                       |   3%
  |                                                                                                                                
  |====                                                                                                                      |   3%
  |                                                                                                                                
  |====                                                                                                                      |   4%
  |                                                                                                                                
  |=====                                                                                                                     |   4%
  |                                                                                                                                
  |======                                                                                                                    |   5%
  |                                                                                                                                
  |=======                                                                                                                   |   5%
  |                                                                                                                                
  |=======                                                                                                                   |   6%
  |                                                                                                                                
  |========                                                                                                                  |   6%
  |                                                                                                                                
  |========                                                                                                                  |   7%
  |                                                                                                                                
  |=========                                                                                                                 |   7%
  |                                                                                                                                
  |=========                                                                                                                 |   8%
  |                                                                                                                                
  |==========                                                                                                                |   8%
  |                                                                                                                                
  |==========                                                                                                                |   9%
  |                                                                                                                                
  |===========                                                                                                               |   9%
  |                                                                                                                                
  |============                                                                                                              |   9%
  |                                                                                                                                
  |============                                                                                                              |  10%
  |                                                                                                                                
  |=============                                                                                                             |  10%
  |                                                                                                                                
  |=============                                                                                                             |  11%
  |                                                                                                                                
  |==============                                                                                                            |  11%
  |                                                                                                                                
  |==============                                                                                                            |  12%
  |                                                                                                                                
  |===============                                                                                                           |  12%
  |                                                                                                                                
  |===============                                                                                                           |  13%
  |                                                                                                                                
  |================                                                                                                          |  13%
  |                                                                                                                                
  |================                                                                                                          |  14%
  |                                                                                                                                
  |=================                                                                                                         |  14%
  |                                                                                                                                
  |==================                                                                                                        |  14%
  |                                                                                                                                
  |==================                                                                                                        |  15%
  |                                                                                                                                
  |===================                                                                                                       |  15%
  |                                                                                                                                
  |===================                                                                                                       |  16%
  |                                                                                                                                
  |====================                                                                                                      |  16%
  |                                                                                                                                
  |====================                                                                                                      |  17%
  |                                                                                                                                
  |=====================                                                                                                     |  17%
  |                                                                                                                                
  |=====================                                                                                                     |  18%
  |                                                                                                                                
  |======================                                                                                                    |  18%
  |                                                                                                                                
  |=======================                                                                                                   |  18%
  |                                                                                                                                
  |=======================                                                                                                   |  19%
  |                                                                                                                                
  |========================                                                                                                  |  19%
  |                                                                                                                                
  |========================                                                                                                  |  20%
  |                                                                                                                                
  |=========================                                                                                                 |  20%
  |                                                                                                                                
  |=========================                                                                                                 |  21%
  |                                                                                                                                
  |==========================                                                                                                |  21%
  |                                                                                                                                
  |==========================                                                                                                |  22%
  |                                                                                                                                
  |===========================                                                                                               |  22%
  |                                                                                                                                
  |===========================                                                                                               |  23%
  |                                                                                                                                
  |============================                                                                                              |  23%
  |                                                                                                                                
  |=============================                                                                                             |  23%
  |                                                                                                                                
  |=============================                                                                                             |  24%
  |                                                                                                                                
  |==============================                                                                                            |  24%
  |                                                                                                                                
  |==============================                                                                                            |  25%
  |                                                                                                                                
  |===============================                                                                                           |  25%
  |                                                                                                                                
  |===============================                                                                                           |  26%
  |                                                                                                                                
  |================================                                                                                          |  26%
  |                                                                                                                                
  |================================                                                                                          |  27%
  |                                                                                                                                
  |=================================                                                                                         |  27%
  |                                                                                                                                
  |==================================                                                                                        |  27%
  |                                                                                                                                
  |==================================                                                                                        |  28%
  |                                                                                                                                
  |===================================                                                                                       |  28%
  |                                                                                                                                
  |===================================                                                                                       |  29%
  |                                                                                                                                
  |====================================                                                                                      |  29%
  |                                                                                                                                
  |====================================                                                                                      |  30%
  |                                                                                                                                
  |=====================================                                                                                     |  30%
  |                                                                                                                                
  |=====================================                                                                                     |  31%
  |                                                                                                                                
  |======================================                                                                                    |  31%
  |                                                                                                                                
  |======================================                                                                                    |  32%
  |                                                                                                                                
  |=======================================                                                                                   |  32%
  |                                                                                                                                
  |========================================                                                                                  |  32%
  |                                                                                                                                
  |========================================                                                                                  |  33%
  |                                                                                                                                
  |=========================================                                                                                 |  33%
  |                                                                                                                                
  |=========================================                                                                                 |  34%
  |                                                                                                                                
  |==========================================                                                                                |  34%
  |                                                                                                                                
  |==========================================                                                                                |  35%
  |                                                                                                                                
  |===========================================                                                                               |  35%
  |                                                                                                                                
  |===========================================                                                                               |  36%
  |                                                                                                                                
  |============================================                                                                              |  36%
  |                                                                                                                                
  |=============================================                                                                             |  36%
  |                                                                                                                                
  |=============================================                                                                             |  37%
  |                                                                                                                                
  |==============================================                                                                            |  37%
  |                                                                                                                                
  |==============================================                                                                            |  38%
  |                                                                                                                                
  |===============================================                                                                           |  38%
  |                                                                                                                                
  |===============================================                                                                           |  39%
  |                                                                                                                                
  |================================================                                                                          |  39%
  |                                                                                                                                
  |================================================                                                                          |  40%
  |                                                                                                                                
  |=================================================                                                                         |  40%
  |                                                                                                                                
  |=================================================                                                                         |  41%
  |                                                                                                                                
  |==================================================                                                                        |  41%
  |                                                                                                                                
  |===================================================                                                                       |  41%
  |                                                                                                                                
  |===================================================                                                                       |  42%
  |                                                                                                                                
  |====================================================                                                                      |  42%
  |                                                                                                                                
  |====================================================                                                                      |  43%
  |                                                                                                                                
  |=====================================================                                                                     |  43%
  |                                                                                                                                
  |=====================================================                                                                     |  44%
  |                                                                                                                                
  |======================================================                                                                    |  44%
  |                                                                                                                                
  |======================================================                                                                    |  45%
  |                                                                                                                                
  |=======================================================                                                                   |  45%
  |                                                                                                                                
  |========================================================                                                                  |  46%
  |                                                                                                                                
  |=========================================================                                                                 |  46%
  |                                                                                                                                
  |=========================================================                                                                 |  47%
  |                                                                                                                                
  |==========================================================                                                                |  47%
  |                                                                                                                                
  |==========================================================                                                                |  48%
  |                                                                                                                                
  |===========================================================                                                               |  48%
  |                                                                                                                                
  |===========================================================                                                               |  49%
  |                                                                                                                                
  |============================================================                                                              |  49%
  |                                                                                                                                
  |============================================================                                                              |  50%
  |                                                                                                                                
  |=============================================================                                                             |  50%
  |                                                                                                                                
  |==============================================================                                                            |  50%
  |                                                                                                                                
  |==============================================================                                                            |  51%
  |                                                                                                                                
  |===============================================================                                                           |  51%
  |                                                                                                                                
  |===============================================================                                                           |  52%
  |                                                                                                                                
  |================================================================                                                          |  52%
  |                                                                                                                                
  |================================================================                                                          |  53%
  |                                                                                                                                
  |=================================================================                                                         |  53%
  |                                                                                                                                
  |=================================================================                                                         |  54%
  |                                                                                                                                
  |==================================================================                                                        |  54%
  |                                                                                                                                
  |==================================================================                                                        |  55%
  |                                                                                                                                
  |===================================================================                                                       |  55%
  |                                                                                                                                
  |====================================================================                                                      |  55%
  |                                                                                                                                
  |====================================================================                                                      |  56%
  |                                                                                                                                
  |=====================================================================                                                     |  56%
  |                                                                                                                                
  |=====================================================================                                                     |  57%
  |                                                                                                                                
  |======================================================================                                                    |  57%
  |                                                                                                                                
  |======================================================================                                                    |  58%
  |                                                                                                                                
  |=======================================================================                                                   |  58%
  |                                                                                                                                
  |=======================================================================                                                   |  59%
  |                                                                                                                                
  |========================================================================                                                  |  59%
  |                                                                                                                                
  |=========================================================================                                                 |  59%
  |                                                                                                                                
  |=========================================================================                                                 |  60%
  |                                                                                                                                
  |==========================================================================                                                |  60%
  |                                                                                                                                
  |==========================================================================                                                |  61%
  |                                                                                                                                
  |===========================================================================                                               |  61%
  |                                                                                                                                
  |===========================================================================                                               |  62%
  |                                                                                                                                
  |============================================================================                                              |  62%
  |                                                                                                                                
  |============================================================================                                              |  63%
  |                                                                                                                                
  |=============================================================================                                             |  63%
  |                                                                                                                                
  |=============================================================================                                             |  64%
  |                                                                                                                                
  |==============================================================================                                            |  64%
  |                                                                                                                                
  |===============================================================================                                           |  64%
  |                                                                                                                                
  |===============================================================================                                           |  65%
  |                                                                                                                                
  |================================================================================                                          |  65%
  |                                                                                                                                
  |================================================================================                                          |  66%
  |                                                                                                                                
  |=================================================================================                                         |  66%
  |                                                                                                                                
  |=================================================================================                                         |  67%
  |                                                                                                                                
  |==================================================================================                                        |  67%
  |                                                                                                                                
  |==================================================================================                                        |  68%
  |                                                                                                                                
  |===================================================================================                                       |  68%
  |                                                                                                                                
  |====================================================================================                                      |  68%
  |                                                                                                                                
  |====================================================================================                                      |  69%
  |                                                                                                                                
  |=====================================================================================                                     |  69%
  |                                                                                                                                
  |=====================================================================================                                     |  70%
  |                                                                                                                                
  |======================================================================================                                    |  70%
  |                                                                                                                                
  |======================================================================================                                    |  71%
  |                                                                                                                                
  |=======================================================================================                                   |  71%
  |                                                                                                                                
  |=======================================================================================                                   |  72%
  |                                                                                                                                
  |========================================================================================                                  |  72%
  |                                                                                                                                
  |========================================================================================                                  |  73%
  |                                                                                                                                
  |=========================================================================================                                 |  73%
  |                                                                                                                                
  |==========================================================================================                                |  73%
  |                                                                                                                                
  |==========================================================================================                                |  74%
  |                                                                                                                                
  |===========================================================================================                               |  74%
  |                                                                                                                                
  |===========================================================================================                               |  75%
  |                                                                                                                                
  |============================================================================================                              |  75%
  |                                                                                                                                
  |============================================================================================                              |  76%
  |                                                                                                                                
  |=============================================================================================                             |  76%
  |                                                                                                                                
  |=============================================================================================                             |  77%
  |                                                                                                                                
  |==============================================================================================                            |  77%
  |                                                                                                                                
  |===============================================================================================                           |  77%
  |                                                                                                                                
  |===============================================================================================                           |  78%
  |                                                                                                                                
  |================================================================================================                          |  78%
  |                                                                                                                                
  |================================================================================================                          |  79%
  |                                                                                                                                
  |=================================================================================================                         |  79%
  |                                                                                                                                
  |=================================================================================================                         |  80%
  |                                                                                                                                
  |==================================================================================================                        |  80%
  |                                                                                                                                
  |==================================================================================================                        |  81%
  |                                                                                                                                
  |===================================================================================================                       |  81%
  |                                                                                                                                
  |===================================================================================================                       |  82%
  |                                                                                                                                
  |====================================================================================================                      |  82%
  |                                                                                                                                
  |=====================================================================================================                     |  82%
  |                                                                                                                                
  |=====================================================================================================                     |  83%
  |                                                                                                                                
  |======================================================================================================                    |  83%
  |                                                                                                                                
  |======================================================================================================                    |  84%
  |                                                                                                                                
  |=======================================================================================================                   |  84%
  |                                                                                                                                
  |=======================================================================================================                   |  85%
  |                                                                                                                                
  |========================================================================================================                  |  85%
  |                                                                                                                                
  |========================================================================================================                  |  86%
  |                                                                                                                                
  |=========================================================================================================                 |  86%
  |                                                                                                                                
  |==========================================================================================================                |  86%
  |                                                                                                                                
  |==========================================================================================================                |  87%
  |                                                                                                                                
  |===========================================================================================================               |  87%
  |                                                                                                                                
  |===========================================================================================================               |  88%
  |                                                                                                                                
  |============================================================================================================              |  88%
  |                                                                                                                                
  |============================================================================================================              |  89%
  |                                                                                                                                
  |=============================================================================================================             |  89%
  |                                                                                                                                
  |=============================================================================================================             |  90%
  |                                                                                                                                
  |==============================================================================================================            |  90%
  |                                                                                                                                
  |==============================================================================================================            |  91%
  |                                                                                                                                
  |===============================================================================================================           |  91%
  |                                                                                                                                
  |================================================================================================================          |  91%
  |                                                                                                                                
  |================================================================================================================          |  92%
  |                                                                                                                                
  |=================================================================================================================         |  92%
  |                                                                                                                                
  |=================================================================================================================         |  93%
  |                                                                                                                                
  |==================================================================================================================        |  93%
  |                                                                                                                                
  |==================================================================================================================        |  94%
  |                                                                                                                                
  |===================================================================================================================       |  94%
  |                                                                                                                                
  |===================================================================================================================       |  95%
  |                                                                                                                                
  |====================================================================================================================      |  95%
  |                                                                                                                                
  |=====================================================================================================================     |  96%
  |                                                                                                                                
  |======================================================================================================================    |  96%
  |                                                                                                                                
  |======================================================================================================================    |  97%
  |                                                                                                                                
  |=======================================================================================================================   |  97%
  |                                                                                                                                
  |=======================================================================================================================   |  98%
  |                                                                                                                                
  |========================================================================================================================  |  98%
  |                                                                                                                                
  |========================================================================================================================  |  99%
  |                                                                                                                                
  |========================================================================================================================= |  99%
  |                                                                                                                                
  |========================================================================================================================= | 100%
  |                                                                                                                                
  |==========================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                                
  |                                                                                                                          |   0%
  |                                                                                                                                
  |==============================                                                                                            |  25%
  |                                                                                                                                
  |=============================================================                                                             |  50%
  |                                                                                                                                
  |============================================================================================                              |  75%
  |                                                                                                                                
  |==========================================================================================================================| 100%
Place corrected count matrix in counts slot
Set default assay to SCT
                                      

5. Perform PCA


Variables_genes <- L2@assays$SCT@var.features

# Exclude genes starting with "HLA-" AND "Xist" AND "TRBV, TRAV"
Variables_genes_after_exclusion <- Variables_genes[!grepl("^HLA-|^XIST|^TRBV|^TRAV", Variables_genes)]


# These are now standard steps in the Seurat workflow for visualization and clustering
L2 <- RunPCA(L2,
             features = Variables_genes_after_exclusion,
             do.print = TRUE, 
             pcs.print = 1:5, 
             genes.print = 15,
             npcs = 50)
PC_ 1 
Positive:  ESYT2, MALAT1, ARHGAP15, PDE3B, IKZF2, SYNE2, KCNQ5, NEAT1, CAMK4, DOCK10 
       EXOC4, WWOX, MT-ND6, TOX, RCSD1, TOP2A, SOS1, PTPRC, RAD51B, LRBA 
       ELMO1, OSBPL3, SPTBN1, ATXN1, MACF1, PRKCH, ADD3, RABGAP1L, UTRN, MBNL1 
Negative:  ACTB, HSPE1, NME1, RAN, CLIC1, GAPDH, PRELID1, CYCS, RPL35, ENO1 
       XCL1, UBE2S, ACTG1, HSPD1, LDHA, PPP1R14B, SRM, NPM1, MRPL41, SNRPG 
       NDUFAB1, PFDN2, KRT86, TMSB4X, TUBA1B, CHCHD2, JPT1, KRT81, TPI1, SNRPD1 
PC_ 2 
Positive:  TMSB10, S100A10, S100A6, B2M, EMP3, CRIP1, S100A4, S100A11, KLF2, TLE5 
       CD52, LGALS1, LTB, PFN1, CYBA, PLP2, ANXA5, AHNAK, GABARAP, ANXA2 
       RAP1GAP2, CALM1, PIM1, CD9, PLSCR3, CNN2, IFITM1, RIPOR2, SIGIRR, SLC9A3R1 
Negative:  XCL1, XCL2, CST7, CRIM1, KSR2, HSPD1, PRKCH, PDE7B, SRGN, DPF3 
       HDAC9, ADAMTS17, GRK3, ASB2, NPM1, SRM, CD3D, PEBP1, AHI1, KCNQ5 
       PLPP1, RERE, GFOD1, MT-ND2, CD96, UBE2F, NME1, SRRT, MIR181A1HG, GCSH 
PC_ 3 
Positive:  HIST1H4C, DUT, PCLAF, WDR34, HIST1H1A, HIST1H1D, HIST1H3D, STMN1, HIST1H1C, TYMS 
       H2AFX, SIVA1, HIST1H1E, TK1, HIST1H1B, H2AFZ, HIST1H2AH, HIST2H2AC, RRM2, TUBB 
       GAPDH, KLRC1, GABARAP, NUSAP1, GPX4, WWOX, HIST1H3B, GSTP1, COX5B, CARHSP1 
Negative:  LTB, EIF4G2, CALR, HSPA8, CCND2, CDC20, HSP90AB1, EMP3, ARL6IP1, FLNA 
       HNRNPU, CCT5, S100A6, CCNB1, TMSB10, YWHAZ, FLT3LG, B2M, MYH9, VIM 
       HSPA5, EIF3B, HNRNPA2B1, HDGF, YWHAG, PLEC, HNRNPA3, HNRNPH1, CAPRIN1, RIPOR2 
PC_ 4 
Positive:  C1QBP, EIF5A, PSMB6, PFN1, YWHAE, RPL26, RNASEK, SNHG29, RPA1, RPL31 
       GLOD4, UBB, PRPF8, EIF4A1, NAA38, GABARAP, UBE2G1, CAPG, TXNDC17, ACADVL 
       GSTP1, TRAPPC1, EMC6, ITGAE, ARRB2, RABEP1, PITPNA, ACAP1, PAFAH1B1, RANGRF 
Negative:  HIST1H4C, TUBB, HIST1H1E, RPS4X, HIST1H1B, HIST1H1C, RRM2, HIST1H1D, H2AFX, MKI67 
       HIST1H2AH, HIST1H3D, HIST1H1A, RNF212, CXCR3, MAL, DUT, HIST1H3B, CORO1B, TYMS 
       HIST2H2AC, MRPS5, HIST1H2AL, TUBA1B, UBE2C, UBC, TOP2A, CD74, HIST1H3C, ALYREF 
PC_ 5 
Positive:  ARL6IP1, RPS4X, PTTG1, SEPTIN6, CORO1B, IL2RG, MIF, SOD1, MT1E, SYT1 
       CD3D, RNF212, PTMA, OAZ1, PDE7B, TXN, PPIA, CHCHD2, MT1G, ATP5MF 
       DAD1, BTG1, IL32, ATP5MC3, FOXP2, LITAF, CDC20, HMGB2, SDCBP, MYL6 
Negative:  TSR1, C1QBP, PFN1, HIST1H1E, PRPF8, MYBBP1A, HIST1H1B, RPL26, HNRNPU, NCL 
       YWHAE, HIST1H1C, EIF4A1, RPL31, MYH9, EIF5A, HIST1H2AH, SMC1A, TXNDC17, ACAP1 
       PELP1, CTDNEP1, EIF2S3, EMC6, HSPA9, RPA1, HIST1H4C, IPO7, COPS3, LRPPRC 
# determine dimensionality of the data
ElbowPlot(L2, ndims =50)

NA
NA

Perform PCA TEST



library(ggplot2)
library(RColorBrewer)  

# Assuming you have 10 different cell lines, generating a color palette with 10 colors
cell_line_colors <- brewer.pal(10, "Set3")

# Assuming L2$cell_line is a factor or character vector containing cell line names
data <- as.data.frame(table(L2$cell_line))
colnames(data) <- c("cell_line", "nUMI")  # Change column name to nUMI

ncells <- ggplot(data, aes(x = cell_line, y = nUMI, fill = cell_line)) + 
  geom_col() +
  theme_classic() +
  geom_text(aes(label = nUMI), 
            position = position_dodge(width = 0.9), 
            vjust = -0.25) +
  scale_fill_manual(values = cell_line_colors) + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5)) +  # Adjust the title position
  ggtitle("Filtered cells per sample") +
  xlab("Cell lines") +  # Adjust x-axis label
  ylab("Frequency")    # Adjust y-axis label

print(ncells)




# TEST-1
# given that the output of RunPCA is "pca"
# replace "so" by the name of your seurat object

pct <- L2[["pca"]]@stdev / sum(L2[["pca"]]@stdev) * 100
cumu <- cumsum(pct) # Calculate cumulative percents for each PC
# Determine the difference between variation of PC and subsequent PC
co2 <- sort(which((pct[-length(pct)] - pct[-1]) > 0.1), decreasing = T)[1] + 1
# last point where change of % of variation is more than 0.1%. -> co2
co2
[1] 12
# TEST-2
# get significant PCs
stdv <- L2[["pca"]]@stdev
sum.stdv <- sum(L2[["pca"]]@stdev)
percent.stdv <- (stdv / sum.stdv) * 100
cumulative <- cumsum(percent.stdv)
co1 <- which(cumulative > 90 & percent.stdv < 5)[1]
co2 <- sort(which((percent.stdv[1:length(percent.stdv) - 1] - 
                       percent.stdv[2:length(percent.stdv)]) > 0.1), 
              decreasing = T)[1] + 1
min.pc <- min(co1, co2)
min.pc
[1] 12
# Create a dataframe with values
plot_df <- data.frame(pct = percent.stdv, 
           cumu = cumulative, 
           rank = 1:length(percent.stdv))

# Elbow plot to visualize 
  ggplot(plot_df, aes(cumulative, percent.stdv, label = rank, color = rank > min.pc)) + 
  geom_text() + 
  geom_vline(xintercept = 90, color = "grey") + 
  geom_hline(yintercept = min(percent.stdv[percent.stdv > 5]), color = "grey") +
  theme_bw()

NA
NA
NA

6. Clustering

L2 <- FindNeighbors(L2, 
                    dims = 1:min.pc, 
                    verbose = FALSE)

# understanding resolution
L2 <- FindClusters(L2, 
                  resolution = c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 
                                0.7,0.8, 0.9, 1, 1.1, 1.2))
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9000
Number of communities: 1
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8363
Number of communities: 2
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7966
Number of communities: 3
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7689
Number of communities: 4
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7498
Number of communities: 5
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7296
Number of communities: 7
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7145
Number of communities: 8
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7002
Number of communities: 8
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.6857
Number of communities: 10
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.6744
Number of communities: 11
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.6628
Number of communities: 12
Elapsed time: 0 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 5935
Number of edges: 180434

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.6522
Number of communities: 12
Elapsed time: 0 seconds

# non-linear dimensionality reduction --------------
L2 <- RunUMAP(L2, 
              dims = 1:min.pc,
              verbose = FALSE)
Warning: 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 session
                                  

# note that you can set `label = TRUE` or use the Label Clusters function to help label
# individual clusters
DimPlot(L2,group.by = "cell_line", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)



DimPlot(L2,
        group.by = "SCT_snn_res.0.1", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2,
        group.by = "SCT_snn_res.0.2", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2,
        group.by = "SCT_snn_res.0.3", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2,
        group.by = "SCT_snn_res.0.4", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)



DimPlot(L2,
        group.by = "SCT_snn_res.0.5", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2,
        group.by = "SCT_snn_res.0.6", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2,
        group.by = "SCT_snn_res.0.7", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2,
        group.by = "SCT_snn_res.0.8", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)

DimPlot(L2,
        group.by = "SCT_snn_res.0.9", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)

DimPlot(L2,
        group.by = "SCT_snn_res.1", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)

DimPlot(L2,
        group.by = "SCT_snn_res.1.1", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)

DimPlot(L2,
        group.by = "SCT_snn_res.1.2", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)

7. Azimuth Annotation

InstallData("pbmcref")
Warning: The following packages are already installed and will not be reinstalled: pbmcref
# The RunAzimuth function can take a Seurat object as input
L2 <- RunAzimuth(L2, reference = "pbmcref")
Warning: Overwriting miscellanous data for modelWarning: Adding a dimensional reduction (refUMAP) without the associated assay being presentWarning: Adding a dimensional reduction (refUMAP) without the associated assay being presentdetected inputs from HUMAN with id type Gene.name
reference rownames detected HUMAN with id type Gene.name
Normalizing query using reference SCT model
Warning: 113 features of the features specified were not present in both the reference query assays. 
Continuing with remaining 4887 features.Projecting cell embeddings
Finding query neighbors
Finding neighborhoods
Finding anchors
    Found 383 anchors
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Predicting cell labels
Predicting cell labels
Warning: Feature names cannot have underscores ('_'), replacing with dashes ('-')Predicting cell labels
Warning: Feature names cannot have underscores ('_'), replacing with dashes ('-')

  |                                                  | 0 % ~calculating  

Integrating dataset 2 with reference dataset
Finding integration vectors
Integrating data

  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Warning: Keys should be one or more alphanumeric characters followed by an underscore, setting key from integrated_dr_ to integrateddr_Computing nearest neighbors
Running UMAP projection
Warning: Number of neighbors between query and reference is not equal to the number of neighbors within reference16:53:40 Read 5935 rows
16:53:40 Processing block 1 of 1
16:53:40 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 20
16:53:40 Initializing by weighted average of neighbor coordinates using 1 thread
16:53:40 Commencing optimization for 67 epochs, with 118700 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
16:53:40 Finished
Warning: No assay specified, setting assay as RNA by default.Projecting reference PCA onto query
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Projecting back the query cells into original PCA space
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Computing scores:
    Finding neighbors of original query cells
    Finding neighbors of transformed query cells
    Computing query SNN
    Determining bandwidth and computing transition probabilities
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Total elapsed time: 2.22579503059387
UMAPPlot(L2, group.by = "predicted.celltype.l2", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = F)



UMAPPlot(L2, group.by = "predicted.celltype.l2", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T)

8. Cell type annotation using ProjectTils



#Load reference atlas and query data
ref <- readRDS(file = "CD4T_human_ref_v1.rds")

#Run Projection algorithm
query.projected <- Run.ProjecTILs(L2, ref = ref)

  |                                                                                                                                
  |                                                                                                                          |   0%[1] "Using assay SCT for query"
Pre-filtering cells with scGate...

### Detected a total of 5466 pure 'Target' cells (92.10% of total)
[1] "469 out of 5935 ( 8% ) non-pure cells removed. Use filter.cells=FALSE to avoid pre-filtering"
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Aligning query to reference map for batch-correction..."
Warning: Layer counts isn't present in the assay object[[assay]]; returning NULLPreparing PCA embeddings for objects...
Warning: Number of dimensions changing from 50 to 20

  |                                                  | 0 % ~calculating  
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  

  |                                                  | 0 % ~calculating  
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=11s  

Projecting corrected query onto Reference PCA space

Projecting corrected query onto Reference UMAP space
Warning: Not all features provided are in this Assay object, removing the following feature(s): CXCL13, GNLY, CD177, CCL22, CGA, SOX4, G0S2, IL17A, IGFL2, PMCH, TRDC, AREG, IL21, HLA-DQA1, IL1RL1, IL1R2, EBI3, DIRAS3, NPPC, RGS2, CAVIN3, CD200, MS4A6A, IL2, BEX3, BASP1, PVALB, MRC1, CTLA4, TASL, CPM, LHFPL6, H1-4, IL26, HLA-DPA1, HLA-DPB1, H2AZ1, TENT5A, MSC, SH2D1A, RCAN2, GPR25, TNS3, ELAPOR1, IGFBP3, CCL3L3, POLR1F, BTLA, PTPN13, FCRL3, FANK1, PLK2, CRLF2, F5, IL1R1, AHSP, CCR2, TSHZ2, CSF2RB, CDCA7L, HTRA1, PPARG, H1-2, H1-0, LMCD1, WARS1, H1-3, H2BC11, GPX1, STAC, H2AC6, IRAG2, CYP7B1, H1-10, MYO7A, PTGIR, H3C10, NAP1L2, FAS, IL22, CHGB, SLC28A3, PDLIM4, ECEL1, HES1, HSD11B1, CPE, CD40, TNFSF11, CD86, RNF144B, H4C3, NEBL, HS3ST1

  |                                                                                                                                
  |==========================================================================================================================| 100%
Creating slots functional.cluster and functional.cluster.conf in query object
#reference atlas
DimPlot(ref, label = T)


#Visualize projection
plot.projection(ref, query.projected, linesize = 0.5, pointsize = 0.5)


#Plot the predicted composition of the query in terms of reference T cell subtypes
plot.statepred.composition(ref, query.projected, metric = "Percent")



L2 <- ProjecTILs.classifier(query = L2, ref = ref)

  |                                                                                                                                
  |                                                                                                                          |   0%[1] "Using assay SCT for query"
Pre-filtering cells with scGate...

### Detected a total of 5466 pure 'Target' cells (92.10% of total)
[1] "469 out of 5935 ( 8% ) non-pure cells removed. Use filter.cells=FALSE to avoid pre-filtering"
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Aligning query to reference map for batch-correction..."
Warning: Layer counts isn't present in the assay object[[assay]]; returning NULLPreparing PCA embeddings for objects...
Warning: Number of dimensions changing from 50 to 20

  |                                                  | 0 % ~calculating  
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  

  |                                                  | 0 % ~calculating  
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=11s  

Projecting corrected query onto Reference PCA space

Projecting corrected query onto Reference UMAP space
Warning: Not all features provided are in this Assay object, removing the following feature(s): CXCL13, GNLY, CD177, CCL22, CGA, SOX4, G0S2, IL17A, IGFL2, PMCH, TRDC, AREG, IL21, HLA-DQA1, IL1RL1, IL1R2, EBI3, DIRAS3, NPPC, RGS2, CAVIN3, CD200, MS4A6A, IL2, BEX3, BASP1, PVALB, MRC1, CTLA4, TASL, CPM, LHFPL6, H1-4, IL26, HLA-DPA1, HLA-DPB1, H2AZ1, TENT5A, MSC, SH2D1A, RCAN2, GPR25, TNS3, ELAPOR1, IGFBP3, CCL3L3, POLR1F, BTLA, PTPN13, FCRL3, FANK1, PLK2, CRLF2, F5, IL1R1, AHSP, CCR2, TSHZ2, CSF2RB, CDCA7L, HTRA1, PPARG, H1-2, H1-0, LMCD1, WARS1, H1-3, H2BC11, GPX1, STAC, H2AC6, IRAG2, CYP7B1, H1-10, MYO7A, PTGIR, H3C10, NAP1L2, FAS, IL22, CHGB, SLC28A3, PDLIM4, ECEL1, HES1, HSD11B1, CPE, CD40, TNFSF11, CD86, RNF144B, H4C3, NEBL, HS3ST1

  |                                                                                                                                
  |==========================================================================================================================| 100%
Creating slots functional.cluster and functional.cluster.conf in query object
UMAPPlot(L2, group.by = "functional.cluster", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T)

NA
NA

9.Cell type annotation using SingleR

# Monaco Annotations
DimPlot(L2, group.by = "monaco.main", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = F)

DimPlot(L2, group.by = "monaco.main", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2, group.by = "monaco.fine", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = F)


DimPlot(L2, group.by = "monaco.fine", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


# HPCA Annotations
DimPlot(L2, group.by = "hpca.main", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2, group.by = "hpca.fine", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = F)


DimPlot(L2, group.by = "hpca.fine", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)

# DICE Annotations
DimPlot(L2, group.by = "dice.main", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2, group.by = "dice.fine", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = F)


DimPlot(L2, group.by = "dice.fine", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


# BPE Annotations
DimPlot(L2, group.by = "bpe.main", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(L2, group.by = "bpe.fine", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = F)


DimPlot(L2, group.by = "bpe.fine", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)

NA
NA

10. clusTree

library(clustree)
Loading required package: ggraph

Attaching package: 'ggraph'

The following object is masked from 'package:sp':

    geometry
clustree(L2, prefix = "SCT_snn_res.")

11.Save the Seurat object as an Robj file

LS0tCnRpdGxlOiAiQ2VsbCBMaW5lIEwzIEFuYWx5c2lzIgphdXRob3I6IE5hc2lyIE1haG1vb2QgQWJiYXNpCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogICNybWRmb3JtYXRzOjpyZWFkdGhlZG93bgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCiMgMS4gbG9hZCBsaWJyYXJpZXMKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CgpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShTZXVyYXRPYmplY3QpCmxpYnJhcnkoU2V1cmF0RGF0YSkKbGlicmFyeShwYXRjaHdvcmspCgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShkYnBseXIpCmxpYnJhcnkocm1hcmtkb3duKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHRpbnl0ZXgpCiNBemltdXRoIEFubm90YXRpb24gbGlicmFyaWVzCmxpYnJhcnkoQXppbXV0aCkKI1Byb2plY1RpbHMgQW5ub3RhdGlvbiBsaWJyYXJpZXMKbGlicmFyeShTVEFDQVMpCmxpYnJhcnkoUHJvamVjVElMcykKI3NpbmdsZVIgQW5ub3RhdGlvbiBsaWJyYXJpZXMKbGlicmFyeShTaW5nbGVSKQpsaWJyYXJ5KGNlbGxkZXgpCmxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCgpgYGAKCgojIDIuIExvYWQgU2V1cmF0IE9iamVjdCAKYGBge3IgbG9hZF9zZXVyYXR9CgojTG9hZCBTZXVyYXQgT2JqZWN0IEwzCmxvYWQoIi4uL0RvY3VtZW50cy8xLVNTLVNUZXBzLzQtQW5hbHlzaXNfYW5kX1JvYmpfTWFyaWUvYW5hbHlzZSBqdWlsbGV0IDIwMjMvT2JqZXRzUi9MMy5Sb2JqIikKCkwzCmBgYAoKCiMgMy4gUUMKYGBge3IgUUMsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQojIFNldCBpZGVudGl0eSBjbGFzc2VzIHRvIGFuIGV4aXN0aW5nIGNvbHVtbiBpbiBtZXRhIGRhdGEKSWRlbnRzKG9iamVjdCA9IEwzKSA8LSAiY2VsbF9saW5lIgoKTDNbWyJwZXJjZW50LnJiIl1dIDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KEwzLCBwYXR0ZXJuID0gIl5SUFtTTF0iKQoKVmxuUGxvdChMMywgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibkNvdW50X1JOQSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJjZW50Lm1pdG8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJjZW50LnJiIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDQsIHB0LnNpemUgPSAwLjEpICYgCiAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkKCkZlYXR1cmVTY2F0dGVyKEwzLCBmZWF0dXJlMSA9ICJwZXJjZW50Lm1pdG8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUyID0gInBlcmNlbnQucmIiKQoKVmxuUGxvdChMMywgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5Db3VudF9STkEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcmNlbnQubWl0byIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMykKCkZlYXR1cmVTY2F0dGVyKEwzLCAKICAgICAgICAgICAgICAgZmVhdHVyZTEgPSAicGVyY2VudC5taXRvIiwgCiAgICAgICAgICAgICAgIGZlYXR1cmUyID0gInBlcmNlbnQucmIiKSArCiAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJykKCkZlYXR1cmVTY2F0dGVyKEwzLCAKICAgICAgICAgICAgICAgZmVhdHVyZTEgPSAibkNvdW50X1JOQSIsIAogICAgICAgICAgICAgICBmZWF0dXJlMiA9ICJuRmVhdHVyZV9STkEiKSArCiAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJykKCmBgYAojI0ZlYXR1cmVTY2F0dGVyIGlzIHR5cGljYWxseSB1c2VkIHRvIHZpc3VhbGl6ZSBmZWF0dXJlLWZlYXR1cmUgcmVsYXRpb25zaGlwcwojI2ZvciBhbnl0aGluZyBjYWxjdWxhdGVkIGJ5IHRoZSBvYmplY3QsIAojI2kuZS4gY29sdW1ucyBpbiBvYmplY3QgbWV0YWRhdGEsIFBDIHNjb3JlcyBldGMuCgpgYGB7ciBGQywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CgpGZWF0dXJlU2NhdHRlcihMMywgCiAgICAgICAgICAgICAgIGZlYXR1cmUxID0gIm5Db3VudF9STkEiLCAKICAgICAgICAgICAgICAgZmVhdHVyZTIgPSAicGVyY2VudC5taXRvIikrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJykKCkZlYXR1cmVTY2F0dGVyKEwzLCAKICAgICAgICAgICAgICAgZmVhdHVyZTEgPSAibkNvdW50X1JOQSIsIAogICAgICAgICAgICAgICBmZWF0dXJlMiA9ICJuRmVhdHVyZV9STkEiKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nKQoKYGBgCiMjIEFzc2lnbiBDZWxsLUN5Y2xlIFNjb3JlcwpgYGB7ciBSZWdyZXNzLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KCkwzIDwtIFNDVHJhbnNmb3JtKEwzLCBkby5zY2FsZT1GQUxTRSwgZG8uY2VudGVyPUZBTFNFKQoKCiMgQSBsaXN0IG9mIGNlbGwgY3ljbGUgbWFya2VycywgZnJvbSBUaXJvc2ggZXQgYWwsIDIwMTUsIGlzIGxvYWRlZCB3aXRoIFNldXJhdC4gIFdlIGNhbgojIHNlZ3JlZ2F0ZSB0aGlzIGxpc3QgaW50byBtYXJrZXJzIG9mIEcyL00gcGhhc2UgYW5kIG1hcmtlcnMgb2YgUyBwaGFzZQpzLmdlbmVzIDwtIGNjLmdlbmVzJHMuZ2VuZXMKZzJtLmdlbmVzIDwtIGNjLmdlbmVzJGcybS5nZW5lcwoKCkwzIDwtIENlbGxDeWNsZVNjb3JpbmcoTDMsIHMuZmVhdHVyZXMgPSBzLmdlbmVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZzJtLmZlYXR1cmVzID0gZzJtLmdlbmVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmlkZW50ID0gVFJVRSkKCkRlZmF1bHRBc3NheShMMykgPC0gIlJOQSIKTDMkQ0MuRGlmZmVyZW5jZSA8LSBMMyRTLlNjb3JlIC0gTDMkRzJNLlNjb3JlCgpgYGAKCiMgNC4gTm9ybWFsaXplIGRhdGEKYGBge3IgTm9ybWFsaXplLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQoKCiMgQXBwbHkgU0NUcmFuc2Zvcm0KTDMgPC0gU0NUcmFuc2Zvcm0oTDMsIHZhcnMudG8ucmVncmVzcyA9IGMoInBlcmNlbnQucmIiLCJwZXJjZW50Lm1pdG8iLCAiQ0MuRGlmZmVyZW5jZSIpLCAKICAgICAgICAgICAgICAgICAgZG8uc2NhbGU9VFJVRSwgCiAgICAgICAgICAgICAgICAgIGRvLmNlbnRlcj1UUlVFLCAKICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYAoKCiMgNS4gUGVyZm9ybSBQQ0EKYGBge3IgUENBLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQoKVmFyaWFibGVzX2dlbmVzIDwtIEwzQGFzc2F5cyRTQ1RAdmFyLmZlYXR1cmVzCgojIEV4Y2x1ZGUgZ2VuZXMgc3RhcnRpbmcgd2l0aCAiSExBLSIgQU5EICJYaXN0IiBBTkQgIlRSQlYsIFRSQVYiClZhcmlhYmxlc19nZW5lc19hZnRlcl9leGNsdXNpb24gPC0gVmFyaWFibGVzX2dlbmVzWyFncmVwbCgiXkhMQS18XlhJU1R8XlRSQlZ8XlRSQVYiLCBWYXJpYWJsZXNfZ2VuZXMpXQoKCiMgVGhlc2UgYXJlIG5vdyBzdGFuZGFyZCBzdGVwcyBpbiB0aGUgU2V1cmF0IHdvcmtmbG93IGZvciB2aXN1YWxpemF0aW9uIGFuZCBjbHVzdGVyaW5nCkwzIDwtIFJ1blBDQShMMywKICAgICAgICAgICAgIGZlYXR1cmVzID0gVmFyaWFibGVzX2dlbmVzX2FmdGVyX2V4Y2x1c2lvbiwKICAgICAgICAgICAgIGRvLnByaW50ID0gVFJVRSwgCiAgICAgICAgICAgICBwY3MucHJpbnQgPSAxOjUsIAogICAgICAgICAgICAgZ2VuZXMucHJpbnQgPSAxNSwKICAgICAgICAgICAgIG5wY3MgPSA1MCkKCiMgZGV0ZXJtaW5lIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBkYXRhCkVsYm93UGxvdChMMywgbmRpbXMgPTUwKQoKCmBgYAojIFBlcmZvcm0gUENBIFRFU1QKYGBge3IgUENBLVRFU1QsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQoKCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpICAKCiMgQXNzdW1pbmcgeW91IGhhdmUgMTAgZGlmZmVyZW50IGNlbGwgbGluZXMsIGdlbmVyYXRpbmcgYSBjb2xvciBwYWxldHRlIHdpdGggMTAgY29sb3JzCmNlbGxfbGluZV9jb2xvcnMgPC0gYnJld2VyLnBhbCgxMCwgIlNldDMiKQoKIyBBc3N1bWluZyBMMyRjZWxsX2xpbmUgaXMgYSBmYWN0b3Igb3IgY2hhcmFjdGVyIHZlY3RvciBjb250YWluaW5nIGNlbGwgbGluZSBuYW1lcwpkYXRhIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoTDMkY2VsbF9saW5lKSkKY29sbmFtZXMoZGF0YSkgPC0gYygiY2VsbF9saW5lIiwgIm5VTUkiKSAgIyBDaGFuZ2UgY29sdW1uIG5hbWUgdG8gblVNSQoKbmNlbGxzIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGNlbGxfbGluZSwgeSA9IG5VTUksIGZpbGwgPSBjZWxsX2xpbmUpKSArIAogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG5VTUkpLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIAogICAgICAgICAgICB2anVzdCA9IC0wLjI1KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2VsbF9saW5lX2NvbG9ycykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArICAjIEFkanVzdCB0aGUgdGl0bGUgcG9zaXRpb24KICBnZ3RpdGxlKCJGaWx0ZXJlZCBjZWxscyBwZXIgc2FtcGxlIikgKwogIHhsYWIoIkNlbGwgbGluZXMiKSArICAjIEFkanVzdCB4LWF4aXMgbGFiZWwKICB5bGFiKCJGcmVxdWVuY3kiKSAgICAjIEFkanVzdCB5LWF4aXMgbGFiZWwKCnByaW50KG5jZWxscykKCgoKIyBURVNULTEKIyBnaXZlbiB0aGF0IHRoZSBvdXRwdXQgb2YgUnVuUENBIGlzICJwY2EiCiMgcmVwbGFjZSAic28iIGJ5IHRoZSBuYW1lIG9mIHlvdXIgc2V1cmF0IG9iamVjdAoKcGN0IDwtIEwzW1sicGNhIl1dQHN0ZGV2IC8gc3VtKEwzW1sicGNhIl1dQHN0ZGV2KSAqIDEwMApjdW11IDwtIGN1bXN1bShwY3QpICMgQ2FsY3VsYXRlIGN1bXVsYXRpdmUgcGVyY2VudHMgZm9yIGVhY2ggUEMKIyBEZXRlcm1pbmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2YXJpYXRpb24gb2YgUEMgYW5kIHN1YnNlcXVlbnQgUEMKY28yIDwtIHNvcnQod2hpY2goKHBjdFstbGVuZ3RoKHBjdCldIC0gcGN0Wy0xXSkgPiAwLjEpLCBkZWNyZWFzaW5nID0gVClbMV0gKyAxCiMgbGFzdCBwb2ludCB3aGVyZSBjaGFuZ2Ugb2YgJSBvZiB2YXJpYXRpb24gaXMgbW9yZSB0aGFuIDAuMSUuIC0+IGNvMgpjbzIKCiMgVEVTVC0yCiMgZ2V0IHNpZ25pZmljYW50IFBDcwpzdGR2IDwtIEwzW1sicGNhIl1dQHN0ZGV2CnN1bS5zdGR2IDwtIHN1bShMM1tbInBjYSJdXUBzdGRldikKcGVyY2VudC5zdGR2IDwtIChzdGR2IC8gc3VtLnN0ZHYpICogMTAwCmN1bXVsYXRpdmUgPC0gY3Vtc3VtKHBlcmNlbnQuc3RkdikKY28xIDwtIHdoaWNoKGN1bXVsYXRpdmUgPiA5MCAmIHBlcmNlbnQuc3RkdiA8IDUpWzFdCmNvMiA8LSBzb3J0KHdoaWNoKChwZXJjZW50LnN0ZHZbMTpsZW5ndGgocGVyY2VudC5zdGR2KSAtIDFdIC0gCiAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudC5zdGR2WzI6bGVuZ3RoKHBlcmNlbnQuc3RkdildKSA+IDAuMSksIAogICAgICAgICAgICAgIGRlY3JlYXNpbmcgPSBUKVsxXSArIDEKbWluLnBjIDwtIG1pbihjbzEsIGNvMikKbWluLnBjCgojIENyZWF0ZSBhIGRhdGFmcmFtZSB3aXRoIHZhbHVlcwpwbG90X2RmIDwtIGRhdGEuZnJhbWUocGN0ID0gcGVyY2VudC5zdGR2LCAKICAgICAgICAgICBjdW11ID0gY3VtdWxhdGl2ZSwgCiAgICAgICAgICAgcmFuayA9IDE6bGVuZ3RoKHBlcmNlbnQuc3RkdikpCgojIEVsYm93IHBsb3QgdG8gdmlzdWFsaXplIAogIGdncGxvdChwbG90X2RmLCBhZXMoY3VtdWxhdGl2ZSwgcGVyY2VudC5zdGR2LCBsYWJlbCA9IHJhbmssIGNvbG9yID0gcmFuayA+IG1pbi5wYykpICsgCiAgZ2VvbV90ZXh0KCkgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA5MCwgY29sb3IgPSAiZ3JleSIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWluKHBlcmNlbnQuc3RkdltwZXJjZW50LnN0ZHYgPiA1XSksIGNvbG9yID0gImdyZXkiKSArCiAgdGhlbWVfYncoKQoKICAKCmBgYAoKIyA2LiBDbHVzdGVyaW5nCmBgYHtyIEMxLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQpMMyA8LSBGaW5kTmVpZ2hib3JzKEwzLCAKICAgICAgICAgICAgICAgICAgICBkaW1zID0gMTptaW4ucGMsIAogICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKCiMgdW5kZXJzdGFuZGluZyByZXNvbHV0aW9uCkwzIDwtIEZpbmRDbHVzdGVycyhMMywgCiAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSBjKDAuMSwgMC4yLCAwLjMsIDAuNCwgMC41LCAwLjYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNywwLjgsIDAuOSwgMSwgMS4xLCAxLjIpKQoKCmBgYAoKCmBgYHtyIEMyLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQoKIyBub24tbGluZWFyIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiAtLS0tLS0tLS0tLS0tLQpMMyA8LSBSdW5VTUFQKEwzLCAKICAgICAgICAgICAgICBkaW1zID0gMTptaW4ucGMsCiAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgojIG5vdGUgdGhhdCB5b3UgY2FuIHNldCBgbGFiZWwgPSBUUlVFYCBvciB1c2UgdGhlIExhYmVsIENsdXN0ZXJzIGZ1bmN0aW9uIHRvIGhlbHAgbGFiZWwKIyBpbmRpdmlkdWFsIGNsdXN0ZXJzCkRpbVBsb3QoTDMsZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQpCgoKRGltUGxvdChMMywKICAgICAgICBncm91cC5ieSA9ICJTQ1Rfc25uX3Jlcy4wLjEiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCkRpbVBsb3QoTDMsCiAgICAgICAgZ3JvdXAuYnkgPSAiU0NUX3Nubl9yZXMuMC4yIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQpCgpEaW1QbG90KEwzLAogICAgICAgIGdyb3VwLmJ5ID0gIlNDVF9zbm5fcmVzLjAuMyIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQoKRGltUGxvdChMMywKICAgICAgICBncm91cC5ieSA9ICJTQ1Rfc25uX3Jlcy4wLjQiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCgpEaW1QbG90KEwzLAogICAgICAgIGdyb3VwLmJ5ID0gIlNDVF9zbm5fcmVzLjAuNSIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQoKRGltUGxvdChMMywKICAgICAgICBncm91cC5ieSA9ICJTQ1Rfc25uX3Jlcy4wLjYiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCkRpbVBsb3QoTDMsCiAgICAgICAgZ3JvdXAuYnkgPSAiU0NUX3Nubl9yZXMuMC43IiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQpCgpEaW1QbG90KEwzLAogICAgICAgIGdyb3VwLmJ5ID0gIlNDVF9zbm5fcmVzLjAuOCIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQpEaW1QbG90KEwzLAogICAgICAgIGdyb3VwLmJ5ID0gIlNDVF9zbm5fcmVzLjAuOSIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQpEaW1QbG90KEwzLAogICAgICAgIGdyb3VwLmJ5ID0gIlNDVF9zbm5fcmVzLjEiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKRGltUGxvdChMMywKICAgICAgICBncm91cC5ieSA9ICJTQ1Rfc25uX3Jlcy4xLjEiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKRGltUGxvdChMMywKICAgICAgICBncm91cC5ieSA9ICJTQ1Rfc25uX3Jlcy4xLjIiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCmBgYAoKIyA3LiBBemltdXRoIEFubm90YXRpb24KYGBge3IgYXppbXV0aF9Bbm5vdGF0aW9uLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQpJbnN0YWxsRGF0YSgicGJtY3JlZiIpCgojIFRoZSBSdW5BemltdXRoIGZ1bmN0aW9uIGNhbiB0YWtlIGEgU2V1cmF0IG9iamVjdCBhcyBpbnB1dApMMyA8LSBSdW5BemltdXRoKEwzLCByZWZlcmVuY2UgPSAicGJtY3JlZiIpCgpVTUFQUGxvdChMMywgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLkwzIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IEYpCgoKVU1BUFBsb3QoTDMsIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5MMyIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBUKQpgYGAKCiMgOC4gQ2VsbCB0eXBlIGFubm90YXRpb24gdXNpbmcgUHJvamVjdFRpbHMKYGBge3IgUHJvamVjVGlscywgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9Nn0KCgojTG9hZCByZWZlcmVuY2UgYXRsYXMgYW5kIHF1ZXJ5IGRhdGEKcmVmIDwtIHJlYWRSRFMoZmlsZSA9ICJDRDRUX2h1bWFuX3JlZl92MS5yZHMiKQoKI1J1biBQcm9qZWN0aW9uIGFsZ29yaXRobQpxdWVyeS5wcm9qZWN0ZWQgPC0gUnVuLlByb2plY1RJTHMoTDMsIHJlZiA9IHJlZikKCgoKI3JlZmVyZW5jZSBhdGxhcwpEaW1QbG90KHJlZiwgbGFiZWwgPSBUKQoKI1Zpc3VhbGl6ZSBwcm9qZWN0aW9uCnBsb3QucHJvamVjdGlvbihyZWYsIHF1ZXJ5LnByb2plY3RlZCwgbGluZXNpemUgPSAwLjUsIHBvaW50c2l6ZSA9IDAuNSkKCiNQbG90IHRoZSBwcmVkaWN0ZWQgY29tcG9zaXRpb24gb2YgdGhlIHF1ZXJ5IGluIHRlcm1zIG9mIHJlZmVyZW5jZSBUIGNlbGwgc3VidHlwZXMKcGxvdC5zdGF0ZXByZWQuY29tcG9zaXRpb24ocmVmLCBxdWVyeS5wcm9qZWN0ZWQsIG1ldHJpYyA9ICJQZXJjZW50IikKCgpMMyA8LSBQcm9qZWNUSUxzLmNsYXNzaWZpZXIocXVlcnkgPSBMMywgcmVmID0gcmVmKQpVTUFQUGxvdChMMywgZ3JvdXAuYnkgPSAiZnVuY3Rpb25hbC5jbHVzdGVyIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IFQpCgoKYGBgCgojIDkuQ2VsbCB0eXBlIGFubm90YXRpb24gdXNpbmcgU2luZ2xlUgpgYGB7ciBzaW5nbGVSLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQojZ2V0IHJlZmVyZW5jZSBkYXRhc2V0cyBmcm9tIGNlbGxkZXggcGFja2FnZQoKbW9uYWNvLnJlZiA8LSBjZWxsZGV4OjpNb25hY29JbW11bmVEYXRhKCkKaHBjYS5yZWYgPC0gY2VsbGRleDo6SHVtYW5QcmltYXJ5Q2VsbEF0bGFzRGF0YSgpCmRpY2UucmVmIDwtIGNlbGxkZXg6OkRhdGFiYXNlSW1tdW5lQ2VsbEV4cHJlc3Npb25EYXRhKCkKYnBlLnJlZiA8LSBjZWxsZGV4OjpCbHVlcHJpbnRFbmNvZGVEYXRhKCkKCiNjb252ZXJ0IG91ciBTZXVyYXQgb2JqZWN0IHRvIHNpbmdsZSBjZWxsIGV4cGVyaW1lbnQgKFNDRSkKc2NlIDwtIGFzLlNpbmdsZUNlbGxFeHBlcmltZW50KERpZXRTZXVyYXQoTDMpKQoKI3VzaW5nIFNpbmdsZVIKbW9uYWNvLm1haW4gPC0gU2luZ2xlUih0ZXN0ID0gc2NlLGFzc2F5LnR5cGUudGVzdCA9IDEscmVmID0gbW9uYWNvLnJlZixsYWJlbHMgPSBtb25hY28ucmVmJGxhYmVsLm1haW4pCm1vbmFjby5maW5lIDwtIFNpbmdsZVIodGVzdCA9IHNjZSxhc3NheS50eXBlLnRlc3QgPSAxLHJlZiA9IG1vbmFjby5yZWYsbGFiZWxzID0gbW9uYWNvLnJlZiRsYWJlbC5maW5lKQpocGNhLm1haW4gPC0gU2luZ2xlUih0ZXN0ID0gc2NlLGFzc2F5LnR5cGUudGVzdCA9IDEscmVmID0gaHBjYS5yZWYsbGFiZWxzID0gaHBjYS5yZWYkbGFiZWwubWFpbikKaHBjYS5maW5lIDwtIFNpbmdsZVIodGVzdCA9IHNjZSxhc3NheS50eXBlLnRlc3QgPSAxLHJlZiA9IGhwY2EucmVmLGxhYmVscyA9IGhwY2EucmVmJGxhYmVsLmZpbmUpCmRpY2UubWFpbiA8LSBTaW5nbGVSKHRlc3QgPSBzY2UsYXNzYXkudHlwZS50ZXN0ID0gMSxyZWYgPSBkaWNlLnJlZixsYWJlbHMgPSBkaWNlLnJlZiRsYWJlbC5tYWluKQpkaWNlLmZpbmUgPC0gU2luZ2xlUih0ZXN0ID0gc2NlLGFzc2F5LnR5cGUudGVzdCA9IDEscmVmID0gZGljZS5yZWYsbGFiZWxzID0gZGljZS5yZWYkbGFiZWwuZmluZSkKYnBlLm1haW4gPC0gU2luZ2xlUih0ZXN0ID0gc2NlLGFzc2F5LnR5cGUudGVzdCA9IDEscmVmID0gYnBlLnJlZixsYWJlbHMgPSBicGUucmVmJGxhYmVsLm1haW4pCmJwZS5maW5lIDwtIFNpbmdsZVIodGVzdCA9IHNjZSxhc3NheS50eXBlLnRlc3QgPSAxLHJlZiA9IGJwZS5yZWYsbGFiZWxzID0gYnBlLnJlZiRsYWJlbC5maW5lKQoKCiNzdW1tYXJ5IG9mIGdlbmVyYWwgY2VsbCB0eXBlIGFubm90YXRpb25zCgojdGFibGUobW9uYWNvLm1haW4kcHJ1bmVkLmxhYmVscykKI3RhYmxlKGhwY2EubWFpbiRwcnVuZWQubGFiZWxzKQojdGFibGUoZGljZS5tYWluJHBydW5lZC5sYWJlbHMpCiN0YWJsZShicGUubWFpbiRwcnVuZWQubGFiZWxzKQoKI1RoZSBmaW5lciBjZWxsIHR5cGVzIGFubm90YXRpb25zIGFyZSB5b3UgYWZ0ZXIsIHRoZSBoYXJkZXIgdGhleSBhcmUgdG8gZ2V0IHJlbGlhYmx5LiAKI1RoaXMgaXMgd2hlcmUgY29tcGFyaW5nIG1hbnkgZGF0YWJhc2VzLCBhcyB3ZWxsIGFzIHVzaW5nIGluZGl2aWR1YWwgbWFya2VycyBmcm9tIGxpdGVyYXR1cmUsIAojd291bGQgYWxsIGJlIHZlcnkgdmFsdWFibGUuCgojdGFibGUobW9uYWNvLmZpbmUkcHJ1bmVkLmxhYmVscykKI3RhYmxlKGhwY2EuZmluZSRwcnVuZWQubGFiZWxzKQojdGFibGUoZGljZS5maW5lJHBydW5lZC5sYWJlbHMpCiN0YWJsZShicGUuZmluZSRwcnVuZWQubGFiZWxzKQoKCgojYWRkIHRoZSBhbm5vdGF0aW9ucyB0byB0aGUgU2V1cmF0IG9iamVjdCBtZXRhZGF0YQpMM0BtZXRhLmRhdGEkbW9uYWNvLm1haW4gPC0gbW9uYWNvLm1haW4kcHJ1bmVkLmxhYmVscwpMM0BtZXRhLmRhdGEkbW9uYWNvLmZpbmUgPC0gbW9uYWNvLmZpbmUkcHJ1bmVkLmxhYmVscwojCkwzQG1ldGEuZGF0YSRocGNhLm1haW4gICA8LSBocGNhLm1haW4kcHJ1bmVkLmxhYmVscwpMM0BtZXRhLmRhdGEkaHBjYS5maW5lICAgPC0gaHBjYS5maW5lJHBydW5lZC5sYWJlbHMKIyAgCkwzQG1ldGEuZGF0YSRkaWNlLm1haW4gICA8LSBkaWNlLm1haW4kcHJ1bmVkLmxhYmVscwpMM0BtZXRhLmRhdGEkZGljZS5maW5lICAgPC0gZGljZS5maW5lJHBydW5lZC5sYWJlbHMKIyAKTDNAbWV0YS5kYXRhJGJwZS5tYWluICAgPC0gYnBlLm1haW4kcHJ1bmVkLmxhYmVscwpMM0BtZXRhLmRhdGEkYnBlLmZpbmUgICA8LSBicGUuZmluZSRwcnVuZWQubGFiZWxzCgojIE1vbmFjbyBBbm5vdGF0aW9ucwpEaW1QbG90KEwzLCBncm91cC5ieSA9ICJtb25hY28ubWFpbiIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBGKQoKRGltUGxvdChMMywgZ3JvdXAuYnkgPSAibW9uYWNvLm1haW4iLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCkRpbVBsb3QoTDMsIGdyb3VwLmJ5ID0gIm1vbmFjby5maW5lIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IEYpCgpEaW1QbG90KEwzLCBncm91cC5ieSA9ICJtb25hY28uZmluZSIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQoKIyBIUENBIEFubm90YXRpb25zCkRpbVBsb3QoTDMsIGdyb3VwLmJ5ID0gImhwY2EubWFpbiIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQoKRGltUGxvdChMMywgZ3JvdXAuYnkgPSAiaHBjYS5maW5lIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IEYpCgpEaW1QbG90KEwzLCBncm91cC5ieSA9ICJocGNhLmZpbmUiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKIyBESUNFIEFubm90YXRpb25zCkRpbVBsb3QoTDMsIGdyb3VwLmJ5ID0gImRpY2UubWFpbiIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQoKRGltUGxvdChMMywgZ3JvdXAuYnkgPSAiZGljZS5maW5lIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IEYpCgpEaW1QbG90KEwzLCBncm91cC5ieSA9ICJkaWNlLmZpbmUiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCiMgQlBFIEFubm90YXRpb25zCkRpbVBsb3QoTDMsIGdyb3VwLmJ5ID0gImJwZS5tYWluIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQpCgpEaW1QbG90KEwzLCBncm91cC5ieSA9ICJicGUuZmluZSIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBGKQoKRGltUGxvdChMMywgZ3JvdXAuYnkgPSAiYnBlLmZpbmUiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCgoKYGBgCgojIDEwLiBjbHVzVHJlZQpgYGB7ciBjbHVzVHJlZSwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTEwfQpsaWJyYXJ5KGNsdXN0cmVlKQpjbHVzdHJlZShMMywgcHJlZml4ID0gIlNDVF9zbm5fcmVzLiIpCmBgYAoKIyAxMS5TYXZlIHRoZSBTZXVyYXQgb2JqZWN0IGFzIGFuIFJvYmogZmlsZQpgYGB7ciBzYXZlUk9CSiwgZWNobz1GQUxTRX0KCnNhdmUoTDMsIGZpbGUgPSAiTDNfQW5hbHlzaXMuUm9iaiIpCgoKYGBgCgoKCgoKCgo=