1 Annotation version: 20190813

1.1 Genome annotation with OrgDb/TxDb/OrganismDbi

The tritrypdb just released a new version. Let us make new annotation data from it.

## These functions take _forever_ the first time around.
devtools::load_all("~/scratch/git/EuPathDB")

esmer_entry <- get_eupath_entry("Esmeraldo", webservice="tritrypdb")
installedp <- get_eupath_pkgnames(esmer_entry)$orgdb_installed
if (!isTRUE(installedp)) {
  esmer_annot <- EuPathDB::make_eupath_orgdb(esmer_entry, reinstall=TRUE,
                                             overwrite=TRUE)
}

nonesmer_entry <- get_eupath_entry("Non-Esmeraldo-like", webservice="tritrypdb")
installedp <- get_eupath_pkgnames(nonesmer_entry)$orgdb_installed
if (!isTRUE(installedp)) {
  nonesmer_annot <- EuPathDB::make_eupath_orgdb(nonesmer_entry, reinstall=TRUE, overwrite=TRUE)
}

unas_entry <- get_eupath_entry("strain CL Brener", webservice="tritrypdb")
installedp <- get_eupath_pkgnames(unas_entry)$orgdb_installed
if (!isTRUE(installedp)) {
  unas_annot <- EuPathDB::make_eupath_orgdb(unas_entry, reinstall=TRUE, overwrite=TRUE)
}

In order to load these new packages, I rather need to remember their names… Happily I have a function for that.

##library(EuPathDB)
devtools::load_all("~/scratch/git/EuPathDB")
## Loading EuPathDB
## Loading required package: GenomicRanges
## Loading required package: stats4
## Loading required package: S4Vectors
## 
## Attaching package: 'S4Vectors'
## The following object is masked from 'package:base':
## 
##     expand.grid
## Loading required package: IRanges
## Loading required package: GenomeInfoDb
## Loading required package: GenomeInfoDbData
## Loading required package: AnnotationHub
## Loading required package: BiocFileCache
## Loading required package: dbplyr
## 
## Attaching package: 'AnnotationHub'
## The following object is masked from 'package:hpgltools':
## 
##     cache
## The following object is masked from 'package:Biobase':
## 
##     cache
## Adding files missing in collate: post_eupath_snps.R
## 
## This is EuPathDB version 1.5.0
##  Read 'EuPathDB()' to get started.
esmer_entry <- EuPathDB::get_eupath_entry(species="Esmeraldo-like", webservice="tritrypdb")
## Found the following hits: Trypanosoma cruzi CL Brener Esmeraldo-like, Trypanosoma cruzi CL Brener Non-Esmeraldo-like, choosing the first.
## Using: Trypanosoma cruzi CL Brener Esmeraldo-like.
nonesmer_entry <- EuPathDB::get_eupath_entry(species="Brener Non", webservice="tritrypdb")
## Found: Trypanosoma cruzi CL Brener Non-Esmeraldo-like
unas_entry <- EuPathDB::get_eupath_entry(species="CL Brener$", webservice="tritrypdb")
## Found: Trypanosoma cruzi strain CL Brener
esmer_names <- get_eupath_pkgnames(esmer_entry)
esmer_names$orgdb
## org.Tcruzi.CL.Brener.Esmeraldo.like.v44.eg.db
nonesmer_names <- get_eupath_pkgnames(nonesmer_entry)
nonesmer_names$orgdb
## org.Tcruzi.CL.Brener.Non.Esmeraldo.like.v44.eg.db
unas_names <- get_eupath_pkgnames(unas_entry)
unas_names$orgdb
## org.Tcruzi.CL.Brener.v44.eg.db

For those packages I have generated/installed, use this to generate an annotation table. Oh, but I prefixed the column names with ‘annot_’ in order to make sure that nothing is duplicated with the GO tables, ortholog tables, etc.

