1 Datasets

1.1 Get matched data

## Reading data created previously
data.path <- "../../code_validation/Meta_analysis_code/DATASETS/ROSMAP"
load("../../../coMethDMR_metaAnalysis/DNAm_RNA/data/matched_data.rda")
dim(matched.dnam)
## [1] 431803    529
dim(matched.exp)
## [1] 55889   529
matched.exp <- matched.exp[rowSums(matched.exp) > 0,]
#matched.phenotype
# gghistogram(
#   matched.phenotype$braaksc,
#   bins = 7,
#   fill = "black",
#   color = "white",
#   alpha = 1
# )

2 Region analysis

2.1 Get metadata results

2.2 Analysis: RNA vs DNAm

We will used residuals data for which confounding effects (age at death, sex, cell-type proportions, batch) have been removed.

load("../../../coMethDMR_metaAnalysis/DNAm_RNA/data/residuals.rda")

2.3 Map region to genes +-250kb

The function getDNAm.target will extend the regions \(+-250Kbp\) and return the overlapping genes.

regions.gr <- rownames(resid_met) %>% 
  as.data.frame %>% 
  tidyr::separate(col = ".",into = c("chr","start","end"))  %>%
  makeGRangesFromDataFrame()
names(regions.gr) <- rownames(resid_met)
regions.gr
## GRanges object with 118 ranges and 0 metadata columns:
##                             seqnames              ranges strand
##                                <Rle>           <IRanges>  <Rle>
##     chr19:49220102-49220235    chr19   49220102-49220235      *
##      chr7:27153580-27153847     chr7   27153580-27153847      *
##      chr7:27146237-27146445     chr7   27146237-27146445      *
##      chr7:27154720-27155548     chr7   27154720-27155548      *
##      chr7:27179268-27179432     chr7   27179268-27179432      *
##                         ...      ...                 ...    ...
##      chr6:25042495-25042548     chr6   25042495-25042548      *
##      chr6:32906460-32906734     chr6   32906460-32906734      *
##   chr12:120835663-120835778    chr12 120835663-120835778      *
##     chr22:37608611-37608819    chr22   37608611-37608819      *
##     chr16:87886871-87886933    chr16   87886871-87886933      *
##   -------
##   seqinfo: 22 sequences from an unspecified genome; no seqlengths
# function available in methTF package https://gitlab.com/tiagochst/methtf
regions.genes <- get_region_target_gene(
  regions.gr = regions.gr,
  genome = "hg19",
  method = "window",
  window.size = 500 * 10 ^ 3
) # 500 kb
## Removing regions overlapping promoter regions
## o Get promoter regions for hg19
## o Remove promoter regions
## Mapping regions to genes within a window of size: 5e+05 bp
regions.genes <- regions.genes %>%
  dplyr::filter(regions.genes$target %in% rownames(resid_exp))

dim(regions.genes)
## [1] 978   3
head(regions.genes)

2.4 Target vs DNAm residual

# http://www.r-tutor.com/elementary-statistics/simple-linear-regression/residual-plot
doParallel::registerDoParallel(detectCores()/2)
tab <- plyr::adply(
  regions.genes,
  .margins = 1,
  .fun = function(row) {
    tryCatch({
      rna.target <- resid_exp[rownames(resid_exp) == row$target, , drop = FALSE]
      met.residual <- resid_met[rownames(resid_met) == as.character(row$regionID), ]
      
      df <- data.frame(
        rna.residual = rna.target %>% as.numeric,
        met.residual = met.residual %>% as.numeric,
        Braak_stage = matched.phenotype$braaksc %>% as.numeric
      )
      
      # fit linear model:
      results.all <-  lm(
        rna.residual ~ met.residual + Braak_stage, data = df
      )
      results.all.pval <- summary(results.all)$coefficients[
          2, "Pr(>|t|)", drop = F] %>% 
          t %>% as.data.frame()
      results.all.estimate <- summary(results.all)$coefficients[
          2, "Estimate", drop = F] %>% 
          t %>% as.data.frame()
      colnames(results.all.pval) <- paste0(
          "all_pval_", colnames(results.all.pval))
      colnames(results.all.estimate) <- paste0(
          "all_estimate_", colnames(results.all.estimate))
      
      return(
        data.frame(
          cbind(results.all.pval, results.all.estimate),
          row.names = NULL,
          stringsAsFactors = FALSE
        )
      )
    }, error = function(e) {
      print(row)
      return()
    })
  },
  .id = NULL,
  .progress = "time",
  .parallel = TRUE,
  .inform = TRUE
)
## Progress disabled when using parallel plyr
readr::write_csv(
    tab,
    path = "./NatComm_revision/DATASETS/gene_expression_results/results_regions_lm_250kb_window.csv"
)

2.4.1 Results

tab <- readr::read_csv(
  file = "./NatComm_revision/DATASETS/gene_expression_results/results_regions_lm_250kb_window.csv",
    col_types = readr::cols()
)

meta.analysis.folder <- "../../code_validation/Meta_analysis_code/meta_analysis_region_results/"
region.analysis <- readr::read_csv(
  file.path(meta.analysis.folder,"step4_dmr_vs_cpgs/meta_analysis_sig_no_crossHyb_smoking_ov_comb_p_with_sig_single_cpgs.csv"),
  col_types = readr::cols()
)

tab$all_fdr <- p.adjust(tab$all_pval_met.residual,method = "fdr")

output <- tab[,c("regionID","target_gene_name",
                 "all_estimate_met.residual",
                 "all_pval_met.residual","all_fdr")] 
colnames(output) <- c(
  "coMethDMR",
  "geneSymbol",
  "estimate.all",
  "pval.all",
  "fdr.all"
)

cols <- c(
  grep("ROSMAP_coMethRegion",colnames(region.analysis)),
  grep("Relation",colnames(region.analysis)):grep("^smoke_bi$",colnames(region.analysis))
)
output2 <- merge(
  output,
  region.analysis[,cols],
  by.x = "coMethDMR", 
  by.y = "ROSMAP_coMethRegion",
  all.x = TRUE
)
output2 <- output2 %>% arrange(pval.all)
write.csv(
    output2,
    file = "./NatComm_revision/DATASETS/gene_expression_results/results_regions_lm_250kb_window_renamed.csv",
    row.names = FALSE
)

3 Single cpg analysis

3.1 Get metadata results

3.2 Analysis: RNA vs DNAm

Load DNAm data that removed confounding effects.

3.3 Map region to genes +-250kb

The function get_region_target_gene will extend the regions \(+-250Kbp\) and return the overlapping genes.

probes.info <- sesameData::sesameDataGet("HM450.hg19.manifest")
dmr.gr <- probes.info[row.names(resid_met_cpg),] 
regions.genes <- get_region_target_gene(
  regions.gr = dmr.gr,
  genome = "hg19",
  method = "window",
  window.size = 500 * 10 ^ 3
) # 500 kb
## Removing regions overlapping promoter regions
## o Get promoter regions for hg19
## o Remove promoter regions
## Mapping regions to genes within a window of size: 5e+05 bp
regions.genes <- regions.genes %>%
  dplyr::filter(regions.genes$target %in% rownames(resid_exp))

regions.genes$cpg <- names(dmr.gr)[
  match(
      regions.genes$regionID,
      paste0(
          as.data.frame(dmr.gr)$seqnames, ":",
          as.data.frame(dmr.gr)$start,"-",
          as.data.frame(dmr.gr)$end
      )
  )
]

dim(regions.genes)
## [1] 16358     4
head(regions.genes)

3.4 Target vs DNAm residual

