Introduction

Gene Ontology (GO) term annotation for a genome involves assigning GO terms to gene products to describe their biological processes, cellular components, and molecular functions in a species-independent manner. This process is crucial for understanding the functional aspects of genes and proteins in a comprehensive way. Here’s a step-by-step guide to performing GO term annotation for a genome:

  1. Prepare Your Gene/Protein Dataset: Before starting the GO annotation, ensure you have a list of genes or proteins you want to annotate. This list can be derived from genomic or proteomic data analysis.

  2. Identify the Gene or Protein Sequences: For each gene or protein in your dataset, you need to obtain the corresponding DNA or amino acid sequences. These sequences can be retrieved from various databases, such as NCBI, Ensembl, or UniProt.

  3. Sequence Similarity Searching: Use tools like BLAST (Basic Local Alignment Search Tool) to find similar sequences in databases that already have GO annotations. The idea is to use the functional annotations of similar sequences as a proxy for the function of your sequences.

    • For protein sequences, use BLASTP or BLASTX (if starting from nucleotide sequences) against a protein database like UniProt or NCBI’s non-redundant protein database.
    • For nucleotide sequences, use BLASTN for nucleotide databases or TBLASTX for translated nucleotide databases.
  4. Mapping to GO Terms:

    • Direct Transfer: If you find highly similar sequences (with high sequence identity and coverage), you can directly transfer the GO annotations from the matched sequences to your sequences. This approach works best when the similarity is very high.
    • InterProScan: Use InterProScan, a tool that integrates different protein signature recognition methods into one resource. It can identify potential GO annotations based on the presence of specific protein domains or signatures in your sequences.
  5. Annotation Tools and Databases:

    • GOA (Gene Ontology Annotation) Database: Utilize GOA, which provides high-quality GO annotations to proteins.
    • DAVID (Database for Annotation, Visualization, and Integrated Discovery): Use DAVID for functional annotation of genes or proteins to understand biological meaning behind large lists of genes or proteins.
    • AmiGO: Explore existing GO annotations and tools for GO term enrichment analysis.
  6. Manual Curation: For critical genes or when high specificity and accuracy are required, manual curation of the literature might be necessary. This involves reading relevant research articles and assigning GO terms based on experimental evidence.

  7. Validation and Quality Control: Ensure the quality of the annotations by checking for consistency and possible errors. This might involve comparing your annotations against known biological information or using software tools designed to validate GO annotations.

  8. Functional Enrichment Analysis: After annotating your genes/proteins with GO terms, you might want to perform functional enrichment analysis to identify which GO terms are overrepresented in your dataset. This can provide insights into the predominant biological themes.

  9. Keep Up-to-Date: GO terms and annotations are regularly updated. Ensure to periodically re-analyze your dataset to keep the annotations current.

Each step in this process requires careful consideration and, depending on your specific needs, may involve different tools and databases. The choice of tools and the emphasis on certain steps can vary based on the quality of the genome assembly, the availability of closely related annotated genomes, and the specific goals of your research project.

Pipeline

For conducting Gene Ontology (GO) term annotation within a Conda environment, you can leverage various bioinformatics tools and pipelines that are designed to simplify the process of functional annotation. One effective approach is to construct a custom pipeline using several tools that are readily available through Conda, which can be installed from the Bioconda channel. Below is an outline of a useful pipeline, including steps on setting up the environment and installing necessary tools.

Step 1: Setting Up Conda and Creating a New Environment

First, ensure you have Miniconda or Anaconda installed. Then, create a new environment specifically for your annotation project to manage dependencies more effectively.

conda create -n go_annotation python=3.8
conda activate go_annotation

Replace python=3.8 with the version of Python you prefer or require.

Step 2: Installing Necessary Tools

Within this Conda environment, you will install tools that are commonly used for sequence alignment, functional annotation, and GO term enrichment analysis.

  • BLAST for sequence similarity searching:
conda install -c bioconda blast
  • InterProScan for identifying protein domains and inferring GO terms:
conda install -c bioconda interproscan
  • HMMER for identifying protein domains using HMM models:
conda install -c bioconda hmmer
  • GOATOOLS for GO term enrichment analysis:
conda install -c bioconda goatools

Step 3: Sequence Similarity Searching

After installing BLAST, you can perform sequence similarity searches against protein databases like NCBI’s non-redundant protein database or UniProt.

blastp -query your_proteins.fasta -db nr -out results.out -evalue 1e-5 -outfmt 6 -num_threads 4