## Just to save on typing
library(esmer_names$orgdb, character=TRUE)
## Loading required package: AnnotationDbi
## 
## Attaching package: 'AnnotationDbi'
## The following object is masked from 'package:EuPathDB':
## 
##     select
## 
library(nonesmer_names$orgdb, character=TRUE)
## 
library(unas_names$orgdb, character=TRUE)
## 
esmer_db <- get0(esmer_names$orgdb)
esmer_db
## OrgDb object:
## | DBSCHEMAVERSION: 2.1
## | DBSCHEMA: NOSCHEMA_DB
## | ORGANISM: Trypanosoma cruzi
## | SPECIES: Trypanosoma cruzi
## | CENTRALID: GID
## | Taxonomy ID: 5693
## | Db type: OrgDb
## | Supporting package: AnnotationDbi
## 
## Please see: help('select') for usage information
nonesmer_db <- get0(nonesmer_names$orgdb)
nonesmer_db
## OrgDb object:
## | DBSCHEMAVERSION: 2.1
## | DBSCHEMA: NOSCHEMA_DB
## | ORGANISM: Trypanosoma cruzi
## | SPECIES: Trypanosoma cruzi
## | CENTRALID: GID
## | Taxonomy ID: 5693
## | Db type: OrgDb
## | Supporting package: AnnotationDbi
## 
## Please see: help('select') for usage information
unas_db <- get0(unas_names$orgdb)
unas_db
## OrgDb object:
## | DBSCHEMAVERSION: 2.1
## | DBSCHEMA: NOSCHEMA_DB
## | ORGANISM: Trypanosoma cruzi strain CL Brener
## | SPECIES: Trypanosoma cruzi strain CL Brener
## | CENTRALID: GID
## | Taxonomy ID: 353153
## | Db type: OrgDb
## | Supporting package: AnnotationDbi
## 
## Please see: help('select') for usage information

Lets see what columns are available in the annotation packages.

