Machine

AWS m4.xlarge (16 GiB RAM)

References

** “A tutorial on conducting Genome-Wide-Association Studies: Quality control and statistical analysis” (https://www.ncbi.nlm.nih.gov/pubmed/29484742)**

Softwares

$ plink2

PLINK v1.90p 64-bit (25 Mar 2016) https://www.cog-genomics.org/plink2 (C) 2005-2016 Shaun Purcell, Christopher Chang GNU General Public License v3

plink [input flag(s)…] {command flag(s)…} {other flag(s)…} plink –help {flag name(s)…}

Commands include –make-bed, –recode, –flip-scan, –merge-list, –write-snplist, –list-duplicate-vars, –freqx, –missing, –test-mishap, –hardy, –mendel, –ibc, –impute-sex, –indep-pairphase, –r2, –show-tags, –blocks, –distance, –genome, –homozyg, –make-rel, –make-grm-gz, –rel-cutoff, –cluster, –pca, –neighbour, –ibs-test, –regress-distance, –model, –bd, –gxe, –logistic, –dosage, –lasso, –test-missing, –make-perm-pheno, –unrelated-heritability, –tdt, –dfam, –qfam, –annotate, –clump, –gene-report, –meta-analysis, –epistasis, –fast-epistasis, and –score.

‘plink –help | more’ describes all functions (warning: long).

library(pdftools)

Obtain data

~/GWAS_IJMPR$ git clone https://github.com/MareesAT/GWA_tutorial.git

Cloning into ‘GWA_tutorial’…

~/GWAS_IJMPR$ ls GWA_tutorial/

1_QC_GWAS.zip

2_Population_stratification.zip

3_Association_GWAS.zip

4_PRS.doc

README.md

~/GWAS_IJMPR/GWA_tutorial$ unzip 1_QC_GWAS.zip

Archive: 1_QC_GWAS.zip inflating: 1_QC_GWAS/1_Main_script_QC_GWAS.txt
inflating: 1_QC_GWAS/check_heterozygosity_rate.R
inflating: 1_QC_GWAS/gender_check.R
inflating: 1_QC_GWAS/HapMap_3_r3_1.bed
inflating: 1_QC_GWAS/HapMap_3_r3_1.bim
inflating: 1_QC_GWAS/HapMap_3_r3_1.fam
inflating: 1_QC_GWAS/heterozygosity_outliers_list.R
inflating: 1_QC_GWAS/hist_miss.R
inflating: 1_QC_GWAS/hwe.R
inflating: 1_QC_GWAS/inversion.txt
inflating: 1_QC_GWAS/MAF_check.R
inflating: 1_QC_GWAS/pops_HapMap_3_r3
inflating: 1_QC_GWAS/Relatedness.R

~/GWAS_IJMPR/GWA_tutorial$ unzip 2_Population_stratification.zip

Archive: 2_Population_stratification.zip inflating: 2_Population_stratification/1_Main_script_QC_GWAS.txt
inflating: 2_Population_stratification/2_Main_script_MDS.txt
inflating: 2_Population_stratification/MDS_merged.R

~/GWAS_IJMPR/GWA_tutorial$ unzip 3_Association_GWAS.zip

Archive: 3_Association_GWAS.zip inflating: 3_Association_GWAS/3_Main_script_association_GWAS.txt
inflating: 3_Association_GWAS/Manhattan_plot.R
inflating: 3_Association_GWAS/QQ_plot.R

Check directory contents

All files were copied to the ‘~/GWAS_IJMPR’ folder.

~/GWAS_IJMPR$ ls -l

-rw-rw-r-- 1 ubuntu ubuntu    12609 Sep 21 13:26 1_Main_script_QC_GWAS.txt

-rw-rw-r-- 1 ubuntu ubuntu 61231677 Jan 25  2016 HapMap_3_r3_1.bed**

-rw-rw-r-- 1 ubuntu ubuntu 40635824 Jan 25  2016 HapMap_3_r3_1.bim

-rw-rw-r-- 1 ubuntu ubuntu     4136 Jan 25  2016 HapMap_3_r3_1.fam

-rw-rw-r-- 1 ubuntu ubuntu      162 Sep  1  2015 MAF_check.R

-rw-rw-r-- 1 ubuntu ubuntu      923 Nov 26  2015 Relatedness.R

-rw-rw-r-- 1 ubuntu ubuntu      235 Jan 22  2016 check_heterozygosity_rate.R

-rw-rw-r-- 1 ubuntu ubuntu      352 Aug 28  2015 gender_check.R

-rw-rw-r-- 1 ubuntu ubuntu      371 Aug 20  2015 heterozygosity_outliers_list.R

-rw-rw-r-- 1 ubuntu ubuntu      410 Sep 10  2015 hist_miss.R

-rw-rw-r-- 1 ubuntu ubuntu      287 Sep  2  2015 hwe.R

-rw-rw-r-- 1 ubuntu ubuntu       88 Jun 25  2015 inversion.txt

-rw-rw-r-- 1 ubuntu ubuntu    39242 Sep  7  2015 pops_HapMap_3_r3



-rw-rw-r-- 1 ubuntu ubuntu       11905 Jun 22  2017 1_Main_script_QC_GWAS.txt

-rw-rw-r-- 1 ubuntu ubuntu       10886 Sep 21 17:27 2_Main_script_MDS.txt

**-rw-rw-r-- 1 ubuntu ubuntu    30050331 Nov 29 03:26 HapMap_3_r3_12.bed**

**-rw-rw-r-- 1 ubuntu ubuntu    29846054 Nov 29 03:26 HapMap_3_r3_12.bim**

**-rw-rw-r-- 1 ubuntu ubuntu        2296 Nov 29 03:26 HapMap_3_r3_12.fam**

**-rw-rw-r-- 1 ubuntu ubuntu         997 Nov 29 03:26 HapMap_3_r3_12.log**

-rw-rw-r-- 1 ubuntu ubuntu        1343 Jan 22  2016 MDS_merged.R

**-rw-rw-r-- 1 ubuntu ubuntu     1058938 Nov 29 03:26 indepSNP.prune.in**



-rw-rw-r-- 1 ubuntu ubuntu 5949 Sep 21 14:04 3_Main_script_association_GWAS.txt

-rw-rw-r-- 1 ubuntu ubuntu  596 Sep 21 14:06 Manhattan_plot.R

-rw-rw-r-- 1 ubuntu ubuntu  525 Sep 21 14:06 QQ_plot.R

-Double asterisk (**) quoted files will be generated and should be deleted before beginning.

-HapMap_3_r3_1 is sourced from the link given below:

http://hapmap.ncbi.nlm.nih.gov/downloads/genotypes/2010-05_phaseIII/plink_format/

1_Quality control and statistical analysis for Genome-Wide-Association Studies (GWAS)

Preview file contents

bed/genotype file

bim/map file

fam/ped file

bim or map file (chromosome no., snp.name, cM, position, allele.1, allele.2)

$ head HapMap_3_r3_1.bim


1   rs2185539   0   556738  T   C

1   rs11510103  0   557616  G   A

1   rs11240767  0   718814  T   C

1   rs3131972   0   742584  A   G

1   rs3131969   0   744045  A   G

1   rs1048488   0   750775  C   T

1   rs12562034  0   758311  A   G

1   rs12124819  0   766409  G   A

1   rs4040617   0   769185  G   A

1   rs2905036   0   782343  C   T

fam file (pedigree no, member, father, mother, sex, affected)

$ head HapMap_3_r3_1.fam


1328 NA06989 0 0 2 2

1377 NA11891 0 0 1 2

1349 NA11843 0 0 1 1

1330 NA12341 0 0 2 2

1444 NA12739 NA12748 NA12749 1 -9

1344 NA10850 0 NA12058 2 -9

1328 NA06984 0 0 1 2

1463 NA12877 NA12889 NA12890 1 -9

1418 NA12275 0 0 2 1

13291 NA06986 0 0 1 1

Preview file contents and/or data using snpStat

bed/genotype file

bim/map file

fam/ped file

library(snpStats)
gwas <- read.plink("1_QC_GWAS/HapMap_3_r3_1.bed", "1_QC_GWAS/HapMap_3_r3_1.bim", "1_QC_GWAS/HapMap_3_r3_1.fam")
str(gwas)
List of 3
 $ genotypes:Formal class 'SnpMatrix' [package "snpStats"] with 1 slot
  .. ..@ .Data: raw [1:165, 1:1457897] 03 03 03 03 ...
  .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. ..$ : chr [1:165] "NA06989" "NA11891" "NA11843" "NA12341" ...
  .. .. .. ..$ : chr [1:1457897] "rs2185539" "rs11510103" "rs11240767" "rs3131972" ...
 $ fam      :'data.frame':  165 obs. of  6 variables:
  ..$ pedigree: int [1:165] 1328 1377 1349 1330 1444 1344 1328 1463 1418 13291 ...
  ..$ member  : chr [1:165] "NA06989" "NA11891" "NA11843" "NA12341" ...
  ..$ father  : chr [1:165] NA NA NA NA ...
  ..$ mother  : chr [1:165] NA NA NA NA ...
  ..$ sex     : int [1:165] 2 1 1 2 1 2 1 1 2 1 ...
  ..$ affected: int [1:165] 2 2 1 2 NA NA 2 NA 1 1 ...
 $ map      :'data.frame':  1457897 obs. of  6 variables:
  ..$ chromosome: int [1:1457897] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ snp.name  : chr [1:1457897] "rs2185539" "rs11510103" "rs11240767" "rs3131972" ...
  ..$ cM        : logi [1:1457897] NA NA NA NA NA NA ...
  ..$ position  : int [1:1457897] 556738 557616 718814 742584 744045 750775 758311 766409 769185 782343 ...
  ..$ allele.1  : chr [1:1457897] "T" "G" "T" "A" ...
  ..$ allele.2  : chr [1:1457897] "C" "A" "C" "G" ...
gwas$genotypes
A SnpMatrix with  165 rows and  1457897 columns
Row names:  NA06989 ... NA12865 
Col names:  rs2185539 ... rs1973881 
head(col.summary(gwas$genotypes)$MAF)
[1] 0.00000000 0.00621118 0.00000000 0.15757576 0.13030303 0.15853659
head(gwas$fam)
head(gwas$map)
summary(gwas)
          Length    Class      Mode
genotypes 240553005 SnpMatrix  raw 
fam               6 data.frame list
map               6 data.frame list

Investigate missingness per individual and per SNP

$ Rscript –no-save hist_miss.R

pdf_convert("1_QC_GWAS/histimiss.pdf", format = "jpeg", dpi = 300)
proportion of missing SNPs per individual

proportion of missing SNPs per individual

pdf_convert("1_QC_GWAS/histlmiss.pdf", format = "jpeg", dpi = 300)
proportion of missing individuals per SNP

proportion of missing individuals per SNP

Delete SNPs and individuals with high levels of missingness

Delete SNPs with missingness >0.2.

Delete individuals with missingness >0.2.

Delete SNPs with missingness >0.02.

Delete individuals with missingness >0.02.

Check for sex discrepancy and impute sex if needed


Females must have a F value of <0.2, and males must have a F value >0.8. 

This F value is based on the X chromosome inbreeding (homozygosity) estimate.

$ head plink.sexcheck


    FID       IID       PEDSEX       SNPSEX       STATUS            F
    
   1328   NA06989            2            2           OK     -0.01176
   
   1377   NA11891            1            1           OK            1
   
   1349   NA11843            1            1           OK            1
   
   1330   NA12341            2            2           OK     -0.01271
   
   1444   NA12739            1            1           OK            1
   
   1344   NA10850            2            2           OK      0.01491
   
   1328   NA06984            1            1           OK            1
   
   1463   NA12877            1            1           OK            1
   
   1418   NA12275            2            2           OK      -0.1024

$ grep “PROBLEM” plink.sexcheck

1349 NA10854 2 1 PROBLEM 0.99

$ Rscript –no-save gender_check.R

pdf_convert("1_QC_GWAS/Gender_check.pdf", format = "jpeg", dpi = 300)
gender_check

gender_check

pdf_convert("1_QC_GWAS/Women_check.pdf", format = "jpeg", dpi = 300)
women_check

women_check

pdf_convert("1_QC_GWAS/Men_check.pdf", format = "jpeg", dpi = 300)
men_check

men_check

Impute sex

Generate a bfile with autosomal SNPs only and delete SNPs with a low minor allele frequency (MAF).

Select autosomal SNPs only (i.e., from chromosomes 1 to 22) into a text file.

$ awk ‘{ if ($1 >= 1 && $1 <= 22) print $2 }’ HapMap_3_r3_6.bim > snp_1_22.txt

$ head snp_1_22.txt

rs2185539

rs11240767

rs3131972

rs3131969

rs1048488

rs12562034

rs12124819

rs4040617

rs2905036

rs4245756

Extract autosomal SNPs only (i.e., from chromosomes 1 to 22) and make bed, bim and fam files

Plot minor allele frequency (MAF) distribution.

$ head MAF_check.frq


 CHR         SNP   A1   A2          MAF  NCHROBS
 
   1   rs2185539    T    C            0      224
   
   1  rs11240767    T    C            0      224
   
   1   rs3131972    A    G       0.1652      224
   
   1   rs3131969    A    G       0.1339      224
   
   1   rs1048488    C    T       0.1667      222
   
   1  rs12562034    A    G       0.1027      224
   
   1  rs12124819    G    A       0.2902      224
   
   1   rs4040617    G    A       0.1295      224
   
   1   rs2905036    C    T            0      224

$ Rscript –no-save MAF_check.R

pdf_convert("1_QC_GWAS/MAF_distribution.pdf", format = "jpeg", dpi = 300)
MAF_distribution

MAF_distribution

Remove SNPs with a low MAF frequency.

A conventional MAF threshold for a regular GWAS is between 0.01 or 0.05, depending on sample size.

Delete SNPs which are not in Hardy-Weinberg equilibrium (HWE)

Check the distribution of HWE p-values of all SNPs.

$ head plink.hwe


 CHR         SNP     TEST   A1   A2                 GENO   O(HET)   E(HET)            P 
 
   1   rs3131972      ALL    A    G              2/33/77   0.2946   0.2758       0.7324
   
   1   rs3131972      AFF    A    G              1/19/36   0.3393   0.3047        0.667
   
   1   rs3131972    UNAFF    A    G              1/14/41     0.25   0.2449            1
   
   1   rs3131969      ALL    A    G              2/26/84   0.2321    0.232            1
   
   1   rs3131969      AFF    A    G              1/17/38   0.3036   0.2817            1
   
   1   rs3131969    UNAFF    A    G               1/9/46   0.1607   0.1771       0.4189
   
   1   rs1048488      ALL    C    T              2/33/76   0.2973   0.2778       0.7324
   
   1   rs1048488      AFF    C    T              1/19/35   0.3455   0.3089       0.6661
   
   1   rs1048488    UNAFF    C    T              1/14/41     0.25   0.2449            1

$ awk ‘{ if ($9 <0.00001) print $0 }’ plink.hwe > plinkzoomhwe.hwe

wc -l plinkzoomhwe.hwe

13 plinkzoomhwe.hwe

$ head plinkzoomhwe.hwe


   3   rs7623291      ALL    T    C             22/28/62     0.25   0.4362    8.938e-06
   
   7  rs34238522      ALL    C    T              0/64/48   0.5714   0.4082    3.515e-06
   
   8   rs3102841      ALL    C    A              8/78/23   0.7156   0.4905    1.899e-06
   
   9    rs354831      ALL    C    T             12/18/82   0.1607   0.3047    6.339e-06
   
   9  rs10990625      ALL    C    T             23/28/61     0.25   0.4424    9.391e-06
   
   9  rs10990625      AFF    C    T              15/8/33   0.1429   0.4483    3.574e-07
   
  10   rs2918624      ALL    C    T              0/62/50   0.5536   0.4004     8.54e-06
  
  10   rs4934139      ALL    C    A              0/65/47   0.5804   0.4119    1.722e-06
  
  12   rs2303632    UNAFF    T    G             15/10/31   0.1786   0.4592    4.934e-06
  
  12   rs7963063    UNAFF    C    T             15/10/31   0.1786   0.4592    4.934e-06
  

$ Rscript –no-save hwe.R

pdf_convert("1_QC_GWAS/histhwe.pdf", format = "jpeg", dpi = 300)
hist_hwe

hist_hwe

pdf_convert("1_QC_GWAS/histhwe_below_theshold.pdf", format = "jpeg", dpi = 300)
hist_below_hwe

hist_below_hwe

Exclude high inversion regions (inversion.txt [High LD regions]), prune the SNPs and remove individuals with a heterozygosity rate deviating more than 3 sd from the mean

wc -l inversion.txt

2 inversion.txt

$ cat inversion.txt


6 25500000 33500000 8 HLA

8 8135000 12000000 Inversion8

$ wc -l indepSNP.prune.out

959189 indepSNP.prune.out

$ wc -l indepSNP.prune.in

104144 indepSNP.prune.in

$ head R_check.het


    FID       IID       O(HOM)       E(HOM)        N(NM)            F
    
   1328   NA06989        67039    6.747e+04       103911     -0.01172
   
   1377   NA11891        66847    6.684e+04       102970    0.0001494
   
   1349   NA11843        67262    6.756e+04       104071     -0.00829
   
   1330   NA12341        66654     6.74e+04       103826     -0.02051
   
   1444   NA12739        66687    6.656e+04       102519     0.003602
   
   1344   NA10850        67421    6.752e+04       104001    -0.002778
   
   1328   NA06984        66942    6.725e+04       103600    -0.008481
   
   1463   NA12877        67384     6.75e+04       103970    -0.003193
   
   1418   NA12275        66826    6.743e+04       103871     -0.01662

$ Rscript –no-save check_heterozygosity_rate.R

pdf_convert("1_QC_GWAS/heterozygosity.pdf", format = "jpeg", dpi = 300)
heterozygosity rate distribution

heterozygosity rate distribution

Rscript –no-save heterozygosity_outliers_list.R

Output of the command above: fail-het-qc.txt

$ wc -l fail-het-qc.txt

3 fail-het-qc.txt

$ cat fail-het-qc.txt


"FID" "IID" "O.HOM." "E.HOM." "N.NM." "F" "HET_RATE" "HET_DST"

1330 "NA12342" 68049 67240 103571 0.02229 0.342972453679119 -3.66942601978601

1459 "NA12874" 68802 67560 104068 0.0339 0.338874582004074 -5.05308902088892

$ sed ‘s/"// g’ fail-het-qc.txt | awk ‘{print$1, $2}’> het_fail_ind.txt

$ cat het_fail_ind.txt


FID IID

1330 NA12342

1459 NA12874

Analysis for cryptic relatedness: Exclude all individuals above the pihat threshold of 0.2


Two approaches: Cryptic relatedness approach  and Founders approach

Cryptic relatedness approach

$ wc -l pihat_min0.2.genome

98 pihat_min0.2.genome

$ head pihat_min0.2.genome


   FID1     IID1   FID2     IID2 RT    EZ      Z0      Z1      Z2  PI_HAT  PHE     DST     PPC   RATIO
   
   1377  NA11891   1377  NA10865 PO   0.5  0.0013  0.9977  0.0010  0.4998   0  0.823854  1.0000 3611.0000
   
   1349  NA11843   1349  NA10853 PO   0.5  0.0021  0.9905  0.0073  0.5026  -1  0.824896  1.0000 926.5000
   
   1330  NA12341   1330  NA12335 PO   0.5  0.0000  1.0000  0.0000  0.5000   0  0.822874  1.0000 924.2500
   
   1444  NA12739   1444  NA12749 PO   0.5  0.0018  0.9946  0.0037  0.5010  -1  0.824290  1.0000      NA
   
   1444  NA12739   1444  NA12748 PO   0.5  0.0015  0.9949  0.0037  0.5011   0  0.824316  1.0000 1227.3333
   
   1463  NA12877   1463  NA12890 PO   0.5  0.0000  1.0000  0.0000  0.5000   0  0.823256  1.0000 1231.6667
   
   1463  NA12877   1463  NA12889 PO   0.5  0.0140  0.9789  0.0071  0.4965   0  0.823620  1.0000 159.0435
   
   1418  NA12275   1418  NA10836 PO   0.5  0.0023  0.9970  0.0007  0.4992  -1  0.823716  1.0000      NA
   
  13291  NA06986  13291  NA06997 PO   0.5  0.0016  0.9951  0.0033  0.5008  -1  0.824240  1.0000 1835.5000
  

$ awk ‘{ if ($8 >0.9) print $0 }’ pihat_min0.2.genome > zoom_pihat.genome

$ wc -l zoom_pihat.genome

95 zoom_pihat.genome

$ head zoom_pihat.genome


   FID1     IID1   FID2     IID2 RT    EZ      Z0      Z1      Z2  PI_HAT PHE       DST     PPC   RATIO
   
   1377  NA11891   1377  NA10865 PO   0.5  0.0013  0.9977  0.0010  0.4998   0  0.823854  1.0000 3611.0000
   
   1349  NA11843   1349  NA10853 PO   0.5  0.0021  0.9905  0.0073  0.5026  -1  0.824896  1.0000 926.5000
   
   1330  NA12341   1330  NA12335 PO   0.5  0.0000  1.0000  0.0000  0.5000   0  0.822874  1.0000 924.2500
   
   1444  NA12739   1444  NA12749 PO   0.5  0.0018  0.9946  0.0037  0.5010  -1  0.824290  1.0000      NA
   
   1444  NA12739   1444  NA12748 PO   0.5  0.0015  0.9949  0.0037  0.5011   0  0.824316  1.0000 1227.3333
   
   1463  NA12877   1463  NA12890 PO   0.5  0.0000  1.0000  0.0000  0.5000   0  0.823256  1.0000 1231.6667
   
   1463  NA12877   1463  NA12889 PO   0.5  0.0140  0.9789  0.0071  0.4965   0  0.823620  1.0000 159.0435
   
   1418  NA12275   1418  NA10836 PO   0.5  0.0023  0.9970  0.0007  0.4992  -1  0.823716  1.0000      NA
   
  13291  NA06986  13291  NA06997 PO   0.5  0.0016  0.9951  0.0033  0.5008  -1  0.824240  1.0000 1835.5000
  

$ Rscript –no-save Relatedness.R

pdf_convert("1_QC_GWAS/hist_relatedness.pdf", format = "jpeg", dpi = 300)
hist_relatedness

hist_relatedness

Founders approach

Final directory contents at the end of QC

~/GWAS_IJMPR/GWA_tutorial/1_QC_GWAS$ ls -l

-rw-rw-r-- 1 ubuntu ubuntu        14 Nov 29 03:19 0.2_low_call_rate_pihat.txt

-rw-rw-r-- 1 ubuntu ubuntu     12620 Nov 29 03:21 1_Main_script_QC_GWAS.txt

-rw-rw-r-- 1 ubuntu ubuntu      4572 Nov 29 02:32 Gender_check.pdf

-rw-rw-r-- 1 ubuntu ubuntu  61231677 Jan 25  2016 HapMap_3_r3_1.bed

-rw-rw-r-- 1 ubuntu ubuntu  40635824 Jan 25  2016 HapMap_3_r3_1.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Jan 25  2016 HapMap_3_r3_1.fam

-rw-rw-r-- 1 ubuntu ubuntu  44002269 Nov 29 02:57 HapMap_3_r3_10.bed

-rw-rw-r-- 1 ubuntu ubuntu  29846054 Nov 29 02:57 HapMap_3_r3_10.bim

-rw-rw-r-- 1 ubuntu ubuntu      4094 Nov 29 02:57 HapMap_3_r3_10.fam

-rw-rw-r-- 1 ubuntu ubuntu      1016 Nov 29 02:57 HapMap_3_r3_10.log

-rw-rw-r-- 1 ubuntu ubuntu  30050331 Nov 29 03:01 HapMap_3_r3_11.bed

-rw-rw-r-- 1 ubuntu ubuntu  29846054 Nov 29 03:01 HapMap_3_r3_11.bim

-rw-rw-r-- 1 ubuntu ubuntu      2318 Nov 29 03:01 HapMap_3_r3_11.fam

-rw-rw-r-- 1 ubuntu ubuntu      1007 Nov 29 03:01 HapMap_3_r3_11.log

**-rw-rw-r-- 1 ubuntu ubuntu  30050331 Nov 29 03:20 HapMap_3_r3_12.bed**

**-rw-rw-r-- 1 ubuntu ubuntu  29846054 Nov 29 03:20 HapMap_3_r3_12.bim**

**-rw-rw-r-- 1 ubuntu ubuntu      2296 Nov 29 03:20 HapMap_3_r3_12.fam**

**-rw-rw-r-- 1 ubuntu ubuntu       997 Nov 29 03:20 HapMap_3_r3_12.log**

-rw-rw-r-- 1 ubuntu ubuntu  61231677 Nov 29 02:27 HapMap_3_r3_2.bed

-rw-rw-r-- 1 ubuntu ubuntu  40635824 Nov 29 02:27 HapMap_3_r3_2.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Nov 29 02:27 HapMap_3_r3_2.fam

-rw-rw-r-- 1 ubuntu ubuntu      5226 Nov 29 02:27 HapMap_3_r3_2.hh

-rw-rw-r-- 1 ubuntu ubuntu      1109 Nov 29 02:27 HapMap_3_r3_2.log

-rw-rw-r-- 1 ubuntu ubuntu  61231677 Nov 29 02:28 HapMap_3_r3_3.bed

-rw-rw-r-- 1 ubuntu ubuntu  40635824 Nov 29 02:28 HapMap_3_r3_3.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Nov 29 02:28 HapMap_3_r3_3.fam

-rw-rw-r-- 1 ubuntu ubuntu      5226 Nov 29 02:28 HapMap_3_r3_3.hh

-rw-rw-r-- 1 ubuntu ubuntu      1107 Nov 29 02:28 HapMap_3_r3_3.log

-rw-rw-r-- 1 ubuntu ubuntu  60077811 Nov 29 02:29 HapMap_3_r3_4.bed

-rw-rw-r-- 1 ubuntu ubuntu  39869059 Nov 29 02:29 HapMap_3_r3_4.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Nov 29 02:29 HapMap_3_r3_4.fam

-rw-rw-r-- 1 ubuntu ubuntu      5226 Nov 29 02:29 HapMap_3_r3_4.hh

-rw-rw-r-- 1 ubuntu ubuntu      1114 Nov 29 02:29 HapMap_3_r3_4.log

-rw-rw-r-- 1 ubuntu ubuntu  60077811 Nov 29 02:29 HapMap_3_r3_5.bed

-rw-rw-r-- 1 ubuntu ubuntu  39869059 Nov 29 02:29 HapMap_3_r3_5.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Nov 29 02:29 HapMap_3_r3_5.fam

-rw-rw-r-- 1 ubuntu ubuntu      3642 Nov 29 02:29 HapMap_3_r3_5.hh

-rw-rw-r-- 1 ubuntu ubuntu      1108 Nov 29 02:29 HapMap_3_r3_5.log

-rw-rw-r-- 1 ubuntu ubuntu  60077811 Nov 29 02:36 HapMap_3_r3_6.bed

-rw-rw-r-- 1 ubuntu ubuntu  39869059 Nov 29 02:36 HapMap_3_r3_6.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Nov 29 02:36 HapMap_3_r3_6.fam

-rw-rw-r-- 1 ubuntu ubuntu      3642 Nov 29 02:36 HapMap_3_r3_6.hh

-rw-rw-r-- 1 ubuntu ubuntu      1171 Nov 29 02:36 HapMap_3_r3_6.log

-rw-rw-r-- 1 ubuntu ubuntu     11620 Nov 29 02:36 HapMap_3_r3_6.sexcheck

-rw-rw-r-- 1 ubuntu ubuntu  58738851 Nov 29 02:38 HapMap_3_r3_7.bed

-rw-rw-r-- 1 ubuntu ubuntu  38962079 Nov 29 02:38 HapMap_3_r3_7.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Nov 29 02:38 HapMap_3_r3_7.fam

-rw-rw-r-- 1 ubuntu ubuntu       994 Nov 29 02:38 HapMap_3_r3_7.log

-rw-rw-r-- 1 ubuntu ubuntu  45075495 Nov 29 02:42 HapMap_3_r3_8.bed

-rw-rw-r-- 1 ubuntu ubuntu  29846054 Nov 29 02:42 HapMap_3_r3_8.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Nov 29 02:42 HapMap_3_r3_8.fam

-rw-rw-r-- 1 ubuntu ubuntu      1035 Nov 29 02:42 HapMap_3_r3_8.log

-rw-rw-r-- 1 ubuntu ubuntu  45075495 Nov 29 02:50 HapMap_3_r3_9.bed

-rw-rw-r-- 1 ubuntu ubuntu  29846054 Nov 29 02:50 HapMap_3_r3_9.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Nov 29 02:50 HapMap_3_r3_9.fam

-rw-rw-r-- 1 ubuntu ubuntu      1090 Nov 29 02:50 HapMap_3_r3_9.log

-rw-rw-r-- 1 ubuntu ubuntu  45075495 Nov 29 02:48 HapMap_hwe_filter_step1.bed

-rw-rw-r-- 1 ubuntu ubuntu  29846054 Nov 29 02:48 HapMap_hwe_filter_step1.bim

-rw-rw-r-- 1 ubuntu ubuntu      4136 Nov 29 02:48 HapMap_hwe_filter_step1.fam

-rw-rw-r-- 1 ubuntu ubuntu      1044 Nov 29 02:48 HapMap_hwe_filter_step1.log

-rw-rw-r-- 1 ubuntu ubuntu       162 Sep  1  2015 MAF_check.R

-rw-r--r-- 1 ubuntu ubuntu  68528705 Nov 29 02:39 MAF_check.frq

-rw-rw-r-- 1 ubuntu ubuntu       765 Nov 29 02:39 MAF_check.log

-rw-rw-r-- 1 ubuntu ubuntu      4755 Nov 29 02:39 MAF_distribution.pdf

-rw-rw-r-- 1 ubuntu ubuntu      4526 Nov 29 02:32 Men_check.pdf

-rw-r--r-- 1 ubuntu ubuntu     11620 Nov 29 02:53 R_check.het

-rw-rw-r-- 1 ubuntu ubuntu       969 Nov 29 02:53 R_check.log

-rw-rw-r-- 1 ubuntu ubuntu       923 Nov 26  2015 Relatedness.R

-rw-rw-r-- 1 ubuntu ubuntu      4599 Nov 29 02:32 Women_check.pdf

-rw-rw-r-- 1 ubuntu ubuntu       235 Jan 22  2016 check_heterozygosity_rate.R

-rw-rw-r-- 1 ubuntu ubuntu       218 Nov 29 02:54 fail-het-qc.txt

-rw-rw-r-- 1 ubuntu ubuntu       352 Aug 28  2015 gender_check.R

-rw-rw-r-- 1 ubuntu ubuntu        34 Nov 29 02:56 het_fail_ind.txt

-rw-rw-r-- 1 ubuntu ubuntu      4657 Nov 29 02:53 heterozygosity.pdf

-rw-rw-r-- 1 ubuntu ubuntu       371 Aug 20  2015 heterozygosity_outliers_list.R

-rw-rw-r-- 1 ubuntu ubuntu       410 Sep 10  2015 hist_miss.R

-rw-rw-r-- 1 ubuntu ubuntu      4574 Nov 29 02:59 hist_relatedness.pdf

-rw-rw-r-- 1 ubuntu ubuntu      4705 Nov 29 02:47 histhwe.pdf

-rw-rw-r-- 1 ubuntu ubuntu      4602 Nov 29 02:47 histhwe_below_theshold.pdf

-rw-rw-r-- 1 ubuntu ubuntu      4599 Nov 29 02:23 histimiss.pdf

-rw-rw-r-- 1 ubuntu ubuntu      4764 Nov 29 02:23 histlmiss.pdf

-rw-rw-r-- 1 ubuntu ubuntu       287 Sep  2  2015 hwe.R

-rw-rw-r-- 1 ubuntu ubuntu      2397 Nov 29 02:52 indepSNP.log

**-rw-rw-r-- 1 ubuntu ubuntu   1058938 Nov 29 02:52 indepSNP.prune.in**

-rw-rw-r-- 1 ubuntu ubuntu   9747179 Nov 29 02:52 indepSNP.prune.out

-rw-rw-r-- 1 ubuntu ubuntu        88 Jun 25  2015 inversion.txt

-rw-rw-r-- 1 ubuntu ubuntu     10342 Nov 29 02:58 pihat_min0.2.genome

-rw-rw-r-- 1 ubuntu ubuntu       988 Nov 29 02:58 pihat_min0.2.log

-rw-rw-r-- 1 ubuntu ubuntu       208 Nov 29 03:02 pihat_min0.2_in_founders.genome

-rw-rw-r-- 1 ubuntu ubuntu       981 Nov 29 03:02 pihat_min0.2_in_founders.log

-rw-rw-r-- 1 ubuntu ubuntu      3642 Nov 29 02:31 plink.hh

-rw-r--r-- 1 ubuntu ubuntu 283331753 Nov 29 02:44 plink.hwe

-rw-r--r-- 1 ubuntu ubuntu      6260 Nov 29 03:03 plink.imiss

-rw-r--r-- 1 ubuntu ubuntu  47221988 Nov 29 03:03 plink.lmiss

-rw-rw-r-- 1 ubuntu ubuntu       805 Nov 29 03:03 plink.log

-rw-rw-r-- 1 ubuntu ubuntu     11620 Nov 29 02:31 plink.sexcheck

-rw-rw-r-- 1 ubuntu ubuntu      1144 Nov 29 02:46 plinkzoomhwe.hwe

-rw-rw-r-- 1 ubuntu ubuntu     39242 Sep  7  2015 pops_HapMap_3_r3

-rw-rw-r-- 1 ubuntu ubuntu      5006 Nov 29 02:59 relatedness.pdf

-rw-rw-r-- 1 ubuntu ubuntu  14275908 Nov 29 02:37 snp_1_22.txt

-rw-rw-r-- 1 ubuntu ubuntu     10030 Nov 29 02:59 zoom_pihat.genome

-rw-rw-r-- 1 ubuntu ubuntu      4998 Nov 29 02:59 zoom_relatedness.pdf

2_Population_stratification

Obtain genetic data of 629 individuals from different ethnic backgrounds presented in a 1000 Genomes dataset

Additional directory contents

~/GWAS_IJMPR$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 65672092096 Nov 29 03:44 ALL.2of4intersection.20100804.genotypes.vcf.gz

$ zmore ALL.2of4intersection.20100804.genotypes.vcf.gz


##fileformat=VCFv4.0

##filedat=20101112

##datarelease=20100804

**##samples=629**

##description="Where **BI calls** are present, genotypes and alleles are from BI.  

In there absence, **UM genotypes** are used.  

If neither are available, no genotype in formation is present and the alleles are from the **NCBI calls**."

##FORMAT=<ID=AD,Number=.,Type=Integer,Description="**Allelic depths** for the ref and alt alleles in the order listed">

##FORMAT=<ID=DP,Number=1,Type=Integer,Description="**Read Depth** (only filtered reads used for calling)">

##FORMAT=<ID=GL,Number=3,Type=Float,Description="**Log-scaled likelihoods for AA,AB,BB genotypes** 
where A=ref and B=alt; not applicable if site is not biallelic">

##FORMAT=<ID=GQ,Number=1,Type=Float,Description="**Genotype Quality**">

##FORMAT=<ID=GT,Number=1,Type=String,Description="**Genotype**">

##FORMAT=<ID=GD,Number=1,Type=Float,Description="**Genotype dosage**.  Expected count of non-ref alleles [0,2]">

##FORMAT=<ID=OG,Number=1,Type=String,Description="**Original Genotype** input to Beagle">

##INFO=<ID=AF,Number=.,Type=Float,Description="**Allele Frequency**, for each ALT allele, in the same order as listed">

##INFO=<ID=DP,Number=1,Type=Integer,Description="**Total Depth**">

##INFO=<ID=CB,Number=.,Type=String,Description="List of centres that called, 
**UM (University of Michigan)**, **BI (Broad Institute)**, **BC (Boston College)**, **NCBI**">

##INFO=<ID=EUR_R2,Number=1,Type=Float,Description="**R2 From Beagle based on European Samples**">

##INFO=<ID=AFR_R2,Number=1,Type=Float,Description="**R2 From Beagle based on AFRICAN Samples**">

##INFO=<ID=ASN_R2,Number=1,Type=Float,Description="**R2 From Beagle based on Asian Samples**">

#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT 

HG00098 HG00100 HG00106 HG00112 HG00114 HG00116 HG00117 HG00118 HG00119 HG00120 HG00122 
HG00123 HG00124 HG00126 HG00131 HG00141 HG00142 HG00143 HG00144 HG00145 HG00146 HG00147
HG00148 HG00149 HG00150 HG00151 HG00152 HG00153 HG00156 HG00158 HG00159 

Quality control the 1000 genome data (steps similar to those described in part 1 will be undertaken )

Check for population stratification using data from the 1000 Genomes Project.

Individuals with a non-European ethnic background will be removed. 

Generate a covariate file which helps to adust for remaining population stratification within the European subjects.

Additional directory contents

~/GWAS_IJMPR$ ls -l


-rw-rw-r-- 1 ubuntu ubuntu  4027181107 Nov 29 04:25 ALL.2of4intersection.20100804.genotypes.bed

-rw-rw-r-- 1 ubuntu ubuntu   635485636 Nov 29 04:25 ALL.2of4intersection.20100804.genotypes.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:25 ALL.2of4intersection.20100804.genotypes.fam

-rw-rw-r-- 1 ubuntu ubuntu        1255 Nov 29 04:25 ALL.2of4intersection.20100804.genotypes.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:24 ALL.2of4intersection.20100804.genotypes.nosex

Assign unique indentifiers to the SNPs with a missing rs-identifier (i.e., the SNPs with “.”).

Remove variants based on missing genotype data

Remove individuals based on missing genotype data.

Remove variants based on missing genotype data.

# Remove individuals based on missing genotype data

Remove variants due to minor allele threshold(s)

Extract the variants present in HapMap dataset from the 1000 genomes dataset.

$ awk ‘{print$2}’ HapMap_3_r3_12.bim > HapMap_SNPs.txt

$ wc -l HapMap_SNPs.txt

1073226 HapMap_SNPs.txt

Extract the variants present in 1000 Genomes dataset from the HapMap dataset.

$ awk ‘{print$2}’ 1kG_MDS6.bim > 1kG_MDS6_SNPs.txt

$ wc -l 1kG_MDS6.bim

1000993 1kG_MDS6.bim

Datasets must have the same build: Change the build 1000 Genomes data build

$ awk ‘{print$2,$4}’ HapMap_MDS.map > buildhapmap.txt

$ wc -l buildhapmap.txt

1000993 buildhapmap.txt

$ head -n 5 buildhapmap.txt


rs3131969 744045

rs1048488 750775

rs12562034 758311

rs12124819 766409

rs4970383 828418

Merge the HapMap and 1000 Genomes data sets

Set reference genome

$ awk ‘{print$2,$5}’ 1kG_MDS7.bim > 1kg_ref-list.txt

$ wc -l 1kg_ref-list.txt

1000993 1kg_ref-list.txt

Resolve strand issues

$ awk ‘{print$2,$5,$6}’ 1kG_MDS7.bim > 1kGMDS7_tmp

$ awk ‘{print$2,$5,$6}’ HapMap-adj.bim > HapMap-adj_tmp

$ sort 1kGMDS7_tmp HapMap-adj_tmp |uniq -u > all_differences.txt

wc -l all_differences.txt

1624 all_differences.txt

$ head -n 5 all_differences.txt


rs10006274 C T

rs10006274 G A

rs10060593 A T

rs10060593 C T

rs10083559 A G

Flip SNPs for resolving strand issues

$ awk ‘{print$1}’ all_differences.txt | sort -u > flip_list.txt

wc -l flip_list.txt

812 flip_list.txt

Check for SNPs which are still problematic after they have been flipped

$ awk ‘{print$2,$5,$6}’ corrected_hapmap.bim > corrected_hapmap_tmp

$ sort 1kGMDS7_tmp corrected_hapmap_tmp |uniq -u > uncorresponding_SNPs.txt

$ wc -l uncorresponding_SNPs.txt

84 uncorresponding_SNPs.txt

$ head -n 5 uncorresponding_SNPs.txt


rs10060593 A G

rs10060593 A T

rs10083559 T C

rs10083559 T G

rs10116901 C A

$ awk ‘{print$1}’ uncorresponding_SNPs.txt | sort -u > SNPs_for_exlusion.txt

$ wc -l SNPs_for_exlusion.txt


42 SNPs_for_exlusion.txt

$ head -n 5 SNPs_for_exlusion.txt


rs10060593

rs10083559

rs10116901

rs11524965

rs11687477

Remove the 42 problematic SNPs from hapmap datasets

Remove the 42 problematic SNPs from 1000 genome datasets.

Merge HapMap with 1000 Genomes Data

Perform multi-dimensional scaling (MDS) on HapMap-CEU data anchored by 1000 Genomes data: Using a set of pruned SNPs

$ wc -l MDS_merge2.cluster1

1 MDS_merge2.cluster1

$ wc -l MDS_merge2.cluster2

738 MDS_merge2.cluster2

$ wc -l MDS_merge2.cluster3

739 MDS_merge2.cluster3

$ head -n 5 MDS_merge2.mds


    FID       IID    SOL           C1           C2           C3           C4           C5           C6           C7           C8           C9          C10 
    
   1328   NA06984      0    -0.056673    0.0484244   0.00450315   -0.0046481    0.0211372   -0.0220683   0.00178486    0.0127743   -0.0380989    0.0244196 
   
   1328   NA06989      0   -0.0569928    0.0479001   0.00909747   -0.0109876   0.00823615   -0.0389311    -0.023994   -0.0811805   -0.0392789     0.021354 
   
   1330   NA12340      0   -0.0570225    0.0487898   0.00527852  -0.00913983   -0.0055688  -0.00731278    0.0192658    0.0222587   -0.0318775  -0.00545362 
   
   1330   NA12341      0   -0.0548805    0.0480437   0.00946487  -0.00810759   0.00934789  -0.00204984    0.0069026   -0.0150844   0.00396743    0.0142435 

MDS-plot

Download 20100804.ALL.panel which contains population codes of the individuals of 1000 genomes

$ head -n 5 20100804.ALL.panel


HG00098 GBR ILLUMINA

HG00100 GBR ILLUMINA

HG00106 GBR ILLUMINA

HG00112 GBR ILLUMINA

HG00114 GBR ILLUMINA

$ awk ‘{print$2}’ 20100804.ALL.panel | sort | uniq


ASW

CEU

CHB

CHS

FIN

GBR

JPT

LWK

MXL

PUR

TSI

YRI

$ grep “ASW” 20100804.ALL.panel | wc -l

24

$ grep “CEU” 20100804.ALL.panel | wc -l

90

$ grep “CHB” 20100804.ALL.panel | wc -l

68

$ grep “CHS” 20100804.ALL.panel | wc -l

25

$ grep “FIN” 20100804.ALL.panel | wc -l

36

$ grep “GBR” 20100804.ALL.panel | wc -l

43

$ grep “JPT” 20100804.ALL.panel | wc -l

84

$ grep “LWK” 20100804.ALL.panel | wc -l

67

$ grep “MXL” 20100804.ALL.panel | wc -l

17

$ grep “PUR” 20100804.ALL.panel | wc -l

5

$ grep “TSI” 20100804.ALL.panel | wc -l

92

$ grep “YRI” 20100804.ALL.panel | wc -l

78

Convert population codes into superpopulation codes (i.e., AFR,AMR,ASN, and EUR)

$ awk ‘{print$1,$1,$2}’ 20100804.ALL.panel > race_1kG.txt

$ head -n 5 race_1kG.txt


HG00098 HG00098 GBR

HG00100 HG00100 GBR

HG00106 HG00106 GBR

HG00112 HG00112 GBR

HG00114 HG00114 GBR

$ sed ‘s/JPT/ASN/g’ race_1kG.txt>race_1kG2.txt

$ sed ‘s/ASW/AFR/g’ race_1kG2.txt>race_1kG3.txt

$ sed ‘s/CEU/EUR/g’ race_1kG3.txt>race_1kG4.txt

$ sed ‘s/CHB/ASN/g’ race_1kG4.txt>race_1kG5.txt

$ sed ‘s/CHD/ASN/g’ race_1kG5.txt>race_1kG6.txt

$ sed ‘s/YRI/AFR/g’ race_1kG6.txt>race_1kG7.txt

$ sed ‘s/LWK/AFR/g’ race_1kG7.txt>race_1kG8.txt

$ sed ‘s/TSI/EUR/g’ race_1kG8.txt>race_1kG9.txt

$ sed ‘s/MXL/AMR/g’ race_1kG9.txt>race_1kG10.txt

$ sed ‘s/GBR/EUR/g’ race_1kG10.txt>race_1kG11.txt

$ sed ‘s/FIN/EUR/g’ race_1kG11.txt>race_1kG12.txt

$ sed ‘s/CHS/ASN/g’ race_1kG12.txt>race_1kG13.txt

$ sed ‘s/PUR/AMR/g’ race_1kG13.txt>race_1kG14.txt

create a race file,

$ awk ‘{print$1,$2,“OWN”}’ HapMap_MDS.fam > racefile_own.txt

$ head -n 5 HapMap_MDS.fam


1328 NA06989 0 0 2 2

1377 NA11891 0 0 1 2

1349 NA11843 0 0 1 1

1330 NA12341 0 0 2 2

1328 NA06984 0 0 1 2

$ head -n 5 racefile_own.txt


1328 NA06989 OWN

1377 NA11891 OWN

1349 NA11843 OWN

1330 NA12341 OWN

1328 NA06984 OWN

$ cat race_1kG14.txt racefile_own.txt | sed -e ‘1iIID race’ > racefile.txt

$ head -n 5 racefile.txt

FID     IID     race

HG00098 HG00098 EUR

HG00100 HG00100 EUR

HG00106 HG00106 EUR

HG00112 HG00112 EUR

$ tail -n 5 racefile.txt


1362 NA11994 OWN

1459 NA12873 OWN

1454 NA12815 OWN

1346 NA12043 OWN

1375 NA12264 OWN

$ Rscript MDS_merged.R

library(pdftools)
pdf_convert("2_Population_stratification/MDS.pdf", format = "jpeg", dpi = 300)
MDS

MDS

Exclude ethnic outliers

$ awk ‘{ if ($4 <-0.04 && $5 >0.03) print $1,$2 }’ MDS_merge2.mds > EUR_MDS_merge2

$ head -n 5 MDS_merge2.mds


    FID       IID    SOL           C1           C2           C3           C4           C5           C6           C7           C8           C9          C10 
    
   1328   NA06984      0    -0.056673    0.0484244   0.00450315   -0.0046481    0.0211372   -0.0220683   0.00178486    0.0127743   -0.0380989    0.0244196 
   
   1328   NA06989      0   -0.0569928    0.0479001   0.00909747   -0.0109876   0.00823615   -0.0389311    -0.023994   -0.0811805   -0.0392789     0.021354 
   
   1330   NA12340      0   -0.0570225    0.0487898   0.00527852  -0.00913983   -0.0055688  -0.00731278    0.0192658    0.0222587   -0.0318775  -0.00545362 
   
   1330   NA12341      0   -0.0548805    0.0480437   0.00946487  -0.00810759   0.00934789  -0.00204984    0.0069026   -0.0150844   0.00396743    0.0142435 
   

$ head -n 5 EUR_MDS_merge2


1328 NA06984

1328 NA06989

1330 NA12340

1330 NA12341

1330 NA12343

Extract these individuals in HapMap data

$ head -n 5 HapMap_3_r3_13_mds.mds

    FID       IID    SOL           C1           C2           C3           C4           C5           C6           C7           C8           C9          C10 
    
   1328   NA06989      0    0.0160249   -0.0527081    0.0532834  -0.00151572   0.00862577  -0.00979541     0.019497   -0.0257653   0.00946611   -0.0147235 
   
   1377   NA11891      0   0.00880326   -0.0302948   -0.0051995    0.0268125   -0.0139691   -0.0156051 -0.000492102   0.00316405    0.0260371    0.0140428 
   
   1349   NA11843      0 -0.000948607    0.0140868  -0.00435938   -0.0145398   -0.0156304    0.0211412  -0.00908916    0.0145217  -0.00769973    0.0126226 
   
   1330   NA12341      0   -0.0133513   -0.0112818   0.00311679   0.00684165    0.0266296    0.0144824   -0.0295584  -0.00327526  -0.00396523    0.0245783 

All additional directory contents

~/GWAS_IJMPR$ ls -l

-rw-rw-r-- 1 ubuntu ubuntu       11905 Jun 22  2017 1_Main_script_QC_GWAS.txt

-rw-rw-r-- 1 ubuntu ubuntu    14169506 Nov 29 05:01 1kGMDS7_tmp

-rw-rw-r-- 1 ubuntu ubuntu  1423172679 Nov 29 04:32 1kG_MDS.bed

-rw-rw-r-- 1 ubuntu ubuntu   262619729 Nov 29 04:33 1kG_MDS.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:32 1kG_MDS.fam

-rw-rw-r-- 1 ubuntu ubuntu        1017 Nov 29 04:33 1kG_MDS.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:32 1kG_MDS.nosex

-rw-rw-r-- 1 ubuntu ubuntu  1423172679 Nov 29 04:33 1kG_MDS2.bed

-rw-rw-r-- 1 ubuntu ubuntu   262619729 Nov 29 04:33 1kG_MDS2.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:33 1kG_MDS2.fam

-rw-rw-r-- 1 ubuntu ubuntu         965 Nov 29 04:33 1kG_MDS2.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:33 1kG_MDS2.nosex

-rw-rw-r-- 1 ubuntu ubuntu  1302037713 Nov 29 04:34 1kG_MDS3.bed

-rw-rw-r-- 1 ubuntu ubuntu   239747957 Nov 29 04:34 1kG_MDS3.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:34 1kG_MDS3.fam

-rw-rw-r-- 1 ubuntu ubuntu         974 Nov 29 04:34 1kG_MDS3.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:34 1kG_MDS3.nosex

-rw-rw-r-- 1 ubuntu ubuntu  1302037713 Nov 29 04:34 1kG_MDS4.bed

-rw-rw-r-- 1 ubuntu ubuntu   239747957 Nov 29 04:34 1kG_MDS4.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:34 1kG_MDS4.fam

-rw-rw-r-- 1 ubuntu ubuntu         967 Nov 29 04:34 1kG_MDS4.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:34 1kG_MDS4.nosex

-rw-rw-r-- 1 ubuntu ubuntu   917712983 Nov 29 04:35 1kG_MDS5.bed

-rw-rw-r-- 1 ubuntu ubuntu   164283306 Nov 29 04:35 1kG_MDS5.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:35 1kG_MDS5.fam

-rw-rw-r-- 1 ubuntu ubuntu        1003 Nov 29 04:35 1kG_MDS5.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:35 1kG_MDS5.nosex

-rw-rw-r-- 1 ubuntu ubuntu   158156897 Nov 29 04:36 1kG_MDS6.bed

-rw-rw-r-- 1 ubuntu ubuntu    27841723 Nov 29 04:36 1kG_MDS6.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:36 1kG_MDS6.fam

-rw-rw-r-- 1 ubuntu ubuntu         947 Nov 29 04:36 1kG_MDS6.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:36 1kG_MDS6.nosex

-rw-rw-r-- 1 ubuntu ubuntu    10165534 Nov 29 04:37 1kG_MDS6_SNPs.txt

-rw-rw-r-- 1 ubuntu ubuntu   158156897 Nov 29 04:38 1kG_MDS7.bed

-rw-rw-r-- 1 ubuntu ubuntu    27838095 Nov 29 04:38 1kG_MDS7.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:38 1kG_MDS7.fam

-rw-rw-r-- 1 ubuntu ubuntu         996 Nov 29 04:38 1kG_MDS7.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:38 1kG_MDS7.nosex

-rw-rw-r-- 1 ubuntu ubuntu   158150261 Nov 29 05:05 1kG_MDS8.bed

-rw-rw-r-- 1 ubuntu ubuntu    27836923 Nov 29 05:05 1kG_MDS8.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 05:05 1kG_MDS8.fam

-rw-rw-r-- 1 ubuntu ubuntu         953 Nov 29 05:05 1kG_MDS8.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 05:05 1kG_MDS8.nosex

-rw-rw-r-- 1 ubuntu ubuntu    12167520 Nov 29 04:39 1kg_ref-list.txt

-rw-rw-r-- 1 ubuntu ubuntu       13499 Nov 29 05:08 20100804.ALL.panel

-rw-rw-r-- 1 ubuntu ubuntu        3216 Nov 29 03:52 2_Main_script.txt

-rw-rw-r-- 1 ubuntu ubuntu       10886 Sep 21 17:27 2_Main_script_MDS.txt

-rw-rw-r-- 1 ubuntu ubuntu  4027181107 Nov 29 04:25 ALL.2of4intersection.20100804.genotypes.bed

-rw-rw-r-- 1 ubuntu ubuntu   635485636 Nov 29 04:25 ALL.2of4intersection.20100804.genotypes.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:25 ALL.2of4intersection.20100804.genotypes.fam

-rw-rw-r-- 1 ubuntu ubuntu        1255 Nov 29 04:25 ALL.2of4intersection.20100804.genotypes.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:24 ALL.2of4intersection.20100804.genotypes.nosex

-rw-rw-r-- 1 ubuntu ubuntu 65672092096 Nov 29 03:44  ALL.2of4intersection.20100804.genotypes.vcf.gz

-rw-rw-r-- 1 ubuntu ubuntu  4027181107 Nov 29 04:31 ALL.2of4intersection.20100804.genotypes_no_missing_IDs.bed

-rw-rw-r-- 1 ubuntu ubuntu   818551938 Nov 29 04:31 ALL.2of4intersection.20100804.genotypes_no_missing_IDs.bim

-rw-rw-r-- 1 ubuntu ubuntu       15725 Nov 29 04:31 ALL.2of4intersection.20100804.genotypes_no_missing_IDs.fam

-rw-rw-r-- 1 ubuntu ubuntu        1207 Nov 29 04:31 ALL.2of4intersection.20100804.genotypes_no_missing_IDs.log

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 04:31 ALL.2of4intersection.20100804.genotypes_no_missing_IDs.nosex

-rw-rw-r-- 1 ubuntu ubuntu        5616 Nov 29 05:15 EUR_MDS_merge2

-rw-rw-r-- 1 ubuntu ubuntu    28027807 Nov 29 04:39 HapMap-adj.bed

-rw-rw-r-- 1 ubuntu ubuntu    27838096 Nov 29 04:39 HapMap-adj.bim

-rw-rw-r-- 1 ubuntu ubuntu        2296 Nov 29 04:39 HapMap-adj.fam

-rw-rw-r-- 1 ubuntu ubuntu       52842 Nov 29 04:39 HapMap-adj.log

-rw-rw-r-- 1 ubuntu ubuntu    14169506 Nov 29 05:02 HapMap-adj_tmp

-rw-rw-r-- 1 ubuntu ubuntu    30050331 Nov 29 03:26 HapMap_3_r3_12.bed

-rw-rw-r-- 1 ubuntu ubuntu    29846054 Nov 29 03:26 HapMap_3_r3_12.bim

-rw-rw-r-- 1 ubuntu ubuntu        2296 Nov 29 03:26 HapMap_3_r3_12.fam

-rw-rw-r-- 1 ubuntu ubuntu         997 Nov 29 03:26 HapMap_3_r3_12.log

**-rw-rw-r-- 1 ubuntu ubuntu    30050331 Nov 29 05:16 HapMap_3_r3_13.bed**

**-rw-rw-r-- 1 ubuntu ubuntu    29846054 Nov 29 05:16 HapMap_3_r3_13.bim**

**-rw-rw-r-- 1 ubuntu ubuntu        2296 Nov 29 05:16 HapMap_3_r3_13.fam**

-rw-rw-r-- 1 ubuntu ubuntu      612248 Nov 29 05:16 HapMap_3_r3_13.genome

-rw-rw-r-- 1 ubuntu ubuntu         966 Nov 29 05:16 HapMap_3_r3_13.log

-rw-rw-r-- 1 ubuntu ubuntu        1431 Nov 29 05:18 HapMap_3_r3_13_mds.cluster1

-rw-rw-r-- 1 ubuntu ubuntu        1642 Nov 29 05:18 HapMap_3_r3_13_mds.cluster2

-rw-rw-r-- 1 ubuntu ubuntu       33063 Nov 29 05:18 HapMap_3_r3_13_mds.cluster3

-rw-rw-r-- 1 ubuntu ubuntu        1171 Nov 29 05:18 HapMap_3_r3_13_mds.log

-rw-rw-r-- 1 ubuntu ubuntu       17160 Nov 29 05:18 HapMap_3_r3_13_mds.mds

-rw-rw-r-- 1 ubuntu ubuntu    28027807 Nov 29 04:37 HapMap_MDS.bed

-rw-rw-r-- 1 ubuntu ubuntu    27838096 Nov 29 04:37 HapMap_MDS.bim

-rw-rw-r-- 1 ubuntu ubuntu        2296 Nov 29 04:37 HapMap_MDS.fam

-rw-rw-r-- 1 ubuntu ubuntu        1041 Nov 29 04:37 HapMap_MDS.log

-rw-rw-r-- 1 ubuntu ubuntu    23834124 Nov 29 04:37 HapMap_MDS.map

-rw-rw-r-- 1 ubuntu ubuntu   436435244 Nov 29 04:37 HapMap_MDS.ped

-rw-rw-r-- 1 ubuntu ubuntu    28026631 Nov 29 05:05 HapMap_MDS2.bed

-rw-rw-r-- 1 ubuntu ubuntu    27836924 Nov 29 05:05 HapMap_MDS2.bim

-rw-rw-r-- 1 ubuntu ubuntu        2296 Nov 29 05:05 HapMap_MDS2.fam

-rw-rw-r-- 1 ubuntu ubuntu         986 Nov 29 05:05 HapMap_MDS2.log

-rw-rw-r-- 1 ubuntu ubuntu    10905522 Nov 29 04:36 HapMap_SNPs.txt

-rw-rw-r-- 1 ubuntu ubuntu       20587 Nov 29 05:13 MDS.pdf

-rw-rw-r-- 1 ubuntu ubuntu   185175938 Nov 29 05:06 MDS_merge2.bed

-rw-rw-r-- 1 ubuntu ubuntu    27836924 Nov 29 05:06 MDS_merge2.bim

-rw-rw-r-- 1 ubuntu ubuntu       11495 Nov 29 05:07 MDS_merge2.cluster1

-rw-rw-r-- 1 ubuntu ubuntu       12964 Nov 29 05:07 MDS_merge2.cluster2

-rw-rw-r-- 1 ubuntu ubuntu     1906614 Nov 29 05:07 MDS_merge2.cluster3

-rw-rw-r-- 1 ubuntu ubuntu       18021 Nov 29 05:06 MDS_merge2.fam

-rw-rw-r-- 1 ubuntu ubuntu    28746914 Nov 29 05:07 MDS_merge2.genome

-rw-rw-r-- 1 ubuntu ubuntu        1217 Nov 29 05:07 MDS_merge2.log

-rw-rw-r-- 1 ubuntu ubuntu      115284 Nov 29 05:07 MDS_merge2.mds

-rw-rw-r-- 1 ubuntu ubuntu       10064 Nov 29 05:07 MDS_merge2.nosex

-rw-rw-r-- 1 ubuntu ubuntu        1343 Jan 22  2016 MDS_merged.R

-rw-rw-r-- 1 ubuntu ubuntu         435 Nov 29 05:04 SNPs_for_exlusion.txt

-rw-rw-r-- 1 ubuntu ubuntu       22926 Nov 29 05:02 all_differences.txt

-rw-rw-r-- 1 ubuntu ubuntu    19405847 Nov 29 04:38 buildhapmap.txt

-rw-rw-r-- 1 ubuntu ubuntu    28027807 Nov 29 05:03 corrected_hapmap.bed

-rw-rw-r-- 1 ubuntu ubuntu    27838096 Nov 29 05:03 corrected_hapmap.bim

-rw-rw-r-- 1 ubuntu ubuntu        2296 Nov 29 05:03 corrected_hapmap.fam

-rw-rw-r-- 1 ubuntu ubuntu        1368 Nov 29 05:03 corrected_hapmap.log

-rw-rw-r-- 1 ubuntu ubuntu    14169506 Nov 29 05:03 corrected_hapmap_tmp

**-rw-rw-r-- 1 ubuntu ubuntu       13339 Nov 29 05:18 covar_mds.txt**

-rw-rw-r-- 1 ubuntu ubuntu        8215 Nov 29 05:02 flip_list.txt

-rw-rw-r-- 1 ubuntu ubuntu     1058938 Nov 29 03:26 indepSNP.prune.in

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:08 race_1kG.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:11 race_1kG10.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:11 race_1kG11.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:12 race_1kG12.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:12 race_1kG13.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:12 race_1kG14.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:09 race_1kG2.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:10 race_1kG3.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:10 race_1kG4.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:10 race_1kG5.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:10 race_1kG6.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:11 race_1kG7.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:11 race_1kG8.txt

-rw-rw-r-- 1 ubuntu ubuntu       12580 Nov 29 05:11 race_1kG9.txt

-rw-rw-r-- 1 ubuntu ubuntu       14453 Nov 29 05:13 racefile.txt

-rw-rw-r-- 1 ubuntu ubuntu        1860 Nov 29 05:13 racefile_own.txt

-rw-rw-r-- 1 ubuntu ubuntu        1206 Nov 29 05:04 uncorresponding_SNPs.txt

3-1. Association analysis (for binary traits) without using covariates

3-2. Association analsysis (for binary traits) using covariates: logistic approach

We will be using 10 principal components as covariates and the MDS components calculated previously: covar_mds.txt.

$ wc -l logistic_results.assoc.logistic

1073227 logistic_results.assoc.logistic

$ head -n 5 logistic_results.assoc.logistic


 CHR         SNP         BP   A1       TEST    NMISS         OR         STAT            P 
 
   1   rs3131972     742584    A        ADD      109      1.957        1.552       0.1207
   
   1   rs3131969     744045    A        ADD      109      2.322          1.8      0.07179
   
   1   rs1048488     750775    C        ADD      108      1.986        1.591       0.1117
   
   1  rs12562034     758311    A        ADD      109     0.3292       -1.912      0.05586

Remove NA values, those might give problems generating plots in later steps.

$ awk ‘!/’NA’/’ logistic_results.assoc.logistic > logistic_results.assoc_2.logistic

wc -l logistic_results.assoc_2.logistic

1073214 logistic_results.assoc_2.logistic

$ head -n 5 logistic_results.assoc_2.logistic


 CHR         SNP         BP   A1       TEST    NMISS         OR         STAT            P 
 
   1   rs3131972     742584    A        ADD      109      1.957        1.552       0.1207
   
   1   rs3131969     744045    A        ADD      109      2.322          1.8      0.07179
   
   1   rs1048488     750775    C        ADD      108      1.986        1.591       0.1117
   
   1  rs12562034     758311    A        ADD      109     0.3292       -1.912      0.05586

Rscript –no-save QQ_plot.R

QQ PLOT_logistic

QQ PLOT_logistic

Rscript –no-save Manhattan_plot.R

Manhattan PLOT_logistic

Manhattan PLOT_logistic

Multiple testing

There are various way to deal with multiple testing outside of the conventional genome-wide significance threshold of 5.0E-8.

Multiple testing via Bonferroni test

Command below will give a Bonferroni corrected p-value, along with FDR and others.

$ wc -l adjusted_assoc_results.assoc

1073227 adjusted_assoc_results.assoc

$ head -n 5 adjusted_assoc_results.assoc


 CHR         SNP         BP   A1      F_A      F_U   A2        CHISQ            P           OR 
 
   1   rs3131972     742584    A   0.1944   0.1455    G       0.9281       0.3354        1.418 
   
   1   rs3131969     744045    A   0.1759      0.1    G        2.647       0.1037        1.921 
  
   1   rs1048488     750775    C   0.1981   0.1455    T        1.054       0.3045        1.451 
   
   1  rs12562034     758311    A  0.06481   0.1182    G        1.863       0.1723       0.5171 
   

$ wc -l adjusted_assoc_results.assoc.adjusted

1073227 adjusted_assoc_results.assoc.adjusted

$ head -n 5 adjusted_assoc_results.assoc.adjusted


 CHR         SNP      UNADJ         GC       BONF       HOLM   SIDAK_SS   SIDAK_SD     FDR_BH     FDR_BY
 
   3   rs1097157   1.66e-06  1.861e-06          1          1     0.8316     0.8316     0.2871          1 
   
   3   rs1840290   1.66e-06  1.861e-06          1          1     0.8316     0.8316     0.2871          1 
   
   8    rs279466  2.441e-06  2.727e-06          1          1     0.9272     0.9272     0.2871          1 
   
   8    rs279460  2.441e-06  2.727e-06          1          1     0.9272     0.9272     0.2871          1 

Multiple testing via permutation

We permute a subset of the SNPs from chromosome 22 to reduce computational time. 

The EMP2 collumn provides multiple testing corrected p-value.

$ awk ‘{ if ($4 >= 21595000 && $4 <= 21605000) print $2 }’ HapMap_3_r3_13.bim > subset_snp_chr_22.txt

$ wc -l subset_snp_chr_22.txt

84 subset_snp_chr_22.txt

$ head -n 5 subset_snp_chr_22.txt

rs12563141

rs12124123

rs2796343

rs7555660

rs12494223

$ wc -l subset_1M_perm_result.assoc.mperm

85 subset_1M_perm_result.assoc.mperm

$ head -n 5 subset_1M_perm_result.assoc.mperm


 CHR          SNP         EMP1         EMP2 
 
   1   rs12563141        0.659            1 
   
   1   rs12124123       0.4988            1 
   
   1    rs2796343       0.4765            1 
   
   1    rs7555660       0.6932            1 
   

$ sort -gk 4 subset_1M_perm_result.assoc.mperm > sorted_subset.txt

$ head -n 5 sorted_subset.txt

 CHR          SNP         EMP1         EMP2 
 
  22    rs8135996      0.06854       0.9071 
  
   3    rs1457588      0.03196        0.914 
   
   5   rs16874721       0.1006       0.9733 
   
  16    rs7194128      0.07167       0.9929 
  

All additional directory contents

~/GWAS_IJMPR$ ls -l
-rw-rw-r-- 1 ubuntu ubuntu      5949 Sep 21 14:04 3_Main_script_association_GWAS.txt

-rw-rw-r-- 1 ubuntu ubuntu  30050331 Nov 29 05:26 HapMap_3_r3_13.bed

-rw-rw-r-- 1 ubuntu ubuntu  29846054 Nov 29 05:26 HapMap_3_r3_13.bim

-rw-rw-r-- 1 ubuntu ubuntu      2296 Nov 29 05:26 HapMap_3_r3_13.fam

-rw-rw-r-- 1 ubuntu ubuntu      2355 Nov 29 05:33 HapMap_subset_for_perm.bed

-rw-rw-r-- 1 ubuntu ubuntu      2332 Nov 29 05:33 HapMap_subset_for_perm.bim

-rw-rw-r-- 1 ubuntu ubuntu      2296 Nov 29 05:33 HapMap_subset_for_perm.fam

-rw-rw-r-- 1 ubuntu ubuntu      1008 Nov 29 05:33 HapMap_subset_for_perm.log

**-rw-rw-r-- 1 ubuntu ubuntu     32307 Nov 29 05:36 Logistic_manhattan.jpeg**

-rw-rw-r-- 1 ubuntu ubuntu       596 Sep 21 14:06 Manhattan_plot.R

**-rw-rw-r-- 1 ubuntu ubuntu     16355 Nov 29 05:41 QQ-Plot_assoc.jpeg**

**-rw-rw-r-- 1 ubuntu ubuntu     16757 Nov 29 05:41 QQ-Plot_logistic.jpeg**

-rw-rw-r-- 1 ubuntu ubuntu       525 Sep 21 14:06 QQ_plot.R

-rw-rw-r-- 1 ubuntu ubuntu 103029792 Nov 29 05:31 adjusted_assoc_results.assoc

-rw-rw-r-- 1 ubuntu ubuntu 113762061 Nov 29 05:31 adjusted_assoc_results.assoc.adjusted

-rw-rw-r-- 1 ubuntu ubuntu      1075 Nov 29 05:31 adjusted_assoc_results.log

**-rw-rw-r-- 1 ubuntu ubuntu     32726 Nov 29 05:37 assoc_manhattan.jpeg**

-rw-rw-r-- 1 ubuntu ubuntu 103029792 Nov 29 05:28 assoc_results.assoc

-rw-rw-r-- 1 ubuntu ubuntu       885 Nov 29 05:28 assoc_results.log

-rw-rw-r-- 1 ubuntu ubuntu     13339 Nov 29 05:27 covar_mds.txt

-rw-rw-r-- 1 ubuntu ubuntu  96590431 Nov 29 05:29 logistic_results.assoc.logistic

-rw-rw-r-- 1 ubuntu ubuntu  96589261 Nov 29 05:30 logistic_results.assoc_2.logistic

-rw-rw-r-- 1 ubuntu ubuntu      1058 Nov 29 05:29 logistic_results.log

-rw-rw-r-- 1 ubuntu ubuntu      3825 Nov 29 05:34 sorted_subset.txt

-rw-rw-r-- 1 ubuntu ubuntu      8245 Nov 29 05:33 subset_1M_perm_result.assoc

-rw-rw-r-- 1 ubuntu ubuntu      3825 Nov 29 05:33 subset_1M_perm_result.assoc.mperm

-rw-rw-r-- 1 ubuntu ubuntu      1087 Nov 29 05:33 subset_1M_perm_result.log

-rw-rw-r-- 1 ubuntu ubuntu       851 Nov 29 05:32 subset_snp_chr_22.txt
LS0tDQp0aXRsZTogIkdlbm9tZS1XaWRlLUFzc29jaWF0aW9uIFN0dWRpZXMgKEdXQVMpIg0KYXV0aG9yOiAiQmhhZ2lyYXRoaSBEYXNoIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMgTWFjaGluZQ0KDQpBV1MgbTQueGxhcmdlICgxNiBHaUIgUkFNKQ0KDQoNCg0KIyMgUmVmZXJlbmNlcw0KDQoqKiAiQSB0dXRvcmlhbCBvbiBjb25kdWN0aW5nIEdlbm9tZS1XaWRlLUFzc29jaWF0aW9uIFN0dWRpZXM6IFF1YWxpdHkgY29udHJvbCBhbmQgc3RhdGlzdGljYWwgYW5hbHlzaXMgIiAoaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wdWJtZWQvMjk0ODQ3NDIpKioNCg0KDQoNCiMjIFNvZnR3YXJlcyANCg0KDQojIyMgJCBwbGluazINCg0KUExJTksgdjEuOTBwIDY0LWJpdCAoMjUgTWFyIDIwMTYpICAgICAgICAgIGh0dHBzOi8vd3d3LmNvZy1nZW5vbWljcy5vcmcvcGxpbmsyDQooQykgMjAwNS0yMDE2IFNoYXVuIFB1cmNlbGwsIENocmlzdG9waGVyIENoYW5nICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMNCg0KICBwbGluayBbaW5wdXQgZmxhZyhzKS4uLl0ge2NvbW1hbmQgZmxhZyhzKS4uLn0ge290aGVyIGZsYWcocykuLi59DQogIHBsaW5rIC0taGVscCB7ZmxhZyBuYW1lKHMpLi4ufQ0KDQpDb21tYW5kcyBpbmNsdWRlIC0tbWFrZS1iZWQsIC0tcmVjb2RlLCAtLWZsaXAtc2NhbiwgLS1tZXJnZS1saXN0LA0KLS13cml0ZS1zbnBsaXN0LCAtLWxpc3QtZHVwbGljYXRlLXZhcnMsIC0tZnJlcXgsIC0tbWlzc2luZywgLS10ZXN0LW1pc2hhcCwNCi0taGFyZHksIC0tbWVuZGVsLCAtLWliYywgLS1pbXB1dGUtc2V4LCAtLWluZGVwLXBhaXJwaGFzZSwgLS1yMiwgLS1zaG93LXRhZ3MsDQotLWJsb2NrcywgLS1kaXN0YW5jZSwgLS1nZW5vbWUsIC0taG9tb3p5ZywgLS1tYWtlLXJlbCwgLS1tYWtlLWdybS1neiwNCi0tcmVsLWN1dG9mZiwgLS1jbHVzdGVyLCAtLXBjYSwgLS1uZWlnaGJvdXIsIC0taWJzLXRlc3QsIC0tcmVncmVzcy1kaXN0YW5jZSwNCi0tbW9kZWwsIC0tYmQsIC0tZ3hlLCAtLWxvZ2lzdGljLCAtLWRvc2FnZSwgLS1sYXNzbywgLS10ZXN0LW1pc3NpbmcsDQotLW1ha2UtcGVybS1waGVubywgLS11bnJlbGF0ZWQtaGVyaXRhYmlsaXR5LCAtLXRkdCwgLS1kZmFtLCAtLXFmYW0sIC0tYW5ub3RhdGUsDQotLWNsdW1wLCAtLWdlbmUtcmVwb3J0LCAtLW1ldGEtYW5hbHlzaXMsIC0tZXBpc3Rhc2lzLCAtLWZhc3QtZXBpc3Rhc2lzLCBhbmQNCi0tc2NvcmUuDQoNCidwbGluayAtLWhlbHAgfCBtb3JlJyBkZXNjcmliZXMgYWxsIGZ1bmN0aW9ucyAod2FybmluZzogbG9uZykuDQoNCmBgYHtyfQ0KbGlicmFyeShwZGZ0b29scykNCmBgYA0KDQoNCg0KDQojIyBPYnRhaW4gZGF0YQ0KDQoNCg0KIyMjIyB+L0dXQVNfSUpNUFIkIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vTWFyZWVzQVQvR1dBX3R1dG9yaWFsLmdpdA0KDQpDbG9uaW5nIGludG8gJ0dXQV90dXRvcmlhbCcuLi4NCg0KIA0KIA0KIA0KIyMjIyB+L0dXQVNfSUpNUFIkIGxzIEdXQV90dXRvcmlhbC8NCg0KMV9RQ19HV0FTLnppcCAgDQoNCjJfUG9wdWxhdGlvbl9zdHJhdGlmaWNhdGlvbi56aXAgIA0KDQozX0Fzc29jaWF0aW9uX0dXQVMuemlwIA0KDQo0X1BSUy5kb2MgIA0KDQpSRUFETUUubWQNCg0KDQoNCg0KIyMjIyB+L0dXQVNfSUpNUFIvR1dBX3R1dG9yaWFsJCB1bnppcCAxX1FDX0dXQVMuemlwIA0KDQpBcmNoaXZlOiAgMV9RQ19HV0FTLnppcA0KICBpbmZsYXRpbmc6IDFfUUNfR1dBUy8xX01haW5fc2NyaXB0X1FDX0dXQVMudHh0ICANCiAgaW5mbGF0aW5nOiAxX1FDX0dXQVMvY2hlY2tfaGV0ZXJvenlnb3NpdHlfcmF0ZS5SICANCiAgaW5mbGF0aW5nOiAxX1FDX0dXQVMvZ2VuZGVyX2NoZWNrLlIgIA0KICBpbmZsYXRpbmc6IDFfUUNfR1dBUy9IYXBNYXBfM19yM18xLmJlZCAgDQogIGluZmxhdGluZzogMV9RQ19HV0FTL0hhcE1hcF8zX3IzXzEuYmltICANCiAgaW5mbGF0aW5nOiAxX1FDX0dXQVMvSGFwTWFwXzNfcjNfMS5mYW0gIA0KICBpbmZsYXRpbmc6IDFfUUNfR1dBUy9oZXRlcm96eWdvc2l0eV9vdXRsaWVyc19saXN0LlIgIA0KICBpbmZsYXRpbmc6IDFfUUNfR1dBUy9oaXN0X21pc3MuUiAgIA0KICBpbmZsYXRpbmc6IDFfUUNfR1dBUy9od2UuUiAgICAgICAgIA0KICBpbmZsYXRpbmc6IDFfUUNfR1dBUy9pbnZlcnNpb24udHh0ICANCiAgaW5mbGF0aW5nOiAxX1FDX0dXQVMvTUFGX2NoZWNrLlIgICANCiAgaW5mbGF0aW5nOiAxX1FDX0dXQVMvcG9wc19IYXBNYXBfM19yMyAgDQogIGluZmxhdGluZzogMV9RQ19HV0FTL1JlbGF0ZWRuZXNzLlIgDQogIA0KDQoNCg0KIyMjIyB+L0dXQVNfSUpNUFIvR1dBX3R1dG9yaWFsJCB1bnppcCAyX1BvcHVsYXRpb25fc3RyYXRpZmljYXRpb24uemlwIA0KDQpBcmNoaXZlOiAgMl9Qb3B1bGF0aW9uX3N0cmF0aWZpY2F0aW9uLnppcA0KICBpbmZsYXRpbmc6IDJfUG9wdWxhdGlvbl9zdHJhdGlmaWNhdGlvbi8xX01haW5fc2NyaXB0X1FDX0dXQVMudHh0ICANCiAgaW5mbGF0aW5nOiAyX1BvcHVsYXRpb25fc3RyYXRpZmljYXRpb24vMl9NYWluX3NjcmlwdF9NRFMudHh0ICANCiAgaW5mbGF0aW5nOiAyX1BvcHVsYXRpb25fc3RyYXRpZmljYXRpb24vTURTX21lcmdlZC5SICANCg0KDQogIA0KIyMjIH4vR1dBU19JSk1QUi9HV0FfdHV0b3JpYWwkIHVuemlwIDNfQXNzb2NpYXRpb25fR1dBUy56aXAgDQoNCkFyY2hpdmU6ICAzX0Fzc29jaWF0aW9uX0dXQVMuemlwDQogIGluZmxhdGluZzogM19Bc3NvY2lhdGlvbl9HV0FTLzNfTWFpbl9zY3JpcHRfYXNzb2NpYXRpb25fR1dBUy50eHQgIA0KICBpbmZsYXRpbmc6IDNfQXNzb2NpYXRpb25fR1dBUy9NYW5oYXR0YW5fcGxvdC5SICANCiAgaW5mbGF0aW5nOiAzX0Fzc29jaWF0aW9uX0dXQVMvUVFfcGxvdC5SICAgIA0KICANCiAgDQogDQojIyBDaGVjayBkaXJlY3RvcnkgY29udGVudHMgDQoNCkFsbCBmaWxlcyB3ZXJlIGNvcGllZCB0byB0aGUgJ34vR1dBU19JSk1QUicgZm9sZGVyLg0KIA0KDQojIyMjIH4vR1dBU19JSk1QUiQgbHMgLWwgDQoNCg0KYGBgDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAxMjYwOSBTZXAgMjEgMTM6MjYgMV9NYWluX3NjcmlwdF9RQ19HV0FTLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSA2MTIzMTY3NyBKYW4gMjUgIDIwMTYgSGFwTWFwXzNfcjNfMS5iZWQqKg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSA0MDYzNTgyNCBKYW4gMjUgIDIwMTYgSGFwTWFwXzNfcjNfMS5iaW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDQxMzYgSmFuIDI1ICAyMDE2IEhhcE1hcF8zX3IzXzEuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTYyIFNlcCAgMSAgMjAxNSBNQUZfY2hlY2suUg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDkyMyBOb3YgMjYgIDIwMTUgUmVsYXRlZG5lc3MuUg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDIzNSBKYW4gMjIgIDIwMTYgY2hlY2tfaGV0ZXJvenlnb3NpdHlfcmF0ZS5SDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMzUyIEF1ZyAyOCAgMjAxNSBnZW5kZXJfY2hlY2suUg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDM3MSBBdWcgMjAgIDIwMTUgaGV0ZXJvenlnb3NpdHlfb3V0bGllcnNfbGlzdC5SDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDEwIFNlcCAxMCAgMjAxNSBoaXN0X21pc3MuUg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDI4NyBTZXAgIDIgIDIwMTUgaHdlLlINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgODggSnVuIDI1ICAyMDE1IGludmVyc2lvbi50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgMzkyNDIgU2VwICA3ICAyMDE1IHBvcHNfSGFwTWFwXzNfcjMNCg0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDExOTA1IEp1biAyMiAgMjAxNyAxX01haW5fc2NyaXB0X1FDX0dXQVMudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEwODg2IFNlcCAyMSAxNzoyNyAyX01haW5fc2NyaXB0X01EUy50eHQNCg0KKiotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAzMDA1MDMzMSBOb3YgMjkgMDM6MjYgSGFwTWFwXzNfcjNfMTIuYmVkKioNCg0KKiotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAyOTg0NjA1NCBOb3YgMjkgMDM6MjYgSGFwTWFwXzNfcjNfMTIuYmltKioNCg0KKiotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMjI5NiBOb3YgMjkgMDM6MjYgSGFwTWFwXzNfcjNfMTIuZmFtKioNCg0KKiotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgIDk5NyBOb3YgMjkgMDM6MjYgSGFwTWFwXzNfcjNfMTIubG9nKioNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDEzNDMgSmFuIDIyICAyMDE2IE1EU19tZXJnZWQuUg0KDQoqKi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAxMDU4OTM4IE5vdiAyOSAwMzoyNiBpbmRlcFNOUC5wcnVuZS5pbioqDQoNCg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSA1OTQ5IFNlcCAyMSAxNDowNCAzX01haW5fc2NyaXB0X2Fzc29jaWF0aW9uX0dXQVMudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA1OTYgU2VwIDIxIDE0OjA2IE1hbmhhdHRhbl9wbG90LlINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDUyNSBTZXAgMjEgMTQ6MDYgUVFfcGxvdC5SDQoNCmBgYA0KDQotRG91YmxlIGFzdGVyaXNrICgqKikgcXVvdGVkIGZpbGVzIHdpbGwgYmUgZ2VuZXJhdGVkIGFuZCBzaG91bGQgYmUgZGVsZXRlZCBiZWZvcmUgYmVnaW5uaW5nLg0KDQoNCi1IYXBNYXBfM19yM18xIGlzIHNvdXJjZWQgZnJvbSB0aGUgbGluayBnaXZlbiBiZWxvdzoNCg0KaHR0cDovL2hhcG1hcC5uY2JpLm5sbS5uaWguZ292L2Rvd25sb2Fkcy9nZW5vdHlwZXMvMjAxMC0wNV9waGFzZUlJSS9wbGlua19mb3JtYXQvICAgDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyAxX1F1YWxpdHkgY29udHJvbCBhbmQgc3RhdGlzdGljYWwgYW5hbHlzaXMgZm9yIEdlbm9tZS1XaWRlLUFzc29jaWF0aW9uIFN0dWRpZXMgKEdXQVMpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCg0KDQoNCiMjIFByZXZpZXcgZmlsZSBjb250ZW50cw0KDQpiZWQvZ2Vub3R5cGUgZmlsZQ0KDQpiaW0vbWFwIGZpbGUNCg0KZmFtL3BlZCBmaWxlDQoNCg0KIyMjIGJpbSBvciBtYXAgZmlsZSAoY2hyb21vc29tZSBuby4sIHNucC5uYW1lLCBjTSwgcG9zaXRpb24sIGFsbGVsZS4xLCBhbGxlbGUuMikNCg0KIyMjIyAkIGhlYWQgSGFwTWFwXzNfcjNfMS5iaW0gIA0KDQpgYGANCg0KMQlyczIxODU1MzkJMAk1NTY3MzgJVAlDDQoNCjEJcnMxMTUxMDEwMwkwCTU1NzYxNglHCUENCg0KMQlyczExMjQwNzY3CTAJNzE4ODE0CVQJQw0KDQoxCXJzMzEzMTk3MgkwCTc0MjU4NAlBCUcNCg0KMQlyczMxMzE5NjkJMAk3NDQwNDUJQQlHDQoNCjEJcnMxMDQ4NDg4CTAJNzUwNzc1CUMJVA0KDQoxCXJzMTI1NjIwMzQJMAk3NTgzMTEJQQlHDQoNCjEJcnMxMjEyNDgxOQkwCTc2NjQwOQlHCUENCg0KMQlyczQwNDA2MTcJMAk3NjkxODUJRwlBDQoNCjEJcnMyOTA1MDM2CTAJNzgyMzQzCUMJVA0KDQpgYGANCg0KIyMjIGZhbSBmaWxlIChwZWRpZ3JlZSBubywgbWVtYmVyLCBmYXRoZXIsIG1vdGhlciwgc2V4LCBhZmZlY3RlZCkNCg0KIyMjIyAkIGhlYWQgSGFwTWFwXzNfcjNfMS5mYW0gDQoNCmBgYA0KDQoxMzI4IE5BMDY5ODkgMCAwIDIgMg0KDQoxMzc3IE5BMTE4OTEgMCAwIDEgMg0KDQoxMzQ5IE5BMTE4NDMgMCAwIDEgMQ0KDQoxMzMwIE5BMTIzNDEgMCAwIDIgMg0KDQoxNDQ0IE5BMTI3MzkgTkExMjc0OCBOQTEyNzQ5IDEgLTkNCg0KMTM0NCBOQTEwODUwIDAgTkExMjA1OCAyIC05DQoNCjEzMjggTkEwNjk4NCAwIDAgMSAyDQoNCjE0NjMgTkExMjg3NyBOQTEyODg5IE5BMTI4OTAgMSAtOQ0KDQoxNDE4IE5BMTIyNzUgMCAwIDIgMQ0KDQoxMzI5MSBOQTA2OTg2IDAgMCAxIDENCg0KYGBgDQoNCiMjIFByZXZpZXcgZmlsZSBjb250ZW50cyBhbmQvb3IgZGF0YSB1c2luZyBzbnBTdGF0IA0KDQoNCmJlZC9nZW5vdHlwZSBmaWxlDQoNCmJpbS9tYXAgZmlsZQ0KDQpmYW0vcGVkIGZpbGUNCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShzbnBTdGF0cykNCmBgYA0KDQpgYGB7cn0NCmd3YXMgPC0gcmVhZC5wbGluaygiMV9RQ19HV0FTL0hhcE1hcF8zX3IzXzEuYmVkIiwgIjFfUUNfR1dBUy9IYXBNYXBfM19yM18xLmJpbSIsICIxX1FDX0dXQVMvSGFwTWFwXzNfcjNfMS5mYW0iKQ0KYGBgDQoNCmBgYHtyfQ0Kc3RyKGd3YXMpDQpgYGANCg0KDQpgYGB7cn0NCmd3YXMkZ2Vub3R5cGVzDQpgYGANCg0KYGBge3J9DQpoZWFkKGNvbC5zdW1tYXJ5KGd3YXMkZ2Vub3R5cGVzKSRNQUYpDQpgYGANCg0KDQpgYGB7cn0NCmhlYWQoZ3dhcyRmYW0pDQpgYGANCg0KYGBge3J9DQpoZWFkKGd3YXMkbWFwKQ0KYGBgDQoNCg0KYGBge3J9DQpzdW1tYXJ5KGd3YXMpDQpgYGANCg0KDQoNCg0KDQojIyBJbnZlc3RpZ2F0ZSBtaXNzaW5nbmVzcyBwZXIgaW5kaXZpZHVhbCBhbmQgcGVyIFNOUCANCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwXzNfcjNfMSAtLW1pc3NpbmcNCg0KDQoNCmBgYA0KDQoqKjE0NTc4OTcgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLioqDQoNCioqMTY1IHBlb3BsZSAoODAgbWFsZXMsIDg1IGZlbWFsZXMpIGxvYWRlZCBmcm9tIC5mYW0uKioNCg0KKioxMTIgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLioqDQoNCi4uLi4uLi4uDQoNCioqQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMTIgZm91bmRlcnMgYW5kIDUzIG5vbmZvdW5kZXJzIHByZXNlbnQuKioNCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uIA0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpXYXJuaW5nOiAyMjUgaGV0LiBoYXBsb2lkIGdlbm90eXBlcyBwcmVzZW50IChzZWUgcGxpbmsuaGggKTsgDQoNCm1hbnkgY29tbWFuZHMgdHJlYXQgdGhlc2UgYXMgbWlzc2luZy4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk3Mzc4Lg0KDQotLW1pc3Npbmc6IA0KDQpTYW1wbGUgbWlzc2luZyBkYXRhIHJlcG9ydCB3cml0dGVuIHRvICoqcGxpbmsuaW1pc3MqKiwgDQoNCmFuZCANCg0KdmFyaWFudC1iYXNlZCBtaXNzaW5nIGRhdGEgcmVwb3J0IHdyaXR0ZW4gdG8gKipwbGluay5sbWlzcy4qKg0KDQpgYGANCg0KDQojIyMjICQgUnNjcmlwdCAtLW5vLXNhdmUgaGlzdF9taXNzLlINCg0KDQoNCmBgYHtyfQ0KcGRmX2NvbnZlcnQoIjFfUUNfR1dBUy9oaXN0aW1pc3MucGRmIiwgZm9ybWF0ID0gImpwZWciLCBkcGkgPSAzMDApDQpgYGANCg0KIVtwcm9wb3J0aW9uIG9mIG1pc3NpbmcgU05QcyBwZXIgaW5kaXZpZHVhbF0oaGlzdGltaXNzXzEuanBlZykNCg0KDQpgYGB7cn0NCnBkZl9jb252ZXJ0KCIxX1FDX0dXQVMvaGlzdGxtaXNzLnBkZiIsIGZvcm1hdCA9ICJqcGVnIiwgZHBpID0gMzAwKQ0KYGBgDQoNCiFbcHJvcG9ydGlvbiBvZiBtaXNzaW5nIGluZGl2aWR1YWxzIHBlciBTTlBdKGhpc3RsbWlzc18xLmpwZWcpDQoNCiMjIERlbGV0ZSBTTlBzIGFuZCBpbmRpdmlkdWFscyB3aXRoIGhpZ2ggbGV2ZWxzIG9mIG1pc3NpbmduZXNzDQoNCg0KIyMjIERlbGV0ZSBTTlBzIHdpdGggbWlzc2luZ25lc3MgPjAuMi4NCg0KDQojIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfM19yM18xIC0tZ2VubyAwLjIgLS1tYWtlLWJlZCAtLW91dCBIYXBNYXBfM19yM18yDQoNCg0KYGBgDQoNCjE0NTc4OTcgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxNjUgcGVvcGxlICg4MCBtYWxlcywgODUgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTEyIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMTIgZm91bmRlcnMgYW5kIDUzIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLiANCg0KLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpXYXJuaW5nOiAyMjUgaGV0LiBoYXBsb2lkIGdlbm90eXBlcyBwcmVzZW50IChzZWUgSGFwTWFwXzNfcjNfMi5oaCApOyANCg0KbWFueSBjb21tYW5kcyB0cmVhdCB0aGVzZSBhcyBtaXNzaW5nLg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTczNzguDQoNCjAgdmFyaWFudHMgcmVtb3ZlZCBkdWUgdG8gbWlzc2luZyBnZW5vdHlwZSBkYXRhICgtLWdlbm8pLg0KDQoxNDU3ODk3IHZhcmlhbnRzIGFuZCAxNjUgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NiBhcmUgY2FzZXMgYW5kIDU2IGFyZSBjb250cm9scy4gICg1MyBwaGVub3R5cGVzIGFyZSBtaXNzaW5nLikNCg0KDQotLW1ha2UtYmVkIHRvIEhhcE1hcF8zX3IzXzIuYmVkICsgSGFwTWFwXzNfcjNfMi5iaW0gKyBIYXBNYXBfM19yM18yLmZhbSAuLi4NCg0KYGBgDQoNCg0KIyMjIERlbGV0ZSBpbmRpdmlkdWFscyB3aXRoIG1pc3NpbmduZXNzID4wLjIuDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF8zX3IzXzIgLS1taW5kIDAuMiAtLW1ha2UtYmVkIC0tb3V0IEhhcE1hcF8zX3IzXzMNCg0KDQpgYGANCjE0NTc4OTcgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxNjUgcGVvcGxlICg4MCBtYWxlcywgODUgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTEyIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KMCBwZW9wbGUgcmVtb3ZlZCBkdWUgdG8gbWlzc2luZyBnZW5vdHlwZSBkYXRhICgtLW1pbmQpLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDExMiBmb3VuZGVycyBhbmQgNTMgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KV2FybmluZzogMjI1IGhldC4gaGFwbG9pZCBnZW5vdHlwZXMgcHJlc2VudCAoc2VlIEhhcE1hcF8zX3IzXzMuaGggKTsgDQoNCm1hbnkgY29tbWFuZHMgdHJlYXQgdGhlc2UgYXMgbWlzc2luZy4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk3Mzc4Lg0KDQoxNDU3ODk3IHZhcmlhbnRzIGFuZCAxNjUgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NiBhcmUgY2FzZXMgYW5kIDU2IGFyZSBjb250cm9scy4gICg1MyBwaGVub3R5cGVzIGFyZSBtaXNzaW5nLikNCg0KLS1tYWtlLWJlZCB0byBIYXBNYXBfM19yM18zLmJlZCArIEhhcE1hcF8zX3IzXzMuYmltICsgSGFwTWFwXzNfcjNfMy5mYW0gLi4uDQoNCg0KYGBgDQoNCg0KIyMjIERlbGV0ZSBTTlBzIHdpdGggbWlzc2luZ25lc3MgPjAuMDIuDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF8zX3IzXzMgLS1nZW5vIDAuMDIgLS1tYWtlLWJlZCAtLW91dCBIYXBNYXBfM19yM180DQoNCmBgYA0KMTQ1Nzg5NyB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjE2NSBwZW9wbGUgKDgwIG1hbGVzLCA4NSBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMTIgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDExMiBmb3VuZGVycyBhbmQgNTMgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQoNCldhcm5pbmc6IDIyNSBoZXQuIGhhcGxvaWQgZ2Vub3R5cGVzIHByZXNlbnQgKHNlZSBIYXBNYXBfM19yM180LmhoICk7IG1hbnkNCmNvbW1hbmRzIHRyZWF0IHRoZXNlIGFzIG1pc3NpbmcuDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTczNzguDQoNCioqMjc0NzMgdmFyaWFudHMgcmVtb3ZlZCBkdWUgdG8gbWlzc2luZyBnZW5vdHlwZSBkYXRhICgtLWdlbm8pLioqDQoNCioqMTQzMDQyNCB2YXJpYW50cyBhbmQgMTY1IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLioqDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NiBhcmUgY2FzZXMgYW5kIDU2IGFyZSBjb250cm9scy4gICg1MyBwaGVub3R5cGVzIGFyZSBtaXNzaW5nLikNCg0KLS1tYWtlLWJlZCB0byBIYXBNYXBfM19yM180LmJlZCArIEhhcE1hcF8zX3IzXzQuYmltICsgSGFwTWFwXzNfcjNfNC5mYW0gLi4uDQoNCmBgYA0KDQoNCiMjIyBEZWxldGUgaW5kaXZpZHVhbHMgd2l0aCBtaXNzaW5nbmVzcyA+MC4wMi4NCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwXzNfcjNfNCAtLW1pbmQgMC4wMiAtLW1ha2UtYmVkIC0tb3V0IEhhcE1hcF8zX3IzXzUNCg0KYGBgDQoxNDMwNDI0IHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4NCg0KMTY1IHBlb3BsZSAoODAgbWFsZXMsIDg1IGZlbWFsZXMpIGxvYWRlZCBmcm9tIC5mYW0uDQoxMTIgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQowIHBlb3BsZSByZW1vdmVkIGR1ZSB0byBtaXNzaW5nIGdlbm90eXBlIGRhdGEgKC0tbWluZCkuDQoNCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMTIgZm91bmRlcnMgYW5kIDUzIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KV2FybmluZzogMTU3IGhldC4gaGFwbG9pZCBnZW5vdHlwZXMgcHJlc2VudCAoc2VlIEhhcE1hcF8zX3IzXzUuaGggKTsgbWFueQ0KY29tbWFuZHMgdHJlYXQgdGhlc2UgYXMgbWlzc2luZy4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk3ODk5Lg0KDQoxNDMwNDI0IHZhcmlhbnRzIGFuZCAxNjUgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NiBhcmUgY2FzZXMgYW5kIDU2IGFyZSBjb250cm9scy4gICg1MyBwaGVub3R5cGVzDQphcmUgbWlzc2luZy4pDQoNCi0tbWFrZS1iZWQgdG8gSGFwTWFwXzNfcjNfNS5iZWQgKyBIYXBNYXBfM19yM181LmJpbSArIEhhcE1hcF8zX3IzXzUuZmFtIC4uLg0KDQoNCmBgYA0KDQoNCiMjIENoZWNrIGZvciBzZXggZGlzY3JlcGFuY3kgYW5kIGltcHV0ZSBzZXggaWYgbmVlZGVkDQoNCmBgYA0KDQpGZW1hbGVzIG11c3QgaGF2ZSBhIEYgdmFsdWUgb2YgPDAuMiwgYW5kIG1hbGVzIG11c3QgaGF2ZSBhIEYgdmFsdWUgPjAuOC4gDQoNClRoaXMgRiB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgWCBjaHJvbW9zb21lIGluYnJlZWRpbmcgKGhvbW96eWdvc2l0eSkgZXN0aW1hdGUuDQoNCmBgYA0KDQoNCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwXzNfcjNfNSAtLWNoZWNrLXNleA0KDQpgYGANCjE0MzA0MjQgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxNjUgcGVvcGxlICg4MCBtYWxlcywgODUgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTEyIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDExMiBmb3VuZGVycyBhbmQgNTMgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQpXYXJuaW5nOiAxNTcgaGV0LiBoYXBsb2lkIGdlbm90eXBlcyBwcmVzZW50IChzZWUgcGxpbmsuaGggKTsgbWFueSBjb21tYW5kcyB0cmVhdCB0aGVzZSBhcyBtaXNzaW5nLg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTc4OTkuDQoNCjE0MzA0MjQgdmFyaWFudHMgYW5kIDE2NSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4NCg0KQW1vbmcgcmVtYWluaW5nIHBoZW5vdHlwZXMsIDU2IGFyZSBjYXNlcyBhbmQgNTYgYXJlIGNvbnRyb2xzLiAgKDUzIHBoZW5vdHlwZXMgYXJlIG1pc3NpbmcuKQ0KDQoqKi0tY2hlY2stc2V4OiAyMzQxMCBYY2hyIGFuZCAwIFljaHIgdmFyaWFudChzKSBzY2FubmVkLCAxIHByb2JsZW0gZGV0ZWN0ZWQuKioNCg0KKipSZXBvcnQgd3JpdHRlbiB0byBwbGluay5zZXhjaGVjayAuKioNCg0KDQpgYGANCg0KDQojIyMjICQgaGVhZCBwbGluay5zZXhjaGVjayANCg0KYGBgDQoNCiAgICBGSUQgICAgICAgSUlEICAgICAgIFBFRFNFWCAgICAgICBTTlBTRVggICAgICAgU1RBVFVTICAgICAgICAgICAgRg0KICAgIA0KICAgMTMyOCAgIE5BMDY5ODkgICAgICAgICAgICAyICAgICAgICAgICAgMiAgICAgICAgICAgT0sgICAgIC0wLjAxMTc2DQogICANCiAgIDEzNzcgICBOQTExODkxICAgICAgICAgICAgMSAgICAgICAgICAgIDEgICAgICAgICAgIE9LICAgICAgICAgICAgMQ0KICAgDQogICAxMzQ5ICAgTkExMTg0MyAgICAgICAgICAgIDEgICAgICAgICAgICAxICAgICAgICAgICBPSyAgICAgICAgICAgIDENCiAgIA0KICAgMTMzMCAgIE5BMTIzNDEgICAgICAgICAgICAyICAgICAgICAgICAgMiAgICAgICAgICAgT0sgICAgIC0wLjAxMjcxDQogICANCiAgIDE0NDQgICBOQTEyNzM5ICAgICAgICAgICAgMSAgICAgICAgICAgIDEgICAgICAgICAgIE9LICAgICAgICAgICAgMQ0KICAgDQogICAxMzQ0ICAgTkExMDg1MCAgICAgICAgICAgIDIgICAgICAgICAgICAyICAgICAgICAgICBPSyAgICAgIDAuMDE0OTENCiAgIA0KICAgMTMyOCAgIE5BMDY5ODQgICAgICAgICAgICAxICAgICAgICAgICAgMSAgICAgICAgICAgT0sgICAgICAgICAgICAxDQogICANCiAgIDE0NjMgICBOQTEyODc3ICAgICAgICAgICAgMSAgICAgICAgICAgIDEgICAgICAgICAgIE9LICAgICAgICAgICAgMQ0KICAgDQogICAxNDE4ICAgTkExMjI3NSAgICAgICAgICAgIDIgICAgICAgICAgICAyICAgICAgICAgICBPSyAgICAgIC0wLjEwMjQNCg0KYGBgDQoNCg0KIyMjIyAkIGdyZXAgIlBST0JMRU0iIHBsaW5rLnNleGNoZWNrDQoNCiAgIDEzNDkgICBOQTEwODU0ICAgICAgICAgICAgMiAgICAgICAgICAgIDEgICAgICBQUk9CTEVNICAgICAgICAgMC45OQ0KDQoNCg0KIyMjIyAkIFJzY3JpcHQgLS1uby1zYXZlIGdlbmRlcl9jaGVjay5SDQoNCmBgYHtyfQ0KcGRmX2NvbnZlcnQoIjFfUUNfR1dBUy9HZW5kZXJfY2hlY2sucGRmIiwgZm9ybWF0ID0gImpwZWciLCBkcGkgPSAzMDApDQpgYGANCg0KIVtnZW5kZXJfY2hlY2tdKEdlbmRlcl9jaGVja18xLmpwZWcpDQoNCg0KYGBge3J9DQpwZGZfY29udmVydCgiMV9RQ19HV0FTL1dvbWVuX2NoZWNrLnBkZiIsIGZvcm1hdCA9ICJqcGVnIiwgZHBpID0gMzAwKQ0KYGBgDQoNCiFbd29tZW5fY2hlY2tdKFdvbWVuX2NoZWNrXzEuanBlZykNCg0KDQoNCg0KYGBge3J9DQpwZGZfY29udmVydCgiMV9RQ19HV0FTL01lbl9jaGVjay5wZGYiLCBmb3JtYXQgPSAianBlZyIsIGRwaSA9IDMwMCkNCmBgYA0KDQohW21lbl9jaGVja10oTWVuX2NoZWNrXzEuanBlZykNCg0KDQoNCiMjIEltcHV0ZSBzZXgNCg0KDQojIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfM19yM181IC0taW1wdXRlLXNleCAtLW1ha2UtYmVkIC0tb3V0IEhhcE1hcF8zX3IzXzYNCg0KDQpgYGANCjE0MzA0MjQgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoqKjE2NSBwZW9wbGUgKDgwIG1hbGVzLCA4NSBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLioqDQoNCjExMiBwaGVub3R5cGUgdmFsdWVzIGxvYWRlZCBmcm9tIC5mYW0uDQoNCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMTIgZm91bmRlcnMgYW5kIDUzIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLg0KDQouLi4uLi4uLi4uLi4uLi4uLi4NCg0KV2FybmluZzogMTU3IGhldC4gaGFwbG9pZCBnZW5vdHlwZXMgcHJlc2VudCAoc2VlIEhhcE1hcF8zX3IzXzYuaGggKTsgbWFueQ0KY29tbWFuZHMgdHJlYXQgdGhlc2UgYXMgbWlzc2luZy4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk3ODk5Lg0KDQoxNDMwNDI0IHZhcmlhbnRzIGFuZCAxNjUgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NiBhcmUgY2FzZXMgYW5kIDU2IGFyZSBjb250cm9scy4gICg1MyBwaGVub3R5cGVzIGFyZSBtaXNzaW5nLikNCg0KKiotLWltcHV0ZS1zZXg6IDIzNDEwIFhjaHIgYW5kIDAgWWNociB2YXJpYW50KHMpIHNjYW5uZWQsIGFsbCBzZXhlcyBpbXB1dGVkLioqDQoNClJlcG9ydCB3cml0dGVuIHRvIEhhcE1hcF8zX3IzXzYuc2V4Y2hlY2sgLg0KDQotLW1ha2UtYmVkIHRvIEhhcE1hcF8zX3IzXzYuYmVkICsgSGFwTWFwXzNfcjNfNi5iaW0gKyBIYXBNYXBfM19yM182LmZhbSAuLi4NCg0KYGBgDQoNCg0KDQojIyBHZW5lcmF0ZSBhIGJmaWxlIHdpdGggYXV0b3NvbWFsIFNOUHMgb25seSBhbmQgZGVsZXRlIFNOUHMgd2l0aCBhIGxvdyBtaW5vciBhbGxlbGUgZnJlcXVlbmN5IChNQUYpLg0KDQoNCiMjIyBTZWxlY3QgYXV0b3NvbWFsIFNOUHMgb25seSAoaS5lLiwgZnJvbSBjaHJvbW9zb21lcyAxIHRvIDIyKSBpbnRvIGEgdGV4dCBmaWxlLg0KDQoNCiMjIyMgJCBhd2sgJ3sgaWYgKCQxID49IDEgJiYgJDEgPD0gMjIpIHByaW50ICQyIH0nIEhhcE1hcF8zX3IzXzYuYmltID4gc25wXzFfMjIudHh0DQoNCg0KDQojIyMjICQgaGVhZCBzbnBfMV8yMi50eHQgDQoNCnJzMjE4NTUzOQ0KDQpyczExMjQwNzY3DQoNCnJzMzEzMTk3Mg0KDQpyczMxMzE5NjkNCg0KcnMxMDQ4NDg4DQoNCnJzMTI1NjIwMzQNCg0KcnMxMjEyNDgxOQ0KDQpyczQwNDA2MTcNCg0KcnMyOTA1MDM2DQoNCnJzNDI0NTc1Ng0KDQoNCiMjIyBFeHRyYWN0IGF1dG9zb21hbCBTTlBzIG9ubHkgKGkuZS4sIGZyb20gY2hyb21vc29tZXMgMSB0byAyMikgYW5kIG1ha2UgYmVkLCBiaW0gYW5kIGZhbSBmaWxlcw0KDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF8zX3IzXzYgLS1leHRyYWN0IHNucF8xXzIyLnR4dCAtLW1ha2UtYmVkIC0tb3V0IEhhcE1hcF8zX3IzXzcNCg0KDQpgYGANCjE0MzA0MjQgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoqKjE2NSBwZW9wbGUgKDgxIG1hbGVzLCA4NCBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLioqDQoNCjExMiBwaGVub3R5cGUgdmFsdWVzIGxvYWRlZCBmcm9tIC5mYW0uDQoNCioqLS1leHRyYWN0OiAxMzk4NTQ0IHZhcmlhbnRzIHJlbWFpbmluZy4qKg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDExMiBmb3VuZGVycyBhbmQgNTMgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDYuDQoNCioqMTM5ODU0NCB2YXJpYW50cyBhbmQgMTY1IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLioqDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NiBhcmUgY2FzZXMgYW5kIDU2IGFyZSBjb250cm9scy4gICg1MyBwaGVub3R5cGVzIGFyZSBtaXNzaW5nLikNCg0KLS1tYWtlLWJlZCB0byBIYXBNYXBfM19yM183LmJlZCArIEhhcE1hcF8zX3IzXzcuYmltICsgSGFwTWFwXzNfcjNfNy5mYW0gLi4uDQoNCmBgYA0KDQoNCiMjIFBsb3QgbWlub3IgYWxsZWxlIGZyZXF1ZW5jeSAoTUFGKSBkaXN0cmlidXRpb24uDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF8zX3IzXzcgLS1mcmVxIC0tb3V0IE1BRl9jaGVjaw0KDQpgYGANCjEzOTg1NDQgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxNjUgcGVvcGxlICg4MSBtYWxlcywgODQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTEyIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMTIgZm91bmRlcnMgYW5kIDUzIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLg0KDQouLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTgwNi4NCg0KKiotLWZyZXE6IEFsbGVsZSBmcmVxdWVuY2llcyAoZm91bmRlcnMgb25seSkgd3JpdHRlbiB0byBNQUZfY2hlY2suZnJxIC4qKg0KDQpgYGANCg0KIyMjIyAkIGhlYWQgTUFGX2NoZWNrLmZycSANCg0KYGBgDQoNCiBDSFIgICAgICAgICBTTlAgICBBMSAgIEEyICAgICAgICAgIE1BRiAgTkNIUk9CUw0KIA0KICAgMSAgIHJzMjE4NTUzOSAgICBUICAgIEMgICAgICAgICAgICAwICAgICAgMjI0DQogICANCiAgIDEgIHJzMTEyNDA3NjcgICAgVCAgICBDICAgICAgICAgICAgMCAgICAgIDIyNA0KICAgDQogICAxICAgcnMzMTMxOTcyICAgIEEgICAgRyAgICAgICAwLjE2NTIgICAgICAyMjQNCiAgIA0KICAgMSAgIHJzMzEzMTk2OSAgICBBICAgIEcgICAgICAgMC4xMzM5ICAgICAgMjI0DQogICANCiAgIDEgICByczEwNDg0ODggICAgQyAgICBUICAgICAgIDAuMTY2NyAgICAgIDIyMg0KICAgDQogICAxICByczEyNTYyMDM0ICAgIEEgICAgRyAgICAgICAwLjEwMjcgICAgICAyMjQNCiAgIA0KICAgMSAgcnMxMjEyNDgxOSAgICBHICAgIEEgICAgICAgMC4yOTAyICAgICAgMjI0DQogICANCiAgIDEgICByczQwNDA2MTcgICAgRyAgICBBICAgICAgIDAuMTI5NSAgICAgIDIyNA0KICAgDQogICAxICAgcnMyOTA1MDM2ICAgIEMgICAgVCAgICAgICAgICAgIDAgICAgICAyMjQNCmBgYA0KDQoNCg0KIyMjIyAkIFJzY3JpcHQgLS1uby1zYXZlIE1BRl9jaGVjay5SDQoNCg0KYGBge3J9DQpwZGZfY29udmVydCgiMV9RQ19HV0FTL01BRl9kaXN0cmlidXRpb24ucGRmIiwgZm9ybWF0ID0gImpwZWciLCBkcGkgPSAzMDApDQpgYGANCg0KIVtNQUZfZGlzdHJpYnV0aW9uXShNQUZfZGlzdHJpYnV0aW9uXzEuanBlZykNCg0KDQoNCiMjIFJlbW92ZSBTTlBzIHdpdGggYSBsb3cgTUFGIGZyZXF1ZW5jeS4NCg0KYGBgDQpBIGNvbnZlbnRpb25hbCBNQUYgdGhyZXNob2xkIGZvciBhIHJlZ3VsYXIgR1dBUyBpcyBiZXR3ZWVuIDAuMDEgb3IgMC4wNSwgZGVwZW5kaW5nIG9uIHNhbXBsZSBzaXplLg0KYGBgDQoNCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwXzNfcjNfNyAtLW1hZiAwLjA1IC0tbWFrZS1iZWQgLS1vdXQgSGFwTWFwXzNfcjNfOA0KDQoNCmBgYA0KDQoqKjEzOTg1NDQgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLioqDQoNCjE2NSBwZW9wbGUgKDgxIG1hbGVzLCA4NCBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMTIgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTEyIGZvdW5kZXJzIGFuZCA1MyBub25mb3VuZGVycyBwcmVzZW50Lg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4NCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDYuDQoNCioqMzI1MzE4IHZhcmlhbnRzIHJlbW92ZWQgZHVlIHRvIG1pbm9yIGFsbGVsZSB0aHJlc2hvbGQocykqKg0KDQooLS1tYWYvLS1tYXgtbWFmLy0tbWFjLy0tbWF4LW1hYykuDQoNCioqMTA3MzIyNiB2YXJpYW50cyBhbmQgMTY1IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLioqDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NiBhcmUgY2FzZXMgYW5kIDU2IGFyZSBjb250cm9scy4gICg1MyBwaGVub3R5cGVzIGFyZSBtaXNzaW5nLikNCg0KLS1tYWtlLWJlZCB0byBIYXBNYXBfM19yM184LmJlZCArIEhhcE1hcF8zX3IzXzguYmltICsgSGFwTWFwXzNfcjNfOC5mYW0gLi4uDQoNCmBgYA0KDQoNCg0KDQojIyBEZWxldGUgU05QcyB3aGljaCBhcmUgbm90IGluIEhhcmR5LVdlaW5iZXJnIGVxdWlsaWJyaXVtIChIV0UpDQoNCg0KIyMjIENoZWNrIHRoZSBkaXN0cmlidXRpb24gb2YgSFdFIHAtdmFsdWVzIG9mIGFsbCBTTlBzLg0KDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF8zX3IzXzggLS1oYXJkeQ0KDQpgYGANCjEwNzMyMjYgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxNjUgcGVvcGxlICg4MSBtYWxlcywgODQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTEyIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMTIgZm91bmRlcnMgYW5kIDUzIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLg0KDQouLi4uLi4uLi4uLi4uLi4uDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk5ODA0Ny4NCg0KKiotLWhhcmR5OiBXcml0aW5nIEhhcmR5LVdlaW5iZXJnIHJlcG9ydCAoZm91bmRlcnMgb25seSkgdG8gcGxpbmsuaHdlIC4uLioqDQoNCmBgYA0KDQojIyMjICQgaGVhZCBwbGluay5od2UgDQoNCmBgYA0KDQogQ0hSICAgICAgICAgU05QICAgICBURVNUICAgQTEgICBBMiAgICAgICAgICAgICAgICAgR0VOTyAgIE8oSEVUKSAgIEUoSEVUKSAgICAgICAgICAgIFAgDQogDQogICAxICAgcnMzMTMxOTcyICAgICAgQUxMICAgIEEgICAgRyAgICAgICAgICAgICAgMi8zMy83NyAgIDAuMjk0NiAgIDAuMjc1OCAgICAgICAwLjczMjQNCiAgIA0KICAgMSAgIHJzMzEzMTk3MiAgICAgIEFGRiAgICBBICAgIEcgICAgICAgICAgICAgIDEvMTkvMzYgICAwLjMzOTMgICAwLjMwNDcgICAgICAgIDAuNjY3DQogICANCiAgIDEgICByczMxMzE5NzIgICAgVU5BRkYgICAgQSAgICBHICAgICAgICAgICAgICAxLzE0LzQxICAgICAwLjI1ICAgMC4yNDQ5ICAgICAgICAgICAgMQ0KICAgDQogICAxICAgcnMzMTMxOTY5ICAgICAgQUxMICAgIEEgICAgRyAgICAgICAgICAgICAgMi8yNi84NCAgIDAuMjMyMSAgICAwLjIzMiAgICAgICAgICAgIDENCiAgIA0KICAgMSAgIHJzMzEzMTk2OSAgICAgIEFGRiAgICBBICAgIEcgICAgICAgICAgICAgIDEvMTcvMzggICAwLjMwMzYgICAwLjI4MTcgICAgICAgICAgICAxDQogICANCiAgIDEgICByczMxMzE5NjkgICAgVU5BRkYgICAgQSAgICBHICAgICAgICAgICAgICAgMS85LzQ2ICAgMC4xNjA3ICAgMC4xNzcxICAgICAgIDAuNDE4OQ0KICAgDQogICAxICAgcnMxMDQ4NDg4ICAgICAgQUxMICAgIEMgICAgVCAgICAgICAgICAgICAgMi8zMy83NiAgIDAuMjk3MyAgIDAuMjc3OCAgICAgICAwLjczMjQNCiAgIA0KICAgMSAgIHJzMTA0ODQ4OCAgICAgIEFGRiAgICBDICAgIFQgICAgICAgICAgICAgIDEvMTkvMzUgICAwLjM0NTUgICAwLjMwODkgICAgICAgMC42NjYxDQogICANCiAgIDEgICByczEwNDg0ODggICAgVU5BRkYgICAgQyAgICBUICAgICAgICAgICAgICAxLzE0LzQxICAgICAwLjI1ICAgMC4yNDQ5ICAgICAgICAgICAgMQ0KYGBgDQoNCiMjIyMgJCBhd2sgJ3sgaWYgKCQ5IDwwLjAwMDAxKSBwcmludCAkMCB9JyBwbGluay5od2UgPiBwbGlua3pvb21od2UuaHdlDQoNCg0KDQojIyMjIHdjIC1sIHBsaW5rem9vbWh3ZS5od2UgDQoNCjEzIHBsaW5rem9vbWh3ZS5od2UNCg0KDQoNCiMjIyMgJCBoZWFkIHBsaW5rem9vbWh3ZS5od2UgDQoNCmBgYA0KDQogICAzICAgcnM3NjIzMjkxICAgICAgQUxMICAgIFQgICAgQyAgICAgICAgICAgICAyMi8yOC82MiAgICAgMC4yNSAgIDAuNDM2MiAgICA4LjkzOGUtMDYNCiAgIA0KICAgNyAgcnMzNDIzODUyMiAgICAgIEFMTCAgICBDICAgIFQgICAgICAgICAgICAgIDAvNjQvNDggICAwLjU3MTQgICAwLjQwODIgICAgMy41MTVlLTA2DQogICANCiAgIDggICByczMxMDI4NDEgICAgICBBTEwgICAgQyAgICBBICAgICAgICAgICAgICA4Lzc4LzIzICAgMC43MTU2ICAgMC40OTA1ICAgIDEuODk5ZS0wNg0KICAgDQogICA5ICAgIHJzMzU0ODMxICAgICAgQUxMICAgIEMgICAgVCAgICAgICAgICAgICAxMi8xOC84MiAgIDAuMTYwNyAgIDAuMzA0NyAgICA2LjMzOWUtMDYNCiAgIA0KICAgOSAgcnMxMDk5MDYyNSAgICAgIEFMTCAgICBDICAgIFQgICAgICAgICAgICAgMjMvMjgvNjEgICAgIDAuMjUgICAwLjQ0MjQgICAgOS4zOTFlLTA2DQogICANCiAgIDkgIHJzMTA5OTA2MjUgICAgICBBRkYgICAgQyAgICBUICAgICAgICAgICAgICAxNS84LzMzICAgMC4xNDI5ICAgMC40NDgzICAgIDMuNTc0ZS0wNw0KICAgDQogIDEwICAgcnMyOTE4NjI0ICAgICAgQUxMICAgIEMgICAgVCAgICAgICAgICAgICAgMC82Mi81MCAgIDAuNTUzNiAgIDAuNDAwNCAgICAgOC41NGUtMDYNCiAgDQogIDEwICAgcnM0OTM0MTM5ICAgICAgQUxMICAgIEMgICAgQSAgICAgICAgICAgICAgMC82NS80NyAgIDAuNTgwNCAgIDAuNDExOSAgICAxLjcyMmUtMDYNCiAgDQogIDEyICAgcnMyMzAzNjMyICAgIFVOQUZGICAgIFQgICAgRyAgICAgICAgICAgICAxNS8xMC8zMSAgIDAuMTc4NiAgIDAuNDU5MiAgICA0LjkzNGUtMDYNCiAgDQogIDEyICAgcnM3OTYzMDYzICAgIFVOQUZGICAgIEMgICAgVCAgICAgICAgICAgICAxNS8xMC8zMSAgIDAuMTc4NiAgIDAuNDU5MiAgICA0LjkzNGUtMDYNCiAgDQpgYGAgDQogIA0KDQoNCiMjIyMgJCBSc2NyaXB0IC0tbm8tc2F2ZSBod2UuUg0KDQpgYGB7cn0NCnBkZl9jb252ZXJ0KCIxX1FDX0dXQVMvaGlzdGh3ZS5wZGYiLCBmb3JtYXQgPSAianBlZyIsIGRwaSA9IDMwMCkNCmBgYA0KDQohW2hpc3RfaHdlXShoaXN0aHdlXzEuanBlZykNCiAgICAgICAgICANCiAgICAgICAgICANCmBgYHtyfQ0KcGRmX2NvbnZlcnQoIjFfUUNfR1dBUy9oaXN0aHdlX2JlbG93X3RoZXNob2xkLnBkZiIsIGZvcm1hdCA9ICJqcGVnIiwgZHBpID0gMzAwKQ0KYGBgDQoNCiFbaGlzdF9iZWxvd19od2VdKGhpc3Rod2VfYmVsb3dfdGhlc2hvbGRfMS5qcGVnKQ0KDQoNCg0KDQojIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfM19yM184IC0taHdlIDFlLTYgLS1tYWtlLWJlZCAtLW91dCBIYXBNYXBfaHdlX2ZpbHRlcl9zdGVwMQ0KDQpgYGANCjEwNzMyMjYgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxNjUgcGVvcGxlICg4MSBtYWxlcywgODQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTEyIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDExMiBmb3VuZGVycyBhbmQgNTMgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDQ3Lg0KDQoqKi0taHdlOiAwIHZhcmlhbnRzIHJlbW92ZWQgZHVlIHRvIEhhcmR5LVdlaW5iZXJnIGV4YWN0IHRlc3QuKioNCg0KMTA3MzIyNiB2YXJpYW50cyBhbmQgMTY1IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLg0KDQpBbW9uZyByZW1haW5pbmcgcGhlbm90eXBlcywgNTYgYXJlIGNhc2VzIGFuZCA1NiBhcmUgY29udHJvbHMuICAoNTMgcGhlbm90eXBlcyBhcmUgbWlzc2luZy4pDQoNCi0tbWFrZS1iZWQgdG8gSGFwTWFwX2h3ZV9maWx0ZXJfc3RlcDEuYmVkICsgSGFwTWFwX2h3ZV9maWx0ZXJfc3RlcDEuYmltICsgSGFwTWFwX2h3ZV9maWx0ZXJfc3RlcDEuZmFtIC4uLg0KDQpgYGANCg0KDQojIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF9od2VfZmlsdGVyX3N0ZXAxIC0taHdlIDFlLTEwIC0taHdlLWFsbCAtLW1ha2UtYmVkIC0tb3V0IEhhcE1hcF8zX3IzXzkNCg0KYGBgDQoqKk5vdGU6IC0taHdlLWFsbCBmbGFnIGRlcHJlY2F0ZWQuICBVc2UgJy0taHdlIGluY2x1ZGUtbm9uY3RybCcuKioNCg0KMTA3MzIyNiB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjE2NSBwZW9wbGUgKDgxIG1hbGVzLCA4NCBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMTIgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDExMiBmb3VuZGVycyBhbmQgNTMgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTgwNDcuDQoNCioqLS1od2U6IDAgdmFyaWFudHMgcmVtb3ZlZCBkdWUgdG8gSGFyZHktV2VpbmJlcmcgZXhhY3QgdGVzdC4qKg0KDQoxMDczMjI2IHZhcmlhbnRzIGFuZCAxNjUgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NiBhcmUgY2FzZXMgYW5kIDU2IGFyZSBjb250cm9scy4gICg1MyBwaGVub3R5cGVzDQphcmUgbWlzc2luZy4pDQoNCi0tbWFrZS1iZWQgdG8gSGFwTWFwXzNfcjNfOS5iZWQgKyBIYXBNYXBfM19yM185LmJpbSArIEhhcE1hcF8zX3IzXzkuZmFtIC4uLg0KDQoNCmBgYA0KDQojIyBFeGNsdWRlIGhpZ2ggaW52ZXJzaW9uIHJlZ2lvbnMgKGludmVyc2lvbi50eHQgW0hpZ2ggTEQgcmVnaW9uc10pLCBwcnVuZSB0aGUgU05QcyBhbmQgcmVtb3ZlIGluZGl2aWR1YWxzIHdpdGggYSBoZXRlcm96eWdvc2l0eSByYXRlIGRldmlhdGluZyBtb3JlIHRoYW4gMyBzZCBmcm9tIHRoZSBtZWFuDQoNCg0KIyMjIyB3YyAtbCBpbnZlcnNpb24udHh0IA0KDQoyIGludmVyc2lvbi50eHQNCg0KDQojIyMjICQgY2F0IGludmVyc2lvbi50eHQgDQoNCmBgYA0KDQo2IDI1NTAwMDAwIDMzNTAwMDAwIDggSExBDQoNCjggODEzNTAwMCAxMjAwMDAwMCBJbnZlcnNpb244DQoNCmBgYA0KDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF8zX3IzXzkgLS1leGNsdWRlIGludmVyc2lvbi50eHQgLS1pbmRlcC1wYWlyd2lzZSA1MCA1IDAuMiAtLW91dCBpbmRlcFNOUCAtLXJhbmdlDQoNCg0KYGBgDQoqKk5vdGU6IC0tcmFuZ2UgZmxhZyBkZXByZWNhdGVkLiAgVXNlIGUuZy4gJy0tZXh0cmFjdCByYW5nZSBbZmlsZW5hbWVdJy4qKg0KDQoNCjEwNzMyMjYgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxNjUgcGVvcGxlICg4MSBtYWxlcywgODQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTEyIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KKiotLWV4Y2x1ZGUgcmFuZ2U6IDk4OTMgdmFyaWFudHMgZXhjbHVkZWQuKioNCg0KKiotLWV4Y2x1ZGUgcmFuZ2U6IDEwNjMzMzMgdmFyaWFudHMgcmVtYWluaW5nLioqDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTEyIGZvdW5kZXJzIGFuZCA1MyBub25mb3VuZGVycyBwcmVzZW50Lg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4NCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTgwNDIuDQoNCioqMTA2MzMzMyB2YXJpYW50cyBhbmQgMTY1IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLioqDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NiBhcmUgY2FzZXMgYW5kIDU2IGFyZSBjb250cm9scy4gICg1MyBwaGVub3R5cGVzIGFyZSBtaXNzaW5nLikNCg0KDQpQcnVuZWQgNzkzMjMgdmFyaWFudHMgZnJvbSBjaHJvbW9zb21lIDEsIGxlYXZpbmcgODM5Ny4NCg0KUHJ1bmVkIDgxODMzIHZhcmlhbnRzIGZyb20gY2hyb21vc29tZSAyLCBsZWF2aW5nIDc5NjUuDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KUHJ1bmVkIDEzNTE0IHZhcmlhbnRzIGZyb20gY2hyb21vc29tZSAyMiwgbGVhdmluZyAxOTU0Lg0KDQpQcnVuaW5nIGNvbXBsZXRlLiAgKio5NTkxODkgb2YgMTA2MzMzMyB2YXJpYW50cyByZW1vdmVkLioqDQoNCldyaXRpbmcuLi4NCg0KTWFya2VyIGxpc3RzIHdyaXR0ZW4gdG8gKippbmRlcFNOUC5wcnVuZS5pbioqIGFuZCAqKmluZGVwU05QLnBydW5lLm91dCoqIC4NCg0KYGBgDQoNCg0KIyMjIyAkIHdjIC1sIGluZGVwU05QLnBydW5lLm91dCANCg0KOTU5MTg5IGluZGVwU05QLnBydW5lLm91dA0KDQoNCg0KIyMjIyAkIHdjIC1sIGluZGVwU05QLnBydW5lLmluIA0KDQoxMDQxNDQgaW5kZXBTTlAucHJ1bmUuaW4NCg0KDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF8zX3IzXzkgLS1leHRyYWN0IGluZGVwU05QLnBydW5lLmluIC0taGV0IC0tb3V0IFJfY2hlY2sNCg0KDQpgYGANCjEwNzMyMjYgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxNjUgcGVvcGxlICg4MSBtYWxlcywgODQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTEyIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KKiotLWV4dHJhY3Q6IDEwNDE0NCB2YXJpYW50cyByZW1haW5pbmcuKioNCg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDExMiBmb3VuZGVycyBhbmQgNTMgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uDQoNCi4uLi4uLi4uLi4uLi4uLi4uDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk5ODAzNi4NCg0KKioxMDQxNDQgdmFyaWFudHMgYW5kIDE2NSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4qKg0KDQpBbW9uZyByZW1haW5pbmcgcGhlbm90eXBlcywgNTYgYXJlIGNhc2VzIGFuZCA1NiBhcmUgY29udHJvbHMuICAoNTMgcGhlbm90eXBlcyBhcmUgbWlzc2luZy4pDQoNCioqLS1oZXQ6IDEwNDE0NCB2YXJpYW50cyBzY2FubmVkLCByZXBvcnQgd3JpdHRlbiB0byBSX2NoZWNrLmhldCAuKioNCg0KYGBgDQoNCg0KIyMjIyAkIGhlYWQgUl9jaGVjay5oZXQgDQoNCmBgYA0KDQogICAgRklEICAgICAgIElJRCAgICAgICBPKEhPTSkgICAgICAgRShIT00pICAgICAgICBOKE5NKSAgICAgICAgICAgIEYNCiAgICANCiAgIDEzMjggICBOQTA2OTg5ICAgICAgICA2NzAzOSAgICA2Ljc0N2UrMDQgICAgICAgMTAzOTExICAgICAtMC4wMTE3Mg0KICAgDQogICAxMzc3ICAgTkExMTg5MSAgICAgICAgNjY4NDcgICAgNi42ODRlKzA0ICAgICAgIDEwMjk3MCAgICAwLjAwMDE0OTQNCiAgIA0KICAgMTM0OSAgIE5BMTE4NDMgICAgICAgIDY3MjYyICAgIDYuNzU2ZSswNCAgICAgICAxMDQwNzEgICAgIC0wLjAwODI5DQogICANCiAgIDEzMzAgICBOQTEyMzQxICAgICAgICA2NjY1NCAgICAgNi43NGUrMDQgICAgICAgMTAzODI2ICAgICAtMC4wMjA1MQ0KICAgDQogICAxNDQ0ICAgTkExMjczOSAgICAgICAgNjY2ODcgICAgNi42NTZlKzA0ICAgICAgIDEwMjUxOSAgICAgMC4wMDM2MDINCiAgIA0KICAgMTM0NCAgIE5BMTA4NTAgICAgICAgIDY3NDIxICAgIDYuNzUyZSswNCAgICAgICAxMDQwMDEgICAgLTAuMDAyNzc4DQogICANCiAgIDEzMjggICBOQTA2OTg0ICAgICAgICA2Njk0MiAgICA2LjcyNWUrMDQgICAgICAgMTAzNjAwICAgIC0wLjAwODQ4MQ0KICAgDQogICAxNDYzICAgTkExMjg3NyAgICAgICAgNjczODQgICAgIDYuNzVlKzA0ICAgICAgIDEwMzk3MCAgICAtMC4wMDMxOTMNCiAgIA0KICAgMTQxOCAgIE5BMTIyNzUgICAgICAgIDY2ODI2ICAgIDYuNzQzZSswNCAgICAgICAxMDM4NzEgICAgIC0wLjAxNjYyDQpgYGANCg0KDQoNCiMjIyMgJCBSc2NyaXB0IC0tbm8tc2F2ZSBjaGVja19oZXRlcm96eWdvc2l0eV9yYXRlLlINCg0KDQpgYGB7cn0NCnBkZl9jb252ZXJ0KCIxX1FDX0dXQVMvaGV0ZXJvenlnb3NpdHkucGRmIiwgZm9ybWF0ID0gImpwZWciLCBkcGkgPSAzMDApDQpgYGANCg0KIVtoZXRlcm96eWdvc2l0eSByYXRlIGRpc3RyaWJ1dGlvbl0oaGV0ZXJvenlnb3NpdHlfMS5qcGVnKQ0KICAgICAgICAgIA0KICAgICAgICAgIA0KIyMjIyBSc2NyaXB0IC0tbm8tc2F2ZSBoZXRlcm96eWdvc2l0eV9vdXRsaWVyc19saXN0LlINCg0KT3V0cHV0IG9mIHRoZSBjb21tYW5kIGFib3ZlOiAqKmZhaWwtaGV0LXFjLnR4dCoqDQoNCg0KIyMjIyAkIHdjIC1sIGZhaWwtaGV0LXFjLnR4dCANCg0KMyBmYWlsLWhldC1xYy50eHQNCg0KDQojIyMjICQgY2F0IGZhaWwtaGV0LXFjLnR4dCANCg0KYGBgDQoNCiJGSUQiICJJSUQiICJPLkhPTS4iICJFLkhPTS4iICJOLk5NLiIgIkYiICJIRVRfUkFURSIgIkhFVF9EU1QiDQoNCjEzMzAgIk5BMTIzNDIiIDY4MDQ5IDY3MjQwIDEwMzU3MSAwLjAyMjI5IDAuMzQyOTcyNDUzNjc5MTE5IC0zLjY2OTQyNjAxOTc4NjAxDQoNCjE0NTkgIk5BMTI4NzQiIDY4ODAyIDY3NTYwIDEwNDA2OCAwLjAzMzkgMC4zMzg4NzQ1ODIwMDQwNzQgLTUuMDUzMDg5MDIwODg4OTINCg0KYGBgDQoNCg0KIyMjIyAkIHNlZCAncy8iLy8gZycgZmFpbC1oZXQtcWMudHh0IHwgYXdrICd7cHJpbnQkMSwgJDJ9Jz4gaGV0X2ZhaWxfaW5kLnR4dA0KDQoNCg0KIyMjIyAkIGNhdCBoZXRfZmFpbF9pbmQudHh0IA0KDQpgYGANCg0KRklEIElJRA0KDQoxMzMwIE5BMTIzNDINCg0KMTQ1OSBOQTEyODc0DQoNCmBgYA0KDQoNCiMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwXzNfcjNfOSAtLXJlbW92ZSBoZXRfZmFpbF9pbmQudHh0IC0tbWFrZS1iZWQgLS1vdXQgSGFwTWFwXzNfcjNfMTAgDQoNCg0KYGBgDQoqKjEwNzMyMjYgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLioqDQoNCjE2NSBwZW9wbGUgKDgxIG1hbGVzLCA4NCBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMTIgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQoqKi0tcmVtb3ZlOiAxNjMgcGVvcGxlIHJlbWFpbmluZy4qKg0KDQoNCioqQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMTAgZm91bmRlcnMgYW5kIDUzIG5vbmZvdW5kZXJzIHByZXNlbnQuKioNCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uDQoNCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpbiByZW1haW5pbmcgc2FtcGxlcyBpcyAwLjk5ODA3MS4NCg0KKioxMDczMjI2IHZhcmlhbnRzIGFuZCAxNjMgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuKioNCg0KQW1vbmcgcmVtYWluaW5nIHBoZW5vdHlwZXMsIDU1IGFyZSBjYXNlcyBhbmQgNTUgYXJlIGNvbnRyb2xzLiAgKDUzIHBoZW5vdHlwZXMgYXJlIG1pc3NpbmcuKQ0KDQotLW1ha2UtYmVkIHRvIEhhcE1hcF8zX3IzXzEwLmJlZCArIEhhcE1hcF8zX3IzXzEwLmJpbSArIEhhcE1hcF8zX3IzXzEwLmZhbSAuLi4NCg0KYGBgDQoNCg0KIyMgQW5hbHlzaXMgZm9yIGNyeXB0aWMgcmVsYXRlZG5lc3M6IEV4Y2x1ZGUgYWxsIGluZGl2aWR1YWxzIGFib3ZlIHRoZSBwaWhhdCB0aHJlc2hvbGQgb2YgMC4yDQoNCmBgYA0KDQpUd28gYXBwcm9hY2hlczogQ3J5cHRpYyByZWxhdGVkbmVzcyBhcHByb2FjaCAgYW5kIEZvdW5kZXJzIGFwcHJvYWNoDQoNCmBgYA0KDQojIyMgQ3J5cHRpYyByZWxhdGVkbmVzcyBhcHByb2FjaCANCg0KDQojIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfM19yM18xMCAtLWV4dHJhY3QgaW5kZXBTTlAucHJ1bmUuaW4gLS1nZW5vbWUgLS1taW4gMC4yIC0tb3V0IHBpaGF0X21pbjAuMg0KDQoNCmBgYA0KKioxMDczMjI2IHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4qKg0KDQoxNjMgcGVvcGxlICg3OSBtYWxlcywgODQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTEwIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KKiotLWV4dHJhY3Q6IDEwNDE0NCB2YXJpYW50cyByZW1haW5pbmcuKioNCg0KKipCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDExMCBmb3VuZGVycyBhbmQgNTMgbm9uZm91bmRlcnMgcHJlc2VudC4qKg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4NCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk5ODA1MS4NCg0KKioxMDQxNDQgdmFyaWFudHMgYW5kIDE2MyBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4qKg0KDQpBbW9uZyByZW1haW5pbmcgcGhlbm90eXBlcywgNTUgYXJlIGNhc2VzIGFuZCA1NSBhcmUgY29udHJvbHMuICAoNTMgcGhlbm90eXBlcyBhcmUgbWlzc2luZy4pDQoNCjExNTIgbWFya2VycyBjb21wbGV0ZS4NCg0KMjMwNCBtYXJrZXJzIGNvbXBsZXRlLg0KDQozNDU2IG1hcmtlcnMgY29tcGxldGUuDQoNCg0KLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KMTAzNjgwIG1hcmtlcnMgY29tcGxldGUuDQoNCioqMTA0MTQ0IG1hcmtlcnMgY29tcGxldGUuKioNCg0KSUJEIGNhbGN1bGF0aW9ucyBjb21wbGV0ZS4gIA0KDQpXcml0aW5nLi4uIDk5JQ0KDQoqKkZpbmlzaGVkIHdyaXRpbmcgcGloYXRfbWluMC4yLmdlbm9tZSAuKioNCg0KYGBgDQoNCg0KIyMjIyAkIHdjIC1sIHBpaGF0X21pbjAuMi5nZW5vbWUgDQoNCjk4IHBpaGF0X21pbjAuMi5nZW5vbWUNCg0KDQojIyMjICQgaGVhZCBwaWhhdF9taW4wLjIuZ2Vub21lIA0KDQpgYGANCg0KICAgRklEMSAgICAgSUlEMSAgIEZJRDIgICAgIElJRDIgUlQgICAgRVogICAgICBaMCAgICAgIFoxICAgICAgWjIgIFBJX0hBVCAgUEhFICAgICBEU1QgICAgIFBQQyAgIFJBVElPDQogICANCiAgIDEzNzcgIE5BMTE4OTEgICAxMzc3ICBOQTEwODY1IFBPICAgMC41ICAwLjAwMTMgIDAuOTk3NyAgMC4wMDEwICAwLjQ5OTggICAwICAwLjgyMzg1NCAgMS4wMDAwIDM2MTEuMDAwMA0KICAgDQogICAxMzQ5ICBOQTExODQzICAgMTM0OSAgTkExMDg1MyBQTyAgIDAuNSAgMC4wMDIxICAwLjk5MDUgIDAuMDA3MyAgMC41MDI2ICAtMSAgMC44MjQ4OTYgIDEuMDAwMCA5MjYuNTAwMA0KICAgDQogICAxMzMwICBOQTEyMzQxICAgMTMzMCAgTkExMjMzNSBQTyAgIDAuNSAgMC4wMDAwICAxLjAwMDAgIDAuMDAwMCAgMC41MDAwICAgMCAgMC44MjI4NzQgIDEuMDAwMCA5MjQuMjUwMA0KICAgDQogICAxNDQ0ICBOQTEyNzM5ICAgMTQ0NCAgTkExMjc0OSBQTyAgIDAuNSAgMC4wMDE4ICAwLjk5NDYgIDAuMDAzNyAgMC41MDEwICAtMSAgMC44MjQyOTAgIDEuMDAwMCAgICAgIE5BDQogICANCiAgIDE0NDQgIE5BMTI3MzkgICAxNDQ0ICBOQTEyNzQ4IFBPICAgMC41ICAwLjAwMTUgIDAuOTk0OSAgMC4wMDM3ICAwLjUwMTEgICAwICAwLjgyNDMxNiAgMS4wMDAwIDEyMjcuMzMzMw0KICAgDQogICAxNDYzICBOQTEyODc3ICAgMTQ2MyAgTkExMjg5MCBQTyAgIDAuNSAgMC4wMDAwICAxLjAwMDAgIDAuMDAwMCAgMC41MDAwICAgMCAgMC44MjMyNTYgIDEuMDAwMCAxMjMxLjY2NjcNCiAgIA0KICAgMTQ2MyAgTkExMjg3NyAgIDE0NjMgIE5BMTI4ODkgUE8gICAwLjUgIDAuMDE0MCAgMC45Nzg5ICAwLjAwNzEgIDAuNDk2NSAgIDAgIDAuODIzNjIwICAxLjAwMDAgMTU5LjA0MzUNCiAgIA0KICAgMTQxOCAgTkExMjI3NSAgIDE0MTggIE5BMTA4MzYgUE8gICAwLjUgIDAuMDAyMyAgMC45OTcwICAwLjAwMDcgIDAuNDk5MiAgLTEgIDAuODIzNzE2ICAxLjAwMDAgICAgICBOQQ0KICAgDQogIDEzMjkxICBOQTA2OTg2ICAxMzI5MSAgTkEwNjk5NyBQTyAgIDAuNSAgMC4wMDE2ICAwLjk5NTEgIDAuMDAzMyAgMC41MDA4ICAtMSAgMC44MjQyNDAgIDEuMDAwMCAxODM1LjUwMDANCiAgDQpgYGANCg0KDQoNCg0KIyMjIyAkIGF3ayAneyBpZiAoJDggPjAuOSkgcHJpbnQgJDAgfScgcGloYXRfbWluMC4yLmdlbm9tZSA+IHpvb21fcGloYXQuZ2Vub21lDQoNCg0KDQojIyMjICQgd2MgLWwgem9vbV9waWhhdC5nZW5vbWUgDQoNCjk1IHpvb21fcGloYXQuZ2Vub21lDQoNCg0KDQojIyMjICQgaGVhZCB6b29tX3BpaGF0Lmdlbm9tZSANCg0KYGBgDQoNCiAgIEZJRDEgICAgIElJRDEgICBGSUQyICAgICBJSUQyIFJUICAgIEVaICAgICAgWjAgICAgICBaMSAgICAgIFoyICBQSV9IQVQgUEhFICAgICAgIERTVCAgICAgUFBDICAgUkFUSU8NCiAgIA0KICAgMTM3NyAgTkExMTg5MSAgIDEzNzcgIE5BMTA4NjUgUE8gICAwLjUgIDAuMDAxMyAgMC45OTc3ICAwLjAwMTAgIDAuNDk5OCAgIDAgIDAuODIzODU0ICAxLjAwMDAgMzYxMS4wMDAwDQogICANCiAgIDEzNDkgIE5BMTE4NDMgICAxMzQ5ICBOQTEwODUzIFBPICAgMC41ICAwLjAwMjEgIDAuOTkwNSAgMC4wMDczICAwLjUwMjYgIC0xICAwLjgyNDg5NiAgMS4wMDAwIDkyNi41MDAwDQogICANCiAgIDEzMzAgIE5BMTIzNDEgICAxMzMwICBOQTEyMzM1IFBPICAgMC41ICAwLjAwMDAgIDEuMDAwMCAgMC4wMDAwICAwLjUwMDAgICAwICAwLjgyMjg3NCAgMS4wMDAwIDkyNC4yNTAwDQogICANCiAgIDE0NDQgIE5BMTI3MzkgICAxNDQ0ICBOQTEyNzQ5IFBPICAgMC41ICAwLjAwMTggIDAuOTk0NiAgMC4wMDM3ICAwLjUwMTAgIC0xICAwLjgyNDI5MCAgMS4wMDAwICAgICAgTkENCiAgIA0KICAgMTQ0NCAgTkExMjczOSAgIDE0NDQgIE5BMTI3NDggUE8gICAwLjUgIDAuMDAxNSAgMC45OTQ5ICAwLjAwMzcgIDAuNTAxMSAgIDAgIDAuODI0MzE2ICAxLjAwMDAgMTIyNy4zMzMzDQogICANCiAgIDE0NjMgIE5BMTI4NzcgICAxNDYzICBOQTEyODkwIFBPICAgMC41ICAwLjAwMDAgIDEuMDAwMCAgMC4wMDAwICAwLjUwMDAgICAwICAwLjgyMzI1NiAgMS4wMDAwIDEyMzEuNjY2Nw0KICAgDQogICAxNDYzICBOQTEyODc3ICAgMTQ2MyAgTkExMjg4OSBQTyAgIDAuNSAgMC4wMTQwICAwLjk3ODkgIDAuMDA3MSAgMC40OTY1ICAgMCAgMC44MjM2MjAgIDEuMDAwMCAxNTkuMDQzNQ0KICAgDQogICAxNDE4ICBOQTEyMjc1ICAgMTQxOCAgTkExMDgzNiBQTyAgIDAuNSAgMC4wMDIzICAwLjk5NzAgIDAuMDAwNyAgMC40OTkyICAtMSAgMC44MjM3MTYgIDEuMDAwMCAgICAgIE5BDQogICANCiAgMTMyOTEgIE5BMDY5ODYgIDEzMjkxICBOQTA2OTk3IFBPICAgMC41ICAwLjAwMTYgIDAuOTk1MSAgMC4wMDMzICAwLjUwMDggIC0xICAwLjgyNDI0MCAgMS4wMDAwIDE4MzUuNTAwMA0KICANCmBgYA0KDQoNCg0KIyMjIyAkIFJzY3JpcHQgLS1uby1zYXZlIFJlbGF0ZWRuZXNzLlINCg0KDQpgYGB7cn0NCnBkZl9jb252ZXJ0KCIxX1FDX0dXQVMvaGlzdF9yZWxhdGVkbmVzcy5wZGYiLCBmb3JtYXQgPSAianBlZyIsIGRwaSA9IDMwMCkNCmBgYA0KDQohW2hpc3RfcmVsYXRlZG5lc3NdKGhpc3RfcmVsYXRlZG5lc3NfMS5qcGVnKQ0KICANCiAgDQojIyMgRm91bmRlcnMgYXBwcm9hY2ggDQoNCg0KIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfM19yM18xMCAtLWZpbHRlci1mb3VuZGVycyAtLW1ha2UtYmVkIC0tb3V0IEhhcE1hcF8zX3IzXzExDQoNCg0KYGBgDQoxMDczMjI2IHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4NCg0KKioxNjMgcGVvcGxlICg3OSBtYWxlcywgODQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4qKg0KDQoxMTAgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQoqKjUzIHBlb3BsZSByZW1vdmVkIGR1ZSB0byBmb3VuZGVyIHN0YXR1cyAoLS1maWx0ZXItZm91bmRlcnMpLioqDQoNCg0KKipCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDExMCBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50LioqDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLg0KDQouLi4uLi4uLi4uLi4uLi4uLg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaW4gcmVtYWluaW5nIHNhbXBsZXMgaXMgMC45OTgwMjUuDQoNCioqMTA3MzIyNiB2YXJpYW50cyBhbmQgMTEwIHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLioqDQoNCioqQW1vbmcgcmVtYWluaW5nIHBoZW5vdHlwZXMsIDU1IGFyZSBjYXNlcyBhbmQgNTUgYXJlIGNvbnRyb2xzLioqDQoNCi0tbWFrZS1iZWQgdG8gSGFwTWFwXzNfcjNfMTEuYmVkICsgSGFwTWFwXzNfcjNfMTEuYmltICsgSGFwTWFwXzNfcjNfMTEuZmFtIC4uLg0KDQoNCmBgYA0KDQoNCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwXzNfcjNfMTEgLS1leHRyYWN0IGluZGVwU05QLnBydW5lLmluIC0tZ2Vub21lIC0tbWluIDAuMiAtLW91dCBwaWhhdF9taW4wLjJfaW5fZm91bmRlcnMNCg0KDQpFeHRyYWN0IGluZGl2aWR1YWxzIHdpdGggYSBwaWhhdCA+MC4yDQoNCg0KYGBgDQoxMDczMjI2IHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4NCg0KMTEwIHBlb3BsZSAoNTUgbWFsZXMsIDU1IGZlbWFsZXMpIGxvYWRlZCBmcm9tIC5mYW0uDQoNCjExMCBwaGVub3R5cGUgdmFsdWVzIGxvYWRlZCBmcm9tIC5mYW0uDQoNCi0tZXh0cmFjdDogMTA0MTQ0IHZhcmlhbnRzIHJlbWFpbmluZy4NCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMTAgZm91bmRlcnMgYW5kIDAgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uIA0KDQoNCi4uLi4uLi4uLi4uLg0KDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk5Nzk3OC4NCg0KMTA0MTQ0IHZhcmlhbnRzIGFuZCAxMTAgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NSBhcmUgY2FzZXMgYW5kIDU1IGFyZSBjb250cm9scy4NCg0KMTE1MiBtYXJrZXJzIGNvbXBsZXRlLg0KDQoyMzA0IG1hcmtlcnMgY29tcGxldGUuDQoNCjM0NTYgbWFya2VycyBjb21wbGV0ZS4NCg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQoxMDM2ODAgbWFya2VycyBjb21wbGV0ZS4NCg0KMTA0MTQ0IG1hcmtlcnMgY29tcGxldGUuDQoNCg0KSUJEIGNhbGN1bGF0aW9ucyBjb21wbGV0ZS4gIA0KDQpXcml0aW5nLi4uIDk5JQ0KDQoqKkZpbmlzaGVkIHdyaXRpbmcgcGloYXRfbWluMC4yX2luX2ZvdW5kZXJzLmdlbm9tZSAuKioNCg0KYGBgDQoNCiMjIyMgJCBjYXQgcGloYXRfbWluMC4yX2luX2ZvdW5kZXJzLmdlbm9tZSANCg0KYGBgDQoNCiAgIEZJRDEgICAgIElJRDEgICBGSUQyICAgICBJSUQyIFJUICAgIEVaICAgICAgWjAgICAgICBaMSAgICAgIFoyICBQSV9IQVQgUEhFICAgICAgIERTVCAgICAgUFBDICAgUkFUSU8NCiAgIA0KICAxMzI5MSAgTkEwNzA0NSAgIDE0NTQgIE5BMTI4MTMgVU4gICAgTkEgIDAuMjU3MiAgMC41MDA3ICAwLjI0MjEgIDAuNDkyNCAgIDAgIDAuODM5Nzc3ICAxLjAwMDAgIDkuNzAyMg0KYGBgDQoNCg0KIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfM19yM18xMSAtLW1pc3NpbmcNCg0KUmVtb3ZlcyB0aGUgaW5kaXZpZHVhbCB3aXRoIHRoZSBsb3dlc3QgY2FsbCByYXRlDQoNCg0KYGBgDQoxMDczMjI2IHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4NCg0KMTEwIHBlb3BsZSAoNTUgbWFsZXMsIDU1IGZlbWFsZXMpIGxvYWRlZCBmcm9tIC5mYW0uDQoNCjExMCBwaGVub3R5cGUgdmFsdWVzIGxvYWRlZCBmcm9tIC5mYW0uDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTEwIGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLg0KDQouLi4uLi4uLg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTgwMjUuDQoNCi0tbWlzc2luZzogU2FtcGxlIG1pc3NpbmcgZGF0YSByZXBvcnQgd3JpdHRlbiB0byBwbGluay5pbWlzcywgYW5kIHZhcmlhbnQtYmFzZWQNCg0KKiptaXNzaW5nIGRhdGEgcmVwb3J0IHdyaXR0ZW4gdG8gcGxpbmsubG1pc3MuKioNCg0KYGBgDQoNCg0KIyMjIyAkIHdjIC1sIHBsaW5rLmltaXNzIA0KDQoxMTEgcGxpbmsuaW1pc3MNCg0KDQojIyMjICQgaGVhZCAtbiA1IHBsaW5rLmltaXNzIA0KDQoNCmBgYA0KDQogICAgRklEICAgICBJSUQgICAgTUlTU19QSEVOTyAgIE5fTUlTUyAgIE5fR0VOTyAgIEZfTUlTUw0KICAgIA0KICAgMTMyOCAgIE5BMDY5ODkgICAgICAgICAgTiAgICAgMjE4MSAgMTA3MzIyNiAwLjAwMjAzMg0KICAgDQogICAxMzc3ICAgTkExMTg5MSAgICAgICAgICBOICAgIDEzNTg2ICAxMDczMjI2ICAwLjAxMjY2DQogICANCiAgIDEzNDkgICBOQTExODQzICAgICAgICAgIE4gICAgICA4MTMgIDEwNzMyMjYgMC4wMDA3NTc1DQogICANCiAgIDEzMzAgICBOQTEyMzQxICAgICAgICAgIE4gICAgIDM2OTcgIDEwNzMyMjYgMC4wMDM0NDUNCg0KYGBgDQoNCiMjIyMgJCB3YyAtbCAwLjJfbG93X2NhbGxfcmF0ZV9waWhhdC50eHQgDQoNCjEgMC4yX2xvd19jYWxsX3JhdGVfcGloYXQudHh0DQoNCg0KIyMjIyAkIGNhdCAwLjJfbG93X2NhbGxfcmF0ZV9waWhhdC50eHQgDQoNCjEzMjkxCU5BMDcwNDUNCg0KDQojIyMjICQgcGxpbmsyIC0tYmZpbGUgSGFwTWFwXzNfcjNfMTEgLS1tYWtlLWJlZCAtLW91dCBIYXBNYXBfM19yM18xMiAtLXJlbW92ZSAwLjJfbG93X2NhbGxfcmF0ZV9waWhhdC50eHQNCg0KRGVsZXRlcyB0aGUgaW5kaXZpZHVhbHMgd2l0aCB0aGUgbG93ZXN0IGNhbGwgcmF0ZSBpbiAncmVsYXRlZCcgcGFpcnMgd2l0aCBhIHBpaGF0ID4gMC4yIA0KDQoNCmBgYA0KMTA3MzIyNiB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjExMCBwZW9wbGUgKDU1IG1hbGVzLCA1NSBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMTAgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQoqKi0tcmVtb3ZlOiAxMDkgcGVvcGxlIHJlbWFpbmluZy4qKg0KDQoqKkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTA5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuKioNCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uDQoNCg0KLi4uLi4uLi4uLi4uLg0KDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpbiByZW1haW5pbmcgc2FtcGxlcyBpcyAwLjk5ODAyOC4NCg0KKioxMDczMjI2IHZhcmlhbnRzIGFuZCAxMDkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuKioNCg0KKipBbW9uZyByZW1haW5pbmcgcGhlbm90eXBlcywgNTQgYXJlIGNhc2VzIGFuZCA1NSBhcmUgY29udHJvbHMuKioNCg0KLS1tYWtlLWJlZCB0byBIYXBNYXBfM19yM18xMi5iZWQgKyBIYXBNYXBfM19yM18xMi5iaW0gKyBIYXBNYXBfM19yM18xMi5mYW0gLi4uDQoNCmBgYA0KDQoNCg0KDQoNCiMjIEZpbmFsIGRpcmVjdG9yeSBjb250ZW50cyBhdCB0aGUgZW5kIG9mIFFDDQoNCiMjIyMgfi9HV0FTX0lKTVBSL0dXQV90dXRvcmlhbC8xX1FDX0dXQVMkIGxzIC1sDQoNCmBgYA0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE0IE5vdiAyOSAwMzoxOSAwLjJfbG93X2NhbGxfcmF0ZV9waWhhdC50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDEyNjIwIE5vdiAyOSAwMzoyMSAxX01haW5fc2NyaXB0X1FDX0dXQVMudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDU3MiBOb3YgMjkgMDI6MzIgR2VuZGVyX2NoZWNrLnBkZg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNjEyMzE2NzcgSmFuIDI1ICAyMDE2IEhhcE1hcF8zX3IzXzEuYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA0MDYzNTgyNCBKYW4gMjUgIDIwMTYgSGFwTWFwXzNfcjNfMS5iaW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA0MTM2IEphbiAyNSAgMjAxNiBIYXBNYXBfM19yM18xLmZhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNDQwMDIyNjkgTm92IDI5IDAyOjU3IEhhcE1hcF8zX3IzXzEwLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMjk4NDYwNTQgTm92IDI5IDAyOjU3IEhhcE1hcF8zX3IzXzEwLmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDQwOTQgTm92IDI5IDAyOjU3IEhhcE1hcF8zX3IzXzEwLmZhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDEwMTYgTm92IDI5IDAyOjU3IEhhcE1hcF8zX3IzXzEwLmxvZw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzAwNTAzMzEgTm92IDI5IDAzOjAxIEhhcE1hcF8zX3IzXzExLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMjk4NDYwNTQgTm92IDI5IDAzOjAxIEhhcE1hcF8zX3IzXzExLmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDIzMTggTm92IDI5IDAzOjAxIEhhcE1hcF8zX3IzXzExLmZhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDEwMDcgTm92IDI5IDAzOjAxIEhhcE1hcF8zX3IzXzExLmxvZw0KDQoqKi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAzMDA1MDMzMSBOb3YgMjkgMDM6MjAgSGFwTWFwXzNfcjNfMTIuYmVkKioNCg0KKiotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMjk4NDYwNTQgTm92IDI5IDAzOjIwIEhhcE1hcF8zX3IzXzEyLmJpbSoqDQoNCioqLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyMjk2IE5vdiAyOSAwMzoyMCBIYXBNYXBfM19yM18xMi5mYW0qKg0KDQoqKi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDk5NyBOb3YgMjkgMDM6MjAgSGFwTWFwXzNfcjNfMTIubG9nKioNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDYxMjMxNjc3IE5vdiAyOSAwMjoyNyBIYXBNYXBfM19yM18yLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNDA2MzU4MjQgTm92IDI5IDAyOjI3IEhhcE1hcF8zX3IzXzIuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDEzNiBOb3YgMjkgMDI6MjcgSGFwTWFwXzNfcjNfMi5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA1MjI2IE5vdiAyOSAwMjoyNyBIYXBNYXBfM19yM18yLmhoDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTEwOSBOb3YgMjkgMDI6MjcgSGFwTWFwXzNfcjNfMi5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDYxMjMxNjc3IE5vdiAyOSAwMjoyOCBIYXBNYXBfM19yM18zLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNDA2MzU4MjQgTm92IDI5IDAyOjI4IEhhcE1hcF8zX3IzXzMuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDEzNiBOb3YgMjkgMDI6MjggSGFwTWFwXzNfcjNfMy5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA1MjI2IE5vdiAyOSAwMjoyOCBIYXBNYXBfM19yM18zLmhoDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTEwNyBOb3YgMjkgMDI6MjggSGFwTWFwXzNfcjNfMy5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDYwMDc3ODExIE5vdiAyOSAwMjoyOSBIYXBNYXBfM19yM180LmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzk4NjkwNTkgTm92IDI5IDAyOjI5IEhhcE1hcF8zX3IzXzQuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDEzNiBOb3YgMjkgMDI6MjkgSGFwTWFwXzNfcjNfNC5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA1MjI2IE5vdiAyOSAwMjoyOSBIYXBNYXBfM19yM180LmhoDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTExNCBOb3YgMjkgMDI6MjkgSGFwTWFwXzNfcjNfNC5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDYwMDc3ODExIE5vdiAyOSAwMjoyOSBIYXBNYXBfM19yM181LmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzk4NjkwNTkgTm92IDI5IDAyOjI5IEhhcE1hcF8zX3IzXzUuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDEzNiBOb3YgMjkgMDI6MjkgSGFwTWFwXzNfcjNfNS5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAzNjQyIE5vdiAyOSAwMjoyOSBIYXBNYXBfM19yM181LmhoDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTEwOCBOb3YgMjkgMDI6MjkgSGFwTWFwXzNfcjNfNS5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDYwMDc3ODExIE5vdiAyOSAwMjozNiBIYXBNYXBfM19yM182LmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzk4NjkwNTkgTm92IDI5IDAyOjM2IEhhcE1hcF8zX3IzXzYuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDEzNiBOb3YgMjkgMDI6MzYgSGFwTWFwXzNfcjNfNi5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAzNjQyIE5vdiAyOSAwMjozNiBIYXBNYXBfM19yM182LmhoDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTE3MSBOb3YgMjkgMDI6MzYgSGFwTWFwXzNfcjNfNi5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDExNjIwIE5vdiAyOSAwMjozNiBIYXBNYXBfM19yM182LnNleGNoZWNrDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA1ODczODg1MSBOb3YgMjkgMDI6MzggSGFwTWFwXzNfcjNfNy5iZWQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDM4OTYyMDc5IE5vdiAyOSAwMjozOCBIYXBNYXBfM19yM183LmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDQxMzYgTm92IDI5IDAyOjM4IEhhcE1hcF8zX3IzXzcuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDk5NCBOb3YgMjkgMDI6MzggSGFwTWFwXzNfcjNfNy5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDQ1MDc1NDk1IE5vdiAyOSAwMjo0MiBIYXBNYXBfM19yM184LmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMjk4NDYwNTQgTm92IDI5IDAyOjQyIEhhcE1hcF8zX3IzXzguYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDEzNiBOb3YgMjkgMDI6NDIgSGFwTWFwXzNfcjNfOC5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAxMDM1IE5vdiAyOSAwMjo0MiBIYXBNYXBfM19yM184LmxvZw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNDUwNzU0OTUgTm92IDI5IDAyOjUwIEhhcE1hcF8zX3IzXzkuYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAyOTg0NjA1NCBOb3YgMjkgMDI6NTAgSGFwTWFwXzNfcjNfOS5iaW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA0MTM2IE5vdiAyOSAwMjo1MCBIYXBNYXBfM19yM185LmZhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDEwOTAgTm92IDI5IDAyOjUwIEhhcE1hcF8zX3IzXzkubG9nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA0NTA3NTQ5NSBOb3YgMjkgMDI6NDggSGFwTWFwX2h3ZV9maWx0ZXJfc3RlcDEuYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAyOTg0NjA1NCBOb3YgMjkgMDI6NDggSGFwTWFwX2h3ZV9maWx0ZXJfc3RlcDEuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDEzNiBOb3YgMjkgMDI6NDggSGFwTWFwX2h3ZV9maWx0ZXJfc3RlcDEuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTA0NCBOb3YgMjkgMDI6NDggSGFwTWFwX2h3ZV9maWx0ZXJfc3RlcDEubG9nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDE2MiBTZXAgIDEgIDIwMTUgTUFGX2NoZWNrLlINCg0KLXJ3LXItLXItLSAxIHVidW50dSB1YnVudHUgIDY4NTI4NzA1IE5vdiAyOSAwMjozOSBNQUZfY2hlY2suZnJxDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDc2NSBOb3YgMjkgMDI6MzkgTUFGX2NoZWNrLmxvZw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDQ3NTUgTm92IDI5IDAyOjM5IE1BRl9kaXN0cmlidXRpb24ucGRmDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDUyNiBOb3YgMjkgMDI6MzIgTWVuX2NoZWNrLnBkZg0KDQotcnctci0tci0tIDEgdWJ1bnR1IHVidW50dSAgICAgMTE2MjAgTm92IDI5IDAyOjUzIFJfY2hlY2suaGV0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDk2OSBOb3YgMjkgMDI6NTMgUl9jaGVjay5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgOTIzIE5vdiAyNiAgMjAxNSBSZWxhdGVkbmVzcy5SDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDU5OSBOb3YgMjkgMDI6MzIgV29tZW5fY2hlY2sucGRmDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDIzNSBKYW4gMjIgIDIwMTYgY2hlY2tfaGV0ZXJvenlnb3NpdHlfcmF0ZS5SDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDIxOCBOb3YgMjkgMDI6NTQgZmFpbC1oZXQtcWMudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDM1MiBBdWcgMjggIDIwMTUgZ2VuZGVyX2NoZWNrLlINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDM0IE5vdiAyOSAwMjo1NiBoZXRfZmFpbF9pbmQudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDY1NyBOb3YgMjkgMDI6NTMgaGV0ZXJvenlnb3NpdHkucGRmDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDM3MSBBdWcgMjAgIDIwMTUgaGV0ZXJvenlnb3NpdHlfb3V0bGllcnNfbGlzdC5SDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDQxMCBTZXAgMTAgIDIwMTUgaGlzdF9taXNzLlINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA0NTc0IE5vdiAyOSAwMjo1OSBoaXN0X3JlbGF0ZWRuZXNzLnBkZg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDQ3MDUgTm92IDI5IDAyOjQ3IGhpc3Rod2UucGRmDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDYwMiBOb3YgMjkgMDI6NDcgaGlzdGh3ZV9iZWxvd190aGVzaG9sZC5wZGYNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA0NTk5IE5vdiAyOSAwMjoyMyBoaXN0aW1pc3MucGRmDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNDc2NCBOb3YgMjkgMDI6MjMgaGlzdGxtaXNzLnBkZg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAyODcgU2VwICAyICAyMDE1IGh3ZS5SDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMjM5NyBOb3YgMjkgMDI6NTIgaW5kZXBTTlAubG9nDQoNCioqLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAxMDU4OTM4IE5vdiAyOSAwMjo1MiBpbmRlcFNOUC5wcnVuZS5pbioqDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgOTc0NzE3OSBOb3YgMjkgMDI6NTIgaW5kZXBTTlAucHJ1bmUub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICA4OCBKdW4gMjUgIDIwMTUgaW52ZXJzaW9uLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgMTAzNDIgTm92IDI5IDAyOjU4IHBpaGF0X21pbjAuMi5nZW5vbWUNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgOTg4IE5vdiAyOSAwMjo1OCBwaWhhdF9taW4wLjIubG9nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDIwOCBOb3YgMjkgMDM6MDIgcGloYXRfbWluMC4yX2luX2ZvdW5kZXJzLmdlbm9tZQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICA5ODEgTm92IDI5IDAzOjAyIHBpaGF0X21pbjAuMl9pbl9mb3VuZGVycy5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAzNjQyIE5vdiAyOSAwMjozMSBwbGluay5oaA0KDQotcnctci0tci0tIDEgdWJ1bnR1IHVidW50dSAyODMzMzE3NTMgTm92IDI5IDAyOjQ0IHBsaW5rLmh3ZQ0KDQotcnctci0tci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDYyNjAgTm92IDI5IDAzOjAzIHBsaW5rLmltaXNzDQoNCi1ydy1yLS1yLS0gMSB1YnVudHUgdWJ1bnR1ICA0NzIyMTk4OCBOb3YgMjkgMDM6MDMgcGxpbmsubG1pc3MNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgODA1IE5vdiAyOSAwMzowMyBwbGluay5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDExNjIwIE5vdiAyOSAwMjozMSBwbGluay5zZXhjaGVjaw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDExNDQgTm92IDI5IDAyOjQ2IHBsaW5rem9vbWh3ZS5od2UNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDM5MjQyIFNlcCAgNyAgMjAxNSBwb3BzX0hhcE1hcF8zX3IzDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNTAwNiBOb3YgMjkgMDI6NTkgcmVsYXRlZG5lc3MucGRmDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAxNDI3NTkwOCBOb3YgMjkgMDI6Mzcgc25wXzFfMjIudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAxMDAzMCBOb3YgMjkgMDI6NTkgem9vbV9waWhhdC5nZW5vbWUNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA0OTk4IE5vdiAyOSAwMjo1OSB6b29tX3JlbGF0ZWRuZXNzLnBkZg0KDQpgYGANCg0KDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIDJfUG9wdWxhdGlvbl9zdHJhdGlmaWNhdGlvbg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoNCg0KIyMgT2J0YWluIGdlbmV0aWMgZGF0YSBvZiA2MjkgaW5kaXZpZHVhbHMgZnJvbSBkaWZmZXJlbnQgZXRobmljIGJhY2tncm91bmRzIHByZXNlbnRlZCBpbiBhIDEwMDAgR2Vub21lcyBkYXRhc2V0DQogDQoNCiMjIyMgfi9HV0FTX0lKTVBSJCB3Z2V0IGZ0cDovL2Z0cC10cmFjZS5uY2JpLm5paC5nb3YvMTAwMGdlbm9tZXMvZnRwL3JlbGVhc2UvMjAxMDA4MDQvQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzLnZjZi5neg0KDQoNCg0KDQoNCiMjIyBBZGRpdGlvbmFsIGRpcmVjdG9yeSBjb250ZW50cw0KDQoNCiMjIyMgfi9HV0FTX0lKTVBSJCBscyAtbA0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDY1NjcyMDkyMDk2IE5vdiAyOSAwMzo0NCBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMudmNmLmd6DQoNCg0KDQoNCg0KIyMjIyAkIHptb3JlIEFMTC4yb2Y0aW50ZXJzZWN0aW9uLjIwMTAwODA0Lmdlbm90eXBlcy52Y2YuZ3ogDQoNCg0KYGBgDQoNCiMjZmlsZWZvcm1hdD1WQ0Z2NC4wDQoNCiMjZmlsZWRhdD0yMDEwMTExMg0KDQojI2RhdGFyZWxlYXNlPTIwMTAwODA0DQoNCioqIyNzYW1wbGVzPTYyOSoqDQoNCiMjZGVzY3JpcHRpb249IldoZXJlICoqQkkgY2FsbHMqKiBhcmUgcHJlc2VudCwgZ2Vub3R5cGVzIGFuZCBhbGxlbGVzIGFyZSBmcm9tIEJJLiAgDQoNCkluIHRoZXJlIGFic2VuY2UsICoqVU0gZ2Vub3R5cGVzKiogYXJlIHVzZWQuICANCg0KSWYgbmVpdGhlciBhcmUgYXZhaWxhYmxlLCBubyBnZW5vdHlwZSBpbiBmb3JtYXRpb24gaXMgcHJlc2VudCBhbmQgdGhlIGFsbGVsZXMgYXJlIGZyb20gdGhlICoqTkNCSSBjYWxscyoqLiINCg0KIyNGT1JNQVQ9PElEPUFELE51bWJlcj0uLFR5cGU9SW50ZWdlcixEZXNjcmlwdGlvbj0iKipBbGxlbGljIGRlcHRocyoqIGZvciB0aGUgcmVmIGFuZCBhbHQgYWxsZWxlcyBpbiB0aGUgb3JkZXIgbGlzdGVkIj4NCg0KIyNGT1JNQVQ9PElEPURQLE51bWJlcj0xLFR5cGU9SW50ZWdlcixEZXNjcmlwdGlvbj0iKipSZWFkIERlcHRoKiogKG9ubHkgZmlsdGVyZWQgcmVhZHMgdXNlZCBmb3IgY2FsbGluZykiPg0KDQojI0ZPUk1BVD08SUQ9R0wsTnVtYmVyPTMsVHlwZT1GbG9hdCxEZXNjcmlwdGlvbj0iKipMb2ctc2NhbGVkIGxpa2VsaWhvb2RzIGZvciBBQSxBQixCQiBnZW5vdHlwZXMqKiANCndoZXJlIEE9cmVmIGFuZCBCPWFsdDsgbm90IGFwcGxpY2FibGUgaWYgc2l0ZSBpcyBub3QgYmlhbGxlbGljIj4NCg0KIyNGT1JNQVQ9PElEPUdRLE51bWJlcj0xLFR5cGU9RmxvYXQsRGVzY3JpcHRpb249IioqR2Vub3R5cGUgUXVhbGl0eSoqIj4NCg0KIyNGT1JNQVQ9PElEPUdULE51bWJlcj0xLFR5cGU9U3RyaW5nLERlc2NyaXB0aW9uPSIqKkdlbm90eXBlKioiPg0KDQojI0ZPUk1BVD08SUQ9R0QsTnVtYmVyPTEsVHlwZT1GbG9hdCxEZXNjcmlwdGlvbj0iKipHZW5vdHlwZSBkb3NhZ2UqKi4gIEV4cGVjdGVkIGNvdW50IG9mIG5vbi1yZWYgYWxsZWxlcyBbMCwyXSI+DQoNCiMjRk9STUFUPTxJRD1PRyxOdW1iZXI9MSxUeXBlPVN0cmluZyxEZXNjcmlwdGlvbj0iKipPcmlnaW5hbCBHZW5vdHlwZSoqIGlucHV0IHRvIEJlYWdsZSI+DQoNCiMjSU5GTz08SUQ9QUYsTnVtYmVyPS4sVHlwZT1GbG9hdCxEZXNjcmlwdGlvbj0iKipBbGxlbGUgRnJlcXVlbmN5KiosIGZvciBlYWNoIEFMVCBhbGxlbGUsIGluIHRoZSBzYW1lIG9yZGVyIGFzIGxpc3RlZCI+DQoNCiMjSU5GTz08SUQ9RFAsTnVtYmVyPTEsVHlwZT1JbnRlZ2VyLERlc2NyaXB0aW9uPSIqKlRvdGFsIERlcHRoKioiPg0KDQojI0lORk89PElEPUNCLE51bWJlcj0uLFR5cGU9U3RyaW5nLERlc2NyaXB0aW9uPSJMaXN0IG9mIGNlbnRyZXMgdGhhdCBjYWxsZWQsIA0KKipVTSAoVW5pdmVyc2l0eSBvZiBNaWNoaWdhbikqKiwgKipCSSAoQnJvYWQgSW5zdGl0dXRlKSoqLCAqKkJDIChCb3N0b24gQ29sbGVnZSkqKiwgKipOQ0JJKioiPg0KDQojI0lORk89PElEPUVVUl9SMixOdW1iZXI9MSxUeXBlPUZsb2F0LERlc2NyaXB0aW9uPSIqKlIyIEZyb20gQmVhZ2xlIGJhc2VkIG9uIEV1cm9wZWFuIFNhbXBsZXMqKiI+DQoNCiMjSU5GTz08SUQ9QUZSX1IyLE51bWJlcj0xLFR5cGU9RmxvYXQsRGVzY3JpcHRpb249IioqUjIgRnJvbSBCZWFnbGUgYmFzZWQgb24gQUZSSUNBTiBTYW1wbGVzKioiPg0KDQojI0lORk89PElEPUFTTl9SMixOdW1iZXI9MSxUeXBlPUZsb2F0LERlc2NyaXB0aW9uPSIqKlIyIEZyb20gQmVhZ2xlIGJhc2VkIG9uIEFzaWFuIFNhbXBsZXMqKiI+DQoNCiNDSFJPTQlQT1MJSUQJUkVGCUFMVAlRVUFMCUZJTFRFUglJTkZPCUZPUk1BVCANCg0KSEcwMDA5OAlIRzAwMTAwCUhHMDAxMDYJSEcwMDExMglIRzAwMTE0CUhHMDAxMTYJSEcwMDExNwlIRzAwMTE4CUhHMDAxMTkJSEcwMDEyMAlIRzAwMTIyCQ0KSEcwMDEyMwlIRzAwMTI0CUhHMDAxMjYJSEcwMDEzMQlIRzAwMTQxCUhHMDAxNDIJSEcwMDE0MwlIRzAwMTQ0CUhHMDAxNDUJSEcwMDE0NglIRzAwMTQ3DQpIRzAwMTQ4CUhHMDAxNDkJSEcwMDE1MAlIRzAwMTUxCUhHMDAxNTIJSEcwMDE1MwlIRzAwMTU2CUhHMDAxNTgJSEcwMDE1OQkNCg0KYGBgDQoNCg0KIyMgUXVhbGl0eSBjb250cm9sIHRoZSAxMDAwIGdlbm9tZSBkYXRhIChzdGVwcyBzaW1pbGFyIHRvIHRob3NlIGRlc2NyaWJlZCBpbiBwYXJ0IDEgd2lsbCBiZSB1bmRlcnRha2VuICkNCg0KDQpgYGANCkNoZWNrIGZvciBwb3B1bGF0aW9uIHN0cmF0aWZpY2F0aW9uIHVzaW5nIGRhdGEgZnJvbSB0aGUgMTAwMCBHZW5vbWVzIFByb2plY3QuDQoNCkluZGl2aWR1YWxzIHdpdGggYSBub24tRXVyb3BlYW4gZXRobmljIGJhY2tncm91bmQgd2lsbCBiZSByZW1vdmVkLiANCg0KR2VuZXJhdGUgYSBjb3ZhcmlhdGUgZmlsZSB3aGljaCBoZWxwcyB0byBhZHVzdCBmb3IgcmVtYWluaW5nIHBvcHVsYXRpb24gc3RyYXRpZmljYXRpb24gd2l0aGluIHRoZSBFdXJvcGVhbiBzdWJqZWN0cy4NCg0KYGBgDQoNCg0KIyMjIENvbnZlcnQgdmNmIHRvIFBsaW5rIGZvcm1hdA0KDQojIyMjICQgcGxpbmsgLS12Y2YgQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzLnZjZi5neiAtLW1ha2UtYmVkIC0tb3V0IEFMTC4yb2Y0aW50ZXJzZWN0aW9uLjIwMTAwODA0Lmdlbm90eXBlcw0KDQoNCg0KYGBgDQouLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQotLXZjZjogMjUsNDg4ayB2YXJpYW50cyBjb21wbGV0ZS4NCg0KLS12Y2Y6IEFMTC4yb2Y0aW50ZXJzZWN0aW9uLjIwMTAwODA0Lmdlbm90eXBlcy10ZW1wb3JhcnkuYmVkICsNCg0KQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzLXRlbXBvcmFyeS5iaW0gKw0KDQpBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMtdGVtcG9yYXJ5LmZhbSB3cml0dGVuLg0KDQoNCg0KMjUsNDg4LDQ4OCB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjYyOSBwZW9wbGUgKDAgbWFsZXMsIDAgZmVtYWxlcywgNjI5IGFtYmlndW91cykgbG9hZGVkIGZyb20gLmZhbS4NCg0KQW1iaWd1b3VzIHNleCBJRHMgd3JpdHRlbiB0byBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMubm9zZXggLg0KDQouLi4uLi4uLi4uLi4uLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDYyOSBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50Lg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4gDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC42MTUzMDUuDQoNCjI1LDQ4OCw0ODggdmFyaWFudHMgYW5kIDYyOSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4NCg0KTm90ZTogTm8gcGhlbm90eXBlcyBwcmVzZW50Lg0KDQotLW1ha2UtYmVkIHRvIEFMTC4yb2Y0aW50ZXJzZWN0aW9uLjIwMTAwODA0Lmdlbm90eXBlcy5iZWQgKw0KDQpBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMuYmltICsNCg0KQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzLmZhbSAuLi4NCg0KLi4uLi4uLi4uLi4uLi4uLg0KDQpgYGANCg0KDQojIyMgQWRkaXRpb25hbCBkaXJlY3RvcnkgY29udGVudHMNCg0KIyMjIyB+L0dXQVNfSUpNUFIkIGxzIC1sDQoNCmBgYA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNDAyNzE4MTEwNyBOb3YgMjkgMDQ6MjUgQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgIDYzNTQ4NTYzNiBOb3YgMjkgMDQ6MjUgQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzLmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxNTcyNSBOb3YgMjkgMDQ6MjUgQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzLmZhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMTI1NSBOb3YgMjkgMDQ6MjUgQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzLmxvZw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxMDA2NCBOb3YgMjkgMDQ6MjQgQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzLm5vc2V4DQoNCmBgYA0KDQoNCg0KDQojIyMgQXNzaWduIHVuaXF1ZSBpbmRlbnRpZmllcnMgdG8gdGhlIFNOUHMgd2l0aCBhIG1pc3NpbmcgcnMtaWRlbnRpZmllciAoaS5lLiwgdGhlIFNOUHMgd2l0aCAiLiIpLg0KDQoNCiMjIyAkIHBsaW5rIC0tYmZpbGUgQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzIC0tc2V0LW1pc3NpbmctdmFyLWlkcyBAOiNbYjM3XVwkMSxcJDIgLS1tYWtlLWJlZCAtLW91dCBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXNfbm9fbWlzc2luZ19JRHMgDQoNCg0KDQpgYGANCjI1LDQ4OCw0ODggdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoqKjEwLDM3NSw1MDEgbWlzc2luZyBJRHMgc2V0LioqDQoNCjYyOSBwZW9wbGUgKDAgbWFsZXMsIDAgZmVtYWxlcywgNjI5IGFtYmlndW91cykgbG9hZGVkIGZyb20gLmZhbS4NCg0KKipBbWJpZ3VvdXMgc2V4IElEcyB3cml0dGVuIHRvIEFMTC4yb2Y0aW50ZXJzZWN0aW9uLjIwMTAwODA0Lmdlbm90eXBlc19ub19taXNzaW5nX0lEcy5ub3NleCAuKioNCg0KLi4uLi4uLi4uLi4NCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCA2MjkgZm91bmRlcnMgYW5kIDAgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uIA0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjYxNTMwNS4NCg0KKioyNTQ4ODQ4OCB2YXJpYW50cyBhbmQgNjI5IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLioqDQoNCk5vdGU6IE5vIHBoZW5vdHlwZXMgcHJlc2VudC4NCg0KLS1tYWtlLWJlZCB0byBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXNfbm9fbWlzc2luZ19JRHMuYmVkICsNCkFMTC4yb2Y0aW50ZXJzZWN0aW9uLjIwMTAwODA0Lmdlbm90eXBlc19ub19taXNzaW5nX0lEcy5iaW0gKw0KQUxMLjJvZjRpbnRlcnNlY3Rpb24uMjAxMDA4MDQuZ2Vub3R5cGVzX25vX21pc3NpbmdfSURzLmZhbSAuLi4NCg0KYGBgDQoNCiMjIyBSZW1vdmUgdmFyaWFudHMgYmFzZWQgb24gbWlzc2luZyBnZW5vdHlwZSBkYXRhDQoNCg0KIyMjICQgcGxpbmsgLS1iZmlsZSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXNfbm9fbWlzc2luZ19JRHMgLS1nZW5vIDAuMiAtLWFsbG93LW5vLXNleCAtLW1ha2UtYmVkIC0tb3V0IDFrR19NRFMNCg0KYGBgDQoNCjI1NDg4NDg4IHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4NCg0KNjI5IHBlb3BsZSAoMCBtYWxlcywgMCBmZW1hbGVzLCA2MjkgYW1iaWd1b3VzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoqKkFtYmlndW91cyBzZXggSURzIHdyaXR0ZW4gdG8gMWtHX01EUy5ub3NleCAuKioNCg0KLi4uLi4uLi4uLi4uLi4uLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDYyOSBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50Lg0KDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuNjE1MzA1Lg0KDQoqKjE2NDgxMDY2IHZhcmlhbnRzIHJlbW92ZWQgZHVlIHRvIG1pc3NpbmcgZ2Vub3R5cGUgZGF0YSAoLS1nZW5vKS4qKg0KDQoqKjksMDA3LDQyMiB2YXJpYW50cyBhbmQgNjI5IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLioqDQoNCk5vdGU6IE5vIHBoZW5vdHlwZXMgcHJlc2VudC4NCg0KLS1tYWtlLWJlZCB0byAxa0dfTURTLmJlZCArIDFrR19NRFMuYmltICsgMWtHX01EUy5mYW0gLi4uDQoNCmBgYA0KDQoNCg0KIyMjIFJlbW92ZSBpbmRpdmlkdWFscyBiYXNlZCBvbiBtaXNzaW5nIGdlbm90eXBlIGRhdGEuDQoNCiMjIyAkIHBsaW5rIC0tYmZpbGUgMWtHX01EUyAtLW1pbmQgMC4yIC0tYWxsb3ctbm8tc2V4IC0tbWFrZS1iZWQgLS1vdXQgMWtHX01EUzINCg0KDQpgYGANCioqOSwwMDcsNDIyIHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4qKg0KDQo2MjkgcGVvcGxlICgwIG1hbGVzLCAwIGZlbWFsZXMsIDYyOSBhbWJpZ3VvdXMpIGxvYWRlZCBmcm9tIC5mYW0uDQoNCkFtYmlndW91cyBzZXggSURzIHdyaXR0ZW4gdG8gMWtHX01EUzIubm9zZXggLg0KDQoqKjAgcGVvcGxlIHJlbW92ZWQgZHVlIHRvIG1pc3NpbmcgZ2Vub3R5cGUgZGF0YSAoLS1taW5kKS4qKg0KDQouLi4uLi4uLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDYyOSBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50Lg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4gDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk1OTExLg0KDQoqKjkwMDc0MjIgdmFyaWFudHMgYW5kIDYyOSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4qKg0KDQpOb3RlOiBObyBwaGVub3R5cGVzIHByZXNlbnQuDQotLW1ha2UtYmVkIHRvIDFrR19NRFMyLmJlZCArIDFrR19NRFMyLmJpbSArIDFrR19NRFMyLmZhbSAuLi4NCg0KYGBgDQoNCg0KDQoNCg0KIyMjIFJlbW92ZSB2YXJpYW50cyBiYXNlZCBvbiBtaXNzaW5nIGdlbm90eXBlIGRhdGEuDQoNCiMjIyAkIHBsaW5rIC0tYmZpbGUgMWtHX01EUzIgLS1nZW5vIDAuMDIgLS1hbGxvdy1uby1zZXggLS1tYWtlLWJlZCAtLW91dCAxa0dfTURTMw0KDQpgYGANCjkwMDc0MjIgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQo2MjkgcGVvcGxlICgwIG1hbGVzLCAwIGZlbWFsZXMsIDYyOSBhbWJpZ3VvdXMpIGxvYWRlZCBmcm9tIC5mYW0uDQoNCkFtYmlndW91cyBzZXggSURzIHdyaXR0ZW4gdG8gMWtHX01EUzMubm9zZXggLg0KDQouLi4uLi4uLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDYyOSBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50Lg0KDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk1OTExLg0KDQoqKjc2Niw2NzcgdmFyaWFudHMgcmVtb3ZlZCBkdWUgdG8gbWlzc2luZyBnZW5vdHlwZSBkYXRhICgtLWdlbm8pLioqDQoNCioqOCwyNDAsNzQ1IHZhcmlhbnRzIGFuZCA2MjkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuKioNCg0KTm90ZTogTm8gcGhlbm90eXBlcyBwcmVzZW50Lg0KDQotLW1ha2UtYmVkIHRvIDFrR19NRFMzLmJlZCArIDFrR19NRFMzLmJpbSArIDFrR19NRFMzLmZhbSAuLi4NCg0KYGBgDQoNCg0KDQojIyMgIyBSZW1vdmUgaW5kaXZpZHVhbHMgYmFzZWQgb24gbWlzc2luZyBnZW5vdHlwZSBkYXRhDQoNCiMjIyAkIHBsaW5rIC0tYmZpbGUgMWtHX01EUzMgLS1taW5kIDAuMDIgLS1hbGxvdy1uby1zZXggLS1tYWtlLWJlZCAtLW91dCAxa0dfTURTNA0KDQoNCmBgYA0KDQo4MjQwNzQ1IHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4NCg0KNjI5IHBlb3BsZSAoMCBtYWxlcywgMCBmZW1hbGVzLCA2MjkgYW1iaWd1b3VzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQpBbWJpZ3VvdXMgc2V4IElEcyB3cml0dGVuIHRvIDFrR19NRFM0Lm5vc2V4IC4NCg0KMCBwZW9wbGUgcmVtb3ZlZCBkdWUgdG8gbWlzc2luZyBnZW5vdHlwZSBkYXRhICgtLW1pbmQpLg0KDQpVc2luZyAxIHRocmVhZCAobm8gbXVsdGl0aHJlYWRlZCBjYWxjdWxhdGlvbnMgaW52b2tlZCkuDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgNjI5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLiANCg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk5OTQ3Ny4NCg0KODI0MDc0NSB2YXJpYW50cyBhbmQgNjI5IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLg0KDQpOb3RlOiBObyBwaGVub3R5cGVzIHByZXNlbnQuDQotLW1ha2UtYmVkIHRvIDFrR19NRFM0LmJlZCArIDFrR19NRFM0LmJpbSArIDFrR19NRFM0LmZhbSAuLi4NCg0KYGBgDQoNCg0KIyMjIFJlbW92ZSB2YXJpYW50cyBkdWUgdG8gbWlub3IgYWxsZWxlIHRocmVzaG9sZChzKQ0KDQojIyMgJCBwbGluayAtLWJmaWxlIDFrR19NRFM0IC0tbWFmIDAuMDUgLS1hbGxvdy1uby1zZXggLS1tYWtlLWJlZCAtLW91dCAxa0dfTURTNQ0KDQpgYGANCioqODI0MDc0NSB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuKioNCg0KNjI5IHBlb3BsZSAoMCBtYWxlcywgMCBmZW1hbGVzLCA2MjkgYW1iaWd1b3VzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQpBbWJpZ3VvdXMgc2V4IElEcyB3cml0dGVuIHRvIDFrR19NRFM1Lm5vc2V4IC4NCg0KLi4uLi4uLi4uLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDYyOSBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50Lg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4gDQoNCi4uLi4uLi4uLi4uLi4uLg0KDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk5OTQ3Ny4NCg0KKioyLDQzMiw0MzUgdmFyaWFudHMgcmVtb3ZlZCBkdWUgdG8gbWlub3IgYWxsZWxlIHRocmVzaG9sZChzKSoqDQoNCigtLW1hZi8tLW1heC1tYWYvLS1tYWMvLS1tYXgtbWFjKS4NCg0KKio1LDgwOCwzMTAgdmFyaWFudHMgYW5kIDYyOSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4qKg0KDQpOb3RlOiBObyBwaGVub3R5cGVzIHByZXNlbnQuDQoNCi0tbWFrZS1iZWQgdG8gMWtHX01EUzUuYmVkICsgMWtHX01EUzUuYmltICsgMWtHX01EUzUuZmFtIC4uLg0KDQoNCmBgYA0KDQojIyMjICQgd2MgLWwgMWtHX01EUzUuYmltIA0KDQo1ODA4MzEwIDFrR19NRFM1LmJpbQ0KDQoNCg0KIyMjIyAkIGhlYWQgLW4gNSAxa0dfTURTNS5iaW0gDQoNCmBgYA0KDQoxCXJzNTgxMDgxNDAJMAkxMDU4MwlBCUcNCg0KMQkxOjExNTA4W2IzN11BLEcJMAkxMTUwOAlBCUcNCg0KMQkxOjE1ODIwW2IzN11HLFQJMAkxNTgyMAlUCUcNCg0KMQkxOjE2MjU3W2IzN11DLEcJMAkxNjI1NwlDCUcNCg0KMQkxOjE2Mzc4W2IzN11DLFQJMAkxNjM3OAlUCUMNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCiMjIEV4dHJhY3QgdGhlIHZhcmlhbnRzIHByZXNlbnQgaW4gSGFwTWFwIGRhdGFzZXQgZnJvbSB0aGUgMTAwMCBnZW5vbWVzIGRhdGFzZXQuDQoNCg0KIyMjIyAkIGF3ayAne3ByaW50JDJ9JyBIYXBNYXBfM19yM18xMi5iaW0gPiBIYXBNYXBfU05Qcy50eHQNCg0KDQojIyMjICQgd2MgLWwgSGFwTWFwX1NOUHMudHh0IA0KDQpgYGANCjEwNzMyMjYgSGFwTWFwX1NOUHMudHh0DQpgYGANCg0KDQojIyMgJCBwbGluayAtLWJmaWxlIDFrR19NRFM1IC0tZXh0cmFjdCBIYXBNYXBfU05Qcy50eHQgLS1tYWtlLWJlZCAtLW91dCAxa0dfTURTNg0KDQoNCg0KYGBgDQoqKjU4LDA4LDMxMCB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuKioNCg0KNjI5IHBlb3BsZSAoMCBtYWxlcywgMCBmZW1hbGVzLCA2MjkgYW1iaWd1b3VzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQpBbWJpZ3VvdXMgc2V4IElEcyB3cml0dGVuIHRvIDFrR19NRFM2Lm5vc2V4IC4NCg0KKiotLWV4dHJhY3Q6IDEwMDA5OTMgdmFyaWFudHMgcmVtYWluaW5nLioqDQoNCi4uLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDYyOSBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50Lg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4gDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk5NDExLg0KDQoqKjEwMDA5OTMgdmFyaWFudHMgYW5kIDYyOSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4qKg0KDQpOb3RlOiBObyBwaGVub3R5cGVzIHByZXNlbnQuDQoNCi0tbWFrZS1iZWQgdG8gMWtHX01EUzYuYmVkICsgMWtHX01EUzYuYmltICsgMWtHX01EUzYuZmFtIC4uLg0KDQpgYGANCg0KDQoNCg0KDQojIyBFeHRyYWN0IHRoZSB2YXJpYW50cyBwcmVzZW50IGluIDEwMDAgR2Vub21lcyBkYXRhc2V0IGZyb20gdGhlIEhhcE1hcCBkYXRhc2V0Lg0KDQoNCiMjIyMgJCBhd2sgJ3twcmludCQyfScgMWtHX01EUzYuYmltID4gMWtHX01EUzZfU05Qcy50eHQNCg0KIyMjIyAkIHdjIC1sIDFrR19NRFM2LmJpbSANCg0KYGBgDQoxMDAwOTkzIDFrR19NRFM2LmJpbQ0KDQpgYGANCg0KIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfM19yM18xMiAtLWV4dHJhY3QgMWtHX01EUzZfU05Qcy50eHQgLS1yZWNvZGUgLS1tYWtlLWJlZCAtLW91dCBIYXBNYXBfTURTDQoNCg0KYGBgDQoNCioqMTA3MzIyNiB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuKioNCg0KMTA5IHBlb3BsZSAoNTUgbWFsZXMsIDU0IGZlbWFsZXMpIGxvYWRlZCBmcm9tIC5mYW0uDQoNCjEwOSBwaGVub3R5cGUgdmFsdWVzIGxvYWRlZCBmcm9tIC5mYW0uDQoNCioqLS1leHRyYWN0OiAxMDAwOTkzIHZhcmlhbnRzIHJlbWFpbmluZy4qKg0KDQouLi4uLi4uLi4uDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTA5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLiANCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDM2Lg0KDQoqKjEwMDA5OTMgdmFyaWFudHMgYW5kIDEwOSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4qKg0KDQpBbW9uZyByZW1haW5pbmcgcGhlbm90eXBlcywgNTQgYXJlIGNhc2VzIGFuZCA1NSBhcmUgY29udHJvbHMuDQoNCi0tbWFrZS1iZWQgdG8gKipIYXBNYXBfTURTLmJlZCArIEhhcE1hcF9NRFMuYmltICsgSGFwTWFwX01EUy5mYW0qKiAuLi4NCg0KLi4uLi4uLi4uLi4uLi4uLg0KDQoNCi0tcmVjb2RlIHRvICoqSGFwTWFwX01EUy5wZWQgKyBIYXBNYXBfTURTLm1hcCoqIC4uLg0KDQpgYGANCg0KIyMjIyAkIHdjIC1sIEhhcE1hcF9NRFMucGVkIA0KDQpgYGANCg0KMTA5IEhhcE1hcF9NRFMucGVkDQoNCmBgYA0KDQojIyMjICQgd2MgLWwgSGFwTWFwX01EUy5tYXAgDQoNCmBgYA0KDQoxMDAwOTkzIEhhcE1hcF9NRFMubWFwDQoNCmBgYA0KDQoNCg0KIyMgRGF0YXNldHMgbXVzdCBoYXZlIHRoZSBzYW1lIGJ1aWxkOiBDaGFuZ2UgdGhlIGJ1aWxkIDEwMDAgR2Vub21lcyBkYXRhIGJ1aWxkDQoNCg0KIyMjICQgYXdrICd7cHJpbnQkMiwkNH0nIEhhcE1hcF9NRFMubWFwID4gYnVpbGRoYXBtYXAudHh0DQoNCg0KDQojIyMjICQgd2MgLWwgYnVpbGRoYXBtYXAudHh0IA0KDQoxMDAwOTkzIGJ1aWxkaGFwbWFwLnR4dA0KDQoNCg0KIyMjIyAkIGhlYWQgLW4gNSBidWlsZGhhcG1hcC50eHQgDQoNCmBgYA0KDQpyczMxMzE5NjkgNzQ0MDQ1DQoNCnJzMTA0ODQ4OCA3NTA3NzUNCg0KcnMxMjU2MjAzNCA3NTgzMTENCg0KcnMxMjEyNDgxOSA3NjY0MDkNCg0KcnM0OTcwMzgzIDgyODQxOA0KDQpgYGANCg0KDQojIyMgJCBwbGluayAtLWJmaWxlIDFrR19NRFM2IC0tdXBkYXRlLW1hcCBidWlsZGhhcG1hcC50eHQgLS1tYWtlLWJlZCAtLW91dCAxa0dfTURTNw0KDQoNCmBgYA0KDQoqKjEwMDA5OTMgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLioqDQoNCjYyOSBwZW9wbGUgKDAgbWFsZXMsIDAgZmVtYWxlcywgNjI5IGFtYmlndW91cykgbG9hZGVkIGZyb20gLmZhbS4NCg0KQW1iaWd1b3VzIHNleCBJRHMgd3JpdHRlbiB0byAxa0dfTURTNy5ub3NleCAuDQoNCi0tdXBkYXRlLW1hcDogMTAwMDk5MyB2YWx1ZXMgdXBkYXRlZC4NCg0KKipXYXJuaW5nOiBCYXNlLXBhaXIgcG9zaXRpb25zIGFyZSBub3cgdW5zb3J0ZWQhKioNCg0KLi4uLi4uLi4uLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDYyOSBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50Lg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4gDQoNCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk5NDExLg0KDQoxMDAwOTkzIHZhcmlhbnRzIGFuZCA2MjkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCk5vdGU6IE5vIHBoZW5vdHlwZXMgcHJlc2VudC4NCg0KLS1tYWtlLWJlZCB0byAxa0dfTURTNy5iZWQgKyAxa0dfTURTNy5iaW0gKyAxa0dfTURTNy5mYW0gLi4uDQoNCmBgYA0KDQoNCg0KDQoNCg0KIyMgTWVyZ2UgdGhlIEhhcE1hcCBhbmQgMTAwMCBHZW5vbWVzIGRhdGEgc2V0cw0KDQoNCiMjIyBTZXQgcmVmZXJlbmNlIGdlbm9tZSANCg0KDQojIyMjICQgYXdrICd7cHJpbnQkMiwkNX0nIDFrR19NRFM3LmJpbSA+IDFrZ19yZWYtbGlzdC50eHQNCg0KDQojIyMjICAkIHdjIC1sIDFrZ19yZWYtbGlzdC50eHQgDQoNCjEwMDA5OTMgMWtnX3JlZi1saXN0LnR4dA0KDQoNCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwX01EUyAtLXJlZmVyZW5jZS1hbGxlbGUgMWtnX3JlZi1saXN0LnR4dCAtLW1ha2UtYmVkIC0tb3V0IEhhcE1hcC1hZGoNCg0KDQpgYGANCg0KKioxMDAwOTkzIHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4qKg0KDQoxMDkgcGVvcGxlICg1NSBtYWxlcywgNTQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTA5IHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KLi4uLi4uLi4uDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTA5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLiANCg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk5ODAzNi4NCg0KV2FybmluZzogSW1wb3NzaWJsZSBBMSBhbGxlbGUgYXNzaWdubWVudCBmb3IgdmFyaWFudCByczExNDg4NDYyLg0KDQpXYXJuaW5nOiBJbXBvc3NpYmxlIEExIGFsbGVsZSBhc3NpZ25tZW50IGZvciB2YXJpYW50IHJzNDY0ODc4Ni4NCg0KV2FybmluZzogSW1wb3NzaWJsZSBBMSBhbGxlbGUgYXNzaWdubWVudCBmb3IgdmFyaWFudCByczI4NjM1MzQzLg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KV2FybmluZzogSW1wb3NzaWJsZSBBMSBhbGxlbGUgYXNzaWdubWVudCBmb3IgdmFyaWFudCByczk5Mjg4OTIuDQoNCldhcm5pbmc6IEltcG9zc2libGUgQTEgYWxsZWxlIGFzc2lnbm1lbnQgZm9yIHZhcmlhbnQgcnMxMDQ4MTQ5Lg0KDQpXYXJuaW5nOiBJbXBvc3NpYmxlIEExIGFsbGVsZSBhc3NpZ25tZW50IGZvciB2YXJpYW50IHJzMjI3MzQ1NC4NCg0KLi4uLi4NCg0KDQoqKi0tYTEtYWxsZWxlOiAxMDAwOTkzIGFzc2lnbm1lbnRzIG1hZGUuKioNCg0KKioxMDAwOTkzIHZhcmlhbnRzIGFuZCAxMDkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuKioNCg0KKipBbW9uZyByZW1haW5pbmcgcGhlbm90eXBlcywgNTQgYXJlIGNhc2VzIGFuZCA1NSBhcmUgY29udHJvbHMuKioNCg0KLS1tYWtlLWJlZCB0byBIYXBNYXAtYWRqLmJlZCArIEhhcE1hcC1hZGouYmltICsgSGFwTWFwLWFkai5mYW0gLi4uDQoNCmBgYA0KDQoNCg0KDQojIyBSZXNvbHZlIHN0cmFuZCBpc3N1ZXMNCg0KDQojIyMjICQgYXdrICd7cHJpbnQkMiwkNSwkNn0nIDFrR19NRFM3LmJpbSA+IDFrR01EUzdfdG1wDQoNCg0KDQojIyMjICQgYXdrICd7cHJpbnQkMiwkNSwkNn0nIEhhcE1hcC1hZGouYmltID4gSGFwTWFwLWFkal90bXANCg0KDQoNCiMjIyMgJCBzb3J0IDFrR01EUzdfdG1wIEhhcE1hcC1hZGpfdG1wIHx1bmlxIC11ID4gYWxsX2RpZmZlcmVuY2VzLnR4dA0KDQoNCiMjIyMgIHdjIC1sIGFsbF9kaWZmZXJlbmNlcy50eHQgDQoNCmBgYA0KMTYyNCBhbGxfZGlmZmVyZW5jZXMudHh0DQoNCmBgYA0KDQojIyMjICQgaGVhZCAtbiA1IGFsbF9kaWZmZXJlbmNlcy50eHQgDQoNCmBgYA0KDQpyczEwMDA2Mjc0IEMgVA0KDQpyczEwMDA2Mjc0IEcgQQ0KDQpyczEwMDYwNTkzIEEgVA0KDQpyczEwMDYwNTkzIEMgVA0KDQpyczEwMDgzNTU5IEEgRw0KYGBgDQoNCg0KIyMgRmxpcCBTTlBzIGZvciByZXNvbHZpbmcgc3RyYW5kIGlzc3Vlcw0KDQoNCiMjIyMgJCBhd2sgJ3twcmludCQxfScgYWxsX2RpZmZlcmVuY2VzLnR4dCB8IHNvcnQgLXUgPiBmbGlwX2xpc3QudHh0DQoNCg0KDQojIyMjIHdjIC1sIGZsaXBfbGlzdC50eHQgDQoNCg0KYGBgDQo4MTIgZmxpcF9saXN0LnR4dA0KYGBgDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcC1hZGogLS1mbGlwIGZsaXBfbGlzdC50eHQgLS1yZWZlcmVuY2UtYWxsZWxlIDFrZ19yZWYtbGlzdC50eHQgLS1tYWtlLWJlZCAtLW91dCBjb3JyZWN0ZWRfaGFwbWFwDQoNCg0KYGBgDQoqKjEwMDA5OTMgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLioqDQoNCjEwOSBwZW9wbGUgKDU1IG1hbGVzLCA1NCBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMDkgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQoqKi0tZmxpcDogODEyIFNOUHMgZmxpcHBlZC4qKg0KDQouLi4uLi4uDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTA5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLiANCg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDM2Lg0KDQpXYXJuaW5nOiBJbXBvc3NpYmxlIEExIGFsbGVsZSBhc3NpZ25tZW50IGZvciB2YXJpYW50IHJzMzQwMzA4ODYuDQoNCldhcm5pbmc6IEltcG9zc2libGUgQTEgYWxsZWxlIGFzc2lnbm1lbnQgZm9yIHZhcmlhbnQgcnMxMTY4NzQ3Ny4NCg0KV2FybmluZzogSW1wb3NzaWJsZSBBMSBhbGxlbGUgYXNzaWdubWVudCBmb3IgdmFyaWFudCByczI1ODExOTUuDQoNCldhcm5pbmc6IEltcG9zc2libGUgQTEgYWxsZWxlIGFzc2lnbm1lbnQgZm9yIHZhcmlhbnQgcnMxNDk4ODQwLg0KDQpXYXJuaW5nOiBJbXBvc3NpYmxlIEExIGFsbGVsZSBhc3NpZ25tZW50IGZvciB2YXJpYW50IHJzOTYxNDc1MC4NCg0KKiotLWExLWFsbGVsZTogMTAwMDk5MyBhc3NpZ25tZW50cyBtYWRlLioqDQoNCjEwMDA5OTMgdmFyaWFudHMgYW5kIDEwOSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4NCg0KQW1vbmcgcmVtYWluaW5nIHBoZW5vdHlwZXMsIDU0IGFyZSBjYXNlcyBhbmQgNTUgYXJlIGNvbnRyb2xzLg0KDQotLW1ha2UtYmVkIHRvIGNvcnJlY3RlZF9oYXBtYXAuYmVkICsgY29ycmVjdGVkX2hhcG1hcC5iaW0gKyBjb3JyZWN0ZWRfaGFwbWFwLmZhbSAuLi4gDQoNCmBgYA0KDQoNCiMjIENoZWNrIGZvciBTTlBzIHdoaWNoIGFyZSBzdGlsbCBwcm9ibGVtYXRpYyBhZnRlciB0aGV5IGhhdmUgYmVlbiBmbGlwcGVkDQoNCg0KIyMjIyAkIGF3ayAne3ByaW50JDIsJDUsJDZ9JyBjb3JyZWN0ZWRfaGFwbWFwLmJpbSA+IGNvcnJlY3RlZF9oYXBtYXBfdG1wDQoNCg0KDQojIyMgJCBzb3J0IDFrR01EUzdfdG1wIGNvcnJlY3RlZF9oYXBtYXBfdG1wIHx1bmlxIC11ICA+IHVuY29ycmVzcG9uZGluZ19TTlBzLnR4dA0KDQoNCiMjIyMgJCB3YyAtbCB1bmNvcnJlc3BvbmRpbmdfU05Qcy50eHQgDQoNCmBgYA0KODQgdW5jb3JyZXNwb25kaW5nX1NOUHMudHh0DQpgYGANCg0KDQojIyMjICQgaGVhZCAtbiA1IHVuY29ycmVzcG9uZGluZ19TTlBzLnR4dCANCg0KYGBgDQoNCnJzMTAwNjA1OTMgQSBHDQoNCnJzMTAwNjA1OTMgQSBUDQoNCnJzMTAwODM1NTkgVCBDDQoNCnJzMTAwODM1NTkgVCBHDQoNCnJzMTAxMTY5MDEgQyBBDQoNCmBgYA0KDQoNCiMjIyMgJCBhd2sgJ3twcmludCQxfScgdW5jb3JyZXNwb25kaW5nX1NOUHMudHh0IHwgc29ydCAtdSA+IFNOUHNfZm9yX2V4bHVzaW9uLnR4dA0KDQoNCiMjIyMgJCB3YyAtbCBTTlBzX2Zvcl9leGx1c2lvbi50eHQgDQoNCmBgYA0KDQo0MiBTTlBzX2Zvcl9leGx1c2lvbi50eHQNCg0KYGBgDQoNCiMjIyMgJCBoZWFkIC1uIDUgU05Qc19mb3JfZXhsdXNpb24udHh0IA0KDQpgYGANCg0KcnMxMDA2MDU5Mw0KDQpyczEwMDgzNTU5DQoNCnJzMTAxMTY5MDENCg0KcnMxMTUyNDk2NQ0KDQpyczExNjg3NDc3DQoNCmBgYA0KDQojIyMgUmVtb3ZlIHRoZSA0MiBwcm9ibGVtYXRpYyBTTlBzIGZyb20gaGFwbWFwIGRhdGFzZXRzDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIGNvcnJlY3RlZF9oYXBtYXAgLS1leGNsdWRlIFNOUHNfZm9yX2V4bHVzaW9uLnR4dCAtLW1ha2UtYmVkIC0tb3V0IEhhcE1hcF9NRFMyDQoNCg0KDQpgYGANCg0KMTAwMDk5MyB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjEwOSBwZW9wbGUgKDU1IG1hbGVzLCA1NCBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMDkgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQoqKi0tZXhjbHVkZTogMTAwMDk1MSB2YXJpYW50cyByZW1haW5pbmcuKioNCg0KLi4uLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDEwOSBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50Lg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4gDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDM2Lg0KDQoNCioqMTAwMDk1MSB2YXJpYW50cyBhbmQgMTA5IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLioqDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NCBhcmUgY2FzZXMgYW5kIDU1IGFyZSBjb250cm9scy4NCi0tbWFrZS1iZWQgdG8gSGFwTWFwX01EUzIuYmVkICsgSGFwTWFwX01EUzIuYmltICsgSGFwTWFwX01EUzIuZmFtIC4uLg0KDQpgYGANCg0KDQoNCiMjIyBSZW1vdmUgdGhlIDQyIHByb2JsZW1hdGljIFNOUHMgZnJvbSAxMDAwIGdlbm9tZSBkYXRhc2V0cy4NCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgMWtHX01EUzcgLS1leGNsdWRlIFNOUHNfZm9yX2V4bHVzaW9uLnR4dCAtLW1ha2UtYmVkIC0tb3V0IDFrR19NRFM4DQoNCg0KDQpgYGANCg0KMTAwMDk5MyB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCioqNjI5IHBlb3BsZSAoMCBtYWxlcywgMCBmZW1hbGVzLCA2MjkgYW1iaWd1b3VzKSBsb2FkZWQgZnJvbSAuZmFtLioqDQoNCkFtYmlndW91cyBzZXggSURzIHdyaXR0ZW4gdG8gMWtHX01EUzgubm9zZXggLg0KDQoqKi0tZXhjbHVkZTogMTAwMDk1MSB2YXJpYW50cyByZW1haW5pbmcuKioNCg0KLi4uLi4uLi4uLi4uDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgNjI5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLiANCg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk5NDExLg0KDQoxMDAwOTUxIHZhcmlhbnRzIGFuZCA2MjkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCk5vdGU6IE5vIHBoZW5vdHlwZXMgcHJlc2VudC4NCg0KLS1tYWtlLWJlZCB0byAxa0dfTURTOC5iZWQgKyAxa0dfTURTOC5iaW0gKyAxa0dfTURTOC5mYW0gLi4uDQoNCmBgYA0KDQojIyBNZXJnZSBIYXBNYXAgd2l0aCAxMDAwIEdlbm9tZXMgRGF0YQ0KDQojIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfTURTMiAtLWJtZXJnZSAxa0dfTURTOC5iZWQgMWtHX01EUzguYmltIDFrR19NRCBEUzguZmFtIC0tYWxsb3ctbm8tc2V4IC0tbWFrZS1iZWQgLS1vdXQgTURTX21lcmdlMg0KDQoNCmBgYA0KDQoxMDkgcGVvcGxlIGxvYWRlZCBmcm9tIEhhcE1hcF9NRFMyLmZhbS4NCg0KNjI5IHBlb3BsZSB0byBiZSBtZXJnZWQgZnJvbSAxa0dfTURTOC5mYW0uDQoNCk9mIHRoZXNlLCA2MjkgYXJlIG5ldywgd2hpbGUgMCBhcmUgcHJlc2VudCBpbiB0aGUgYmFzZSBkYXRhc2V0Lg0KDQpXYXJuaW5nOiBNdWx0aXBsZSBjaHJvbW9zb21lcyBzZWVuIGZvciB2YXJpYW50ICdyczE2NDA1NTgnLg0KDQoqKjEwMDA5NTEgbWFya2VycyBsb2FkZWQgZnJvbSBIYXBNYXBfTURTMi5iaW0uKioNCg0KKioxMDAwOTUxIG1hcmtlcnMgdG8gYmUgbWVyZ2VkIGZyb20gMWtHX01EUzguYmltLioqDQoNCk9mIHRoZXNlLCAwIGFyZSBuZXcsIHdoaWxlIDEwMDA5NTEgYXJlIHByZXNlbnQgaW4gdGhlIGJhc2UgZGF0YXNldC4NCg0KKipQZXJmb3JtaW5nIHNpbmdsZS1wYXNzIG1lcmdlICg3MzggcGVvcGxlLCAxMDAwOTUxIHZhcmlhbnRzKS4qKg0KDQoNClBhc3MgMTogZmlsZXNldCAjMSBjb21wbGV0ZS4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KTWVyZ2VkIGZpbGVzZXQgd3JpdHRlbiB0byBNRFNfbWVyZ2UyLW1lcmdlLmJlZCArIE1EU19tZXJnZTItbWVyZ2UuYmltICsgTURTX21lcmdlMi1tZXJnZS5mYW0gLg0KDQoxMDAwOTUxIHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4NCg0KKio3MzggcGVvcGxlICg1NSBtYWxlcywgNTQgZmVtYWxlcywgNjI5IGFtYmlndW91cykgbG9hZGVkIGZyb20gLmZhbS4qKg0KDQpBbWJpZ3VvdXMgc2V4IElEcyB3cml0dGVuIHRvIE1EU19tZXJnZTIubm9zZXggLg0KDQoxMDkgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQouLi4uLi4uLi4uLi4uLi4NCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCA3MzggZm91bmRlcnMgYW5kIDAgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTkyMDguDQoNCioqMTAwMDk1MSB2YXJpYW50cyBhbmQgNzM4IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLioqDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NCBhcmUgY2FzZXMgYW5kIDU1IGFyZSBjb250cm9scy4gICg2MjkgcGhlbm90eXBlcyBhcmUgbWlzc2luZy4pDQoNCi0tbWFrZS1iZWQgdG8gTURTX21lcmdlMi5iZWQgKyBNRFNfbWVyZ2UyLmJpbSArIE1EU19tZXJnZTIuZmFtIC4uLg0KDQpgYGANCg0KDQoNCiMjIFBlcmZvcm0gbXVsdGktZGltZW5zaW9uYWwgc2NhbGluZyAoTURTKSBvbiBIYXBNYXAtQ0VVIGRhdGEgYW5jaG9yZWQgYnkgMTAwMCBHZW5vbWVzIGRhdGE6IFVzaW5nIGEgc2V0IG9mIHBydW5lZCBTTlBzDQoNCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgTURTX21lcmdlMiAtLWV4dHJhY3QgaW5kZXBTTlAucHJ1bmUuaW4gLS1nZW5vbWUgLS1vdXQgTURTX21lcmdlMg0KDQoNCmBgYA0KMTAwMDk1MSB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjczOCBwZW9wbGUgKDU1IG1hbGVzLCA1NCBmZW1hbGVzLCA2MjkgYW1iaWd1b3VzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQpBbWJpZ3VvdXMgc2V4IElEcyB3cml0dGVuIHRvIE1EU19tZXJnZTIubm9zZXggLg0KDQoxMDkgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQoqKi0tZXh0cmFjdDogOTMzMzEgdmFyaWFudHMgcmVtYWluaW5nLioqDQoNClVzaW5nIHVwIHRvIDQgdGhyZWFkcyAoY2hhbmdlIHRoaXMgd2l0aCAtLXRocmVhZHMpLg0KDQpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDczOCBmb3VuZGVycyBhbmQgMCBub25mb3VuZGVycyBwcmVzZW50Lg0KDQpDYWxjdWxhdGluZyBhbGxlbGUgZnJlcXVlbmNpZXMuLi4NCg0KLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk5MjUuDQoNCjkzMzMxIHZhcmlhbnRzIGFuZCA3MzggcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NCBhcmUgY2FzZXMgYW5kIDU1IGFyZSBjb250cm9scy4gICg2MjkgcGhlbm90eXBlcyBhcmUgbWlzc2luZy4pDQoNCjExNTIgbWFya2VycyBjb21wbGV0ZS4NCg0KLi4uLi4uLi4uLi4uLi4uDQoNCjkzMzMxIG1hcmtlcnMgY29tcGxldGUuDQoNCklCRCBjYWxjdWxhdGlvbnMgY29tcGxldGUuICANCg0KV3JpdGluZy4uLiAxJQ0KDQouLi4uLi4uLi4uLi4uLi4uLi4NCg0KV3JpdGluZy4uLiA5OSUNCg0KRmluaXNoZWQgd3JpdGluZyBNRFNfbWVyZ2UyLmdlbm9tZSAuDQoNCmBgYA0KDQojIyMjICQgcGxpbmsgLS1iZmlsZSBNRFNfbWVyZ2UyIC0tcmVhZC1nZW5vbWUgTURTX21lcmdlMi5nZW5vbWUgLS1jbHVzdGVyIC0tbWRzLXBsb3QgMTAgLS1vdXQgTURTX21lcmdlMg0KDQogDQpgYGANCg0KMTAwMDk1MSB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjczOCBwZW9wbGUgKDU1IG1hbGVzLCA1NCBmZW1hbGVzLCA2MjkgYW1iaWd1b3VzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQpBbWJpZ3VvdXMgc2V4IElEcyB3cml0dGVuIHRvIE1EU19tZXJnZTIubm9zZXggLg0KDQoxMDkgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQouLi4uLi4uLi4uLi4uLi4uDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgNzM4IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLg0KDQouLi4uLi4uLi4uLi4uLi4uDQoNClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk5OTIwOC4NCg0KMTAwMDk1MSB2YXJpYW50cyBhbmQgNzM4IHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLg0KDQpBbW9uZyByZW1haW5pbmcgcGhlbm90eXBlcywgNTQgYXJlIGNhc2VzIGFuZCA1NSBhcmUgY29udHJvbHMuICAoNjI5IHBoZW5vdHlwZXMgYXJlIG1pc3NpbmcuKQ0KDQpDbHVzdGVyaW5nLi4uIFtzb3J0aW5nIElCUyB2YWx1ZXNdDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpDbHVzdGVyaW5nLi4uIFs3MDAgbWVyZ2VzIHBlcmZvcm1lZF0NCg0KQ2x1c3RlcmluZy4uLiBkb25lLiAgICANCg0KV3JpdGluZyBjbHVzdGVyIHNvbHV0aW9uLi4uIA0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KKipDbHVzdGVyIHNvbHV0aW9uIHdyaXR0ZW4gdG8gTURTX21lcmdlMi5jbHVzdGVyMSAsIE1EU19tZXJnZTIuY2x1c3RlcjIgLCBhbmQgTURTX21lcmdlMi5jbHVzdGVyMyAuKioNCg0KKipQZXJmb3JtaW5nIG11bHRpZGltZW5zaW9uYWwgc2NhbGluZyBhbmFseXNpcyAoU1ZEIGFsZ29yaXRobSwgMTAgZGltZW5zaW9ucykuLi4gZG9uZS4qKg0KDQoqKk1EUyBzb2x1dGlvbiB3cml0dGVuIHRvIE1EU19tZXJnZTIubWRzIC4qKg0KDQpgYGANCg0KIyMjIyAkIHdjIC1sIE1EU19tZXJnZTIuY2x1c3RlcjEgDQoNCjEgTURTX21lcmdlMi5jbHVzdGVyMQ0KDQojIyMjICQgd2MgLWwgTURTX21lcmdlMi5jbHVzdGVyMg0KDQo3MzggTURTX21lcmdlMi5jbHVzdGVyMg0KDQojIyMjICQgd2MgLWwgTURTX21lcmdlMi5jbHVzdGVyMw0KDQo3MzkgTURTX21lcmdlMi5jbHVzdGVyMw0KDQojIyMjICQgaGVhZCAtbiA1IE1EU19tZXJnZTIubWRzIA0KDQpgYGANCg0KICAgIEZJRCAgICAgICBJSUQgICAgU09MICAgICAgICAgICBDMSAgICAgICAgICAgQzIgICAgICAgICAgIEMzICAgICAgICAgICBDNCAgICAgICAgICAgQzUgICAgICAgICAgIEM2ICAgICAgICAgICBDNyAgICAgICAgICAgQzggICAgICAgICAgIEM5ICAgICAgICAgIEMxMCANCiAgICANCiAgIDEzMjggICBOQTA2OTg0ICAgICAgMCAgICAtMC4wNTY2NzMgICAgMC4wNDg0MjQ0ICAgMC4wMDQ1MDMxNSAgIC0wLjAwNDY0ODEgICAgMC4wMjExMzcyICAgLTAuMDIyMDY4MyAgIDAuMDAxNzg0ODYgICAgMC4wMTI3NzQzICAgLTAuMDM4MDk4OSAgICAwLjAyNDQxOTYgDQogICANCiAgIDEzMjggICBOQTA2OTg5ICAgICAgMCAgIC0wLjA1Njk5MjggICAgMC4wNDc5MDAxICAgMC4wMDkwOTc0NyAgIC0wLjAxMDk4NzYgICAwLjAwODIzNjE1ICAgLTAuMDM4OTMxMSAgICAtMC4wMjM5OTQgICAtMC4wODExODA1ICAgLTAuMDM5Mjc4OSAgICAgMC4wMjEzNTQgDQogICANCiAgIDEzMzAgICBOQTEyMzQwICAgICAgMCAgIC0wLjA1NzAyMjUgICAgMC4wNDg3ODk4ICAgMC4wMDUyNzg1MiAgLTAuMDA5MTM5ODMgICAtMC4wMDU1Njg4ICAtMC4wMDczMTI3OCAgICAwLjAxOTI2NTggICAgMC4wMjIyNTg3ICAgLTAuMDMxODc3NSAgLTAuMDA1NDUzNjIgDQogICANCiAgIDEzMzAgICBOQTEyMzQxICAgICAgMCAgIC0wLjA1NDg4MDUgICAgMC4wNDgwNDM3ICAgMC4wMDk0NjQ4NyAgLTAuMDA4MTA3NTkgICAwLjAwOTM0Nzg5ICAtMC4wMDIwNDk4NCAgICAwLjAwNjkwMjYgICAtMC4wMTUwODQ0ICAgMC4wMDM5Njc0MyAgICAwLjAxNDI0MzUgDQpgYGANCg0KDQoNCg0KIyMgTURTLXBsb3QNCg0KDQojIyMgRG93bmxvYWQgMjAxMDA4MDQuQUxMLnBhbmVsIHdoaWNoIGNvbnRhaW5zIHBvcHVsYXRpb24gY29kZXMgb2YgdGhlIGluZGl2aWR1YWxzIG9mIDEwMDAgZ2Vub21lcw0KDQoNCiMjIyMgfi9HV0FTX0lKTVBSJCB3Z2V0IGZ0cDovL2Z0cC4xMDAwZ2Vub21lcy5lYmkuYWMudWsvdm9sMS9mdHAvcmVsZWFzZS8yMDEwMDgwNC8yMDEwMDgwNC5BTEwucGFuZWwNCg0KDQotLTIwMTgtMTEtMjkgMDU6MDg6MTEtLSAgZnRwOi8vZnRwLjEwMDBnZW5vbWVzLmViaS5hYy51ay92b2wxL2Z0cC9yZWxlYXNlLzIwMTAwODA0LzIwMTAwODA0LkFMTC5wYW5lbA0KICAgICAgICAgICA9PiDigJgyMDEwMDgwNC5BTEwucGFuZWzigJkNCiAgICAgICAgICAgDQoNCg0KDQojIyMjICQgaGVhZCAtbiA1IDIwMTAwODA0LkFMTC5wYW5lbCANCg0KYGBgDQoNCkhHMDAwOTgJR0JSCUlMTFVNSU5BDQoNCkhHMDAxMDAJR0JSCUlMTFVNSU5BDQoNCkhHMDAxMDYJR0JSCUlMTFVNSU5BDQoNCkhHMDAxMTIJR0JSCUlMTFVNSU5BDQoNCkhHMDAxMTQJR0JSCUlMTFVNSU5BDQoNCmBgYA0KDQojIyMjICQgYXdrICd7cHJpbnQkMn0nIDIwMTAwODA0LkFMTC5wYW5lbCB8IHNvcnQgfCB1bmlxDQoNCmBgYA0KDQpBU1cNCg0KQ0VVDQoNCkNIQg0KDQpDSFMNCg0KRklODQoNCkdCUg0KDQpKUFQNCg0KTFdLDQoNCk1YTA0KDQpQVVINCg0KVFNJDQoNCllSSQ0KYGBgDQoNCg0KIyMjIyAkIGdyZXAgIkFTVyIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KMjQNCg0KIyMjIyAkIGdyZXAgIkNFVSIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KOTANCg0KIyMjIyAkIGdyZXAgIkNIQiIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KNjgNCg0KIyMjIyAkIGdyZXAgIkNIUyIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KMjUNCg0KIyMjIyAkIGdyZXAgIkZJTiIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KMzYNCg0KIyMjIyAkIGdyZXAgIkdCUiIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KNDMNCg0KIyMjIyAkIGdyZXAgIkpQVCIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KODQNCg0KIyMjIyAkIGdyZXAgIkxXSyIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KNjcNCg0KIyMjIyAkIGdyZXAgIk1YTCIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KMTcNCg0KIyMjIyAkIGdyZXAgIlBVUiIgMjAxMDA4MDQuQUxMLnBhbmVsIHwgd2MgLWwNCg0KNQ0KDQojIyMjICQgZ3JlcCAiVFNJIiAyMDEwMDgwNC5BTEwucGFuZWwgfCB3YyAtbA0KDQo5Mg0KDQojIyMjICQgZ3JlcCAiWVJJIiAyMDEwMDgwNC5BTEwucGFuZWwgfCB3YyAtbA0KDQo3OA0KDQoNCg0KDQojIyMgQ29udmVydCBwb3B1bGF0aW9uIGNvZGVzIGludG8gc3VwZXJwb3B1bGF0aW9uIGNvZGVzIChpLmUuLCBBRlIsQU1SLEFTTiwgYW5kIEVVUikgDQoNCg0KIyMjIyAkIGF3ayAne3ByaW50JDEsJDEsJDJ9JyAyMDEwMDgwNC5BTEwucGFuZWwgPiByYWNlXzFrRy50eHQNCg0KDQoNCiMjIyMgJCBoZWFkIC1uIDUgcmFjZV8xa0cudHh0IA0KDQpgYGANCg0KSEcwMDA5OCBIRzAwMDk4IEdCUg0KDQpIRzAwMTAwIEhHMDAxMDAgR0JSDQoNCkhHMDAxMDYgSEcwMDEwNiBHQlINCg0KSEcwMDExMiBIRzAwMTEyIEdCUg0KDQpIRzAwMTE0IEhHMDAxMTQgR0JSDQpgYGANCg0KDQojIyMjICQgc2VkICdzL0pQVC9BU04vZycgcmFjZV8xa0cudHh0PnJhY2VfMWtHMi50eHQNCg0KDQojIyMjICQgc2VkICdzL0FTVy9BRlIvZycgcmFjZV8xa0cyLnR4dD5yYWNlXzFrRzMudHh0DQoNCg0KIyMjIyAkIHNlZCAncy9DRVUvRVVSL2cnIHJhY2VfMWtHMy50eHQ+cmFjZV8xa0c0LnR4dA0KDQoNCiMjIyMgJCBzZWQgJ3MvQ0hCL0FTTi9nJyByYWNlXzFrRzQudHh0PnJhY2VfMWtHNS50eHQNCg0KDQojIyMjICQgc2VkICdzL0NIRC9BU04vZycgcmFjZV8xa0c1LnR4dD5yYWNlXzFrRzYudHh0DQoNCg0KIyMjIyAkIHNlZCAncy9ZUkkvQUZSL2cnIHJhY2VfMWtHNi50eHQ+cmFjZV8xa0c3LnR4dA0KDQoNCiMjIyMgJCBzZWQgJ3MvTFdLL0FGUi9nJyByYWNlXzFrRzcudHh0PnJhY2VfMWtHOC50eHQNCg0KDQojIyMjICQgc2VkICdzL1RTSS9FVVIvZycgcmFjZV8xa0c4LnR4dD5yYWNlXzFrRzkudHh0DQoNCg0KIyMjIyAkIHNlZCAncy9NWEwvQU1SL2cnIHJhY2VfMWtHOS50eHQ+cmFjZV8xa0cxMC50eHQNCg0KDQojIyMjICQgc2VkICdzL0dCUi9FVVIvZycgcmFjZV8xa0cxMC50eHQ+cmFjZV8xa0cxMS50eHQNCg0KDQojIyMjICQgc2VkICdzL0ZJTi9FVVIvZycgcmFjZV8xa0cxMS50eHQ+cmFjZV8xa0cxMi50eHQNCg0KDQojIyMjICQgc2VkICdzL0NIUy9BU04vZycgcmFjZV8xa0cxMi50eHQ+cmFjZV8xa0cxMy50eHQNCg0KDQojIyMjICQgc2VkICdzL1BVUi9BTVIvZycgcmFjZV8xa0cxMy50eHQ+cmFjZV8xa0cxNC50eHQNCg0KDQoNCg0KIyMjIGNyZWF0ZSBhIHJhY2UgZmlsZSwNCg0KDQojIyMjICQgYXdrICd7cHJpbnQkMSwkMiwiT1dOIn0nIEhhcE1hcF9NRFMuZmFtID4gcmFjZWZpbGVfb3duLnR4dA0KDQoNCiMjIyMgJCBoZWFkIC1uIDUgSGFwTWFwX01EUy5mYW0gDQoNCmBgYA0KDQoxMzI4IE5BMDY5ODkgMCAwIDIgMg0KDQoxMzc3IE5BMTE4OTEgMCAwIDEgMg0KDQoxMzQ5IE5BMTE4NDMgMCAwIDEgMQ0KDQoxMzMwIE5BMTIzNDEgMCAwIDIgMg0KDQoxMzI4IE5BMDY5ODQgMCAwIDEgMg0KYGBgDQoNCiMjIyMgJCBoZWFkIC1uIDUgcmFjZWZpbGVfb3duLnR4dCANCg0KYGBgDQoNCjEzMjggTkEwNjk4OSBPV04NCg0KMTM3NyBOQTExODkxIE9XTg0KDQoxMzQ5IE5BMTE4NDMgT1dODQoNCjEzMzAgTkExMjM0MSBPV04NCg0KMTMyOCBOQTA2OTg0IE9XTg0KDQpgYGANCg0KDQoNCg0KIyMjIyAkIGNhdCByYWNlXzFrRzE0LnR4dCByYWNlZmlsZV9vd24udHh0IHwgc2VkIC1lICcxaVxGSUQgSUlEIHJhY2UnID4gcmFjZWZpbGUudHh0DQoNCg0KIyMjIyAkIGhlYWQgLW4gNSByYWNlZmlsZS50eHQgDQoNCmBgYA0KRklEICAgICBJSUQgICAgIHJhY2UNCg0KSEcwMDA5OCBIRzAwMDk4IEVVUg0KDQpIRzAwMTAwIEhHMDAxMDAgRVVSDQoNCkhHMDAxMDYgSEcwMDEwNiBFVVINCg0KSEcwMDExMiBIRzAwMTEyIEVVUg0KDQpgYGANCg0KDQojIyMjICQgdGFpbCAtbiA1IHJhY2VmaWxlLnR4dCANCg0KYGBgDQoNCjEzNjIgTkExMTk5NCBPV04NCg0KMTQ1OSBOQTEyODczIE9XTg0KDQoxNDU0IE5BMTI4MTUgT1dODQoNCjEzNDYgTkExMjA0MyBPV04NCg0KMTM3NSBOQTEyMjY0IE9XTg0KDQpgYGANCg0KIyMjICQgUnNjcmlwdCBNRFNfbWVyZ2VkLlINCg0KDQpgYGB7cn0NCmxpYnJhcnkocGRmdG9vbHMpDQpgYGANCg0KDQpgYGB7cn0NCnBkZl9jb252ZXJ0KCIyX1BvcHVsYXRpb25fc3RyYXRpZmljYXRpb24vTURTLnBkZiIsIGZvcm1hdCA9ICJqcGVnIiwgZHBpID0gMzAwKQ0KYGBgDQoNCiFbTURTXShNRFNfMS5qcGVnKQ0KDQoNCiMjIEV4Y2x1ZGUgZXRobmljIG91dGxpZXJzDQoNCg0KIyMjIyAkIGF3ayAneyBpZiAoJDQgPC0wLjA0ICYmICQ1ID4wLjAzKSBwcmludCAkMSwkMiB9JyBNRFNfbWVyZ2UyLm1kcyA+IEVVUl9NRFNfbWVyZ2UyDQoNCiMjIyMgJCBoZWFkIC1uIDUgTURTX21lcmdlMi5tZHMgDQoNCmBgYA0KDQogICAgRklEICAgICAgIElJRCAgICBTT0wgICAgICAgICAgIEMxICAgICAgICAgICBDMiAgICAgICAgICAgQzMgICAgICAgICAgIEM0ICAgICAgICAgICBDNSAgICAgICAgICAgQzYgICAgICAgICAgIEM3ICAgICAgICAgICBDOCAgICAgICAgICAgQzkgICAgICAgICAgQzEwIA0KICAgIA0KICAgMTMyOCAgIE5BMDY5ODQgICAgICAwICAgIC0wLjA1NjY3MyAgICAwLjA0ODQyNDQgICAwLjAwNDUwMzE1ICAgLTAuMDA0NjQ4MSAgICAwLjAyMTEzNzIgICAtMC4wMjIwNjgzICAgMC4wMDE3ODQ4NiAgICAwLjAxMjc3NDMgICAtMC4wMzgwOTg5ICAgIDAuMDI0NDE5NiANCiAgIA0KICAgMTMyOCAgIE5BMDY5ODkgICAgICAwICAgLTAuMDU2OTkyOCAgICAwLjA0NzkwMDEgICAwLjAwOTA5NzQ3ICAgLTAuMDEwOTg3NiAgIDAuMDA4MjM2MTUgICAtMC4wMzg5MzExICAgIC0wLjAyMzk5NCAgIC0wLjA4MTE4MDUgICAtMC4wMzkyNzg5ICAgICAwLjAyMTM1NCANCiAgIA0KICAgMTMzMCAgIE5BMTIzNDAgICAgICAwICAgLTAuMDU3MDIyNSAgICAwLjA0ODc4OTggICAwLjAwNTI3ODUyICAtMC4wMDkxMzk4MyAgIC0wLjAwNTU2ODggIC0wLjAwNzMxMjc4ICAgIDAuMDE5MjY1OCAgICAwLjAyMjI1ODcgICAtMC4wMzE4Nzc1ICAtMC4wMDU0NTM2MiANCiAgIA0KICAgMTMzMCAgIE5BMTIzNDEgICAgICAwICAgLTAuMDU0ODgwNSAgICAwLjA0ODA0MzcgICAwLjAwOTQ2NDg3ICAtMC4wMDgxMDc1OSAgIDAuMDA5MzQ3ODkgIC0wLjAwMjA0OTg0ICAgIDAuMDA2OTAyNiAgIC0wLjAxNTA4NDQgICAwLjAwMzk2NzQzICAgIDAuMDE0MjQzNSANCiAgIA0KYGBgDQoNCiMjIyMgJCBoZWFkIC1uIDUgRVVSX01EU19tZXJnZTIgDQoNCmBgYA0KDQoxMzI4IE5BMDY5ODQNCg0KMTMyOCBOQTA2OTg5DQoNCjEzMzAgTkExMjM0MA0KDQoxMzMwIE5BMTIzNDENCg0KMTMzMCBOQTEyMzQzDQoNCmBgYA0KDQoNCg0KIyMjIEV4dHJhY3QgdGhlc2UgaW5kaXZpZHVhbHMgaW4gSGFwTWFwIGRhdGENCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwXzNfcjNfMTIgLS1rZWVwIEVVUl9NRFNfbWVyZ2UyIC0tbWFrZS1iZWQgLS1vdXQgSGFwTWFwXzNfcjNfMTMNCg0KDQpgYGANCjEwNzMyMjYgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxMDkgcGVvcGxlICg1NSBtYWxlcywgNTQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTA5IHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KLS1rZWVwOiAxMDkgcGVvcGxlIHJlbWFpbmluZy4NCg0KLi4uLi4uLi4NCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMDkgZm91bmRlcnMgYW5kIDAgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uIA0KDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDI4Lg0KDQoxMDczMjI2IHZhcmlhbnRzIGFuZCAxMDkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NCBhcmUgY2FzZXMgYW5kIDU1IGFyZSBjb250cm9scy4NCg0KLS1tYWtlLWJlZCB0byBIYXBNYXBfM19yM18xMy5iZWQgKyBIYXBNYXBfM19yM18xMy5iaW0gKyBIYXBNYXBfM19yM18xMy5mYW0gLi4uDQoNCmBgYA0KDQojIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfM19yM18xMyAtLWV4dHJhY3QgaW5kZXBTTlAucHJ1bmUuaW4gLS1nZW5vbWUgLS1vdXQgSGFwTWFwXzNfcjNfMTMNCg0KDQpgYGANCjEwNzMyMjYgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxMDkgcGVvcGxlICg1NSBtYWxlcywgNTQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTA5IHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KKiotLWV4dHJhY3Q6IDEwNDE0NCB2YXJpYW50cyByZW1haW5pbmcuKioNCg0KLi4uLi4uLi4uLi4uLi4NCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMDkgZm91bmRlcnMgYW5kIDAgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uIA0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk3OTguDQoNCioqMTA0MTQ0IHZhcmlhbnRzIGFuZCAxMDkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuKioNCg0KQW1vbmcgcmVtYWluaW5nIHBoZW5vdHlwZXMsIDU0IGFyZSBjYXNlcyBhbmQgNTUgYXJlIGNvbnRyb2xzLg0KDQoxMTUyIG1hcmtlcnMgY29tcGxldGUuDQoNCjIzMDQgbWFya2VycyBjb21wbGV0ZS4NCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQoNCjEwNDE0NCBtYXJrZXJzIGNvbXBsZXRlLg0KDQpJQkQgY2FsY3VsYXRpb25zIGNvbXBsZXRlLiAgDQoNCi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpGaW5pc2hlZCB3cml0aW5nICoqSGFwTWFwXzNfcjNfMTMuZ2Vub21lIC4qKg0KYGBgDQoNCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwXzNfcjNfMTMgLS1yZWFkLWdlbm9tZSBIYXBNYXBfM19yM18xMy5nZW5vbWUgLS1jbHVzdGVyIC0tbWRzLXBsb3QgMTAgLS1vdXQgSGFwTWFwXzNfcjNfMTNfbWRzDQoNCmBgYA0KMTA3MzIyNiB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjEwOSBwZW9wbGUgKDU1IG1hbGVzLCA1NCBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMDkgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTA5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLiANCg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDI4Lg0KDQoxMDczMjI2IHZhcmlhbnRzIGFuZCAxMDkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NCBhcmUgY2FzZXMgYW5kIDU1IGFyZSBjb250cm9scy4NCg0KQ2x1c3RlcmluZy4uLiBbc29ydGluZyBJQlMgdmFsdWVzXQ0KDQpDbHVzdGVyaW5nLi4uIFsxMDAgbWVyZ2VzIHBlcmZvcm1lZF0NCg0KQ2x1c3RlcmluZy4uLiBkb25lLiAgICAgDQoNCldyaXRpbmcgY2x1c3RlciBzb2x1dGlvbi4uLiANCg0KYA0KKipDbHVzdGVyIHNvbHV0aW9uIHdyaXR0ZW4gdG8gSGFwTWFwXzNfcjNfMTNfbWRzLmNsdXN0ZXIxICwgSGFwTWFwXzNfcjNfMTNfbWRzLmNsdXN0ZXIyICwgYW5kIEhhcE1hcF8zX3IzXzEzX21kcy5jbHVzdGVyMyAuKioNCg0KDQpQZXJmb3JtaW5nIG11bHRpZGltZW5zaW9uYWwgc2NhbGluZyBhbmFseXNpcyAoU1ZEIGFsZ29yaXRobSwgMTAgZGltZW5zaW9ucykuLi4gZG9uZS4NCg0KTURTIHNvbHV0aW9uIHdyaXR0ZW4gdG8gKipIYXBNYXBfM19yM18xM19tZHMubWRzIC4qKg0KDQpgYGANCg0KIyMjIyAkIGhlYWQgLW4gNSBIYXBNYXBfM19yM18xM19tZHMubWRzIA0KDQpgYGANCiAgICBGSUQgICAgICAgSUlEICAgIFNPTCAgICAgICAgICAgQzEgICAgICAgICAgIEMyICAgICAgICAgICBDMyAgICAgICAgICAgQzQgICAgICAgICAgIEM1ICAgICAgICAgICBDNiAgICAgICAgICAgQzcgICAgICAgICAgIEM4ICAgICAgICAgICBDOSAgICAgICAgICBDMTAgDQogICAgDQogICAxMzI4ICAgTkEwNjk4OSAgICAgIDAgICAgMC4wMTYwMjQ5ICAgLTAuMDUyNzA4MSAgICAwLjA1MzI4MzQgIC0wLjAwMTUxNTcyICAgMC4wMDg2MjU3NyAgLTAuMDA5Nzk1NDEgICAgIDAuMDE5NDk3ICAgLTAuMDI1NzY1MyAgIDAuMDA5NDY2MTEgICAtMC4wMTQ3MjM1IA0KICAgDQogICAxMzc3ICAgTkExMTg5MSAgICAgIDAgICAwLjAwODgwMzI2ICAgLTAuMDMwMjk0OCAgIC0wLjAwNTE5OTUgICAgMC4wMjY4MTI1ICAgLTAuMDEzOTY5MSAgIC0wLjAxNTYwNTEgLTAuMDAwNDkyMTAyICAgMC4wMDMxNjQwNSAgICAwLjAyNjAzNzEgICAgMC4wMTQwNDI4IA0KICAgDQogICAxMzQ5ICAgTkExMTg0MyAgICAgIDAgLTAuMDAwOTQ4NjA3ICAgIDAuMDE0MDg2OCAgLTAuMDA0MzU5MzggICAtMC4wMTQ1Mzk4ICAgLTAuMDE1NjMwNCAgICAwLjAyMTE0MTIgIC0wLjAwOTA4OTE2ICAgIDAuMDE0NTIxNyAgLTAuMDA3Njk5NzMgICAgMC4wMTI2MjI2IA0KICAgDQogICAxMzMwICAgTkExMjM0MSAgICAgIDAgICAtMC4wMTMzNTEzICAgLTAuMDExMjgxOCAgIDAuMDAzMTE2NzkgICAwLjAwNjg0MTY1ICAgIDAuMDI2NjI5NiAgICAwLjAxNDQ4MjQgICAtMC4wMjk1NTg0ICAtMC4wMDMyNzUyNiAgLTAuMDAzOTY1MjMgICAgMC4wMjQ1NzgzIA0KYGBgDQoNCg0KIyMgQ2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhlIC5tZHMgZmlsZSBpbnRvIGEgcGxpbmsgY292YXJpYXRlIGZpbGUuDQoNCiMjIyMgJCBhd2sgJ3twcmludCQxLCAkMiwgJDQsICQ1LCAkNiwgJDcsICQ4LCAkOSwgJDEwLCAkMTEsICQxMiwgJDEzfScgSGFwTWFwXzNfcjNfMTNfbWRzLm1kcyA+IGNvdmFyX21kcy50eHQNCg0KDQojIyMjICQgaGVhZCAtbiA1IGNvdmFyX21kcy50eHQgDQoNCmBgYA0KDQpGSUQgSUlEIEMxIEMyIEMzIEM0IEM1IEM2IEM3IEM4IEM5IEMxMA0KDQoxMzI4IE5BMDY5ODkgMC4wMTYwMjQ5IC0wLjA1MjcwODEgMC4wNTMyODM0IC0wLjAwMTUxNTcyIDAuMDA4NjI1NzcgLTAuMDA5Nzk1NDEgMC4wMTk0OTcgLTAuMDI1NzY1MyAwLjAwOTQ2NjExIC0wLjAxNDcyMzUNCg0KMTM3NyBOQTExODkxIDAuMDA4ODAzMjYgLTAuMDMwMjk0OCAtMC4wMDUxOTk1IDAuMDI2ODEyNSAtMC4wMTM5NjkxIC0wLjAxNTYwNTEgLTAuMDAwNDkyMTAyIDAuMDAzMTY0MDUgMC4wMjYwMzcxIDAuMDE0MDQyOA0KDQoxMzQ5IE5BMTE4NDMgLTAuMDAwOTQ4NjA3IDAuMDE0MDg2OCAtMC4wMDQzNTkzOCAtMC4wMTQ1Mzk4IC0wLjAxNTYzMDQgMC4wMjExNDEyIC0wLjAwOTA4OTE2IDAuMDE0NTIxNyAtMC4wMDc2OTk3MyAwLjAxMjYyMjYNCg0KMTMzMCBOQTEyMzQxIC0wLjAxMzM1MTMgLTAuMDExMjgxOCAwLjAwMzExNjc5IDAuMDA2ODQxNjUgMC4wMjY2Mjk2IDAuMDE0NDgyNCAtMC4wMjk1NTg0IC0wLjAwMzI3NTI2IC0wLjAwMzk2NTIzIDAuMDI0NTc4Mw0KDQpgYGANCg0KDQoNCiMjIEFsbCBhZGRpdGlvbmFsIGRpcmVjdG9yeSBjb250ZW50cw0KDQojIyMjIH4vR1dBU19JSk1QUiQgbHMgLWwNCg0KYGBgDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxMTkwNSBKdW4gMjIgIDIwMTcgMV9NYWluX3NjcmlwdF9RQ19HV0FTLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAxNDE2OTUwNiBOb3YgMjkgMDU6MDEgMWtHTURTN190bXANCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDE0MjMxNzI2NzkgTm92IDI5IDA0OjMyIDFrR19NRFMuYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgMjYyNjE5NzI5IE5vdiAyOSAwNDozMyAxa0dfTURTLmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxNTcyNSBOb3YgMjkgMDQ6MzIgMWtHX01EUy5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDEwMTcgTm92IDI5IDA0OjMzIDFrR19NRFMubG9nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEwMDY0IE5vdiAyOSAwNDozMiAxa0dfTURTLm5vc2V4DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAxNDIzMTcyNjc5IE5vdiAyOSAwNDozMyAxa0dfTURTMi5iZWQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAyNjI2MTk3MjkgTm92IDI5IDA0OjMzIDFrR19NRFMyLmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxNTcyNSBOb3YgMjkgMDQ6MzMgMWtHX01EUzIuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAgOTY1IE5vdiAyOSAwNDozMyAxa0dfTURTMi5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTAwNjQgTm92IDI5IDA0OjMzIDFrR19NRFMyLm5vc2V4DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAxMzAyMDM3NzEzIE5vdiAyOSAwNDozNCAxa0dfTURTMy5iZWQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAyMzk3NDc5NTcgTm92IDI5IDA0OjM0IDFrR19NRFMzLmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxNTcyNSBOb3YgMjkgMDQ6MzQgMWtHX01EUzMuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAgOTc0IE5vdiAyOSAwNDozNCAxa0dfTURTMy5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTAwNjQgTm92IDI5IDA0OjM0IDFrR19NRFMzLm5vc2V4DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAxMzAyMDM3NzEzIE5vdiAyOSAwNDozNCAxa0dfTURTNC5iZWQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAyMzk3NDc5NTcgTm92IDI5IDA0OjM0IDFrR19NRFM0LmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxNTcyNSBOb3YgMjkgMDQ6MzQgMWtHX01EUzQuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAgOTY3IE5vdiAyOSAwNDozNCAxa0dfTURTNC5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTAwNjQgTm92IDI5IDA0OjM0IDFrR19NRFM0Lm5vc2V4DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgOTE3NzEyOTgzIE5vdiAyOSAwNDozNSAxa0dfTURTNS5iZWQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAxNjQyODMzMDYgTm92IDI5IDA0OjM1IDFrR19NRFM1LmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxNTcyNSBOb3YgMjkgMDQ6MzUgMWtHX01EUzUuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAxMDAzIE5vdiAyOSAwNDozNSAxa0dfTURTNS5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTAwNjQgTm92IDI5IDA0OjM1IDFrR19NRFM1Lm5vc2V4DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgMTU4MTU2ODk3IE5vdiAyOSAwNDozNiAxa0dfTURTNi5iZWQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgMjc4NDE3MjMgTm92IDI5IDA0OjM2IDFrR19NRFM2LmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxNTcyNSBOb3YgMjkgMDQ6MzYgMWtHX01EUzYuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAgOTQ3IE5vdiAyOSAwNDozNiAxa0dfTURTNi5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTAwNjQgTm92IDI5IDA0OjM2IDFrR19NRFM2Lm5vc2V4DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDEwMTY1NTM0IE5vdiAyOSAwNDozNyAxa0dfTURTNl9TTlBzLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgIDE1ODE1Njg5NyBOb3YgMjkgMDQ6MzggMWtHX01EUzcuYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDI3ODM4MDk1IE5vdiAyOSAwNDozOCAxa0dfTURTNy5iaW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTU3MjUgTm92IDI5IDA0OjM4IDFrR19NRFM3LmZhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgIDk5NiBOb3YgMjkgMDQ6MzggMWtHX01EUzcubG9nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEwMDY0IE5vdiAyOSAwNDozOCAxa0dfTURTNy5ub3NleA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgIDE1ODE1MDI2MSBOb3YgMjkgMDU6MDUgMWtHX01EUzguYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDI3ODM2OTIzIE5vdiAyOSAwNTowNSAxa0dfTURTOC5iaW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTU3MjUgTm92IDI5IDA1OjA1IDFrR19NRFM4LmZhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgIDk1MyBOb3YgMjkgMDU6MDUgMWtHX01EUzgubG9nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEwMDY0IE5vdiAyOSAwNTowNSAxa0dfTURTOC5ub3NleA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAxMjE2NzUyMCBOb3YgMjkgMDQ6MzkgMWtnX3JlZi1saXN0LnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxMzQ5OSBOb3YgMjkgMDU6MDggMjAxMDA4MDQuQUxMLnBhbmVsDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAzMjE2IE5vdiAyOSAwMzo1MiAyX01haW5fc2NyaXB0LnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxMDg4NiBTZXAgMjEgMTc6MjcgMl9NYWluX3NjcmlwdF9NRFMudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA0MDI3MTgxMTA3IE5vdiAyOSAwNDoyNSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMuYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgNjM1NDg1NjM2IE5vdiAyOSAwNDoyNSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDE1NzI1IE5vdiAyOSAwNDoyNSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAxMjU1IE5vdiAyOSAwNDoyNSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMubG9nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEwMDY0IE5vdiAyOSAwNDoyNCBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMubm9zZXgNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgNjU2NzIwOTIwOTYgTm92IDI5IDAzOjQ0ICBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXMudmNmLmd6DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA0MDI3MTgxMTA3IE5vdiAyOSAwNDozMSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXNfbm9fbWlzc2luZ19JRHMuYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgODE4NTUxOTM4IE5vdiAyOSAwNDozMSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXNfbm9fbWlzc2luZ19JRHMuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDE1NzI1IE5vdiAyOSAwNDozMSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXNfbm9fbWlzc2luZ19JRHMuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAxMjA3IE5vdiAyOSAwNDozMSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXNfbm9fbWlzc2luZ19JRHMubG9nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEwMDY0IE5vdiAyOSAwNDozMSBBTEwuMm9mNGludGVyc2VjdGlvbi4yMDEwMDgwNC5nZW5vdHlwZXNfbm9fbWlzc2luZ19JRHMubm9zZXgNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDU2MTYgTm92IDI5IDA1OjE1IEVVUl9NRFNfbWVyZ2UyDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDI4MDI3ODA3IE5vdiAyOSAwNDozOSBIYXBNYXAtYWRqLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAyNzgzODA5NiBOb3YgMjkgMDQ6MzkgSGFwTWFwLWFkai5iaW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDIyOTYgTm92IDI5IDA0OjM5IEhhcE1hcC1hZGouZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDUyODQyIE5vdiAyOSAwNDozOSBIYXBNYXAtYWRqLmxvZw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAxNDE2OTUwNiBOb3YgMjkgMDU6MDIgSGFwTWFwLWFkal90bXANCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgMzAwNTAzMzEgTm92IDI5IDAzOjI2IEhhcE1hcF8zX3IzXzEyLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAyOTg0NjA1NCBOb3YgMjkgMDM6MjYgSGFwTWFwXzNfcjNfMTIuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAyMjk2IE5vdiAyOSAwMzoyNiBIYXBNYXBfM19yM18xMi5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA5OTcgTm92IDI5IDAzOjI2IEhhcE1hcF8zX3IzXzEyLmxvZw0KDQoqKi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDMwMDUwMzMxIE5vdiAyOSAwNToxNiBIYXBNYXBfM19yM18xMy5iZWQqKg0KDQoqKi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDI5ODQ2MDU0IE5vdiAyOSAwNToxNiBIYXBNYXBfM19yM18xMy5iaW0qKg0KDQoqKi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAyMjk2IE5vdiAyOSAwNToxNiBIYXBNYXBfM19yM18xMy5mYW0qKg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDYxMjI0OCBOb3YgMjkgMDU6MTYgSGFwTWFwXzNfcjNfMTMuZ2Vub21lDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAgOTY2IE5vdiAyOSAwNToxNiBIYXBNYXBfM19yM18xMy5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE0MzEgTm92IDI5IDA1OjE4IEhhcE1hcF8zX3IzXzEzX21kcy5jbHVzdGVyMQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMTY0MiBOb3YgMjkgMDU6MTggSGFwTWFwXzNfcjNfMTNfbWRzLmNsdXN0ZXIyDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDMzMDYzIE5vdiAyOSAwNToxOCBIYXBNYXBfM19yM18xM19tZHMuY2x1c3RlcjMNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDExNzEgTm92IDI5IDA1OjE4IEhhcE1hcF8zX3IzXzEzX21kcy5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTcxNjAgTm92IDI5IDA1OjE4IEhhcE1hcF8zX3IzXzEzX21kcy5tZHMNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgMjgwMjc4MDcgTm92IDI5IDA0OjM3IEhhcE1hcF9NRFMuYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDI3ODM4MDk2IE5vdiAyOSAwNDozNyBIYXBNYXBfTURTLmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMjI5NiBOb3YgMjkgMDQ6MzcgSGFwTWFwX01EUy5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDEwNDEgTm92IDI5IDA0OjM3IEhhcE1hcF9NRFMubG9nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDIzODM0MTI0IE5vdiAyOSAwNDozNyBIYXBNYXBfTURTLm1hcA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgIDQzNjQzNTI0NCBOb3YgMjkgMDQ6MzcgSGFwTWFwX01EUy5wZWQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgMjgwMjY2MzEgTm92IDI5IDA1OjA1IEhhcE1hcF9NRFMyLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAyNzgzNjkyNCBOb3YgMjkgMDU6MDUgSGFwTWFwX01EUzIuYmltDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAyMjk2IE5vdiAyOSAwNTowNSBIYXBNYXBfTURTMi5mYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA5ODYgTm92IDI5IDA1OjA1IEhhcE1hcF9NRFMyLmxvZw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAxMDkwNTUyMiBOb3YgMjkgMDQ6MzYgSGFwTWFwX1NOUHMudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDIwNTg3IE5vdiAyOSAwNToxMyBNRFMucGRmDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgMTg1MTc1OTM4IE5vdiAyOSAwNTowNiBNRFNfbWVyZ2UyLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAyNzgzNjkyNCBOb3YgMjkgMDU6MDYgTURTX21lcmdlMi5iaW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTE0OTUgTm92IDI5IDA1OjA3IE1EU19tZXJnZTIuY2x1c3RlcjENCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI5NjQgTm92IDI5IDA1OjA3IE1EU19tZXJnZTIuY2x1c3RlcjINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDE5MDY2MTQgTm92IDI5IDA1OjA3IE1EU19tZXJnZTIuY2x1c3RlcjMNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTgwMjEgTm92IDI5IDA1OjA2IE1EU19tZXJnZTIuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDI4NzQ2OTE0IE5vdiAyOSAwNTowNyBNRFNfbWVyZ2UyLmdlbm9tZQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMTIxNyBOb3YgMjkgMDU6MDcgTURTX21lcmdlMi5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAxMTUyODQgTm92IDI5IDA1OjA3IE1EU19tZXJnZTIubWRzDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEwMDY0IE5vdiAyOSAwNTowNyBNRFNfbWVyZ2UyLm5vc2V4DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAxMzQzIEphbiAyMiAgMjAxNiBNRFNfbWVyZ2VkLlINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA0MzUgTm92IDI5IDA1OjA0IFNOUHNfZm9yX2V4bHVzaW9uLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAyMjkyNiBOb3YgMjkgMDU6MDIgYWxsX2RpZmZlcmVuY2VzLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAxOTQwNTg0NyBOb3YgMjkgMDQ6MzggYnVpbGRoYXBtYXAudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDI4MDI3ODA3IE5vdiAyOSAwNTowMyBjb3JyZWN0ZWRfaGFwbWFwLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAyNzgzODA5NiBOb3YgMjkgMDU6MDMgY29ycmVjdGVkX2hhcG1hcC5iaW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDIyOTYgTm92IDI5IDA1OjAzIGNvcnJlY3RlZF9oYXBtYXAuZmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAxMzY4IE5vdiAyOSAwNTowMyBjb3JyZWN0ZWRfaGFwbWFwLmxvZw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAxNDE2OTUwNiBOb3YgMjkgMDU6MDMgY29ycmVjdGVkX2hhcG1hcF90bXANCg0KKiotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxMzMzOSBOb3YgMjkgMDU6MTggY292YXJfbWRzLnR4dCoqDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICA4MjE1IE5vdiAyOSAwNTowMiBmbGlwX2xpc3QudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAxMDU4OTM4IE5vdiAyOSAwMzoyNiBpbmRlcFNOUC5wcnVuZS5pbg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxMjU4MCBOb3YgMjkgMDU6MDggcmFjZV8xa0cudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEyNTgwIE5vdiAyOSAwNToxMSByYWNlXzFrRzEwLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxMjU4MCBOb3YgMjkgMDU6MTEgcmFjZV8xa0cxMS50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI1ODAgTm92IDI5IDA1OjEyIHJhY2VfMWtHMTIudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEyNTgwIE5vdiAyOSAwNToxMiByYWNlXzFrRzEzLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxMjU4MCBOb3YgMjkgMDU6MTIgcmFjZV8xa0cxNC50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI1ODAgTm92IDI5IDA1OjA5IHJhY2VfMWtHMi50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI1ODAgTm92IDI5IDA1OjEwIHJhY2VfMWtHMy50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI1ODAgTm92IDI5IDA1OjEwIHJhY2VfMWtHNC50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI1ODAgTm92IDI5IDA1OjEwIHJhY2VfMWtHNS50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI1ODAgTm92IDI5IDA1OjEwIHJhY2VfMWtHNi50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI1ODAgTm92IDI5IDA1OjExIHJhY2VfMWtHNy50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI1ODAgTm92IDI5IDA1OjExIHJhY2VfMWtHOC50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTI1ODAgTm92IDI5IDA1OjExIHJhY2VfMWtHOS50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTQ0NTMgTm92IDI5IDA1OjEzIHJhY2VmaWxlLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMTg2MCBOb3YgMjkgMDU6MTMgcmFjZWZpbGVfb3duLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgMTIwNiBOb3YgMjkgMDU6MDQgdW5jb3JyZXNwb25kaW5nX1NOUHMudHh0DQoNCmBgYA0KDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIDMtMS4gQXNzb2NpYXRpb24gYW5hbHlzaXMgKGZvciBiaW5hcnkgdHJhaXRzKSB3aXRob3V0IHVzaW5nIGNvdmFyaWF0ZXMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCg0KDQoNCg0KDQojIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF8zX3IzXzEzIC0tYXNzb2MgLS1vdXQgYXNzb2NfcmVzdWx0cw0KDQpgYGANCjEsMDczLDIyNiB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjEwOSBwZW9wbGUgKDU1IG1hbGVzLCA1NCBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMDkgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQpVc2luZyAxIHRocmVhZCAobm8gbXVsdGl0aHJlYWRlZCBjYWxjdWxhdGlvbnMgaW52b2tlZCkuDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTA5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDI4Lg0KDQoxMDczMjI2IHZhcmlhbnRzIGFuZCAxMDkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NCBhcmUgY2FzZXMgYW5kIDU1IGFyZSBjb250cm9scy4NCg0KKipXcml0aW5nIEMvQyAtLWFzc29jIHJlcG9ydCB0byBhc3NvY19yZXN1bHRzLmFzc29jIC4uLioqDQoNCmBgYA0KDQoNCiMjIyMgJCB3YyAtbCBhc3NvY19yZXN1bHRzLmFzc29jIA0KDQoxMDczMjI3IGFzc29jX3Jlc3VsdHMuYXNzb2MNCg0KDQoNCiMjIyMgJCBoZWFkIC1uIDUgYXNzb2NfcmVzdWx0cy5hc3NvYyANCg0KYGBgDQoNCiBDSFIgICAgICAgICBTTlAgICAgICAgICBCUCAgIEExICAgICAgRl9BICAgICAgRl9VICAgQTIgICAgICAgIENISVNRICAgICAgICAgICAgUCAgICAgICAgICAgT1IgDQogDQogICAxICAgcnMzMTMxOTcyICAgICA3NDI1ODQgICAgQSAgIDAuMTk0NCAgIDAuMTQ1NSAgICBHICAgICAgIDAuOTI4MSAgICAgICAwLjMzNTQgICAgICAgIDEuNDE4IA0KICAgDQogICAxICAgcnMzMTMxOTY5ICAgICA3NDQwNDUgICAgQSAgIDAuMTc1OSAgICAgIDAuMSAgICBHICAgICAgICAyLjY0NyAgICAgICAwLjEwMzcgICAgICAgIDEuOTIxIA0KICAgDQogICAxICAgcnMxMDQ4NDg4ICAgICA3NTA3NzUgICAgQyAgIDAuMTk4MSAgIDAuMTQ1NSAgICBUICAgICAgICAxLjA1NCAgICAgICAwLjMwNDUgICAgICAgIDEuNDUxIA0KICAgDQogICAxICByczEyNTYyMDM0ICAgICA3NTgzMTEgICAgQSAgMC4wNjQ4MSAgIDAuMTE4MiAgICBHICAgICAgICAxLjg2MyAgICAgICAwLjE3MjMgICAgICAgMC41MTcxIA0KDQpgYGANCg0KDQojIyMjICQgYXdrICd7IGlmICgkOSA8PSA1LjBFLTYpIHByaW50ICQyIH0nIGFzc29jX3Jlc3VsdHMuYXNzb2MgPiBzdWJzZXRfYXNzb2MucmVzdWx0cy5hc3NvYy50eHQNCg0KDQojIyMjICQgd2MgLWwgc3Vic2V0X2Fzc29jLnJlc3VsdHMuYXNzb2MudHh0IA0KDQoNCjEyIHN1YnNldF9hc3NvYy5yZXN1bHRzLmFzc29jLnR4dA0KDQoNCg0KIyMjIyAkIGNhdCBzdWJzZXRfYXNzb2MucmVzdWx0cy5hc3NvYy50eHQgDQoNCmBgYA0KDQpyczIwODUwNzkNCg0KcnM4MzQ4NTgNCg0KcnM4MzQ4NjQNCg0KcnMxNTk4MTIwDQoNCnJzMTA5NzE1Nw0KDQpyczE4NDAyOTANCg0KcnM4MzQ4NDMNCg0KcnM3NjczMzk0DQoNCnJzMjc5NDY2DQoNCnJzMjc5NDYwDQoNCnJzMjc5NDUzDQoNCnJzMjYyMzI5Nw0KDQpgYGANCg0KIyMjIyBSc2NyaXB0IC0tbm8tc2F2ZSBRUV9wbG90LlINCg0KIVtRUSBQTE9UX2Fzc29jXSgzX0Fzc29jaWF0aW9uX0dXQVMvUVEtUGxvdF9hc3NvYy5qcGVnKSANCg0KDQojIyMjIFJzY3JpcHQgLS1uby1zYXZlIE1hbmhhdHRhbl9wbG90LlINCg0KIVtNYW5oYXR0YW4gcGxvdF9hc3NvY10oM19Bc3NvY2lhdGlvbl9HV0FTL2Fzc29jX21hbmhhdHRhbi5qcGVnKSAgDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyAzLTIuIEFzc29jaWF0aW9uIGFuYWxzeXNpcyAoZm9yIGJpbmFyeSB0cmFpdHMpIHVzaW5nIGNvdmFyaWF0ZXM6IGxvZ2lzdGljIGFwcHJvYWNoDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KV2Ugd2lsbCBiZSB1c2luZyAxMCBwcmluY2lwYWwgY29tcG9uZW50cyBhcyBjb3ZhcmlhdGVzIGFuZCB0aGUgTURTIGNvbXBvbmVudHMgY2FsY3VsYXRlZCBwcmV2aW91c2x5OiBjb3Zhcl9tZHMudHh0Lg0KDQoNCiMjIyMgJCBwbGluayAtLWJmaWxlIEhhcE1hcF8zX3IzXzEzIC0tY292YXIgY292YXJfbWRzLnR4dCAtLWxvZ2lzdGljIC0taGlkZS1jb3ZhciAtLW91dCBsb2dpc3RpY19yZXN1bHRzDQoNCg0KYGBgDQoqKk5vdGU6IC0taGlkZS1jb3ZhciBmbGFnIGRlcHJlY2F0ZWQuICBVc2UgZS5nLiAnLS1saW5lYXIgaGlkZS1jb3ZhcicuKioNCg0KKiotLWhpZGUtY292YXIgb25seSBzaG93cyB0aGUgYWRkaXRpdmUgcmVzdWx0cyBvZiB0aGUgU05QcyBpbiB0aGUgb3V0cHV0IGZpbGUuKioNCg0KMTA3MzIyNiB2YXJpYW50cyBsb2FkZWQgZnJvbSAuYmltIGZpbGUuDQoNCjEwOSBwZW9wbGUgKDU1IG1hbGVzLCA1NCBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLg0KDQoxMDkgcGhlbm90eXBlIHZhbHVlcyBsb2FkZWQgZnJvbSAuZmFtLg0KDQpVc2luZyAxIHRocmVhZCAobm8gbXVsdGl0aHJlYWRlZCBjYWxjdWxhdGlvbnMgaW52b2tlZCkuDQoNCioqLS1jb3ZhcjogMTAgY292YXJpYXRlcyBsb2FkZWQuKioNCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMDkgZm91bmRlcnMgYW5kIDAgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uIA0KDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTgwMjguDQoNCjEwNzMyMjYgdmFyaWFudHMgYW5kIDEwOSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4NCg0KQW1vbmcgcmVtYWluaW5nIHBoZW5vdHlwZXMsIDU0IGFyZSBjYXNlcyBhbmQgNTUgYXJlIGNvbnRyb2xzLg0KDQoqKldyaXRpbmcgbG9naXN0aWMgbW9kZWwgYXNzb2NpYXRpb24gcmVzdWx0cyB0byBsb2dpc3RpY19yZXN1bHRzLmFzc29jLmxvZ2lzdGljKioNCg0KYGBgDQoNCiMjIyMgJCB3YyAtbCBsb2dpc3RpY19yZXN1bHRzLmFzc29jLmxvZ2lzdGljIA0KDQoxMDczMjI3IGxvZ2lzdGljX3Jlc3VsdHMuYXNzb2MubG9naXN0aWMNCg0KDQoNCiMjIyMgJCBoZWFkIC1uIDUgbG9naXN0aWNfcmVzdWx0cy5hc3NvYy5sb2dpc3RpYyANCg0KYGBgDQoNCiBDSFIgICAgICAgICBTTlAgICAgICAgICBCUCAgIEExICAgICAgIFRFU1QgICAgTk1JU1MgICAgICAgICBPUiAgICAgICAgIFNUQVQgICAgICAgICAgICBQIA0KIA0KICAgMSAgIHJzMzEzMTk3MiAgICAgNzQyNTg0ICAgIEEgICAgICAgIEFERCAgICAgIDEwOSAgICAgIDEuOTU3ICAgICAgICAxLjU1MiAgICAgICAwLjEyMDcNCiAgIA0KICAgMSAgIHJzMzEzMTk2OSAgICAgNzQ0MDQ1ICAgIEEgICAgICAgIEFERCAgICAgIDEwOSAgICAgIDIuMzIyICAgICAgICAgIDEuOCAgICAgIDAuMDcxNzkNCiAgIA0KICAgMSAgIHJzMTA0ODQ4OCAgICAgNzUwNzc1ICAgIEMgICAgICAgIEFERCAgICAgIDEwOCAgICAgIDEuOTg2ICAgICAgICAxLjU5MSAgICAgICAwLjExMTcNCiAgIA0KICAgMSAgcnMxMjU2MjAzNCAgICAgNzU4MzExICAgIEEgICAgICAgIEFERCAgICAgIDEwOSAgICAgMC4zMjkyICAgICAgIC0xLjkxMiAgICAgIDAuMDU1ODYNCg0KYGBgDQoNCg0KIyMjIFJlbW92ZSBOQSB2YWx1ZXMsIHRob3NlIG1pZ2h0IGdpdmUgcHJvYmxlbXMgZ2VuZXJhdGluZyBwbG90cyBpbiBsYXRlciBzdGVwcy4NCg0KDQojIyMgICQgYXdrICchLydOQScvJyBsb2dpc3RpY19yZXN1bHRzLmFzc29jLmxvZ2lzdGljID4gbG9naXN0aWNfcmVzdWx0cy5hc3NvY18yLmxvZ2lzdGljDQoNCg0KIyMjIyB3YyAtbCBsb2dpc3RpY19yZXN1bHRzLmFzc29jXzIubG9naXN0aWMgDQoNCjEwNzMyMTQgbG9naXN0aWNfcmVzdWx0cy5hc3NvY18yLmxvZ2lzdGljDQoNCg0KIyMjIyAkIGhlYWQgLW4gNSBsb2dpc3RpY19yZXN1bHRzLmFzc29jXzIubG9naXN0aWMgDQoNCmBgYA0KDQogQ0hSICAgICAgICAgU05QICAgICAgICAgQlAgICBBMSAgICAgICBURVNUICAgIE5NSVNTICAgICAgICAgT1IgICAgICAgICBTVEFUICAgICAgICAgICAgUCANCiANCiAgIDEgICByczMxMzE5NzIgICAgIDc0MjU4NCAgICBBICAgICAgICBBREQgICAgICAxMDkgICAgICAxLjk1NyAgICAgICAgMS41NTIgICAgICAgMC4xMjA3DQogICANCiAgIDEgICByczMxMzE5NjkgICAgIDc0NDA0NSAgICBBICAgICAgICBBREQgICAgICAxMDkgICAgICAyLjMyMiAgICAgICAgICAxLjggICAgICAwLjA3MTc5DQogICANCiAgIDEgICByczEwNDg0ODggICAgIDc1MDc3NSAgICBDICAgICAgICBBREQgICAgICAxMDggICAgICAxLjk4NiAgICAgICAgMS41OTEgICAgICAgMC4xMTE3DQogICANCiAgIDEgIHJzMTI1NjIwMzQgICAgIDc1ODMxMSAgICBBICAgICAgICBBREQgICAgICAxMDkgICAgIDAuMzI5MiAgICAgICAtMS45MTIgICAgICAwLjA1NTg2DQoNCmBgYA0KDQojIyMjIFJzY3JpcHQgLS1uby1zYXZlIFFRX3Bsb3QuUg0KDQoNCiFbUVEgUExPVF9sb2dpc3RpY10oM19Bc3NvY2lhdGlvbl9HV0FTL1FRLVBsb3RfbG9naXN0aWMuanBlZykgIA0KDQoNCg0KDQojIyMjIFJzY3JpcHQgLS1uby1zYXZlIE1hbmhhdHRhbl9wbG90LlINCg0KIVtNYW5oYXR0YW4gUExPVF9sb2dpc3RpY10oM19Bc3NvY2lhdGlvbl9HV0FTL0xvZ2lzdGljX21hbmhhdHRhbi5qcGVnKSAgDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBNdWx0aXBsZSB0ZXN0aW5nDQojIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpUaGVyZSBhcmUgdmFyaW91cyB3YXkgdG8gZGVhbCB3aXRoIG11bHRpcGxlIHRlc3Rpbmcgb3V0c2lkZSBvZiB0aGUgY29udmVudGlvbmFsIGdlbm9tZS13aWRlIHNpZ25pZmljYW5jZSB0aHJlc2hvbGQgb2YgNS4wRS04LiANCg0KDQoNCiMjIE11bHRpcGxlIHRlc3RpbmcgdmlhIEJvbmZlcnJvbmkgdGVzdA0KDQpDb21tYW5kIGJlbG93IHdpbGwgZ2l2ZSBhIEJvbmZlcnJvbmkgY29ycmVjdGVkIHAtdmFsdWUsIGFsb25nIHdpdGggRkRSIGFuZCBvdGhlcnMuDQoNCg0KIyMjIyAkIHBsaW5rIC0tYmZpbGUgSGFwTWFwXzNfcjNfMTMgLWFzc29jIC0tYWRqdXN0IC0tb3V0IGFkanVzdGVkX2Fzc29jX3Jlc3VsdHMNCg0KYGBgDQoxMDczMjI2IHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4NCg0KMTA5IHBlb3BsZSAoNTUgbWFsZXMsIDU0IGZlbWFsZXMpIGxvYWRlZCBmcm9tIC5mYW0uDQoNCjEwOSBwaGVub3R5cGUgdmFsdWVzIGxvYWRlZCBmcm9tIC5mYW0uDQoNClVzaW5nIDEgdGhyZWFkIChubyBtdWx0aXRocmVhZGVkIGNhbGN1bGF0aW9ucyBpbnZva2VkKS4NCg0KQmVmb3JlIG1haW4gdmFyaWFudCBmaWx0ZXJzLCAxMDkgZm91bmRlcnMgYW5kIDAgbm9uZm91bmRlcnMgcHJlc2VudC4NCg0KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uIA0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk4MDI4Lg0KDQoxMDczMjI2IHZhcmlhbnRzIGFuZCAxMDkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NCBhcmUgY2FzZXMgYW5kIDU1IGFyZSBjb250cm9scy4NCg0KKipXcml0aW5nIEMvQyAtLWFzc29jIHJlcG9ydCB0byBhZGp1c3RlZF9hc3NvY19yZXN1bHRzLmFzc29jIC4uLioqDQoNCi4uLi4uLi4uLi4uLi4uLi4uDQoNCi0tYWRqdXN0OiBHZW5vbWljIGluZmxhdGlvbiBlc3QuIGxhbWJkYSAoYmFzZWQgb24gbWVkaWFuIGNoaXNxKSA9IDEuMDA5NjUuDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KLS1hZGp1c3QgdmFsdWVzICgxMDczMjI2IHZhcmlhbnRzKSB3cml0dGVuIHRvICoqYWRqdXN0ZWRfYXNzb2NfcmVzdWx0cy5hc3NvYy5hZGp1c3RlZCoqLg0KDQpgYGANCg0KIyMjIyAkIHdjIC1sIGFkanVzdGVkX2Fzc29jX3Jlc3VsdHMuYXNzb2MNCg0KMTA3MzIyNyBhZGp1c3RlZF9hc3NvY19yZXN1bHRzLmFzc29jDQoNCiMjIyMgJCBoZWFkIC1uIDUgYWRqdXN0ZWRfYXNzb2NfcmVzdWx0cy5hc3NvYw0KDQpgYGANCg0KIENIUiAgICAgICAgIFNOUCAgICAgICAgIEJQICAgQTEgICAgICBGX0EgICAgICBGX1UgICBBMiAgICAgICAgQ0hJU1EgICAgICAgICAgICBQICAgICAgICAgICBPUiANCiANCiAgIDEgICByczMxMzE5NzIgICAgIDc0MjU4NCAgICBBICAgMC4xOTQ0ICAgMC4xNDU1ICAgIEcgICAgICAgMC45MjgxICAgICAgIDAuMzM1NCAgICAgICAgMS40MTggDQogICANCiAgIDEgICByczMxMzE5NjkgICAgIDc0NDA0NSAgICBBICAgMC4xNzU5ICAgICAgMC4xICAgIEcgICAgICAgIDIuNjQ3ICAgICAgIDAuMTAzNyAgICAgICAgMS45MjEgDQogIA0KICAgMSAgIHJzMTA0ODQ4OCAgICAgNzUwNzc1ICAgIEMgICAwLjE5ODEgICAwLjE0NTUgICAgVCAgICAgICAgMS4wNTQgICAgICAgMC4zMDQ1ICAgICAgICAxLjQ1MSANCiAgIA0KICAgMSAgcnMxMjU2MjAzNCAgICAgNzU4MzExICAgIEEgIDAuMDY0ODEgICAwLjExODIgICAgRyAgICAgICAgMS44NjMgICAgICAgMC4xNzIzICAgICAgIDAuNTE3MSANCiAgIA0KYGBgDQogICANCg0KIyMjIyAkIHdjIC1sIGFkanVzdGVkX2Fzc29jX3Jlc3VsdHMuYXNzb2MuYWRqdXN0ZWQgDQoNCjEwNzMyMjcgYWRqdXN0ZWRfYXNzb2NfcmVzdWx0cy5hc3NvYy5hZGp1c3RlZA0KDQoNCg0KIyMjIyAkIGhlYWQgLW4gNSBhZGp1c3RlZF9hc3NvY19yZXN1bHRzLmFzc29jLmFkanVzdGVkIA0KDQoNCmBgYA0KDQogQ0hSICAgICAgICAgU05QICAgICAgVU5BREogICAgICAgICBHQyAgICAgICBCT05GICAgICAgIEhPTE0gICBTSURBS19TUyAgIFNJREFLX1NEICAgICBGRFJfQkggICAgIEZEUl9CWQ0KIA0KICAgMyAgIHJzMTA5NzE1NyAgIDEuNjZlLTA2ICAxLjg2MWUtMDYgICAgICAgICAgMSAgICAgICAgICAxICAgICAwLjgzMTYgICAgIDAuODMxNiAgICAgMC4yODcxICAgICAgICAgIDEgDQogICANCiAgIDMgICByczE4NDAyOTAgICAxLjY2ZS0wNiAgMS44NjFlLTA2ICAgICAgICAgIDEgICAgICAgICAgMSAgICAgMC44MzE2ICAgICAwLjgzMTYgICAgIDAuMjg3MSAgICAgICAgICAxIA0KICAgDQogICA4ICAgIHJzMjc5NDY2ICAyLjQ0MWUtMDYgIDIuNzI3ZS0wNiAgICAgICAgICAxICAgICAgICAgIDEgICAgIDAuOTI3MiAgICAgMC45MjcyICAgICAwLjI4NzEgICAgICAgICAgMSANCiAgIA0KICAgOCAgICByczI3OTQ2MCAgMi40NDFlLTA2ICAyLjcyN2UtMDYgICAgICAgICAgMSAgICAgICAgICAxICAgICAwLjkyNzIgICAgIDAuOTI3MiAgICAgMC4yODcxICAgICAgICAgIDEgDQoNCmBgYA0KDQoNCiMjIE11bHRpcGxlIHRlc3RpbmcgdmlhIHBlcm11dGF0aW9uIA0KDQpgYGANCldlIHBlcm11dGUgYSBzdWJzZXQgb2YgdGhlIFNOUHMgZnJvbSBjaHJvbW9zb21lIDIyIHRvIHJlZHVjZSBjb21wdXRhdGlvbmFsIHRpbWUuIA0KDQpUaGUgRU1QMiBjb2xsdW1uIHByb3ZpZGVzIG11bHRpcGxlIHRlc3RpbmcgY29ycmVjdGVkIHAtdmFsdWUuDQpgYGANCg0KIyMjIyAkIGF3ayAneyBpZiAoJDQgPj0gMjE1OTUwMDAgJiYgJDQgPD0gMjE2MDUwMDApIHByaW50ICQyIH0nIEhhcE1hcF8zX3IzXzEzLmJpbSA+IHN1YnNldF9zbnBfY2hyXzIyLnR4dA0KDQoNCiMjIyMgJCB3YyAtbCBzdWJzZXRfc25wX2Nocl8yMi50eHQgDQoNCjg0IHN1YnNldF9zbnBfY2hyXzIyLnR4dA0KDQoNCiMjIyMgJCBoZWFkIC1uIDUgc3Vic2V0X3NucF9jaHJfMjIudHh0IA0KDQpyczEyNTYzMTQxDQoNCnJzMTIxMjQxMjMNCg0KcnMyNzk2MzQzDQoNCnJzNzU1NTY2MA0KDQpyczEyNDk0MjIzDQoNCg0KDQojIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfM19yM18xMyAtLWV4dHJhY3Qgc3Vic2V0X3NucF9jaHJfMjIudHh0IC0tbWFrZS1iZWQgLS1vdXQgSGFwTWFwX3N1YnNldF9mb3JfcGVybQ0KDQpgYGANCjEwNzMyMjYgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxMDkgcGVvcGxlICg1NSBtYWxlcywgNTQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTA5IHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KKiotLWV4dHJhY3Q6IDg0IHZhcmlhbnRzIHJlbWFpbmluZy4qKg0KDQpVc2luZyAxIHRocmVhZCAobm8gbXVsdGl0aHJlYWRlZCBjYWxjdWxhdGlvbnMgaW52b2tlZCkuDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTA5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLiANCg0KLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpUb3RhbCBnZW5vdHlwaW5nIHJhdGUgaXMgMC45OTcyNy4NCg0KODQgdmFyaWFudHMgYW5kIDEwOSBwZW9wbGUgcGFzcyBmaWx0ZXJzIGFuZCBRQy4NCg0KQW1vbmcgcmVtYWluaW5nIHBoZW5vdHlwZXMsIDU0IGFyZSBjYXNlcyBhbmQgNTUgYXJlIGNvbnRyb2xzLg0KDQoqKi0tbWFrZS1iZWQgdG8gSGFwTWFwX3N1YnNldF9mb3JfcGVybS5iZWQgKyBIYXBNYXBfc3Vic2V0X2Zvcl9wZXJtLmJpbSArIEhhcE1hcF9zdWJzZXRfZm9yX3Blcm0uZmFtIC4uLiAqKg0KDQoNCmBgYA0KDQojIyMjICQgcGxpbmsgLS1iZmlsZSBIYXBNYXBfc3Vic2V0X2Zvcl9wZXJtIC0tYXNzb2MgLS1tcGVybSAxMDAwMDAwIC0tb3V0IHN1YnNldF8xTV9wZXJtX3Jlc3VsdA0KDQoNCg0KYGBgDQoqKk5vdGU6IC0tbXBlcm0gZmxhZyBkZXByZWNhdGVkLiAgVXNlIGUuZy4gJy0tbW9kZWwgbXBlcm09W3ZhbHVlXScuKioNCg0KODQgdmFyaWFudHMgbG9hZGVkIGZyb20gLmJpbSBmaWxlLg0KDQoxMDkgcGVvcGxlICg1NSBtYWxlcywgNTQgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4NCg0KMTA5IHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4NCg0KVXNpbmcgdXAgdG8gNCB0aHJlYWRzIChjaGFuZ2UgdGhpcyB3aXRoIC0tdGhyZWFkcykuDQoNCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMTA5IGZvdW5kZXJzIGFuZCAwIG5vbmZvdW5kZXJzIHByZXNlbnQuDQoNCkNhbGN1bGF0aW5nIGFsbGVsZSBmcmVxdWVuY2llcy4uLiANCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KVG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDAuOTk3MjcuDQoNCjg0IHZhcmlhbnRzIGFuZCAxMDkgcGVvcGxlIHBhc3MgZmlsdGVycyBhbmQgUUMuDQoNCkFtb25nIHJlbWFpbmluZyBwaGVub3R5cGVzLCA1NCBhcmUgY2FzZXMgYW5kIDU1IGFyZSBjb250cm9scy4NCg0KKipXcml0aW5nIEMvQyAtLWFzc29jIHJlcG9ydCB0byBzdWJzZXRfMU1fcGVybV9yZXN1bHQuYXNzb2MgLi4uKioNCg0KW2dlbmVyYXRpbmcgcGVybXV0YXRpb25zXQ0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCioqNjc3MjQ4IHBlcm11dGF0aW9ucyBjb21wbGV0ZS4qKg0KDQoqKjEwMDAwMDAgbWF4KFQpIHBlcm11dGF0aW9ucyBjb21wbGV0ZS4qKg0KDQoNCioqUGVybXV0YXRpb24gdGVzdCByZXBvcnQgd3JpdHRlbiB0byBzdWJzZXRfMU1fcGVybV9yZXN1bHQuYXNzb2MubXBlcm0gLiAqKg0KDQpgYGANCg0KIyMjIyAkIHdjIC1sIHN1YnNldF8xTV9wZXJtX3Jlc3VsdC5hc3NvYy5tcGVybSANCg0KODUgc3Vic2V0XzFNX3Blcm1fcmVzdWx0LmFzc29jLm1wZXJtDQoNCg0KIyMjIyAkIGhlYWQgLW4gNSBzdWJzZXRfMU1fcGVybV9yZXN1bHQuYXNzb2MubXBlcm0gDQoNCmBgYA0KDQogQ0hSICAgICAgICAgIFNOUCAgICAgICAgIEVNUDEgICAgICAgICBFTVAyIA0KIA0KICAgMSAgIHJzMTI1NjMxNDEgICAgICAgIDAuNjU5ICAgICAgICAgICAgMSANCiAgIA0KICAgMSAgIHJzMTIxMjQxMjMgICAgICAgMC40OTg4ICAgICAgICAgICAgMSANCiAgIA0KICAgMSAgICByczI3OTYzNDMgICAgICAgMC40NzY1ICAgICAgICAgICAgMSANCiAgIA0KICAgMSAgICByczc1NTU2NjAgICAgICAgMC42OTMyICAgICAgICAgICAgMSANCiAgIA0KYGBgDQoNCiMjIyMgJCBzb3J0IC1nayA0IHN1YnNldF8xTV9wZXJtX3Jlc3VsdC5hc3NvYy5tcGVybSA+IHNvcnRlZF9zdWJzZXQudHh0DQoNCg0KIyMjIyAkIGhlYWQgLW4gNSBzb3J0ZWRfc3Vic2V0LnR4dCANCg0KYGBgDQogQ0hSICAgICAgICAgIFNOUCAgICAgICAgIEVNUDEgICAgICAgICBFTVAyIA0KIA0KICAyMiAgICByczgxMzU5OTYgICAgICAwLjA2ODU0ICAgICAgIDAuOTA3MSANCiAgDQogICAzICAgIHJzMTQ1NzU4OCAgICAgIDAuMDMxOTYgICAgICAgIDAuOTE0IA0KICAgDQogICA1ICAgcnMxNjg3NDcyMSAgICAgICAwLjEwMDYgICAgICAgMC45NzMzIA0KICAgDQogIDE2ICAgIHJzNzE5NDEyOCAgICAgIDAuMDcxNjcgICAgICAgMC45OTI5IA0KICANCmBgYA0KDQoNCg0KIyMgQWxsIGFkZGl0aW9uYWwgZGlyZWN0b3J5IGNvbnRlbnRzDQoNCg0KIyMjIyMgfi9HV0FTX0lKTVBSJCBscyAtbA0KDQpgYGANCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgNTk0OSBTZXAgMjEgMTQ6MDQgM19NYWluX3NjcmlwdF9hc3NvY2lhdGlvbl9HV0FTLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzAwNTAzMzEgTm92IDI5IDA1OjI2IEhhcE1hcF8zX3IzXzEzLmJlZA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMjk4NDYwNTQgTm92IDI5IDA1OjI2IEhhcE1hcF8zX3IzXzEzLmJpbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDIyOTYgTm92IDI5IDA1OjI2IEhhcE1hcF8zX3IzXzEzLmZhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDIzNTUgTm92IDI5IDA1OjMzIEhhcE1hcF9zdWJzZXRfZm9yX3Blcm0uYmVkDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMjMzMiBOb3YgMjkgMDU6MzMgSGFwTWFwX3N1YnNldF9mb3JfcGVybS5iaW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyMjk2IE5vdiAyOSAwNTozMyBIYXBNYXBfc3Vic2V0X2Zvcl9wZXJtLmZhbQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDEwMDggTm92IDI5IDA1OjMzIEhhcE1hcF9zdWJzZXRfZm9yX3Blcm0ubG9nDQoNCioqLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDMyMzA3IE5vdiAyOSAwNTozNiBMb2dpc3RpY19tYW5oYXR0YW4uanBlZyoqDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDU5NiBTZXAgMjEgMTQ6MDYgTWFuaGF0dGFuX3Bsb3QuUg0KDQoqKi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAxNjM1NSBOb3YgMjkgMDU6NDEgUVEtUGxvdF9hc3NvYy5qcGVnKioNCg0KKiotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgMTY3NTcgTm92IDI5IDA1OjQxIFFRLVBsb3RfbG9naXN0aWMuanBlZyoqDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDUyNSBTZXAgMjEgMTQ6MDYgUVFfcGxvdC5SDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDEwMzAyOTc5MiBOb3YgMjkgMDU6MzEgYWRqdXN0ZWRfYXNzb2NfcmVzdWx0cy5hc3NvYw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxMTM3NjIwNjEgTm92IDI5IDA1OjMxIGFkanVzdGVkX2Fzc29jX3Jlc3VsdHMuYXNzb2MuYWRqdXN0ZWQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAxMDc1IE5vdiAyOSAwNTozMSBhZGp1c3RlZF9hc3NvY19yZXN1bHRzLmxvZw0KDQoqKi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAzMjcyNiBOb3YgMjkgMDU6MzcgYXNzb2NfbWFuaGF0dGFuLmpwZWcqKg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxMDMwMjk3OTIgTm92IDI5IDA1OjI4IGFzc29jX3Jlc3VsdHMuYXNzb2MNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgODg1IE5vdiAyOSAwNToyOCBhc3NvY19yZXN1bHRzLmxvZw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgMTMzMzkgTm92IDI5IDA1OjI3IGNvdmFyX21kcy50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDk2NTkwNDMxIE5vdiAyOSAwNToyOSBsb2dpc3RpY19yZXN1bHRzLmFzc29jLmxvZ2lzdGljDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA5NjU4OTI2MSBOb3YgMjkgMDU6MzAgbG9naXN0aWNfcmVzdWx0cy5hc3NvY18yLmxvZ2lzdGljDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTA1OCBOb3YgMjkgMDU6MjkgbG9naXN0aWNfcmVzdWx0cy5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAzODI1IE5vdiAyOSAwNTozNCBzb3J0ZWRfc3Vic2V0LnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDgyNDUgTm92IDI5IDA1OjMzIHN1YnNldF8xTV9wZXJtX3Jlc3VsdC5hc3NvYw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDM4MjUgTm92IDI5IDA1OjMzIHN1YnNldF8xTV9wZXJtX3Jlc3VsdC5hc3NvYy5tcGVybQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDEwODcgTm92IDI5IDA1OjMzIHN1YnNldF8xTV9wZXJtX3Jlc3VsdC5sb2cNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgODUxIE5vdiAyOSAwNTozMiBzdWJzZXRfc25wX2Nocl8yMi50eHQNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0K