1 Introduction

Functional Enrichment Analysis (FEA) is a key downstream step in omics workflows, commonly applied after differential expression analysis to support biological interpretation and generate pathway-level hypotheses. A wide range of tools and methods are available, mainly Over-Representation Analysis (ORA) (Khatri, Sirota, and Butte 2012) and Gene Set Enrichment Analysis (GSEA) (Subramanian et al. 2005), leading to substantial heterogeneity in analytical choices and reported results.

Despite its widespread use, FEA is often insufficiently documented (Wijesooriya et al. 2022). Critical parameters such as background gene sets or multiple testing correction methods are frequently missing or inconsistently reported in scientific papers, limiting reproducibility and interpretability. Currently, no standardized framework exists to ensure transparent and reproducible documentation of FEA workflows, comparable to the MIAME guidelines (Brazma et al. 2001).

Similar approaches have been developed outside the Bioconductor ecosystem to improve transparency and reproducibility in other analytical contexts. For example, tidylog records operations performed with dplyr and tidyr, while omicslog tracks transformations applied to omics-oriented objects. However, no tool specifically addresses the metadata and provenance requirements of FEA workflows.

To address this gap, we introduce EMMA (standing for Enrichment Methods MAtters), a framework that automatically captures key analytical parameters and provenance information during the execution of FEA methods.

This vignette demonstrates how EMMA integrates with existing tools (e.g. clusterProfiler, topGO, Enrichr, gprofiler2) to execute enrichment analyses while systematically capturing analysis parameters and provenance information during runtime, returning enrichment results without altering their original format, alongside structured and reusable metadata.

1.1 What do you get with EMMA?

Using EMMA allows you to:

  • Record the exact function call and parameters used for FEA
  • Automatically track annotation sources (e.g. organism, gene set database)
  • Retain provenance directly within the results object
  • Generate reproducible summaries of the analysis (e.g. Methods sections)
  • Facilitate sharing of results together with their analysis context

1.2 How does EMMA work?

EMMA works by wrapping an enrichment call, executing it, and capturing relevant provenance information and parameters during runtime. The recorded metadata is then attached directly to the result object using R’s attribute system.

This approach enables EMMA to preserve provenance information without modifying the original result structure or introducing new classes, allowing users to continue working seamlessly with standard outputs from existing tools.

While Bioconductor provides dedicated metadata slots for certain S4 classes (e.g. via metadata()), these are not consistently available across all enrichment result types. By relying on attributes, provenance information can be attached to any result object regardless of its underlying class.

2 Installation

To install this package, start R and enter:

if (!requireNamespace("BiocManager", quietly = TRUE)) {
  install.packages("BiocManager")}

BiocManager::install("EMMA")

Once installed, the package can be loaded and attached to the current workspace as follows:

library("EMMA")

3 Usage example of EMMA: the macrophage dataset

3.1 About the data

In the remainder of this vignette, we will illustrate the main features of EMMA on a publicly available dataset from Alasoo, et al. “Shared genetic effects on chromatin and gene expression indicate a role for enhancer priming in immune response”, published in Nature Genetics, January 2018 (Alasoo et al. 2018).

The data is made available via the macrophage Bioconductor package, which contains the files output from the Salmon quantification (version 0.12.0, with GENCODE v29 reference), as well as the values summarized at the gene level, which we will use to exemplify.

In the macrophage experimental setting, the samples are available from 6 different donors, in 4 different conditions (naive, treated with Interferon gamma, with SL1344, or with a combination of Interferon gamma and SL1344).

Let’s start by loading all the necessary packages:

library("EMMA")

library("macrophage")
library("DESeq2")
library("org.Hs.eg.db")
library("clusterProfiler")
library("mosdef")
library("topGO")
library("GO.db")

We will show an example of how EMMA fits into a regular bulk RNA-seq data analysis workflow.

3.2 Getting a list of Differentially Expressed Genes

For this, we will load the macrophage data and perform Differential Expression Analysis with DESeq2

# load data
data(gse, package = "macrophage")
# set up design
dds_macrophage <- DESeqDataSet(gse, design = ~ line + condition)
# preprocess
rownames(dds_macrophage) <- substr(rownames(dds_macrophage), 1, 15)
keep <- rowSums(counts(dds_macrophage) >= 10) >= 6
dds_macrophage <- dds_macrophage[keep, ]

# set seed for reproducibility
set.seed(2711)
# sample randomly for 2k genes
selected_genes <- sample(rownames(dds_macrophage), 2000)

dds_macrophage <- dds_macrophage[selected_genes, ]

# run DESeq
dds_macrophage <- DESeq(dds_macrophage)

# get de res for 1st contrast
IFNg_vs_naive <- results(dds_macrophage,
                         contrast = c("condition", "IFNg", "naive"),
                         lfcThreshold = 1, alpha = 0.05)
IFNg_vs_naive <- lfcShrink(dds_macrophage, coef = "condition_IFNg_vs_naive",
                           res = IFNg_vs_naive,
                           type = "apeglm")
IFNg_vs_naive$SYMBOL <- rowData(dds_macrophage)$SYMBOL

# get de res for 2st contrast
SL1344_vs_naive <- results(dds_macrophage,
                         contrast = c("condition", "SL1344", "naive"),
                         lfcThreshold = 1, alpha = 0.05)
SL1344_vs_naive <- lfcShrink(dds_macrophage, coef = "condition_SL1344_vs_naive",
                           res = SL1344_vs_naive,
                           type = "apeglm")
SL1344_vs_naive$SYMBOL <- rowData(dds_macrophage)$SYMBOL

# sort by adjusted p value
de_list <- list(
  IFNg_vs_naive = IFNg_vs_naive,
  SL1344_vs_naive = SL1344_vs_naive
)

de_list <- lapply(de_list, function(df) {
  df <- df[order(df$padj), ]
  df <- df[!is.na(df$padj) & df$padj <= 0.05, ]
  df
})
# set background gene list
gene_universe <- rownames(dds_macrophage)

3.3 Performing Functional Enrichment Analysis (FEA)

Now that we have a list of DE genes for this contrast, we can perform Functional Enrichment Analysis.
We do this first without the functionality provided by EMMA.

In the following example, we will use the function enrichGO() from clusterProfiler

de_res <- de_list$IFNg_vs_naive

fea_res <- enrichGO(gene = rownames(de_res),
                    universe = gene_universe,
                    keyType = "ENSEMBL",
                    OrgDb = org.Hs.eg.db,
                    ont = "BP",
                    pAdjustMethod = "BH",
                    pvalueCutoff = 0.05,
                    qvalueCutoff = 0.1)

4 Entering the EMMA framework

From now on, we will complement the existing workflow with the functionality provided by EMMA.

4.1 EMMA_run(): Capturing the recorded information

EMMA_run() accepts a function call (e.g. enrichGO(...)) and executes it as it is, while capturing the associated parameters and provenance information:

# perform FEA, but with EMMA!
fea_res <- enrichGO(gene = rownames(de_res),
                    universe = gene_universe,
                    keyType = "ENSEMBL",
                    OrgDb = org.Hs.eg.db,
                    ont = "BP",
                    pAdjustMethod = "BH",
                    pvalueCutoff = 0.05,
                    qvalueCutoff = 0.1) |> 
  EMMA_run() # simply pipe your call to EMMA_run()
# check res
fea_res
#> #
#> # over-representation test
#> #
#> #...@organism     Homo sapiens 
#> #...@ontology     BP 
#> #...@keytype      ENTREZID 
#> #...@gene     chr [1:103] "51778" "387751" "10537" "7453" "972" "441168" "2635" "80380" ...
#> #...pvalues adjusted by 'BH' with cutoff < 0.05
#> #...67 enriched terms found
#> 'data.frame':    67 obs. of  12 variables:
#>  $ ID            : chr  "GO:0006955" "GO:0002376" "GO:0009607" "GO:0002250" ...
#>  $ Description   : chr  "immune response" "immune system process" "response to biotic stimulus" "adaptive immune response" ...
#>  $ GeneRatio     : chr  "29/80" "31/80" "24/80" "12/80" ...
#>  $ BgRatio       : chr  "157/1447" "224/1447" "145/1447" "39/1447" ...
#>  $ RichFactor    : num  0.185 0.138 0.166 0.308 0.152 ...
#>  $ FoldEnrichment: num  3.34 2.5 2.99 5.57 2.75 ...
#>  $ zScore        : num  7.51 5.92 6.12 6.99 5.63 ...
#>  $ pvalue        : num  4.14e-10 1.52e-07 2.18e-07 4.17e-07 1.18e-06 ...
#>  $ p.adjust      : num  5.90e-07 1.03e-04 1.03e-04 1.48e-04 3.08e-04 ...
#>  $ qvalue        : num  5.90e-07 1.03e-04 1.03e-04 1.48e-04 3.08e-04 ...
#>  $ geneID        : chr  "ENSG00000197646/ENSG00000275718/ENSG00000205846/ENSG00000137628/ENSG00000124508/ENSG00000138496/ENSG00000165949"| __truncated__ "ENSG00000197646/ENSG00000275718/ENSG00000205846/ENSG00000137628/ENSG00000124508/ENSG00000138496/ENSG00000165949"| __truncated__ "ENSG00000197646/ENSG00000275718/ENSG00000154920/ENSG00000205846/ENSG00000137628/ENSG00000138496/ENSG00000165949"| __truncated__ "ENSG00000197646/ENSG00000205846/ENSG00000188389/ENSG00000310469/ENSG00000116514/ENSG00000206503/ENSG00000100368"| __truncated__ ...
#>  $ Count         : int  29 31 24 12 24 10 22 22 17 13 ...
#> #...Citation
#> S Xu, E Hu, Y Cai, Z Xie, X Luo, L Zhan, W Tang, Q Wang, B Liu, R Wang, W Xie, T Wu, L Xie, G Yu. Using clusterProfiler to characterize multiomics data. Nature Protocols. 2024, 19(11):3292-3320

… or you can simply wrap EMMA_run() around your call:

# you can also pass the function name and its namespace
# e.g. `clusterProfiler::enrichGO(...)`
fea_res_nobg <- EMMA_run(
  clusterProfiler::enrichGO(
    # no universe set
    gene = rownames(de_res),
    keyType = "ENSEMBL",
    OrgDb = org.Hs.eg.db,
    ont = "BP",
    pAdjustMethod = "BH",
    pvalueCutoff = 0.05,
    qvalueCutoff = 0.1,
    readable = TRUE
  )
)

As you can see, EMMA returns the FEA results in their native/standard format. EMMA also warns you about good practices when performing FEA, like in this example, we didn’t define a list of background genes (which can influence the results leading e.g. to a larger amount of false discoveries, as a consequence of over-optimistic smaller p-values (Wijesooriya et al. 2022)), so we get warned about that.

4.2 EMMA_show(): Summarizing the recorded information

To get a quick summary of what EMMA captured while we ran the analysis, we use EMMA_show():

EMMA_show(fea_res)
#> Number of Pathways: 67 
#> Call: enrichGO(gene = rownames(de_res), universe = gene_universe, keyType = "ENSEMBL",      OrgDb = org.Hs.eg.db, ont = "BP", pAdjustMethod = "BH", pvalueCutoff = 0.05,      qvalueCutoff = 0.1)  
#> Wrapper: FALSE  
#> Package: clusterProfiler v. 4.21.0  
#> Organism: Homo sapiens  
#> Gene set library: GO  
#> Gene set library version: 3.23.1

EMMA attaches the captured metadata to the attributes of the results object. That’s why it is always a good practice to save the original results, and not only the subsets of interest.

4.3 EMMA_get_record(): Retrieving the recorded information

To access the full recorded information, we use EMMA_get_record():

emma_record <- EMMA_get_record(fea_res)