all_fields <- columns(esmer_db)
all_fields
##   [1] "ANNOT_BFD3_CDS"                         
##   [2] "ANNOT_BFD3_MODEL"                       
##   [3] "ANNOT_BFD6_CDS"                         
##   [4] "ANNOT_BFD6_MODEL"                       
##   [5] "ANNOT_CDS"                              
##   [6] "ANNOT_CDS_LENGTH"                       
##   [7] "ANNOT_CHROMOSOME"                       
##   [8] "ANNOT_DIF_CDS"                          
##   [9] "ANNOT_DIF_MODEL"                        
##  [10] "ANNOT_EC_NUMBERS"                       
##  [11] "ANNOT_EC_NUMBERS_DERIVED"               
##  [12] "ANNOT_EXON_COUNT"                       
##  [13] "ANNOT_FC_BFD3_CDS"                      
##  [14] "ANNOT_FC_BFD3_MODEL"                    
##  [15] "ANNOT_FC_BFD6_CDS"                      
##  [16] "ANNOT_FC_BFD6_MODEL"                    
##  [17] "ANNOT_FC_DIF_CDS"                       
##  [18] "ANNOT_FC_DIF_MODEL"                     
##  [19] "ANNOT_FC_PF_CDS"                        
##  [20] "ANNOT_FC_PF_MODEL"                      
##  [21] "ANNOT_FIVE_PRIME_UTR_LENGTH"            
##  [22] "ANNOT_GENE_ENTREZ_ID"                   
##  [23] "ANNOT_GENE_EXON_COUNT"                  
##  [24] "ANNOT_GENE_HTS_NONCODING_SNPS"          
##  [25] "ANNOT_GENE_HTS_NONSYN_SYN_RATIO"        
##  [26] "ANNOT_GENE_HTS_NONSYNONYMOUS_SNPS"      
##  [27] "ANNOT_GENE_HTS_STOP_CODON_SNPS"         
##  [28] "ANNOT_GENE_HTS_SYNONYMOUS_SNPS"         
##  [29] "ANNOT_GENE_LOCATION_TEXT"               
##  [30] "ANNOT_GENE_NAME"                        
##  [31] "ANNOT_GENE_ORTHOLOG_NUMBER"             
##  [32] "ANNOT_GENE_ORTHOMCL_NAME"               
##  [33] "ANNOT_GENE_PARALOG_NUMBER"              
##  [34] "ANNOT_GENE_PREVIOUS_IDS"                
##  [35] "ANNOT_GENE_PRODUCT"                     
##  [36] "ANNOT_GENE_SOURCE_ID"                   
##  [37] "ANNOT_GENE_TOTAL_HTS_SNPS"              
##  [38] "ANNOT_GENE_TRANSCRIPT_COUNT"            
##  [39] "ANNOT_GENE_TYPE"                        
##  [40] "ANNOT_GO_COMPONENT"                     
##  [41] "ANNOT_GO_FUNCTION"                      
##  [42] "ANNOT_GO_ID_COMPONENT"                  
##  [43] "ANNOT_GO_ID_FUNCTION"                   
##  [44] "ANNOT_GO_ID_PROCESS"                    
##  [45] "ANNOT_GO_PROCESS"                       
##  [46] "ANNOT_HAS_MISSING_TRANSCRIPTS"          
##  [47] "ANNOT_INTERPRO_DESCRIPTION"             
##  [48] "ANNOT_INTERPRO_ID"                      
##  [49] "ANNOT_IS_PSEUDO"                        
##  [50] "ANNOT_ISOELECTRIC_POINT"                
##  [51] "ANNOT_LOCATION_TEXT"                    
##  [52] "ANNOT_MATCHED_RESULT"                   
##  [53] "ANNOT_MOLECULAR_WEIGHT"                 
##  [54] "ANNOT_NO_TET_CDS"                       
##  [55] "ANNOT_NO_TET_MODEL"                     
##  [56] "ANNOT_ORGANISM"                         
##  [57] "ANNOT_PF_CDS"                           
##  [58] "ANNOT_PF_MODEL"                         
##  [59] "ANNOT_PFAM_DESCRIPTION"                 
##  [60] "ANNOT_PFAM_ID"                          
##  [61] "ANNOT_PIRSF_DESCRIPTION"                
##  [62] "ANNOT_PIRSF_ID"                         
##  [63] "ANNOT_PREDICTED_GO_COMPONENT"           
##  [64] "ANNOT_PREDICTED_GO_FUNCTION"            
##  [65] "ANNOT_PREDICTED_GO_ID_COMPONENT"        
##  [66] "ANNOT_PREDICTED_GO_ID_FUNCTION"         
##  [67] "ANNOT_PREDICTED_GO_ID_PROCESS"          
##  [68] "ANNOT_PREDICTED_GO_PROCESS"             
##  [69] "ANNOT_PROJECT_ID"                       
##  [70] "ANNOT_PROSITEPROFILES_DESCRIPTION"      
##  [71] "ANNOT_PROSITEPROFILES_ID"               
##  [72] "ANNOT_PROTEIN_LENGTH"                   
##  [73] "ANNOT_PROTEIN_SEQUENCE"                 
##  [74] "ANNOT_SEQUENCE_ID"                      
##  [75] "ANNOT_SIGNALP_PEPTIDE"                  
##  [76] "ANNOT_SIGNALP_SCORES"                   
##  [77] "ANNOT_SMART_DESCRIPTION"                
##  [78] "ANNOT_SMART_ID"                         
##  [79] "ANNOT_SOURCE_ID"                        
##  [80] "ANNOT_STRAND"                           
##  [81] "ANNOT_SUPERFAMILY_DESCRIPTION"          
##  [82] "ANNOT_SUPERFAMILY_ID"                   
##  [83] "ANNOT_THREE_PRIME_UTR_LENGTH"           
##  [84] "ANNOT_TIGRFAM_DESCRIPTION"              
##  [85] "ANNOT_TIGRFAM_ID"                       
##  [86] "ANNOT_TM_COUNT"                         
##  [87] "ANNOT_TRANS_FOUND_PER_GENE_INTERNAL"    
##  [88] "ANNOT_TRANSCRIPT_INDEX_PER_GENE"        
##  [89] "ANNOT_TRANSCRIPT_LENGTH"                
##  [90] "ANNOT_TRANSCRIPT_LINK"                  
##  [91] "ANNOT_TRANSCRIPT_PRODUCT"               
##  [92] "ANNOT_TRANSCRIPT_SEQUENCE"              
##  [93] "ANNOT_TRANSCRIPTS_FOUND_PER_GENE"       
##  [94] "ANNOT_UNIPROT_ID"                       
##  [95] "ANNOT_URI"                              
##  [96] "ANNOT_WDK_WEIGHT"                       
##  [97] "CHR_ID"                                 
##  [98] "GENE_TYPE"                              
##  [99] "GID"                                    
## [100] "GO_EVIDENCE_CODE"                       
## [101] "GO_ID"                                  
## [102] "GO_IS_NOT"                              
## [103] "GO_ONTOLOGY"                            
## [104] "GO_REFERENCE"                           
## [105] "GO_SORT_KEY"                            
## [106] "GO_SOURCE"                              
## [107] "GO_SUPPORT_FOR_EVIDENCE_CODE_ASSIGNMENT"
## [108] "GO_TERM_NAME"                           
## [109] "GO_TRANSCRIPT_ID_S"                     
## [110] "INTERPRO_DESCRIPTION"                   
## [111] "INTERPRO_E_VALUE"                       
## [112] "INTERPRO_END_MIN"                       
## [113] "INTERPRO_ID"                            
## [114] "INTERPRO_NAME"                          
## [115] "INTERPRO_PRIMARY_ID"                    
## [116] "INTERPRO_SECONDARY_ID"                  
## [117] "INTERPRO_START_MIN"                     
## [118] "INTERPRO_TRANSCRIPT_ID_S"               
## [119] "KEGGREST_KEGG_GENEID"                   
## [120] "KEGGREST_NCBI_GENEID"                   
## [121] "KEGGREST_NCBI_PROTEINID"                
## [122] "KEGGREST_PATHWAYS"                      
## [123] "KEGGREST_UNIPROTID"                     
## [124] "LINKOUT_DATABASE"                       
## [125] "LINKOUT_EXT_ID"                         
## [126] "LINKOUT_LINK_URL"                       
## [127] "LINKOUT_SOURCE_ID"                      
## [128] "ORTHOLOGS_GID"                          
## [129] "ORTHOLOGS_ORGANISM"                     
## [130] "ORTHOLOGS_PRODUCT"                      
## [131] "ORTHOLOGS_SYNTENIC"                     
## [132] "PATHWAY_EC_NUMBER_MATCHED_IN_PATHWAY"   
## [133] "PATHWAY_EXACT_EC_NUMBER_MATCH"          
## [134] "PATHWAY_EXPASY_URL"                     
## [135] "PATHWAY_ID"                             
## [136] "PATHWAY_REACTIONS_MATCHING_EC_NUMBER"   
## [137] "PATHWAY_SOURCE"                         
## [138] "PATHWAY_SOURCE_ID"                      
## [139] "PUBMED_AUTHORS"                         
## [140] "PUBMED_DOI"                             
## [141] "PUBMED_ID"                              
## [142] "PUBMED_TITLE"
wanted_fields <- c("annot_gene_location_text",
                   "annot_cds_length",
                   "annot_gene_name",
                   "annot_gene_product",
                   "annot_gene_type",
                   "annot_strand",
                   "annot_gene_entrez_id",
                   "annot_gene_orthomcl_name")
