Machine
Google Cloud Platform (GCP), 4 vCPUs, 15 GB RAM
Google Cloud Platform (GCP), 8 vCPUs, 30 GB RAM
Google Cloud Platform (GCP), 24 vCPUs, 32 GB RAM
AWS: c5.18xlarge (72 vCPUs, 144 GB RAM)
AWS: m5.24xlarge (96 vCPUs, 384 GiB RAM)
Directory content
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 ubuntu ubuntu 68029335546 Apr 30 15:50 SRR622459_1.fastq.gz
-rw-rw-r– 1 ubuntu ubuntu 69219443789 Apr 30 15:54 SRR622459_2.fastq.gz
Check data content
~/gatk-data-ref$ zcat SRR622459_1.fastq.gz | head -n 2
@SRR622459.1 1/1
GTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGAGATCGGAAG
~/gatk-data-ref$ zcat SRR622459_2.fastq.gz | head -n 2
@SRR622459.1 1/2
CCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACAGATCGGAAG
Download reference (fasta, fasta index, dictionary) and BWA index (.alt, .amb, .ann, .bwt, .pac and .sa) files
~/gatk-data-ref$ aws s3 cp s3://broad-references/hg38/v0/Homo_sapiens_assembly38.fasta .
~/gatk-data-ref$ aws s3 cp s3://broad-references/hg38/v0/Homo_sapiens_assembly38.dict .
~/gatk-data-ref$ aws s3 cp s3://broad-references/hg38/v0/Homo_sapiens_assembly38.fasta.fai .
~/gatk-data-ref$ aws s3 cp s3://broad-references/hg38/v0/Homo_sapiens_assembly38.fasta.64.alt .
~/gatk-data-ref$ aws s3 cp s3://broad-references/hg38/v0/Homo_sapiens_assembly38.fasta.64.amb .
~/gatk-data-ref$ aws s3 cp s3://broad-references/hg38/v0/Homo_sapiens_assembly38.fasta.64.ann .
~/gatk-data-ref$ aws s3 cp s3://broad-references/hg38/v0/Homo_sapiens_assembly38.fasta.64.bwt .
~/gatk-data-ref$ aws s3 cp s3://broad-references/hg38/v0/Homo_sapiens_assembly38.fasta.64.pac .
~/gatk-data-ref$ aws s3 cp s3://broad-references/hg38/v0/Homo_sapiens_assembly38.fasta.64.sa .
Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r-- 1 ubuntu ubuntu 581712 Jan 6 2016 Homo_sapiens_assembly38.dict
-rw-rw-r-- 1 ubuntu ubuntu 3249912778 Jan 5 2016 Homo_sapiens_assembly38.fasta
-rw-rw-r-- 1 ubuntu ubuntu 487553 Nov 6 23:47 Homo_sapiens_assembly38.fasta.64.alt
-rw-rw-r-- 1 ubuntu ubuntu 20199 Nov 6 23:47 Homo_sapiens_assembly38.fasta.64.amb
-rw-rw-r-- 1 ubuntu ubuntu 455474 Nov 6 23:47 Homo_sapiens_assembly38.fasta.64.ann
-rw-rw-r-- 1 ubuntu ubuntu 3217347004 Nov 6 23:47 Homo_sapiens_assembly38.fasta.64.bwt
-rw-rw-r-- 1 ubuntu ubuntu 804336731 Nov 6 23:48 Homo_sapiens_assembly38.fasta.64.pac
-rw-rw-r-- 1 ubuntu ubuntu 1608673512 Nov 6 23:48 Homo_sapiens_assembly38.fasta.64.sa
-rw-rw-r-- 1 ubuntu ubuntu 160928 Dec 1 2016 Homo_sapiens_assembly38.fasta.fai
Align the fastq sequences to the reference genome using BWA
Alignment (bwa mem) will lead to a SAM (sequence alignment file) file, that will be converted to a BAM file (samtools view).
Generate alignment statistics
~/gatk-data-ref$ sambamba flagstat -p SRR622459_1.bam
sambamba 0.6.9 by Artem Tarasov and Pjotr Prins (C) 2012-2019
2467570854 + 0 in total (QC-passed reads + QC-failed reads)
10585005 + 0 secondary
11607447 + 0 supplementary
0 + 0 duplicates
2364732708 + 0 mapped (95.83%:N/A)
2445378402 + 0 paired in sequencing
1222689201 + 0 read1
1222689201 + 0 read2
2254822518 + 0 properly paired (92.21%:N/A)
2313333564 + 0 with itself and mate mapped
29206692 + 0 singletons (1.19%:N/A)
27935066 + 0 with mate mapped to a different chr
16234878 + 0 with mate mapped to a different chr (mapQ>=5)
Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 ubuntu ubuntu 200710884147 May 2 11:47 SRR622459_1.bam
-rw-rw-r– 1 ubuntu ubuntu 192007490886 May 2 13:42 SRR622459_1.sorted.bam
-rw-rw-r– 1 ubuntu ubuntu 9775584 May 2 14:05 SRR622459_1.sorted.bam.bai
-rw-rw-r– 1 ubuntu ubuntu 4257061759 May 2 15:43 SRR622459_1.sorted.chr20.bam
Sort and index the BAM file
~/gatk-data-ref$ samtools index -@ 96 SRR622459_1.sorted.bam
Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 ubuntu ubuntu 192007490886 May 2 13:42 SRR622459_1.sorted.bam
-rw-rw-r– 1 ubuntu ubuntu 9775584 May 2 14:05 SRR622459_1.sorted.bam.bai
Validate the BAM file (for GATK analysis)
~/gatk-data-ref$ gatk ValidateSamFile -R Homo_sapiens_assembly38.fasta -I SRR622459_1.sorted.bam -M SUMMARY -O summary-SRR622459_1.sorted
~/gatk-data-ref$ cat summary-SRR622459_1.sorted
## HISTOGRAM java.lang.String
Error Type Count
ERROR:INVALID_TAG_NM 245,444
Fix the error reported above
validate the BAM file again and create an index
~/gatk-data-ref$ gatk ValidateSamFile -R Homo_sapiens_assembly38.fasta -I SRR622459_1.sorted.NmMdTqTgs.bam -M SUMMARY -O summary-SRR622459_1.sorted.NmMdTqTgs
[Sat May 04 19:07:58 UTC 2019] picard.sam.ValidateSamFile done. Elapsed time: 331.75 minutes.
…………..
Tool returned: 0
~/gatk-data-ref$ cat summary-SRR622459_1.sorted.NmMdTqTgs
No errors found
~/gatk-data-ref$ samtools index SRR622459_1.sorted.NmMdTqTgs.bam
Mark duplicates and index the BAM file created
~/gatk-data-ref$ nohup gatk MarkDuplicates -I SRR622459_1.sorted.NmMdTqTgs.bam -O SRR622459_1.sorted.NmMdTqTgs.mdup.bam -M SRR622459_1.sorted.NmMdTqTgs.dupMetrics.txt >& 59_1.fxNm.log &
~/gatk-data-ref$ tail 59_1.fxNm.log
INFO 2019-05-05 05:03:00 MarkDuplicates Written 2,460,000,000 records. Elapsed time: 04:49:32s. Time for last 10,000,000: 36s. Last read position: /
INFO 2019-05-05 05:03:28 MarkDuplicates Before output close freeMemory: 3449009968; totalMemory: 3481796608; maxMemory: 3504865280
INFO 2019-05-05 05:03:28 MarkDuplicates After output close freeMemory: 3456209256; totalMemory: 3481796608; maxMemory: 3504865280
[Sun May 05 05:03:29 UTC 2019] picard.sam.markduplicates.MarkDuplicates done. Elapsed time: 680.30 minutes.
Runtime.totalMemory()=3481796608
Tool returned: 0
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
Running: java -Dsamjdk.use_async_io_read_samtools=false -Dsamjdk.use_async_io_write_samtools=true -Dsamjdk.use_async_io_write_tribble=false -Dsamjdk.compression_level=2 -jar /home/b0d2647/miniconda3/sha re/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar MarkDuplicates -I SRR622459_1.sorted.NmMdTqTgs.bam -O SRR622459_1.sorted.NmMdTqTgs.mdup.bam -M SRR622459_1.sorted.NmMdTqTgs.dupMetrics.txt
~/gatk-data-ref$ head SRR622459_1.sorted.NmMdTqTgs.dupMetrics.txt
LIBRARY UNPAIRED_READS_EXAMINED READ_PAIRS_EXAMINED SECONDARY_OR_SUPPLEMENTARY_RDS UNMAPPED_READS UNPAIRED_READ_DUPLICATES READ_PAIR_DUPLICATES READ_PAIR_OPTICAL_DUPLICATES PERCENT_DUPLICATION ESTIMATED_LIBRARY_SIZE
Q 29206692 1156666782 22192452 102838146 14050105 58665347 0 0.056085 11013720153
~/gatk-data-ref$ samtools index SRR622459_1.sorted.NmMdTqTgs.bam
Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r-- 1 b0d2647 b0d2647 691071 May 5 05:03 59_1.fxNm.log
-rw-rw-r-- 1 b0d2647 b0d2647 260704633123 May 4 10:23 SRR622459_1.sorted.NmMdTqTgs.bam
-rw-rw-r-- 1 b0d2647 b0d2647 9786952 May 4 18:05 SRR622459_1.sorted.NmMdTqTgs.bam.bai
-rw-rw-r-- 1 b0d2647 b0d2647 5565 May 5 05:03 SRR622459_1.sorted.NmMdTqTgs.dupMetrics.txt
-rw-rw-r-- 1 b0d2647 b0d2647 263473284570 May 5 05:03 SRR622459_1.sorted.NmMdTqTgs.mdup.bam
-rw-rw-r-- 1 b0d2647 b0d2647 9817616 May 5 09:59 SRR622459_1.sorted.NmMdTqTgs.mdup.bam.bai
-rw-rw-r-- 1 b0d2647 b0d2647 16 May 4 19:07 summary-SRR622459_1.sorted.NmMdTqTgs
Base quality calibration (using gatk BaseReclaibrator and gatk Apply BQSR)
-It takes a long time to calibrate the bases in the entire BAM file.
- We will, hence, recalibrate the bases only in chromosome 20 and call variants in (genes or regions in) chromosome 20.
Validate the BAM file
~/gatk-data-ref$ gatk ValidateSamFile -R Homo_sapiens_assembly38.fasta -I SRR622459_1.sorted.NmMdTqTgs.chr20.bam -M SUMMARY -O summary-SRR622459_1.sorted.NmMdTqTgs.chr20
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
[Sat May 04 19:37:55 UTC 2019] picard.sam.ValidateSamFile done. Elapsed time: 6.59 minutes.
Tool returned:0
~/gatk-data-ref$ cat summary-SRR622459_1.sorted.NmMdTqTgs.chr20
No errors found
Mark duplicates
~/gatk-data-ref$ gatk MarkDuplicates -I SRR622459_1.sorted.NmMdTqTgs.chr20.bam -O SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.bam -M SRR622459_1.sorted.NmMdTqTgs.chr20.dupMetrics.txt
[Sat May 04 19:56:06 UTC 2019] picard.sam.markduplicates.MarkDuplicates done. Elapsed time: 15.06 minutes.
Tool returned: 0
####~/gatk-data-ref$ head SRR622459_1.sorted.NmMdTqTgs.chr20.dupMetrics.txt
LIBRARY UNPAIRED_READS_EXAMINED READ_PAIRS_EXAMINED SECONDARY_OR_SUPPLEMENTARY_RDS UNMAPPED_READS UNPAIRED_READ_DUPLICATES READ_PAIR_DUPLICATES READ_PAIR_OPTICAL_DUPLICATES PERCENT_DUPLICATION ESTIMATED_LIBRARY_SIZE
Q 0 24739665 36362 0 0 946419 0 0.038255 315050746
Index the duplicate marked file
~/gatk-data-ref$ samtools index SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.bam
Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r-- 1 b0d2647 b0d2647 4322154789 May 4 19:28 SRR622459_1.sorted.NmMdTqTgs.chr20.bam
-rw-rw-r-- 1 b0d2647 b0d2647 16 May 4 19:37 summary-SRR622459_1.sorted.NmMdTqTgs.chr20
-rw-rw-r-- 1 b0d2647 b0d2647 5402517968 May 4 19:56 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.bam
-rw-rw-r-- 1 b0d2647 b0d2647 224144 May 4 21:48 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.bam.bai
-rw-rw-r-- 1 b0d2647 b0d2647 3533 May 4 19:56 SRR622459_1.sorted.NmMdTqTgs.chr20.dupMetrics.txt
Recalibrate the bases using reference SNPs and indels
Download reference SNP and indel reference files (from a google or aws s3 bucket)
~/gatk-data-ref$ gsutil cp gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.dbsnp138.vcf dbsnp138.vcf
~/gatk-data-ref$ gsutil cp gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.dbsnp138.vcf.idx dbsnp138.vcf.idx
~/gatk-data-ref$ gsutil cp gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.known_indels.vcf.gz hg38.known_indels.vcf.gz
~/gatk-data-ref$ gsutil cp gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.known_indels.vcf.gz.tbi hg38.known_indels.vcf.gz.tbi
~/gatk-data-ref$ gsutil cp gs://genomics-public-data/resources/broad/hg38/v0/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz gold_standard.indels.hg38.vcf.gz
~/gatk-data-ref$ gsutil cp gs://genomics-public-data/resources/broad/hg38/v0/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz.tbi gold_standard.indels.hg38.vcf.gz.tbi
Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 b0d2647 b0d2647 10950827213 May 6 02:45 dbsnp138.vcf
-rw-rw-r– 1 b0d2647 b0d2647 12480412 May 6 02:46 dbsnp138.vcf.idx
-rw-rw-r– 1 b0d2647 b0d2647 20685880 May 6 02:48 gold_standard.indels.hg38.vcf.gz
-rw-rw-r– 1 b0d2647 b0d2647 1500013 May 6 02:49 gold_standard.indels.hg38.vcf.gz.tbi
-rw-rw-r– 1 b0d2647 b0d2647 61692306 May 6 02:46 hg38.known_indels.vcf.gz
-rw-rw-r– 1 b0d2647 b0d2647 1567886 May 6 02:47 hg38.known_indels.vcf.gz.tbi
Run gatk BaseRecalibrator (to obtain a recalibration table for chromosome 20)
~/gatk-data-ref$ gatk BaseRecalibrator -R Homo_sapiens_assembly38.fasta -I SRR622459_1.sorted.NmMdTqTgs.mdup.bam -L chr20 –known-sites dbsnp138.vcf –known-sites gold_standard.indels.hg38.vcf.gz –known-sites hg38.known_indels.vcf.gz -O SRR622459_1.sorted.NmMdTqTgs.mdup.chr20.recal.table
Run gatk ApplyBQSR
~/gatk-data-ref$ gatk ApplyBQSR -R Homo_sapiens_assembly38.fasta -I SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.bam -L chr20 –bqsr-recal-file SRR622459_1.sorted.NmMdTqTgs.mdup.chr20.recal.table -O SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.bam
Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 b0d2647 b0d2647 854260 May 6 15:47 SRR622459_1.sorted.NmMdTqTgs.mdup.chr20.recal.table
-rw-rw-r– 1 b0d2647 b0d2647 224296 May 6 17:07 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.bai
-rw-rw-r– 1 b0d2647 b0d2647 4971795310 May 6 17:07 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.bam
Call variants using both uncalibrated and calibrated BAM files in a gene of your choice (cholinergic nicotinc receptor alpha 4; chrna4, chr20: 63,343,310..63,375,471) and a chromosomal region (chr20:15,800,000-16,100,000) and
A. Call variants in cholinergic nicotinc receptor alpha 4 (chrna4) gene (chr20: 63,343,310..63,375,471)
A1. Call haplotypes and variants using the base unrecalibrated BAM files (in the region chr20: 63,343,310..63,375,471)
~/gatk-data-ref$ gatk HaplotypeCaller -R Homo_sapiens_assembly38.fasta -I SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.bam -L chr20:63,343,310-63,375,471 -O SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.chrna4.vcf
A2. Call haplotypes and variants using the base recalibrated BAM files (in the region chr20: 63,343,310..63,375,471)
~/gatk-data-ref$ gatk HaplotypeCaller -R Homo_sapiens_assembly38.fasta -I SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.bam -L chr20:63,343,310-63,375,471 -O SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.chrna4.vcf
A3. Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r-- 1 b0d2647 b0d2647 191882 May 7 15:44 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.chrna4.vcf
-rw-rw-r-- 1 b0d2647 b0d2647 114617 May 7 15:44 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.chrna4.vcf.idx
-rw-rw-r-- 1 b0d2647 b0d2647 191642 May 7 15:50 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.chrna4.vcf
-rw-rw-r-- 1 b0d2647 b0d2647 114623 May 7 15:50 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.chrna4.vcf.idx
B. Call variants in in a chromosomal region (chr20:15,800,000-16,100,000)
B1. Call haplotypes and variants using the unrecalibrated BAM files (in the region chr20:15,800,000-16,100,000 )
~/gatk-data-ref$ gatk HaplotypeCaller -R Homo_sapiens_assembly38.fasta -I SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.bam -L chr20:15,800,000-16,100,000 -O SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.15m800k-16M100k.vcf
B2. Call haplotypes and variants in the recalibrated BAM files (in the region chr20:15,800,000-16,100,000 )
~/gatk-data-ref$ gatk HaplotypeCaller -R Homo_sapiens_assembly38.fasta -I SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.bam -L chr20:15,800,000-16,100,000 -O SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.15m800k-16M100k.vcf
B3. Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r-- 1 b0d2647 b0d2647 275352 May 7 16:33 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.15m800k-16M100k.vcf
-rw-rw-r-- 1 b0d2647 b0d2647 118163 May 7 16:33 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.15m800k-16M100k.vcf.idx
-rw-rw-r-- 1 b0d2647 b0d2647 274180 May 7 01:33 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.15m800k-16M100k.vcf
-rw-rw-r-- 1 b0d2647 b0d2647 118168 May 7 01:33 SRR622459_1.sorted.NmMdTqTgs.chr20.mdup.recal.15m800k-16M100k.vcf.idx
LS0tDQp0aXRsZTogIkdlcm1saW5lIHZhcmlhdGlvbnMgaW4gYSBnZW5lIChjaG9saW5lcmdpYyBuaWNvdGluaWMgcmVjZXB0b3IgYWxwaGEgNCkgYW5kIGEgY2hyb21vc29tYWwgcmVnaW9uIG9mIGFuIGluZGl2aWR1YWwiDQphdXRob3I6ICJCaGFnaXJhdGhpIERhc2giDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMjIE1hY2hpbmUNCg0KR29vZ2xlIENsb3VkIFBsYXRmb3JtIChHQ1ApLCA0IHZDUFVzLCAxNSBHQiBSQU0NCg0KR29vZ2xlIENsb3VkIFBsYXRmb3JtIChHQ1ApLCA4IHZDUFVzLCAzMCBHQiBSQU0NCg0KR29vZ2xlIENsb3VkIFBsYXRmb3JtIChHQ1ApLCAyNCB2Q1BVcywgMzIgR0IgUkFNDQoNCkFXUzogYzUuMTh4bGFyZ2UgKDcyIHZDUFVzLCAxNDQgR0IgUkFNKQ0KDQpBV1M6IG01LjI0eGxhcmdlICg5NiB2Q1BVcywgMzg0IEdpQiBSQU0pDQoNCg0KDQojIyBSZWZlcmVuY2UNCg0KU2VxdWVuY2luZyBkYXRhIGlzIG9mIGFuIGluZGl2aWR1YWwgKE5BMTI4OTIpIGZyb20gdGhlIDEwMDAgZ2Vub21lIHByb2plY3QuDQoNCmh0dHA6Ly93d3cuaW50ZXJuYXRpb25hbGdlbm9tZS5vcmcvMTAwMC1nZW5vbWVzLWJyb3dzZXJzLw0KDQoNCg0KIyMgRG93bmxvYWQgYW5hbHlzaXMgZGF0YXNldHMgKGZvciBpbmRpdmlkdWFsIE5BMTI4OTIpIGZyb20gMTAwMCBnZW5vbWUgcHJvamVjdCBzaXRlDQoNCn4vZ2F0ay1kYXRhLXJlZiQgd2dldCAtYnFjIGZ0cDovL2Z0cC5zcmEuZWJpLmFjLnVrL3ZvbDEvZmFzdHEvU1JSNjIyL1NSUjYyMjQ1OS9TUlI2MjI0NTlfMS5mYXN0cS5neg0KDQp+L2dhdGstZGF0YS1yZWYkIHdnZXQgLWJxYyBmdHA6Ly9mdHAuc3JhLmViaS5hYy51ay92b2wxL2Zhc3RxL1NSUjYyMi9TUlI2MjI0NTkvU1JSNjIyNDU5XzIuZmFzdHEuZ3oNCg0KDQoNCg0KIyMgRGlyZWN0b3J5IGNvbnRlbnQNCg0KIyMjIyAgICAgfi9nYXRrLWRhdGEtcmVmJCBscyAtbA0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDY4MDI5MzM1NTQ2IEFwciAzMCAxNTo1MCBTUlI2MjI0NTlfMS5mYXN0cS5neg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSA2OTIxOTQ0Mzc4OSBBcHIgMzAgMTU6NTQgU1JSNjIyNDU5XzIuZmFzdHEuZ3oNCg0KDQoNCiMjIENoZWNrIGRhdGEgY29udGVudA0KDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIHpjYXQgU1JSNjIyNDU5XzEuZmFzdHEuZ3ogfCBoZWFkIC1uIDINCg0KQFNSUjYyMjQ1OS4xIDEvMQ0KDQpHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHVFRBR0dHQUdBVENHR0FBRw0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCB6Y2F0IFNSUjYyMjQ1OV8yLmZhc3RxLmd6IHwgaGVhZCAtbiAyDQoNCkBTUlI2MjI0NTkuMSAxLzINCg0KQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0NDVEFBQ0FHQVRDR0dBQUcNCg0KDQoNCg0KDQoNCiMjIERvd25sb2FkIHJlZmVyZW5jZSAoZmFzdGEsIGZhc3RhIGluZGV4LCBkaWN0aW9uYXJ5KSBhbmQgQldBIGluZGV4ICguYWx0LCAuYW1iLCAuYW5uLCAuYnd0LCAucGFjIGFuZCAuc2EpIGZpbGVzDQoNCg0KYGBgDQogICAgICAgIH4vZ2F0ay1kYXRhLXJlZiQgYXdzIHMzIGNwIHMzOi8vYnJvYWQtcmVmZXJlbmNlcy9oZzM4L3YwL0hvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhIC4NCg0KICAgICAgICB+L2dhdGstZGF0YS1yZWYkIGF3cyBzMyBjcCBzMzovL2Jyb2FkLXJlZmVyZW5jZXMvaGczOC92MC9Ib21vX3NhcGllbnNfYXNzZW1ibHkzOC5kaWN0IC4NCg0KICAgICAgICB+L2dhdGstZGF0YS1yZWYkIGF3cyBzMyBjcCBzMzovL2Jyb2FkLXJlZmVyZW5jZXMvaGczOC92MC9Ib21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YS5mYWkgLg0KDQoNCiB+L2dhdGstZGF0YS1yZWYkIGF3cyBzMyBjcCBzMzovL2Jyb2FkLXJlZmVyZW5jZXMvaGczOC92MC9Ib21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YS42NC5hbHQgLg0KDQogDQogfi9nYXRrLWRhdGEtcmVmJCBhd3MgczMgY3AgczM6Ly9icm9hZC1yZWZlcmVuY2VzL2hnMzgvdjAvSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEuNjQuYW1iIC4NCg0KIA0KIH4vZ2F0ay1kYXRhLXJlZiQgYXdzIHMzIGNwIHMzOi8vYnJvYWQtcmVmZXJlbmNlcy9oZzM4L3YwL0hvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhLjY0LmFubiAuDQoNCiANCiB+L2dhdGstZGF0YS1yZWYkIGF3cyBzMyBjcCBzMzovL2Jyb2FkLXJlZmVyZW5jZXMvaGczOC92MC9Ib21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YS42NC5id3QgLg0KDQogDQogfi9nYXRrLWRhdGEtcmVmJCBhd3MgczMgY3AgczM6Ly9icm9hZC1yZWZlcmVuY2VzL2hnMzgvdjAvSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEuNjQucGFjIC4NCg0KIA0KIH4vZ2F0ay1kYXRhLXJlZiQgYXdzIHMzIGNwIHMzOi8vYnJvYWQtcmVmZXJlbmNlcy9oZzM4L3YwL0hvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhLjY0LnNhIC4NCg0KYGBgDQoNCg0KDQojIyBBZGRpdGlvbmFsIGRpcmVjdG9yeSBjb250ZW50cw0KDQojIyMjICAgICB+L2dhdGstZGF0YS1yZWYkIGxzIC1sDQoNCg0KYGBgDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNTgxNzEyIEphbiAgNiAgMjAxNiBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5kaWN0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAzMjQ5OTEyNzc4IEphbiAgNSAgMjAxNiBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDQ4NzU1MyBOb3YgIDYgMjM6NDcgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEuNjQuYWx0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDIwMTk5IE5vdiAgNiAyMzo0NyBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YS42NC5hbWINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA0NTU0NzQgTm92ICA2IDIzOjQ3IEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhLjY0LmFubg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzIxNzM0NzAwNCBOb3YgIDYgMjM6NDcgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEuNjQuYnd0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgODA0MzM2NzMxIE5vdiAgNiAyMzo0OCBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YS42NC5wYWMNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDE2MDg2NzM1MTIgTm92ICA2IDIzOjQ4IEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhLjY0LnNhDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTYwOTI4IERlYyAgMSAgMjAxNiBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YS5mYWkNCmBgYA0KDQoNCg0KIyMgQWxpZ24gdGhlIGZhc3RxIHNlcXVlbmNlcyB0byB0aGUgcmVmZXJlbmNlIGdlbm9tZSB1c2luZyBCV0EgDQoNCkFsaWdubWVudCAoYndhIG1lbSkgd2lsbCBsZWFkIHRvIGEgU0FNIChzZXF1ZW5jZSBhbGlnbm1lbnQgZmlsZSkgZmlsZSwgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIEJBTSBmaWxlIChzYW10b29scyB2aWV3KS4NCg0KDQoNCiMjIyMgIH4vZ2F0ay1kYXRhLXJlZiQgYndhIG1lbSAtTSAtdCA5NiAtUiAnQFJHXHRJRDpTUlI2MjI0NTlcdExCOlFcdFBMOmlsbHVtaW5hXHRQVTpGQ0MxSDdXQUNYWFx0U006TkExMjg5MicgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgU1JSNjIyNDU5XzEuZmFzdHEuZ3ogU1JSNjIyNDU5XzIuZmFzdHEuZ3ogfCBzYW10b29scyB2aWV3IC1TYmggLW8gU1JSNjIyNDU5XzEuYmFtDQoNCg0KbWFpbl0gVmVyc2lvbjogMC43LjE3LXIxMTg4DQoNClttYWluXSBDTUQ6IGJ3YSBtZW0gLU0gLXQgOTYgLVIgQFJHXHRJRDpTUlI2MjI0NTlcdExCOlFcdFBMOmlsbHVtaW5hXHRQVTpGQ0MxSDdXQUNYWFx0U006TkExMjg5MiBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YSBTUlI2MjI0NTlfMS5mYXN0cS5neiBTUlI2MjI0NTlfMi5mYXN0cS5neg0KDQpbbWFpbl0gUmVhbCB0aW1lOiAyMjY4MC40OTcgc2VjOyBDUFU6IDEzOTM2MjIuNDQyIHNlYw0KDQoNCg0KIyMgR2VuZXJhdGUgYWxpZ25tZW50IHN0YXRpc3RpY3MNCg0KIyMjIyAgfi9nYXRrLWRhdGEtcmVmJCBzYW1iYW1iYSBmbGFnc3RhdCAtcCBTUlI2MjI0NTlfMS5iYW0gDQoNCg0Kc2FtYmFtYmEgMC42LjkgYnkgQXJ0ZW0gVGFyYXNvdiBhbmQgUGpvdHIgUHJpbnMgKEMpIDIwMTItMjAxOQ0KDQoNCmBgYA0KMjQ2NzU3MDg1NCArIDAgaW4gdG90YWwgKFFDLXBhc3NlZCByZWFkcyArIFFDLWZhaWxlZCByZWFkcykNCg0KMTA1ODUwMDUgKyAwIHNlY29uZGFyeQ0KDQoxMTYwNzQ0NyArIDAgc3VwcGxlbWVudGFyeQ0KDQowICsgMCBkdXBsaWNhdGVzDQoNCjIzNjQ3MzI3MDggKyAwIG1hcHBlZCAoOTUuODMlOk4vQSkNCg0KMjQ0NTM3ODQwMiArIDAgcGFpcmVkIGluIHNlcXVlbmNpbmcNCg0KMTIyMjY4OTIwMSArIDAgcmVhZDENCg0KMTIyMjY4OTIwMSArIDAgcmVhZDINCg0KMjI1NDgyMjUxOCArIDAgcHJvcGVybHkgcGFpcmVkICg5Mi4yMSU6Ti9BKQ0KDQoyMzEzMzMzNTY0ICsgMCB3aXRoIGl0c2VsZiBhbmQgbWF0ZSBtYXBwZWQNCg0KMjkyMDY2OTIgKyAwIHNpbmdsZXRvbnMgKDEuMTklOk4vQSkNCg0KMjc5MzUwNjYgKyAwIHdpdGggbWF0ZSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgY2hyDQoNCjE2MjM0ODc4ICsgMCB3aXRoIG1hdGUgbWFwcGVkIHRvIGEgZGlmZmVyZW50IGNociAobWFwUT49NSkNCg0KYGBgDQoNCiMjIEFkZGl0aW9uYWwgZGlyZWN0b3J5IGNvbnRlbnRzDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBscyAtbA0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDIwMDcxMDg4NDE0NyBNYXkgIDIgMTE6NDcgU1JSNjIyNDU5XzEuYmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE5MjAwNzQ5MDg4NiBNYXkgIDIgMTM6NDIgU1JSNjIyNDU5XzEuc29ydGVkLmJhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDk3NzU1ODQgTWF5ICAyIDE0OjA1IFNSUjYyMjQ1OV8xLnNvcnRlZC5iYW0uYmFpDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgNDI1NzA2MTc1OSBNYXkgIDIgMTU6NDMgU1JSNjIyNDU5XzEuc29ydGVkLmNocjIwLmJhbQ0KDQoNCg0KIyMgU29ydCBhbmQgaW5kZXggdGhlIEJBTSBmaWxlDQoNCg0KDQojIyMjICB+L2dhdGstZGF0YS1yZWYkIHNhbXRvb2xzIHNvcnQgLUAgOTYgLW0gM0cgU1JSNjIyNDU5XzEuYmFtIC1vIFNSUjYyMjQ1OV8xLnNvcnRlZC5iYW0gDQoNCltiYW1fc29ydF9jb3JlXSBtZXJnaW5nIGZyb20gMTkyIGZpbGVzIGFuZCA5NiBpbi1tZW1vcnkgYmxvY2tzLi4uDQoNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgc2FtdG9vbHMgaW5kZXggLUAgOTYgU1JSNjIyNDU5XzEuc29ydGVkLmJhbQ0KDQoNCg0KIyMgQWRkaXRpb25hbCBkaXJlY3RvcnkgY29udGVudHMNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGxzIC1sDQoNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTkyMDA3NDkwODg2IE1heSAgMiAxMzo0MiBTUlI2MjI0NTlfMS5zb3J0ZWQuYmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgOTc3NTU4NCBNYXkgIDIgMTQ6MDUgU1JSNjIyNDU5XzEuc29ydGVkLmJhbS5iYWkNCg0KDQoNCg0KIyMgVmFsaWRhdGUgdGhlIEJBTSBmaWxlIChmb3IgR0FUSyBhbmFseXNpcykNCg0KDQojIyMjICB+L2dhdGstZGF0YS1yZWYkIGdhdGsgVmFsaWRhdGVTYW1GaWxlIC1SIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhIC1JIFNSUjYyMjQ1OV8xLnNvcnRlZC5iYW0gLU0gU1VNTUFSWSAtTyBzdW1tYXJ5LVNSUjYyMjQ1OV8xLnNvcnRlZA0KDQoNCiMjIyAgfi9nYXRrLWRhdGEtcmVmJCBjYXQgc3VtbWFyeS1TUlI2MjI0NTlfMS5zb3J0ZWQNCg0KYGBgDQojIyBISVNUT0dSQU0JamF2YS5sYW5nLlN0cmluZw0KDQpFcnJvciBUeXBlCSAgICAgICAgICAgICAgICAgICAgICAgIENvdW50DQoNCkVSUk9SOklOVkFMSURfVEFHX05NCSAgICAgICAgMjQ1LDQ0NA0KDQpgYGANCg0KDQoNCiMjIEZpeCB0aGUgZXJyb3IgcmVwb3J0ZWQgYWJvdmUNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGdhdGsgU2V0Tm1NZEFuZFVxVGFncyAtUiBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YSAtSSBTUlI2MjI0NTlfMS5zb3J0ZWQuYmFtIC1PIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuYmFtDQoNClVzaW5nIEdBVEsgamFyIC9ob21lL2IwZDI2NDcvbWluaWNvbmRhMy9zaGFyZS9nYXRrNC00LjEuMi4wLTAvZ2F0ay1wYWNrYWdlLTQuMS4yLjAtbG9jYWwuamFyDQoNCg0KDQoNCiMjIHZhbGlkYXRlIHRoZSBCQU0gZmlsZSBhZ2FpbiBhbmQgY3JlYXRlIGFuIGluZGV4DQoNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgZ2F0ayBWYWxpZGF0ZVNhbUZpbGUgLVIgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgLUkgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5iYW0gLU0gU1VNTUFSWSAtTyBzdW1tYXJ5LVNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MNCg0KDQpbU2F0IE1heSAwNCAxOTowNzo1OCBVVEMgMjAxOV0gcGljYXJkLnNhbS5WYWxpZGF0ZVNhbUZpbGUgZG9uZS4gRWxhcHNlZCB0aW1lOiAzMzEuNzUgbWludXRlcy4NCg0KLi4uLi4uLi4uLi4uLi4NCg0KVG9vbCByZXR1cm5lZDogMA0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBjYXQgc3VtbWFyeS1TUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzIA0KDQpObyBlcnJvcnMgZm91bmQNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgc2FtdG9vbHMgaW5kZXggU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5iYW0NCg0KDQoNCg0KIyMgTWFyayBkdXBsaWNhdGVzIGFuZCBpbmRleCB0aGUgQkFNIGZpbGUgY3JlYXRlZA0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBub2h1cCBnYXRrIE1hcmtEdXBsaWNhdGVzIC1JIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuYmFtIC1PIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MubWR1cC5iYW0gLU0gU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5kdXBNZXRyaWNzLnR4dCA+JiA1OV8xLmZ4Tm0ubG9nICYNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIHRhaWwgNTlfMS5meE5tLmxvZyANCg0KSU5GTyAgICAyMDE5LTA1LTA1IDA1OjAzOjAwICAgICBNYXJrRHVwbGljYXRlcyAgV3JpdHRlbiAyLDQ2MCwwMDAsMDAwIHJlY29yZHMuICBFbGFwc2VkIHRpbWU6IDA0OjQ5OjMycy4gIFRpbWUgZm9yIGxhc3QgMTAsMDAwLDAwMDogICAzNnMuICBMYXN0IHJlYWQgcG9zaXRpb246ICovKg0KDQpJTkZPICAgIDIwMTktMDUtMDUgMDU6MDM6MjggICAgIE1hcmtEdXBsaWNhdGVzICBCZWZvcmUgb3V0cHV0IGNsb3NlIGZyZWVNZW1vcnk6IDM0NDkwMDk5Njg7IHRvdGFsTWVtb3J5OiAzNDgxNzk2NjA4OyBtYXhNZW1vcnk6IDM1MDQ4NjUyODANCg0KSU5GTyAgICAyMDE5LTA1LTA1IDA1OjAzOjI4ICAgICBNYXJrRHVwbGljYXRlcyAgQWZ0ZXIgb3V0cHV0IGNsb3NlIGZyZWVNZW1vcnk6IDM0NTYyMDkyNTY7IHRvdGFsTWVtb3J5OiAzNDgxNzk2NjA4OyBtYXhNZW1vcnk6IDM1MDQ4NjUyODANCg0KW1N1biBNYXkgMDUgMDU6MDM6MjkgVVRDIDIwMTldIHBpY2FyZC5zYW0ubWFya2R1cGxpY2F0ZXMuTWFya0R1cGxpY2F0ZXMgZG9uZS4gRWxhcHNlZCB0aW1lOiA2ODAuMzAgbWludXRlcy4NCg0KUnVudGltZS50b3RhbE1lbW9yeSgpPTM0ODE3OTY2MDgNCg0KVG9vbCByZXR1cm5lZDoNCjANCg0KVXNpbmcgR0FUSyBqYXIgL2hvbWUvYjBkMjY0Ny9taW5pY29uZGEzL3NoYXJlL2dhdGs0LTQuMS4yLjAtMC9nYXRrLXBhY2thZ2UtNC4xLjIuMC1sb2NhbC5qYXINCg0KUnVubmluZzoNCiAgICBqYXZhIC1Ec2FtamRrLnVzZV9hc3luY19pb19yZWFkX3NhbXRvb2xzPWZhbHNlIC1Ec2FtamRrLnVzZV9hc3luY19pb193cml0ZV9zYW10b29scz10cnVlIC1Ec2FtamRrLnVzZV9hc3luY19pb193cml0ZV90cmliYmxlPWZhbHNlIC1Ec2FtamRrLmNvbXByZXNzaW9uX2xldmVsPTIgLWphciAvaG9tZS9iMGQyNjQ3L21pbmljb25kYTMvc2hhDQpyZS9nYXRrNC00LjEuMi4wLTAvZ2F0ay1wYWNrYWdlLTQuMS4yLjAtbG9jYWwuamFyIE1hcmtEdXBsaWNhdGVzIC1JIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuYmFtIC1PIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MubWR1cC5iYW0gLU0gU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5kdXBNZXRyaWNzLnR4dA0KDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGhlYWQgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5kdXBNZXRyaWNzLnR4dCANCg0KYGBgDQoNCkxJQlJBUlkgVU5QQUlSRURfUkVBRFNfRVhBTUlORUQgUkVBRF9QQUlSU19FWEFNSU5FRCAgICAgU0VDT05EQVJZX09SX1NVUFBMRU1FTlRBUllfUkRTICBVTk1BUFBFRF9SRUFEUyAgVU5QQUlSRURfUkVBRF9EVVBMSUNBVEVTICAgICAgICBSRUFEX1BBSVJfRFVQTElDQVRFUyAgICBSRUFEX1BBSVJfT1BUSUNBTF9EVVBMSUNBVEVTICAgIFBFUkNFTlRfRFVQTElDQVRJT04gIEVTVElNQVRFRF9MSUJSQVJZX1NJWkUNCg0KUSAgICAgICAyOTIwNjY5MiAgICAgICAgMTE1NjY2Njc4MiAgICAgIDIyMTkyNDUyICAgICAgICAxMDI4MzgxNDYgICAgICAgMTQwNTAxMDUgICAgICAgIDU4NjY1MzQ3ICAgICAgICAwICAgICAgIDAuMDU2MDg1ICAgICAgICAxMTAxMzcyMDE1Mw0KDQpgYGANCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgc2FtdG9vbHMgaW5kZXggU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5iYW0NCg0KDQoNCg0KIyMgQWRkaXRpb25hbCBkaXJlY3RvcnkgY29udGVudHMNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgbHMgLWwNCg0KYGBgDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICAgNjkxMDcxIE1heSAgNSAwNTowMyA1OV8xLmZ4Tm0ubG9nDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgMjYwNzA0NjMzMTIzIE1heSAgNCAxMDoyMyBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmJhbQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgOTc4Njk1MiBNYXkgIDQgMTg6MDUgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5iYW0uYmFpDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICAgICA1NTY1IE1heSAgNSAwNTowMyBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmR1cE1ldHJpY3MudHh0DQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgMjYzNDczMjg0NTcwIE1heSAgNSAwNTowMyBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLm1kdXAuYmFtDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICA5ODE3NjE2IE1heSAgNSAwOTo1OSBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLm1kdXAuYmFtLmJhaQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgICAgICAxNiBNYXkgIDQgMTk6MDcgc3VtbWFyeS1TUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzDQoNCmBgYA0KDQoNCg0KDQojIyBCYXNlIHF1YWxpdHkgY2FsaWJyYXRpb24gKHVzaW5nIGdhdGsgQmFzZVJlY2xhaWJyYXRvciBhbmQgZ2F0ayBBcHBseSBCUVNSKQ0KDQotSXQgdGFrZXMgYSBsb25nIHRpbWUgdG8gY2FsaWJyYXRlIHRoZSBiYXNlcyBpbiB0aGUgZW50aXJlIEJBTSBmaWxlLg0KDQotIFdlIHdpbGwsIGhlbmNlLCByZWNhbGlicmF0ZSB0aGUgYmFzZXMgb25seSBpbiBjaHJvbW9zb21lIDIwIGFuZCBjYWxsIHZhcmlhbnRzIGluIChnZW5lcyBvciByZWdpb25zIGluKSBjaHJvbW9zb21lIDIwLiANCg0KDQoNCiMjIEV4dHJhY3QgY2hyb21vc29tZSAyMCAgZnJvbSB0aGUgJ1NSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuYmFtJyBmaWxlIA0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBzYW10b29scyB2aWV3IC0xIC1oIC1mIDIgLVQgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5iYW0gY2hyMjAgLW8gU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5iYW0NCg0KDQoNCg0KDQojIyBWYWxpZGF0ZSB0aGUgQkFNIGZpbGUNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGdhdGsgVmFsaWRhdGVTYW1GaWxlIC1SIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhIC1JIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAuYmFtIC1NIFNVTU1BUlkgLU8gc3VtbWFyeS1TUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwDQoNClVzaW5nIEdBVEsgamFyIC9ob21lL2IwZDI2NDcvbWluaWNvbmRhMy9zaGFyZS9nYXRrNC00LjEuMi4wLTAvZ2F0ay1wYWNrYWdlLTQuMS4yLjAtbG9jYWwuamFyDQoNCg0KW1NhdCBNYXkgMDQgMTk6Mzc6NTUgVVRDIDIwMTldIHBpY2FyZC5zYW0uVmFsaWRhdGVTYW1GaWxlIGRvbmUuIEVsYXBzZWQgdGltZTogNi41OSBtaW51dGVzLg0KDQpUb29sIHJldHVybmVkOjANCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgY2F0IHN1bW1hcnktU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMA0KDQpObyBlcnJvcnMgZm91bmQNCg0KDQoNCg0KDQojIyBNYXJrIGR1cGxpY2F0ZXMNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgZ2F0ayBNYXJrRHVwbGljYXRlcyAtSSBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwLmJhbSAtTyBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwLm1kdXAuYmFtIC1NIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAuZHVwTWV0cmljcy50eHQNCg0KDQpbU2F0IE1heSAwNCAxOTo1NjowNiBVVEMgMjAxOV0gcGljYXJkLnNhbS5tYXJrZHVwbGljYXRlcy5NYXJrRHVwbGljYXRlcyBkb25lLiBFbGFwc2VkIHRpbWU6IDE1LjA2IG1pbnV0ZXMuDQoNClRvb2wgcmV0dXJuZWQ6IDANCg0KDQoNCiMjIyN+L2dhdGstZGF0YS1yZWYkIGhlYWQgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5kdXBNZXRyaWNzLnR4dCANCg0KDQoNCmBgYA0KTElCUkFSWSBVTlBBSVJFRF9SRUFEU19FWEFNSU5FRCBSRUFEX1BBSVJTX0VYQU1JTkVEICAgICBTRUNPTkRBUllfT1JfU1VQUExFTUVOVEFSWV9SRFMgIFVOTUFQUEVEX1JFQURTICBVTlBBSVJFRF9SRUFEX0RVUExJQ0FURVMgICAgICAgIFJFQURfUEFJUl9EVVBMSUNBVEVTICAgIFJFQURfUEFJUl9PUFRJQ0FMX0RVUExJQ0FURVMgICAgUEVSQ0VOVF9EVVBMSUNBVElPTiBFU1RJTUFURURfTElCUkFSWV9TSVpFDQpRICAgICAgIDAgICAgICAgMjQ3Mzk2NjUgICAgICAgIDM2MzYyICAgMCAgICAgICAwICAgICAgIDk0NjQxOSAgMCAgICAgICAwLjAzODI1NSAgICAgICAgMzE1MDUwNzQ2DQoNCmBgYA0KDQoNCg0KDQojIyBJbmRleCB0aGUgZHVwbGljYXRlIG1hcmtlZCBmaWxlDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBzYW10b29scyBpbmRleCBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwLm1kdXAuYmFtDQoNCg0KDQojIyBBZGRpdGlvbmFsIGRpcmVjdG9yeSBjb250ZW50cw0KDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGxzIC1sDQoNCmBgYA0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgNDMyMjE1NDc4OSBNYXkgIDQgMTk6MjggU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5iYW0NCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgICAgICAgMTYgTWF5ICA0IDE5OjM3IHN1bW1hcnktU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMA0KDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICA1NDAyNTE3OTY4IE1heSAgNCAxOTo1NiBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwLm1kdXAuYmFtDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICAgMjI0MTQ0IE1heSAgNCAyMTo0OCBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwLm1kdXAuYmFtLmJhaQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgICAgMzUzMyBNYXkgIDQgMTk6NTYgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5kdXBNZXRyaWNzLnR4dA0KDQoNCmBgYA0KDQoNCg0KIyMgUmVjYWxpYnJhdGUgdGhlIGJhc2VzIHVzaW5nIHJlZmVyZW5jZSBTTlBzIGFuZCBpbmRlbHMNCg0KDQojIyMjIERvd25sb2FkIHJlZmVyZW5jZSBTTlAgYW5kIGluZGVsIHJlZmVyZW5jZSBmaWxlcyAoZnJvbSBhIGdvb2dsZSBvciBhd3MgczMgYnVja2V0KQ0KDQoNCg0KYGBgDQoNCn4vZ2F0ay1kYXRhLXJlZiQgZ3N1dGlsIGNwIGdzOi8vZ2Vub21pY3MtcHVibGljLWRhdGEvcmVzb3VyY2VzL2Jyb2FkL2hnMzgvdjAvSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZGJzbnAxMzgudmNmIGRic25wMTM4LnZjZg0KDQp+L2dhdGstZGF0YS1yZWYkIGdzdXRpbCBjcCBnczovL2dlbm9taWNzLXB1YmxpYy1kYXRhL3Jlc291cmNlcy9icm9hZC9oZzM4L3YwL0hvbW9fc2FwaWVuc19hc3NlbWJseTM4LmRic25wMTM4LnZjZi5pZHggZGJzbnAxMzgudmNmLmlkeA0KDQp+L2dhdGstZGF0YS1yZWYkIGdzdXRpbCBjcCBnczovL2dlbm9taWNzLXB1YmxpYy1kYXRhL3Jlc291cmNlcy9icm9hZC9oZzM4L3YwL0hvbW9fc2FwaWVuc19hc3NlbWJseTM4Lmtub3duX2luZGVscy52Y2YuZ3ogaGczOC5rbm93bl9pbmRlbHMudmNmLmd6DQoNCn4vZ2F0ay1kYXRhLXJlZiQgZ3N1dGlsIGNwIGdzOi8vZ2Vub21pY3MtcHVibGljLWRhdGEvcmVzb3VyY2VzL2Jyb2FkL2hnMzgvdjAvSG9tb19zYXBpZW5zX2Fzc2VtYmx5Mzgua25vd25faW5kZWxzLnZjZi5nei50YmkgaGczOC5rbm93bl9pbmRlbHMudmNmLmd6LnRiaQ0KIA0Kfi9nYXRrLWRhdGEtcmVmJCBnc3V0aWwgY3AgZ3M6Ly9nZW5vbWljcy1wdWJsaWMtZGF0YS9yZXNvdXJjZXMvYnJvYWQvaGczOC92MC9NaWxsc19hbmRfMTAwMEdfZ29sZF9zdGFuZGFyZC5pbmRlbHMuaGczOC52Y2YuZ3ogZ29sZF9zdGFuZGFyZC5pbmRlbHMuaGczOC52Y2YuZ3oNCg0Kfi9nYXRrLWRhdGEtcmVmJCBnc3V0aWwgY3AgZ3M6Ly9nZW5vbWljcy1wdWJsaWMtZGF0YS9yZXNvdXJjZXMvYnJvYWQvaGczOC92MC9NaWxsc19hbmRfMTAwMEdfZ29sZF9zdGFuZGFyZC5pbmRlbHMuaGczOC52Y2YuZ3oudGJpIGdvbGRfc3RhbmRhcmQuaW5kZWxzLmhnMzgudmNmLmd6LnRiaQ0KDQpgYGANCg0KDQojIyBBZGRpdGlvbmFsIGRpcmVjdG9yeSBjb250ZW50cw0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgbHMgLWwNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgMTA5NTA4MjcyMTMgTWF5ICA2IDAyOjQ1IGRic25wMTM4LnZjZg0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAxMjQ4MDQxMiBNYXkgIDYgMDI6NDYgZGJzbnAxMzgudmNmLmlkeA0KDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgIDIwNjg1ODgwIE1heSAgNiAwMjo0OCBnb2xkX3N0YW5kYXJkLmluZGVscy5oZzM4LnZjZi5neg0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgMTUwMDAxMyBNYXkgIDYgMDI6NDkgZ29sZF9zdGFuZGFyZC5pbmRlbHMuaGczOC52Y2YuZ3oudGJpDQoNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgNjE2OTIzMDYgTWF5ICA2IDAyOjQ2IGhnMzgua25vd25faW5kZWxzLnZjZi5neg0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgMTU2Nzg4NiBNYXkgIDYgMDI6NDcgaGczOC5rbm93bl9pbmRlbHMudmNmLmd6LnRiaQ0KDQoNCg0KDQojIyBSdW4gZ2F0ayBCYXNlUmVjYWxpYnJhdG9yICh0byBvYnRhaW4gYSByZWNhbGlicmF0aW9uIHRhYmxlIGZvciBjaHJvbW9zb21lIDIwKQ0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBnYXRrIEJhc2VSZWNhbGlicmF0b3IgLVIgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgLUkgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5tZHVwLmJhbSAtTCBjaHIyMCAtLWtub3duLXNpdGVzIGRic25wMTM4LnZjZiAtLWtub3duLXNpdGVzIGdvbGRfc3RhbmRhcmQuaW5kZWxzLmhnMzgudmNmLmd6IC0ta25vd24tc2l0ZXMgaGczOC5rbm93bl9pbmRlbHMudmNmLmd6IC1PIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MubWR1cC5jaHIyMC5yZWNhbC50YWJsZQ0KDQoNCg0KDQojIyBSdW4gZ2F0ayBBcHBseUJRU1INCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGdhdGsgQXBwbHlCUVNSIC1SIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhIC1JIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5iYW0gLUwgY2hyMjAgLS1icXNyLXJlY2FsLWZpbGUgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5tZHVwLmNocjIwLnJlY2FsLnRhYmxlIC1PIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5yZWNhbC5iYW0NCg0KDQoNCiMjIEFkZGl0aW9uYWwgZGlyZWN0b3J5IGNvbnRlbnRzDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBscyAtbA0KDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgIDg1NDI2MCBNYXkgIDYgMTU6NDcgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5tZHVwLmNocjIwLnJlY2FsLnRhYmxlDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgIDIyNDI5NiBNYXkgIDYgMTc6MDcgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLmJhaQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3IDQ5NzE3OTUzMTAgTWF5ICA2IDE3OjA3IFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5yZWNhbC5iYW0NCg0KDQoNCg0KIyMgQ2FsbCB2YXJpYW50cyB1c2luZyBib3RoIHVuY2FsaWJyYXRlZCBhbmQgY2FsaWJyYXRlZCBCQU0gZmlsZXMgaW4gYSBnZW5lIG9mIHlvdXIgY2hvaWNlIChjaG9saW5lcmdpYyBuaWNvdGluYyByZWNlcHRvciBhbHBoYSA0OyBjaHJuYTQsIGNocjIwOiA2MywzNDMsMzEwLi42MywzNzUsNDcxKSBhbmQgYSBjaHJvbW9zb21hbCByZWdpb24gKGNocjIwOjE1LDgwMCwwMDAtMTYsMTAwLDAwMCkgYW5kDQoNCg0KDQoNCiMjIEEuIENhbGwgdmFyaWFudHMgaW4gY2hvbGluZXJnaWMgbmljb3RpbmMgcmVjZXB0b3IgYWxwaGEgNCAoY2hybmE0KSBnZW5lIChjaHIyMDogNjMsMzQzLDMxMC4uNjMsMzc1LDQ3MSkNCg0KDQojIyMgQTEuIENhbGwgaGFwbG90eXBlcyBhbmQgdmFyaWFudHMgdXNpbmcgdGhlIGJhc2UgdW5yZWNhbGlicmF0ZWQgQkFNIGZpbGVzIChpbiB0aGUgcmVnaW9uIGNocjIwOiA2MywzNDMsMzEwLi42MywzNzUsNDcxKQ0KDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGdhdGsgSGFwbG90eXBlQ2FsbGVyIC1SIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhIC1JIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5iYW0gLUwgY2hyMjA6NjMsMzQzLDMxMC02MywzNzUsNDcxIC1PIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5jaHJuYTQudmNmDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGJjZnRvb2xzIHN0YXRzIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5jaHJuYTQudmNmDQoNCmBgYA0KIyBUaGlzIGZpbGUgd2FzIHByb2R1Y2VkIGJ5IGJjZnRvb2xzIHN0YXRzICgxLjkraHRzbGliLTEuOSkgYW5kIGNhbiBiZSBwbG90dGVkIHVzaW5nIHBsb3QtdmNmc3RhdHMuDQojIFRoZSBjb21tYW5kIGxpbmUgd2FzOiBiY2Z0b29scyBzdGF0cyAgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLmNocm5hNC52Y2YNCiMNCiMgRGVmaW5pdGlvbiBvZiBzZXRzOg0KIyBJRCAgICBbMl1pZCAgIFszXXRhYi1zZXBhcmF0ZWQgZmlsZSBuYW1lcw0KSUQgICAgICAwICAgICAgIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5jaHJuYTQudmNmDQojIFNOLCBTdW1tYXJ5IG51bWJlcnM6DQojICAgbnVtYmVyIG9mIHJlY29yZHMgICAuLiBudW1iZXIgb2YgZGF0YSByb3dzIGluIHRoZSBWQ0YNCiMgICBudW1iZXIgb2Ygbm8tQUxUcyAgIC4uIHJlZmVyZW5jZS1vbmx5IHNpdGVzLCBBTFQgaXMgZWl0aGVyICIuIiBvciBpZGVudGljYWwgdG8gUkVGDQojICAgbnVtYmVyIG9mIFNOUHMgICAgICAuLiBudW1iZXIgb2Ygcm93cyB3aXRoIGEgU05QDQojICAgbnVtYmVyIG9mIE1OUHMgICAgICAuLiBudW1iZXIgb2Ygcm93cyB3aXRoIGEgTU5QLCBzdWNoIGFzIENDPlRUDQojICAgbnVtYmVyIG9mIGluZGVscyAgICAuLiBudW1iZXIgb2Ygcm93cyB3aXRoIGFuIGluZGVsDQojICAgbnVtYmVyIG9mIG90aGVycyAgICAuLiBudW1iZXIgb2Ygcm93cyB3aXRoIG90aGVyIHR5cGUsIGZvciBleGFtcGxlIGEgc3ltYm9saWMgYWxsZWxlIG9yDQojICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNvbXBsZXggc3Vic3RpdHV0aW9uLCBzdWNoIGFzIEFDVD5UQ0dBDQojICAgbnVtYmVyIG9mIG11bHRpYWxsZWxpYyBzaXRlcyAgICAgLi4gbnVtYmVyIG9mIHJvd3Mgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGUgYWxsZWxlcw0KIyAgIG51bWJlciBvZiBtdWx0aWFsbGVsaWMgU05QIHNpdGVzIC4uIG51bWJlciBvZiByb3dzIHdpdGggbXVsdGlwbGUgYWx0ZXJuYXRlIGFsbGVsZXMsIGFsbCBTTlBzDQojIA0KIyAgIE5vdGUgdGhhdCByb3dzIGNvbnRhaW5pbmcgbXVsdGlwbGUgdHlwZXMgd2lsbCBiZSBjb3VudGVkIG11bHRpcGxlIHRpbWVzLCBpbiBlYWNoDQojICAgY291bnRlci4gRm9yIGV4YW1wbGUsIGEgcm93IHdpdGggYSBTTlAgYW5kIGFuIGluZGVsIGluY3JlbWVudHMgYm90aCB0aGUgU05QIGFuZA0KIyAgIHRoZSBpbmRlbCBjb3VudGVyLg0KIyANCiMgU04gICAgWzJdaWQgICBbM11rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzRddmFsdWUNClNOICAgICAgMCAgICAgICBudW1iZXIgb2Ygc2FtcGxlczogICAgICAgICAgICAgICAgICAgICAgMQ0KU04gICAgICAwICAgICAgIG51bWJlciBvZiByZWNvcmRzOiAgICAgICAgICAgICAgICAgICAgICA4Mw0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBuby1BTFRzOiAgICAgICAgICAgICAgICAgICAgICAwDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIFNOUHM6ICAgICAgICAgICAgICAgICAgICAgICAgIDY5DQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIE1OUHM6ICAgICAgICAgICAgICAgICAgICAgICAgIDANClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgaW5kZWxzOiAgICAgICAgICAgICAgICAgICAgICAgMTQNClNOICAgICAgMCAgICAgICBudW1iZXIgb2Ygb3RoZXJzOiAgICAgICAgICAgICAgICAgICAgICAgMA0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBtdWx0aWFsbGVsaWMgc2l0ZXM6ICAgICAgICAgICAwDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG11bHRpYWxsZWxpYyBTTlAgc2l0ZXM6ICAgICAgIDANCg0KYGBgDQoNCg0KIyMjIEEyLiBDYWxsIGhhcGxvdHlwZXMgYW5kIHZhcmlhbnRzIHVzaW5nIHRoZSBiYXNlIHJlY2FsaWJyYXRlZCBCQU0gZmlsZXMgKGluIHRoZSByZWdpb24gY2hyMjA6IDYzLDM0MywzMTAuLjYzLDM3NSw0NzEpDQoNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgZ2F0ayBIYXBsb3R5cGVDYWxsZXIgLVIgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgLUkgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLmJhbSAtTCBjaHIyMDo2MywzNDMsMzEwLTYzLDM3NSw0NzEgLU8gU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLmNocm5hNC52Y2YNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgYmNmdG9vbHMgc3RhdHMgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLmNocm5hNC52Y2YgfCBsZXNzDQoNCmBgYA0KDQojIFRoaXMgZmlsZSB3YXMgcHJvZHVjZWQgYnkgYmNmdG9vbHMgc3RhdHMgKDEuOStodHNsaWItMS45KSBhbmQgY2FuIGJlIHBsb3R0ZWQgdXNpbmcgcGxvdC12Y2ZzdGF0cy4NCiMgVGhlIGNvbW1hbmQgbGluZSB3YXM6IGJjZnRvb2xzIHN0YXRzICBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwLm1kdXAucmVjYWwuY2hybmE0LnZjZg0KIw0KIyBEZWZpbml0aW9uIG9mIHNldHM6DQojIElEICAgIFsyXWlkICAgWzNddGFiLXNlcGFyYXRlZCBmaWxlIG5hbWVzDQpJRCAgICAgIDAgICAgICAgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLmNocm5hNC52Y2YNCiMgU04sIFN1bW1hcnkgbnVtYmVyczoNCiMgICBudW1iZXIgb2YgcmVjb3JkcyAgIC4uIG51bWJlciBvZiBkYXRhIHJvd3MgaW4gdGhlIFZDRg0KIyAgIG51bWJlciBvZiBuby1BTFRzICAgLi4gcmVmZXJlbmNlLW9ubHkgc2l0ZXMsIEFMVCBpcyBlaXRoZXIgIi4iIG9yIGlkZW50aWNhbCB0byBSRUYNCiMgICBudW1iZXIgb2YgU05QcyAgICAgIC4uIG51bWJlciBvZiByb3dzIHdpdGggYSBTTlANCiMgICBudW1iZXIgb2YgTU5QcyAgICAgIC4uIG51bWJlciBvZiByb3dzIHdpdGggYSBNTlAsIHN1Y2ggYXMgQ0M+VFQNCiMgICBudW1iZXIgb2YgaW5kZWxzICAgIC4uIG51bWJlciBvZiByb3dzIHdpdGggYW4gaW5kZWwNCiMgICBudW1iZXIgb2Ygb3RoZXJzICAgIC4uIG51bWJlciBvZiByb3dzIHdpdGggb3RoZXIgdHlwZSwgZm9yIGV4YW1wbGUgYSBzeW1ib2xpYyBhbGxlbGUgb3INCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY29tcGxleCBzdWJzdGl0dXRpb24sIHN1Y2ggYXMgQUNUPlRDR0ENCiMgICBudW1iZXIgb2YgbXVsdGlhbGxlbGljIHNpdGVzICAgICAuLiBudW1iZXIgb2Ygcm93cyB3aXRoIG11bHRpcGxlIGFsdGVybmF0ZSBhbGxlbGVzDQojICAgbnVtYmVyIG9mIG11bHRpYWxsZWxpYyBTTlAgc2l0ZXMgLi4gbnVtYmVyIG9mIHJvd3Mgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGUgYWxsZWxlcywgYWxsIFNOUHMNCiMgDQojICAgTm90ZSB0aGF0IHJvd3MgY29udGFpbmluZyBtdWx0aXBsZSB0eXBlcyB3aWxsIGJlIGNvdW50ZWQgbXVsdGlwbGUgdGltZXMsIGluIGVhY2gNCiMgICBjb3VudGVyLiBGb3IgZXhhbXBsZSwgYSByb3cgd2l0aCBhIFNOUCBhbmQgYW4gaW5kZWwgaW5jcmVtZW50cyBib3RoIHRoZSBTTlAgYW5kDQojICAgdGhlIGluZGVsIGNvdW50ZXIuDQojIA0KIyBTTiAgICBbMl1pZCAgIFszXWtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNF12YWx1ZQ0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBzYW1wbGVzOiAgICAgICAgICAgICAgICAgICAgICAxDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIHJlY29yZHM6ICAgICAgICAgICAgICAgICAgICAgIDgyDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG5vLUFMVHM6ICAgICAgICAgICAgICAgICAgICAgIDANClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgU05QczogICAgICAgICAgICAgICAgICAgICAgICAgNjgNClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgTU5QczogICAgICAgICAgICAgICAgICAgICAgICAgMA0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBpbmRlbHM6ICAgICAgICAgICAgICAgICAgICAgICAxNA0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBvdGhlcnM6ICAgICAgICAgICAgICAgICAgICAgICAwDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG11bHRpYWxsZWxpYyBzaXRlczogICAgICAgICAgIDANClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgbXVsdGlhbGxlbGljIFNOUCBzaXRlczogICAgICAgMA0KDQpgYGANCg0KDQojIyMgQTMuIEFkZGl0aW9uYWwgZGlyZWN0b3J5IGNvbnRlbnRzDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBscyAtbA0KDQoNCmBgYA0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgICAxOTE4ODIgTWF5ICA3IDE1OjQ0IFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5jaHJuYTQudmNmDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICAgMTE0NjE3IE1heSAgNyAxNTo0NCBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwLm1kdXAuY2hybmE0LnZjZi5pZHgNCg0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgIDE5MTY0MiBNYXkgIDcgMTU6NTAgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLmNocm5hNC52Y2YNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgICAxMTQ2MjMgTWF5ICA3IDE1OjUwIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5yZWNhbC5jaHJuYTQudmNmLmlkeA0KYGBgDQoNCg0KDQoNCg0KDQoNCiMjIEIuIENhbGwgdmFyaWFudHMgaW4gaW4gYSBjaHJvbW9zb21hbCByZWdpb24gKGNocjIwOjE1LDgwMCwwMDAtMTYsMTAwLDAwMCkNCg0KDQojIyMgQjEuIENhbGwgaGFwbG90eXBlcyBhbmQgdmFyaWFudHMgdXNpbmcgdGhlIHVucmVjYWxpYnJhdGVkIEJBTSBmaWxlcyAoaW4gdGhlIHJlZ2lvbiBjaHIyMDoxNSw4MDAsMDAwLTE2LDEwMCwwMDAgKQ0KDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGdhdGsgSGFwbG90eXBlQ2FsbGVyIC1SIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhIC1JIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5iYW0gLUwgY2hyMjA6MTUsODAwLDAwMC0xNiwxMDAsMDAwIC1PIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC4xNW04MDBrLTE2TTEwMGsudmNmDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGJjZnRvb2xzIHN0YXRzIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC4xNW04MDBrLTE2TTEwMGsudmNmDQoNCmBgYA0KIyBUaGlzIGZpbGUgd2FzIHByb2R1Y2VkIGJ5IGJjZnRvb2xzIHN0YXRzICgxLjkraHRzbGliLTEuOSkgYW5kIGNhbiBiZSBwbG90dGVkIHVzaW5nIHBsb3QtdmNmc3RhdHMuDQojIFRoZSBjb21tYW5kIGxpbmUgd2FzOiBiY2Z0b29scyBzdGF0cyAgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLjE1bTgwMGstMTZNMTAway52Y2YNCg0KIyBTTiAgICBbMl1pZCAgIFszXWtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNF12YWx1ZQ0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBzYW1wbGVzOiAgICAgICAgICAgICAgICAgICAgICAxDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIHJlY29yZHM6ICAgICAgICAgICAgICAgICAgICAgIDQ5Mw0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBuby1BTFRzOiAgICAgICAgICAgICAgICAgICAgICAwDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIFNOUHM6ICAgICAgICAgICAgICAgICAgICAgICAgIDQwMg0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBNTlBzOiAgICAgICAgICAgICAgICAgICAgICAgICAwDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIGluZGVsczogICAgICAgICAgICAgICAgICAgICAgIDkxDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG90aGVyczogICAgICAgICAgICAgICAgICAgICAgIDENClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgbXVsdGlhbGxlbGljIHNpdGVzOiAgICAgICAgICAgNA0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBtdWx0aWFsbGVsaWMgU05QIHNpdGVzOiAgICAgICAwDQoNCmBgYA0KDQoNCiMjIyBCMi4gQ2FsbCBoYXBsb3R5cGVzIGFuZCB2YXJpYW50cyBpbiB0aGUgcmVjYWxpYnJhdGVkIEJBTSBmaWxlcyAoaW4gdGhlIHJlZ2lvbiBjaHIyMDoxNSw4MDAsMDAwLTE2LDEwMCwwMDAgKQ0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgZ2F0ayBIYXBsb3R5cGVDYWxsZXIgLVIgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgLUkgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLmJhbSAtTCBjaHIyMDoxNSw4MDAsMDAwLTE2LDEwMCwwMDAgLU8gU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLjE1bTgwMGstMTZNMTAway52Y2YNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgYmNmdG9vbHMgc3RhdHMgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLjE1bTgwMGstMTZNMTAway52Y2YgfCBsZXNzDQoNCmBgYA0KIyBUaGlzIGZpbGUgd2FzIHByb2R1Y2VkIGJ5IGJjZnRvb2xzIHN0YXRzICgxLjkraHRzbGliLTEuOSkgYW5kIGNhbiBiZSBwbG90dGVkIHVzaW5nIHBsb3QtdmNmc3RhdHMuDQojIFRoZSBjb21tYW5kIGxpbmUgd2FzOiBiY2Z0b29scyBzdGF0cyAgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLnJlY2FsLjE1bTgwMGstMTZNMTAway52Y2YNCiMNCiMgRGVmaW5pdGlvbiBvZiBzZXRzOg0KIyBJRCAgICBbMl1pZCAgIFszXXRhYi1zZXBhcmF0ZWQgZmlsZSBuYW1lcw0KSUQgICAgICAwICAgICAgIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5yZWNhbC4xNW04MDBrLTE2TTEwMGsudmNmDQojIFNOLCBTdW1tYXJ5IG51bWJlcnM6DQojICAgbnVtYmVyIG9mIHJlY29yZHMgICAuLiBudW1iZXIgb2YgZGF0YSByb3dzIGluIHRoZSBWQ0YNCiMgICBudW1iZXIgb2Ygbm8tQUxUcyAgIC4uIHJlZmVyZW5jZS1vbmx5IHNpdGVzLCBBTFQgaXMgZWl0aGVyICIuIiBvciBpZGVudGljYWwgdG8gUkVGDQojICAgbnVtYmVyIG9mIFNOUHMgICAgICAuLiBudW1iZXIgb2Ygcm93cyB3aXRoIGEgU05QDQojICAgbnVtYmVyIG9mIE1OUHMgICAgICAuLiBudW1iZXIgb2Ygcm93cyB3aXRoIGEgTU5QLCBzdWNoIGFzIENDPlRUDQojICAgbnVtYmVyIG9mIGluZGVscyAgICAuLiBudW1iZXIgb2Ygcm93cyB3aXRoIGFuIGluZGVsDQojICAgbnVtYmVyIG9mIG90aGVycyAgICAuLiBudW1iZXIgb2Ygcm93cyB3aXRoIG90aGVyIHR5cGUsIGZvciBleGFtcGxlIGEgc3ltYm9saWMgYWxsZWxlIG9yDQojICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNvbXBsZXggc3Vic3RpdHV0aW9uLCBzdWNoIGFzIEFDVD5UQ0dBDQojICAgbnVtYmVyIG9mIG11bHRpYWxsZWxpYyBzaXRlcyAgICAgLi4gbnVtYmVyIG9mIHJvd3Mgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGUgYWxsZWxlcw0KIyAgIG51bWJlciBvZiBtdWx0aWFsbGVsaWMgU05QIHNpdGVzIC4uIG51bWJlciBvZiByb3dzIHdpdGggbXVsdGlwbGUgYWx0ZXJuYXRlIGFsbGVsZXMsIGFsbCBTTlBzDQojIA0KIyAgIE5vdGUgdGhhdCByb3dzIGNvbnRhaW5pbmcgbXVsdGlwbGUgdHlwZXMgd2lsbCBiZSBjb3VudGVkIG11bHRpcGxlIHRpbWVzLCBpbiBlYWNoDQojICAgY291bnRlci4gRm9yIGV4YW1wbGUsIGEgcm93IHdpdGggYSBTTlAgYW5kIGFuIGluZGVsIGluY3JlbWVudHMgYm90aCB0aGUgU05QIGFuZA0KIyAgIHRoZSBpbmRlbCBjb3VudGVyLg0KIyANCiMgU04gICAgWzJdaWQgICBbM11rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzRddmFsdWUNClNOICAgICAgMCAgICAgICBudW1iZXIgb2Ygc2FtcGxlczogICAgICAgICAgICAgICAgICAgICAgMQ0KU04gICAgICAwICAgICAgIG51bWJlciBvZiByZWNvcmRzOiAgICAgICAgICAgICAgICAgICAgICA0ODkNClNOICAgICAgMCAgICAgICBudW1iZXIgb2Ygbm8tQUxUczogICAgICAgICAgICAgICAgICAgICAgMA0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBTTlBzOiAgICAgICAgICAgICAgICAgICAgICAgICAzOTcNClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgTU5QczogICAgICAgICAgICAgICAgICAgICAgICAgMA0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBpbmRlbHM6ICAgICAgICAgICAgICAgICAgICAgICA5Mg0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBvdGhlcnM6ICAgICAgICAgICAgICAgICAgICAgICAxDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG11bHRpYWxsZWxpYyBzaXRlczogICAgICAgICAgIDQNClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgbXVsdGlhbGxlbGljIFNOUCBzaXRlczogICAgICAgMA0KDQpgYGANCg0KIyMjIEIzLiBBZGRpdGlvbmFsIGRpcmVjdG9yeSBjb250ZW50cw0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgbHMgLWwNCg0KYGBgDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICAgMjc1MzUyIE1heSAgNyAxNjozMyBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwLm1kdXAuMTVtODAway0xNk0xMDBrLnZjZg0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgIDExODE2MyBNYXkgIDcgMTY6MzMgU1JSNjIyNDU5XzEuc29ydGVkLk5tTWRUcVRncy5jaHIyMC5tZHVwLjE1bTgwMGstMTZNMTAway52Y2YuaWR4DQoNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgICAyNzQxODAgTWF5ICA3IDAxOjMzIFNSUjYyMjQ1OV8xLnNvcnRlZC5ObU1kVHFUZ3MuY2hyMjAubWR1cC5yZWNhbC4xNW04MDBrLTE2TTEwMGsudmNmDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICAgMTE4MTY4IE1heSAgNyAwMTozMyBTUlI2MjI0NTlfMS5zb3J0ZWQuTm1NZFRxVGdzLmNocjIwLm1kdXAucmVjYWwuMTVtODAway0xNk0xMDBrLnZjZi5pZHgNCg0KYGBgDQoNCg==