0.1 intersectBed

Examine our input files (intersectBed accepts .bed and .gff files)

head -5 ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_10_16/novel_mature_22_04_2024_t_15_10_16_score-50_to_na.bed
echo ""
head -5 ../output/08.2-Peve-sRNAseq-ShortStack-31bp-fastp-merged/ShortStack_out/Results.gff3
browser position 
browser hide all
track name="notTrackname.novel_miRNAs" description="novel miRNAs detected by miRDeep2 for notTrackname" visibility=2
itemRgb="On";
Porites_evermani_scaffold_1503  46899   46921   Porites_evermani_scaffold_1503_530575   110319.9    +   46899   46921   255,0,0

Porites_evermani_scaffold_1 ShortStack  Unknown_sRNA_locus  45711   46131   88  +   .   ID=Cluster_1;DicerCall=N;MIRNA=N
Porites_evermani_scaffold_1 ShortStack  Unknown_sRNA_locus  201507  201931  58  -   .   ID=Cluster_2;DicerCall=N;MIRNA=N
Porites_evermani_scaffold_1 ShortStack  Unknown_sRNA_locus  313446  313846  50  -   .   ID=Cluster_3;DicerCall=N;MIRNA=N
Porites_evermani_scaffold_1 ShortStack  Unknown_sRNA_locus  406146  406734  175 -   .   ID=Cluster_4;DicerCall=N;MIRNA=N
Porites_evermani_scaffold_1 ShortStack  Unknown_sRNA_locus  409839  410269  169 -   .   ID=Cluster_5;DicerCall=N;MIRNA=N

We need to get two input files that contain only mature miRNAs and are correctly formatted. That means we need to remove the header lines of the miRdeep2 mature miRNAs file, and the ShortStack full results file needs to be filtered.

# remove header lines
tail -n +5 ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_10_16/novel_mature_22_04_2024_t_15_10_16_score-50_to_na.bed > ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_10_16/novel_mature_22_04_2024_t_15_10_16_score-50_to_na._formatted.bed

# filter full results to obtain a gff file of only the mature miRNAs
awk -F'\t' '$3 == "mature_miRNA"' ../output/08.2-Peve-sRNAseq-ShortStack-31bp-fastp-merged/ShortStack_out/Results.gff3 > ../output/08.2-Peve-sRNAseq-ShortStack-31bp-fastp-merged/ShortStack_out/Results_mature.gff3

Check the files

head -5 ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_10_16/novel_mature_22_04_2024_t_15_10_16_score-50_to_na._formatted.bed
echo ""
head -5 ../output/08.2-Peve-sRNAseq-ShortStack-31bp-fastp-merged/ShortStack_out/Results_mature.gff3
Porites_evermani_scaffold_1503  46899   46921   Porites_evermani_scaffold_1503_530575   110319.9    +   46899   46921   255,0,0
Porites_evermani_scaffold_26    382571  382593  Porites_evermani_scaffold_26_42156  46827.4 -   382571  382593  0,0,255
Porites_evermani_scaffold_910   118741  118762  Porites_evermani_scaffold_910_418426    43145.7 +   118741  118762  255,0,0
Porites_evermani_scaffold_72    198220  198245  Porites_evermani_scaffold_72_87796  31859.5 +   198220  198245  255,0,0
Porites_evermani_scaffold_1503  47610   47632   Porites_evermani_scaffold_1503_530579   27800.7 +   47610   47632   255,0,0

Porites_evermani_scaffold_1 ShortStack  mature_miRNA    1404272 1404293 3403    -   .   ID=Cluster_29.mature;Parent=Cluster_29
Porites_evermani_scaffold_16    ShortStack  mature_miRNA    383437  383458  1456    -   .   ID=Cluster_578.mature;Parent=Cluster_578
Porites_evermani_scaffold_26    ShortStack  mature_miRNA    382572  382593  69226   -   .   ID=Cluster_786.mature;Parent=Cluster_786
Porites_evermani_scaffold_47    ShortStack  mature_miRNA    475994  476015  240 -   .   ID=Cluster_1125.mature;Parent=Cluster_1125
Porites_evermani_scaffold_49    ShortStack  mature_miRNA    151640  151661  35368   -   .   ID=Cluster_1153.mature;Parent=Cluster_1153

Looks good! Now we can input into intersectBed.