# get all the record
emma_record
#> $method
#> $method$call
#> enrichGO(gene = rownames(de_res), universe = gene_universe, keyType = "ENSEMBL", 
#>     OrgDb = org.Hs.eg.db, ont = "BP", pAdjustMethod = "BH", pvalueCutoff = 0.05, 
#>     qvalueCutoff = 0.1)
#> 
#> $method$function_name
#> [1] "enrichGO"
#> 
#> $method$package_name
#> [1] "clusterProfiler"
#> 
#> $method$package_version
#> [1] "4.21.0"
#> 
#> $method$wrapped_function
#> NULL
#> 
#> $method$wrapped_package
#> NULL
#> 
#> $method$wrapper
#> [1] FALSE
#> 
#> 
#> $input
#> $input$arguments
#> $input$arguments$gene
#>   [1] "ENSG00000172399" "ENSG00000225492" "ENSG00000254838" "ENSG00000213886"
#>   [5] "ENSG00000140105" "ENSG00000019582" "ENSG00000188820" "ENSG00000117226"
#>   [9] "ENSG00000197646" "ENSG00000234745" "ENSG00000139597" "ENSG00000159363"
#>  [13] "ENSG00000206341" "ENSG00000090539" "ENSG00000180616" "ENSG00000206503"
#>  [17] "ENSG00000144649" "ENSG00000115415" "ENSG00000110665" "ENSG00000013374"
#>  [21] "ENSG00000137193" "ENSG00000121270" "ENSG00000165949" "ENSG00000070915"
#>  [25] "ENSG00000007968" "ENSG00000142621" "ENSG00000236567" "ENSG00000237988"
#>  [29] "ENSG00000101412" "ENSG00000068079" "ENSG00000114127" "ENSG00000270120"
#>  [33] "ENSG00000090339" "ENSG00000079156" "ENSG00000074660" "ENSG00000103154"
#>  [37] "ENSG00000205846" "ENSG00000275718" "ENSG00000185499" "ENSG00000172738"
#>  [41] "ENSG00000157551" "ENSG00000255491" "ENSG00000188389" "ENSG00000251230"
#>  [45] "ENSG00000093009" "ENSG00000225864" "ENSG00000162367" "ENSG00000100368"
#>  [49] "ENSG00000165935" "ENSG00000116016" "ENSG00000116514" "ENSG00000285761"
#>  [53] "ENSG00000085999" "ENSG00000274461" "ENSG00000058335" "ENSG00000164125"
#>  [57] "ENSG00000104894" "ENSG00000177465" "ENSG00000105639" "ENSG00000144837"
#>  [61] "ENSG00000109756" "ENSG00000276411" "ENSG00000144136" "ENSG00000081985"
#>  [65] "ENSG00000148429" "ENSG00000124508" "ENSG00000152939" "ENSG00000100985"
#>  [69] "ENSG00000164292" "ENSG00000161217" "ENSG00000256713" "ENSG00000145362"
#>  [73] "ENSG00000155287" "ENSG00000214826" "ENSG00000155324" "ENSG00000137628"
#>  [77] "ENSG00000083097" "ENSG00000204616" "ENSG00000120262" "ENSG00000185433"
#>  [81] "ENSG00000092345" "ENSG00000070501" "ENSG00000169891" "ENSG00000154783"
#>  [85] "ENSG00000157827" "ENSG00000230521" "ENSG00000125355" "ENSG00000075240"
#>  [89] "ENSG00000163958" "ENSG00000250240" "ENSG00000156273" "ENSG00000186815"
#>  [93] "ENSG00000280649" "ENSG00000050767" "ENSG00000125900" "ENSG00000186854"
#>  [97] "ENSG00000077152" "ENSG00000198719" "ENSG00000227463" "ENSG00000123485"
#> [101] "ENSG00000175445" "ENSG00000154920" "ENSG00000141086" "ENSG00000203446"
#> [105] "ENSG00000138496" "ENSG00000163421" "ENSG00000075618" "ENSG00000112149"
#> 
#> $input$arguments$universe
#>    [1] "ENSG00000206341" "ENSG00000255491" "ENSG00000159348" "ENSG00000103064"
#>    [5] "ENSG00000105447" "ENSG00000109956" "ENSG00000261613" "ENSG00000167508"
#>    [9] "ENSG00000235385" "ENSG00000125449" "ENSG00000015153" "ENSG00000104369"
#>   [13] "ENSG00000180155" "ENSG00000185158" "ENSG00000182307" "ENSG00000135776"
#>   [17] "ENSG00000078061" "ENSG00000105849" "ENSG00000127946" "ENSG00000285159"
#>   [21] "ENSG00000169762" "ENSG00000196152" "ENSG00000162910" "ENSG00000127995"
#>   [25] "ENSG00000149294" "ENSG00000255857" "ENSG00000156052" "ENSG00000078804"
#>   [29] "ENSG00000242193" "ENSG00000168646" "ENSG00000117152" "ENSG00000274272"
#>   [33] "ENSG00000164266" "ENSG00000177728" "ENSG00000266967" "ENSG00000102901"
#>   [37] "ENSG00000259972" "ENSG00000260948" "ENSG00000168303" "ENSG00000243679"
#>   [41] "ENSG00000105426" "ENSG00000101412" "ENSG00000107611" "ENSG00000284292"
#>   [45] "ENSG00000186891" "ENSG00000149591" "ENSG00000196812" "ENSG00000260899"
#>   [49] "ENSG00000180626" "ENSG00000280649" "ENSG00000130226" "ENSG00000198551"
#>   [53] "ENSG00000075914" "ENSG00000229664" "ENSG00000179456" "ENSG00000272447"
#>   [57] "ENSG00000225697" "ENSG00000270012" "ENSG00000183763" "ENSG00000095951"
#>   [61] "ENSG00000258754" "ENSG00000147573" "ENSG00000266904" "ENSG00000105325"
#>   [65] "ENSG00000175606" "ENSG00000140750" "ENSG00000100600" "ENSG00000131236"
#>   [69] "ENSG00000142731" "ENSG00000105698" "ENSG00000125846" "ENSG00000171204"
#>   [73] "ENSG00000170955" "ENSG00000280173" "ENSG00000113810" "ENSG00000189266"
#>   [77] "ENSG00000284707" "ENSG00000176222" "ENSG00000159720" "ENSG00000149968"
#>   [81] "ENSG00000236990" "ENSG00000088205" "ENSG00000158828" "ENSG00000145817"
#>   [85] "ENSG00000176714" "ENSG00000066382" "ENSG00000169951" "ENSG00000144034"
#>   [89] "ENSG00000279821" "ENSG00000106100" "ENSG00000284428" "ENSG00000197857"
#>   [93] "ENSG00000258824" "ENSG00000100288" "ENSG00000160445" "ENSG00000081181"
#>   [97] "ENSG00000171017" "ENSG00000169242" "ENSG00000261183" "ENSG00000115526"
#>  [101] "ENSG00000174442" "ENSG00000185697" "ENSG00000283503" "ENSG00000228903"
#>  [105] "ENSG00000257949" "ENSG00000135624" "ENSG00000173267" "ENSG00000116032"
#>  [109] "ENSG00000162620" "ENSG00000180667" "ENSG00000130803" "ENSG00000214708"
#>  [113] "ENSG00000145794" "ENSG00000104894" "ENSG00000164687" "ENSG00000154511"
#>  [117] "ENSG00000247627" "ENSG00000219545" "ENSG00000260072" "ENSG00000263766"
#>  [121] "ENSG00000132846" "ENSG00000174080" "ENSG00000162490" "ENSG00000242485"
#>  [125] "ENSG00000100416" "ENSG00000124593" "ENSG00000273759" "ENSG00000125633"
#>  [129] "ENSG00000100739" "ENSG00000186073" "ENSG00000164610" "ENSG00000165694"
#>  [133] "ENSG00000206503" "ENSG00000166664" "ENSG00000264151" "ENSG00000125124"
#>  [137] "ENSG00000111732" "ENSG00000105357" "ENSG00000054392" "ENSG00000059122"
#>  [141] "ENSG00000135766" "ENSG00000130005" "ENSG00000153130" "ENSG00000244491"
#>  [145] "ENSG00000198873" "ENSG00000164305" "ENSG00000128016" "ENSG00000106258"
#>  [149] "ENSG00000258909" "ENSG00000198677" "ENSG00000140284" "ENSG00000181264"
#>  [153] "ENSG00000176531" "ENSG00000084652" "ENSG00000157379" "ENSG00000275700"
#>  [157] "ENSG00000164327" "ENSG00000099364" "ENSG00000183426" "ENSG00000174125"
#>  [161] "ENSG00000230487" "ENSG00000057704" "ENSG00000185591" "ENSG00000125898"
#>  [165] "ENSG00000267655" "ENSG00000110811" "ENSG00000139117" "ENSG00000070915"
#>  [169] "ENSG00000179526" "ENSG00000146373" "ENSG00000139211" "ENSG00000158555"
#>  [173] "ENSG00000101138" "ENSG00000104904" "ENSG00000198720" "ENSG00000166133"
#>  [177] "ENSG00000224950" "ENSG00000172878" "ENSG00000145358" "ENSG00000116688"
#>  [181] "ENSG00000113658" "ENSG00000169372" "ENSG00000175087" "ENSG00000103154"
#>  [185] "ENSG00000273311" "ENSG00000187626" "ENSG00000144218" "ENSG00000230651"
#>  [189] "ENSG00000169972" "ENSG00000149809" "ENSG00000138080" "ENSG00000104320"
#>  [193] "ENSG00000243789" "ENSG00000152455" "ENSG00000197162" "ENSG00000177042"
#>  [197] "ENSG00000136108" "ENSG00000179832" "ENSG00000154783" "ENSG00000251322"
#>  [201] "ENSG00000255439" "ENSG00000163636" "ENSG00000138768" "ENSG00000257921"
#>  [205] "ENSG00000183751" "ENSG00000137203" "ENSG00000138696" "ENSG00000235823"
#>  [209] "ENSG00000177830" "ENSG00000099139" "ENSG00000115486" "ENSG00000143164"
#>  [213] "ENSG00000153015" "ENSG00000258860" "ENSG00000147650" "ENSG00000167323"
#>  [217] "ENSG00000196757" "ENSG00000143479" "ENSG00000168264" "ENSG00000154640"
#>  [221] "ENSG00000121774" "ENSG00000093100" "ENSG00000184988" "ENSG00000164953"
#>  [225] "ENSG00000277476" "ENSG00000141425" "ENSG00000049449" "ENSG00000149050"
#>  [229] "ENSG00000280594" "ENSG00000174943" "ENSG00000197969" "ENSG00000158417"
#>  [233] "ENSG00000076554" "ENSG00000163346" "ENSG00000120949" "ENSG00000187800"
#>  [237] "ENSG00000059758" "ENSG00000125388" "ENSG00000232164" "ENSG00000077152"
#>  [241] "ENSG00000198960" "ENSG00000259004" "ENSG00000125454" "ENSG00000139793"
#>  [245] "ENSG00000234906" "ENSG00000245648" "ENSG00000164654" "ENSG00000144406"
#>  [249] "ENSG00000139613" "ENSG00000234857" "ENSG00000187953" "ENSG00000135407"
#>  [253] "ENSG00000119673" "ENSG00000249846" "ENSG00000128656" "ENSG00000079156"
#>  [257] "ENSG00000198315" "ENSG00000141543" "ENSG00000035499" "ENSG00000206562"
#>  [261] "ENSG00000136319" "ENSG00000175040" "ENSG00000136536" "ENSG00000226180"
#>  [265] "ENSG00000144583" "ENSG00000120306" "ENSG00000256806" "ENSG00000197321"
#>  [269] "ENSG00000125149" "ENSG00000196236" "ENSG00000102096" "ENSG00000165689"
#>  [273] "ENSG00000178718" "ENSG00000276334" "ENSG00000113578" "ENSG00000105993"
#>  [277] "ENSG00000057608" "ENSG00000283761" "ENSG00000171940" "ENSG00000115687"
#>  [281] "ENSG00000280968" "ENSG00000123485" "ENSG00000235859" "ENSG00000073169"
#>  [285] "ENSG00000229582" "ENSG00000184922" "ENSG00000164414" "ENSG00000177030"
#>  [289] "ENSG00000142794" "ENSG00000152465" "ENSG00000196689" "ENSG00000148290"
#>  [293] "ENSG00000177352" "ENSG00000177951" "ENSG00000005448" "ENSG00000188177"
#>  [297] "ENSG00000227463" "ENSG00000087077" "ENSG00000260822" "ENSG00000130787"
#>  [301] "ENSG00000196388" "ENSG00000258940" "ENSG00000147027" "ENSG00000125551"
#>  [305] "ENSG00000172663" "ENSG00000129646" "ENSG00000152332" "ENSG00000121270"
#>  [309] "ENSG00000261659" "ENSG00000177707" "ENSG00000106733" "ENSG00000102796"
#>  [313] "ENSG00000229953" "ENSG00000197063" "ENSG00000111215" "ENSG00000155970"
#>  [317] "ENSG00000170370" "ENSG00000204388" "ENSG00000063761" "ENSG00000239969"
#>  [321] "ENSG00000072062" "ENSG00000133488" "ENSG00000125084" "ENSG00000285596"
#>  [325] "ENSG00000163453" "ENSG00000105697" "ENSG00000105819" "ENSG00000117143"
#>  [329] "ENSG00000213443" "ENSG00000197024" "ENSG00000174652" "ENSG00000266698"
#>  [333] "ENSG00000184489" "ENSG00000131023" "ENSG00000095066" "ENSG00000163421"
#>  [337] "ENSG00000062370" "ENSG00000260269" "ENSG00000108256" "ENSG00000170469"
#>  [341] "ENSG00000214063" "ENSG00000173757" "ENSG00000101473" "ENSG00000107882"
#>  [345] "ENSG00000163888" "ENSG00000197614" "ENSG00000227733" "ENSG00000101843"
#>  [349] "ENSG00000185252" "ENSG00000155926" "ENSG00000111679" "ENSG00000114107"
#>  [353] "ENSG00000234362" "ENSG00000164125" "ENSG00000136802" "ENSG00000197444"
#>  [357] "ENSG00000227376" "ENSG00000105854" "ENSG00000175198" "ENSG00000165494"
#>  [361] "ENSG00000279020" "ENSG00000117614" "ENSG00000159086" "ENSG00000078070"
#>  [365] "ENSG00000148429" "ENSG00000280213" "ENSG00000227066" "ENSG00000279846"
#>  [369] "ENSG00000090060" "ENSG00000198369" "ENSG00000198612" "ENSG00000143127"
#>  [373] "ENSG00000237441" "ENSG00000128408" "ENSG00000213904" "ENSG00000116514"
#>  [377] "ENSG00000164692" "ENSG00000246560" "ENSG00000128596" "ENSG00000189157"
#>  [381] "ENSG00000101079" "ENSG00000175497" "ENSG00000183323" "ENSG00000008324"
#>  [385] "ENSG00000196220" "ENSG00000071859" "ENSG00000050748" "ENSG00000139239"
#>  [389] "ENSG00000173991" "ENSG00000157916" "ENSG00000141076" "ENSG00000162980"
#>  [393] "ENSG00000082212" "ENSG00000203326" "ENSG00000087338" "ENSG00000130032"
#>  [397] "ENSG00000254910" "ENSG00000119227" "ENSG00000164347" "ENSG00000198729"
#>  [401] "ENSG00000099204" "ENSG00000272807" "ENSG00000271913" "ENSG00000204713"
#>  [405] "ENSG00000197070" "ENSG00000069020" "ENSG00000167889" "ENSG00000143811"
#>  [409] "ENSG00000078668" "ENSG00000231365" "ENSG00000280330" "ENSG00000257390"
#>  [413] "ENSG00000185222" "ENSG00000125827" "ENSG00000125355" "ENSG00000169813"
#>  [417] "ENSG00000109929" "ENSG00000047230" "ENSG00000105639" "ENSG00000166575"
#>  [421] "ENSG00000261116" "ENSG00000112855" "ENSG00000134709" "ENSG00000071054"
#>  [425] "ENSG00000094755" "ENSG00000131196" "ENSG00000230461" "ENSG00000196976"
#>  [429] "ENSG00000177311" "ENSG00000158615" "ENSG00000251664" "ENSG00000151208"
#>  [433] "ENSG00000255031" "ENSG00000022976" "ENSG00000175779" "ENSG00000173114"
#>  [437] "ENSG00000069849" "ENSG00000003147" "ENSG00000215256" "ENSG00000250320"
#>  [441] "ENSG00000137628" "ENSG00000100749" "ENSG00000174775" "ENSG00000165197"
#>  [445] "ENSG00000174231" "ENSG00000175792" "ENSG00000203485" "ENSG00000256940"
#>  [449] "ENSG00000226891" "ENSG00000265479" "ENSG00000280327" "ENSG00000196363"
#>  [453] "ENSG00000109063" "ENSG00000145779" "ENSG00000099810" "ENSG00000172534"
#>  [457] "ENSG00000187837" "ENSG00000168803" "ENSG00000239665" "ENSG00000132406"
#>  [461] "ENSG00000130283" "ENSG00000122783" "ENSG00000250616" "ENSG00000146410"
#>  [465] "ENSG00000232445" "ENSG00000145335" "ENSG00000081985" "ENSG00000184545"
#>  [469] "ENSG00000196369" "ENSG00000214021" "ENSG00000072840" "ENSG00000215769"
#>  [473] "ENSG00000272079" "ENSG00000204681" "ENSG00000047597" "ENSG00000136021"
#>  [477] "ENSG00000130772" "ENSG00000231889" "ENSG00000141314" "ENSG00000139636"
#>  [481] "ENSG00000140538" "ENSG00000270276" "ENSG00000187535" "ENSG00000285458"
#>  [485] "ENSG00000284727" "ENSG00000113558" "ENSG00000166592" "ENSG00000260708"
#>  [489] "ENSG00000083454" "ENSG00000173597" "ENSG00000168393" "ENSG00000186130"
#>  [493] "ENSG00000141552" "ENSG00000117298" "ENSG00000284681" "ENSG00000164930"
#>  [497] "ENSG00000186814" "ENSG00000213799" "ENSG00000259225" "ENSG00000275457"
#>  [501] "ENSG00000243742" "ENSG00000135111" "ENSG00000055070" "ENSG00000175105"
#>  [505] "ENSG00000174243" "ENSG00000120963" "ENSG00000261136" "ENSG00000242028"
#>  [509] "ENSG00000166181" "ENSG00000197140" "ENSG00000152102" "ENSG00000105298"
#>  [513] "ENSG00000007968" "ENSG00000067064" "ENSG00000148498" "ENSG00000112033"
#>  [517] "ENSG00000177917" "ENSG00000152439" "ENSG00000136942" "ENSG00000257103"
#>  [521] "ENSG00000269486" "ENSG00000196872" "ENSG00000121057" "ENSG00000285816"
#>  [525] "ENSG00000187905" "ENSG00000135622" "ENSG00000104823" "ENSG00000167842"
#>  [529] "ENSG00000155189" "ENSG00000188021" "ENSG00000088298" "ENSG00000159147"
#>  [533] "ENSG00000261824" "ENSG00000189212" "ENSG00000148985" "ENSG00000081870"
#>  [537] "ENSG00000167112" "ENSG00000086619" "ENSG00000164086" "ENSG00000006282"
#>  [541] "ENSG00000280106" "ENSG00000135631" "ENSG00000170458" "ENSG00000196511"
#>  [545] "ENSG00000117411" "ENSG00000168301" "ENSG00000183431" "ENSG00000163362"
#>  [549] "ENSG00000138463" "ENSG00000100890" "ENSG00000198554" "ENSG00000198885"
#>  [553] "ENSG00000146192" "ENSG00000124145" "ENSG00000102218" "ENSG00000143167"
#>  [557] "ENSG00000117697" "ENSG00000255302" "ENSG00000115286" "ENSG00000149269"
#>  [561] "ENSG00000179240" "ENSG00000188368" "ENSG00000184863" "ENSG00000280285"
#>  [565] "ENSG00000150394" "ENSG00000141086" "ENSG00000177465" "ENSG00000225465"
#>  [569] "ENSG00000175203" "ENSG00000165632" "ENSG00000139668" "ENSG00000009844"
#>  [573] "ENSG00000198690" "ENSG00000119681" "ENSG00000067221" "ENSG00000066777"
#>  [577] "ENSG00000111530" "ENSG00000110693" "ENSG00000204472" "ENSG00000185627"
#>  [581] "ENSG00000213281" "ENSG00000179364" "ENSG00000025156" "ENSG00000139910"
#>  [585] "ENSG00000262160" "ENSG00000159625" "ENSG00000106133" "ENSG00000105501"
#>  [589] "ENSG00000140678" "ENSG00000101336" "ENSG00000198042" "ENSG00000100503"
#>  [593] "ENSG00000101407" "ENSG00000118804" "ENSG00000279970" "ENSG00000044524"
#>  [597] "ENSG00000135316" "ENSG00000184840" "ENSG00000230448" "ENSG00000270091"
#>  [601] "ENSG00000174903" "ENSG00000179314" "ENSG00000171202" "ENSG00000110318"
#>  [605] "ENSG00000149541" "ENSG00000142065" "ENSG00000125245" "ENSG00000182158"
#>  [609] "ENSG00000205213" "ENSG00000130177" "ENSG00000115109" "ENSG00000090539"
#>  [613] "ENSG00000166526" "ENSG00000173706" "ENSG00000240401" "ENSG00000172403"
#>  [617] "ENSG00000150471" "ENSG00000175445" "ENSG00000013810" "ENSG00000276411"
#>  [621] "ENSG00000213203" "ENSG00000038210" "ENSG00000213888" "ENSG00000111837"
#>  [625] "ENSG00000228727" "ENSG00000107874" "ENSG00000254838" "ENSG00000050767"
#>  [629] "ENSG00000221914" "ENSG00000108852" "ENSG00000115275" "ENSG00000169100"
#>  [633] "ENSG00000103495" "ENSG00000255142" "ENSG00000250240" "ENSG00000141052"
#>  [637] "ENSG00000043355" "ENSG00000107581" "ENSG00000143771" "ENSG00000205861"
#>  [641] "ENSG00000123545" "ENSG00000197037" "ENSG00000083642" "ENSG00000164032"
#>  [645] "ENSG00000143368" "ENSG00000203985" "ENSG00000223804" "ENSG00000157514"
#>  [649] "ENSG00000083635" "ENSG00000186235" "ENSG00000243147" "ENSG00000136010"
#>  [653] "ENSG00000107518" "ENSG00000158122" "ENSG00000134001" "ENSG00000104381"
#>  [657] "ENSG00000107521" "ENSG00000083097" "ENSG00000151090" "ENSG00000165359"
#>  [661] "ENSG00000116922" "ENSG00000146197" "ENSG00000073849" "ENSG00000137142"
#>  [665] "ENSG00000075618" "ENSG00000087157" "ENSG00000011347" "ENSG00000166165"
#>  [669] "ENSG00000125266" "ENSG00000013293" "ENSG00000196187" "ENSG00000103168"
#>  [673] "ENSG00000136522" "ENSG00000180879" "ENSG00000260729" "ENSG00000129355"
#>  [677] "ENSG00000103671" "ENSG00000123575" "ENSG00000284633" "ENSG00000264343"
#>  [681] "ENSG00000117525" "ENSG00000149089" "ENSG00000108187" "ENSG00000162722"
#>  [685] "ENSG00000173894" "ENSG00000165502" "ENSG00000178538" "ENSG00000159363"
#>  [689] "ENSG00000113068" "ENSG00000169871" "ENSG00000204209" "ENSG00000162636"
#>  [693] "ENSG00000105072" "ENSG00000114738" "ENSG00000163807" "ENSG00000129351"
#>  [697] "ENSG00000123349" "ENSG00000172006" "ENSG00000101146" "ENSG00000250462"
#>  [701] "ENSG00000156273" "ENSG00000074966" "ENSG00000186827" "ENSG00000173660"
#>  [705] "ENSG00000142330" "ENSG00000003756" "ENSG00000249962" "ENSG00000179918"
#>  [709] "ENSG00000233369" "ENSG00000234745" "ENSG00000236567" "ENSG00000242616"
#>  [713] "ENSG00000128607" "ENSG00000228649" "ENSG00000112246" "ENSG00000229852"
#>  [717] "ENSG00000273015" "ENSG00000169891" "ENSG00000113580" "ENSG00000126749"
#>  [721] "ENSG00000226758" "ENSG00000120549" "ENSG00000280800" "ENSG00000279673"
#>  [725] "ENSG00000188056" "ENSG00000130150" "ENSG00000108671" "ENSG00000179168"
#>  [729] "ENSG00000114554" "ENSG00000126003" "ENSG00000147082" "ENSG00000168497"
#>  [733] "ENSG00000157741" "ENSG00000177989" "ENSG00000103494" "ENSG00000151746"
#>  [737] "ENSG00000118579" "ENSG00000169241" "ENSG00000168259" "ENSG00000110013"
#>  [741] "ENSG00000253214" "ENSG00000168014" "ENSG00000109794" "ENSG00000163531"
#>  [745] "ENSG00000137494" "ENSG00000247934" "ENSG00000147421" "ENSG00000280345"
#>  [749] "ENSG00000162437" "ENSG00000131876" "ENSG00000130635" "ENSG00000272884"
#>  [753] "ENSG00000136878" "ENSG00000170185" "ENSG00000158792" "ENSG00000074410"
#>  [757] "ENSG00000171757" "ENSG00000275763" "ENSG00000179886" "ENSG00000254254"
#>  [761] "ENSG00000171631" "ENSG00000128891" "ENSG00000168209" "ENSG00000266820"
#>  [765] "ENSG00000186591" "ENSG00000281005" "ENSG00000185721" "ENSG00000065621"
#>  [769] "ENSG00000104695" "ENSG00000140488" "ENSG00000162711" "ENSG00000185664"
#>  [773] "ENSG00000164037" "ENSG00000257815" "ENSG00000180425" "ENSG00000274051"
#>  [777] "ENSG00000136935" "ENSG00000075785" "ENSG00000134030" "ENSG00000169410"
#>  [781] "ENSG00000168228" "ENSG00000279822" "ENSG00000132329" "ENSG00000164885"
#>  [785] "ENSG00000174740" "ENSG00000184164" "ENSG00000167632" "ENSG00000234648"
#>  [789] "ENSG00000100060" "ENSG00000055208" "ENSG00000168152" "ENSG00000114013"
#>  [793] "ENSG00000260644" "ENSG00000130159" "ENSG00000197548" "ENSG00000136718"
#>  [797] "ENSG00000145907" "ENSG00000167693" "ENSG00000132356" "ENSG00000253981"
#>  [801] "ENSG00000162736" "ENSG00000159842" "ENSG00000267401" "ENSG00000160685"
#>  [805] "ENSG00000198060" "ENSG00000175538" "ENSG00000055332" "ENSG00000132522"
#>  [809] "ENSG00000164989" "ENSG00000142235" "ENSG00000274012" "ENSG00000171469"
#>  [813] "ENSG00000167748" "ENSG00000255921" "ENSG00000085276" "ENSG00000243069"
#>  [817] "ENSG00000245975" "ENSG00000168824" "ENSG00000159063" "ENSG00000101444"
#>  [821] "ENSG00000236008" "ENSG00000143641" "ENSG00000110274" "ENSG00000211445"
#>  [825] "ENSG00000122042" "ENSG00000081019" "ENSG00000283103" "ENSG00000064393"
#>  [829] "ENSG00000196074" "ENSG00000272146" "ENSG00000107731" "ENSG00000104714"
#>  [833] "ENSG00000180616" "ENSG00000197496" "ENSG00000137198" "ENSG00000164211"
#>  [837] "ENSG00000185808" "ENSG00000148229" "ENSG00000116830" "ENSG00000186431"
#>  [841] "ENSG00000197291" "ENSG00000100711" "ENSG00000274767" "ENSG00000110665"
#>  [845] "ENSG00000038219" "ENSG00000167280" "ENSG00000135637" "ENSG00000198399"
#>  [849] "ENSG00000072121" "ENSG00000085999" "ENSG00000251230" "ENSG00000270629"
#>  [853] "ENSG00000144161" "ENSG00000111981" "ENSG00000197157" "ENSG00000160679"
#>  [857] "ENSG00000112406" "ENSG00000276931" "ENSG00000227036" "ENSG00000275294"
#>  [861] "ENSG00000119711" "ENSG00000186716" "ENSG00000225492" "ENSG00000276850"
#>  [865] "ENSG00000164818" "ENSG00000204086" "ENSG00000119938" "ENSG00000234840"
#>  [869] "ENSG00000162461" "ENSG00000137601" "ENSG00000120697" "ENSG00000157227"
#>  [873] "ENSG00000108100" "ENSG00000100401" "ENSG00000124602" "ENSG00000278615"
#>  [877] "ENSG00000215156" "ENSG00000141933" "ENSG00000102054" "ENSG00000166405"
#>  [881] "ENSG00000158470" "ENSG00000085433" "ENSG00000147459" "ENSG00000165644"
#>  [885] "ENSG00000173258" "ENSG00000136717" "ENSG00000161671" "ENSG00000226445"
#>  [889] "ENSG00000177800" "ENSG00000164620" "ENSG00000264743" "ENSG00000077147"
#>  [893] "ENSG00000226419" "ENSG00000176170" "ENSG00000160766" "ENSG00000259030"
#>  [897] "ENSG00000137497" "ENSG00000143878" "ENSG00000139344" "ENSG00000237484"
#>  [901] "ENSG00000104133" "ENSG00000250734" "ENSG00000170558" "ENSG00000152904"
#>  [905] "ENSG00000247240" "ENSG00000143341" "ENSG00000282870" "ENSG00000165389"
#>  [909] "ENSG00000019582" "ENSG00000285887" "ENSG00000225489" "ENSG00000165895"
#>  [913] "ENSG00000155561" "ENSG00000011451" "ENSG00000256713" "ENSG00000205581"
#>  [917] "ENSG00000140474" "ENSG00000140105" "ENSG00000163430" "ENSG00000248101"
#>  [921] "ENSG00000103994" "ENSG00000177663" "ENSG00000268043" "ENSG00000144935"
#>  [925] "ENSG00000227359" "ENSG00000167807" "ENSG00000110987" "ENSG00000130810"
#>  [929] "ENSG00000168282" "ENSG00000120519" "ENSG00000267702" "ENSG00000177932"
#>  [933] "ENSG00000273702" "ENSG00000162613" "ENSG00000246174" "ENSG00000159111"
#>  [937] "ENSG00000106689" "ENSG00000188223" "ENSG00000165898" "ENSG00000106399"
#>  [941] "ENSG00000178607" "ENSG00000143851" "ENSG00000132549" "ENSG00000162433"
#>  [945] "ENSG00000260911" "ENSG00000225648" "ENSG00000171766" "ENSG00000115042"
#>  [949] "ENSG00000104412" "ENSG00000105519" "ENSG00000177733" "ENSG00000106077"
#>  [953] "ENSG00000255073" "ENSG00000215695" "ENSG00000228817" "ENSG00000137076"
#>  [957] "ENSG00000127481" "ENSG00000169519" "ENSG00000203446" "ENSG00000158402"
#>  [961] "ENSG00000133895" "ENSG00000271361" "ENSG00000135698" "ENSG00000172399"
#>  [965] "ENSG00000129968" "ENSG00000003402" "ENSG00000162032" "ENSG00000107643"
#>  [969] "ENSG00000155287" "ENSG00000114520" "ENSG00000104131" "ENSG00000111725"
#>  [973] "ENSG00000153976" "ENSG00000147592" "ENSG00000058335" "ENSG00000158352"
#>  [977] "ENSG00000143889" "ENSG00000229589" "ENSG00000158062" "ENSG00000100036"
#>  [981] "ENSG00000264885" "ENSG00000065361" "ENSG00000204261" "ENSG00000165935"
#>  [985] "ENSG00000155096" "ENSG00000166813" "ENSG00000197774" "ENSG00000284946"
#>  [989] "ENSG00000154277" "ENSG00000134453" "ENSG00000152076" "ENSG00000177302"
#>  [993] "ENSG00000224051" "ENSG00000142875" "ENSG00000110442" "ENSG00000146904"
#>  [997] "ENSG00000134072" "ENSG00000165304" "ENSG00000044459" "ENSG00000166123"
#> [1001] "ENSG00000182224" "ENSG00000131051" "ENSG00000189043" "ENSG00000100030"
#> [1005] "ENSG00000235437" "ENSG00000148288" "ENSG00000184220" "ENSG00000111846"
#> [1009] "ENSG00000144649" "ENSG00000074706" "ENSG00000135835" "ENSG00000074660"
#> [1013] "ENSG00000159239" "ENSG00000181896" "ENSG00000177889" "ENSG00000196865"
#> [1017] "ENSG00000130300" "ENSG00000148339" "ENSG00000250198" "ENSG00000152492"
#> [1021] "ENSG00000179698" "ENSG00000134107" "ENSG00000214455" "ENSG00000164106"
#> [1025] "ENSG00000226383" "ENSG00000113721" "ENSG00000165338" "ENSG00000174945"
#> [1029] "ENSG00000203288" "ENSG00000123191" "ENSG00000198466" "ENSG00000081377"
#> [1033] "ENSG00000270022" "ENSG00000135829" "ENSG00000156603" "ENSG00000140320"
#> [1037] "ENSG00000130748" "ENSG00000248593" "ENSG00000245904" "ENSG00000003989"
#> [1041] "ENSG00000115053" "ENSG00000213445" "ENSG00000108433" "ENSG00000250067"
#> [1045] "ENSG00000197182" "ENSG00000144837" "ENSG00000125648" "ENSG00000162777"
#> [1049] "ENSG00000145979" "ENSG00000134874" "ENSG00000104872" "ENSG00000272419"
#> [1053] "ENSG00000241168" "ENSG00000013563" "ENSG00000186603" "ENSG00000008283"
#> [1057] "ENSG00000026559" "ENSG00000108439" "ENSG00000131435" "ENSG00000106608"
#> [1061] "ENSG00000231187" "ENSG00000157985" "ENSG00000100304" "ENSG00000028310"
#> [1065] "ENSG00000225151" "ENSG00000011590" "ENSG00000285634" "ENSG00000151694"
#> [1069] "ENSG00000152242" "ENSG00000137547" "ENSG00000132475" "ENSG00000164093"
#> [1073] "ENSG00000183741" "ENSG00000070371" "ENSG00000177640" "ENSG00000134597"
#> [1077] "ENSG00000171049" "ENSG00000213599" "ENSG00000183092" "ENSG00000137504"
#> [1081] "ENSG00000142669" "ENSG00000238164" "ENSG00000106624" "ENSG00000164283"
#> [1085] "ENSG00000011028" "ENSG00000169744" "ENSG00000142186" "ENSG00000084731"
#> [1089] "ENSG00000117385" "ENSG00000182742" "ENSG00000249309" "ENSG00000279672"
#> [1093] "ENSG00000167522" "ENSG00000139597" "ENSG00000184557" "ENSG00000174483"
#> [1097] "ENSG00000179630" "ENSG00000093009" "ENSG00000262979" "ENSG00000163638"
#> [1101] "ENSG00000130638" "ENSG00000122085" "ENSG00000176853" "ENSG00000117226"
#> [1105] "ENSG00000162946" "ENSG00000226259" "ENSG00000163939" "ENSG00000233058"
#> [1109] "ENSG00000175061" "ENSG00000272912" "ENSG00000180694" "ENSG00000144744"
#> [1113] "ENSG00000115415" "ENSG00000151012" "ENSG00000260743" "ENSG00000117133"
#> [1117] "ENSG00000108175" "ENSG00000152939" "ENSG00000170681" "ENSG00000100991"
#> [1121] "ENSG00000149488" "ENSG00000187688" "ENSG00000181396" "ENSG00000197245"
#> [1125] "ENSG00000161642" "ENSG00000145882" "ENSG00000181284" "ENSG00000184792"
#> [1129] "ENSG00000278175" "ENSG00000067369" "ENSG00000111962" "ENSG00000185385"
#> [1133] "ENSG00000163697" "ENSG00000106078" "ENSG00000186416" "ENSG00000267745"
#> [1137] "ENSG00000174718" "ENSG00000272933" "ENSG00000068079" "ENSG00000267629"
#> [1141] "ENSG00000177383" "ENSG00000140285" "ENSG00000270149" "ENSG00000157693"
#> [1145] "ENSG00000197302" "ENSG00000164823" "ENSG00000279091" "ENSG00000197180"
#> [1149] "ENSG00000011332" "ENSG00000198837" "ENSG00000122359" "ENSG00000013375"
#> [1153] "ENSG00000284981" "ENSG00000143324" "ENSG00000104472" "ENSG00000196387"
#> [1157] "ENSG00000166311" "ENSG00000182606" "ENSG00000260018" "ENSG00000179909"
#> [1161] "ENSG00000280079" "ENSG00000153993" "ENSG00000120071" "ENSG00000230521"
#> [1165] "ENSG00000285702" "ENSG00000007047" "ENSG00000142444" "ENSG00000138101"
#> [1169] "ENSG00000158113" "ENSG00000128918" "ENSG00000124659" "ENSG00000185272"
#> [1173] "ENSG00000167395" "ENSG00000164542" "ENSG00000068024" "ENSG00000139436"
#> [1177] "ENSG00000112877" "ENSG00000106346" "ENSG00000213658" "ENSG00000236539"
#> [1181] "ENSG00000162378" "ENSG00000188185" "ENSG00000129951" "ENSG00000115194"
#> [1185] "ENSG00000021776" "ENSG00000149091" "ENSG00000181852" "ENSG00000129255"
#> [1189] "ENSG00000111785" "ENSG00000152953" "ENSG00000171824" "ENSG00000261997"
#> [1193] "ENSG00000128805" "ENSG00000075420" "ENSG00000228203" "ENSG00000260810"
#> [1197] "ENSG00000188389" "ENSG00000280187" "ENSG00000162924" "ENSG00000121390"
#> [1201] "ENSG00000103037" "ENSG00000189319" "ENSG00000196605" "ENSG00000163482"
#> [1205] "ENSG00000232593" "ENSG00000112149" "ENSG00000255521" "ENSG00000099956"
#> [1209] "ENSG00000261795" "ENSG00000102359" "ENSG00000183696" "ENSG00000279456"
#> [1213] "ENSG00000115468" "ENSG00000258315" "ENSG00000215440" "ENSG00000275052"
#> [1217] "ENSG00000167105" "ENSG00000065183" "ENSG00000257365" "ENSG00000255355"
#> [1221] "ENSG00000101460" "ENSG00000170464" "ENSG00000273143" "ENSG00000269982"
#> [1225] "ENSG00000239653" "ENSG00000224578" "ENSG00000054967" "ENSG00000197646"
#> [1229] "ENSG00000130544" "ENSG00000198535" "ENSG00000205846" "ENSG00000046889"
#> [1233] "ENSG00000116455" "ENSG00000154309" "ENSG00000275410" "ENSG00000116903"
#> [1237] "ENSG00000164292" "ENSG00000167553" "ENSG00000133121" "ENSG00000118308"
#> [1241] "ENSG00000204177" "ENSG00000014824" "ENSG00000132429" "ENSG00000141098"
#> [1245] "ENSG00000124126" "ENSG00000064489" "ENSG00000157326" "ENSG00000089280"
#> [1249] "ENSG00000278864" "ENSG00000281571" "ENSG00000155511" "ENSG00000262089"
#> [1253] "ENSG00000189042" "ENSG00000104611" "ENSG00000075213" "ENSG00000259583"
#> [1257] "ENSG00000205309" "ENSG00000164171" "ENSG00000144120" "ENSG00000259590"
#> [1261] "ENSG00000171453" "ENSG00000198646" "ENSG00000214279" "ENSG00000271646"
#> [1265] "ENSG00000089351" "ENSG00000167333" "ENSG00000096384" "ENSG00000130204"
#> [1269] "ENSG00000168216" "ENSG00000108352" "ENSG00000157388" "ENSG00000126759"
#> [1273] "ENSG00000242689" "ENSG00000115461" "ENSG00000069869" "ENSG00000042088"
#> [1277] "ENSG00000120262" "ENSG00000104866" "ENSG00000242430" "ENSG00000127022"
#> [1281] "ENSG00000159873" "ENSG00000248905" "ENSG00000106682" "ENSG00000101639"
#> [1285] "ENSG00000269983" "ENSG00000199753" "ENSG00000164114" "ENSG00000269604"
#> [1289] "ENSG00000240801" "ENSG00000114127" "ENSG00000174928" "ENSG00000284770"
#> [1293] "ENSG00000133958" "ENSG00000183087" "ENSG00000170837" "ENSG00000105607"
#> [1297] "ENSG00000196510" "ENSG00000267858" "ENSG00000130414" "ENSG00000085415"
#> [1301] "ENSG00000182389" "ENSG00000186583" "ENSG00000123159" "ENSG00000164403"
#> [1305] "ENSG00000260075" "ENSG00000284968" "ENSG00000105705" "ENSG00000132535"
#> [1309] "ENSG00000142694" "ENSG00000272047" "ENSG00000265688" "ENSG00000243064"
#> [1313] "ENSG00000167536" "ENSG00000099308" "ENSG00000285437" "ENSG00000198719"
#> [1317] "ENSG00000091986" "ENSG00000063177" "ENSG00000219665" "ENSG00000260196"
#> [1321] "ENSG00000166189" "ENSG00000115935" "ENSG00000132481" "ENSG00000270060"
#> [1325] "ENSG00000161647" "ENSG00000173540" "ENSG00000225864" "ENSG00000235897"
#> [1329] "ENSG00000232931" "ENSG00000065989" "ENSG00000087460" "ENSG00000229368"
#> [1333] "ENSG00000146950" "ENSG00000177839" "ENSG00000127081" "ENSG00000095380"
#> [1337] "ENSG00000214013" "ENSG00000056972" "ENSG00000251046" "ENSG00000169299"
#> [1341] "ENSG00000170689" "ENSG00000254639" "ENSG00000134982" "ENSG00000272851"
#> [1345] "ENSG00000275389" "ENSG00000148019" "ENSG00000277534" "ENSG00000278993"
#> [1349] "ENSG00000144785" "ENSG00000172748" "ENSG00000137070" "ENSG00000174276"
#> [1353] "ENSG00000146648" "ENSG00000139915" "ENSG00000254561" "ENSG00000188820"
#> [1357] "ENSG00000233117" "ENSG00000258367" "ENSG00000250120" "ENSG00000155111"
#> [1361] "ENSG00000064300" "ENSG00000224356" "ENSG00000104408" "ENSG00000164983"
#> [1365] "ENSG00000177646" "ENSG00000120647" "ENSG00000100918" "ENSG00000144648"
#> [1369] "ENSG00000104660" "ENSG00000164088" "ENSG00000106443" "ENSG00000158683"
#> [1373] "ENSG00000107185" "ENSG00000259952" "ENSG00000124508" "ENSG00000221955"
#> [1377] "ENSG00000127125" "ENSG00000169896" "ENSG00000133026" "ENSG00000161179"
#> [1381] "ENSG00000229644" "ENSG00000127220" "ENSG00000263004" "ENSG00000166261"
#> [1385] "ENSG00000106554" "ENSG00000184708" "ENSG00000107282" "ENSG00000176125"
#> [1389] "ENSG00000157036" "ENSG00000006125" "ENSG00000162695" "ENSG00000257702"
#> [1393] "ENSG00000088247" "ENSG00000216490" "ENSG00000134545" "ENSG00000197808"
#> [1397] "ENSG00000134285" "ENSG00000158552" "ENSG00000138750" "ENSG00000103381"
#> [1401] "ENSG00000163431" "ENSG00000186318" "ENSG00000226380" "ENSG00000235174"
#> [1405] "ENSG00000112473" "ENSG00000229914" "ENSG00000136160" "ENSG00000209482"
#> [1409] "ENSG00000139218" "ENSG00000067167" "ENSG00000105011" "ENSG00000196459"
#> [1413] "ENSG00000181090" "ENSG00000260693" "ENSG00000242114" "ENSG00000087076"
#> [1417] "ENSG00000197780" "ENSG00000100150" "ENSG00000260669" "ENSG00000127838"
#> [1421] "ENSG00000176533" "ENSG00000185608" "ENSG00000130511" "ENSG00000095261"
#> [1425] "ENSG00000198053" "ENSG00000241404" "ENSG00000143850" "ENSG00000123444"
#> [1429] "ENSG00000279900" "ENSG00000188522" "ENSG00000223704" "ENSG00000090520"
#> [1433] "ENSG00000059804" "ENSG00000174842" "ENSG00000138376" "ENSG00000145687"
#> [1437] "ENSG00000087303" "ENSG00000160200" "ENSG00000249645" "ENSG00000213949"
#> [1441] "ENSG00000232774" "ENSG00000155008" "ENSG00000198355" "ENSG00000106049"
#> [1445] "ENSG00000100321" "ENSG00000100320" "ENSG00000142621" "ENSG00000254995"
#> [1449] "ENSG00000136367" "ENSG00000121578" "ENSG00000256061" "ENSG00000083093"
#> [1453] "ENSG00000114859" "ENSG00000169291" "ENSG00000100985" "ENSG00000172738"
#> [1457] "ENSG00000234608" "ENSG00000160948" "ENSG00000205710" "ENSG00000162430"
#> [1461] "ENSG00000205702" "ENSG00000087903" "ENSG00000189152" "ENSG00000126453"
#> [1465] "ENSG00000225783" "ENSG00000284491" "ENSG00000255455" "ENSG00000174669"
#> [1469] "ENSG00000162367" "ENSG00000168159" "ENSG00000234444" "ENSG00000128581"
#> [1473] "ENSG00000166881" "ENSG00000163513" "ENSG00000144136" "ENSG00000204616"
#> [1477] "ENSG00000231806" "ENSG00000168904" "ENSG00000100767" "ENSG00000230724"
#> [1481] "ENSG00000178053" "ENSG00000104936" "ENSG00000055044" "ENSG00000129295"
#> [1485] "ENSG00000161217" "ENSG00000215160" "ENSG00000091527" "ENSG00000148358"
#> [1489] "ENSG00000160551" "ENSG00000186564" "ENSG00000172757" "ENSG00000147535"
#> [1493] "ENSG00000272140" "ENSG00000169223" "ENSG00000141452" "ENSG00000272636"
#> [1497] "ENSG00000175984" "ENSG00000143622" "ENSG00000214189" "ENSG00000213886"
#> [1501] "ENSG00000246705" "ENSG00000182218" "ENSG00000104687" "ENSG00000165792"
#> [1505] "ENSG00000109756" "ENSG00000273294" "ENSG00000137868" "ENSG00000092841"
#> [1509] "ENSG00000151575" "ENSG00000125249" "ENSG00000185433" "ENSG00000256087"
#> [1513] "ENSG00000140262" "ENSG00000260686" "ENSG00000080493" "ENSG00000173933"
#> [1517] "ENSG00000110321" "ENSG00000133935" "ENSG00000148154" "ENSG00000213453"
#> [1521] "ENSG00000227540" "ENSG00000154930" "ENSG00000123143" "ENSG00000074855"
#> [1525] "ENSG00000267321" "ENSG00000157551" "ENSG00000116747" "ENSG00000264448"
#> [1529] "ENSG00000285644" "ENSG00000005249" "ENSG00000013374" "ENSG00000007171"
#> [1533] "ENSG00000142409" "ENSG00000183624" "ENSG00000167625" "ENSG00000146938"
#> [1537] "ENSG00000183020" "ENSG00000198546" "ENSG00000276509" "ENSG00000280145"
#> [1541] "ENSG00000117595" "ENSG00000270157" "ENSG00000173068" "ENSG00000236383"
#> [1545] "ENSG00000126562" "ENSG00000196083" "ENSG00000119684" "ENSG00000273374"
#> [1549] "ENSG00000179743" "ENSG00000157869" "ENSG00000116016" "ENSG00000100219"
#> [1553] "ENSG00000257086" "ENSG00000205086" "ENSG00000280798" "ENSG00000106804"
#> [1557] "ENSG00000127666" "ENSG00000167232" "ENSG00000133624" "ENSG00000270607"
#> [1561] "ENSG00000120832" "ENSG00000164169" "ENSG00000123131" "ENSG00000279641"
#> [1565] "ENSG00000258655" "ENSG00000161800" "ENSG00000134717" "ENSG00000227115"
#> [1569] "ENSG00000225439" "ENSG00000125900" "ENSG00000153246" "ENSG00000135913"
#> [1573] "ENSG00000108840" "ENSG00000240889" "ENSG00000204482" "ENSG00000224905"
#> [1577] "ENSG00000255224" "ENSG00000145431" "ENSG00000124299" "ENSG00000100228"
#> [1581] "ENSG00000256525" "ENSG00000246263" "ENSG00000075240" "ENSG00000276840"
#> [1585] "ENSG00000177084" "ENSG00000162441" "ENSG00000138030" "ENSG00000120868"
#> [1589] "ENSG00000116212" "ENSG00000137713" "ENSG00000070501" "ENSG00000079246"
#> [1593] "ENSG00000100938" "ENSG00000197296" "ENSG00000134748" "ENSG00000110911"
#> [1597] "ENSG00000135018" "ENSG00000054267" "ENSG00000145934" "ENSG00000228427"
#> [1601] "ENSG00000144891" "ENSG00000138642" "ENSG00000151693" "ENSG00000186854"
#> [1605] "ENSG00000197632" "ENSG00000213204" "ENSG00000144401" "ENSG00000227963"
#> [1609] "ENSG00000113758" "ENSG00000258938" "ENSG00000131781" "ENSG00000072571"
#> [1613] "ENSG00000134504" "ENSG00000105619" "ENSG00000099625" "ENSG00000175782"
#> [1617] "ENSG00000232783" "ENSG00000156804" "ENSG00000090382" "ENSG00000214940"
#> [1621] "ENSG00000157152" "ENSG00000244733" "ENSG00000010404" "ENSG00000047578"
#> [1625] "ENSG00000145439" "ENSG00000163958" "ENSG00000234191" "ENSG00000241360"
#> [1629] "ENSG00000154258" "ENSG00000227502" "ENSG00000173295" "ENSG00000102393"
#> [1633] "ENSG00000149582" "ENSG00000261359" "ENSG00000157827" "ENSG00000164252"
#> [1637] "ENSG00000237988" "ENSG00000123178" "ENSG00000198663" "ENSG00000131446"
#> [1641] "ENSG00000142959" "ENSG00000183628" "ENSG00000105229" "ENSG00000149177"
#> [1645] "ENSG00000234964" "ENSG00000244563" "ENSG00000159214" "ENSG00000170684"
#> [1649] "ENSG00000230069" "ENSG00000167264" "ENSG00000145220" "ENSG00000133835"
#> [1653] "ENSG00000135272" "ENSG00000173065" "ENSG00000107789" "ENSG00000269113"
#> [1657] "ENSG00000138688" "ENSG00000077254" "ENSG00000163701" "ENSG00000276791"
#> [1661] "ENSG00000070476" "ENSG00000119707" "ENSG00000205084" "ENSG00000168234"
#> [1665] "ENSG00000228434" "ENSG00000076944" "ENSG00000171443" "ENSG00000151849"
#> [1669] "ENSG00000163975" "ENSG00000151893" "ENSG00000144848" "ENSG00000049759"
#> [1673] "ENSG00000141905" "ENSG00000197579" "ENSG00000116141" "ENSG00000224023"
#> [1677] "ENSG00000183935" "ENSG00000147789" "ENSG00000174780" "ENSG00000112941"
#> [1681] "ENSG00000110237" "ENSG00000146267" "ENSG00000233757" "ENSG00000122482"
#> [1685] "ENSG00000155465" "ENSG00000119397" "ENSG00000240057" "ENSG00000136273"
#> [1689] "ENSG00000182175" "ENSG00000175931" "ENSG00000136152" "ENSG00000138496"
#> [1693] "ENSG00000163541" "ENSG00000168056" "ENSG00000188529" "ENSG00000220008"
#> [1697] "ENSG00000221968" "ENSG00000136261" "ENSG00000166900" "ENSG00000189001"
#> [1701] "ENSG00000108559" "ENSG00000167658" "ENSG00000269044" "ENSG00000231683"
#> [1705] "ENSG00000165282" "ENSG00000144893" "ENSG00000131941" "ENSG00000138613"
#> [1709] "ENSG00000165474" "ENSG00000154914" "ENSG00000106366" "ENSG00000105088"
#> [1713] "ENSG00000136279" "ENSG00000253327" "ENSG00000163607" "ENSG00000100239"
#> [1717] "ENSG00000142082" "ENSG00000048828" "ENSG00000214194" "ENSG00000267474"
#> [1721] "ENSG00000164494" "ENSG00000100368" "ENSG00000141401" "ENSG00000164188"
#> [1725] "ENSG00000167705" "ENSG00000163751" "ENSG00000267248" "ENSG00000180806"
#> [1729] "ENSG00000162929" "ENSG00000185345" "ENSG00000279714" "ENSG00000165661"
#> [1733] "ENSG00000104067" "ENSG00000143970" "ENSG00000254681" "ENSG00000131626"
#> [1737] "ENSG00000188783" "ENSG00000122390" "ENSG00000150527" "ENSG00000105669"
#> [1741] "ENSG00000214826" "ENSG00000278768" "ENSG00000111644" "ENSG00000170175"
#> [1745] "ENSG00000282936" "ENSG00000155729" "ENSG00000108469" "ENSG00000136720"
#> [1749] "ENSG00000233930" "ENSG00000159685" "ENSG00000181938" "ENSG00000179051"
#> [1753] "ENSG00000188886" "ENSG00000185829" "ENSG00000148362" "ENSG00000112294"
#> [1757] "ENSG00000196961" "ENSG00000028839" "ENSG00000134815" "ENSG00000180867"
#> [1761] "ENSG00000100216" "ENSG00000196526" "ENSG00000285761" "ENSG00000213411"
#> [1765] "ENSG00000102030" "ENSG00000040199" "ENSG00000107738" "ENSG00000177425"
#> [1769] "ENSG00000146426" "ENSG00000165152" "ENSG00000267426" "ENSG00000146143"
#> [1773] "ENSG00000185267" "ENSG00000132661" "ENSG00000254772" "ENSG00000174720"
#> [1777] "ENSG00000131238" "ENSG00000151702" "ENSG00000272755" "ENSG00000270120"
#> [1781] "ENSG00000109111" "ENSG00000135045" "ENSG00000162735" "ENSG00000080546"
#> [1785] "ENSG00000149930" "ENSG00000163293" "ENSG00000105397" "ENSG00000147533"
#> [1789] "ENSG00000099800" "ENSG00000159079" "ENSG00000107263" "ENSG00000198406"
#> [1793] "ENSG00000285641" "ENSG00000275718" "ENSG00000090889" "ENSG00000210082"
#> [1797] "ENSG00000181555" "ENSG00000169018" "ENSG00000155324" "ENSG00000106333"
#> [1801] "ENSG00000155666" "ENSG00000152705" "ENSG00000196693" "ENSG00000004487"
#> [1805] "ENSG00000279827" "ENSG00000144306" "ENSG00000174306" "ENSG00000165949"
#> [1809] "ENSG00000131019" "ENSG00000104973" "ENSG00000136490" "ENSG00000102878"
#> [1813] "ENSG00000102575" "ENSG00000187243" "ENSG00000129451" "ENSG00000101695"
#> [1817] "ENSG00000117519" "ENSG00000139324" "ENSG00000092345" "ENSG00000186815"
#> [1821] "ENSG00000145362" "ENSG00000274615" "ENSG00000166821" "ENSG00000064607"
#> [1825] "ENSG00000268362" "ENSG00000273760" "ENSG00000122705" "ENSG00000075884"
#> [1829] "ENSG00000274461" "ENSG00000132589" "ENSG00000131966" "ENSG00000148399"
#> [1833] "ENSG00000253846" "ENSG00000237892" "ENSG00000133398" "ENSG00000277511"
#> [1837] "ENSG00000128641" "ENSG00000090339" "ENSG00000248632" "ENSG00000100364"
#> [1841] "ENSG00000158486" "ENSG00000146574" "ENSG00000124120" "ENSG00000054965"
#> [1845] "ENSG00000254788" "ENSG00000277806" "ENSG00000065615" "ENSG00000120686"
#> [1849] "ENSG00000241343" "ENSG00000171612" "ENSG00000140553" "ENSG00000118276"
#> [1853] "ENSG00000213793" "ENSG00000061337" "ENSG00000115685" "ENSG00000008056"
#> [1857] "ENSG00000160219" "ENSG00000163728" "ENSG00000196458" "ENSG00000169733"
#> [1861] "ENSG00000155893" "ENSG00000139687" "ENSG00000137193" "ENSG00000197020"
#> [1865] "ENSG00000159479" "ENSG00000196391" "ENSG00000184470" "ENSG00000182173"
#> [1869] "ENSG00000084676" "ENSG00000185499" "ENSG00000108018" "ENSG00000182551"
#> [1873] "ENSG00000115541" "ENSG00000103353" "ENSG00000198189" "ENSG00000203666"
#> [1877] "ENSG00000266389" "ENSG00000080822" "ENSG00000184500" "ENSG00000166471"
#> [1881] "ENSG00000197417" "ENSG00000279311" "ENSG00000056586" "ENSG00000186193"
#> [1885] "ENSG00000164040" "ENSG00000263590" "ENSG00000144810" "ENSG00000196247"
#> [1889] "ENSG00000277687" "ENSG00000244063" "ENSG00000278299" "ENSG00000166562"
#> [1893] "ENSG00000198833" "ENSG00000253372" "ENSG00000164182" "ENSG00000120742"
#> [1897] "ENSG00000136891" "ENSG00000183876" "ENSG00000088280" "ENSG00000203993"
#> [1901] "ENSG00000146555" "ENSG00000079337" "ENSG00000224837" "ENSG00000260793"
#> [1905] "ENSG00000132967" "ENSG00000247315" "ENSG00000234390" "ENSG00000134569"
#> [1909] "ENSG00000116704" "ENSG00000128683" "ENSG00000225791" "ENSG00000166275"
#> [1913] "ENSG00000105372" "ENSG00000174748" "ENSG00000118985" "ENSG00000125735"
#> [1917] "ENSG00000110422" "ENSG00000146842" "ENSG00000198920" "ENSG00000169895"
#> [1921] "ENSG00000185495" "ENSG00000243704" "ENSG00000206532" "ENSG00000163512"
#> [1925] "ENSG00000104219" "ENSG00000101474" "ENSG00000072364" "ENSG00000203497"
#> [1929] "ENSG00000163001" "ENSG00000168769" "ENSG00000139722" "ENSG00000164073"
#> [1933] "ENSG00000179950" "ENSG00000116670" "ENSG00000154920" "ENSG00000049769"
#> [1937] "ENSG00000149054" "ENSG00000276550" "ENSG00000272767" "ENSG00000181704"
#> [1941] "ENSG00000274528" "ENSG00000124479" "ENSG00000172349" "ENSG00000226950"
#> [1945] "ENSG00000133250" "ENSG00000118260" "ENSG00000227825" "ENSG00000182093"
#> [1949] "ENSG00000047849" "ENSG00000273033" "ENSG00000070367" "ENSG00000090266"
#> [1953] "ENSG00000141873" "ENSG00000066557" "ENSG00000175455" "ENSG00000269374"
#> [1957] "ENSG00000066455" "ENSG00000240929" "ENSG00000064687" "ENSG00000164758"
#> [1961] "ENSG00000196313" "ENSG00000259244" "ENSG00000274333" "ENSG00000257181"
#> [1965] "ENSG00000004399" "ENSG00000072786" "ENSG00000127252" "ENSG00000180530"
#> [1969] "ENSG00000006194" "ENSG00000168502" "ENSG00000065057" "ENSG00000156860"
#> [1973] "ENSG00000149599" "ENSG00000188505" "ENSG00000108557" "ENSG00000172197"
#> [1977] "ENSG00000067836" "ENSG00000241170" "ENSG00000224614" "ENSG00000100888"
#> [1981] "ENSG00000206149" "ENSG00000279348" "ENSG00000148950" "ENSG00000101856"
#> [1985] "ENSG00000091592" "ENSG00000251003" "ENSG00000138794" "ENSG00000156374"
#> [1989] "ENSG00000205730" "ENSG00000172046" "ENSG00000197451" "ENSG00000153774"
#> [1993] "ENSG00000139645" "ENSG00000118369" "ENSG00000249228" "ENSG00000264920"
#> [1997] "ENSG00000167074" "ENSG00000163867" "ENSG00000104388" "ENSG00000089123"
#> 
#> $input$arguments$keyType
#> [1] "ENSEMBL"
#> 
#> $input$arguments$OrgDb
#> OrgDb object:
#> | DBSCHEMAVERSION: 2.1
#> | Db type: OrgDb
#> | Supporting package: AnnotationDbi
#> | DBSCHEMA: HUMAN_DB
#> | ORGANISM: Homo sapiens
#> | SPECIES: Human
#> | EGSOURCEDATE: 2026-Mar18
#> | EGSOURCENAME: Entrez Gene
#> | EGSOURCEURL: ftp://ftp.ncbi.nlm.nih.gov/gene/DATA
#> | CENTRALID: EG
#> | TAXID: 9606
#> | GOSOURCENAME: Gene Ontology
#> | GOSOURCEURL: https://current.geneontology.org/ontology/go-basic.obo
#> | GOSOURCEDATE: 2026-01-23
#> | GOEGSOURCEDATE: 2026-Mar18
#> | GOEGSOURCENAME: Entrez Gene
#> | GOEGSOURCEURL: ftp://ftp.ncbi.nlm.nih.gov/gene/DATA
#> | KEGGSOURCENAME: KEGG GENOME
#> | KEGGSOURCEURL: ftp://ftp.genome.jp/pub/kegg/genomes
#> | KEGGSOURCEDATE: 2011-Mar15
#> | GPSOURCENAME: UCSC Genome Bioinformatics (Homo sapiens)
#> | GPSOURCEURL: ftp://hgdownload.cse.ucsc.edu/goldenPath/hg38/database
#> | GPSOURCEDATE: UTC-Mar19
#> | ENSOURCEDATE: 2025-Sep03
#> | ENSOURCENAME: Ensembl
#> | ENSOURCEURL: ftp://ftp.ensembl.org/pub/current_fasta
#> | UPSOURCENAME: Uniprot
#> | UPSOURCEURL: http://www.UniProt.org/
#> | UPSOURCEDATE: Fri Mar 20 10:22:53 2026
#> 
#> $input$arguments$ont
#> [1] "BP"
#> 
#> $input$arguments$pAdjustMethod
#> [1] "BH"
#> 
#> $input$arguments$pvalueCutoff
#> [1] 0.05
#> 
#> $input$arguments$qvalueCutoff
#> [1] 0.1
#> 
#> 
#> 
#> $annotation
#> $annotation$organism
#> [1] "Homo sapiens"
#> 
#> $annotation$gene_set_db
#> [1] "GO"
#> 
#> $annotation$gene_set_db_version
#> [1] "3.23.1"
#> 
#> 
#> $timestamp
#> [1] "2026-06-19 18:33:01 EDT"
#> 
#> $session_info
#> R version 4.6.0 RC (2026-04-17 r89917)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.4 LTS
#> 
#> Matrix products: default
#> BLAS:   /home/biocbuild/bbs-3.24-bioc/R/lib/libRblas.so 
#> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_GB              LC_COLLATE=C              
#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: America/New_York
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats4    stats     graphics  grDevices utils     datasets  methods  
#> [8] base     
#> 
#> other attached packages:
#>  [1] topGO_2.65.0                SparseM_1.84-2             
#>  [3] GO.db_3.23.1                graph_1.91.0               
#>  [5] mosdef_1.9.0                clusterProfiler_4.21.0     
#>  [7] org.Hs.eg.db_3.23.1         AnnotationDbi_1.75.0       
#>  [9] DESeq2_1.53.0               SummarizedExperiment_1.43.0
#> [11] Biobase_2.73.1              MatrixGenerics_1.25.0      
#> [13] matrixStats_1.5.0           GenomicRanges_1.65.0       
#> [15] Seqinfo_1.3.0               IRanges_2.47.2             
#> [17] S4Vectors_0.51.3            BiocGenerics_0.59.7        
#> [19] generics_0.1.4              macrophage_1.29.0          
#> [21] EMMA_0.99.4                 BiocStyle_2.41.0           
#> 
#> loaded via a namespace (and not attached):
#>   [1] splines_4.6.0            BiocIO_1.23.3            bitops_1.0-9            
#>   [4] ggplotify_0.1.3          filelock_1.0.3           BiasedUrn_2.0.12        
#>   [7] tibble_3.3.1             polyclip_1.10-7          enrichit_0.1.5          
#>  [10] XML_3.99-0.23            lifecycle_1.0.5          httr2_1.2.2             
#>  [13] processx_3.9.0           lattice_0.22-9           MASS_7.3-65             
#>  [16] magrittr_2.0.5           sass_0.4.10              rmarkdown_2.31          
#>  [19] jquerylib_0.1.4          yaml_2.3.12              otel_0.2.0              
#>  [22] ggtangle_0.1.2           DBI_1.3.0                RColorBrewer_1.1-3      
#>  [25] abind_1.4-8              purrr_1.2.2              RCurl_1.98-1.19         
#>  [28] yulab.utils_0.2.4        tweenr_2.0.3             rappdirs_0.3.4          
#>  [31] aisdk_1.4.12             gdtools_0.5.1            enrichplot_1.33.0       
#>  [34] ggrepel_0.9.8            tidytree_0.4.7           codetools_0.2-20        
#>  [37] DelayedArray_0.39.3      DOSE_4.7.0               DT_0.34.0               
#>  [40] ggforce_0.5.0            tidyselect_1.2.1         aplot_0.2.9             
#>  [43] UCSC.utils_1.9.0         farver_2.1.2             goseq_1.65.0            
#>  [46] BiocFileCache_3.3.0      GenomicAlignments_1.49.0 jsonlite_2.0.0          
#>  [49] systemfonts_1.3.2        bbmle_1.0.25.1           tools_4.6.0             
#>  [52] ggnewscale_0.5.2         progress_1.2.3           treeio_1.37.0           
#>  [55] Rcpp_1.1.1-1.1           glue_1.8.1               SparseArray_1.13.2      
#>  [58] BiocBaseUtils_1.15.1     mgcv_1.9-4               xfun_0.59               
#>  [61] geneLenDataBase_1.49.0   qvalue_2.45.0            GenomeInfoDb_1.49.1     
#>  [64] dplyr_1.2.1              numDeriv_2016.8-1.1      withr_3.0.3             
#>  [67] BiocManager_1.30.27      fastmap_1.2.0            callr_3.8.0             
#>  [70] digest_0.6.39            R6_2.6.1                 gridGraphics_0.5-1      
#>  [73] dichromat_2.0-0.1        biomaRt_2.69.0           RSQLite_3.53.2          
#>  [76] cigarillo_1.3.0          tidyr_1.3.2              fontLiberation_0.1.0    
#>  [79] rtracklayer_1.73.0       prettyunits_1.2.0        httr_1.4.8              
#>  [82] htmlwidgets_1.6.4        S4Arrays_1.13.0          scatterpie_0.2.6        
#>  [85] pkgconfig_2.0.3          gtable_0.3.6             blob_1.3.0              
#>  [88] S7_0.2.2                 XVector_0.53.0           htmltools_0.5.9         
#>  [91] fontBitstreamVera_0.1.1  bookdown_0.47            scales_1.4.0            
#>  [94] png_0.1-9                ggfun_0.2.0              knitr_1.51              
#>  [97] reshape2_1.4.5           rjson_0.2.23             coda_0.19-4.1           
#> [100] nlme_3.1-169             curl_7.1.0               bdsmatrix_1.3-7         
#> [103] cachem_1.1.0             stringr_1.6.0            parallel_4.6.0          
#> [106] restfulr_0.0.17          apeglm_1.35.0            pillar_1.11.1           
#> [109] grid_4.6.0               vctrs_0.7.3              tidydr_0.0.6            
#> [112] dbplyr_2.6.0             cluster_2.1.8.2          evaluate_1.0.5          
#> [115] GenomicFeatures_1.65.0   mvtnorm_1.4-1            cli_3.6.6               
#> [118] locfit_1.5-9.12          compiler_4.6.0           Rsamtools_2.29.0        
#> [121] rlang_1.2.0              crayon_1.5.3             emdbook_1.3.14          
#> [124] ps_1.9.3                 plyr_1.8.9               fs_2.1.0                
#> [127] ggiraph_0.9.6            stringi_1.8.7            BiocParallel_1.47.0     
#> [130] txdbmaker_1.9.0          Biostrings_2.81.3        lazyeval_0.2.3          
#> [133] GOSemSim_2.39.0          fontquiver_0.2.1         Matrix_1.7-5            
#> [136] hms_1.1.4                patchwork_1.3.2          bit64_4.8.2             
#> [139] ggplot2_4.0.3            KEGGREST_1.53.4          igraph_2.3.2            
#> [142] memoise_2.0.1            bslib_0.11.0             ggtree_4.3.0            
#> [145] bit_4.6.0                ape_5.8-1                gson_0.1.0              
#> 
#> $extra
#> list()
#> 
#> $emma_version
#> [1] "0.99.4"