esmer_annot <- load_orgdb_annotations(
  esmer_db,
  keytype="gid",
  fields=wanted_fields)
## Unable to find ANNOT_CDSNAME, setting it to ANNOT_GENE_NAME.
## Unable to find ANNOT_CDSCHROM in the db, removing it.
## Unable to find ANNOT_CDSSTRAND in the db, removing it.
## Unable to find ANNOT_CDSSTART in the db, removing it.
## Unable to find ANNOT_CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: ANNOT_GENE_NAME, ANNOT_GENE_TYPE, ANNOT_GENE_LOCATION_TEXT, ANNOT_CDS_LENGTH, ANNOT_GENE_NAME, ANNOT_GENE_PRODUCT, ANNOT_GENE_TYPE, ANNOT_STRAND, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_ORTHOMCL_NAME
## 'select()' returned 1:1 mapping between keys and columns
nonesmer_annot <- load_orgdb_annotations(
  nonesmer_db,
  keytype="gid",
  fields=wanted_fields)
## Unable to find ANNOT_CDSNAME, setting it to ANNOT_GENE_NAME.
## Unable to find ANNOT_CDSCHROM in the db, removing it.
## Unable to find ANNOT_CDSSTRAND in the db, removing it.
## Unable to find ANNOT_CDSSTART in the db, removing it.
## Unable to find ANNOT_CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: ANNOT_GENE_NAME, ANNOT_GENE_TYPE, ANNOT_GENE_LOCATION_TEXT, ANNOT_CDS_LENGTH, ANNOT_GENE_NAME, ANNOT_GENE_PRODUCT, ANNOT_GENE_TYPE, ANNOT_STRAND, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_ORTHOMCL_NAME
## 'select()' returned 1:1 mapping between keys and columns
unas_annot <- load_orgdb_annotations(
  unas_db,
  keytype="gid",
  fields=wanted_fields)