# http://www.r-tutor.com/elementary-statistics/simple-linear-regression/residual-plot
doParallel::registerDoParallel(detectCores()/2)
tab.cpg <- plyr::adply(
  regions.genes,
  .margins = 1,
  .fun = function(row) {
    tryCatch({
      rna.target <-
        resid_exp[rownames(resid_exp) == row$target, , drop = FALSE]
      met.residual <-
        resid_met_cpg[rownames(resid_met_cpg) == as.character(row$cpg), ]
      
      df <- data.frame(
              rna.residual = rna.target %>% as.numeric,
              met.residual = met.residual %>% as.numeric,
              Braak_stage = matched.phenotype$braaksc %>% as.numeric
      )
      
      # fit linear model
      results.all <- lm(
          rna.residual ~ met.residual + Braak_stage, data = df
      )
      
      # get pvalues coeficients
      results.all.pval <- summary(results.all)$coefficients[
          2, 4, drop = F] %>% t %>% as.data.frame()
      colnames(results.all.pval) <-
        paste0("all_pval_", colnames(results.all.pval))

      # get estimate coeficients
      results.all.estimate <- summary(results.all)$coefficients[
          2, 1, drop = F] %>% t %>% as.data.frame()
      colnames(results.all.estimate) <-
        paste0("all_estimate_", colnames(results.all.estimate))
      
      return(
        data.frame(
          cbind(results.all.pval, results.all.estimate),
          row.names = NULL,
          stringsAsFactors = FALSE
        )
      )
    }, error = function(e) {
      print(row)
      return()
    })
  },
  .id = NULL,
  .progress = "time",
  .parallel = TRUE,
  .inform = TRUE
)
## Progress disabled when using parallel plyr
readr::write_csv(
    tab.cpg,
    path = "./NatComm_revision/DATASETS/gene_expression_results/results_single_cpg_lm_250kb_window.csv"
)

3.4.1 Results

tab.cpg <- readr::read_csv(
    "./NatComm_revision/DATASETS/gene_expression_results/results_single_cpg_lm_250kb_window.csv",
    col_types = readr::cols()
)
tab.cpg$fdr.all <- p.adjust(tab.cpg$all_pval_met.residual,method = "fdr")

output <- tab.cpg[,c("cpg","target_gene_name",
                     "all_estimate_met.residual",
                     "all_pval_met.residual","fdr.all")
                  ] 
colnames(output) <- c(
  "cpg",
  "geneSymbol",
  "estimate.all",
  "pval.all",
  "fdr.all"
)
output <- output %>% arrange(pval.all)
write.csv(
    output,
    file = "./NatComm_revision/DATASETS/gene_expression_results/results_single_cpg_lm_250kb_window_renamed.csv",
    row.names = FALSE
)

4 Splitting results by group

4.1 DMRs

dmr <- read.csv(
  "./NatComm_revision/DATASETS/gene_expression_results/results_regions_lm_250kb_window_renamed.csv"
)
pathDropbox <- file.path(dir("~", pattern = "Dropbox", full.names = TRUE))
dmr_meta <- read.csv(
  file.path(pathDropbox,
            "coMethDMR_metaAnalysis/",
            "code_validation/Meta_analysis_code/meta_analysis_region_results",
            "/step4_dmr_vs_cpgs/meta_analysis_sig_no_crossHyb_smoking_ov_comb_p_with_all.csv")
)[, c("ROSMAP_coMethRegion",
      "GREAT_annotation",
      "UCSC_RefGene_Group",
      "UCSC_RefGene_Accession",
      "UCSC_RefGene_Name",
      "state")
  ]

dmr.annot <- merge(
  dmr, dmr_meta,
  by.x = "coMethDMR",
  by.y = "ROSMAP_coMethRegion",
  sort = FALSE
)

dmr.annot <- dmr.annot[
    order(dmr.annot$pval.all), c(1:5, 17:20, 6, 21, 7: 14)
]
write.csv(
  dmr.annot,
  "./NatComm_revision/DATASETS/gene_expression_results/results_regions_lm_250kb_window_renamed_with_annot.csv"
)

4.2 CpGs

cpg <- read.csv(
  "./NatComm_revision/DATASETS/gene_expression_results/results_single_cpg_lm_250kb_window_renamed.csv"
)
cpg_meta <- read.csv(
    file.path(pathDropbox,
            "coMethDMR_metaAnalysis/",
            "code_validation/Meta_analysis_code/meta_analysis_single_cpg_results/",
            "/meta_analysis_single_cpg_sig_no_crossHyb_smoking_with_state_greatAnnot_df.csv")
)[, c("cpg",
      "GREAT_annotation",
      "UCSC_RefGene_Group",
      "UCSC_RefGene_Accession",
      "UCSC_RefGene_Name",
      "Relation_to_Island",
      "state",
      "estimate", 
      "se", 
      "pVal.fixed", 
      "pVal.random",
      "pValQ", 
      "direction", 
      "pVal.final", 
      "fdr")
  ]

cpg.annot <- merge(
  cpg, cpg_meta,
  by = "cpg",
  sort = FALSE
)

cpg.annot <- cpg.annot %>% arrange(pval.all)
write.csv(
  cpg.annot,
  "./NatComm_revision/DATASETS/gene_expression_results/results_single_cpg_lm_250kb_window_renamed_with_annot.csv"
)

5 Session information