EMMA structures the EMMA_record attribute (i.e. the recorded provenance information) into a list of elements:

├── EMMA_record
│   ├── method         # how the analysis was performed
│   │   ├── call
│   │   ├── function_name
│   │   ├── package_name
│   │   ├── package_version
│   │   ├── wrapped_function
│   │   ├── wrapped_package
│   │   └── wrapper
│   ├── input         # inputs used for the analysis
│   │   └── arguments
│   ├── annotation    # annotation context
│   │   ├── organism
│   │   ├── gene_set_db
│   │   └── gene_set_db_version
│   ├── timestamp     # when the analysis was run
│   ├── session_info  # R session information
│   ├── extra         # user-defined additions
│   └── emma_version
# get the method record
emma_record$method
#> $call
#> enrichGO(gene = rownames(de_res), universe = gene_universe, keyType = "ENSEMBL", 
#>     OrgDb = org.Hs.eg.db, ont = "BP", pAdjustMethod = "BH", pvalueCutoff = 0.05, 
#>     qvalueCutoff = 0.1)
#> 
#> $function_name
#> [1] "enrichGO"
#> 
#> $package_name
#> [1] "clusterProfiler"
#> 
#> $package_version
#> [1] "4.21.0"
#> 
#> $wrapped_function
#> NULL
#> 
#> $wrapped_package
#> NULL
#> 
#> $wrapper
#> [1] FALSE