# intersectBed to ID sequences in the miRdeep2 mature miRNA output that match mature miRNAs ID'd by ShortStack
# -wa and -wb ensure we recieve full annotations from both input files in the output
/home/shared/bedtools2/bin/intersectBed \
-wa \
-wb \
-a ../output/08.2-Peve-sRNAseq-ShortStack-31bp-fastp-merged/ShortStack_out/Results_mature.gff3 \
-b ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/mirna_results_22_04_2024_t_15_10_16/novel_mature_22_04_2024_t_15_10_16_score-50_to_na._formatted.bed \
&> ../output/17-Peve-ShortStack-miRdeep2-comparison/ShortStack_miRdeep2_mature_intersect.bed

0.2 Results

echo "Number of ShortStack mature miRNAs:"
wc -l < ../output/08.2-Peve-sRNAseq-ShortStack-31bp-fastp-merged/ShortStack_out/Results_mature.gff3
echo ""
echo "Number of ShortStack mature miRNAs also identified by miRdeep2:"
wc -l < ../output/17-Peve-ShortStack-miRdeep2-comparison/ShortStack_miRdeep2_mature_intersect.bed
Number of ShortStack mature miRNAs:
46

Number of ShortStack mature miRNAs also identified by miRdeep2:
30

While looking through the output file I noticed that two of the intersects originate from the same cluster… not really sure what that’s about…

head -9 ../output/17-Peve-ShortStack-miRdeep2-comparison/ShortStack_miRdeep2_mature_intersect.bed | tail -2
Porites_evermani_scaffold_334   ShortStack  mature_miRNA    153605  153626  142 -   .   ID=Cluster_4722.mature;Parent=Cluster_4722  Porites_evermani_scaffold_334   153606  153626  Porites_evermani_scaffold_334_234019    5.6 -   153606  153626  0,0,255
Porites_evermani_scaffold_334   ShortStack  mature_miRNA    153605  153626  142 -   .   ID=Cluster_4722.mature;Parent=Cluster_4722  Porites_evermani_scaffold_334   153605  153625  Porites_evermani_scaffold_334_233889    5.5 +   153605  153625  255,0,0

It looks like they have pretty much identical entries (cluster, coordinates, etc.), except the end of the miRdeep locus name (Porites_evermani_scaffold_334_234019 vs Porites_evermani_scaffold_334_233889) and the miRdeep2 “score” value assigned to them (this is the column following the miRdeep2 locus name, 5.6 vs 5.1). We can also check these two loci in the full miRdeep2 output.


# View full mirdeep2 output for these two loci
awk -F'\t' '$1 == "Porites_evermani_scaffold_334_234019"' ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv
echo""
awk -F'\t' '$1 == "Porites_evermani_scaffold_334_233889"' ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv

echo""
echo""

echo "mature miRNA sequences for these two loci:"
awk -F'\t' '$1 == "Porites_evermani_scaffold_334_234019"' ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv | awk '{print $13}'

awk -F'\t' '$1 == "Porites_evermani_scaffold_334_233889"' ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv | awk '{print $13}'

echo ""
echo ""

echo "miRNA* sequences for these two loci:"
awk -F'\t' '$1 == "Porites_evermani_scaffold_334_234019"' ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv | awk '{print $14}'

awk -F'\t' '$1 == "Porites_evermani_scaffold_334_233889"' ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv | awk '{print $14}'

echo ""
echo ""

echo "precursor miRNA sequences for these two loci:"
awk -F'\t' '$1 == "Porites_evermani_scaffold_334_234019"' ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv | awk '{print $15}'

awk -F'\t' '$1 == "Porites_evermani_scaffold_334_233889"' ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv | awk '{print $15}'
Porites_evermani_scaffold_334_234019    5.6     -   969 686 0   283 yes -   gga-miR-12259-5p_MIMAT0050009_Gallus_gallus_miR-12259-5p    -   -   ugcagguacaguuauaaggu    accuuauaacuguaccugccaa  ugcagguacaguuauaagguccccuugguggaccuuauaacuguaccugccaa   Porites_evermani_scaffold_334:153573..153626:-

Porites_evermani_scaffold_334_233889    5.5     -   111 96  0   15  yes -   cpi-miR-9592-5p_MIMAT0037980_Chrysemys_picta_miR-9592-5p    -   -   gaccuuauaacuguaccugc    gcagguacaguuauaaggucc   gcagguacaguuauaagguccaccaaggggaccuuauaacuguaccugc   Porites_evermani_scaffold_334:153576..153625:+


mature miRNA sequences for these two loci:
ugcagguacaguuauaaggu
gaccuuauaacuguaccugc


miRNA* sequences for these two loci:
accuuauaacuguaccugccaa
gcagguacaguuauaaggucc