## Unable to find ANNOT_CDSNAME, setting it to ANNOT_GENE_NAME.
## Unable to find ANNOT_CDSCHROM in the db, removing it.
## Unable to find ANNOT_CDSSTRAND in the db, removing it.
## Unable to find ANNOT_CDSSTART in the db, removing it.
## Unable to find ANNOT_CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: ANNOT_GENE_NAME, ANNOT_GENE_TYPE, ANNOT_GENE_LOCATION_TEXT, ANNOT_CDS_LENGTH, ANNOT_GENE_NAME, ANNOT_GENE_PRODUCT, ANNOT_GENE_TYPE, ANNOT_STRAND, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_ORTHOMCL_NAME
## 'select()' returned 1:1 mapping between keys and columns

Now combine the esmer, nonesmer, and unassigned annotations.

clbr_annot <- rbind(rbind(esmer_annot[["genes"]], nonesmer_annot[["genes"]]),
                    unas_annot[["genes"]])
## Wait, did they finally combine esmer_annot/nonesmer_annot and the whole clbr?
testers <- head(rownames(unas_annot[["genes"]]))
testers %in% rownames(nonesmer_annot$genes)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE
testers %in% rownames(esmer_annot$genes)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE
## No, I guess not.
clbr_annot <- extract_gene_locations(clbr_annot)
hisat_clbr_annot <- clbr_annot
rownames(hisat_clbr_annot) <- paste0("exon_", rownames(hisat_clbr_annot), ".1")
salmon_clbr_annot <- clbr_annot
rownames(salmon_clbr_annot) <- paste0(rownames(salmon_clbr_annot), ".mRNA")

2 Gather orthologs between haplotypes

For the moment I think I will just ask for esmer->nonesmer

orthos <- EuPathDB::extract_eupath_orthologs(
                      db=esmer_db,
                      query_species="Trypanosoma cruzi CL Brener Non-Esmeraldo-like",
                      id_column="ORTHOLOGS_GID")