With EMMA_run(), we can decide whether we want to save the value of arguments used in our call or not. This can be useful, for example, to avoid unnecessarily increasing the size of the result object. For this, we can use the argument args_form:

fea_res_no_param <- enrichGO(gene = rownames(de_res),
                             universe = gene_universe,
                             keyType = "ENSEMBL",
                             OrgDb = org.Hs.eg.db,
                             ont = "BP",
                             pAdjustMethod = "BH",
                             pvalueCutoff = 0.05,
                             qvalueCutoff = 0.1,
                             readable = TRUE) |> 
  EMMA_run(args_form = "unevaluated") # when we don't want the values stored
                                      # else set to evaluated (default)

# check
EMMA_get_record(fea_res_no_param)
#> $method
#> $method$call
#> enrichGO(gene = rownames(de_res), universe = gene_universe, keyType = "ENSEMBL", 
#>     OrgDb = org.Hs.eg.db, ont = "BP", pAdjustMethod = "BH", pvalueCutoff = 0.05, 
#>     qvalueCutoff = 0.1, readable = TRUE)
#> 
#> $method$function_name
#> [1] "enrichGO"
#> 
#> $method$package_name
#> [1] "clusterProfiler"
#> 
#> $method$package_version
#> [1] "4.21.0"
#> 
#> $method$wrapped_function
#> NULL
#> 
#> $method$wrapped_package
#> NULL
#> 
#> $method$wrapper
#> [1] FALSE
#> 
#> 
#> $input
#> $input$arguments
#> $input$arguments$gene
#> rownames(de_res)
#> 
#> $input$arguments$universe
#> gene_universe
#> 
#> $input$arguments$keyType
#> [1] "ENSEMBL"
#> 
#> $input$arguments$OrgDb
#> org.Hs.eg.db
#> 
#> $input$arguments$ont
#> [1] "BP"
#> 
#> $input$arguments$pAdjustMethod
#> [1] "BH"
#> 
#> $input$arguments$pvalueCutoff
#> [1] 0.05
#> 
#> $input$arguments$qvalueCutoff
#> [1] 0.1
#> 
#> $input$arguments$readable
#> [1] TRUE
#> 
#> 
#> 
#> $annotation
#> $annotation$organism
#> [1] "Homo sapiens"
#> 
#> $annotation$gene_set_db
#> [1] "GO"
#> 
#> $annotation$gene_set_db_version
#> [1] "3.23.1"
#> 
#> 
#> $timestamp
#> [1] "2026-06-19 18:33:39 EDT"
#> 
#> $session_info
#> R version 4.6.0 RC (2026-04-17 r89917)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.4 LTS
#> 
#> Matrix products: default
#> BLAS:   /home/biocbuild/bbs-3.24-bioc/R/lib/libRblas.so 
#> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_GB              LC_COLLATE=C              
#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: America/New_York
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats4    stats     graphics  grDevices utils     datasets  methods  
#> [8] base     
#> 
#> other attached packages:
#>  [1] topGO_2.65.0                SparseM_1.84-2             
#>  [3] GO.db_3.23.1                graph_1.91.0               
#>  [5] mosdef_1.9.0                clusterProfiler_4.21.0     
#>  [7] org.Hs.eg.db_3.23.1         AnnotationDbi_1.75.0       
#>  [9] DESeq2_1.53.0               SummarizedExperiment_1.43.0
#> [11] Biobase_2.73.1              MatrixGenerics_1.25.0      
#> [13] matrixStats_1.5.0           GenomicRanges_1.65.0       
#> [15] Seqinfo_1.3.0               IRanges_2.47.2             
#> [17] S4Vectors_0.51.3            BiocGenerics_0.59.7        
#> [19] generics_0.1.4              macrophage_1.29.0          
#> [21] EMMA_0.99.4                 BiocStyle_2.41.0           
#> 
#> loaded via a namespace (and not attached):
#>   [1] splines_4.6.0            BiocIO_1.23.3            bitops_1.0-9            
#>   [4] ggplotify_0.1.3          filelock_1.0.3           BiasedUrn_2.0.12        
#>   [7] tibble_3.3.1             polyclip_1.10-7          enrichit_0.1.5          
#>  [10] XML_3.99-0.23            lifecycle_1.0.5          httr2_1.2.2             
#>  [13] processx_3.9.0           lattice_0.22-9           MASS_7.3-65             
#>  [16] magrittr_2.0.5           sass_0.4.10              rmarkdown_2.31          
#>  [19] jquerylib_0.1.4          yaml_2.3.12              otel_0.2.0              
#>  [22] ggtangle_0.1.2           DBI_1.3.0                RColorBrewer_1.1-3      
#>  [25] abind_1.4-8              purrr_1.2.2              RCurl_1.98-1.19         
#>  [28] yulab.utils_0.2.4        tweenr_2.0.3             rappdirs_0.3.4          
#>  [31] aisdk_1.4.12             gdtools_0.5.1            enrichplot_1.33.0       
#>  [34] ggrepel_0.9.8            tidytree_0.4.7           codetools_0.2-20        
#>  [37] DelayedArray_0.39.3      DOSE_4.7.0               DT_0.34.0               
#>  [40] ggforce_0.5.0            tidyselect_1.2.1         aplot_0.2.9             
#>  [43] UCSC.utils_1.9.0         farver_2.1.2             goseq_1.65.0            
#>  [46] BiocFileCache_3.3.0      GenomicAlignments_1.49.0 jsonlite_2.0.0          
#>  [49] systemfonts_1.3.2        bbmle_1.0.25.1           tools_4.6.0             
#>  [52] ggnewscale_0.5.2         progress_1.2.3           treeio_1.37.0           
#>  [55] Rcpp_1.1.1-1.1           glue_1.8.1               SparseArray_1.13.2      
#>  [58] BiocBaseUtils_1.15.1     mgcv_1.9-4               xfun_0.59               
#>  [61] geneLenDataBase_1.49.0   qvalue_2.45.0            GenomeInfoDb_1.49.1     
#>  [64] dplyr_1.2.1              numDeriv_2016.8-1.1      withr_3.0.3             
#>  [67] BiocManager_1.30.27      fastmap_1.2.0            callr_3.8.0             
#>  [70] digest_0.6.39            R6_2.6.1                 gridGraphics_0.5-1      
#>  [73] dichromat_2.0-0.1        biomaRt_2.69.0           RSQLite_3.53.2          
#>  [76] cigarillo_1.3.0          tidyr_1.3.2              fontLiberation_0.1.0    
#>  [79] rtracklayer_1.73.0       prettyunits_1.2.0        httr_1.4.8              
#>  [82] htmlwidgets_1.6.4        S4Arrays_1.13.0          scatterpie_0.2.6        
#>  [85] pkgconfig_2.0.3          gtable_0.3.6             blob_1.3.0              
#>  [88] S7_0.2.2                 XVector_0.53.0           htmltools_0.5.9         
#>  [91] fontBitstreamVera_0.1.1  bookdown_0.47            scales_1.4.0            
#>  [94] png_0.1-9                ggfun_0.2.0              knitr_1.51              
#>  [97] reshape2_1.4.5           rjson_0.2.23             coda_0.19-4.1           
#> [100] nlme_3.1-169             curl_7.1.0               bdsmatrix_1.3-7         
#> [103] cachem_1.1.0             stringr_1.6.0            parallel_4.6.0          
#> [106] restfulr_0.0.17          apeglm_1.35.0            pillar_1.11.1           
#> [109] grid_4.6.0               vctrs_0.7.3              tidydr_0.0.6            
#> [112] dbplyr_2.6.0             cluster_2.1.8.2          evaluate_1.0.5          
#> [115] GenomicFeatures_1.65.0   mvtnorm_1.4-1            cli_3.6.6               
#> [118] locfit_1.5-9.12          compiler_4.6.0           Rsamtools_2.29.0        
#> [121] rlang_1.2.0              crayon_1.5.3             emdbook_1.3.14          
#> [124] ps_1.9.3                 plyr_1.8.9               fs_2.1.0                
#> [127] ggiraph_0.9.6            stringi_1.8.7            BiocParallel_1.47.0     
#> [130] txdbmaker_1.9.0          Biostrings_2.81.3        lazyeval_0.2.3          
#> [133] GOSemSim_2.39.0          fontquiver_0.2.1         Matrix_1.7-5            
#> [136] hms_1.1.4                patchwork_1.3.2          bit64_4.8.2             
#> [139] ggplot2_4.0.3            KEGGREST_1.53.4          igraph_2.3.2            
#> [142] memoise_2.0.1            bslib_0.11.0             ggtree_4.3.0            
#> [145] bit_4.6.0                ape_5.8-1                gson_0.1.0              
#> 
#> $extra
#> list()
#> 
#> $emma_version
#> [1] "0.99.4"

We can also choose whether to save the R session information with the record using the argument store_session_info, which defaults to TRUE.

4.4 EMMA_explain(): Summarizing recorded information into text

EMMA_explain() generates a human-readable description of the FEA, similar to a Materials and Methods section of a paper, by summarizing the executed call, the parameters, software context, and reference databases used.

EMMA_explain(fea_res, get_citation = TRUE)
#> ℹ You can always complete your text with additional information from `EMMA_get_record()`!
#> ℹ References:
#> Please cite S. Xu (2024) for using clusterProfiler. In addition, please
#> cite G. Yu (2010) when using GOSemSim, G. Yu (2015) when using DOSE and
#> G. Yu (2015) when using ChIPseeker.
#>   G Yu. Thirteen years of clusterProfiler. The Innovation. 2024,
#>   5(6):100722
#>   S Xu, E Hu, Y Cai, Z Xie, X Luo, L Zhan, W Tang, Q Wang, B Liu, R
#>   Wang, W Xie, T Wu, L Xie, G Yu. Using clusterProfiler to characterize
#>   multiomics data. Nature Protocols. 2024, 19(11):3292-3320
#>   T Wu, E Hu, S Xu, M Chen, P Guo, Z Dai, T Feng, L Zhou, W Tang, L
#>   Zhan, X Fu, S Liu, X Bo, and G Yu. clusterProfiler 4.0: A universal
#>   enrichment tool for interpreting omics data. The Innovation. 2021,
#>   2(3):100141
#>   Guangchuang Yu, Li-Gen Wang, Yanyan Han and Qing-Yu He.
#>   clusterProfiler: an R package for comparing biological themes among
#>   gene clusters. OMICS: A Journal of Integrative Biology 2012,
#>   16(5):284-287
#> To see these entries in BibTeX format, use 'format(<citation>,
#> bibtex=TRUE)', or 'toBibtex(.)'.

[1] “Functional Enrichment Analysis was performed using the enrichGO() function from the clusterProfiler package (version 4.21.0) with the GO database (version 3.23.1). A custom background gene set was provided (n = 2000). Multiple testing correction was performed using the BH method.”

