Use MirMachine (Umu et al. 2022) to identify potential miRNA homologs in the P.meandrina genome.


Inputs:

  • Genome FastA.

Outputs:

  • Confidence-filtered GFF of predicted miRNAs.
  • Unfiltered FastA of predicted miRNAs.
  • Unfiltered GFF of predicted miRNAs.

Software requirements:

  • Requires a MirMachine Conda/Mamba environment, per the installation instructions.

1 Set R variables

Replace with name of your MirMachine environment and the path to the corresponding conda installation (find this after you’ve activated the environment).

E.g.

# Activate environment
conda activate ShortStack4_env

# Find conda path
which conda
mirmachine_conda_env_name <- c("mirmachine_env")
mirmachine_cond_path <- c("/home/sam/programs/mambaforge/condabin/conda")

2 Create a Bash variables file

This allows usage of Bash variables across R Markdown chunks.

{
echo "#### Assign Variables ####"
echo ""

echo "# Data directories"
echo 'export deep_dive_dir=/home/shared/8TB_HDD_02/shedurkin/deep-dive'
echo 'export output_dir_top=${deep_dive_dir}/F-Pmea/output/12-Pmea-sRNAseq-MirMachine'
echo ""

echo 'export mirmarchine_output_prefix="Pmea-MirMachine"'

echo "# Input/Output files"
echo 'export genome_fasta_dir=${deep_dive_dir}/F-Pmea/data/Pmea/'
echo 'export genome_fasta_name="Pocillopora_meandrina_HIv1.assembly.fasta"'
echo 'export genome_fasta="${genome_fasta_dir}/${genome_fasta_name}"'

echo ""

echo "# External data URLs"
echo 'export genome_fasta_url="http://cyanophora.rutgers.edu/Pocillopora_meandrina/Pocillopora_meandrina_HIv1.assembly.fasta.gz"'
echo ""

echo "# Set number of CPUs to use"
echo 'export threads=40'
echo ""
} > .bashvars

cat .bashvars
#### Assign Variables ####

# Data directories
export deep_dive_dir=/home/shared/8TB_HDD_02/shedurkin/deep-dive
export output_dir_top=${deep_dive_dir}/F-Pmea/output/12-Pmea-sRNAseq-MirMachine

export mirmarchine_output_prefix="Pmea-MirMachine"
# Input/Output files
export genome_fasta_dir=${deep_dive_dir}/F-Pmea/data/Pmea/
export genome_fasta_name="Pocillopora_meandrina_HIv1.assembly.fasta"
export genome_fasta="${genome_fasta_dir}/${genome_fasta_name}"

# External data URLs
export genome_fasta_url="http://cyanophora.rutgers.edu/Pocillopora_meandrina/Pocillopora_meandrina_HIv1.assembly.fasta.gz"

# Set number of CPUs to use
export threads=40

3 Load MirMachine conda environment

If this is successful, the first line of output should show that the Python being used is the one in your MirMachine conda environment path.

E.g.

python: /home/sam/programs/mambaforge/envs/mirmachine_env/bin/python

use_condaenv(condaenv = mirmachine_conda_env_name, conda = mirmachine_cond_path)

# Check successful env loading
py_config()
python:         /home/sam/programs/mambaforge/envs/mirmachine_env/bin/python
libpython:      /home/sam/programs/mambaforge/envs/mirmachine_env/lib/libpython3.10.so
pythonhome:     /home/sam/programs/mambaforge/envs/mirmachine_env:/home/sam/programs/mambaforge/envs/mirmachine_env
version:        3.10.12 | packaged by conda-forge | (main, Jun 23 2023, 22:40:32) [GCC 12.3.0]
numpy:          /home/sam/programs/mambaforge/envs/mirmachine_env/lib/python3.10/site-packages/numpy
numpy_version:  1.25.2

NOTE: Python version was forced by use_python() function