## Some columns were missing: ORTHOLOGS_COUNT
## Removing them, which may end badly.
## 'select()' returned 1:many mapping between keys and columns
## There are 48 possible species in this group.
## Found species: Trypanosoma cruzi CL Brener Non-Esmeraldo-like
orthos <- orthos[, c("GID", "ORTHOLOGS_GID")]
colnames(orthos) <- c("Esmeraldo", "NonEsmeraldo")
if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  message(paste0("Saving to ", savefile))
  tmp <- sm(saveme(filename=savefile))
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 8ca465bb9928ffe95082f64aed9cf64799bbf8e6
## This is hpgltools commit: Wed Jul 31 16:40:59 2019 -0400: 8ca465bb9928ffe95082f64aed9cf64799bbf8e6
## Saving to 01_annotation_v20190813.rda.xz
LS0tCnRpdGxlOiAiVC4gY3J1emkgMjAxOTA1MTM6IENvbGxlY3RpbmcgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbi4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKIGh0bWxfZG9jdW1lbnQ6CiAgY29kZV9kb3dubG9hZDogdHJ1ZQogIGNvZGVfZm9sZGluZzogc2hvdwogIGZpZ19jYXB0aW9uOiB0cnVlCiAgZmlnX2hlaWdodDogNwogIGZpZ193aWR0aDogNwogIGhpZ2hsaWdodDogZGVmYXVsdAogIGtlZXBfbWQ6IGZhbHNlCiAgbW9kZTogc2VsZmNvbnRhaW5lZAogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgdGhlbWU6IHJlYWRhYmxlCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICBjb2xsYXBzZWQ6IGZhbHNlCiAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4OwogIH0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIGxpYnJhcnkoaHBnbHRvb2xzKQogIHR0IDwtIHNtKGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikpCiAga25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9OTAsCiAgICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQogIGtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGg9OCwKICAgICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodD04LAogICAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCiAgb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKICBnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEyKSkKICB2ZXIgPC0gIjIwMTkwODEzIgogIHByZXZpb3VzX2ZpbGUgPC0gcGFzdGUwKCJpbmRleF92IiwgdmVyLCAiLlJtZCIpCgogIHRtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lPWdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iXFwucmRhXFwueHoiLCB4PXByZXZpb3VzX2ZpbGUpKSkpCiAgcm1kX2ZpbGUgPC0gcGFzdGUwKCIwMV9hbm5vdGF0aW9uX3YiLCB2ZXIsICIuUm1kIikKICBzYXZlZmlsZSA8LSBnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IlxcLnJkYVxcLnh6IiwgeD1ybWRfZmlsZSkKfQpgYGAKCiMgQW5ub3RhdGlvbiB2ZXJzaW9uOiBgciB2ZXJgCgojIyBHZW5vbWUgYW5ub3RhdGlvbiB3aXRoIE9yZ0RiL1R4RGIvT3JnYW5pc21EYmkKClRoZSB0cml0cnlwZGIganVzdCByZWxlYXNlZCBhIG5ldyB2ZXJzaW9uLiAgTGV0IHVzIG1ha2UgbmV3IGFubm90YXRpb24gZGF0YSBmcm9tIGl0LgoKYGBge3IgY3JlYXRlX29yZ2FuaXNtcywgZXZhbD1GQUxTRX0KIyMgVGhlc2UgZnVuY3Rpb25zIHRha2UgX2ZvcmV2ZXJfIHRoZSBmaXJzdCB0aW1lIGFyb3VuZC4KZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L3NjcmF0Y2gvZ2l0L0V1UGF0aERCIikKCmVzbWVyX2VudHJ5IDwtIGdldF9ldXBhdGhfZW50cnkoIkVzbWVyYWxkbyIsIHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCmluc3RhbGxlZHAgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcyhlc21lcl9lbnRyeSkkb3JnZGJfaW5zdGFsbGVkCmlmICghaXNUUlVFKGluc3RhbGxlZHApKSB7CiAgZXNtZXJfYW5ub3QgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKGVzbWVyX2VudHJ5LCByZWluc3RhbGw9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlPVRSVUUpCn0KCm5vbmVzbWVyX2VudHJ5IDwtIGdldF9ldXBhdGhfZW50cnkoIk5vbi1Fc21lcmFsZG8tbGlrZSIsIHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCmluc3RhbGxlZHAgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcyhub25lc21lcl9lbnRyeSkkb3JnZGJfaW5zdGFsbGVkCmlmICghaXNUUlVFKGluc3RhbGxlZHApKSB7CiAgbm9uZXNtZXJfYW5ub3QgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKG5vbmVzbWVyX2VudHJ5LCByZWluc3RhbGw9VFJVRSwgb3ZlcndyaXRlPVRSVUUpCn0KCnVuYXNfZW50cnkgPC0gZ2V0X2V1cGF0aF9lbnRyeSgic3RyYWluIENMIEJyZW5lciIsIHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCmluc3RhbGxlZHAgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcyh1bmFzX2VudHJ5KSRvcmdkYl9pbnN0YWxsZWQKaWYgKCFpc1RSVUUoaW5zdGFsbGVkcCkpIHsKICB1bmFzX2Fubm90IDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdkYih1bmFzX2VudHJ5LCByZWluc3RhbGw9VFJVRSwgb3ZlcndyaXRlPVRSVUUpCn0KYGBgCgpJbiBvcmRlciB0byBsb2FkIHRoZXNlIG5ldyBwYWNrYWdlcywgSSByYXRoZXIgbmVlZCB0byByZW1lbWJlciB0aGVpciBuYW1lcy4uLgpIYXBwaWx5IEkgaGF2ZSBhIGZ1bmN0aW9uIGZvciB0aGF0LgoKYGBge3IgbG9hZF9hbm5vdGF0aW9uc30KIyNsaWJyYXJ5KEV1UGF0aERCKQpkZXZ0b29sczo6bG9hZF9hbGwoIn4vc2NyYXRjaC9naXQvRXVQYXRoREIiKQplc21lcl9lbnRyeSA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9lbnRyeShzcGVjaWVzPSJFc21lcmFsZG8tbGlrZSIsIHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCm5vbmVzbWVyX2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9IkJyZW5lciBOb24iLCB3ZWJzZXJ2aWNlPSJ0cml0cnlwZGIiKQp1bmFzX2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9IkNMIEJyZW5lciQiLCB3ZWJzZXJ2aWNlPSJ0cml0cnlwZGIiKQoKZXNtZXJfbmFtZXMgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcyhlc21lcl9lbnRyeSkKZXNtZXJfbmFtZXMkb3JnZGIKbm9uZXNtZXJfbmFtZXMgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcyhub25lc21lcl9lbnRyeSkKbm9uZXNtZXJfbmFtZXMkb3JnZGIKdW5hc19uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKHVuYXNfZW50cnkpCnVuYXNfbmFtZXMkb3JnZGIKYGBgCgpGb3IgdGhvc2UgcGFja2FnZXMgSSBoYXZlIGdlbmVyYXRlZC9pbnN0YWxsZWQsIHVzZSB0aGlzIHRvIGdlbmVyYXRlIGFuCmFubm90YXRpb24gdGFibGUuIE9oLCBidXQgSSBwcmVmaXhlZCB0aGUgY29sdW1uIG5hbWVzIHdpdGggJ2Fubm90XycgaW4gb3JkZXIgdG8KbWFrZSBzdXJlIHRoYXQgbm90aGluZyBpcyBkdXBsaWNhdGVkIHdpdGggdGhlIEdPIHRhYmxlcywgb3J0aG9sb2cgdGFibGVzLCBldGMuCgpgYGB7ciBsb2FkX29yZ2RifQojIyBKdXN0IHRvIHNhdmUgb24gdHlwaW5nCmxpYnJhcnkoZXNtZXJfbmFtZXMkb3JnZGIsIGNoYXJhY3Rlcj1UUlVFKQpsaWJyYXJ5KG5vbmVzbWVyX25hbWVzJG9yZ2RiLCBjaGFyYWN0ZXI9VFJVRSkKbGlicmFyeSh1bmFzX25hbWVzJG9yZ2RiLCBjaGFyYWN0ZXI9VFJVRSkKCmVzbWVyX2RiIDwtIGdldDAoZXNtZXJfbmFtZXMkb3JnZGIpCmVzbWVyX2RiCm5vbmVzbWVyX2RiIDwtIGdldDAobm9uZXNtZXJfbmFtZXMkb3JnZGIpCm5vbmVzbWVyX2RiCnVuYXNfZGIgPC0gZ2V0MCh1bmFzX25hbWVzJG9yZ2RiKQp1bmFzX2RiCmBgYAoKTGV0cyBzZWUgd2hhdCBjb2x1bW5zIGFyZSBhdmFpbGFibGUgaW4gdGhlIGFubm90YXRpb24gcGFja2FnZXMuCgpgYGB7ciBhdmFpbF9jb2x1bW5zfQphbGxfZmllbGRzIDwtIGNvbHVtbnMoZXNtZXJfZGIpCmFsbF9maWVsZHMKCndhbnRlZF9maWVsZHMgPC0gYygiYW5ub3RfZ2VuZV9sb2NhdGlvbl90ZXh0IiwKICAgICAgICAgICAgICAgICAgICJhbm5vdF9jZHNfbGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICJhbm5vdF9nZW5lX25hbWUiLAogICAgICAgICAgICAgICAgICAgImFubm90X2dlbmVfcHJvZHVjdCIsCiAgICAgICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV90eXBlIiwKICAgICAgICAgICAgICAgICAgICJhbm5vdF9zdHJhbmQiLAogICAgICAgICAgICAgICAgICAgImFubm90X2dlbmVfZW50cmV6X2lkIiwKICAgICAgICAgICAgICAgICAgICJhbm5vdF9nZW5lX29ydGhvbWNsX25hbWUiKQplc21lcl9hbm5vdCA8LSBsb2FkX29yZ2RiX2Fubm90YXRpb25zKAogIGVzbWVyX2RiLAogIGtleXR5cGU9ImdpZCIsCiAgZmllbGRzPXdhbnRlZF9maWVsZHMpCm5vbmVzbWVyX2Fubm90IDwtIGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoCiAgbm9uZXNtZXJfZGIsCiAga2V5dHlwZT0iZ2lkIiwKICBmaWVsZHM9d2FudGVkX2ZpZWxkcykKdW5hc19hbm5vdCA8LSBsb2FkX29yZ2RiX2Fubm90YXRpb25zKAogIHVuYXNfZGIsCiAga2V5dHlwZT0iZ2lkIiwKICBmaWVsZHM9d2FudGVkX2ZpZWxkcykKYGBgCgpOb3cgY29tYmluZSB0aGUgZXNtZXIsIG5vbmVzbWVyLCBhbmQgdW5hc3NpZ25lZCBhbm5vdGF0aW9ucy4KCmBgYHtyIGNvbWJpbmVfYW5ub3R9CmNsYnJfYW5ub3QgPC0gcmJpbmQocmJpbmQoZXNtZXJfYW5ub3RbWyJnZW5lcyJdXSwgbm9uZXNtZXJfYW5ub3RbWyJnZW5lcyJdXSksCiAgICAgICAgICAgICAgICAgICAgdW5hc19hbm5vdFtbImdlbmVzIl1dKQojIyBXYWl0LCBkaWQgdGhleSBmaW5hbGx5IGNvbWJpbmUgZXNtZXJfYW5ub3Qvbm9uZXNtZXJfYW5ub3QgYW5kIHRoZSB3aG9sZSBjbGJyPwp0ZXN0ZXJzIDwtIGhlYWQocm93bmFtZXModW5hc19hbm5vdFtbImdlbmVzIl1dKSkKdGVzdGVycyAlaW4lIHJvd25hbWVzKG5vbmVzbWVyX2Fubm90JGdlbmVzKQp0ZXN0ZXJzICVpbiUgcm93bmFtZXMoZXNtZXJfYW5ub3QkZ2VuZXMpCiMjIE5vLCBJIGd1ZXNzIG5vdC4KY2xicl9hbm5vdCA8LSBleHRyYWN0X2dlbmVfbG9jYXRpb25zKGNsYnJfYW5ub3QpCmhpc2F0X2NsYnJfYW5ub3QgPC0gY2xicl9hbm5vdApyb3duYW1lcyhoaXNhdF9jbGJyX2Fubm90KSA8LSBwYXN0ZTAoImV4b25fIiwgcm93bmFtZXMoaGlzYXRfY2xicl9hbm5vdCksICIuMSIpCnNhbG1vbl9jbGJyX2Fubm90IDwtIGNsYnJfYW5ub3QKcm93bmFtZXMoc2FsbW9uX2NsYnJfYW5ub3QpIDwtIHBhc3RlMChyb3duYW1lcyhzYWxtb25fY2xicl9hbm5vdCksICIubVJOQSIpCmBgYAoKIyBHYXRoZXIgb3J0aG9sb2dzIGJldHdlZW4gaGFwbG90eXBlcwoKRm9yIHRoZSBtb21lbnQgSSB0aGluayBJIHdpbGwganVzdCBhc2sgZm9yIGVzbWVyLT5ub25lc21lcgoKYGBge3Igb3J0aG9zfQpvcnRob3MgPC0gRXVQYXRoREI6OmV4dHJhY3RfZXVwYXRoX29ydGhvbG9ncygKICAgICAgICAgICAgICAgICAgICAgIGRiPWVzbWVyX2RiLAogICAgICAgICAgICAgICAgICAgICAgcXVlcnlfc3BlY2llcz0iVHJ5cGFub3NvbWEgY3J1emkgQ0wgQnJlbmVyIE5vbi1Fc21lcmFsZG8tbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICBpZF9jb2x1bW49Ik9SVEhPTE9HU19HSUQiKQpvcnRob3MgPC0gb3J0aG9zWywgYygiR0lEIiwgIk9SVEhPTE9HU19HSUQiKV0KY29sbmFtZXMob3J0aG9zKSA8LSBjKCJFc21lcmFsZG8iLCAiTm9uRXNtZXJhbGRvIikKYGBgCgpgYGB7ciBzYXZlbWV9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIHBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCiAgbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCiAgbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCBzYXZlZmlsZSkpCiAgdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT1zYXZlZmlsZSkpCn0KYGBgCg==