4.5 EMMA with custom/wrapper functions

You can also use a custom function that you developed, or a wrapper function (from packages such as mosdef). In this case, EMMA_run() will attempt to capture as much metadata as possible:

mosdef_fea_res <- mosdef::run_goseq(de_genes = rownames(de_res),
                                    bg_genes = gene_universe,
                                    mapping = "org.Hs.eg.db",
                                    id = "ensGene",
                                    genome = "hg19") |> 
  EMMA_run(store_session_info = FALSE,
           args_form = "unevaluated")

# quick inspection
EMMA_get_record(mosdef_fea_res)
#> $method
#> $method$call
#> mosdef::run_goseq(de_genes = rownames(de_res), bg_genes = gene_universe, 
#>     mapping = "org.Hs.eg.db", id = "ensGene", genome = "hg19")
#> 
#> $method$function_name
#> [1] "run_goseq"
#> 
#> $method$package_name
#> [1] "mosdef"
#> 
#> $method$package_version
#> [1] "1.9.0"
#> 
#> $method$wrapped_function
#> [1] "goseq"
#> 
#> $method$wrapped_package
#> [1] "goseq"
#> 
#> $method$wrapper
#> [1] TRUE
#> 
#> 
#> $input
#> $input$arguments
#> $input$arguments$de_genes
#> rownames(de_res)
#> 
#> $input$arguments$bg_genes
#> gene_universe
#> 
#> $input$arguments$mapping
#> [1] "org.Hs.eg.db"
#> 
#> $input$arguments$id
#> [1] "ensGene"
#> 
#> $input$arguments$genome
#> [1] "hg19"
#> 
#> 
#> 
#> $annotation
#> $annotation$organism
#> [1] "Homo sapiens"
#> 
#> $annotation$gene_set_db
#> [1] "GO"
#> 
#> $annotation$gene_set_db_version
#> [1] "3.23.1"
#> 
#> 
#> $timestamp
#> [1] "2026-06-19 18:33:44 EDT"
#> 
#> $session_info
#> NULL
#> 
#> $extra
#> list()
#> 
#> $emma_version
#> [1] "0.99.4"
# a custom function (not from a package)
my_custom_function <- function(gene, universe = NULL,
                               ontology = "BP", id_type = "ENTREZID",
                               org_db_name = "org.Hs.eg.db", 
                               organism = "hsapiens") {
  res1 <- mosdef::run_topGO(de_genes = gene,
                            bg_genes = gene_universe,
                            ontology = ontology,
                            gene_id = id_type,
                            mapping = org_db_name,
                            add_gene_to_terms = TRUE)

  res2 <- gprofiler2::gost(query = gene,
                           organism = organism,
                           custom_bg = gene_universe)

  return(list(topGO_res = res1,
              gost_res = res2
  ))
}

# run analysis with EMMA
frankenstein_fea <- my_custom_function(
  gene = rownames(de_res),
  universe = gene_universe,
  ontology = "BP",
  id_type = "ENSEMBL",
  org_db_name = "org.Hs.eg.db",
  organism = "hsapiens"
  ) |> EMMA_run(store_session_info = FALSE,
                args_form = "unevaluated") 

# quick inspection
EMMA_get_record(frankenstein_fea)
#> $method
#> $method$call
#> my_custom_function(gene = rownames(de_res), universe = gene_universe, 
#>     ontology = "BP", id_type = "ENSEMBL", org_db_name = "org.Hs.eg.db", 
#>     organism = "hsapiens")
#> 
#> $method$function_name
#> [1] "my_custom_function"
#> 
#> $method$package_name
#> [1] NA
#> 
#> $method$package_version
#> [1] NA
#> 
#> $method$wrapped_function
#> [1] "run_topGO" "gost"     
#> 
#> $method$wrapped_package
#> [1] "mosdef"     "gprofiler2"
#> 
#> $method$wrapper
#> [1] TRUE
#> 
#> 
#> $input
#> $input$arguments
#> $input$arguments$gene
#> rownames(de_res)
#> 
#> $input$arguments$universe
#> gene_universe
#> 
#> $input$arguments$ontology
#> [1] "BP"
#> 
#> $input$arguments$id_type
#> [1] "ENSEMBL"
#> 
#> $input$arguments$org_db_name
#> [1] "org.Hs.eg.db"
#> 
#> $input$arguments$organism
#> [1] "hsapiens"
#> 
#> 
#> 
#> $annotation
#> $annotation$organism
#> [1] "hsapiens"
#> 
#> $annotation$gene_set_db
#>  [1] "CORUM" "GO:BP" "GO:CC" "GO:MF" "HP"    "HPA"   "KEGG"  "MIRNA" "REAC" 
#> [10] "TF"    "WP"   
#> 
#> $annotation$gene_set_db_version
#> [1] "28.11.2022 Corum 4.1"                                         
#> [2] "annotations: BioMart\nclasses: releases/2026-01-23"           
#> [3] "annotations: 03.2026\nclasses: None"                          
#> [4] "annotations: HPA website: 25-11-06\nclasses: script: 26-01-20"
#> [5] "KEGG FTP Release 2026-03-15"                                  
#> [6] "Release 10.0"                                                 
#> [7] "annotations: BioMart\nclasses: 2026-3-20"                     
#> [8] "annotations: TRANSFAC Release 2025.2\nclasses: v2"            
#> [9] "20260310"                                                     
#> 
#> 
#> $timestamp
#> [1] "2026-06-19 18:34:07 EDT"
#> 
#> $session_info
#> NULL
#> 
#> $extra
#> list()
#> 
#> $emma_version
#> [1] "0.99.4"

4.6 EMMA_add_custom_metadata(): Adding extra information

The user can always attach extra metadata that EMMA might not be able to capture automatically. To keep everything organized, we can use EMMA_add_custom_metadata() function

frankenstein_fea2 <- EMMA_add_custom_metadata(res = frankenstein_fea,
                                              extra = list(
                                                wrapped_function_topGO = "runTest",
                                                notes = "any other meaningful info"))

EMMA_get_record(frankenstein_fea2)$extra
#> $wrapped_function_topGO
#> [1] "runTest"
#> 
#> $notes
#> [1] "any other meaningful info"

Since the EMMA_record is attached as attribute to the original results objects, it can be preserved when integrating results into structured containers such as DeeDeeExperiment (Abassi et al. 2026). This enables both FEA results and their associated provenance information to be stored and managed together, facilitating reproducibility, organization, and sharing of complex omics analyses.

dde <- DeeDeeExperiment::DeeDeeExperiment(sce = dds_macrophage,
                                          de_results = IFNg_vs_naive,
                                          enrich_results =  list(
                                            IFNg_vs_naive = fea_res_no_param)
                                          )

fea <- DeeDeeExperiment::getFEA(dde, format = "original")

EMMA_get_record(fea)
#> $method
#> $method$call
#> enrichGO(gene = rownames(de_res), universe = gene_universe, keyType = "ENSEMBL", 
#>     OrgDb = org.Hs.eg.db, ont = "BP", pAdjustMethod = "BH", pvalueCutoff = 0.05, 
#>     qvalueCutoff = 0.1, readable = TRUE)
#> 
#> $method$function_name
#> [1] "enrichGO"
#> 
#> $method$package_name
#> [1] "clusterProfiler"
#> 
#> $method$package_version
#> [1] "4.21.0"
#> 
#> $method$wrapped_function
#> NULL
#> 
#> $method$wrapped_package
#> NULL
#> 
#> $method$wrapper
#> [1] FALSE
#> 
#> 
#> $input
#> $input$arguments
#> $input$arguments$gene
#> rownames(de_res)
#> 
#> $input$arguments$universe
#> gene_universe
#> 
#> $input$arguments$keyType
#> [1] "ENSEMBL"
#> 
#> $input$arguments$OrgDb
#> org.Hs.eg.db
#> 
#> $input$arguments$ont
#> [1] "BP"
#> 
#> $input$arguments$pAdjustMethod
#> [1] "BH"
#> 
#> $input$arguments$pvalueCutoff
#> [1] 0.05
#> 
#> $input$arguments$qvalueCutoff
#> [1] 0.1
#> 
#> $input$arguments$readable
#> [1] TRUE
#> 
#> 
#> 
#> $annotation
#> $annotation$organism
#> [1] "Homo sapiens"
#> 
#> $annotation$gene_set_db
#> [1] "GO"
#> 
#> $annotation$gene_set_db_version
#> [1] "3.23.1"
#> 
#> 
#> $timestamp
#> [1] "2026-06-19 18:33:39 EDT"
#> 
#> $session_info
#> R version 4.6.0 RC (2026-04-17 r89917)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.4 LTS
#> 
#> Matrix products: default
#> BLAS:   /home/biocbuild/bbs-3.24-bioc/R/lib/libRblas.so 
#> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_GB              LC_COLLATE=C              
#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: America/New_York
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats4    stats     graphics  grDevices utils     datasets  methods  
#> [8] base     
#> 
#> other attached packages:
#>  [1] topGO_2.65.0                SparseM_1.84-2             
#>  [3] GO.db_3.23.1                graph_1.91.0               
#>  [5] mosdef_1.9.0                clusterProfiler_4.21.0     
#>  [7] org.Hs.eg.db_3.23.1         AnnotationDbi_1.75.0       
#>  [9] DESeq2_1.53.0               SummarizedExperiment_1.43.0
#> [11] Biobase_2.73.1              MatrixGenerics_1.25.0      
#> [13] matrixStats_1.5.0           GenomicRanges_1.65.0       
#> [15] Seqinfo_1.3.0               IRanges_2.47.2             
#> [17] S4Vectors_0.51.3            BiocGenerics_0.59.7        
#> [19] generics_0.1.4              macrophage_1.29.0          
#> [21] EMMA_0.99.4                 BiocStyle_2.41.0           
#> 
#> loaded via a namespace (and not attached):
#>   [1] splines_4.6.0            BiocIO_1.23.3            bitops_1.0-9            
#>   [4] ggplotify_0.1.3          filelock_1.0.3           BiasedUrn_2.0.12        
#>   [7] tibble_3.3.1             polyclip_1.10-7          enrichit_0.1.5          
#>  [10] XML_3.99-0.23            lifecycle_1.0.5          httr2_1.2.2             
#>  [13] processx_3.9.0           lattice_0.22-9           MASS_7.3-65             
#>  [16] magrittr_2.0.5           sass_0.4.10              rmarkdown_2.31          
#>  [19] jquerylib_0.1.4          yaml_2.3.12              otel_0.2.0              
#>  [22] ggtangle_0.1.2           DBI_1.3.0                RColorBrewer_1.1-3      
#>  [25] abind_1.4-8              purrr_1.2.2              RCurl_1.98-1.19         
#>  [28] yulab.utils_0.2.4        tweenr_2.0.3             rappdirs_0.3.4          
#>  [31] aisdk_1.4.12             gdtools_0.5.1            enrichplot_1.33.0       
#>  [34] ggrepel_0.9.8            tidytree_0.4.7           codetools_0.2-20        
#>  [37] DelayedArray_0.39.3      DOSE_4.7.0               DT_0.34.0               
#>  [40] ggforce_0.5.0            tidyselect_1.2.1         aplot_0.2.9             
#>  [43] UCSC.utils_1.9.0         farver_2.1.2             goseq_1.65.0            
#>  [46] BiocFileCache_3.3.0      GenomicAlignments_1.49.0 jsonlite_2.0.0          
#>  [49] systemfonts_1.3.2        bbmle_1.0.25.1           tools_4.6.0             
#>  [52] ggnewscale_0.5.2         progress_1.2.3           treeio_1.37.0           
#>  [55] Rcpp_1.1.1-1.1           glue_1.8.1               SparseArray_1.13.2      
#>  [58] BiocBaseUtils_1.15.1     mgcv_1.9-4               xfun_0.59               
#>  [61] geneLenDataBase_1.49.0   qvalue_2.45.0            GenomeInfoDb_1.49.1     
#>  [64] dplyr_1.2.1              numDeriv_2016.8-1.1      withr_3.0.3             
#>  [67] BiocManager_1.30.27      fastmap_1.2.0            callr_3.8.0             
#>  [70] digest_0.6.39            R6_2.6.1                 gridGraphics_0.5-1      
#>  [73] dichromat_2.0-0.1        biomaRt_2.69.0           RSQLite_3.53.2          
#>  [76] cigarillo_1.3.0          tidyr_1.3.2              fontLiberation_0.1.0    
#>  [79] rtracklayer_1.73.0       prettyunits_1.2.0        httr_1.4.8              
#>  [82] htmlwidgets_1.6.4        S4Arrays_1.13.0          scatterpie_0.2.6        
#>  [85] pkgconfig_2.0.3          gtable_0.3.6             blob_1.3.0              
#>  [88] S7_0.2.2                 XVector_0.53.0           htmltools_0.5.9         
#>  [91] fontBitstreamVera_0.1.1  bookdown_0.47            scales_1.4.0            
#>  [94] png_0.1-9                ggfun_0.2.0              knitr_1.51              
#>  [97] reshape2_1.4.5           rjson_0.2.23             coda_0.19-4.1           
#> [100] nlme_3.1-169             curl_7.1.0               bdsmatrix_1.3-7         
#> [103] cachem_1.1.0             stringr_1.6.0            parallel_4.6.0          
#> [106] restfulr_0.0.17          apeglm_1.35.0            pillar_1.11.1           
#> [109] grid_4.6.0               vctrs_0.7.3              tidydr_0.0.6            
#> [112] dbplyr_2.6.0             cluster_2.1.8.2          evaluate_1.0.5          
#> [115] GenomicFeatures_1.65.0   mvtnorm_1.4-1            cli_3.6.6               
#> [118] locfit_1.5-9.12          compiler_4.6.0           Rsamtools_2.29.0        
#> [121] rlang_1.2.0              crayon_1.5.3             emdbook_1.3.14          
#> [124] ps_1.9.3                 plyr_1.8.9               fs_2.1.0                
#> [127] ggiraph_0.9.6            stringi_1.8.7            BiocParallel_1.47.0     
#> [130] txdbmaker_1.9.0          Biostrings_2.81.3        lazyeval_0.2.3          
#> [133] GOSemSim_2.39.0          fontquiver_0.2.1         Matrix_1.7-5            
#> [136] hms_1.1.4                patchwork_1.3.2          bit64_4.8.2             
#> [139] ggplot2_4.0.3            KEGGREST_1.53.4          igraph_2.3.2            
#> [142] memoise_2.0.1            bslib_0.11.0             ggtree_4.3.0            
#> [145] bit_4.6.0                ape_5.8-1                gson_0.1.0              
#> 
#> $extra
#> list()
#> 
#> $emma_version
#> [1] "0.99.4"

4.7 EMMA_freeze(): Recording the Analysis Environment

EMMA_freeze() records the R environment at the time of analysis by generating a lockfile using renv. By default, the snapshot is created with force = TRUE, allowing the environment to be recorded even when inconsistencies (e.g. version mismatches) are present.

This behavior reflects the goal of preserving the analysis environment as it was used in practice, rather than attempting to enforce a fully consistent state.

if (requireNamespace("renv", quietly = TRUE)) {
  project_path <- tempdir()
  dir.create(project_path)
  EMMA_freeze(project = project_path,
              file = "analysis.lock",
              pkgs = loadedNamespaces(),
              prompt = FALSE,
              force = TRUE)
}
#> [?25l[?25hThe following Bioconductor packages appear to be from a separate Bioconductor release:
#> - EMMA [installed 0.99.4 != latest <NA>]
#> renv may be unable to restore these packages.
#> Bioconductor version: 3.24
#> 
#> The following package(s) will be updated in the lockfile:
#> 
#> # Bioconductor ---------------------------------------------------------------
#> - GO.db                  [* -> 3.23.1]
#> - org.Hs.eg.db           [* -> 3.23.1]
#> 
#> # Bioconductor 3.24 ----------------------------------------------------------
#> - AnnotationDbi          [* -> 1.75.0]
#> - Biobase                [* -> 2.73.1]
#> - BiocBaseUtils          [* -> 1.15.1]
#> - BiocFileCache          [* -> 3.3.0]
#> - BiocGenerics           [* -> 0.59.7]
#> - BiocIO                 [* -> 1.23.3]
#> - BiocParallel           [* -> 1.47.0]
#> - BiocStyle              [* -> 2.41.0]
#> - BiocVersion            [* -> 3.24.0]
#> - Biostrings             [* -> 2.81.3]
#> - DESeq2                 [* -> 1.53.0]
#> - DOSE                   [* -> 4.7.0]
#> - DeeDeeExperiment       [* -> 1.3.0]
#> - DelayedArray           [* -> 0.39.3]
#> - EMMA                   [* -> 0.99.4]
#> - GOSemSim               [* -> 2.39.0]
#> - GenomeInfoDb           [* -> 1.49.1]
#> - GenomicAlignments      [* -> 1.49.0]
#> - GenomicFeatures        [* -> 1.65.0]
#> - GenomicRanges          [* -> 1.65.0]
#> - IRanges                [* -> 2.47.2]
#> - KEGGREST               [* -> 1.53.4]
#> - MatrixGenerics         [* -> 1.25.0]
#> - Rhtslib                [* -> 3.9.0]
#> - Rsamtools              [* -> 2.29.0]
#> - S4Arrays               [* -> 1.13.0]
#> - S4Vectors              [* -> 0.51.3]
#> - Seqinfo                [* -> 1.3.0]
#> - SingleCellExperiment   [* -> 1.35.1]
#> - SparseArray            [* -> 1.13.2]
#> - SummarizedExperiment   [* -> 1.43.0]
#> - UCSC.utils             [* -> 1.9.0]
#> - XVector                [* -> 0.53.0]
#> - apeglm                 [* -> 1.35.0]
#> - biomaRt                [* -> 2.69.0]
#> - cigarillo              [* -> 1.3.0]
#> - clusterProfiler        [* -> 4.21.0]
#> - edgeR                  [* -> 4.11.1]
#> - enrichplot             [* -> 1.33.0]
#> - geneLenDataBase        [* -> 1.49.0]
#> - ggtree                 [* -> 4.3.0]
#> - goseq                  [* -> 1.65.0]
#> - graph                  [* -> 1.91.0]
#> - limma                  [* -> 3.69.2]
#> - macrophage             [* -> 1.29.0]
#> - mosdef                 [* -> 1.9.0]
#> - qvalue                 [* -> 2.45.0]
#> - rtracklayer            [* -> 1.73.0]
#> - topGO                  [* -> 2.65.0]
#> - treeio                 [* -> 1.37.0]
#> - txdbmaker              [* -> 1.9.0]
#> 
#> # CRAN -----------------------------------------------------------------------
#> - BH                     [* -> 1.90.0-1]
#> - BiasedUrn              [* -> 2.0.12]
#> - BiocManager            [* -> 1.30.27]
#> - DBI                    [* -> 1.3.0]
#> - DT                     [* -> 0.34.0]
#> - MASS                   [* -> 7.3-65]
#> - Matrix                 [* -> 1.7-5]
#> - R6                     [* -> 2.6.1]
#> - RColorBrewer           [* -> 1.1-3]
#> - RCurl                  [* -> 1.98-1.19]
#> - RSQLite                [* -> 3.53.2]
#> - Rcpp                   [* -> 1.1.1-1.1]
#> - RcppArmadillo          [* -> 15.4.0-1]
#> - RcppEigen              [* -> 0.3.4.0.2]
#> - RcppNumerical          [* -> 0.7-0]
#> - S7                     [* -> 0.2.2]
#> - SparseM                [* -> 1.84-2]
#> - XML                    [* -> 3.99-0.23]
#> - abind                  [* -> 1.4-8]
#> - aisdk                  [* -> 1.4.12]
#> - ape                    [* -> 5.8-1]
#> - aplot                  [* -> 0.2.9]
#> - askpass                [* -> 1.2.1]
#> - base64enc              [* -> 0.1-6]
#> - bbmle                  [* -> 1.0.25.1]
#> - bdsmatrix              [* -> 1.3-7]
#> - bit                    [* -> 4.6.0]
#> - bit64                  [* -> 4.8.2]
#> - bitops                 [* -> 1.0-9]
#> - blob                   [* -> 1.3.0]
#> - bookdown               [* -> 0.47]
#> - bslib                  [* -> 0.11.0]
#> - cachem                 [* -> 1.1.0]
#> - callr                  [* -> 3.8.0]
#> - cli                    [* -> 3.6.6]
#> - cluster                [* -> 2.1.8.2]
#> - coda                   [* -> 0.19-4.1]
#> - codetools              [* -> 0.2-20]
#> - cpp11                  [* -> 0.5.5]
#> - crayon                 [* -> 1.5.3]
#> - crosstalk              [* -> 1.2.2]
#> - curl                   [* -> 7.1.0]
#> - data.table             [* -> 1.18.4]
#> - dbplyr                 [* -> 2.6.0]
#> - dichromat              [* -> 2.0-0.1]
#> - digest                 [* -> 0.6.39]
#> - dplyr                  [* -> 1.2.1]
#> - emdbook                [* -> 1.3.14]
#> - enrichit               [* -> 0.1.5]
#> - evaluate               [* -> 1.0.5]
#> - farver                 [* -> 2.1.2]
#> - fastmap                [* -> 1.2.0]
#> - filelock               [* -> 1.0.3]
#> - fontBitstreamVera      [* -> 0.1.1]
#> - fontLiberation         [* -> 0.1.0]
#> - fontawesome            [* -> 0.5.3]
#> - fontquiver             [* -> 0.2.1]
#> - formatR                [* -> 1.14]
#> - fs                     [* -> 2.1.0]
#> - futile.logger          [* -> 1.4.9]
#> - futile.options         [* -> 1.0.1]
#> - gdtools                [* -> 0.5.1]
#> - generics               [* -> 0.1.4]
#> - ggforce                [* -> 0.5.0]
#> - ggfun                  [* -> 0.2.0]
#> - ggiraph                [* -> 0.9.6]
#> - ggnewscale             [* -> 0.5.2]
#> - ggplot2                [* -> 4.0.3]
#> - ggplotify              [* -> 0.1.3]
#> - ggrepel                [* -> 0.9.8]
#> - ggtangle               [* -> 0.1.2]
#> - glue                   [* -> 1.8.1]
#> - gprofiler2             [* -> 0.2.4]
#> - gridExtra              [* -> 2.3]
#> - gridGraphics           [* -> 0.5-1]
#> - gson                   [* -> 0.1.0]
#> - gtable                 [* -> 0.3.6]
#> - highr                  [* -> 0.12]
#> - hms                    [* -> 1.1.4]
#> - htmltools              [* -> 0.5.9]
#> - htmlwidgets            [* -> 1.6.4]
#> - httr                   [* -> 1.4.8]
#> - httr2                  [* -> 1.2.2]
#> - igraph                 [* -> 2.3.2]
#> - isoband                [* -> 0.3.0]
#> - jquerylib              [* -> 0.1.4]
#> - jsonlite               [* -> 2.0.0]
#> - knitr                  [* -> 1.51]
#> - labeling               [* -> 0.4.3]
#> - lambda.r               [* -> 1.2.4]
#> - later                  [* -> 1.4.8]
#> - lattice                [* -> 0.22-9]
#> - lazyeval               [* -> 0.2.3]
#> - lifecycle              [* -> 1.0.5]
#> - locfit                 [* -> 1.5-9.12]
#> - magrittr               [* -> 2.0.5]
#> - matrixStats            [* -> 1.5.0]
#> - memoise                [* -> 2.0.1]
#> - mgcv                   [* -> 1.9-4]
#> - mime                   [* -> 0.13]
#> - mvtnorm                [* -> 1.4-1]
#> - nlme                   [* -> 3.1-169]
#> - numDeriv               [* -> 2016.8-1.1]
#> - openssl                [* -> 2.4.2]
#> - otel                   [* -> 0.2.0]
#> - patchwork              [* -> 1.3.2]
#> - pillar                 [* -> 1.11.1]
#> - pkgconfig              [* -> 2.0.3]
#> - plotly                 [* -> 4.12.0]
#> - plyr                   [* -> 1.8.9]
#> - png                    [* -> 0.1-9]
#> - polyclip               [* -> 1.10-7]
#> - prettyunits            [* -> 1.2.0]
#> - processx               [* -> 3.9.0]
#> - progress               [* -> 1.2.3]
#> - promises               [* -> 1.5.0]
#> - ps                     [* -> 1.9.3]
#> - purrr                  [* -> 1.2.2]
#> - rappdirs               [* -> 0.3.4]
#> - renv                   [* -> 1.2.3]
#> - reshape2               [* -> 1.4.5]
#> - restfulr               [* -> 0.0.17]
#> - rjson                  [* -> 0.2.23]
#> - rlang                  [* -> 1.2.0]
#> - rmarkdown              [* -> 2.31]
#> - sass                   [* -> 0.4.10]
#> - scales                 [* -> 1.4.0]
#> - scatterpie             [* -> 0.2.6]
#> - snow                   [* -> 0.4-4]
#> - statmod                [* -> 1.5.2]
#> - stringi                [* -> 1.8.7]
#> - stringr                [* -> 1.6.0]
#> - sys                    [* -> 3.4.3]
#> - systemfonts            [* -> 1.3.2]
#> - tibble                 [* -> 3.3.1]
#> - tidydr                 [* -> 0.0.6]
#> - tidyr                  [* -> 1.3.2]
#> - tidyselect             [* -> 1.2.1]
#> - tidytree               [* -> 0.4.7]
#> - tinytex                [* -> 0.60]
#> - tweenr                 [* -> 2.0.3]
#> - utf8                   [* -> 1.2.6]
#> - vctrs                  [* -> 0.7.3]
#> - viridisLite            [* -> 0.4.3]
#> - withr                  [* -> 3.0.3]
#> - writexl                [* -> 1.5.4]
#> - xfun                   [* -> 0.59]
#> - xml2                   [* -> 1.5.2]
#> - yaml                   [* -> 2.3.12]
#> - yulab.utils            [* -> 0.2.4]
#> 
#> The version of R recorded in the lockfile will be updated:
#> - R                      [* -> 4.6.0]
#> 
#> - Lockfile written to "/tmp/Rtmp72q51a/analysis.lock".