precursor miRNA sequences for these two loci:
ugcagguacaguuauaagguccccuugguggaccuuauaacuguaccugccaa
gcagguacaguuauaagguccaccaaggggaccuuauaacuguaccugc

Interesting… The two loci have very similar precursor sequences and reversed mature and star sequences! In other words, the mature miRNA sequence for Porites_evermani_scaffold_334_234019 is almost identical to the miRNA* sequence of Porites_evermani_scaffold_334_233889, and vice versa! I’m not exactly sure what this means though… is miRdeep2 just incorrectly distinguishing the mature and star sequences for one of these loci?

Let’s set that aside for now and do some quick investigation of the miRdeep2 evaluation criteria for all of these ShortStack/miRdeep2 shared miRNAs. This could give us an idea of what thresholds may be appropriate for filtering the miRdeep2 output.

mirdeepIDs=$(awk '{print $13}' ../output/17-Peve-ShortStack-miRdeep2-comparison/ShortStack_miRdeep2_mature_intersect.bed)

head -1 ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv > ../output/17-Peve-ShortStack-miRdeep2-comparison/intersect_miRdeep2_stats.txt
while IFS= read -r id; do
  # Use awk to process fileA and match column 1 with the current ID
  awk -F'\t' -v id="$id" '$1 == id {print}' ../output/11.1-Peve-sRNAseq-miRdeep2-31bp-fastp-merged-cnidarian_miRBase/parsable-result_22_04_2024_t_15_10_16.csv
done <<< "$mirdeepIDs" >> ../output/17-Peve-ShortStack-miRdeep2-comparison/intersect_miRdeep2_stats.txt
intersect_miRdeep2_stats <- read.csv("../output/17-Peve-ShortStack-miRdeep2-comparison/intersect_miRdeep2_stats.txt", sep="\t")

intersect_miRdeep2_stats %>% 
  select(miRDeep2.score, significant.randfold.p.value) %>% 
  arrange(desc(miRDeep2.score)) %>%
  kable()
miRDeep2.score significant.randfold.p.value
46827.4 yes
43145.7 yes
22726.6 yes
17914.4 yes
16354.3 yes
13472.1 yes
6732.5 yes
4846.3 yes
3020.5 yes
2121.3 yes
2121.2 yes
1893.3 yes
1686.5 yes
1635.5 yes
1553.3 yes
1455.3 yes
1371.1 yes
1205.2 yes
998.8 yes
861.7 yes
468.6 yes
204.7 yes
184.6 yes
182.4 yes
5.6 yes
5.5 yes
5.5 yes
5.1 yes
4.4 yes
0.4 yes

The miRdeep2 score is “the log-odds score assigned to the hairpin” and is essentially a probability that the locus is a miRNA (presumably based on the hairpin structure) on, with higher values indicating higher probability. MiRdeep2’s default score threshold for miRNA classification is 0, but coral miRNA papers we’ve seen use myriad thresholds (e.g., 4, 10).

The randfold is also an evaluation of ncrna secondary structure, and we want a significant randfold value (this would indicate high likelihood of miRNA precursory structure)

25 out of 30 shared miRNAs have miRdeep2 scores >10, and all 30 have significant randfold p-values, which is good support for using these thresholds.