4 Download P.meandrina genome from Stevens et al. 2022 (linked in deep-dive repo) (http://cyanophora.rutgers.edu/Pocillopora_meandrina/Pocillopora_meandrina_HIv1.assembly.fasta.gz)

# Load bash variables into memory
source .bashvars

wget \
--directory-prefix ${genome_fasta_dir} \
--recursive \
--no-check-certificate \
--continue \
--no-host-directories \
--no-directories \
--no-parent \
--quiet \
--execute robots=off \
--accept "${genome_fasta_name}.gz,md5checksums.txt" ${genome_fasta_url}

ls -lh "${genome_fasta_dir}"
total 819M
-rw-r--r-- 1 shedurkin labmembers 360M Nov 30 07:59 Pocillopora_meandrina_HIv1.assembly.fa
-rw-r--r-- 1 shedurkin labmembers 360M May 23  2022 Pocillopora_meandrina_HIv1.assembly.fasta
-rw-r--r-- 1 shedurkin labmembers 101M May 23  2022 Pocillopora_meandrina_HIv1.assembly.fasta.gz

4.1 Verify genome FastA MD5 checksum

# Load bash variables into memory
source .bashvars

cd "${genome_fasta_dir}"

# Checksums file contains other files, so this just looks for the sRNAseq files.
grep "${genome_fasta_name}" md5checksums.txt | md5sum --check

4.2 Decompress FastA file

# Load bash variables into memory
source .bashvars

cd "${genome_fasta_dir}"

gunzip --keep "${genome_fasta_name}.gz"

ls -lth
gzip: Pocillopora_meandrina_HIv1.assembly.fasta already exists; not overwritten
total 819M
-rw-r--r-- 1 shedurkin labmembers 360M Nov 30 07:59 Pocillopora_meandrina_HIv1.assembly.fa
-rw-r--r-- 1 shedurkin labmembers 360M May 23  2022 Pocillopora_meandrina_HIv1.assembly.fasta
-rw-r--r-- 1 shedurkin labmembers 101M May 23  2022 Pocillopora_meandrina_HIv1.assembly.fasta.gz

5 Run MirMachine

The --species option specifies output naming structure

# Load bash variables into memory
source .bashvars

cd "${output_dir_top}"

time \
MirMachine.py \
--node Metazoa \
--species ${mirmarchine_output_prefix} \
--genome ${genome_fasta} \
--cpu 40 \
--add-all-nodes \
&> mirmachine.log

real    0m2.359s
user    0m1.902s
sys 0m0.483s

6 Results

6.1 View MirMachine output structure

# Load bash variables into memory
source .bashvars

tree -h ${output_dir_top}/results/predictions
/home/shared/8TB_HDD_02/shedurkin/deep-dive/F-Pmea/output/12-Pmea-sRNAseq-MirMachine/results/predictions
├── [4.0K]  fasta
│   └── [ 39K]  Pmea-MirMachine.PRE.fasta
├── [4.0K]  filtered_gff
│   └── [ 18K]  Pmea-MirMachine.PRE.gff
├── [4.0K]  gff
│   └── [ 75K]  Pmea-MirMachine.PRE.gff
└── [4.0K]  heatmap
    └── [ 30K]  Pmea-MirMachine.heatmap.csv

4 directories, 4 files

6.2 Check FastA

# Load bash variables into memory
source .bashvars

echo "Total number of predicted miRNAs (high & low confidence):"
grep --count "^>" "${output_dir_top}/results/predictions/fasta/${mirmarchine_output_prefix}.PRE.fasta"
echo ""
echo "----------------------------------------------------------------------------------"
echo ""

head "${output_dir_top}/results/predictions/fasta/${mirmarchine_output_prefix}.PRE.fasta"
Total number of predicted miRNAs (high & low confidence):
261

----------------------------------------------------------------------------------

>Iab-4.PRE_Pocillopora_meandrina_HIv1___Sc0000020_3039233_3039278_(-)_LOWconf
CAGTATACTTAAAGTATACTTTAAAGTATACTTTAAGTATACTTAG
>Mir-10.PRE_Pocillopora_meandrina_HIv1___Sc0000003_10366054_10366110_(+)_HIGHconf
AACCCGTAGATCCGAACTTGTGGGAATTTCTCACCACAGGTTCGTGTCTATGGTCCA
>Mir-1175.PRE_Pocillopora_meandrina_HIv1___Sc0000005_198860_198924_(+)_LOWconf
AGTTAAAGGTGTAATTTCTTACAGTGGGTAATATATATACTGTAAGATTTTACGCCTTTAATTAA
>Mir-124.PRE_Pocillopora_meandrina_HIv1___Sc0000040_962575_962635_(+)_LOWconf
AGGAGTCACTTAGGGCCTTATTCAAAATAATGTTTGGAATAAGGCCCTAGGTGACTCCTGA
>Mir-124.PRE_Pocillopora_meandrina_HIv1___Sc0000040_1120043_1120103_(+)_LOWconf
AGGAGTCACTTAGGGCCTTATTCAAAATAATGTTTGGAATAAGGCCCTAGGTGACTCCTGA

6.3 Check filtered GFF

Per MirMachine recommendations:

filtered_gff/ High confidence miRNA family predictions after bitscore filtering. (This file is what you need in most cases)

So, we’ll stick with that.

# Load bash variables into memory
source .bashvars

# Avoid 10th line - lengthy list of all miRNA families examined
head -n 9 "${output_dir_top}/results/predictions/filtered_gff/${mirmarchine_output_prefix}.PRE.gff"

echo ""
# Pull out lines that do _not_ begin with a '#'.
grep "^[^#]" "${output_dir_top}/results/predictions/filtered_gff/${mirmarchine_output_prefix}.PRE.gff" \
| head
##gff-version 3
# MirMachine version: 0.2.12
# CM Models: Built using MirGeneDB 2.1(2022)
# Total families searched: 556
# Node: Metazoa
# Model: combined
# Genome file: /home/shared/8TB_HDD_02/shedurkin/deep-dive/F-Pmea/data/Pmea//Pocillopora_meandrina_HIv1.assembly.fasta
# Species: Pmea-MirMachine
# Params: /home/sam/programs/mambaforge/envs/mirmachine_env/bin/MirMachine.py --node Metazoa --species Pmea-MirMachine --genome /home/shared/8TB_HDD_02/shedurkin/deep-dive/F-Pmea/data/Pmea//Pocillopora_meandrina_HIv1.assembly.fasta --cpu 40 --add-all-nodes

Pocillopora_meandrina_HIv1___Sc0000003  cmsearch    ncRNA   10366054    10366110    47.3    +   .   gene_id=Mir-10.PRE;E-value=2e-06;sequence_with_30nt=CAGTCACGGAAAGATCCAGCGGTTCATCTGAACCCGTAGATCCGAACTTGTGGGAATTTCTCACCACAGGTTCGTGTCTATGGTCCACGTGTACTGCATTACTACAATGAAACTTAA
Pocillopora_meandrina_HIv1___Sc0000000  cmsearch    ncRNA   10651117    10651192    35.4    +   .   gene_id=Mir-303.PRE;E-value=0.0081;sequence_with_30nt=GGTTTTTTAACTAATCTACACTTTTGACGCTCTACACTTTCAGAGAAGCCCAATTTCGTTACCAACGTTGGTTGGTAACGAAATTGGGCTTCTCTGAAATTTAGATCACAAAAAACAGCGTTTTTCCTTTTTCGTT
Pocillopora_meandrina_HIv1___Sc0000000  cmsearch    ncRNA   10655950    10656025    35.4    +   .   gene_id=Mir-303.PRE;E-value=0.0081;sequence_with_30nt=GGTTTTTTAACTAATCTACACTTTTGACGCTCTACACTTTCAGAGAAGCCCAATTTCGTTACCAACGTTGGTTGGTAACGAAATTGGGCTTCTCTGAAATTTAGATCACAAAAAACAGCGTTTTTCCTTTTTCGTT
Pocillopora_meandrina_HIv1___Sc0000000  cmsearch    ncRNA   10660782    10660857    35.4    +   .   gene_id=Mir-303.PRE;E-value=0.0081;sequence_with_30nt=GGTTTTTTAACTAATCTACACTTTTGACGCTCTACACTTTCAGAGAAGCCCAATTTCGTTACCAACGTTGGTTGGTAACGAAATTGGGCTTCTCTGAAATTTAGATCACAAAAAACAGCGTTTTTCCTTTTTCGTT
Pocillopora_meandrina_HIv1___Sc0000000  cmsearch    ncRNA   10666666    10666741    35.4    -   .   gene_id=Mir-303.PRE;E-value=0.0081;sequence_with_30nt=GGTTTTTTAACTAATCTACACTTTTGACGCTCTACACTTTCAGAGAAGCCCAATTTCGTTACCAACGTTGGTTGGTAACGAAATTGGGCTTCTCTGAAATTTAGATCACAAAAAACAGCGTTTTTCCTTTTTCGTT
Pocillopora_meandrina_HIv1___Sc0000003  cmsearch    ncRNA   15185321    15185383    39.1    +   .   gene_id=Mir-303.PRE;E-value=0.00083;sequence_with_30nt=TCTTCTTCTTCTTCTTCGAATGCTCAGACGATAGCTTCAGTGGAAATATGTTTGTTTACTTGTAAACAAACATATTTCCACTGAAGCATTTTTATCGGTCGTTTGATTGTTCTGTCTATTCTG
Pocillopora_meandrina_HIv1___Sc0000000  cmsearch    ncRNA   3084744 3084853 35.4    +   .   gene_id=Mir-9388.PRE;E-value=0.0088;sequence_with_30nt=ATAAGTACGTACGCATTCGTGCGGACTTACGTGCGTGCGTGCGTACATGCGTGCGTGTGTGCGTACATGCGTACGTGCGTGCGTGCGTACGCACGGATGTACGCACCTACGTACGCACGAATGTACGCACGTACGCATGCACGTGCGTACGTACGCATGTTTGTACGTAC
Pocillopora_meandrina_HIv1___Sc0000000  cmsearch    ncRNA   19092618    19092677    41.6    +   .   gene_id=Mir-9388.PRE;E-value=0.00021;sequence_with_30nt=GTATATATATACATGTATATGTATATATATGTGTGTGTATATATATATATATATATATATGTATGCATATGTATATATATACACACACACACACACACATATATATATACACCTGTTCAA
Pocillopora_meandrina_HIv1___Sc0000002  cmsearch    ncRNA   645851  645914  38.5    -   .   gene_id=Mir-9388.PRE;E-value=0.0014;sequence_with_30nt=ATATATATATATATATATACATATATACATATACATATACATATACATATATATACATATACATATGTATATATATGTATATGTATATGTATGTATATATATATATATATATATACATCTATGA
Pocillopora_meandrina_HIv1___Sc0000003  cmsearch    ncRNA   4966110 4966167 40.3    +   .   gene_id=Mir-9388.PRE;E-value=0.00048;sequence_with_30nt=TTCGCTCAATTCTATGACGAATTATGGGTGGTACGTACGTGCGTACGTATGCACGTACGTACGTGCGTACGTATGCACGTACGTACATGCGTTGTTTTTAGAGATCCGTTGTTACTTA

6.4 Counts of predicted high-confidence miRNAs

# Load bash variables into memory
source .bashvars

# Skip lines which begin with '#' (i.e. the header components)
echo "Predicted loci:"
grep -c "^[^#]" "${output_dir_top}/results/predictions/filtered_gff/${mirmarchine_output_prefix}.PRE.gff"

echo ""
echo "Unique miRNA families:"
grep "^[^#]" "${output_dir_top}/results/predictions/filtered_gff/${mirmarchine_output_prefix}.PRE.gff" \
| awk -F"[\t=;]" '{print $10}' \
| sort -u \
| wc -l
Predicted loci:
40

Unique miRNA families:
7

Citations

Umu, Sinan Uğur, Vanessa M. Paynter, Håvard Trondsen, Tilo Buschmann, Trine B. Rounge, Kevin J. Peterson, and Bastian Fromm. 2022. “Accurate microRNA Annotation of Animal Genomes Using Trained Covariance Models of Curated microRNA Complements in MirMachine.” http://dx.doi.org/10.1101/2022.11.23.517654.
LS0tCnRpdGxlOiAiMTItUG1lYS1zUk5Bc2VxLU1pck1hY2hpbmUiCmF1dGhvcjogIlNhbSBXaGl0ZSAobW9kaWZpZWQgYnkgSyBEdXJraW4gZm9yIFAuIG1lYW5kcmluYSBhbmFseXNpcykiCmRhdGU6ICIyMDIzLTExLTE2IgpvdXRwdXQ6IAogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCmJpYmxpb2dyYXBoeTogL2hvbWUvc2hhcmVkLzhUQl9IRERfMDIvc2hlZHVya2luL2RlZXAtZGl2ZS9ELUFwdWwvY29kZS9yZWZlcmVuY2VzLmJpYgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocmV0aWN1bGF0ZSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVjaG8gPSBUUlVFLCAgICAgICAgICMgRGlzcGxheSBjb2RlIGNodW5rcwogIGV2YWwgPSBGQUxTRSwgICAgICAgICMgRXZhbHVhdGUgY29kZSBjaHVua3MKICB3YXJuaW5nID0gRkFMU0UsICAgICAjIEhpZGUgd2FybmluZ3MKICBtZXNzYWdlID0gRkFMU0UsICAgICAjIEhpZGUgbWVzc2FnZXMKICBjb21tZW50ID0gIiIgICAgICAgICAjIFByZXZlbnRzIGFwcGVuZGluZyAnIyMnIHRvIGJlZ2lubmluZyBvZiBsaW5lcyBpbiBjb2RlIG91dHB1dAopCmBgYAoKVXNlIFtNaXJNYWNoaW5lXShodHRwczovL2dpdGh1Yi5jb20vc2luYW51Z3VyL01pck1hY2hpbmUpIFtAdW11MjAyMl0gdG8gaWRlbnRpZnkgcG90ZW50aWFsCm1pUk5BIGhvbW9sb2dzIGluIHRoZSBfUC5tZWFuZHJpbmFfIGdlbm9tZS4KCi0tLQoKSW5wdXRzOgoKLSBHZW5vbWUgRmFzdEEuCgpPdXRwdXRzOgoKLSBDb25maWRlbmNlLWZpbHRlcmVkIEdGRiBvZiBwcmVkaWN0ZWQgbWlSTkFzLgotIFVuZmlsdGVyZWQgRmFzdEEgb2YgcHJlZGljdGVkIG1pUk5Bcy4KLSBVbmZpbHRlcmVkIEdGRiBvZiBwcmVkaWN0ZWQgbWlSTkFzLgoKU29mdHdhcmUgcmVxdWlyZW1lbnRzOgoKLSBSZXF1aXJlcyBhIFtNaXJNYWNoaW5lXShodHRwczovL2dpdGh1Yi5jb20vc2luYW51Z3VyL01pck1hY2hpbmUpIENvbmRhL01hbWJhIGVudmlyb25tZW50LCBwZXIgdGhlIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCgotLS0KCiMgU2V0IFIgdmFyaWFibGVzClJlcGxhY2Ugd2l0aCBuYW1lIG9mIHlvdXIgTWlyTWFjaGluZSBlbnZpcm9ubWVudCBhbmQgdGhlIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcKY29uZGEgaW5zdGFsbGF0aW9uIChmaW5kIHRoaXMgX2FmdGVyXyB5b3UndmUgYWN0aXZhdGVkIHRoZSBlbnZpcm9ubWVudCkuCgpFLmcuIAoKYGBge3IgY29uZGEtZXZuLWV4YW1wbGUsIGV2YWw9RkFMU0V9CiMgQWN0aXZhdGUgZW52aXJvbm1lbnQKY29uZGEgYWN0aXZhdGUgU2hvcnRTdGFjazRfZW52CgojIEZpbmQgY29uZGEgcGF0aAp3aGljaCBjb25kYQpgYGAKYGBge3IgUi12YXJpYWJsZXMsIGV2YWw9VFJVRX0KbWlybWFjaGluZV9jb25kYV9lbnZfbmFtZSA8LSBjKCJtaXJtYWNoaW5lX2VudiIpCm1pcm1hY2hpbmVfY29uZF9wYXRoIDwtIGMoIi9ob21lL3NhbS9wcm9ncmFtcy9tYW1iYWZvcmdlL2NvbmRhYmluL2NvbmRhIikKYGBgCgoKIyBDcmVhdGUgYSBCYXNoIHZhcmlhYmxlcyBmaWxlCgpUaGlzIGFsbG93cyB1c2FnZSBvZiBCYXNoIHZhcmlhYmxlcyBhY3Jvc3MgUiBNYXJrZG93biBjaHVua3MuCgpgYGB7ciBzYXZlLWJhc2gtdmFyaWFibGVzLXRvLXJ2YXJzLWZpbGUsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KewplY2hvICIjIyMjIEFzc2lnbiBWYXJpYWJsZXMgIyMjIyIKZWNobyAiIgoKZWNobyAiIyBEYXRhIGRpcmVjdG9yaWVzIgplY2hvICdleHBvcnQgZGVlcF9kaXZlX2Rpcj0vaG9tZS9zaGFyZWQvOFRCX0hERF8wMi9zaGVkdXJraW4vZGVlcC1kaXZlJwplY2hvICdleHBvcnQgb3V0cHV0X2Rpcl90b3A9JHtkZWVwX2RpdmVfZGlyfS9GLVBtZWEvb3V0cHV0LzEyLVBtZWEtc1JOQXNlcS1NaXJNYWNoaW5lJwplY2hvICIiCgplY2hvICdleHBvcnQgbWlybWFyY2hpbmVfb3V0cHV0X3ByZWZpeD0iUG1lYS1NaXJNYWNoaW5lIicKCmVjaG8gIiMgSW5wdXQvT3V0cHV0IGZpbGVzIgplY2hvICdleHBvcnQgZ2Vub21lX2Zhc3RhX2Rpcj0ke2RlZXBfZGl2ZV9kaXJ9L0YtUG1lYS9kYXRhL1BtZWEvJwplY2hvICdleHBvcnQgZ2Vub21lX2Zhc3RhX25hbWU9IlBvY2lsbG9wb3JhX21lYW5kcmluYV9ISXYxLmFzc2VtYmx5LmZhc3RhIicKZWNobyAnZXhwb3J0IGdlbm9tZV9mYXN0YT0iJHtnZW5vbWVfZmFzdGFfZGlyfS8ke2dlbm9tZV9mYXN0YV9uYW1lfSInCgplY2hvICIiCgplY2hvICIjIEV4dGVybmFsIGRhdGEgVVJMcyIKZWNobyAnZXhwb3J0IGdlbm9tZV9mYXN0YV91cmw9Imh0dHA6Ly9jeWFub3Bob3JhLnJ1dGdlcnMuZWR1L1BvY2lsbG9wb3JhX21lYW5kcmluYS9Qb2NpbGxvcG9yYV9tZWFuZHJpbmFfSEl2MS5hc3NlbWJseS5mYXN0YS5neiInCmVjaG8gIiIKCmVjaG8gIiMgU2V0IG51bWJlciBvZiBDUFVzIHRvIHVzZSIKZWNobyAnZXhwb3J0IHRocmVhZHM9NDAnCmVjaG8gIiIKfSA+IC5iYXNodmFycwoKY2F0IC5iYXNodmFycwpgYGAKCiMgTG9hZCBbTWlyTWFjaGluZV0oaHR0cHM6Ly9naXRodWIuY29tL3NpbmFudWd1ci9NaXJNYWNoaW5lKSBjb25kYSBlbnZpcm9ubWVudAoKSWYgdGhpcyBpcyBzdWNjZXNzZnVsLCB0aGUgZmlyc3QgbGluZSBvZiBvdXRwdXQgc2hvdWxkIHNob3cgdGhhdCB0aGUgUHl0aG9uIGJlaW5nIHVzZWQKaXMgdGhlIG9uZSBpbiB5b3VyIFtNaXJNYWNoaW5lXShodHRwczovL2dpdGh1Yi5jb20vc2luYW51Z3VyL01pck1hY2hpbmUpIGNvbmRhIGVudmlyb25tZW50IHBhdGguCgpFLmcuCgpgcHl0aG9uOiAgICAgICAgIC9ob21lL3NhbS9wcm9ncmFtcy9tYW1iYWZvcmdlL2VudnMvbWlybWFjaGluZV9lbnYvYmluL3B5dGhvbmAKYGBge3IgbG9hZC1taXJtYWNoaW5lLWNvbmRhLWVudiwgZXZhbD1UUlVFfQp1c2VfY29uZGFlbnYoY29uZGFlbnYgPSBtaXJtYWNoaW5lX2NvbmRhX2Vudl9uYW1lLCBjb25kYSA9IG1pcm1hY2hpbmVfY29uZF9wYXRoKQoKIyBDaGVjayBzdWNjZXNzZnVsIGVudiBsb2FkaW5nCnB5X2NvbmZpZygpCmBgYAoKIyBEb3dubG9hZCBfUC5tZWFuZHJpbmFfIGdlbm9tZSBmcm9tIFN0ZXZlbnMgZXQgYWwuIDIwMjIgKGxpbmtlZCBpbiBkZWVwLWRpdmUgcmVwbykgKGBodHRwOi8vY3lhbm9waG9yYS5ydXRnZXJzLmVkdS9Qb2NpbGxvcG9yYV9tZWFuZHJpbmEvUG9jaWxsb3BvcmFfbWVhbmRyaW5hX0hJdjEuYXNzZW1ibHkuZmFzdGEuZ3pgKQpgYGB7ciBkb3dubG9hZC1QbWVhLWdlbm9tZS1mYXN0YSwgZW5naW5lPSdiYXNoJywgZXZhbD1UUlVFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKd2dldCBcCi0tZGlyZWN0b3J5LXByZWZpeCAke2dlbm9tZV9mYXN0YV9kaXJ9IFwKLS1yZWN1cnNpdmUgXAotLW5vLWNoZWNrLWNlcnRpZmljYXRlIFwKLS1jb250aW51ZSBcCi0tbm8taG9zdC1kaXJlY3RvcmllcyBcCi0tbm8tZGlyZWN0b3JpZXMgXAotLW5vLXBhcmVudCBcCi0tcXVpZXQgXAotLWV4ZWN1dGUgcm9ib3RzPW9mZiBcCi0tYWNjZXB0ICIke2dlbm9tZV9mYXN0YV9uYW1lfS5neixtZDVjaGVja3N1bXMudHh0IiAke2dlbm9tZV9mYXN0YV91cmx9CgpscyAtbGggIiR7Z2Vub21lX2Zhc3RhX2Rpcn0iCmBgYAoKCiMjIFZlcmlmeSBnZW5vbWUgRmFzdEEgTUQ1IGNoZWNrc3VtCmBgYHtyIHZlcmlmeS1nZW5vbWUtZmFzdGEtY2hlY2tzdW0sIGVuZ2luZT0nYmFzaCcsIGV2YWw9RkFMU0V9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgpjZCAiJHtnZW5vbWVfZmFzdGFfZGlyfSIKCiMgQ2hlY2tzdW1zIGZpbGUgY29udGFpbnMgb3RoZXIgZmlsZXMsIHNvIHRoaXMganVzdCBsb29rcyBmb3IgdGhlIHNSTkFzZXEgZmlsZXMuCmdyZXAgIiR7Z2Vub21lX2Zhc3RhX25hbWV9IiBtZDVjaGVja3N1bXMudHh0IHwgbWQ1c3VtIC0tY2hlY2sKYGBgCgojIyBEZWNvbXByZXNzIEZhc3RBIGZpbGUKYGBge3IgZGVjb21wcmVzcy1GYXN0QSwgZW5naW5lPSdiYXNoJywgZXZhbD1UUlVFfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKY2QgIiR7Z2Vub21lX2Zhc3RhX2Rpcn0iCgpndW56aXAgLS1rZWVwICIke2dlbm9tZV9mYXN0YV9uYW1lfS5neiIKCmxzIC1sdGgKYGBgCgoKIyBSdW4gW01pck1hY2hpbmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5hbnVndXIvTWlyTWFjaGluZSkKClRoZSBgLS1zcGVjaWVzYCBvcHRpb24gc3BlY2lmaWVzIG91dHB1dCBuYW1pbmcgc3RydWN0dXJlCmBgYHtyIG1pcm1hY2hpbmUsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KIyBMb2FkIGJhc2ggdmFyaWFibGVzIGludG8gbWVtb3J5CnNvdXJjZSAuYmFzaHZhcnMKCmNkICIke291dHB1dF9kaXJfdG9wfSIKCnRpbWUgXApNaXJNYWNoaW5lLnB5IFwKLS1ub2RlIE1ldGF6b2EgXAotLXNwZWNpZXMgJHttaXJtYXJjaGluZV9vdXRwdXRfcHJlZml4fSBcCi0tZ2Vub21lICR7Z2Vub21lX2Zhc3RhfSBcCi0tY3B1IDQwIFwKLS1hZGQtYWxsLW5vZGVzIFwKJj4gbWlybWFjaGluZS5sb2cKYGBgCgojIFJlc3VsdHMKCiMjIFZpZXcgW01pck1hY2hpbmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5hbnVndXIvTWlyTWFjaGluZSkgb3V0cHV0IHN0cnVjdHVyZQpgYGB7ciBtaXJtYWNoaW5lLW91dHB1dC10cmVlLCBldmFsPVRSVUUsIGVuZ2luZT0nYmFzaCd9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgp0cmVlIC1oICR7b3V0cHV0X2Rpcl90b3B9L3Jlc3VsdHMvcHJlZGljdGlvbnMKYGBgCgojIyBDaGVjayBGYXN0QQpgYGB7ciBjaGVjay1taXJtYWNoaW5lLWZhc3RhLCBldmFsPVRSVUUsIGVuZ2luZT0nYmFzaCd9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgplY2hvICJUb3RhbCBudW1iZXIgb2YgcHJlZGljdGVkIG1pUk5BcyAoaGlnaCAmIGxvdyBjb25maWRlbmNlKToiCmdyZXAgLS1jb3VudCAiXj4iICIke291dHB1dF9kaXJfdG9wfS9yZXN1bHRzL3ByZWRpY3Rpb25zL2Zhc3RhLyR7bWlybWFyY2hpbmVfb3V0cHV0X3ByZWZpeH0uUFJFLmZhc3RhIgplY2hvICIiCmVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCmVjaG8gIiIKCmhlYWQgIiR7b3V0cHV0X2Rpcl90b3B9L3Jlc3VsdHMvcHJlZGljdGlvbnMvZmFzdGEvJHttaXJtYXJjaGluZV9vdXRwdXRfcHJlZml4fS5QUkUuZmFzdGEiCmBgYAojIyBDaGVjayBmaWx0ZXJlZCBHRkYKUGVyIFtNaXJNYWNoaW5lXShodHRwczovL2dpdGh1Yi5jb20vc2luYW51Z3VyL01pck1hY2hpbmUpIHJlY29tbWVuZGF0aW9uczoKCj4gYGZpbHRlcmVkX2dmZi9gIEhpZ2ggY29uZmlkZW5jZSBtaVJOQSBmYW1pbHkgcHJlZGljdGlvbnMgYWZ0ZXIgYml0c2NvcmUgZmlsdGVyaW5nLiAoVGhpcyBmaWxlIGlzIHdoYXQgeW91IG5lZWQgaW4gbW9zdCBjYXNlcykKClNvLCB3ZSdsbCBzdGljayB3aXRoIHRoYXQuCmBgYHtyIGNoZWNrLWZpbHRlcmVkLWdmZiwgZXZhbD1UUlVFLCBlbmdpbmU9J2Jhc2gnfQojIExvYWQgYmFzaCB2YXJpYWJsZXMgaW50byBtZW1vcnkKc291cmNlIC5iYXNodmFycwoKIyBBdm9pZCAxMHRoIGxpbmUgLSBsZW5ndGh5IGxpc3Qgb2YgYWxsIG1pUk5BIGZhbWlsaWVzIGV4YW1pbmVkCmhlYWQgLW4gOSAiJHtvdXRwdXRfZGlyX3RvcH0vcmVzdWx0cy9wcmVkaWN0aW9ucy9maWx0ZXJlZF9nZmYvJHttaXJtYXJjaGluZV9vdXRwdXRfcHJlZml4fS5QUkUuZ2ZmIgoKZWNobyAiIgojIFB1bGwgb3V0IGxpbmVzIHRoYXQgZG8gX25vdF8gYmVnaW4gd2l0aCBhICcjJy4KZ3JlcCAiXlteI10iICIke291dHB1dF9kaXJfdG9wfS9yZXN1bHRzL3ByZWRpY3Rpb25zL2ZpbHRlcmVkX2dmZi8ke21pcm1hcmNoaW5lX291dHB1dF9wcmVmaXh9LlBSRS5nZmYiIFwKfCBoZWFkCgpgYGAKCiMjIENvdW50cyBvZiBwcmVkaWN0ZWQgaGlnaC1jb25maWRlbmNlIG1pUk5BcwpgYGB7ciBjb3VudC1wcmVkaWN0ZWQtaGMtbWlybmFzLCBldmFsPVRSVUUsIGVuZ2luZT0nYmFzaCd9CiMgTG9hZCBiYXNoIHZhcmlhYmxlcyBpbnRvIG1lbW9yeQpzb3VyY2UgLmJhc2h2YXJzCgojIFNraXAgbGluZXMgd2hpY2ggYmVnaW4gd2l0aCAnIycgKGkuZS4gdGhlIGhlYWRlciBjb21wb25lbnRzKQplY2hvICJQcmVkaWN0ZWQgbG9jaToiCmdyZXAgLWMgIl5bXiNdIiAiJHtvdXRwdXRfZGlyX3RvcH0vcmVzdWx0cy9wcmVkaWN0aW9ucy9maWx0ZXJlZF9nZmYvJHttaXJtYXJjaGluZV9vdXRwdXRfcHJlZml4fS5QUkUuZ2ZmIgoKZWNobyAiIgplY2hvICJVbmlxdWUgbWlSTkEgZmFtaWxpZXM6IgpncmVwICJeW14jXSIgIiR7b3V0cHV0X2Rpcl90b3B9L3Jlc3VsdHMvcHJlZGljdGlvbnMvZmlsdGVyZWRfZ2ZmLyR7bWlybWFyY2hpbmVfb3V0cHV0X3ByZWZpeH0uUFJFLmdmZiIgXAp8IGF3ayAtRiJbXHQ9O10iICd7cHJpbnQgJDEwfScgXAp8IHNvcnQgLXUgXAp8IHdjIC1sCmBgYAoKLS0tCgojIENpdGF0aW9ucwo=