Step 4: Running InterProScan

InterProScan can be used to scan your sequences for protein domains and associated GO terms.

interproscan.sh -i your_proteins.fasta -f tsv -dp

Step 5: Performing GO Term Enrichment Analysis

After obtaining GO annotations, you can use GOATOOLS to perform GO term enrichment analysis to identify significantly overrepresented GO terms in your dataset.

Prepare a list of genes of interest and a background gene list, then run GOATOOLS to identify enriched GO terms.

Step 6: Integration and Analysis

You might need to write custom scripts to integrate results from different tools and perform further analysis. Python or R can be very effective for this task, and many libraries and packages are available for bioinformatics analysis.

Conclusion

This pipeline provides a basic framework for GO term annotation and functional analysis. Depending on the specifics of your project, you might need to adjust the pipeline, such as incorporating additional tools for specific types of analysis or modifying parameters used in searches and analyses. Always refer to the documentation of each tool for detailed usage instructions and best practices.

LS0tCnRpdGxlOiAiR2VuZSBPbnRvbG9neSAoR08pIHRlcm0gYW5ub3RhdGlvbiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgSW50cm9kdWN0aW9uCgpHZW5lIE9udG9sb2d5IChHTykgdGVybSBhbm5vdGF0aW9uIGZvciBhIGdlbm9tZSBpbnZvbHZlcyBhc3NpZ25pbmcgR08gdGVybXMgdG8gZ2VuZSBwcm9kdWN0cyB0byBkZXNjcmliZSB0aGVpciBiaW9sb2dpY2FsIHByb2Nlc3NlcywgY2VsbHVsYXIgY29tcG9uZW50cywgYW5kIG1vbGVjdWxhciBmdW5jdGlvbnMgaW4gYSBzcGVjaWVzLWluZGVwZW5kZW50IG1hbm5lci4gVGhpcyBwcm9jZXNzIGlzIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGZ1bmN0aW9uYWwgYXNwZWN0cyBvZiBnZW5lcyBhbmQgcHJvdGVpbnMgaW4gYSBjb21wcmVoZW5zaXZlIHdheS4gSGVyZSdzIGEgc3RlcC1ieS1zdGVwIGd1aWRlIHRvIHBlcmZvcm1pbmcgR08gdGVybSBhbm5vdGF0aW9uIGZvciBhIGdlbm9tZToKCjEuICAqKlByZXBhcmUgWW91ciBHZW5lL1Byb3RlaW4gRGF0YXNldCoqOiBCZWZvcmUgc3RhcnRpbmcgdGhlIEdPIGFubm90YXRpb24sIGVuc3VyZSB5b3UgaGF2ZSBhIGxpc3Qgb2YgZ2VuZXMgb3IgcHJvdGVpbnMgeW91IHdhbnQgdG8gYW5ub3RhdGUuIFRoaXMgbGlzdCBjYW4gYmUgZGVyaXZlZCBmcm9tIGdlbm9taWMgb3IgcHJvdGVvbWljIGRhdGEgYW5hbHlzaXMuCgoyLiAgKipJZGVudGlmeSB0aGUgR2VuZSBvciBQcm90ZWluIFNlcXVlbmNlcyoqOiBGb3IgZWFjaCBnZW5lIG9yIHByb3RlaW4gaW4geW91ciBkYXRhc2V0LCB5b3UgbmVlZCB0byBvYnRhaW4gdGhlIGNvcnJlc3BvbmRpbmcgRE5BIG9yIGFtaW5vIGFjaWQgc2VxdWVuY2VzLiBUaGVzZSBzZXF1ZW5jZXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHZhcmlvdXMgZGF0YWJhc2VzLCBzdWNoIGFzIE5DQkksIEVuc2VtYmwsIG9yIFVuaVByb3QuCgozLiAgKipTZXF1ZW5jZSBTaW1pbGFyaXR5IFNlYXJjaGluZyoqOiBVc2UgdG9vbHMgbGlrZSBCTEFTVCAoQmFzaWMgTG9jYWwgQWxpZ25tZW50IFNlYXJjaCBUb29sKSB0byBmaW5kIHNpbWlsYXIgc2VxdWVuY2VzIGluIGRhdGFiYXNlcyB0aGF0IGFscmVhZHkgaGF2ZSBHTyBhbm5vdGF0aW9ucy4gVGhlIGlkZWEgaXMgdG8gdXNlIHRoZSBmdW5jdGlvbmFsIGFubm90YXRpb25zIG9mIHNpbWlsYXIgc2VxdWVuY2VzIGFzIGEgcHJveHkgZm9yIHRoZSBmdW5jdGlvbiBvZiB5b3VyIHNlcXVlbmNlcy4KCiAgICAtICAgRm9yIHByb3RlaW4gc2VxdWVuY2VzLCB1c2UgQkxBU1RQIG9yIEJMQVNUWCAoaWYgc3RhcnRpbmcgZnJvbSBudWNsZW90aWRlIHNlcXVlbmNlcykgYWdhaW5zdCBhIHByb3RlaW4gZGF0YWJhc2UgbGlrZSBVbmlQcm90IG9yIE5DQkkncyBub24tcmVkdW5kYW50IHByb3RlaW4gZGF0YWJhc2UuCiAgICAtICAgRm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzLCB1c2UgQkxBU1ROIGZvciBudWNsZW90aWRlIGRhdGFiYXNlcyBvciBUQkxBU1RYIGZvciB0cmFuc2xhdGVkIG51Y2xlb3RpZGUgZGF0YWJhc2VzLgoKNC4gICoqTWFwcGluZyB0byBHTyBUZXJtcyoqOgoKICAgIC0gICAqKkRpcmVjdCBUcmFuc2ZlcioqOiBJZiB5b3UgZmluZCBoaWdobHkgc2ltaWxhciBzZXF1ZW5jZXMgKHdpdGggaGlnaCBzZXF1ZW5jZSBpZGVudGl0eSBhbmQgY292ZXJhZ2UpLCB5b3UgY2FuIGRpcmVjdGx5IHRyYW5zZmVyIHRoZSBHTyBhbm5vdGF0aW9ucyBmcm9tIHRoZSBtYXRjaGVkIHNlcXVlbmNlcyB0byB5b3VyIHNlcXVlbmNlcy4gVGhpcyBhcHByb2FjaCB3b3JrcyBiZXN0IHdoZW4gdGhlIHNpbWlsYXJpdHkgaXMgdmVyeSBoaWdoLgogICAgLSAgICoqSW50ZXJQcm9TY2FuKio6IFVzZSBJbnRlclByb1NjYW4sIGEgdG9vbCB0aGF0IGludGVncmF0ZXMgZGlmZmVyZW50IHByb3RlaW4gc2lnbmF0dXJlIHJlY29nbml0aW9uIG1ldGhvZHMgaW50byBvbmUgcmVzb3VyY2UuIEl0IGNhbiBpZGVudGlmeSBwb3RlbnRpYWwgR08gYW5ub3RhdGlvbnMgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIHNwZWNpZmljIHByb3RlaW4gZG9tYWlucyBvciBzaWduYXR1cmVzIGluIHlvdXIgc2VxdWVuY2VzLgoKNS4gICoqQW5ub3RhdGlvbiBUb29scyBhbmQgRGF0YWJhc2VzKio6CgogICAgLSAgICoqR09BIChHZW5lIE9udG9sb2d5IEFubm90YXRpb24pIERhdGFiYXNlKio6IFV0aWxpemUgR09BLCB3aGljaCBwcm92aWRlcyBoaWdoLXF1YWxpdHkgR08gYW5ub3RhdGlvbnMgdG8gcHJvdGVpbnMuCiAgICAtICAgKipEQVZJRCAoRGF0YWJhc2UgZm9yIEFubm90YXRpb24sIFZpc3VhbGl6YXRpb24sIGFuZCBJbnRlZ3JhdGVkIERpc2NvdmVyeSkqKjogVXNlIERBVklEIGZvciBmdW5jdGlvbmFsIGFubm90YXRpb24gb2YgZ2VuZXMgb3IgcHJvdGVpbnMgdG8gdW5kZXJzdGFuZCBiaW9sb2dpY2FsIG1lYW5pbmcgYmVoaW5kIGxhcmdlIGxpc3RzIG9mIGdlbmVzIG9yIHByb3RlaW5zLgogICAgLSAgICoqQW1pR08qKjogRXhwbG9yZSBleGlzdGluZyBHTyBhbm5vdGF0aW9ucyBhbmQgdG9vbHMgZm9yIEdPIHRlcm0gZW5yaWNobWVudCBhbmFseXNpcy4KCjYuICAqKk1hbnVhbCBDdXJhdGlvbioqOiBGb3IgY3JpdGljYWwgZ2VuZXMgb3Igd2hlbiBoaWdoIHNwZWNpZmljaXR5IGFuZCBhY2N1cmFjeSBhcmUgcmVxdWlyZWQsIG1hbnVhbCBjdXJhdGlvbiBvZiB0aGUgbGl0ZXJhdHVyZSBtaWdodCBiZSBuZWNlc3NhcnkuIFRoaXMgaW52b2x2ZXMgcmVhZGluZyByZWxldmFudCByZXNlYXJjaCBhcnRpY2xlcyBhbmQgYXNzaWduaW5nIEdPIHRlcm1zIGJhc2VkIG9uIGV4cGVyaW1lbnRhbCBldmlkZW5jZS4KCjcuICAqKlZhbGlkYXRpb24gYW5kIFF1YWxpdHkgQ29udHJvbCoqOiBFbnN1cmUgdGhlIHF1YWxpdHkgb2YgdGhlIGFubm90YXRpb25zIGJ5IGNoZWNraW5nIGZvciBjb25zaXN0ZW5jeSBhbmQgcG9zc2libGUgZXJyb3JzLiBUaGlzIG1pZ2h0IGludm9sdmUgY29tcGFyaW5nIHlvdXIgYW5ub3RhdGlvbnMgYWdhaW5zdCBrbm93biBiaW9sb2dpY2FsIGluZm9ybWF0aW9uIG9yIHVzaW5nIHNvZnR3YXJlIHRvb2xzIGRlc2lnbmVkIHRvIHZhbGlkYXRlIEdPIGFubm90YXRpb25zLgoKOC4gICoqRnVuY3Rpb25hbCBFbnJpY2htZW50IEFuYWx5c2lzKio6IEFmdGVyIGFubm90YXRpbmcgeW91ciBnZW5lcy9wcm90ZWlucyB3aXRoIEdPIHRlcm1zLCB5b3UgbWlnaHQgd2FudCB0byBwZXJmb3JtIGZ1bmN0aW9uYWwgZW5yaWNobWVudCBhbmFseXNpcyB0byBpZGVudGlmeSB3aGljaCBHTyB0ZXJtcyBhcmUgb3ZlcnJlcHJlc2VudGVkIGluIHlvdXIgZGF0YXNldC4gVGhpcyBjYW4gcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIHRoZSBwcmVkb21pbmFudCBiaW9sb2dpY2FsIHRoZW1lcy4KCjkuICAqKktlZXAgVXAtdG8tRGF0ZSoqOiBHTyB0ZXJtcyBhbmQgYW5ub3RhdGlvbnMgYXJlIHJlZ3VsYXJseSB1cGRhdGVkLiBFbnN1cmUgdG8gcGVyaW9kaWNhbGx5IHJlLWFuYWx5emUgeW91ciBkYXRhc2V0IHRvIGtlZXAgdGhlIGFubm90YXRpb25zIGN1cnJlbnQuCgpFYWNoIHN0ZXAgaW4gdGhpcyBwcm9jZXNzIHJlcXVpcmVzIGNhcmVmdWwgY29uc2lkZXJhdGlvbiBhbmQsIGRlcGVuZGluZyBvbiB5b3VyIHNwZWNpZmljIG5lZWRzLCBtYXkgaW52b2x2ZSBkaWZmZXJlbnQgdG9vbHMgYW5kIGRhdGFiYXNlcy4gVGhlIGNob2ljZSBvZiB0b29scyBhbmQgdGhlIGVtcGhhc2lzIG9uIGNlcnRhaW4gc3RlcHMgY2FuIHZhcnkgYmFzZWQgb24gdGhlIHF1YWxpdHkgb2YgdGhlIGdlbm9tZSBhc3NlbWJseSwgdGhlIGF2YWlsYWJpbGl0eSBvZiBjbG9zZWx5IHJlbGF0ZWQgYW5ub3RhdGVkIGdlbm9tZXMsIGFuZCB0aGUgc3BlY2lmaWMgZ29hbHMgb2YgeW91ciByZXNlYXJjaCBwcm9qZWN0LgoKIyMgUGlwZWxpbmUKCkZvciBjb25kdWN0aW5nIEdlbmUgT250b2xvZ3kgKEdPKSB0ZXJtIGFubm90YXRpb24gd2l0aGluIGEgQ29uZGEgZW52aXJvbm1lbnQsIHlvdSBjYW4gbGV2ZXJhZ2UgdmFyaW91cyBiaW9pbmZvcm1hdGljcyB0b29scyBhbmQgcGlwZWxpbmVzIHRoYXQgYXJlIGRlc2lnbmVkIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIGZ1bmN0aW9uYWwgYW5ub3RhdGlvbi4gT25lIGVmZmVjdGl2ZSBhcHByb2FjaCBpcyB0byBjb25zdHJ1Y3QgYSBjdXN0b20gcGlwZWxpbmUgdXNpbmcgc2V2ZXJhbCB0b29scyB0aGF0IGFyZSByZWFkaWx5IGF2YWlsYWJsZSB0aHJvdWdoIENvbmRhLCB3aGljaCBjYW4gYmUgaW5zdGFsbGVkIGZyb20gdGhlIEJpb2NvbmRhIGNoYW5uZWwuIEJlbG93IGlzIGFuIG91dGxpbmUgb2YgYSB1c2VmdWwgcGlwZWxpbmUsIGluY2x1ZGluZyBzdGVwcyBvbiBzZXR0aW5nIHVwIHRoZSBlbnZpcm9ubWVudCBhbmQgaW5zdGFsbGluZyBuZWNlc3NhcnkgdG9vbHMuCgojIyMgU3RlcCAxOiBTZXR0aW5nIFVwIENvbmRhIGFuZCBDcmVhdGluZyBhIE5ldyBFbnZpcm9ubWVudAoKRmlyc3QsIGVuc3VyZSB5b3UgaGF2ZSBNaW5pY29uZGEgb3IgQW5hY29uZGEgaW5zdGFsbGVkLiBUaGVuLCBjcmVhdGUgYSBuZXcgZW52aXJvbm1lbnQgc3BlY2lmaWNhbGx5IGZvciB5b3VyIGFubm90YXRpb24gcHJvamVjdCB0byBtYW5hZ2UgZGVwZW5kZW5jaWVzIG1vcmUgZWZmZWN0aXZlbHkuCgpgYGAgc2gKY29uZGEgY3JlYXRlIC1uIGdvX2Fubm90YXRpb24gcHl0aG9uPTMuOApjb25kYSBhY3RpdmF0ZSBnb19hbm5vdGF0aW9uCmBgYAoKUmVwbGFjZSBgcHl0aG9uPTMuOGAgd2l0aCB0aGUgdmVyc2lvbiBvZiBQeXRob24geW91IHByZWZlciBvciByZXF1aXJlLgoKIyMjIFN0ZXAgMjogSW5zdGFsbGluZyBOZWNlc3NhcnkgVG9vbHMKCldpdGhpbiB0aGlzIENvbmRhIGVudmlyb25tZW50LCB5b3Ugd2lsbCBpbnN0YWxsIHRvb2xzIHRoYXQgYXJlIGNvbW1vbmx5IHVzZWQgZm9yIHNlcXVlbmNlIGFsaWdubWVudCwgZnVuY3Rpb25hbCBhbm5vdGF0aW9uLCBhbmQgR08gdGVybSBlbnJpY2htZW50IGFuYWx5c2lzLgoKLSAgICoqQkxBU1QqKiBmb3Igc2VxdWVuY2Ugc2ltaWxhcml0eSBzZWFyY2hpbmc6CgpgYGAgc2gKY29uZGEgaW5zdGFsbCAtYyBiaW9jb25kYSBibGFzdApgYGAKCi0gICAqKkludGVyUHJvU2NhbioqIGZvciBpZGVudGlmeWluZyBwcm90ZWluIGRvbWFpbnMgYW5kIGluZmVycmluZyBHTyB0ZXJtczoKCmBgYCBzaApjb25kYSBpbnN0YWxsIC1jIGJpb2NvbmRhIGludGVycHJvc2NhbgpgYGAKCi0gICAqKkhNTUVSKiogZm9yIGlkZW50aWZ5aW5nIHByb3RlaW4gZG9tYWlucyB1c2luZyBITU0gbW9kZWxzOgoKYGBgIHNoCmNvbmRhIGluc3RhbGwgLWMgYmlvY29uZGEgaG1tZXIKYGBgCgotICAgKipHT0FUT09MUyoqIGZvciBHTyB0ZXJtIGVucmljaG1lbnQgYW5hbHlzaXM6CgpgYGAgc2gKY29uZGEgaW5zdGFsbCAtYyBiaW9jb25kYSBnb2F0b29scwpgYGAKCiMjIyBTdGVwIDM6IFNlcXVlbmNlIFNpbWlsYXJpdHkgU2VhcmNoaW5nCgpBZnRlciBpbnN0YWxsaW5nIEJMQVNULCB5b3UgY2FuIHBlcmZvcm0gc2VxdWVuY2Ugc2ltaWxhcml0eSBzZWFyY2hlcyBhZ2FpbnN0IHByb3RlaW4gZGF0YWJhc2VzIGxpa2UgTkNCSSdzIG5vbi1yZWR1bmRhbnQgcHJvdGVpbiBkYXRhYmFzZSBvciBVbmlQcm90LgoKYGBgIHNoCmJsYXN0cCAtcXVlcnkgeW91cl9wcm90ZWlucy5mYXN0YSAtZGIgbnIgLW91dCByZXN1bHRzLm91dCAtZXZhbHVlIDFlLTUgLW91dGZtdCA2IC1udW1fdGhyZWFkcyA0CmBgYAoKIyMjIFN0ZXAgNDogUnVubmluZyBJbnRlclByb1NjYW4KCkludGVyUHJvU2NhbiBjYW4gYmUgdXNlZCB0byBzY2FuIHlvdXIgc2VxdWVuY2VzIGZvciBwcm90ZWluIGRvbWFpbnMgYW5kIGFzc29jaWF0ZWQgR08gdGVybXMuCgpgYGAgc2gKaW50ZXJwcm9zY2FuLnNoIC1pIHlvdXJfcHJvdGVpbnMuZmFzdGEgLWYgdHN2IC1kcApgYGAKCiMjIyBTdGVwIDU6IFBlcmZvcm1pbmcgR08gVGVybSBFbnJpY2htZW50IEFuYWx5c2lzCgpBZnRlciBvYnRhaW5pbmcgR08gYW5ub3RhdGlvbnMsIHlvdSBjYW4gdXNlIEdPQVRPT0xTIHRvIHBlcmZvcm0gR08gdGVybSBlbnJpY2htZW50IGFuYWx5c2lzIHRvIGlkZW50aWZ5IHNpZ25pZmljYW50bHkgb3ZlcnJlcHJlc2VudGVkIEdPIHRlcm1zIGluIHlvdXIgZGF0YXNldC4KClByZXBhcmUgYSBsaXN0IG9mIGdlbmVzIG9mIGludGVyZXN0IGFuZCBhIGJhY2tncm91bmQgZ2VuZSBsaXN0LCB0aGVuIHJ1biBHT0FUT09MUyB0byBpZGVudGlmeSBlbnJpY2hlZCBHTyB0ZXJtcy4KCiMjIyBTdGVwIDY6IEludGVncmF0aW9uIGFuZCBBbmFseXNpcwoKWW91IG1pZ2h0IG5lZWQgdG8gd3JpdGUgY3VzdG9tIHNjcmlwdHMgdG8gaW50ZWdyYXRlIHJlc3VsdHMgZnJvbSBkaWZmZXJlbnQgdG9vbHMgYW5kIHBlcmZvcm0gZnVydGhlciBhbmFseXNpcy4gUHl0aG9uIG9yIFIgY2FuIGJlIHZlcnkgZWZmZWN0aXZlIGZvciB0aGlzIHRhc2ssIGFuZCBtYW55IGxpYnJhcmllcyBhbmQgcGFja2FnZXMgYXJlIGF2YWlsYWJsZSBmb3IgYmlvaW5mb3JtYXRpY3MgYW5hbHlzaXMuCgojIyMgQ29uY2x1c2lvbgoKVGhpcyBwaXBlbGluZSBwcm92aWRlcyBhIGJhc2ljIGZyYW1ld29yayBmb3IgR08gdGVybSBhbm5vdGF0aW9uIGFuZCBmdW5jdGlvbmFsIGFuYWx5c2lzLiBEZXBlbmRpbmcgb24gdGhlIHNwZWNpZmljcyBvZiB5b3VyIHByb2plY3QsIHlvdSBtaWdodCBuZWVkIHRvIGFkanVzdCB0aGUgcGlwZWxpbmUsIHN1Y2ggYXMgaW5jb3Jwb3JhdGluZyBhZGRpdGlvbmFsIHRvb2xzIGZvciBzcGVjaWZpYyB0eXBlcyBvZiBhbmFseXNpcyBvciBtb2RpZnlpbmcgcGFyYW1ldGVycyB1c2VkIGluIHNlYXJjaGVzIGFuZCBhbmFseXNlcy4gQWx3YXlzIHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggdG9vbCBmb3IgZGV0YWlsZWQgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGFuZCBiZXN0IHByYWN0aWNlcy4K