LS0tCnRpdGxlOiAiMTctUGV2ZS1TaG9ydFN0YWNrLW1pUmRlZXAyLWNvbXBhcmlzb24iCmF1dGhvcjogIkthdGhsZWVuIER1cmtpbiIKZGF0ZTogIjIwMjQtMDUtMTciCm91dHB1dDogCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOgogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZHBseXIpCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwgICAgICAgICAjIERpc3BsYXkgY29kZSBjaHVua3MKICBldmFsID0gRkFMU0UsICAgICAgICAjIEV2YWx1YXRlIGNvZGUgY2h1bmtzCiAgd2FybmluZyA9IEZBTFNFLCAgICAgIyBIaWRlIHdhcm5pbmdzCiAgbWVzc2FnZSA9IEZBTFNFLCAgICAgIyBIaWRlIG1lc3NhZ2VzCiAgY29tbWVudCA9ICIiICAgICAgICAgIyBQcmV2ZW50cyBhcHBlbmRpbmcgJyMjJyB0byBiZWdpbm5pbmcgb2YgbGluZXMgaW4gY29kZSBvdXRwdXQKKQpgYGAKCiMjIGludGVyc2VjdEJlZAoKRXhhbWluZSBvdXIgaW5wdXQgZmlsZXMgKGludGVyc2VjdEJlZCBhY2NlcHRzIC5iZWQgYW5kIC5nZmYgZmlsZXMpCgpgYGB7ciB2aWV3LU9HLWlucHV0LWZpbGVzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CmhlYWQgLTUgLi4vb3V0cHV0LzExLjEtUGV2ZS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL21pcm5hX3Jlc3VsdHNfMjJfMDRfMjAyNF90XzE1XzEwXzE2L25vdmVsX21hdHVyZV8yMl8wNF8yMDI0X3RfMTVfMTBfMTZfc2NvcmUtNTBfdG9fbmEuYmVkCmVjaG8gIiIKaGVhZCAtNSAuLi9vdXRwdXQvMDguMi1QZXZlLXNSTkFzZXEtU2hvcnRTdGFjay0zMWJwLWZhc3RwLW1lcmdlZC9TaG9ydFN0YWNrX291dC9SZXN1bHRzLmdmZjMKYGBgCgpXZSBuZWVkIHRvIGdldCB0d28gaW5wdXQgZmlsZXMgdGhhdCBjb250YWluIG9ubHkgbWF0dXJlIG1pUk5BcyBhbmQgYXJlIGNvcnJlY3RseSBmb3JtYXR0ZWQuIFRoYXQgbWVhbnMgd2UgbmVlZCB0byByZW1vdmUgdGhlIGhlYWRlciBsaW5lcyBvZiB0aGUgbWlSZGVlcDIgbWF0dXJlIG1pUk5BcyBmaWxlLCBhbmQgdGhlIFNob3J0U3RhY2sgZnVsbCByZXN1bHRzIGZpbGUgbmVlZHMgdG8gYmUgZmlsdGVyZWQuCgpgYGB7ciBwcmVwLWlucHV0LWZpbGVzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CiMgcmVtb3ZlIGhlYWRlciBsaW5lcwp0YWlsIC1uICs1IC4uL291dHB1dC8xMS4xLVBldmUtc1JOQXNlcS1taVJkZWVwMi0zMWJwLWZhc3RwLW1lcmdlZC1jbmlkYXJpYW5fbWlSQmFzZS9taXJuYV9yZXN1bHRzXzIyXzA0XzIwMjRfdF8xNV8xMF8xNi9ub3ZlbF9tYXR1cmVfMjJfMDRfMjAyNF90XzE1XzEwXzE2X3Njb3JlLTUwX3RvX25hLmJlZCA+IC4uL291dHB1dC8xMS4xLVBldmUtc1JOQXNlcS1taVJkZWVwMi0zMWJwLWZhc3RwLW1lcmdlZC1jbmlkYXJpYW5fbWlSQmFzZS9taXJuYV9yZXN1bHRzXzIyXzA0XzIwMjRfdF8xNV8xMF8xNi9ub3ZlbF9tYXR1cmVfMjJfMDRfMjAyNF90XzE1XzEwXzE2X3Njb3JlLTUwX3RvX25hLl9mb3JtYXR0ZWQuYmVkCgojIGZpbHRlciBmdWxsIHJlc3VsdHMgdG8gb2J0YWluIGEgZ2ZmIGZpbGUgb2Ygb25seSB0aGUgbWF0dXJlIG1pUk5Bcwphd2sgLUYnXHQnICckMyA9PSAibWF0dXJlX21pUk5BIicgLi4vb3V0cHV0LzA4LjItUGV2ZS1zUk5Bc2VxLVNob3J0U3RhY2stMzFicC1mYXN0cC1tZXJnZWQvU2hvcnRTdGFja19vdXQvUmVzdWx0cy5nZmYzID4gLi4vb3V0cHV0LzA4LjItUGV2ZS1zUk5Bc2VxLVNob3J0U3RhY2stMzFicC1mYXN0cC1tZXJnZWQvU2hvcnRTdGFja19vdXQvUmVzdWx0c19tYXR1cmUuZ2ZmMwpgYGAKCkNoZWNrIHRoZSBmaWxlcwoKYGBge3Igdmlldy1wcmVwcGVkLWlucHV0LWZpbGVzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CmhlYWQgLTUgLi4vb3V0cHV0LzExLjEtUGV2ZS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL21pcm5hX3Jlc3VsdHNfMjJfMDRfMjAyNF90XzE1XzEwXzE2L25vdmVsX21hdHVyZV8yMl8wNF8yMDI0X3RfMTVfMTBfMTZfc2NvcmUtNTBfdG9fbmEuX2Zvcm1hdHRlZC5iZWQKZWNobyAiIgpoZWFkIC01IC4uL291dHB1dC8wOC4yLVBldmUtc1JOQXNlcS1TaG9ydFN0YWNrLTMxYnAtZmFzdHAtbWVyZ2VkL1Nob3J0U3RhY2tfb3V0L1Jlc3VsdHNfbWF0dXJlLmdmZjMKYGBgCgpMb29rcyBnb29kISBOb3cgd2UgY2FuIGlucHV0IGludG8gaW50ZXJzZWN0QmVkLgoKYGBge3IgaW50ZXJzZWN0QmVkLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CiMgaW50ZXJzZWN0QmVkIHRvIElEIHNlcXVlbmNlcyBpbiB0aGUgbWlSZGVlcDIgbWF0dXJlIG1pUk5BIG91dHB1dCB0aGF0IG1hdGNoIG1hdHVyZSBtaVJOQXMgSUQnZCBieSBTaG9ydFN0YWNrCiMgLXdhIGFuZCAtd2IgZW5zdXJlIHdlIHJlY2lldmUgZnVsbCBhbm5vdGF0aW9ucyBmcm9tIGJvdGggaW5wdXQgZmlsZXMgaW4gdGhlIG91dHB1dAovaG9tZS9zaGFyZWQvYmVkdG9vbHMyL2Jpbi9pbnRlcnNlY3RCZWQgXAotd2EgXAotd2IgXAotYSAuLi9vdXRwdXQvMDguMi1QZXZlLXNSTkFzZXEtU2hvcnRTdGFjay0zMWJwLWZhc3RwLW1lcmdlZC9TaG9ydFN0YWNrX291dC9SZXN1bHRzX21hdHVyZS5nZmYzIFwKLWIgLi4vb3V0cHV0LzExLjEtUGV2ZS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL21pcm5hX3Jlc3VsdHNfMjJfMDRfMjAyNF90XzE1XzEwXzE2L25vdmVsX21hdHVyZV8yMl8wNF8yMDI0X3RfMTVfMTBfMTZfc2NvcmUtNTBfdG9fbmEuX2Zvcm1hdHRlZC5iZWQgXAomPiAuLi9vdXRwdXQvMTctUGV2ZS1TaG9ydFN0YWNrLW1pUmRlZXAyLWNvbXBhcmlzb24vU2hvcnRTdGFja19taVJkZWVwMl9tYXR1cmVfaW50ZXJzZWN0LmJlZAoKYGBgCgojIyBSZXN1bHRzCgpgYGB7ciBjb3VudC1pbnRlcnNlY3RzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CmVjaG8gIk51bWJlciBvZiBTaG9ydFN0YWNrIG1hdHVyZSBtaVJOQXM6Igp3YyAtbCA8IC4uL291dHB1dC8wOC4yLVBldmUtc1JOQXNlcS1TaG9ydFN0YWNrLTMxYnAtZmFzdHAtbWVyZ2VkL1Nob3J0U3RhY2tfb3V0L1Jlc3VsdHNfbWF0dXJlLmdmZjMKZWNobyAiIgplY2hvICJOdW1iZXIgb2YgU2hvcnRTdGFjayBtYXR1cmUgbWlSTkFzIGFsc28gaWRlbnRpZmllZCBieSBtaVJkZWVwMjoiCndjIC1sIDwgLi4vb3V0cHV0LzE3LVBldmUtU2hvcnRTdGFjay1taVJkZWVwMi1jb21wYXJpc29uL1Nob3J0U3RhY2tfbWlSZGVlcDJfbWF0dXJlX2ludGVyc2VjdC5iZWQKYGBgCgpXaGlsZSBsb29raW5nIHRocm91Z2ggdGhlIG91dHB1dCBmaWxlIEkgbm90aWNlZCB0aGF0IHR3byBvZiB0aGUgaW50ZXJzZWN0cyBvcmlnaW5hdGUgZnJvbSB0aGUgc2FtZSBjbHVzdGVyLi4uIG5vdCByZWFsbHkgc3VyZSB3aGF0IHRoYXQncyBhYm91dC4uLgoKYGBge3IsIGVuZ2luZT0nYmFzaCcsIGV2YWw9VFJVRX0KaGVhZCAtOSAuLi9vdXRwdXQvMTctUGV2ZS1TaG9ydFN0YWNrLW1pUmRlZXAyLWNvbXBhcmlzb24vU2hvcnRTdGFja19taVJkZWVwMl9tYXR1cmVfaW50ZXJzZWN0LmJlZCB8IHRhaWwgLTIKYGBgCgpJdCBsb29rcyBsaWtlIHRoZXkgaGF2ZSBwcmV0dHkgbXVjaCBpZGVudGljYWwgZW50cmllcyAoY2x1c3RlciwgY29vcmRpbmF0ZXMsIGV0Yy4pLCBleGNlcHQgdGhlIGVuZCBvZiB0aGUgbWlSZGVlcCBsb2N1cyBuYW1lIChQb3JpdGVzX2V2ZXJtYW5pX3NjYWZmb2xkXzMzNF8yMzQwMTkgdnMgUG9yaXRlc19ldmVybWFuaV9zY2FmZm9sZF8zMzRfMjMzODg5KSBhbmQgdGhlIG1pUmRlZXAyICJzY29yZSIgdmFsdWUgYXNzaWduZWQgdG8gdGhlbSAodGhpcyBpcyB0aGUgY29sdW1uIGZvbGxvd2luZyB0aGUgbWlSZGVlcDIgbG9jdXMgbmFtZSwgNS42IHZzIDUuMSkuIFdlIGNhbiBhbHNvIGNoZWNrIHRoZXNlIHR3byBsb2NpIGluIHRoZSBmdWxsIG1pUmRlZXAyIG91dHB1dC4KCmBgYHtyIGNoZWNrLW1pcmRlZXAtb3V0cHV0LWR1cGVzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9CgojIFZpZXcgZnVsbCBtaXJkZWVwMiBvdXRwdXQgZm9yIHRoZXNlIHR3byBsb2NpCmF3ayAtRidcdCcgJyQxID09ICJQb3JpdGVzX2V2ZXJtYW5pX3NjYWZmb2xkXzMzNF8yMzQwMTkiJyAuLi9vdXRwdXQvMTEuMS1QZXZlLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvcGFyc2FibGUtcmVzdWx0XzIyXzA0XzIwMjRfdF8xNV8xMF8xNi5jc3YKZWNobyIiCmF3ayAtRidcdCcgJyQxID09ICJQb3JpdGVzX2V2ZXJtYW5pX3NjYWZmb2xkXzMzNF8yMzM4ODkiJyAuLi9vdXRwdXQvMTEuMS1QZXZlLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvcGFyc2FibGUtcmVzdWx0XzIyXzA0XzIwMjRfdF8xNV8xMF8xNi5jc3YKCmVjaG8iIgplY2hvIiIKCmVjaG8gIm1hdHVyZSBtaVJOQSBzZXF1ZW5jZXMgZm9yIHRoZXNlIHR3byBsb2NpOiIKYXdrIC1GJ1x0JyAnJDEgPT0gIlBvcml0ZXNfZXZlcm1hbmlfc2NhZmZvbGRfMzM0XzIzNDAxOSInIC4uL291dHB1dC8xMS4xLVBldmUtc1JOQXNlcS1taVJkZWVwMi0zMWJwLWZhc3RwLW1lcmdlZC1jbmlkYXJpYW5fbWlSQmFzZS9wYXJzYWJsZS1yZXN1bHRfMjJfMDRfMjAyNF90XzE1XzEwXzE2LmNzdiB8IGF3ayAne3ByaW50ICQxM30nCgphd2sgLUYnXHQnICckMSA9PSAiUG9yaXRlc19ldmVybWFuaV9zY2FmZm9sZF8zMzRfMjMzODg5IicgLi4vb3V0cHV0LzExLjEtUGV2ZS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL3BhcnNhYmxlLXJlc3VsdF8yMl8wNF8yMDI0X3RfMTVfMTBfMTYuY3N2IHwgYXdrICd7cHJpbnQgJDEzfScKCmVjaG8gIiIKZWNobyAiIgoKZWNobyAibWlSTkEqIHNlcXVlbmNlcyBmb3IgdGhlc2UgdHdvIGxvY2k6Igphd2sgLUYnXHQnICckMSA9PSAiUG9yaXRlc19ldmVybWFuaV9zY2FmZm9sZF8zMzRfMjM0MDE5IicgLi4vb3V0cHV0LzExLjEtUGV2ZS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL3BhcnNhYmxlLXJlc3VsdF8yMl8wNF8yMDI0X3RfMTVfMTBfMTYuY3N2IHwgYXdrICd7cHJpbnQgJDE0fScKCmF3ayAtRidcdCcgJyQxID09ICJQb3JpdGVzX2V2ZXJtYW5pX3NjYWZmb2xkXzMzNF8yMzM4ODkiJyAuLi9vdXRwdXQvMTEuMS1QZXZlLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvcGFyc2FibGUtcmVzdWx0XzIyXzA0XzIwMjRfdF8xNV8xMF8xNi5jc3YgfCBhd2sgJ3twcmludCAkMTR9JwoKZWNobyAiIgplY2hvICIiCgplY2hvICJwcmVjdXJzb3IgbWlSTkEgc2VxdWVuY2VzIGZvciB0aGVzZSB0d28gbG9jaToiCmF3ayAtRidcdCcgJyQxID09ICJQb3JpdGVzX2V2ZXJtYW5pX3NjYWZmb2xkXzMzNF8yMzQwMTkiJyAuLi9vdXRwdXQvMTEuMS1QZXZlLXNSTkFzZXEtbWlSZGVlcDItMzFicC1mYXN0cC1tZXJnZWQtY25pZGFyaWFuX21pUkJhc2UvcGFyc2FibGUtcmVzdWx0XzIyXzA0XzIwMjRfdF8xNV8xMF8xNi5jc3YgfCBhd2sgJ3twcmludCAkMTV9JwoKYXdrIC1GJ1x0JyAnJDEgPT0gIlBvcml0ZXNfZXZlcm1hbmlfc2NhZmZvbGRfMzM0XzIzMzg4OSInIC4uL291dHB1dC8xMS4xLVBldmUtc1JOQXNlcS1taVJkZWVwMi0zMWJwLWZhc3RwLW1lcmdlZC1jbmlkYXJpYW5fbWlSQmFzZS9wYXJzYWJsZS1yZXN1bHRfMjJfMDRfMjAyNF90XzE1XzEwXzE2LmNzdiB8IGF3ayAne3ByaW50ICQxNX0nCmBgYApJbnRlcmVzdGluZy4uLiBUaGUgdHdvIGxvY2kgaGF2ZSAqdmVyeSogc2ltaWxhciBwcmVjdXJzb3Igc2VxdWVuY2VzIGFuZCByZXZlcnNlZCBtYXR1cmUgYW5kIHN0YXIgc2VxdWVuY2VzISBJbiBvdGhlciB3b3JkcywgdGhlIG1hdHVyZSBtaVJOQSBzZXF1ZW5jZSBmb3IgUG9yaXRlc19ldmVybWFuaV9zY2FmZm9sZF8zMzRfMjM0MDE5IGlzIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIG1pUk5BKiBzZXF1ZW5jZSBvZiBQb3JpdGVzX2V2ZXJtYW5pX3NjYWZmb2xkXzMzNF8yMzM4ODksIGFuZCB2aWNlIHZlcnNhISBJJ20gbm90IGV4YWN0bHkgc3VyZSB3aGF0IHRoaXMgbWVhbnMgdGhvdWdoLi4uIGlzIG1pUmRlZXAyIGp1c3QgaW5jb3JyZWN0bHkgZGlzdGluZ3Vpc2hpbmcgdGhlIG1hdHVyZSBhbmQgc3RhciBzZXF1ZW5jZXMgZm9yIG9uZSBvZiB0aGVzZSBsb2NpPwoKTGV0J3Mgc2V0IHRoYXQgYXNpZGUgZm9yIG5vdyBhbmQgZG8gc29tZSBxdWljayBpbnZlc3RpZ2F0aW9uIG9mIHRoZSBtaVJkZWVwMiBldmFsdWF0aW9uIGNyaXRlcmlhIGZvciBhbGwgb2YgdGhlc2UgU2hvcnRTdGFjay9taVJkZWVwMiBzaGFyZWQgbWlSTkFzLiBUaGlzIGNvdWxkIGdpdmUgdXMgYW4gaWRlYSBvZiB3aGF0IHRocmVzaG9sZHMgbWF5IGJlIGFwcHJvcHJpYXRlIGZvciBmaWx0ZXJpbmcgdGhlIG1pUmRlZXAyIG91dHB1dC4gCmBgYHtyIGNoZWNrLW1pcmRlZXAyLW91dHB1dC1hbGwtc2hhcmVkLCBlbmdpbmU9J2Jhc2gnLCBldmFsPVRSVUV9Cm1pcmRlZXBJRHM9JChhd2sgJ3twcmludCAkMTN9JyAuLi9vdXRwdXQvMTctUGV2ZS1TaG9ydFN0YWNrLW1pUmRlZXAyLWNvbXBhcmlzb24vU2hvcnRTdGFja19taVJkZWVwMl9tYXR1cmVfaW50ZXJzZWN0LmJlZCkKCmhlYWQgLTEgLi4vb3V0cHV0LzExLjEtUGV2ZS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL3BhcnNhYmxlLXJlc3VsdF8yMl8wNF8yMDI0X3RfMTVfMTBfMTYuY3N2ID4gLi4vb3V0cHV0LzE3LVBldmUtU2hvcnRTdGFjay1taVJkZWVwMi1jb21wYXJpc29uL2ludGVyc2VjdF9taVJkZWVwMl9zdGF0cy50eHQKd2hpbGUgSUZTPSByZWFkIC1yIGlkOyBkbwogICMgVXNlIGF3ayB0byBwcm9jZXNzIGZpbGVBIGFuZCBtYXRjaCBjb2x1bW4gMSB3aXRoIHRoZSBjdXJyZW50IElECiAgYXdrIC1GJ1x0JyAtdiBpZD0iJGlkIiAnJDEgPT0gaWQge3ByaW50fScgLi4vb3V0cHV0LzExLjEtUGV2ZS1zUk5Bc2VxLW1pUmRlZXAyLTMxYnAtZmFzdHAtbWVyZ2VkLWNuaWRhcmlhbl9taVJCYXNlL3BhcnNhYmxlLXJlc3VsdF8yMl8wNF8yMDI0X3RfMTVfMTBfMTYuY3N2CmRvbmUgPDw8ICIkbWlyZGVlcElEcyIgPj4gLi4vb3V0cHV0LzE3LVBldmUtU2hvcnRTdGFjay1taVJkZWVwMi1jb21wYXJpc29uL2ludGVyc2VjdF9taVJkZWVwMl9zdGF0cy50eHQKYGBgCgpgYGB7ciB2aWV3LWNyaXRlcmlhLCBldmFsPVRSVUV9CmludGVyc2VjdF9taVJkZWVwMl9zdGF0cyA8LSByZWFkLmNzdigiLi4vb3V0cHV0LzE3LVBldmUtU2hvcnRTdGFjay1taVJkZWVwMi1jb21wYXJpc29uL2ludGVyc2VjdF9taVJkZWVwMl9zdGF0cy50eHQiLCBzZXA9Ilx0IikKCmludGVyc2VjdF9taVJkZWVwMl9zdGF0cyAlPiUgCiAgc2VsZWN0KG1pUkRlZXAyLnNjb3JlLCBzaWduaWZpY2FudC5yYW5kZm9sZC5wLnZhbHVlKSAlPiUgCiAgYXJyYW5nZShkZXNjKG1pUkRlZXAyLnNjb3JlKSkgJT4lCiAga2FibGUoKQpgYGAKClRoZSBtaVJkZWVwMiBzY29yZSBpcyAidGhlIGxvZy1vZGRzIHNjb3JlIGFzc2lnbmVkIHRvIHRoZSBoYWlycGluIiBhbmQgaXMgZXNzZW50aWFsbHkgYSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBsb2N1cyBpcyBhIG1pUk5BIChwcmVzdW1hYmx5IGJhc2VkIG9uIHRoZSBoYWlycGluIHN0cnVjdHVyZSkgb24sIHdpdGggaGlnaGVyIHZhbHVlcyBpbmRpY2F0aW5nIGhpZ2hlciBwcm9iYWJpbGl0eS4gTWlSZGVlcDIncyBkZWZhdWx0IHNjb3JlIHRocmVzaG9sZCBmb3IgbWlSTkEgY2xhc3NpZmljYXRpb24gaXMgMCwgYnV0IGNvcmFsIG1pUk5BIHBhcGVycyB3ZSd2ZSBzZWVuIHVzZSBteXJpYWQgdGhyZXNob2xkcyAoZS5nLiwgNCwgMTApLgoKVGhlIHJhbmRmb2xkIGlzIGFsc28gYW4gZXZhbHVhdGlvbiBvZiBuY3JuYSBzZWNvbmRhcnkgc3RydWN0dXJlLCBhbmQgd2Ugd2FudCBhIHNpZ25pZmljYW50IHJhbmRmb2xkIHZhbHVlICh0aGlzIHdvdWxkIGluZGljYXRlIGhpZ2ggbGlrZWxpaG9vZCBvZiBtaVJOQSBwcmVjdXJzb3J5IHN0cnVjdHVyZSkKCjI1IG91dCBvZiAzMCBzaGFyZWQgbWlSTkFzIGhhdmUgbWlSZGVlcDIgc2NvcmVzID4xMCwgYW5kIGFsbCAzMCBoYXZlIHNpZ25pZmljYW50IHJhbmRmb2xkIHAtdmFsdWVzLCB3aGljaCBpcyBnb29kIHN1cHBvcnQgZm9yIHVzaW5nIHRoZXNlIHRocmVzaG9sZHMuCgo=