devtools::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value                       
##  version  R version 4.0.2 (2020-06-22)
##  os       macOS Catalina 10.15.6      
##  system   x86_64, darwin17.0          
##  ui       X11                         
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       America/New_York            
##  date     2020-08-11                  
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  ! package                                       * version    date       lib
##    abind                                           1.4-5      2016-07-21 [1]
##    annotate                                        1.66.0     2020-04-28 [1]
##    AnnotationDbi                                   1.50.3     2020-07-25 [1]
##    AnnotationHub                                 * 2.20.0     2020-04-27 [1]
##    askpass                                         1.1        2019-01-13 [1]
##    assertthat                                      0.2.1      2019-03-21 [1]
##    backports                                       1.1.8      2020-06-17 [1]
##    base64                                          2.0        2016-05-10 [1]
##    base64enc                                       0.1-3      2015-07-28 [1]
##    beanplot                                        1.2        2014-09-19 [1]
##    Biobase                                       * 2.48.0     2020-04-27 [1]
##    BiocFileCache                                 * 1.12.0     2020-04-27 [1]
##    BiocGenerics                                  * 0.34.0     2020-04-27 [1]
##    BiocManager                                     1.30.10    2019-11-16 [1]
##    BiocParallel                                    1.22.0     2020-04-27 [1]
##    BiocVersion                                     3.11.1     2020-04-07 [1]
##    biomaRt                                         2.44.1     2020-06-17 [1]
##    Biostrings                                      2.56.0     2020-04-27 [1]
##    bit                                             4.0.3      2020-07-30 [1]
##    bit64                                           4.0.2      2020-07-30 [1]
##    bitops                                          1.0-6      2013-08-17 [1]
##    blob                                            1.2.1      2020-01-20 [1]
##    boot                                            1.3-25     2020-04-26 [1]
##    broom                                           0.7.0      2020-07-09 [1]
##    bumphunter                                      1.30.0     2020-04-27 [1]
##    callr                                           3.4.3      2020-03-28 [1]
##    car                                             3.0-8      2020-05-21 [1]
##    carData                                         3.0-4      2020-05-22 [1]
##    cellranger                                      1.1.0      2016-07-27 [1]
##    circlize                                        0.4.10     2020-06-15 [1]
##    cli                                             2.0.2      2020-02-28 [1]
##    clue                                            0.3-57     2019-02-25 [1]
##    cluster                                         2.1.0      2019-06-19 [1]
##    codetools                                       0.2-16     2018-12-24 [1]
##    colorspace                                      1.4-1      2019-03-18 [1]
##    coMethDMR                                     * 0.0.0.9001 2020-07-23 [1]
##  P coMethTF                                      * 0.1.0      2020-08-06 [?]
##    ComplexHeatmap                                * 2.4.3      2020-07-25 [1]
##    crayon                                          1.3.4      2017-09-16 [1]
##    curl                                            4.3        2019-12-02 [1]
##    data.table                                      1.13.0     2020-07-24 [1]
##    DBI                                             1.1.0      2019-12-15 [1]
##    dbplyr                                        * 1.4.4      2020-05-27 [1]
##    DelayedArray                                  * 0.14.1     2020-07-14 [1]
##    DelayedMatrixStats                            * 1.10.1     2020-07-03 [1]
##    desc                                            1.2.0      2018-05-01 [1]
##    devtools                                        2.3.1      2020-07-21 [1]
##    digest                                          0.6.25     2020-02-23 [1]
##    doParallel                                    * 1.0.15     2019-08-02 [1]
##    doRNG                                           1.8.2      2020-01-27 [1]
##    downloader                                      0.4        2015-07-09 [1]
##    dplyr                                         * 1.0.1      2020-07-31 [1]
##    ellipsis                                        0.3.1      2020-05-15 [1]
##    evaluate                                        0.14       2019-05-28 [1]
##    ExperimentHub                                 * 1.14.0     2020-04-27 [1]
##    fansi                                           0.4.1      2020-01-08 [1]
##    fastmap                                         1.0.1      2019-10-08 [1]
##    forcats                                         0.5.0      2020-03-01 [1]
##    foreach                                       * 1.5.0      2020-03-30 [1]
##    foreign                                         0.8-80     2020-05-24 [1]
##    fs                                              1.5.0      2020-07-31 [1]
##    genefilter                                      1.70.0     2020-04-27 [1]
##    generics                                        0.0.2      2018-11-29 [1]
##    GenomeInfoDb                                  * 1.24.2     2020-06-15 [1]
##    GenomeInfoDbData                                1.2.3      2020-07-23 [1]
##    GenomicAlignments                               1.24.0     2020-04-27 [1]
##    GenomicFeatures                                 1.40.1     2020-07-14 [1]
##    GenomicRanges                                 * 1.40.0     2020-04-27 [1]
##    GEOquery                                        2.56.0     2020-04-27 [1]
##    GetoptLong                                      1.0.2      2020-07-06 [1]
##    ggplot2                                       * 3.3.2      2020-06-19 [1]
##    ggpubr                                        * 0.4.0      2020-06-27 [1]
##    ggsignif                                        0.6.0      2019-08-08 [1]
##    GlobalOptions                                   0.1.2      2020-06-10 [1]
##    glue                                            1.4.1      2020-05-13 [1]
##    gtable                                          0.3.0      2019-03-25 [1]
##    haven                                           2.3.1      2020-06-01 [1]
##    HDF5Array                                       1.16.1     2020-06-16 [1]
##    hms                                             0.5.3      2020-01-08 [1]
##    htmltools                                       0.5.0      2020-06-16 [1]
##    httpuv                                          1.5.4      2020-06-06 [1]
##    httr                                            1.4.2      2020-07-20 [1]
##    IlluminaHumanMethylation450kanno.ilmn12.hg19    0.6.0      2020-07-23 [1]
##    IlluminaHumanMethylationEPICanno.ilm10b2.hg19   0.6.0      2020-07-23 [1]
##    illuminaio                                      0.30.0     2020-04-27 [1]
##    interactiveDisplayBase                          1.26.3     2020-06-02 [1]
##    IRanges                                       * 2.22.2     2020-05-21 [1]
##    iterators                                     * 1.0.12     2019-07-26 [1]
##    jsonlite                                        1.7.0      2020-06-25 [1]
##    knitr                                           1.29       2020-06-23 [1]
##    later                                           1.1.0.1    2020-06-05 [1]
##    lattice                                         0.20-41    2020-04-02 [1]
##    lifecycle                                       0.2.0      2020-03-06 [1]
##    limma                                           3.44.3     2020-06-12 [1]
##    lme4                                            1.1-23     2020-04-07 [1]
##    lmerTest                                        3.1-2      2020-04-08 [1]
##    locfit                                          1.5-9.4    2020-03-25 [1]
##    magrittr                                        1.5        2014-11-22 [1]
##    MASS                                            7.3-51.6   2020-04-26 [1]
##    Matrix                                          1.2-18     2019-11-27 [1]
##    matrixStats                                   * 0.56.0     2020-03-13 [1]
##    mclust                                          5.4.6      2020-04-11 [1]
##    memoise                                         1.1.0      2017-04-21 [1]
##    mime                                            0.9        2020-02-04 [1]
##    minfi                                           1.34.0     2020-04-27 [1]
##    minqa                                           1.2.4      2014-10-09 [1]
##    multtest                                        2.44.0     2020-04-27 [1]
##    munsell                                         0.5.0      2018-06-12 [1]
##    nlme                                            3.1-148    2020-05-24 [1]
##    nloptr                                          1.2.2.2    2020-07-02 [1]
##    nor1mix                                         1.3-0      2019-06-13 [1]
##    numDeriv                                        2016.8-1.1 2019-06-06 [1]
##    openssl                                         1.4.2      2020-06-27 [1]
##    openxlsx                                        4.1.5      2020-05-06 [1]
##    pillar                                          1.4.6      2020-07-10 [1]
##    pkgbuild                                        1.1.0      2020-07-13 [1]
##    pkgconfig                                       2.0.3      2019-09-22 [1]
##    pkgload                                         1.1.0      2020-05-29 [1]
##    plyr                                            1.8.6      2020-03-03 [1]
##    png                                             0.1-7      2013-12-03 [1]
##    preprocessCore                                  1.50.0     2020-04-27 [1]
##    prettyunits                                     1.1.1      2020-01-24 [1]
##    processx                                        3.4.3      2020-07-05 [1]
##    progress                                        1.2.2      2019-05-16 [1]
##    promises                                        1.1.1      2020-06-09 [1]
##    ps                                              1.3.3      2020-05-08 [1]
##    pscl                                            1.5.5      2020-03-07 [1]
##    purrr                                           0.3.4      2020-04-17 [1]
##    quadprog                                        1.5-8      2019-11-20 [1]
##    R.methodsS3                                     1.8.0      2020-02-14 [1]
##    R.oo                                            1.23.0     2019-11-03 [1]
##    R.utils                                         2.9.2      2019-12-08 [1]
##    R6                                              2.4.1      2019-11-12 [1]
##    rappdirs                                        0.3.1      2016-03-28 [1]
##    RColorBrewer                                    1.1-2      2014-12-07 [1]
##    Rcpp                                            1.0.5      2020-07-06 [1]
##    RCurl                                           1.98-1.2   2020-04-18 [1]
##    readr                                           1.3.1      2018-12-21 [1]
##    readxl                                          1.3.1      2019-03-13 [1]
##    remotes                                         2.2.0      2020-07-21 [1]
##    reshape                                         0.8.8      2018-10-23 [1]
##    reshape2                                        1.4.4      2020-04-09 [1]
##    rhdf5                                           2.32.2     2020-07-03 [1]
##    Rhdf5lib                                        1.10.1     2020-07-09 [1]
##    rio                                             0.5.16     2018-11-26 [1]
##    rjson                                           0.2.20     2018-06-08 [1]
##    rlang                                           0.4.7      2020-07-09 [1]
##    rmarkdown                                       2.3        2020-06-18 [1]
##    rngtools                                        1.5        2020-01-23 [1]
##    rprojroot                                       1.3-2      2018-01-03 [1]
##    Rsamtools                                       2.4.0      2020-04-27 [1]
##    RSQLite                                         2.2.0      2020-01-07 [1]
##    rstatix                                         0.6.0      2020-06-18 [1]
##    rstudioapi                                      0.11       2020-02-07 [1]
##    rtracklayer                                     1.48.0     2020-07-14 [1]
##    rvest                                           0.3.6      2020-07-25 [1]
##    S4Vectors                                     * 0.26.1     2020-05-16 [1]
##    scales                                          1.1.1      2020-05-11 [1]
##    scrime                                          1.3.5      2018-12-01 [1]
##    sesameData                                    * 1.6.0      2020-05-07 [1]
##    sessioninfo                                     1.1.1      2018-11-05 [1]
##    sfsmisc                                         1.1-7      2020-05-07 [1]
##    shape                                           1.4.4      2018-02-07 [1]
##    shiny                                           1.5.0      2020-06-23 [1]
##    siggenes                                        1.62.0     2020-04-27 [1]
##    statmod                                         1.4.34     2020-02-17 [1]
##    stringi                                         1.4.6      2020-02-17 [1]
##    stringr                                         1.4.0      2019-02-10 [1]
##    SummarizedExperiment                          * 1.18.2     2020-07-14 [1]
##    survival                                        3.2-3      2020-06-13 [1]
##    TCGAbiolinks                                  * 2.16.3     2020-07-15 [1]
##    testthat                                      * 2.3.2      2020-03-02 [1]
##    tibble                                          3.0.3      2020-07-10 [1]
##    tidyr                                         * 1.1.1      2020-07-31 [1]
##    tidyselect                                      1.1.0      2020-05-11 [1]
##    usethis                                         1.6.1      2020-04-29 [1]
##    vctrs                                           0.3.2      2020-07-15 [1]
##    withr                                           2.2.0      2020-04-20 [1]
##    xfun                                            0.16       2020-07-24 [1]
##    XML                                             3.99-0.5   2020-07-23 [1]
##    xml2                                            1.3.2      2020-04-23 [1]
##    xtable                                          1.8-4      2019-04-21 [1]
##    XVector                                         0.28.0     2020-04-27 [1]
##    yaml                                            2.2.1      2020-02-01 [1]
##    zip                                             2.0.4      2019-09-01 [1]
##    zlibbioc                                        1.34.0     2020-04-27 [1]
##  source        
##  CRAN (R 4.0.2)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 4.0.2)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  local         
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.1)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.1)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.1)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.1)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
##  CRAN (R 4.0.2)
##  CRAN (R 4.0.2)
##  Bioconductor  
## 
## [1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library
## 
##  P ── Loaded and on-disk path mismatch.
LS0tCnRpdGxlOiAiQ29ycmVsYXRpb24gb2YgQUQgYXNzb2NpYXRlZCBtZXRoeWxhdGlvbiBjaGFuZ2VzIHdpdGggZXhwcmVzc2lvbnMgb2YgbmVhcmJ5IGdlbmVzIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWScpYCIKYXV0aG9yOgotIExhbnl1IFpoYW5nLCBUaWFnbyBDLiBTaWx2YSwgTGlseSBXYW5nCm91dHB1dDoKICBybWFya2Rvd246Omh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogbHVtZW4KICAgIHRvYzogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgdG9jX2Zsb2F0OiBmYWxzZQogICAgdG9jX2RlcHRoOiA0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwKICB3YXJuaW5nID0gRkFMU0UsCiAgZmlnLndpZHRoID0gMTAsIAogIGZpZy5oZWlnaHQgPSAxMwopCmtuaXRyOjpvcHRzX2tuaXQkc2V0KAogIHByb2dyZXNzID0gRkFMU0UsIAogIHZlcmJvc2UgPSBGQUxTRSwKICByb290LmRpciA9ICIuLiIKKQpzaG93LnNlY3Rpb24uY29kZSA8LSBGQUxTRQpgYGAKCmByIGlmKHNob3cuc2VjdGlvbi5jb2RlKXsiIyBMb2FkIGxpYnJhcmllcyJ9YAoKYGBge3IsIGluY2x1ZGUgPSBzaG93LnNlY3Rpb24uY29kZX0Kc3VwcHJlc3NNZXNzYWdlcyh7CiAgbGlicmFyeShDb21wbGV4SGVhdG1hcCkKICBsaWJyYXJ5KFN1bW1hcml6ZWRFeHBlcmltZW50KQogIGxpYnJhcnkoR2Vub21pY1JhbmdlcykKICBsaWJyYXJ5KGNvTWV0aERNUikKICBsaWJyYXJ5KFRDR0FiaW9saW5rcykKICBsaWJyYXJ5KGdncHVicikKICBsaWJyYXJ5KGRwbHlyKQogIGxpYnJhcnkodGlkeXIpCiAgbGlicmFyeShnZ3B1YnIpCiAgbGlicmFyeShEZWxheWVkTWF0cml4U3RhdHMpCiAgZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L0Ryb3Bib3ggKEJCU1IpL1BhbkNhbmNlci9tZXRoVEYvIikKICBsaWJyYXJ5KGRvUGFyYWxsZWwpCiAgcmVnaXN0ZXJEb1BhcmFsbGVsKDQpCiAgZ2VuZS5pbmZvIDwtIFRDR0FiaW9saW5rczo6Z2V0LkdSQ2guYmlvTWFydCgiaGcxOSIpCn0pCmBgYAoKIyBEYXRhc2V0cwoKLSBETkFtIGRhdGEg4oCTIGluIGZpbGUgJ1JPU01BUF9RTkJNSVFfUENmaWx0ZXJlZC5SRFMnCi0gUk5Bc2VxIGRhdGEg4oCTIGluIGZpbGVzOgogIC0gJ1JPU01BUF9STkFzZXFfRlBLTV9nZW5lX3BsYXRlc18xX3RvXzZfbm9ybWFsaXplZC50c3YnCiAgLSAnUk9TTUFQX1JOQXNlcV9GUEtNX2dlbmVfcGxhdGVzXzdfdG9fOF9ub3JtYWxpemVkLnRzdicKLSBMaW5rIGZvciBJRHMg4oCTIGluIGZpbGUgIlJPU01BUF9JRGtleSIKICAtIGNvbHVtbiAibXdhc19pZCIgaXMgZm9yIEROQW0gZGF0YQogIC0gY29sdW1uICJybmFzZXFfaWQiIGlzIGZvciBybmFzZXEKLSBQaGVub3R5cGUgZGF0YTogIHBoZW5vX3dpdGhOZXVyb25Qcm9wX2RmLlJEUwoKIyMgR2V0IG1hdGNoZWQgZGF0YQoKYGBge1J9CiMjIFJlYWRpbmcgZGF0YSBjcmVhdGVkIHByZXZpb3VzbHkKZGF0YS5wYXRoIDwtICIuLi8uLi9jb2RlX3ZhbGlkYXRpb24vTWV0YV9hbmFseXNpc19jb2RlL0RBVEFTRVRTL1JPU01BUCIKbG9hZCgiLi4vLi4vLi4vY29NZXRoRE1SX21ldGFBbmFseXNpcy9ETkFtX1JOQS9kYXRhL21hdGNoZWRfZGF0YS5yZGEiKQpkaW0obWF0Y2hlZC5kbmFtKQpkaW0obWF0Y2hlZC5leHApCm1hdGNoZWQuZXhwIDwtIG1hdGNoZWQuZXhwW3Jvd1N1bXMobWF0Y2hlZC5leHApID4gMCxdCiNtYXRjaGVkLnBoZW5vdHlwZQojIGdnaGlzdG9ncmFtKAojICAgbWF0Y2hlZC5waGVub3R5cGUkYnJhYWtzYywKIyAgIGJpbnMgPSA3LAojICAgZmlsbCA9ICJibGFjayIsCiMgICBjb2xvciA9ICJ3aGl0ZSIsCiMgICBhbHBoYSA9IDEKIyApCmBgYAoKIyBSZWdpb24gYW5hbHlzaXMKCiMjIEdldCBtZXRhZGF0YSByZXN1bHRzCgojIyBBbmFseXNpczogUk5BIHZzIEROQW0KCldlIHdpbGwgdXNlZCByZXNpZHVhbHMgZGF0YSBmb3Igd2hpY2ggY29uZm91bmRpbmcgZWZmZWN0cyAoYWdlIGF0IGRlYXRoLCBzZXgsIGNlbGwtdHlwZSBwcm9wb3J0aW9ucywgYmF0Y2gpIGhhdmUgYmVlbiByZW1vdmVkLgoKYGBge1J9CmxvYWQoIi4uLy4uLy4uL2NvTWV0aERNUl9tZXRhQW5hbHlzaXMvRE5BbV9STkEvZGF0YS9yZXNpZHVhbHMucmRhIikKYGBgCgojIyBNYXAgcmVnaW9uIHRvIGdlbmVzICstMjUwa2IKClRoZSBmdW5jdGlvbiBgZ2V0RE5BbS50YXJnZXRgIHdpbGwgZXh0ZW5kIHRoZSByZWdpb25zICQrLTI1MEticCQgYW5kIHJldHVybiB0aGUgb3ZlcmxhcHBpbmcgZ2VuZXMuCgoKYGBge1J9CnJlZ2lvbnMuZ3IgPC0gcm93bmFtZXMocmVzaWRfbWV0KSAlPiUgCiAgYXMuZGF0YS5mcmFtZSAlPiUgCiAgdGlkeXI6OnNlcGFyYXRlKGNvbCA9ICIuIixpbnRvID0gYygiY2hyIiwic3RhcnQiLCJlbmQiKSkgICU+JQogIG1ha2VHUmFuZ2VzRnJvbURhdGFGcmFtZSgpCm5hbWVzKHJlZ2lvbnMuZ3IpIDwtIHJvd25hbWVzKHJlc2lkX21ldCkKcmVnaW9ucy5ncgoKIyBmdW5jdGlvbiBhdmFpbGFibGUgaW4gbWV0aFRGIHBhY2thZ2UgaHR0cHM6Ly9naXRsYWIuY29tL3RpYWdvY2hzdC9tZXRodGYKcmVnaW9ucy5nZW5lcyA8LSBnZXRfcmVnaW9uX3RhcmdldF9nZW5lKAogIHJlZ2lvbnMuZ3IgPSByZWdpb25zLmdyLAogIGdlbm9tZSA9ICJoZzE5IiwKICBtZXRob2QgPSAid2luZG93IiwKICB3aW5kb3cuc2l6ZSA9IDUwMCAqIDEwIF4gMwopICMgNTAwIGtiCgpyZWdpb25zLmdlbmVzIDwtIHJlZ2lvbnMuZ2VuZXMgJT4lCiAgZHBseXI6OmZpbHRlcihyZWdpb25zLmdlbmVzJHRhcmdldCAlaW4lIHJvd25hbWVzKHJlc2lkX2V4cCkpCgpkaW0ocmVnaW9ucy5nZW5lcykKaGVhZChyZWdpb25zLmdlbmVzKQpgYGAKCiMjIFRhcmdldCB2cyBETkFtIHJlc2lkdWFsCgpgYGB7UiwgZXZhbCA9IFRSVUV9CiMgaHR0cDovL3d3dy5yLXR1dG9yLmNvbS9lbGVtZW50YXJ5LXN0YXRpc3RpY3Mvc2ltcGxlLWxpbmVhci1yZWdyZXNzaW9uL3Jlc2lkdWFsLXBsb3QKZG9QYXJhbGxlbDo6cmVnaXN0ZXJEb1BhcmFsbGVsKGRldGVjdENvcmVzKCkvMikKdGFiIDwtIHBseXI6OmFkcGx5KAogIHJlZ2lvbnMuZ2VuZXMsCiAgLm1hcmdpbnMgPSAxLAogIC5mdW4gPSBmdW5jdGlvbihyb3cpIHsKICAgIHRyeUNhdGNoKHsKICAgICAgcm5hLnRhcmdldCA8LSByZXNpZF9leHBbcm93bmFtZXMocmVzaWRfZXhwKSA9PSByb3ckdGFyZ2V0LCAsIGRyb3AgPSBGQUxTRV0KICAgICAgbWV0LnJlc2lkdWFsIDwtIHJlc2lkX21ldFtyb3duYW1lcyhyZXNpZF9tZXQpID09IGFzLmNoYXJhY3Rlcihyb3ckcmVnaW9uSUQpLCBdCiAgICAgIAogICAgICBkZiA8LSBkYXRhLmZyYW1lKAogICAgICAgIHJuYS5yZXNpZHVhbCA9IHJuYS50YXJnZXQgJT4lIGFzLm51bWVyaWMsCiAgICAgICAgbWV0LnJlc2lkdWFsID0gbWV0LnJlc2lkdWFsICU+JSBhcy5udW1lcmljLAogICAgICAgIEJyYWFrX3N0YWdlID0gbWF0Y2hlZC5waGVub3R5cGUkYnJhYWtzYyAlPiUgYXMubnVtZXJpYwogICAgICApCiAgICAgIAogICAgICAjIGZpdCBsaW5lYXIgbW9kZWw6CiAgICAgIHJlc3VsdHMuYWxsIDwtICBsbSgKICAgICAgICBybmEucmVzaWR1YWwgfiBtZXQucmVzaWR1YWwgKyBCcmFha19zdGFnZSwgZGF0YSA9IGRmCiAgICAgICkKICAgICAgcmVzdWx0cy5hbGwucHZhbCA8LSBzdW1tYXJ5KHJlc3VsdHMuYWxsKSRjb2VmZmljaWVudHNbCiAgICAgICAgICAyLCAiUHIoPnx0fCkiLCBkcm9wID0gRl0gJT4lIAogICAgICAgICAgdCAlPiUgYXMuZGF0YS5mcmFtZSgpCiAgICAgIHJlc3VsdHMuYWxsLmVzdGltYXRlIDwtIHN1bW1hcnkocmVzdWx0cy5hbGwpJGNvZWZmaWNpZW50c1sKICAgICAgICAgIDIsICJFc3RpbWF0ZSIsIGRyb3AgPSBGXSAlPiUgCiAgICAgICAgICB0ICU+JSBhcy5kYXRhLmZyYW1lKCkKICAgICAgY29sbmFtZXMocmVzdWx0cy5hbGwucHZhbCkgPC0gcGFzdGUwKAogICAgICAgICAgImFsbF9wdmFsXyIsIGNvbG5hbWVzKHJlc3VsdHMuYWxsLnB2YWwpKQogICAgICBjb2xuYW1lcyhyZXN1bHRzLmFsbC5lc3RpbWF0ZSkgPC0gcGFzdGUwKAogICAgICAgICAgImFsbF9lc3RpbWF0ZV8iLCBjb2xuYW1lcyhyZXN1bHRzLmFsbC5lc3RpbWF0ZSkpCiAgICAgIAogICAgICByZXR1cm4oCiAgICAgICAgZGF0YS5mcmFtZSgKICAgICAgICAgIGNiaW5kKHJlc3VsdHMuYWxsLnB2YWwsIHJlc3VsdHMuYWxsLmVzdGltYXRlKSwKICAgICAgICAgIHJvdy5uYW1lcyA9IE5VTEwsCiAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UKICAgICAgICApCiAgICAgICkKICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICBwcmludChyb3cpCiAgICAgIHJldHVybigpCiAgICB9KQogIH0sCiAgLmlkID0gTlVMTCwKICAucHJvZ3Jlc3MgPSAidGltZSIsCiAgLnBhcmFsbGVsID0gVFJVRSwKICAuaW5mb3JtID0gVFJVRQopCmBgYAoKYGBge1IsIGV2YWwgPSBGQUxTRX0KcmVhZHI6OndyaXRlX2NzdigKICAgIHRhYiwKICAgIHBhdGggPSAiLi9OYXRDb21tX3JldmlzaW9uL0RBVEFTRVRTL2dlbmVfZXhwcmVzc2lvbl9yZXN1bHRzL3Jlc3VsdHNfcmVnaW9uc19sbV8yNTBrYl93aW5kb3cuY3N2IgopCmBgYAoKIyMjIFJlc3VsdHMKCmBgYHtSfQp0YWIgPC0gcmVhZHI6OnJlYWRfY3N2KAogIGZpbGUgPSAiLi9OYXRDb21tX3JldmlzaW9uL0RBVEFTRVRTL2dlbmVfZXhwcmVzc2lvbl9yZXN1bHRzL3Jlc3VsdHNfcmVnaW9uc19sbV8yNTBrYl93aW5kb3cuY3N2IiwKICAgIGNvbF90eXBlcyA9IHJlYWRyOjpjb2xzKCkKKQoKbWV0YS5hbmFseXNpcy5mb2xkZXIgPC0gIi4uLy4uL2NvZGVfdmFsaWRhdGlvbi9NZXRhX2FuYWx5c2lzX2NvZGUvbWV0YV9hbmFseXNpc19yZWdpb25fcmVzdWx0cy8iCnJlZ2lvbi5hbmFseXNpcyA8LSByZWFkcjo6cmVhZF9jc3YoCiAgZmlsZS5wYXRoKG1ldGEuYW5hbHlzaXMuZm9sZGVyLCJzdGVwNF9kbXJfdnNfY3Bncy9tZXRhX2FuYWx5c2lzX3NpZ19ub19jcm9zc0h5Yl9zbW9raW5nX292X2NvbWJfcF93aXRoX3NpZ19zaW5nbGVfY3Bncy5jc3YiKSwKICBjb2xfdHlwZXMgPSByZWFkcjo6Y29scygpCikKCnRhYiRhbGxfZmRyIDwtIHAuYWRqdXN0KHRhYiRhbGxfcHZhbF9tZXQucmVzaWR1YWwsbWV0aG9kID0gImZkciIpCgpvdXRwdXQgPC0gdGFiWyxjKCJyZWdpb25JRCIsInRhcmdldF9nZW5lX25hbWUiLAogICAgICAgICAgICAgICAgICJhbGxfZXN0aW1hdGVfbWV0LnJlc2lkdWFsIiwKICAgICAgICAgICAgICAgICAiYWxsX3B2YWxfbWV0LnJlc2lkdWFsIiwiYWxsX2ZkciIpXSAKY29sbmFtZXMob3V0cHV0KSA8LSBjKAogICJjb01ldGhETVIiLAogICJnZW5lU3ltYm9sIiwKICAiZXN0aW1hdGUuYWxsIiwKICAicHZhbC5hbGwiLAogICJmZHIuYWxsIgopCgpjb2xzIDwtIGMoCiAgZ3JlcCgiUk9TTUFQX2NvTWV0aFJlZ2lvbiIsY29sbmFtZXMocmVnaW9uLmFuYWx5c2lzKSksCiAgZ3JlcCgiUmVsYXRpb24iLGNvbG5hbWVzKHJlZ2lvbi5hbmFseXNpcykpOmdyZXAoIl5zbW9rZV9iaSQiLGNvbG5hbWVzKHJlZ2lvbi5hbmFseXNpcykpCikKb3V0cHV0MiA8LSBtZXJnZSgKICBvdXRwdXQsCiAgcmVnaW9uLmFuYWx5c2lzWyxjb2xzXSwKICBieS54ID0gImNvTWV0aERNUiIsIAogIGJ5LnkgPSAiUk9TTUFQX2NvTWV0aFJlZ2lvbiIsCiAgYWxsLnggPSBUUlVFCikKb3V0cHV0MiA8LSBvdXRwdXQyICU+JSBhcnJhbmdlKHB2YWwuYWxsKQpgYGAKCmBgYHtSLCBldmFsID0gRkFMU0V9CndyaXRlLmNzdigKICAgIG91dHB1dDIsCiAgICBmaWxlID0gIi4vTmF0Q29tbV9yZXZpc2lvbi9EQVRBU0VUUy9nZW5lX2V4cHJlc3Npb25fcmVzdWx0cy9yZXN1bHRzX3JlZ2lvbnNfbG1fMjUwa2Jfd2luZG93X3JlbmFtZWQuY3N2IiwKICAgIHJvdy5uYW1lcyA9IEZBTFNFCikKYGBgCgojIFNpbmdsZSBjcGcgYW5hbHlzaXMKCiMjIEdldCBtZXRhZGF0YSByZXN1bHRzCgojIyBBbmFseXNpczogUk5BIHZzIEROQW0KCkxvYWQgRE5BbSBkYXRhIHRoYXQgcmVtb3ZlZCBjb25mb3VuZGluZyBlZmZlY3RzLgoKYGBge1IsIGV2YWwgPSBUUlVFLCBpbmNsdWRlID0gRkFMU0V9CmxvYWQoIi4uLy4uLy4uL2NvTWV0aERNUl9tZXRhQW5hbHlzaXMvRE5BbV9STkEvZGF0YS9yZXNpZHVhbHNfY3BnLnJkYSIpCmBgYAoKIyMgTWFwIHJlZ2lvbiB0byBnZW5lcyArLTI1MGtiCgpUaGUgZnVuY3Rpb24gYGdldF9yZWdpb25fdGFyZ2V0X2dlbmVgIHdpbGwgZXh0ZW5kIHRoZSByZWdpb25zICQrLTI1MEticCQgYW5kIHJldHVybiB0aGUgb3ZlcmxhcHBpbmcgZ2VuZXMuCgpgYGB7Un0KcHJvYmVzLmluZm8gPC0gc2VzYW1lRGF0YTo6c2VzYW1lRGF0YUdldCgiSE00NTAuaGcxOS5tYW5pZmVzdCIpCmRtci5nciA8LSBwcm9iZXMuaW5mb1tyb3cubmFtZXMocmVzaWRfbWV0X2NwZyksXSAKcmVnaW9ucy5nZW5lcyA8LSBnZXRfcmVnaW9uX3RhcmdldF9nZW5lKAogIHJlZ2lvbnMuZ3IgPSBkbXIuZ3IsCiAgZ2Vub21lID0gImhnMTkiLAogIG1ldGhvZCA9ICJ3aW5kb3ciLAogIHdpbmRvdy5zaXplID0gNTAwICogMTAgXiAzCikgIyA1MDAga2IKCnJlZ2lvbnMuZ2VuZXMgPC0gcmVnaW9ucy5nZW5lcyAlPiUKICBkcGx5cjo6ZmlsdGVyKHJlZ2lvbnMuZ2VuZXMkdGFyZ2V0ICVpbiUgcm93bmFtZXMocmVzaWRfZXhwKSkKCnJlZ2lvbnMuZ2VuZXMkY3BnIDwtIG5hbWVzKGRtci5ncilbCiAgbWF0Y2goCiAgICAgIHJlZ2lvbnMuZ2VuZXMkcmVnaW9uSUQsCiAgICAgIHBhc3RlMCgKICAgICAgICAgIGFzLmRhdGEuZnJhbWUoZG1yLmdyKSRzZXFuYW1lcywgIjoiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZShkbXIuZ3IpJHN0YXJ0LCItIiwKICAgICAgICAgIGFzLmRhdGEuZnJhbWUoZG1yLmdyKSRlbmQKICAgICAgKQogICkKXQoKZGltKHJlZ2lvbnMuZ2VuZXMpCmhlYWQocmVnaW9ucy5nZW5lcykKYGBgCgojIyBUYXJnZXQgdnMgRE5BbSByZXNpZHVhbAoKYGBge1IsIGV2YWwgPSBUUlVFfQojIGh0dHA6Ly93d3cuci10dXRvci5jb20vZWxlbWVudGFyeS1zdGF0aXN0aWNzL3NpbXBsZS1saW5lYXItcmVncmVzc2lvbi9yZXNpZHVhbC1wbG90CmRvUGFyYWxsZWw6OnJlZ2lzdGVyRG9QYXJhbGxlbChkZXRlY3RDb3JlcygpLzIpCnRhYi5jcGcgPC0gcGx5cjo6YWRwbHkoCiAgcmVnaW9ucy5nZW5lcywKICAubWFyZ2lucyA9IDEsCiAgLmZ1biA9IGZ1bmN0aW9uKHJvdykgewogICAgdHJ5Q2F0Y2goewogICAgICBybmEudGFyZ2V0IDwtCiAgICAgICAgcmVzaWRfZXhwW3Jvd25hbWVzKHJlc2lkX2V4cCkgPT0gcm93JHRhcmdldCwgLCBkcm9wID0gRkFMU0VdCiAgICAgIG1ldC5yZXNpZHVhbCA8LQogICAgICAgIHJlc2lkX21ldF9jcGdbcm93bmFtZXMocmVzaWRfbWV0X2NwZykgPT0gYXMuY2hhcmFjdGVyKHJvdyRjcGcpLCBdCiAgICAgIAogICAgICBkZiA8LSBkYXRhLmZyYW1lKAogICAgICAgICAgICAgIHJuYS5yZXNpZHVhbCA9IHJuYS50YXJnZXQgJT4lIGFzLm51bWVyaWMsCiAgICAgICAgICAgICAgbWV0LnJlc2lkdWFsID0gbWV0LnJlc2lkdWFsICU+JSBhcy5udW1lcmljLAogICAgICAgICAgICAgIEJyYWFrX3N0YWdlID0gbWF0Y2hlZC5waGVub3R5cGUkYnJhYWtzYyAlPiUgYXMubnVtZXJpYwogICAgICApCiAgICAgIAogICAgICAjIGZpdCBsaW5lYXIgbW9kZWwKICAgICAgcmVzdWx0cy5hbGwgPC0gbG0oCiAgICAgICAgICBybmEucmVzaWR1YWwgfiBtZXQucmVzaWR1YWwgKyBCcmFha19zdGFnZSwgZGF0YSA9IGRmCiAgICAgICkKICAgICAgCiAgICAgICMgZ2V0IHB2YWx1ZXMgY29lZmljaWVudHMKICAgICAgcmVzdWx0cy5hbGwucHZhbCA8LSBzdW1tYXJ5KHJlc3VsdHMuYWxsKSRjb2VmZmljaWVudHNbCiAgICAgICAgICAyLCA0LCBkcm9wID0gRl0gJT4lIHQgJT4lIGFzLmRhdGEuZnJhbWUoKQogICAgICBjb2xuYW1lcyhyZXN1bHRzLmFsbC5wdmFsKSA8LQogICAgICAgIHBhc3RlMCgiYWxsX3B2YWxfIiwgY29sbmFtZXMocmVzdWx0cy5hbGwucHZhbCkpCgogICAgICAjIGdldCBlc3RpbWF0ZSBjb2VmaWNpZW50cwogICAgICByZXN1bHRzLmFsbC5lc3RpbWF0ZSA8LSBzdW1tYXJ5KHJlc3VsdHMuYWxsKSRjb2VmZmljaWVudHNbCiAgICAgICAgICAyLCAxLCBkcm9wID0gRl0gJT4lIHQgJT4lIGFzLmRhdGEuZnJhbWUoKQogICAgICBjb2xuYW1lcyhyZXN1bHRzLmFsbC5lc3RpbWF0ZSkgPC0KICAgICAgICBwYXN0ZTAoImFsbF9lc3RpbWF0ZV8iLCBjb2xuYW1lcyhyZXN1bHRzLmFsbC5lc3RpbWF0ZSkpCiAgICAgIAogICAgICByZXR1cm4oCiAgICAgICAgZGF0YS5mcmFtZSgKICAgICAgICAgIGNiaW5kKHJlc3VsdHMuYWxsLnB2YWwsIHJlc3VsdHMuYWxsLmVzdGltYXRlKSwKICAgICAgICAgIHJvdy5uYW1lcyA9IE5VTEwsCiAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UKICAgICAgICApCiAgICAgICkKICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICBwcmludChyb3cpCiAgICAgIHJldHVybigpCiAgICB9KQogIH0sCiAgLmlkID0gTlVMTCwKICAucHJvZ3Jlc3MgPSAidGltZSIsCiAgLnBhcmFsbGVsID0gVFJVRSwKICAuaW5mb3JtID0gVFJVRQopCmBgYAoKYGBge1IsIGV2YWwgPSBUUlVFfQpyZWFkcjo6d3JpdGVfY3N2KAogICAgdGFiLmNwZywKICAgIHBhdGggPSAiLi9OYXRDb21tX3JldmlzaW9uL0RBVEFTRVRTL2dlbmVfZXhwcmVzc2lvbl9yZXN1bHRzL3Jlc3VsdHNfc2luZ2xlX2NwZ19sbV8yNTBrYl93aW5kb3cuY3N2IgopCmBgYAoKIyMjIFJlc3VsdHMKCmBgYHtSfQp0YWIuY3BnIDwtIHJlYWRyOjpyZWFkX2NzdigKICAgICIuL05hdENvbW1fcmV2aXNpb24vREFUQVNFVFMvZ2VuZV9leHByZXNzaW9uX3Jlc3VsdHMvcmVzdWx0c19zaW5nbGVfY3BnX2xtXzI1MGtiX3dpbmRvdy5jc3YiLAogICAgY29sX3R5cGVzID0gcmVhZHI6OmNvbHMoKQopCnRhYi5jcGckZmRyLmFsbCA8LSBwLmFkanVzdCh0YWIuY3BnJGFsbF9wdmFsX21ldC5yZXNpZHVhbCxtZXRob2QgPSAiZmRyIikKCm91dHB1dCA8LSB0YWIuY3BnWyxjKCJjcGciLCJ0YXJnZXRfZ2VuZV9uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgImFsbF9lc3RpbWF0ZV9tZXQucmVzaWR1YWwiLAogICAgICAgICAgICAgICAgICAgICAiYWxsX3B2YWxfbWV0LnJlc2lkdWFsIiwiZmRyLmFsbCIpCiAgICAgICAgICAgICAgICAgIF0gCmNvbG5hbWVzKG91dHB1dCkgPC0gYygKICAiY3BnIiwKICAiZ2VuZVN5bWJvbCIsCiAgImVzdGltYXRlLmFsbCIsCiAgInB2YWwuYWxsIiwKICAiZmRyLmFsbCIKKQpvdXRwdXQgPC0gb3V0cHV0ICU+JSBhcnJhbmdlKHB2YWwuYWxsKQpgYGAKCmBgYHtSLCBldmFsID0gVFJVRX0Kd3JpdGUuY3N2KAogICAgb3V0cHV0LAogICAgZmlsZSA9ICIuL05hdENvbW1fcmV2aXNpb24vREFUQVNFVFMvZ2VuZV9leHByZXNzaW9uX3Jlc3VsdHMvcmVzdWx0c19zaW5nbGVfY3BnX2xtXzI1MGtiX3dpbmRvd19yZW5hbWVkLmNzdiIsCiAgICByb3cubmFtZXMgPSBGQUxTRQopCmBgYAoKIyBTcGxpdHRpbmcgcmVzdWx0cyBieSBncm91cCAKCiMjIERNUnMKCmBgYHtSfQpkbXIgPC0gcmVhZC5jc3YoCiAgIi4vTmF0Q29tbV9yZXZpc2lvbi9EQVRBU0VUUy9nZW5lX2V4cHJlc3Npb25fcmVzdWx0cy9yZXN1bHRzX3JlZ2lvbnNfbG1fMjUwa2Jfd2luZG93X3JlbmFtZWQuY3N2IgopCnBhdGhEcm9wYm94IDwtIGZpbGUucGF0aChkaXIoIn4iLCBwYXR0ZXJuID0gIkRyb3Bib3giLCBmdWxsLm5hbWVzID0gVFJVRSkpCmRtcl9tZXRhIDwtIHJlYWQuY3N2KAogIGZpbGUucGF0aChwYXRoRHJvcGJveCwKICAgICAgICAgICAgImNvTWV0aERNUl9tZXRhQW5hbHlzaXMvIiwKICAgICAgICAgICAgImNvZGVfdmFsaWRhdGlvbi9NZXRhX2FuYWx5c2lzX2NvZGUvbWV0YV9hbmFseXNpc19yZWdpb25fcmVzdWx0cyIsCiAgICAgICAgICAgICIvc3RlcDRfZG1yX3ZzX2NwZ3MvbWV0YV9hbmFseXNpc19zaWdfbm9fY3Jvc3NIeWJfc21va2luZ19vdl9jb21iX3Bfd2l0aF9hbGwuY3N2IikKKVssIGMoIlJPU01BUF9jb01ldGhSZWdpb24iLAogICAgICAiR1JFQVRfYW5ub3RhdGlvbiIsCiAgICAgICJVQ1NDX1JlZkdlbmVfR3JvdXAiLAogICAgICAiVUNTQ19SZWZHZW5lX0FjY2Vzc2lvbiIsCiAgICAgICJVQ1NDX1JlZkdlbmVfTmFtZSIsCiAgICAgICJzdGF0ZSIpCiAgXQoKZG1yLmFubm90IDwtIG1lcmdlKAogIGRtciwgZG1yX21ldGEsCiAgYnkueCA9ICJjb01ldGhETVIiLAogIGJ5LnkgPSAiUk9TTUFQX2NvTWV0aFJlZ2lvbiIsCiAgc29ydCA9IEZBTFNFCikKCmRtci5hbm5vdCA8LSBkbXIuYW5ub3RbCiAgICBvcmRlcihkbXIuYW5ub3QkcHZhbC5hbGwpLCBjKDE6NSwgMTc6MjAsIDYsIDIxLCA3OiAxNCkKXQpgYGAKCmBgYHtSLCBldmFsID0gVFJVRX0Kd3JpdGUuY3N2KAogIGRtci5hbm5vdCwKICAiLi9OYXRDb21tX3JldmlzaW9uL0RBVEFTRVRTL2dlbmVfZXhwcmVzc2lvbl9yZXN1bHRzL3Jlc3VsdHNfcmVnaW9uc19sbV8yNTBrYl93aW5kb3dfcmVuYW1lZF93aXRoX2Fubm90LmNzdiIKKQpgYGAKCiMjIENwR3MKCmBgYHtSfQpjcGcgPC0gcmVhZC5jc3YoCiAgIi4vTmF0Q29tbV9yZXZpc2lvbi9EQVRBU0VUUy9nZW5lX2V4cHJlc3Npb25fcmVzdWx0cy9yZXN1bHRzX3NpbmdsZV9jcGdfbG1fMjUwa2Jfd2luZG93X3JlbmFtZWQuY3N2IgopCmNwZ19tZXRhIDwtIHJlYWQuY3N2KAogICAgZmlsZS5wYXRoKHBhdGhEcm9wYm94LAogICAgICAgICAgICAiY29NZXRoRE1SX21ldGFBbmFseXNpcy8iLAogICAgICAgICAgICAiY29kZV92YWxpZGF0aW9uL01ldGFfYW5hbHlzaXNfY29kZS9tZXRhX2FuYWx5c2lzX3NpbmdsZV9jcGdfcmVzdWx0cy8iLAogICAgICAgICAgICAiL21ldGFfYW5hbHlzaXNfc2luZ2xlX2NwZ19zaWdfbm9fY3Jvc3NIeWJfc21va2luZ193aXRoX3N0YXRlX2dyZWF0QW5ub3RfZGYuY3N2IikKKVssIGMoImNwZyIsCiAgICAgICJHUkVBVF9hbm5vdGF0aW9uIiwKICAgICAgIlVDU0NfUmVmR2VuZV9Hcm91cCIsCiAgICAgICJVQ1NDX1JlZkdlbmVfQWNjZXNzaW9uIiwKICAgICAgIlVDU0NfUmVmR2VuZV9OYW1lIiwKICAgICAgIlJlbGF0aW9uX3RvX0lzbGFuZCIsCiAgICAgICJzdGF0ZSIsCiAgICAgICJlc3RpbWF0ZSIsIAogICAgICAic2UiLCAKICAgICAgInBWYWwuZml4ZWQiLCAKICAgICAgInBWYWwucmFuZG9tIiwKICAgICAgInBWYWxRIiwgCiAgICAgICJkaXJlY3Rpb24iLCAKICAgICAgInBWYWwuZmluYWwiLCAKICAgICAgImZkciIpCiAgXQoKY3BnLmFubm90IDwtIG1lcmdlKAogIGNwZywgY3BnX21ldGEsCiAgYnkgPSAiY3BnIiwKICBzb3J0ID0gRkFMU0UKKQoKY3BnLmFubm90IDwtIGNwZy5hbm5vdCAlPiUgYXJyYW5nZShwdmFsLmFsbCkKYGBgCgpgYGB7UiwgZXZhbCA9IEZBTFNFfQp3cml0ZS5jc3YoCiAgY3BnLmFubm90LAogICIuL05hdENvbW1fcmV2aXNpb24vREFUQVNFVFMvZ2VuZV9leHByZXNzaW9uX3Jlc3VsdHMvcmVzdWx0c19zaW5nbGVfY3BnX2xtXzI1MGtiX3dpbmRvd19yZW5hbWVkX3dpdGhfYW5ub3QuY3N2IgopCmBgYAoKIyBTZXNzaW9uIGluZm9ybWF0aW9uCgpgYGB7Un0KZGV2dG9vbHM6OnNlc3Npb25faW5mbygpCmBgYAo=