4.8 EMMA with iterative workflows

In real-world analyses, multiple FEA results from different contrasts are often analyzed in parallel This can be conveniently handled using iterative approaches such as lapply().

fea_res_list <- lapply(de_list, function(dea){
  #### perform fea with EMMA_run ####
  enrichGO(gene = rownames(dea),
           universe = gene_universe,
           keyType = "ENSEMBL",
           OrgDb = org.Hs.eg.db,
           ont = "BP",
           pAdjustMethod = "BH",
           pvalueCutoff = 0.05,
           qvalueCutoff = 0.1,
           readable = TRUE) |> 
    EMMA_run()
})

#### print the metadata summary for each contrast ####
invisible(lapply(names(fea_res_list), function(nm) {
  cat("\n###", nm)
  EMMA_show(fea_res_list[[nm]])
}))
#> 
#> ### IFNg_vs_naive
#> Number of Pathways: 67 
#> Call: enrichGO(gene = rownames(dea), universe = gene_universe, keyType = "ENSEMBL",      OrgDb = org.Hs.eg.db, ont = "BP", pAdjustMethod = "BH", pvalueCutoff = 0.05,      qvalueCutoff = 0.1, readable = TRUE)  
#> Wrapper: FALSE  
#> Package: clusterProfiler v. 4.21.0  
#> Organism: Homo sapiens  
#> Gene set library: GO  
#> Gene set library version: 3.23.1  
#> 
#> 
#> ### SL1344_vs_naive
#> Number of Pathways: 87 
#> Call: enrichGO(gene = rownames(dea), universe = gene_universe, keyType = "ENSEMBL",      OrgDb = org.Hs.eg.db, ont = "BP", pAdjustMethod = "BH", pvalueCutoff = 0.05,      qvalueCutoff = 0.1, readable = TRUE)  
#> Wrapper: FALSE  
#> Package: clusterProfiler v. 4.21.0  
#> Organism: Homo sapiens  
#> Gene set library: GO  
#> Gene set library version: 3.23.1
#### add more info to the metadata ####
fea_res_list <- setNames(lapply(names(fea_res_list), function(nm) {
  EMMA_add_custom_metadata(fea_res_list[[nm]], extra = list(contrast_name = nm))
  }), 
names(fea_res_list))

#### get the raw metadata ####
record_list <- list()

record_list <- setNames(lapply(names(fea_res_list), function(mn){
  EMMA_get_record(fea_res_list[[mn]])
  }),
names(fea_res_list))

record_list$SL1344_vs_naive$extra
#> $contrast_name
#> [1] "SL1344_vs_naive"
record_list$SL1344_vs_naive$method$package_name
#> [1] "clusterProfiler"

5 Supported methods and future extensions

EMMA currently provides metadata capture support for several commonly used FEA tools, including methods from clusterProfiler, gprofiler2, and related wrappers/custom functions such as mosdef.

EMMA is designed to be extensible, and support for additional FEA methods and packages will continue to expand over time.

Session info

sessionInfo()
#> R version 4.6.0 RC (2026-04-17 r89917)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.4 LTS
#> 
#> Matrix products: default
#> BLAS:   /home/biocbuild/bbs-3.24-bioc/R/lib/libRblas.so 
#> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_GB              LC_COLLATE=C              
#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: America/New_York
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats4    stats     graphics  grDevices utils     datasets  methods  
#> [8] base     
#> 
#> other attached packages:
#>  [1] topGO_2.65.0                SparseM_1.84-2             
#>  [3] GO.db_3.23.1                graph_1.91.0               
#>  [5] mosdef_1.9.0                clusterProfiler_4.21.0     
#>  [7] org.Hs.eg.db_3.23.1         AnnotationDbi_1.75.0       
#>  [9] DESeq2_1.53.0               SummarizedExperiment_1.43.0
#> [11] Biobase_2.73.1              MatrixGenerics_1.25.0      
#> [13] matrixStats_1.5.0           GenomicRanges_1.65.0       
#> [15] Seqinfo_1.3.0               IRanges_2.47.2             
#> [17] S4Vectors_0.51.3            BiocGenerics_0.59.7        
#> [19] generics_0.1.4              macrophage_1.29.0          
#> [21] EMMA_0.99.4                 BiocStyle_2.41.0           
#> 
#> loaded via a namespace (and not attached):
#>   [1] splines_4.6.0               BiocIO_1.23.3              
#>   [3] bitops_1.0-9                ggplotify_0.1.3            
#>   [5] filelock_1.0.3              BiasedUrn_2.0.12           
#>   [7] tibble_3.3.1                polyclip_1.10-7            
#>   [9] enrichit_0.1.5              XML_3.99-0.23              
#>  [11] lifecycle_1.0.5             httr2_1.2.2                
#>  [13] edgeR_4.11.1                processx_3.9.0             
#>  [15] lattice_0.22-9              MASS_7.3-65                
#>  [17] magrittr_2.0.5              limma_3.69.2               
#>  [19] plotly_4.12.0               sass_0.4.10                
#>  [21] rmarkdown_2.31              jquerylib_0.1.4            
#>  [23] yaml_2.3.12                 otel_0.2.0                 
#>  [25] ggtangle_0.1.2              DBI_1.3.0                  
#>  [27] RColorBrewer_1.1-3          abind_1.4-8                
#>  [29] purrr_1.2.2                 RCurl_1.98-1.19            
#>  [31] yulab.utils_0.2.4           tweenr_2.0.3               
#>  [33] rappdirs_0.3.4              aisdk_1.4.12               
#>  [35] gdtools_0.5.1               enrichplot_1.33.0          
#>  [37] ggrepel_0.9.8               tidytree_0.4.7             
#>  [39] codetools_0.2-20            DelayedArray_0.39.3        
#>  [41] DOSE_4.7.0                  DT_0.34.0                  
#>  [43] ggforce_0.5.0               tidyselect_1.2.1           
#>  [45] aplot_0.2.9                 UCSC.utils_1.9.0           
#>  [47] farver_2.1.2                goseq_1.65.0               
#>  [49] BiocFileCache_3.3.0         GenomicAlignments_1.49.0   
#>  [51] jsonlite_2.0.0              systemfonts_1.3.2          
#>  [53] bbmle_1.0.25.1              DeeDeeExperiment_1.3.0     
#>  [55] tools_4.6.0                 ggnewscale_0.5.2           
#>  [57] progress_1.2.3              treeio_1.37.0              
#>  [59] Rcpp_1.1.1-1.1              glue_1.8.1                 
#>  [61] SparseArray_1.13.2          BiocBaseUtils_1.15.1       
#>  [63] mgcv_1.9-4                  xfun_0.59                  
#>  [65] geneLenDataBase_1.49.0      qvalue_2.45.0              
#>  [67] GenomeInfoDb_1.49.1         dplyr_1.2.1                
#>  [69] numDeriv_2016.8-1.1         withr_3.0.3                
#>  [71] BiocManager_1.30.27         fastmap_1.2.0              
#>  [73] callr_3.8.0                 digest_0.6.39              
#>  [75] R6_2.6.1                    gridGraphics_0.5-1         
#>  [77] dichromat_2.0-0.1           biomaRt_2.69.0             
#>  [79] RSQLite_3.53.2              cigarillo_1.3.0            
#>  [81] tidyr_1.3.2                 renv_1.2.3                 
#>  [83] data.table_1.18.4           fontLiberation_0.1.0       
#>  [85] rtracklayer_1.73.0          prettyunits_1.2.0          
#>  [87] httr_1.4.8                  htmlwidgets_1.6.4          
#>  [89] S4Arrays_1.13.0             scatterpie_0.2.6           
#>  [91] pkgconfig_2.0.3             gtable_0.3.6               
#>  [93] blob_1.3.0                  S7_0.2.2                   
#>  [95] SingleCellExperiment_1.35.1 XVector_0.53.0             
#>  [97] htmltools_0.5.9             fontBitstreamVera_0.1.1    
#>  [99] bookdown_0.47               scales_1.4.0               
#> [101] png_0.1-9                   ggfun_0.2.0                
#> [103] knitr_1.51                  reshape2_1.4.5             
#> [105] rjson_0.2.23                coda_0.19-4.1              
#> [107] nlme_3.1-169                curl_7.1.0                 
#> [109] bdsmatrix_1.3-7             cachem_1.1.0               
#> [111] stringr_1.6.0               parallel_4.6.0             
#> [113] restfulr_0.0.17             apeglm_1.35.0              
#> [115] pillar_1.11.1               grid_4.6.0                 
#> [117] vctrs_0.7.3                 tidydr_0.0.6               
#> [119] dbplyr_2.6.0                cluster_2.1.8.2            
#> [121] evaluate_1.0.5              GenomicFeatures_1.65.0     
#> [123] mvtnorm_1.4-1               cli_3.6.6                  
#> [125] locfit_1.5-9.12             compiler_4.6.0             
#> [127] Rsamtools_2.29.0            rlang_1.2.0                
#> [129] crayon_1.5.3                gprofiler2_0.2.4           
#> [131] emdbook_1.3.14              ps_1.9.3                   
#> [133] plyr_1.8.9                  fs_2.1.0                   
#> [135] writexl_1.5.4               ggiraph_0.9.6              
#> [137] stringi_1.8.7               viridisLite_0.4.3          
#> [139] BiocParallel_1.47.0         txdbmaker_1.9.0            
#> [141] Biostrings_2.81.3           lazyeval_0.2.3             
#> [143] GOSemSim_2.39.0             fontquiver_0.2.1           
#> [145] Matrix_1.7-5                hms_1.1.4                  
#> [147] patchwork_1.3.2             bit64_4.8.2                
#> [149] ggplot2_4.0.3               statmod_1.5.2              
#> [151] KEGGREST_1.53.4             igraph_2.3.2               
#> [153] memoise_2.0.1               bslib_0.11.0               
#> [155] ggtree_4.3.0                bit_4.6.0                  
#> [157] ape_5.8-1                   gson_0.1.0

References

Abassi, Najla, Lea Schwarz, Edoardo Filippi, and Federico Marini. 2026. “DeeDeeExperiment: Building an Infrastructure for Integrating and Managing Omics Data Analysis Results in R/Bioconductor.” Edited by Russell Schwartz. Bioinformatics 42 (4). https://doi.org/10.1093/bioinformatics/btag157.

Alasoo, Kaur, Julia Rodrigues, Subhankar Mukhopadhyay, Andrew J. Knights, Alice L. Mann, Kousik Kundu, Christine Hale, Gordon Dougan, and Daniel J. Gaffney. 2018. “Shared genetic effects on chromatin and gene expression indicate a role for enhancer priming in immune response.” Nature Genetics 50 (3): 424–31. https://doi.org/10.1038/s41588-018-0046-7.

Brazma, Alvis, Pascal Hingamp, John Quackenbush, Gavin Sherlock, Paul Spellman, Chris Stoeckert, John Aach, et al. 2001. “Minimum Information About a Microarray Experiment (Miame)—Toward Standards for Microarray Data.” Nature Genetics 29 (4): 365–71. https://doi.org/10.1038/ng1201-365.

Khatri, Purvesh, Marina Sirota, and Atul J. Butte. 2012. “Ten Years of Pathway Analysis: Current Approaches and Outstanding Challenges.” Edited by Christos A. Ouzounis. PLoS Computational Biology 8 (2): e1002375. https://doi.org/10.1371/journal.pcbi.1002375.

Subramanian, Aravind, Pablo Tamayo, Vamsi K. Mootha, Sayan Mukherjee, Benjamin L. Ebert, Michael A. Gillette, Amanda Paulovich, et al. 2005. “Gene Set Enrichment Analysis: A Knowledge-Based Approach for Interpreting Genome-Wide Expression Profiles.” Proceedings of the National Academy of Sciences 102 (43): 15545–50. https://doi.org/10.1073/pnas.0506580102.

Wijesooriya, Kaumadi, Sameer A. Jadaan, Kaushalya L. Perera, Tanuveer Kaur, and Mark Ziemann. 2022. “Urgent Need for Consistent Standards in Functional Enrichment Analysis.” Edited by Melissa L. Kemp. PLOS Computational Biology 18 (3): e1009935. https://doi.org/10.1371/journal.pcbi.1009935.

LS0tCnRpdGxlOiA+CiAgVGhlIGBFTU1BYCBVc2VyJ3MgR3VpZGUgLSBFbnJpY2htZW50IE1ldGhvZCBNQXR0ZXJzCmF1dGhvcjoKLSBuYW1lOiBOYWpsYSBBYmFzc2kKICBhZmZpbGlhdGlvbjogCiAgLSBJbnN0aXR1dGUgb2YgTWVkaWNhbCBCaW9zdGF0aXN0aWNzLCBFcGlkZW1pb2xvZ3kgYW5kIEluZm9ybWF0aWNzIChJTUJFSSksIE1haW56CiAgZW1haWw6IGFiYXNzaW5hQHVuaS1tYWluei5kZQotIG5hbWU6IEFubmVrYXRocmluIE5lZHdlZAogIGFmZmlsaWF0aW9uOiAKICAtIEluc3RpdHV0ZSBvZiBNZWRpY2FsIEJpb3N0YXRpc3RpY3MsIEVwaWRlbWlvbG9neSBhbmQgSW5mb3JtYXRpY3MgKElNQkVJKSwgTWFpbnoKICBlbWFpbDogYW5uZWx1ZHRAdW5pLW1haW56LmRlCi0gbmFtZTogRmVkZXJpY28gTWFyaW5pCiAgYWZmaWxpYXRpb246IAogIC0gSW5zdGl0dXRlIG9mIE1lZGljYWwgQmlvc3RhdGlzdGljcywgRXBpZGVtaW9sb2d5IGFuZCBJbmZvcm1hdGljcyAoSU1CRUkpLCBNYWluegogIC0gUmVzZWFyY2ggQ2VudGVyIGZvciBJbW11bm90aGVyYXB5IChGWkkpLCBNYWluegogIGVtYWlsOiBtYXJpbmlmQHVuaS1tYWluei5kZQpkYXRlOiAiYHIgQmlvY1N0eWxlOjpkb2NfZGF0ZSgpYCIKcGFja2FnZTogImByIEJpb2NTdHlsZTo6cGtnX3ZlcignRU1NQScpYCIKb3V0cHV0OiAKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKdmlnbmV0dGU6ID4KICAlXFZpZ25ldHRlSW5kZXhFbnRyeXtFTU1BfQogICVcVmlnbmV0dGVFbmNvZGluZ3tVVEYtOH0gIAogICVcVmlnbmV0dGVQYWNrYWdle0VNTUF9CiAgJVxWaWduZXR0ZUtleXdvcmRze1BhdGh3YXlzLCBHZW5lU2V0RW5yaWNobWVudCwgQW5ub3RhdGlvbiwgUmVwcm9kdWNpYmxlUmVzZWFyY2gsIFRyYW5zY3JpcHRvbWljc30KICAlXFZpZ25ldHRlRW5naW5le2tuaXRyOjpybWFya2Rvd259CmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQpiaWJsaW9ncmFwaHk6IEVNTUFfYmlibGlvZ3JhcGh5LmJpYgotLS0KCgpgYGB7ciBrbml0ciwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgY29tbWVudCAgID0gIiM+IiwKICBlcnJvciAgICAgPSBGQUxTRSwKICB3YXJuaW5nICAgPSBGQUxTRSwKICBldmFsICAgICAgPSBUUlVFLAogIG1lc3NhZ2UgICA9IEZBTFNFCikKYGBgCgojIEludHJvZHVjdGlvbiB7I2ludHJvZHVjdGlvbn0KCkZ1bmN0aW9uYWwgRW5yaWNobWVudCBBbmFseXNpcyAoRkVBKSBpcyBhIGtleSBkb3duc3RyZWFtIHN0ZXAgaW4gb21pY3Mgd29ya2Zsb3dzLApjb21tb25seSBhcHBsaWVkIGFmdGVyIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzIHRvIHN1cHBvcnQgYmlvbG9naWNhbAppbnRlcnByZXRhdGlvbiBhbmQgZ2VuZXJhdGUgcGF0aHdheS1sZXZlbCBoeXBvdGhlc2VzLiBBIHdpZGUgcmFuZ2Ugb2YgdG9vbHMgYW5kCm1ldGhvZHMgYXJlIGF2YWlsYWJsZSwgbWFpbmx5IE92ZXItUmVwcmVzZW50YXRpb24gQW5hbHlzaXMgKE9SQSkgW0BLaGF0cmkyMDEyXSAKYW5kIEdlbmUgU2V0IEVucmljaG1lbnQgQW5hbHlzaXMgKEdTRUEpIFtAU3VicmFtYW5pYW4yMDA1XSwgbGVhZGluZwp0byBzdWJzdGFudGlhbCBoZXRlcm9nZW5laXR5IGluIGFuYWx5dGljYWwgY2hvaWNlcyBhbmQgcmVwb3J0ZWQgcmVzdWx0cy4KCkRlc3BpdGUgaXRzIHdpZGVzcHJlYWQgdXNlLCBGRUEgaXMgb2Z0ZW4gaW5zdWZmaWNpZW50bHkgZG9jdW1lbnRlZCBbQFdpamVzb29yaXlhMjAyMl0uCkNyaXRpY2FsIHBhcmFtZXRlcnMgc3VjaCBhcyBiYWNrZ3JvdW5kIGdlbmUgc2V0cyBvciBtdWx0aXBsZSB0ZXN0aW5nIGNvcnJlY3Rpb24KbWV0aG9kcyBhcmUgZnJlcXVlbnRseSBtaXNzaW5nIG9yIGluY29uc2lzdGVudGx5IHJlcG9ydGVkIGluIHNjaWVudGlmaWMgcGFwZXJzLApsaW1pdGluZyByZXByb2R1Y2liaWxpdHkgYW5kIGludGVycHJldGFiaWxpdHkuIEN1cnJlbnRseSwgbm8gc3RhbmRhcmRpemVkIGZyYW1ld29yawpleGlzdHMgdG8gZW5zdXJlIHRyYW5zcGFyZW50IGFuZCByZXByb2R1Y2libGUgZG9jdW1lbnRhdGlvbiBvZiBGRUEgd29ya2Zsb3dzLApjb21wYXJhYmxlIHRvIHRoZSBNSUFNRSBndWlkZWxpbmVzIFtAQnJhem1hMjAwMV0uCgpTaW1pbGFyIGFwcHJvYWNoZXMgaGF2ZSBiZWVuIGRldmVsb3BlZCBvdXRzaWRlIHRoZSBCaW9jb25kdWN0b3IgZWNvc3lzdGVtIHRvCmltcHJvdmUgdHJhbnNwYXJlbmN5IGFuZCByZXByb2R1Y2liaWxpdHkgaW4gb3RoZXIgYW5hbHl0aWNhbCBjb250ZXh0cy4KRm9yIGV4YW1wbGUsIGB0aWR5bG9nYCByZWNvcmRzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIHdpdGggYGRwbHlyYCBhbmQgYHRpZHlyYCwKd2hpbGUgW2BvbWljc2xvZ2BdKGh0dHBzOi8vZ2l0aHViLmNvbS90aWR5b21pY3Mvb21pY3Nsb2cpIHRyYWNrcyB0cmFuc2Zvcm1hdGlvbnMKYXBwbGllZCB0byBvbWljcy1vcmllbnRlZCBvYmplY3RzLgpIb3dldmVyLCBubyB0b29sIHNwZWNpZmljYWxseSBhZGRyZXNzZXMgdGhlIG1ldGFkYXRhIGFuZCBwcm92ZW5hbmNlIHJlcXVpcmVtZW50cwpvZiBGRUEgd29ya2Zsb3dzLgoKVG8gYWRkcmVzcyB0aGlzIGdhcCwgd2UgaW50cm9kdWNlIGByIEJpb2NTdHlsZTo6QmlvY3BrZygiRU1NQSIpYCAoc3RhbmRpbmcgZm9yIAoqKkUqKm5yaWNobWVudCAqKk0qKmV0aG9kcyAqKk1BKip0dGVycyksIGEgZnJhbWV3b3JrIHRoYXQgYXV0b21hdGljYWxseSBjYXB0dXJlcyBrZXkgCmFuYWx5dGljYWwgcGFyYW1ldGVycyBhbmQgcHJvdmVuYW5jZSBpbmZvcm1hdGlvbgpkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBGRUEgbWV0aG9kcy4KClRoaXMgdmlnbmV0dGUgZGVtb25zdHJhdGVzIGhvdyBgRU1NQWAgaW50ZWdyYXRlcyB3aXRoIGV4aXN0aW5nIHRvb2xzCihlLmcuIGByIEJpb2NTdHlsZTo6QmlvY3BrZygiY2x1c3RlclByb2ZpbGVyIilgLApgciBCaW9jU3R5bGU6OkJpb2Nwa2coInRvcEdPIilgLCBgciBCaW9jU3R5bGU6OkJpb2Nwa2coIkVucmljaHIiKWAsIApgciBCaW9jU3R5bGU6OkJpb2Nwa2coImdwcm9maWxlcjIiKWApIHRvIGV4ZWN1dGUgZW5yaWNobWVudAphbmFseXNlcyB3aGlsZSBzeXN0ZW1hdGljYWxseSBjYXB0dXJpbmcgYW5hbHlzaXMgcGFyYW1ldGVycyBhbmQgcHJvdmVuYW5jZQppbmZvcm1hdGlvbiBkdXJpbmcgcnVudGltZSwgcmV0dXJuaW5nIGVucmljaG1lbnQgcmVzdWx0cwoqKndpdGhvdXQgYWx0ZXJpbmcgdGhlaXIgb3JpZ2luYWwgZm9ybWF0KiosIGFsb25nc2lkZSBzdHJ1Y3R1cmVkIGFuZCByZXVzYWJsZSBtZXRhZGF0YS4gCgojIyBXaGF0IGRvIHlvdSBnZXQgd2l0aCBgRU1NQWA/CgpVc2luZyBgRU1NQWAgYWxsb3dzIHlvdSB0bzoKCiogUmVjb3JkIHRoZSBleGFjdCBmdW5jdGlvbiBjYWxsIGFuZCBwYXJhbWV0ZXJzIHVzZWQgZm9yIEZFQQoqIEF1dG9tYXRpY2FsbHkgdHJhY2sgYW5ub3RhdGlvbiBzb3VyY2VzIChlLmcuIG9yZ2FuaXNtLCBnZW5lIHNldCBkYXRhYmFzZSkKKiBSZXRhaW4gcHJvdmVuYW5jZSBkaXJlY3RseSB3aXRoaW4gdGhlIHJlc3VsdHMgb2JqZWN0CiogR2VuZXJhdGUgcmVwcm9kdWNpYmxlIHN1bW1hcmllcyBvZiB0aGUgYW5hbHlzaXMgKGUuZy4gTWV0aG9kcyBzZWN0aW9ucykKKiBGYWNpbGl0YXRlIHNoYXJpbmcgb2YgcmVzdWx0cyB0b2dldGhlciB3aXRoIHRoZWlyIGFuYWx5c2lzIGNvbnRleHQKCiMjIEhvdyBkb2VzIGBFTU1BYCB3b3JrPwoKYEVNTUFgIHdvcmtzIGJ5IHdyYXBwaW5nIGFuIGVucmljaG1lbnQgY2FsbCwgZXhlY3V0aW5nIGl0LCBhbmQgY2FwdHVyaW5nIHJlbGV2YW50CnByb3ZlbmFuY2UgaW5mb3JtYXRpb24gYW5kIHBhcmFtZXRlcnMgZHVyaW5nIHJ1bnRpbWUuIFRoZSByZWNvcmRlZCBtZXRhZGF0YSBpcyB0aGVuCmF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSByZXN1bHQgb2JqZWN0IHVzaW5nIFLigJlzICoqYXR0cmlidXRlIHN5c3RlbSoqLgoKVGhpcyBhcHByb2FjaCBlbmFibGVzIGBFTU1BYCB0byBwcmVzZXJ2ZSBwcm92ZW5hbmNlIGluZm9ybWF0aW9uCioqd2l0aG91dCBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIHJlc3VsdCBzdHJ1Y3R1cmUgb3IgaW50cm9kdWNpbmcgbmV3IGNsYXNzZXMqKiwgCmFsbG93aW5nIHVzZXJzIHRvIGNvbnRpbnVlIHdvcmtpbmcgc2VhbWxlc3NseSB3aXRoIHN0YW5kYXJkIG91dHB1dHMgZnJvbSBleGlzdGluZyB0b29scy4KCldoaWxlIEJpb2NvbmR1Y3RvciBwcm92aWRlcyBkZWRpY2F0ZWQgbWV0YWRhdGEgc2xvdHMgZm9yIGNlcnRhaW4gUzQgY2xhc3NlcwooZS5nLiB2aWEgYG1ldGFkYXRhKClgKSwgdGhlc2UgYXJlIG5vdCBjb25zaXN0ZW50bHkgYXZhaWxhYmxlIGFjcm9zcyBhbGwgZW5yaWNobWVudApyZXN1bHQgdHlwZXMuIEJ5IHJlbHlpbmcgb24gYXR0cmlidXRlcywgcHJvdmVuYW5jZSBpbmZvcm1hdGlvbiBjYW4gYmUgYXR0YWNoZWQKdG8gYW55IHJlc3VsdCBvYmplY3QgcmVnYXJkbGVzcyBvZiBpdHMgdW5kZXJseWluZyBjbGFzcy4KCiFbXShFTU1BX3dvcmtmbG93LnBuZykKCiMgSW5zdGFsbGF0aW9uIHsjaW5zdGFsbGF0aW9ufQoKVG8gaW5zdGFsbCB0aGlzIHBhY2thZ2UsIHN0YXJ0IFIgYW5kIGVudGVyOgoKYGBge3IgaW5zdGFsbCwgZXZhbCA9IEZBTFNFfQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoIkJpb2NNYW5hZ2VyIiwgcXVpZXRseSA9IFRSVUUpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygiQmlvY01hbmFnZXIiKX0KCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJFTU1BIikKYGBgCgpPbmNlIGluc3RhbGxlZCwgdGhlIHBhY2thZ2UgY2FuIGJlIGxvYWRlZCBhbmQgYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnQgd29ya3NwYWNlCmFzIGZvbGxvd3M6CgpgYGB7ciBzZXR1cH0KbGlicmFyeSgiRU1NQSIpCmBgYAoKIyBVc2FnZSBleGFtcGxlIG9mIGBFTU1BYDogdGhlIGBtYWNyb3BoYWdlYCBkYXRhc2V0CgojIyBBYm91dCB0aGUgZGF0YQoKSW4gdGhlIHJlbWFpbmRlciBvZiB0aGlzIHZpZ25ldHRlLCB3ZSB3aWxsIGlsbHVzdHJhdGUgdGhlIG1haW4gZmVhdHVyZXMgb2YgYHIgQmlvY1N0eWxlOjpCaW9jcGtnKCJFTU1BIilgIG9uIGEgcHVibGljbHkgYXZhaWxhYmxlIGRhdGFzZXQgZnJvbQpBbGFzb28sIGV0IGFsLiAiU2hhcmVkIGdlbmV0aWMgZWZmZWN0cyBvbiBjaHJvbWF0aW4gYW5kIGdlbmUgZXhwcmVzc2lvbgppbmRpY2F0ZSBhIHJvbGUgZm9yIGVuaGFuY2VyIHByaW1pbmcgaW4gaW1tdW5lIHJlc3BvbnNlIiwgCnB1Ymxpc2hlZCBpbiBOYXR1cmUgR2VuZXRpY3MsIEphbnVhcnkgMjAxOCAKW0BBbGFzb28yMDE4XS4KClRoZSBkYXRhIGlzIG1hZGUgYXZhaWxhYmxlIHZpYSB0aGUgYHIgQmlvY1N0eWxlOjpCaW9jcGtnKCJtYWNyb3BoYWdlIilgCkJpb2NvbmR1Y3RvciBwYWNrYWdlLCB3aGljaCBjb250YWlucyB0aGUgZmlsZXMgb3V0cHV0IGZyb20gdGhlIFNhbG1vbgpxdWFudGlmaWNhdGlvbiAodmVyc2lvbiAwLjEyLjAsIHdpdGggR0VOQ09ERSB2MjkgcmVmZXJlbmNlKSwgYXMgd2VsbCBhcyB0aGUKdmFsdWVzIHN1bW1hcml6ZWQgYXQgdGhlIGdlbmUgbGV2ZWwsIHdoaWNoIHdlIHdpbGwgdXNlIHRvIGV4ZW1wbGlmeS4KCkluIHRoZSBgbWFjcm9waGFnZWAgZXhwZXJpbWVudGFsIHNldHRpbmcsIHRoZSBzYW1wbGVzIGFyZSBhdmFpbGFibGUgZnJvbSA2CmRpZmZlcmVudCBkb25vcnMsIGluIDQgZGlmZmVyZW50IGNvbmRpdGlvbnMgKG5haXZlLCB0cmVhdGVkIHdpdGggSW50ZXJmZXJvbgpnYW1tYSwgd2l0aCBTTDEzNDQsIG9yIHdpdGggYSBjb21iaW5hdGlvbiBvZiBJbnRlcmZlcm9uIGdhbW1hIGFuZCBTTDEzNDQpLgoKTGV0J3Mgc3RhcnQgYnkgbG9hZGluZyBhbGwgdGhlIG5lY2Vzc2FyeSBwYWNrYWdlczoKCmBgYHtyIGxvYWRsaWJyYXJpZXN9CmxpYnJhcnkoIkVNTUEiKQoKbGlicmFyeSgibWFjcm9waGFnZSIpCmxpYnJhcnkoIkRFU2VxMiIpCmxpYnJhcnkoIm9yZy5Icy5lZy5kYiIpCmxpYnJhcnkoImNsdXN0ZXJQcm9maWxlciIpCmxpYnJhcnkoIm1vc2RlZiIpCmxpYnJhcnkoInRvcEdPIikKbGlicmFyeSgiR08uZGIiKQpgYGAKCldlIHdpbGwgc2hvdyBhbiBleGFtcGxlIG9mIGhvdyAgYHIgQmlvY1N0eWxlOjpCaW9jcGtnKCJFTU1BIilgIGZpdHMgaW50byBhCnJlZ3VsYXIgYnVsayBSTkEtc2VxIGRhdGEgYW5hbHlzaXMgd29ya2Zsb3cuCgojIyBHZXR0aW5nIGEgbGlzdCBvZiBEaWZmZXJlbnRpYWxseSBFeHByZXNzZWQgR2VuZXMKCkZvciB0aGlzLCB3ZSB3aWxsIGxvYWQgdGhlIGBtYWNyb3BoYWdlYCBkYXRhIGFuZCBwZXJmb3JtIERpZmZlcmVudGlhbCBFeHByZXNzaW9uCkFuYWx5c2lzIHdpdGggYHIgQmlvY1N0eWxlOjpCaW9jcGtnKCJERVNlcTIiKWAKCmBgYHtyIGRpZmZlcmVudGlhbF9leHByZXNzaW9ufQojIGxvYWQgZGF0YQpkYXRhKGdzZSwgcGFja2FnZSA9ICJtYWNyb3BoYWdlIikKIyBzZXQgdXAgZGVzaWduCmRkc19tYWNyb3BoYWdlIDwtIERFU2VxRGF0YVNldChnc2UsIGRlc2lnbiA9IH4gbGluZSArIGNvbmRpdGlvbikKIyBwcmVwcm9jZXNzCnJvd25hbWVzKGRkc19tYWNyb3BoYWdlKSA8LSBzdWJzdHIocm93bmFtZXMoZGRzX21hY3JvcGhhZ2UpLCAxLCAxNSkKa2VlcCA8LSByb3dTdW1zKGNvdW50cyhkZHNfbWFjcm9waGFnZSkgPj0gMTApID49IDYKZGRzX21hY3JvcGhhZ2UgPC0gZGRzX21hY3JvcGhhZ2Vba2VlcCwgXQoKIyBzZXQgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5CnNldC5zZWVkKDI3MTEpCiMgc2FtcGxlIHJhbmRvbWx5IGZvciAyayBnZW5lcwpzZWxlY3RlZF9nZW5lcyA8LSBzYW1wbGUocm93bmFtZXMoZGRzX21hY3JvcGhhZ2UpLCAyMDAwKQoKZGRzX21hY3JvcGhhZ2UgPC0gZGRzX21hY3JvcGhhZ2Vbc2VsZWN0ZWRfZ2VuZXMsIF0KCiMgcnVuIERFU2VxCmRkc19tYWNyb3BoYWdlIDwtIERFU2VxKGRkc19tYWNyb3BoYWdlKQoKIyBnZXQgZGUgcmVzIGZvciAxc3QgY29udHJhc3QKSUZOZ192c19uYWl2ZSA8LSByZXN1bHRzKGRkc19tYWNyb3BoYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhc3QgPSBjKCJjb25kaXRpb24iLCAiSUZOZyIsICJuYWl2ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGZjVGhyZXNob2xkID0gMSwgYWxwaGEgPSAwLjA1KQpJRk5nX3ZzX25haXZlIDwtIGxmY1NocmluayhkZHNfbWFjcm9waGFnZSwgY29lZiA9ICJjb25kaXRpb25fSUZOZ192c19uYWl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IElGTmdfdnNfbmFpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiYXBlZ2xtIikKSUZOZ192c19uYWl2ZSRTWU1CT0wgPC0gcm93RGF0YShkZHNfbWFjcm9waGFnZSkkU1lNQk9MCgojIGdldCBkZSByZXMgZm9yIDJzdCBjb250cmFzdApTTDEzNDRfdnNfbmFpdmUgPC0gcmVzdWx0cyhkZHNfbWFjcm9waGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0ID0gYygiY29uZGl0aW9uIiwgIlNMMTM0NCIsICJuYWl2ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGZjVGhyZXNob2xkID0gMSwgYWxwaGEgPSAwLjA1KQpTTDEzNDRfdnNfbmFpdmUgPC0gbGZjU2hyaW5rKGRkc19tYWNyb3BoYWdlLCBjb2VmID0gImNvbmRpdGlvbl9TTDEzNDRfdnNfbmFpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBTTDEzNDRfdnNfbmFpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiYXBlZ2xtIikKU0wxMzQ0X3ZzX25haXZlJFNZTUJPTCA8LSByb3dEYXRhKGRkc19tYWNyb3BoYWdlKSRTWU1CT0wKCiMgc29ydCBieSBhZGp1c3RlZCBwIHZhbHVlCmRlX2xpc3QgPC0gbGlzdCgKICBJRk5nX3ZzX25haXZlID0gSUZOZ192c19uYWl2ZSwKICBTTDEzNDRfdnNfbmFpdmUgPSBTTDEzNDRfdnNfbmFpdmUKKQoKZGVfbGlzdCA8LSBsYXBwbHkoZGVfbGlzdCwgZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkZltvcmRlcihkZiRwYWRqKSwgXQogIGRmIDwtIGRmWyFpcy5uYShkZiRwYWRqKSAmIGRmJHBhZGogPD0gMC4wNSwgXQogIGRmCn0pCiMgc2V0IGJhY2tncm91bmQgZ2VuZSBsaXN0CmdlbmVfdW5pdmVyc2UgPC0gcm93bmFtZXMoZGRzX21hY3JvcGhhZ2UpCmBgYAoKIyMgUGVyZm9ybWluZyBGdW5jdGlvbmFsIEVucmljaG1lbnQgQW5hbHlzaXMgKEZFQSkgCgpOb3cgdGhhdCB3ZSBoYXZlIGEgbGlzdCBvZiBERSBnZW5lcyBmb3IgdGhpcyBjb250cmFzdCwgd2UgY2FuIHBlcmZvcm0gRnVuY3Rpb25hbApFbnJpY2htZW50IEFuYWx5c2lzLiAgCldlIGRvIHRoaXMgZmlyc3QgKndpdGhvdXQqIHRoZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IGBFTU1BYC4KCkluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2Ugd2lsbCB1c2UgdGhlCmZ1bmN0aW9uIGBlbnJpY2hHTygpYCBmcm9tIGByIEJpb2NTdHlsZTo6QmlvY3BrZygiY2x1c3RlclByb2ZpbGVyIilgCgpgYGB7ciB3aXRob3V0ZW1tYX0KZGVfcmVzIDwtIGRlX2xpc3QkSUZOZ192c19uYWl2ZQoKZmVhX3JlcyA8LSBlbnJpY2hHTyhnZW5lID0gcm93bmFtZXMoZGVfcmVzKSwKICAgICAgICAgICAgICAgICAgICB1bml2ZXJzZSA9IGdlbmVfdW5pdmVyc2UsCiAgICAgICAgICAgICAgICAgICAga2V5VHlwZSA9ICJFTlNFTUJMIiwKICAgICAgICAgICAgICAgICAgICBPcmdEYiA9IG9yZy5Icy5lZy5kYiwKICAgICAgICAgICAgICAgICAgICBvbnQgPSAiQlAiLAogICAgICAgICAgICAgICAgICAgIHBBZGp1c3RNZXRob2QgPSAiQkgiLAogICAgICAgICAgICAgICAgICAgIHB2YWx1ZUN1dG9mZiA9IDAuMDUsCiAgICAgICAgICAgICAgICAgICAgcXZhbHVlQ3V0b2ZmID0gMC4xKQpgYGAKCiMgRW50ZXJpbmcgdGhlIGBFTU1BYCBmcmFtZXdvcmsKCkZyb20gbm93IG9uLCB3ZSB3aWxsIGNvbXBsZW1lbnQgdGhlIGV4aXN0aW5nIHdvcmtmbG93IHdpdGggdGhlIGZ1bmN0aW9uYWxpdHkgCnByb3ZpZGVkIGJ5IGBFTU1BYC4KCgojIyBgRU1NQV9ydW4oKWA6IENhcHR1cmluZyB0aGUgcmVjb3JkZWQgaW5mb3JtYXRpb24KCmBFTU1BX3J1bigpYCBhY2NlcHRzIGEgZnVuY3Rpb24gY2FsbCAoZS5nLiBgZW5yaWNoR08oLi4uKWApIGFuZCBleGVjdXRlcyBpdCBhcwppdCBpcywgd2hpbGUgY2FwdHVyaW5nIHRoZSBhc3NvY2lhdGVkIHBhcmFtZXRlcnMgYW5kIHByb3ZlbmFuY2UgaW5mb3JtYXRpb246CgpgYGB7ciBFTU1BX3J1bl8xfQojIHBlcmZvcm0gRkVBLCBidXQgd2l0aCBFTU1BIQpmZWFfcmVzIDwtIGVucmljaEdPKGdlbmUgPSByb3duYW1lcyhkZV9yZXMpLAogICAgICAgICAgICAgICAgICAgIHVuaXZlcnNlID0gZ2VuZV91bml2ZXJzZSwKICAgICAgICAgICAgICAgICAgICBrZXlUeXBlID0gIkVOU0VNQkwiLAogICAgICAgICAgICAgICAgICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLAogICAgICAgICAgICAgICAgICAgIG9udCA9ICJCUCIsCiAgICAgICAgICAgICAgICAgICAgcEFkanVzdE1ldGhvZCA9ICJCSCIsCiAgICAgICAgICAgICAgICAgICAgcHZhbHVlQ3V0b2ZmID0gMC4wNSwKICAgICAgICAgICAgICAgICAgICBxdmFsdWVDdXRvZmYgPSAwLjEpIHw+IAogIEVNTUFfcnVuKCkgIyBzaW1wbHkgcGlwZSB5b3VyIGNhbGwgdG8gRU1NQV9ydW4oKQojIGNoZWNrIHJlcwpmZWFfcmVzCmBgYAoKLi4uIG9yIHlvdSBjYW4gc2ltcGx5IHdyYXAgYEVNTUFfcnVuKClgIGFyb3VuZCB5b3VyIGNhbGw6CgpgYGB7ciBFTU1BX3J1bl8yfQojIHlvdSBjYW4gYWxzbyBwYXNzIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCBpdHMgbmFtZXNwYWNlCiMgZS5nLiBgY2x1c3RlclByb2ZpbGVyOjplbnJpY2hHTyguLi4pYApmZWFfcmVzX25vYmcgPC0gRU1NQV9ydW4oCiAgY2x1c3RlclByb2ZpbGVyOjplbnJpY2hHTygKICAgICMgbm8gdW5pdmVyc2Ugc2V0CiAgICBnZW5lID0gcm93bmFtZXMoZGVfcmVzKSwKICAgIGtleVR5cGUgPSAiRU5TRU1CTCIsCiAgICBPcmdEYiA9IG9yZy5Icy5lZy5kYiwKICAgIG9udCA9ICJCUCIsCiAgICBwQWRqdXN0TWV0aG9kID0gIkJIIiwKICAgIHB2YWx1ZUN1dG9mZiA9IDAuMDUsCiAgICBxdmFsdWVDdXRvZmYgPSAwLjEsCiAgICByZWFkYWJsZSA9IFRSVUUKICApCikKYGBgCgpBcyB5b3UgY2FuIHNlZSwgYEVNTUFgIHJldHVybnMgdGhlIEZFQSByZXN1bHRzIGluIHRoZWlyICoqbmF0aXZlL3N0YW5kYXJkKiogZm9ybWF0LgpgRU1NQWAgYWxzbyB3YXJucyB5b3UgYWJvdXQgZ29vZCBwcmFjdGljZXMgd2hlbiBwZXJmb3JtaW5nIEZFQSwgbGlrZSBpbiB0aGlzCmV4YW1wbGUsIHdlIGRpZG4ndCBkZWZpbmUgYSBsaXN0IG9mIGJhY2tncm91bmQgZ2VuZXMgKHdoaWNoIGNhbiBpbmZsdWVuY2UgdGhlIApyZXN1bHRzIGxlYWRpbmcgZS5nLiB0byBhIGxhcmdlciBhbW91bnQgb2YgZmFsc2UgZGlzY292ZXJpZXMsIGFzIGEgY29uc2VxdWVuY2UgCm9mIG92ZXItb3B0aW1pc3RpYyBzbWFsbGVyIHAtdmFsdWVzIFtAV2lqZXNvb3JpeWEyMDIyXSksIHNvIHdlIGdldCB3YXJuZWQgYWJvdXQgdGhhdC4KCiMjIGBFTU1BX3Nob3coKWA6IFN1bW1hcml6aW5nIHRoZSByZWNvcmRlZCBpbmZvcm1hdGlvbgoKVG8gZ2V0IGEgcXVpY2sgc3VtbWFyeSBvZiB3aGF0IGBFTU1BYCBjYXB0dXJlZCB3aGlsZSB3ZSByYW4gdGhlIGFuYWx5c2lzLCB3ZSB1c2UKYEVNTUFfc2hvdygpYDoKCmBgYHtyIEVNTUFfc2hvd30KRU1NQV9zaG93KGZlYV9yZXMpCmBgYAoKYEVNTUFgIGF0dGFjaGVzIHRoZSBjYXB0dXJlZCBtZXRhZGF0YSB0byB0aGUgYXR0cmlidXRlcyBvZiB0aGUKcmVzdWx0cyBvYmplY3QuIFRoYXQncyB3aHkgaXQgaXMgYWx3YXlzIGEgZ29vZCBwcmFjdGljZSB0byBzYXZlIHRoZSBvcmlnaW5hbApyZXN1bHRzLCBhbmQgbm90IG9ubHkgdGhlIHN1YnNldHMgb2YgaW50ZXJlc3QuCgojIyBgRU1NQV9nZXRfcmVjb3JkKClgOiBSZXRyaWV2aW5nIHRoZSByZWNvcmRlZCBpbmZvcm1hdGlvbgoKVG8gYWNjZXNzIHRoZSBmdWxsIHJlY29yZGVkIGluZm9ybWF0aW9uLCB3ZSB1c2UgYEVNTUFfZ2V0X3JlY29yZCgpYDoKCmBgYHtjc3N9Ci8qfCBlY2hvOiBmYWxzZSAqLwoKLnNjcm9sbG91dCB7Cm1heC1oZWlnaHQ6IDUwMHB4OwpvdmVyZmxvdy15OiBzY3JvbGw7Cn0KYGBgCgpgYGB7ciBFTU1BX2dldF9yZWNvcmR9CiN8IGNsYXNzLW91dHB1dDogc2Nyb2xsb3V0CgplbW1hX3JlY29yZCA8LSBFTU1BX2dldF9yZWNvcmQoZmVhX3JlcykKCiMgZ2V0IGFsbCB0aGUgcmVjb3JkCmVtbWFfcmVjb3JkCmBgYAoKYEVNTUFgIHN0cnVjdHVyZXMgdGhlIGBFTU1BX3JlY29yZGAgYXR0cmlidXRlIChpLmUuIHRoZSByZWNvcmRlZCBwcm92ZW5hbmNlCmluZm9ybWF0aW9uKSBpbnRvIGEgbGlzdCBvZiBlbGVtZW50czoKCmBgYHtiYXNoIEVNTUFfcmVjb3JkX3N0ciwgZXZhbD1GQUxTRX0K4pSc4pSA4pSAIEVNTUFfcmVjb3JkCuKUgiAgIOKUnOKUgOKUgCBtZXRob2QgICAgICAgICAjIGhvdyB0aGUgYW5hbHlzaXMgd2FzIHBlcmZvcm1lZArilIIgICDilIIgICDilJzilIDilIAgY2FsbArilIIgICDilIIgICDilJzilIDilIAgZnVuY3Rpb25fbmFtZQrilIIgICDilIIgICDilJzilIDilIAgcGFja2FnZV9uYW1lCuKUgiAgIOKUgiAgIOKUnOKUgOKUgCBwYWNrYWdlX3ZlcnNpb24K4pSCICAg4pSCICAg4pSc4pSA4pSAIHdyYXBwZWRfZnVuY3Rpb24K4pSCICAg4pSCICAg4pSc4pSA4pSAIHdyYXBwZWRfcGFja2FnZQrilIIgICDilIIgICDilJTilIDilIAgd3JhcHBlcgrilIIgICDilJzilIDilIAgaW5wdXQgICAgICAgICAjIGlucHV0cyB1c2VkIGZvciB0aGUgYW5hbHlzaXMK4pSCICAg4pSCICAg4pSU4pSA4pSAIGFyZ3VtZW50cwrilIIgICDilJzilIDilIAgYW5ub3RhdGlvbiAgICAjIGFubm90YXRpb24gY29udGV4dArilIIgICDilIIgICDilJzilIDilIAgb3JnYW5pc20K4pSCICAg4pSCICAg4pSc4pSA4pSAIGdlbmVfc2V0X2RiCuKUgiAgIOKUgiAgIOKUlOKUgOKUgCBnZW5lX3NldF9kYl92ZXJzaW9uCuKUgiAgIOKUnOKUgOKUgCB0aW1lc3RhbXAgICAgICMgd2hlbiB0aGUgYW5hbHlzaXMgd2FzIHJ1bgrilIIgICDilJzilIDilIAgc2Vzc2lvbl9pbmZvICAjIFIgc2Vzc2lvbiBpbmZvcm1hdGlvbgrilIIgICDilJzilIDilIAgZXh0cmEgICAgICAgICAjIHVzZXItZGVmaW5lZCBhZGRpdGlvbnMK4pSCICAg4pSU4pSA4pSAIGVtbWFfdmVyc2lvbgpgYGAKCmBgYHtyIEVNTUFfbWV0aG9kfQojIGdldCB0aGUgbWV0aG9kIHJlY29yZAplbW1hX3JlY29yZCRtZXRob2QKYGBgCgpXaXRoIGBFTU1BX3J1bigpYCwgd2UgY2FuIGRlY2lkZSB3aGV0aGVyIHdlIHdhbnQgdG8gc2F2ZSB0aGUgdmFsdWUgb2YgYXJndW1lbnRzCnVzZWQgaW4gb3VyIGNhbGwgb3Igbm90LiBUaGlzIGNhbiBiZSB1c2VmdWwsIGZvciBleGFtcGxlLCB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5CmluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhlIHJlc3VsdCBvYmplY3QuIEZvciB0aGlzLCB3ZSBjYW4gdXNlIHRoZSBhcmd1bWVudCBgYXJnc19mb3JtYDoKCmBgYHtyIGFyZ3VtZW50X2Zvcm19CiN8IGNsYXNzLW91dHB1dDogc2Nyb2xsb3V0CgpmZWFfcmVzX25vX3BhcmFtIDwtIGVucmljaEdPKGdlbmUgPSByb3duYW1lcyhkZV9yZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNlID0gZ2VuZV91bml2ZXJzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlUeXBlID0gIkVOU0VNQkwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9udCA9ICJCUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkanVzdE1ldGhvZCA9ICJCSCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZhbHVlQ3V0b2ZmID0gMC4wNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdmFsdWVDdXRvZmYgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGFibGUgPSBUUlVFKSB8PiAKICBFTU1BX3J1bihhcmdzX2Zvcm0gPSAidW5ldmFsdWF0ZWQiKSAjIHdoZW4gd2UgZG9uJ3Qgd2FudCB0aGUgdmFsdWVzIHN0b3JlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWxzZSBzZXQgdG8gZXZhbHVhdGVkIChkZWZhdWx0KQoKIyBjaGVjawpFTU1BX2dldF9yZWNvcmQoZmVhX3Jlc19ub19wYXJhbSkKYGBgCgpXZSBjYW4gYWxzbyBjaG9vc2Ugd2hldGhlciB0byBzYXZlIHRoZSBSIHNlc3Npb24gaW5mb3JtYXRpb24gd2l0aCB0aGUgcmVjb3JkCnVzaW5nIHRoZSBhcmd1bWVudCBgc3RvcmVfc2Vzc2lvbl9pbmZvYCwgd2hpY2ggZGVmYXVsdHMgdG8gYFRSVUVgLgoKIyMgYEVNTUFfZXhwbGFpbigpYDogU3VtbWFyaXppbmcgcmVjb3JkZWQgaW5mb3JtYXRpb24gaW50byB0ZXh0CgpgRU1NQV9leHBsYWluKClgIGdlbmVyYXRlcyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBGRUEsIHNpbWlsYXIKdG8gYSBNYXRlcmlhbHMgYW5kIE1ldGhvZHMgc2VjdGlvbiBvZiBhIHBhcGVyLCBieSBzdW1tYXJpemluZyB0aGUgZXhlY3V0ZWQgY2FsbCwKdGhlIHBhcmFtZXRlcnMsIHNvZnR3YXJlIGNvbnRleHQsIGFuZCByZWZlcmVuY2UgZGF0YWJhc2VzIHVzZWQuCgpgYGB7ciBFTU1BX2V4cGxhaW4sIHJlc3VsdHMgPSAnYXNpcycsIG1lc3NhZ2U9VFJVRX0KRU1NQV9leHBsYWluKGZlYV9yZXMsIGdldF9jaXRhdGlvbiA9IFRSVUUpCmBgYAoKIyMgYEVNTUFgIHdpdGggY3VzdG9tL3dyYXBwZXIgZnVuY3Rpb25zCgpZb3UgY2FuIGFsc28gdXNlIGEgY3VzdG9tIGZ1bmN0aW9uIHRoYXQgeW91IGRldmVsb3BlZCwgb3IgYSB3cmFwcGVyIGZ1bmN0aW9uCihmcm9tIHBhY2thZ2VzIHN1Y2ggYXMgYHIgQmlvY1N0eWxlOjpCaW9jcGtnKCJtb3NkZWYiKWApLiBJbiB0aGlzIGNhc2UsCmBFTU1BX3J1bigpYCB3aWxsIGF0dGVtcHQgdG8gY2FwdHVyZSBhcyBtdWNoIG1ldGFkYXRhIGFzIHBvc3NpYmxlOgoKYGBge3IgbW9zZGVmX2VnfQojfCBjbGFzcy1vdXRwdXQ6IHNjcm9sbG91dAoKbW9zZGVmX2ZlYV9yZXMgPC0gbW9zZGVmOjpydW5fZ29zZXEoZGVfZ2VuZXMgPSByb3duYW1lcyhkZV9yZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ19nZW5lcyA9IGdlbmVfdW5pdmVyc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSAib3JnLkhzLmVnLmRiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSAiZW5zR2VuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbm9tZSA9ICJoZzE5IikgfD4gCiAgRU1NQV9ydW4oc3RvcmVfc2Vzc2lvbl9pbmZvID0gRkFMU0UsCiAgICAgICAgICAgYXJnc19mb3JtID0gInVuZXZhbHVhdGVkIikKCiMgcXVpY2sgaW5zcGVjdGlvbgpFTU1BX2dldF9yZWNvcmQobW9zZGVmX2ZlYV9yZXMpCmBgYAoKYGBge3IgY3VzdG9tX2VnfQojfCBjbGFzcy1vdXRwdXQ6IHNjcm9sbG91dAoKIyBhIGN1c3RvbSBmdW5jdGlvbiAobm90IGZyb20gYSBwYWNrYWdlKQpteV9jdXN0b21fZnVuY3Rpb24gPC0gZnVuY3Rpb24oZ2VuZSwgdW5pdmVyc2UgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb250b2xvZ3kgPSAiQlAiLCBpZF90eXBlID0gIkVOVFJFWklEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZ19kYl9uYW1lID0gIm9yZy5Icy5lZy5kYiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc20gPSAiaHNhcGllbnMiKSB7CiAgcmVzMSA8LSBtb3NkZWY6OnJ1bl90b3BHTyhkZV9nZW5lcyA9IGdlbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ19nZW5lcyA9IGdlbmVfdW5pdmVyc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbnRvbG9neSA9IG9udG9sb2d5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pZCA9IGlkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gb3JnX2RiX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZ2VuZV90b190ZXJtcyA9IFRSVUUpCgogIHJlczIgPC0gZ3Byb2ZpbGVyMjo6Z29zdChxdWVyeSA9IGdlbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNtID0gb3JnYW5pc20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbV9iZyA9IGdlbmVfdW5pdmVyc2UpCgogIHJldHVybihsaXN0KHRvcEdPX3JlcyA9IHJlczEsCiAgICAgICAgICAgICAgZ29zdF9yZXMgPSByZXMyCiAgKSkKfQoKIyBydW4gYW5hbHlzaXMgd2l0aCBFTU1BCmZyYW5rZW5zdGVpbl9mZWEgPC0gbXlfY3VzdG9tX2Z1bmN0aW9uKAogIGdlbmUgPSByb3duYW1lcyhkZV9yZXMpLAogIHVuaXZlcnNlID0gZ2VuZV91bml2ZXJzZSwKICBvbnRvbG9neSA9ICJCUCIsCiAgaWRfdHlwZSA9ICJFTlNFTUJMIiwKICBvcmdfZGJfbmFtZSA9ICJvcmcuSHMuZWcuZGIiLAogIG9yZ2FuaXNtID0gImhzYXBpZW5zIgogICkgfD4gRU1NQV9ydW4oc3RvcmVfc2Vzc2lvbl9pbmZvID0gRkFMU0UsCiAgICAgICAgICAgICAgICBhcmdzX2Zvcm0gPSAidW5ldmFsdWF0ZWQiKSAKCiMgcXVpY2sgaW5zcGVjdGlvbgpFTU1BX2dldF9yZWNvcmQoZnJhbmtlbnN0ZWluX2ZlYSkKYGBgCgojIyBgRU1NQV9hZGRfY3VzdG9tX21ldGFkYXRhKClgOiBBZGRpbmcgZXh0cmEgaW5mb3JtYXRpb24KClRoZSB1c2VyIGNhbiBhbHdheXMgYXR0YWNoIGV4dHJhIG1ldGFkYXRhIHRoYXQgYEVNTUFgIG1pZ2h0IG5vdCBiZSBhYmxlIHRvCmNhcHR1cmUgYXV0b21hdGljYWxseS4gVG8ga2VlcCBldmVyeXRoaW5nIG9yZ2FuaXplZCwgd2UgY2FuIHVzZQpgRU1NQV9hZGRfY3VzdG9tX21ldGFkYXRhKClgIGZ1bmN0aW9uCgpgYGB7ciBhZGRfY3VzdG9tX21ldGFkYXRhfQojfCBjbGFzcy1vdXRwdXQ6IHNjcm9sbG91dAoKZnJhbmtlbnN0ZWluX2ZlYTIgPC0gRU1NQV9hZGRfY3VzdG9tX21ldGFkYXRhKHJlcyA9IGZyYW5rZW5zdGVpbl9mZWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYSA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRfZnVuY3Rpb25fdG9wR08gPSAicnVuVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVzID0gImFueSBvdGhlciBtZWFuaW5nZnVsIGluZm8iKSkKCkVNTUFfZ2V0X3JlY29yZChmcmFua2Vuc3RlaW5fZmVhMikkZXh0cmEKYGBgCgpTaW5jZSB0aGUgYEVNTUFfcmVjb3JkYCBpcyBhdHRhY2hlZCBhcyBhdHRyaWJ1dGUgdG8gdGhlIG9yaWdpbmFsIHJlc3VsdHMgb2JqZWN0cywKaXQgY2FuIGJlIHByZXNlcnZlZCB3aGVuIGludGVncmF0aW5nIHJlc3VsdHMgaW50byBzdHJ1Y3R1cmVkIGNvbnRhaW5lcnMKc3VjaCBhcyBgciBCaW9jU3R5bGU6OkJpb2Nwa2coIkRlZURlZUV4cGVyaW1lbnQiKWAgW0BBYmFzc2kyMDI2XS4KVGhpcyBlbmFibGVzIGJvdGggRkVBIHJlc3VsdHMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgcHJvdmVuYW5jZSBpbmZvcm1hdGlvbgp0byBiZSBzdG9yZWQgYW5kIG1hbmFnZWQgdG9nZXRoZXIsIGZhY2lsaXRhdGluZyByZXByb2R1Y2liaWxpdHksIG9yZ2FuaXphdGlvbiwKYW5kIHNoYXJpbmcgb2YgY29tcGxleCBvbWljcyBhbmFseXNlcy4KCmBgYHtyIGVtbWFfYW5kX2RkZX0KI3wgY2xhc3Mtb3V0cHV0OiBzY3JvbGxvdXQKCmRkZSA8LSBEZWVEZWVFeHBlcmltZW50OjpEZWVEZWVFeHBlcmltZW50KHNjZSA9IGRkc19tYWNyb3BoYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZV9yZXN1bHRzID0gSUZOZ192c19uYWl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5yaWNoX3Jlc3VsdHMgPSAgbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRk5nX3ZzX25haXZlID0gZmVhX3Jlc19ub19wYXJhbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKZmVhIDwtIERlZURlZUV4cGVyaW1lbnQ6OmdldEZFQShkZGUsIGZvcm1hdCA9ICJvcmlnaW5hbCIpCgpFTU1BX2dldF9yZWNvcmQoZmVhKQpgYGAKCiMjIGBFTU1BX2ZyZWV6ZSgpYDogUmVjb3JkaW5nIHRoZSBBbmFseXNpcyBFbnZpcm9ubWVudAoKYEVNTUFfZnJlZXplKClgIHJlY29yZHMgdGhlIFIgZW52aXJvbm1lbnQgYXQgdGhlIHRpbWUgb2YgYW5hbHlzaXMgYnkgZ2VuZXJhdGluZwphIGxvY2tmaWxlIHVzaW5nIGByZW52YC4gQnkgZGVmYXVsdCwgdGhlIHNuYXBzaG90IGlzIGNyZWF0ZWQgd2l0aCBgZm9yY2UgPSBUUlVFYCwKYWxsb3dpbmcgdGhlIGVudmlyb25tZW50IHRvIGJlIHJlY29yZGVkIGV2ZW4gd2hlbiBpbmNvbnNpc3RlbmNpZXMgKGUuZy4gdmVyc2lvbgptaXNtYXRjaGVzKSBhcmUgcHJlc2VudC4KClRoaXMgYmVoYXZpb3IgcmVmbGVjdHMgdGhlIGdvYWwgb2YgcHJlc2VydmluZyB0aGUgYW5hbHlzaXMgZW52aXJvbm1lbnQgYXMgaXQgd2FzCnVzZWQgaW4gcHJhY3RpY2UsIHJhdGhlciB0aGFuIGF0dGVtcHRpbmcgdG8gZW5mb3JjZSBhIGZ1bGx5IGNvbnNpc3RlbnQgc3RhdGUuCgpgYGB7ciBFTU1BX2ZyZWV6ZX0KaWYgKHJlcXVpcmVOYW1lc3BhY2UoInJlbnYiLCBxdWlldGx5ID0gVFJVRSkpIHsKICBwcm9qZWN0X3BhdGggPC0gdGVtcGRpcigpCiAgZGlyLmNyZWF0ZShwcm9qZWN0X3BhdGgpCiAgRU1NQV9mcmVlemUocHJvamVjdCA9IHByb2plY3RfcGF0aCwKICAgICAgICAgICAgICBmaWxlID0gImFuYWx5c2lzLmxvY2siLAogICAgICAgICAgICAgIHBrZ3MgPSBsb2FkZWROYW1lc3BhY2VzKCksCiAgICAgICAgICAgICAgcHJvbXB0ID0gRkFMU0UsCiAgICAgICAgICAgICAgZm9yY2UgPSBUUlVFKQp9CmBgYAoKIyMgYEVNTUFgIHdpdGggaXRlcmF0aXZlIHdvcmtmbG93cwoKSW4gcmVhbC13b3JsZCBhbmFseXNlcywgbXVsdGlwbGUgRkVBIHJlc3VsdHMgZnJvbSBkaWZmZXJlbnQgY29udHJhc3RzCmFyZSBvZnRlbiBhbmFseXplZCBpbiBwYXJhbGxlbCBUaGlzIGNhbiBiZSBjb252ZW5pZW50bHkgaGFuZGxlZCB1c2luZwppdGVyYXRpdmUgYXBwcm9hY2hlcyBzdWNoIGFzIGBsYXBwbHkoKWAuCgpgYGB7ciBlbW1hX3dpdGhfbGFwcGx5fQpmZWFfcmVzX2xpc3QgPC0gbGFwcGx5KGRlX2xpc3QsIGZ1bmN0aW9uKGRlYSl7CiAgIyMjIyBwZXJmb3JtIGZlYSB3aXRoIEVNTUFfcnVuICMjIyMKICBlbnJpY2hHTyhnZW5lID0gcm93bmFtZXMoZGVhKSwKICAgICAgICAgICB1bml2ZXJzZSA9IGdlbmVfdW5pdmVyc2UsCiAgICAgICAgICAga2V5VHlwZSA9ICJFTlNFTUJMIiwKICAgICAgICAgICBPcmdEYiA9IG9yZy5Icy5lZy5kYiwKICAgICAgICAgICBvbnQgPSAiQlAiLAogICAgICAgICAgIHBBZGp1c3RNZXRob2QgPSAiQkgiLAogICAgICAgICAgIHB2YWx1ZUN1dG9mZiA9IDAuMDUsCiAgICAgICAgICAgcXZhbHVlQ3V0b2ZmID0gMC4xLAogICAgICAgICAgIHJlYWRhYmxlID0gVFJVRSkgfD4gCiAgICBFTU1BX3J1bigpCn0pCgojIyMjIHByaW50IHRoZSBtZXRhZGF0YSBzdW1tYXJ5IGZvciBlYWNoIGNvbnRyYXN0ICMjIyMKaW52aXNpYmxlKGxhcHBseShuYW1lcyhmZWFfcmVzX2xpc3QpLCBmdW5jdGlvbihubSkgewogIGNhdCgiXG4jIyMiLCBubSkKICBFTU1BX3Nob3coZmVhX3Jlc19saXN0W1tubV1dKQp9KSkKCiMjIyMgYWRkIG1vcmUgaW5mbyB0byB0aGUgbWV0YWRhdGEgIyMjIwpmZWFfcmVzX2xpc3QgPC0gc2V0TmFtZXMobGFwcGx5KG5hbWVzKGZlYV9yZXNfbGlzdCksIGZ1bmN0aW9uKG5tKSB7CiAgRU1NQV9hZGRfY3VzdG9tX21ldGFkYXRhKGZlYV9yZXNfbGlzdFtbbm1dXSwgZXh0cmEgPSBsaXN0KGNvbnRyYXN0X25hbWUgPSBubSkpCiAgfSksIApuYW1lcyhmZWFfcmVzX2xpc3QpKQoKIyMjIyBnZXQgdGhlIHJhdyBtZXRhZGF0YSAjIyMjCnJlY29yZF9saXN0IDwtIGxpc3QoKQoKcmVjb3JkX2xpc3QgPC0gc2V0TmFtZXMobGFwcGx5KG5hbWVzKGZlYV9yZXNfbGlzdCksIGZ1bmN0aW9uKG1uKXsKICBFTU1BX2dldF9yZWNvcmQoZmVhX3Jlc19saXN0W1ttbl1dKQogIH0pLApuYW1lcyhmZWFfcmVzX2xpc3QpKQoKcmVjb3JkX2xpc3QkU0wxMzQ0X3ZzX25haXZlJGV4dHJhCnJlY29yZF9saXN0JFNMMTM0NF92c19uYWl2ZSRtZXRob2QkcGFja2FnZV9uYW1lCmBgYAoKIyBTdXBwb3J0ZWQgbWV0aG9kcyBhbmQgZnV0dXJlIGV4dGVuc2lvbnMKCmBFTU1BYCBjdXJyZW50bHkgcHJvdmlkZXMgbWV0YWRhdGEgY2FwdHVyZSBzdXBwb3J0IGZvciBzZXZlcmFsIGNvbW1vbmx5IHVzZWQKRkVBIHRvb2xzLCBpbmNsdWRpbmcgbWV0aG9kcyBmcm9tIGByIEJpb2NTdHlsZTo6QmlvY3BrZygiY2x1c3RlclByb2ZpbGVyIilgLApgciBCaW9jU3R5bGU6OkJpb2Nwa2coImdwcm9maWxlcjIiKWAsIGFuZCByZWxhdGVkIHdyYXBwZXJzL2N1c3RvbSBmdW5jdGlvbnMKc3VjaCBhcyBgciBCaW9jU3R5bGU6OkJpb2Nwa2coIm1vc2RlZiIpYC4KCmBFTU1BYCBpcyBkZXNpZ25lZCB0byBiZSBleHRlbnNpYmxlLCBhbmQgc3VwcG9ydCBmb3IgYWRkaXRpb25hbCBGRUEgbWV0aG9kcwphbmQgcGFja2FnZXMgd2lsbCBjb250aW51ZSB0byBleHBhbmQgb3ZlciB0aW1lLgoKIyBTZXNzaW9uIGluZm8gey51bm51bWJlcmVkfQoKYGBge2Nzc30KLyp8IGVjaG86IGZhbHNlICovCgouc21hbGxlciB7CiAgZm9udC1zaXplOiAxMHB4Cn0KYGBgCgpgYGB7ciBzZXNzaW9pbmZvfQojfCBjbGFzcy1vdXRwdXQ6IHNtYWxsZXIKCnNlc3Npb25JbmZvKCkKYGBgCgojIFJlZmVyZW5jZXMgey51bm51bWJlcmVkfQo=