Running ARGweaver
Preprocessing files for ARGweaver
To preprocess the input files for ARGweaver, we first subset our 20 diploid individuals from the full VCF files (see Supplementary information in Meier et al, 2021), and then convert the SNP information into the .sites format required for ARGweaver. The .sites format only contains information on the positions that are varying within the 20 individuals that we chose. (see .Rmd file for full code)
In the optix region (43538 bp long), there are 2812 sites altogether - 2426 are variant positions, while 330 and 56 sites are fixed for one or the other allele. Genomic positions that are neither variant nor fixed to one or the other allele (in other words, positions absent in the VCF file) are considered missing information and therefore masked from being used as input data for ARGweaver. Altogether, ARGweaver uses information of variant alleles and invariant alleles; whereas the rest is masked and treated as missing information.
# Keep only the sites that are variant to this subset of 20 diploid individuals
bcftools view -c1 -C39 -Oz ${regionName}_Herato.vcf.gz > ${regionName}_Herato_variants.vcf.gz
bcftools query --format '%CHROM\t%POS\t%REF\t%ALT\t[%GT\t]\n' ${regionName}_Herato_variants.vcf.gz > ${regionName}_Herato_variants.gt
#check numbers of sites in the VCF file
bcftools view -H ${regionName}_Herato.vcf.gz | wc -l #Total sites = 2812
bcftools view -H -c1 -C39 ${regionName}_Herato.vcf.gz | wc -l #Total variant sites = 2426
bcftools view -H -C0 ${regionName}_Herato.vcf.gz | wc -l #Sites fixed to REF allele = 330 (REF according to the VCF format nomenclature)
bcftools view -H -c40 ${regionName}_Herato.vcf.gz | wc -l #SItes fixed to ALT allele = 56 (ALT according to the VCF format nomenclature)
# Create sites file
# USAGE: Rscript vcf2sites.R <sample.txt> <input.gt> <chr> <begin> <end> #
Rscript $workdir/scripts/vcf2sites.R $workdir/sample/all_sample.txt ${regionName}_Herato_variants.gt $chrom $chromStart $chromEnd
cat <(head -2 ${regionName}_Herato_variants_RefAlt.sites) <(cut -f1,2 <(tail +3 ${regionName}_Herato_variants_RefAlt.sites)) > ../${regionName}_Herato.sites
# Create mask file
bcftools view -H ${regionName}_Herato_variants.vcf.gz | awk '$0 !~ /^#/ {print $1,$2-1,$2}' | bedops -d <(echo -e "$chrom\t$(($chromStart-1))\t$chromEnd") - | bgzip > ../${regionName}_Herato_mask.bed.gz
We repeated the same steps for the neutral background region, Scaffold Herato1603:3450000-3493538. In that region (43538 bp), there are 6407 sites altogether - 4926 is variant positions, while 1405 and 76 sites are fixed for one or the other allele. (see .Rmd file for full code).
Run ARGweaver
ARGweaver is run for 5000 iterations and then resumed for another 5000 iterations for the optix region, whereas only 5000 iterations for the neutral region.
# Run ARGweaver
~/.local/bin/arg-sample -s sites/${regionName}_Herato.sites \
--maskmap masks/${regionName}_Herato_mask.bed.gz \
-N 1940078 \
-m 2.9e-9 \
-r 2.9e-9 \
--ntimes 30 \
--maxtime $((1940078*20)) \
--iters 5000 \
--delta 0.01 \
--output {regionName}/sample/${regionName}
# Resume ARGweaver for more iterations
~/.local/bin/arg-sample -s sites/${regionName}_Herato.sites \
--maskmap masks/${regionName}_Herato_mask.bed.gz \
-N 1940078 \
-m 2.9e-9 \
-r 2.9e-9 \
--ntimes 30 \
--maxtime $((1940078*20)) \
--iters 10000 \
--delta 0.01 \
--output {regionName}/sample/${regionName} \
--resume
Analysis of ARGweaver output
MCMC summary
Visualizing the traces of likelihood, prior and joint probabilities from the MCMC iterations, we decided to set the first 3000 iterations as burnin. The plot below is for the optix region.

Fig S2: Traces across all MCMC iterations of prior (log probability of the sampled ARG given the model), likelihood (log probability of the data given the sampled ARG), joint (total log probability of the ARG and the data (prior + likelihood)), recombs (number of recombination events in the sampled ARG), arglen (total length of all branches summed across sites) and noncompats (number of variant sites that cannot be explained by infinite sites mutation model).
Process output from ARGweaver
The ARGweaver output .smc files are then converted to easily maniputable .bed format to extract TMRCAs, trees, recomination breakpoints and total tree branch lengths across all iterations (except burnin). Then, 2 specific iterations (Iteration 8250 and 9000) are chosen for further analysis and identification of haplotype blocks (see .Rmd file for full code, and analysis for the neutral region)
#### OPTIX ####
# Load variables
workdir=$HOME/Proj-Def-Haplo
prefix=optix_newNe
regionName=optix
chrom=Herato1801
chromStart=1362067
chromEnd=1405605
# Convert .smc to .bed format for all iterations
cd $workdir/optix_newrun/$prefix
smc2bed-all $workdir/optix_newrun/$prefix/sample/$prefix
## Check mcmc stats to check burnin
burnin=3000
# Compute TMRCA estimates for between and within popualtions from all iterations
for pop in all_sample Herato_notabilis Herato_lativitta; do
echo Summarizing $pop
arg-summarize --arg-file ./sample/$prefix.bed.gz \
--subset-inds $workdir/sample/$pop.txt \
--log-file ./sample/$prefix.log \
--tmrca \
--burnin $burnin \
--mean --stdev --quantile 0.05,0.5,0.95 |\
bgzip > $prefix.tmrca.$pop.bed.gz
echo " -> Done"
done
## The same is repeated for the neutral region below
## Compute TMRCA, and branch length from individual iterations
stats_list=(tmrca branchlen)
iters_list=(8250 9000)
for pop in all_sample Herato_notabilis Herato_lativitta; do
echo Summarizing $pop
for sample_no in ${iters_list[*]}; do
echo -n "Computing $sample_no"
for stat in ${stats_list[*]}; do
echo -n "Computing $stat"
arg-summarize --arg-file ./sample/$prefix.bed.gz \
--subset-inds $workdir/sample/$pop.txt \
--sample $sample_no \
--log-file ./sample/$prefix.log \
--$stat \
--mean --quantile 0.05,0.5,0.95 |\
bgzip > $prefix.$stat.$pop.${sample_no}.bed.gz
echo " -> Done"
done
done
done
Read SNPs
SNPs are changed from its nucloetide asignment to 0/1; based on allele frequency within the H.e.lativitta samples. (Higher allele frequency - 1, Lower allele frequency - 0)
## Read all SNPs
optix_sites <- readSites("~/Proj-Def-Haplo/optix_newrun/sites/optix_Herato.sites")
#
## Read all sites (SNPs+invariant)
optixALL_sites <- readSites("~/Proj-Def-Haplo/optix_newrun/sites/optixALL_Herato.sites")
#
## Change SNPs to 0 and 1 based on major allele in lativitta
sites<- data.frame(pos=optix_sites$pos, optix_sites$sites)
for (snpID in c(1:nrow(sites))){
cat(snpID, sites[snpID,'pos'])
alleles <- sites[snpID,sampID$ID]
alleles <- as.factor(alleles)
alleleCount1 <- sum(alleles[lat] == levels(alleles)[1])
alleleCount2 <- sum(alleles[lat] == levels(alleles)[2])
majAllele <- ifelse(alleleCount1 > alleleCount2, levels(alleles)[1], levels(alleles)[2])
minAllele <- setdiff(levels(alleles), majAllele)
sites[snpID,which(sites[snpID,] == majAllele)] <- 1
sites[snpID,which(sites[snpID,] == minAllele)] <- 0
}
TMRCA
We first examine the TMRCA of the total tree and the individual populations - H.e.lativitta (in red) and H.e.notabilis (in yellow). Unlike the neutral region (Herato1603) where all TMRCA estimates are fairly constrained between 1 and 10 \(N_e\), TMRCA traces for individual populations in the optix region exhibit shallow coalescence times at multiple positions throughout the entire ~50kb region. In case of a selective sweeps, where a beneficial mutation sweeps through the population, TMRCA tends to be shallow since all samples in the swept population coalesces quickly to the initial “lucky” ancestor. Moving away from the focal mutations, lineages recombine away from the swept ancestral background. The TMRCA estimates from the optix region is consistent with the previously identified selected region in optix. To investigate further the haplotype block structures, we focus into a 3kb region at optix:1385966-1388966.

Fig S3: TMRCA (Ne) for each position in the optix (top panel) and the neutral genomic region (bottom panel). Black line: total TMRCA, Red: Median TMRCA for H.e.lativitta, Yellow: TMRCA for H.e.notabilis. Corresponding shaded regions are the 0.05 and 0.95 percentile intervals.
In the focal region, there are 137 SNPs.

FigS4: TMRCA for each position in focal genomic region (optix:1385966-1388966). Same colour schemes as above. Top panel: TMRCA plot, Bottom panel: SNPs in both populations; RED and YELLOW alleles are variant positions, coloured according to the respective higher and lower allele counts in the H.e.lativitta population. BLACK alleles are fixed (invariant) in both populations. All other positions (in white) are unknown, since those positions do not have SNP information. These unknown positions are masked while running ARGWeaver, therefore they are treated as missing information and NOT as invariant sites.
Masking sites can have a critical effect on sampling ARGs, since invariant sites can shift priors towards a recent coalescence (because there hasn’t been enough time yet for a mutation to occur in any of the branches), whereas missing information does not shift priors and therefore ARGs are sampled neutrally in those regions. In the above region of 3kb, there are 137 SNPs and 16 invariant positions. Out of the 137 SNPs, only 59 SNPs are segregating within the H.e.lativitta population in focus. Below is the folded SNP frequency spectrum.

FigS5: Folded SNP frequency spectrum of the focal region, optix:1385966-1388966.
Hereafter, alleles with lower frequency within the H.e.lativitta population is referred to as the minor allele, and individuals who share the minor allele is the minor clade. Conversely, individuals that carry that major allele is called major clade. Minor allele is coded as 0 and major as 1.
Iteration 1 (MCMC iter: 8250)
We extract ARGs sampled by ARGweaver in its MCMC iteration: 8250, and estimate the TMRCA (total and within population), total branch length of each marginal tree and the recombination breakpoints. Altogether in the ~50kb region, there are 6571 trees (and 6570 recombination events), of which only 464 trees are present in the focal 3kb region, optix:1385966-1388966.
We investigate the distribution of branch length of trees with respect to their genomic spans (Fig S6). We find average tree span in the whole region is ~7 bp. We expect from theory assuming standard coalescence, \(P_r(d \mid \tau)\)=\(\frac {\rho}{2}L(\tau)\) exp\([-\frac {\rho}{2}L(\tau) d]\) where \(L(\tau)\) is in coalescent unit of \(2N_e\) generations and \(\frac {\rho}{2}\)=\(2N_er\) denotes the population-scaled recombination rate per bp. Given the parameters, and mean \(L(\tau)\) = 2, this gives mean d = \(\frac {1} {\frac {\rho}{2}L(\tau)}\) ~ 45bp. It seems in this region, ARGweaver seems to change the tree topology more often than the expected mean. We have not explored this closely (beyond the main reach of this analysis), however, we note that although the ARGs are consistent with the data, we need to take caution in biological inference from these sampled ARGs.
## Read all 6571 tree lengths ----
treelen1 <- readArgSummary("~/Proj-Def-Haplo/optix_newrun/optix_newNe/optix_newNe.branchlen.all_sample.8250.bed.gz")
treelen1$treespan <- treelen1$chromEnd-treelen1$chromStart
## Read 464 tree lengths in the focal genomic region ----
treelen1_sub <- subset_genomic_interval(treelen1, chromStart, chromEnd)
mean(treelen1$treespan) # 6.625932
mean(treelen1_sub$treespan) # 6.460215
## Plot ----
par(mfrow=c(1,3), cex.main=1.5, cex.lab=1.7, cex.axis=1.5)
# Histogram
hist(treelen1$treespan, xlab = "Tree Span")
# Branch Length vs Tree span (all 6571 trees)
plot(treelen1$treespan, treelen1$branchlen_mean, xlab="Tree Span", ylab="Tree Length")
points(aggregate(treelen1$branchlen_mean~treelen1$treespan, FUN=mean), col="red", pch=19, cex=1.5)
# Branch Length vs Tree span (464 trees in the focal genomic region)
plot(treelen1_sub$treespan, treelen1_sub$branchlen_mean, xlab="Tree Span", ylab="Tree Length")
points(aggregate(treelen1_sub$branchlen_mean~treelen1_sub$treespan, FUN=mean), col="red", pch=19, cex=1.5)

FigS6: Left: Histogram of tree spans; Center: Branch length vs tree span for all 6571 marginal trees along the genome; Right: Branch length vs tree spans for 464 trees in the focal genomic region. RED points are average tree lengths for each tree span.
For our analysis, we strictly focus on identifying edges supported by SNPs. In practice, this is done in few steps - First, for each sampled tree along the genome (= 464 trees), we extract the following information - ancestral and descendant node of each edge, edge height (=length), time-point of the descendant node, i.e., when the edge originated (=depth, NOTE: due to rounding errors in Newick format, we round the depth values to 3 significant digits) and the samples (=tips.from.dec) that each edge is ancestral to. NOTE: Although we are identifying haplotype blocks in the H.e.lativitta (red) population, we use genealogical trees that include both populations. This is done in order to estimate the edge height of the most recent common ancestor to all individuals in the red population. Ideally for making biological inferences from only one population, this need not be done. However in our analysis, in order to illustrate the haplotype block patterns generated in a selected genomic region, we decided to incorporate both populations to generate trees along the genome. Nevertheless, it is important to note that the identified haplotype blocks will stay the same irrespective of which and how many populations are included in the analysis; however, the edge height will change along the genome.
## Store edge information of all 464 trees as a list
tr1_sub_list <- extract_edges(tr1_sub)
Second, for every tree at each SNP position (= 137 SNPs), we identify most recent tree node that is commonly ancestral to all individuals that share the same allele. (Note: this assumes infinite sites mutation model, which is generally the default option in ARGweaver). This allows identification of 1 node for the major and 1 for the minor allele at each SNP position, hereafter called major and minor node for each tree.
The table below illustrates information from the tree whose genomic span coincides with the first SNP position - 1385985.
66 |
75 |
3.1531464 |
0.2364560 |
18, 22 |
75 |
18 |
0.2364539 |
0.0000021 |
18 |
75 |
22 |
0.2364539 |
0.0000021 |
22 |
66 |
72 |
2.4942915 |
0.8953109 |
39, 33, 11, 34, 0 , 14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13 |
72 |
76 |
0.7979937 |
0.0973172 |
39, 33 |
76 |
39 |
0.0973136 |
0.0000036 |
39 |
76 |
33 |
0.0973136 |
0.0000036 |
33 |
72 |
55 |
0.3208752 |
0.5744357 |
11, 34, 0 , 14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13 |
55 |
40 |
0.4227382 |
0.1516975 |
11, 34 |
40 |
11 |
0.1516965 |
0.0000010 |
11 |
40 |
34 |
0.1516965 |
0.0000010 |
34 |
55 |
68 |
0.0000000 |
0.5744357 |
0 , 14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13 |
68 |
0 |
0.5744357 |
0.0000000 |
0 |
68 |
63 |
0.0000000 |
0.5744357 |
14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13 |
63 |
14 |
0.5744357 |
0.0000000 |
14 |
63 |
46 |
0.2058814 |
0.3685543 |
3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13 |
46 |
60 |
0.0000000 |
0.3685543 |
3, 9 |
60 |
3 |
0.3685527 |
0.0000015 |
3 |
60 |
9 |
0.3685527 |
0.0000015 |
9 |
46 |
44 |
0.0000000 |
0.3685543 |
37, 15, 32, 25, 21, 19, 30, 17, 26, 13 |
44 |
57 |
0.0000000 |
0.3685543 |
37, 15, 32, 25, 21, 19, 30, 17 |
57 |
37 |
0.3685527 |
0.0000015 |
37 |
57 |
77 |
0.0000000 |
0.3685543 |
15, 32, 25, 21, 19, 30, 17 |
77 |
52 |
0.0000000 |
0.3685543 |
15, 32, 25 |
52 |
15 |
0.3685527 |
0.0000015 |
15 |
52 |
54 |
0.3285208 |
0.0400334 |
32, 25 |
54 |
32 |
0.0400319 |
0.0000015 |
32 |
54 |
25 |
0.0400319 |
0.0000015 |
25 |
77 |
53 |
0.1320988 |
0.2364554 |
21, 19, 30, 17 |
53 |
21 |
0.2364539 |
0.0000015 |
21 |
53 |
65 |
0.0000000 |
0.2364554 |
19, 30, 17 |
65 |
73 |
0.0847579 |
0.1516975 |
19, 30 |
73 |
19 |
0.1516965 |
0.0000010 |
19 |
73 |
30 |
0.1516965 |
0.0000010 |
30 |
65 |
17 |
0.2364539 |
0.0000015 |
17 |
44 |
71 |
0.2712391 |
0.0973152 |
26, 13 |
71 |
26 |
0.0973136 |
0.0000015 |
26 |
71 |
13 |
0.0973136 |
0.0000015 |
13 |
-1 |
66 |
16.6103976 |
3.3896024 |
18, 22, 39, 33, 11, 34, 0 , 14, 3 , 9 , 37, 15, 32, 25, 21, 19, 30, 17, 26, 13 |
Table S1: For the above tree at SNP position 1385985, individuals 18 and 22 share allele 0, and therefore their most recent common ancestor is node 75 (called as minor node) which originated at time (in \(N_e\)) = 0.236 and has a length of 3.153 (in \(N_e\)).
Third, for each minor node (and major node if the SNP is fixed within the H.e.lativitta population) identified from trees at each of the 137 SNPs, we identify all trees along the genome which contains that unique ancestral node. Since we do not know the ancestral reference allele at each SNP position and we assume infinite sites mutation, any minor node that is ancestral exclusively to the minor clade is assumed to contain the causal alternate allele and is considered as a branch on which a mutation has occurred. The table below shows the extent of the above node 75 that is ancestral to indnividuals 18 and 22 at SNP position 1385985. (NOTE: only 10 rows showed for illustration. In other words, this is how the haplotype blocks are encoded as edges.
2 |
55 |
42 |
0.0000000 |
0.236454 |
18, 22 |
1 |
1385966 |
1385966 |
1 |
0.000000 |
21 |
55 |
42 |
0.0000000 |
0.236454 |
18, 22 |
2 |
1385967 |
1385967 |
1 |
0.000000 |
22 |
55 |
42 |
0.0000000 |
0.236454 |
18, 22 |
3 |
1385968 |
1385968 |
1 |
0.000000 |
23 |
55 |
42 |
0.0000000 |
0.236454 |
18, 22 |
4 |
1385969 |
1385972 |
4 |
0.000000 |
24 |
55 |
42 |
0.0000000 |
0.236454 |
18, 22 |
5 |
1385973 |
1385973 |
1 |
0.000000 |
25 |
55 |
42 |
0.0000000 |
0.236454 |
18, 22 |
6 |
1385974 |
1385993 |
20 |
0.000000 |
41 |
55 |
42 |
0.3379803 |
0.236454 |
18, 22 |
7 |
1385994 |
1386005 |
12 |
4.055763 |
36 |
55 |
42 |
0.3379803 |
0.236454 |
18, 22 |
8 |
1386006 |
1386008 |
3 |
1.013941 |
34 |
55 |
42 |
0.3379803 |
0.236454 |
18, 22 |
9 |
1386009 |
1386022 |
14 |
4.731724 |
341 |
55 |
42 |
0.3379803 |
0.236454 |
18, 22 |
10 |
1386023 |
1386025 |
3 |
1.013941 |
Table S2: Haplotype block as a unique edge that contains the mutation at pos: 1385985, shared between individuals 18, 22. Each row represents 1 tree. For example, tree 7 spans from 1385994 to 1386005, is 12 bp long; the haplotype block at this tree has a height of 0.3379 and therefore an area (height x tree span) of 4.055763.
Following the above steps, we can identify each major/minor node ancestral to each major/minor clade and occurs at a particular time point in the past, that in practice informs us of all the edges informed by SNPs. With 137 SNPs, we have 36 edges supported by SNPs (table below).
0.3686 |
9 , 3 , 11, 21, 14, 34, 32, 25, 26, 13 |
8 |
1 |
1 |
3.3896 |
30, 17, 22, 0 , 33, 18, 15, 19, 39, 37 |
11, 12 |
2 |
2 |
2.1748 |
15, 37, 3 , 19, 14, 21, 22, 0 , 39, 33 |
111 |
1 |
3 |
0.5744 |
3 , 15, 19, 14, 25, 33, 9 , 21, 22 |
99, 100 |
2 |
4 |
0.8953 |
37, 3 , 19, 14, 21, 22, 0 , 39, 33 |
106 |
1 |
5 |
1.3954 |
30, 0 , 39, 33, 18, 34, 17, 32, 26 |
113 |
1 |
6 |
0.2365 |
39, 11, 18, 17, 34, 32, 26 |
102 |
1 |
7 |
2.1748 |
17, 33, 18, 15, 19, 22 |
7 |
1 |
8 |
0.3686 |
21, 14, 32, 25, 26, 13 |
13 |
1 |
9 |
0.8953 |
30, 0 , 39, 11, 19, 14 |
88 |
1 |
10 |
NA |
19, 0, 33, 30, 22 |
6 |
1 |
11 |
NA |
9, 13, 14, 37, 22 |
40 |
1 |
12 |
0.5744 |
30, 18, 32, 34 |
61 |
1 |
13 |
1.3954 |
34, 30, 17 |
9, 10, 15 |
3 |
14 |
0.2365 |
14, 9 , 37 |
43 |
1 |
15 |
0.2365 |
9 , 33, 19 |
80 |
1 |
16 |
0.2365 |
18, 22 |
1, 2, 3 |
3 |
17 |
0.1517 |
22, 17 |
56 |
1 |
18 |
0.0624 |
21, 22 |
92, 122, 126 |
3 |
19 |
NA |
9, 11 |
97 |
1 |
20 |
1.3954 |
30, 13 |
105 |
1 |
21 |
0.0000 |
11 |
5 |
1 |
22 |
0.0000 |
30 |
14, 34, 70, 91, 110, 120, 127, 131, 136 |
9 |
23 |
0.0000 |
34 |
17, 109 |
2 |
24 |
0.0000 |
13 |
25, 26, 27, 29, 32, 33, 35, 36, 37, 38, 41, 112, 116, 118 |
14 |
25 |
0.0000 |
17 |
31 |
1 |
26 |
0.0000 |
3 |
60 |
1 |
27 |
0.0000 |
15 |
108 |
1 |
28 |
0.0000 |
18 |
117 |
1 |
29 |
3.3896 |
ALL |
4, 16, 42, 54, 62, 64, 65, 66, 93, 94, 95, 96, 98, 101 |
14 |
30 |
2.1748 |
ALL |
18, 19, 21, 22, 23, 24, 63, 119, 121, 123, 124, 125, 128, 129, 135, 137 |
16 |
31 |
1.3954 |
ALL |
20, 57, 58, 59, 67, 68, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86 |
22 |
32 |
12.8325 |
ALL |
28, 30, 39 |
3 |
33 |
0.8953 |
ALL |
44, 45, 46, 47, 48, 49, 50, 51, 52 |
9 |
34 |
5.2829 |
ALL |
53, 87, 103, 104, 130, 132 |
6 |
35 |
8.2336 |
ALL |
55, 89, 90, 107, 114, 115, 133, 134 |
8 |
36 |
Table S3: All 36 haplotype blocks as edges from iteration 8250; each row represents an unique edge. As mentioned above, each edge is defined uniquely by its origin time-point (=depth) and the set of descendent individuals (=tips.from.dec). For example, edge 17 (same edge as the Table S1, S2 refers to) originates at 0.2365 (time in Ne), shared by individuals 18, 22 and is supported by 3 SNPs at position (rank sum order) 1,2,3. Edges with depth = NA refers to SNPs that are incompatible with the infinite sites mutation model, and hence cannot be explained by one mutation event.
It is important to clarify that this strategy of identifying nodes across successive trees along the genome can easily be translated to the mathematical notation used for the haplotype block simulations. For example, the above edge can be represented as {0, {34}, {{18,22},{}}}, i.e., the ancestral genome on this haplotype block carries the allele 0 at SNP position 1; and is broken down into regions defined by trees {1,93}, {94,464} and is ancestral to samples {18,22},{} respectively.
Haplotype block visualization
For visualization, we choose to only plot the edges that are supported by 3 or more SNPs. Moreover, for SNPs that are fixed in the red population, we only show edges that originate at any time-point below 5\(N_e\). This leaves us with only 8 edgee. (see .Rmd file for full code)
## Select edges supported by 3 or more SNPs
imp_edges1 <- edges1[edges1$No.of.SNPs >=3 & edges1$depth <=5 , ] #12 important edges
nrow(imp_edges1)
imp_edges1 <- imp_edges1[order(imp_edges1$depth),]
par(mfrow=c(2,1), cex.lab=1.5, cex.axis=1.3)
plot_all_sites(focal_sites, as.character(1)) +
axis(side =2, tick =T, at = c(21:40), labels = F) +
points(bl1_c1$pos, rep(which(sampID$ARGweaverID == c(30)),nrow(bl1_c1)), col='black', pch=19, cex = 1)
plot(hapblock1_c1$chromStart, hapblock1_c1$length, type="n", log="y", ylim=c(0.05,15), xlab="Position (bp)", ylab="Time (Ne)", xlim=c(chromStart, chromEnd)) +
plot_hapblock(hapblock1_c1_all, "black", T)

Fig S7: Haplotype block that is supported by singletons. These edges originate directly from the tree tips, ie, the samples and therefore extends all along the genomic region. Although for biological inference, singletons are often uninformative, this shows the feature of an edge supported by singletons, which extends all along the genome, is normally shallow with certain regions that go are high, where a lot of singleton clusters together. These are normally regions of the genome, which have recombined out and goes all the way back to an ancestor in the deep past. The orange block shows clustering of SNPs in the higher region of the edges, whereas, the green edge shows how SNPs can also occur by chance at other regions.
Now, ploting all the haploype blocks except singletons (Fig S8), same as the figure in main text (see Main Text for caption).

See .Rmd file for all 137 trees at each SNP position.
Case 2: iteration 9000
There are altogether 6457 trees in the ~50kb region, and 425 in the focal genomic region.
Hapotype blocks from both iterations
FigS9 shows the haplotype blocks and the SNPs that support each block from both iterations.

LS0tCnRpdGxlOiAiQVJHd2VhdmVyIEFuYWx5c2lzIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKYGBge3IgaW5jbHVkZT1GfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GKQpgYGAKCmBgYHtiYXNofQojIyBMb2FkIGFsbCBtb2R1bGVzCm1vZHVsZSBsb2FkIHNhbXRvb2xzIGJlZG9wcyBiY2Z0b29scyBSIApzb3VyY2Ugfi8uYmFzaHJjCmV4cG9ydCBQWVRIT05QQVRIPSRIT01FLy5sb2NhbC9iaW4Kd29ya2Rpcj0iL25mcy9zY2lzdG9yZTAzL2JhcnRvZ3JwL2FwYWwvUHJvai1EZWYtSGFwbG8iCmBgYAoKIyMgUnVubmluZyBBUkd3ZWF2ZXIKCiMjIyMgU2FtcGxlIGluZm9ybWF0aW9uCkFSR3dlYXZlciBpcyBhcHBsaWVkIG9uIGFuIGVtcGlyaWNhbCwgcGhhc2VkIGRhdGFzZXQgb2YgKkhlbGljb25pdXMgZXJhdG8qIGJ1dHRlcmZsaWVzLCBnZW5lcmF0ZWQgYnkgaGFwbG90YWdnaW5nLCBhIHRlY2huaXF1ZSB0aGF0IHByb2R1Y2VzIHN5bnRoZXRpYyBsaW5rZWQtcmVhZCBzZXF1ZW5jZSBkYXRhLiBXZSB1c2VkIHBhcnRzIG9mIHR3byBzY2FmZm9sZHMgLSBIZXJhdG8xODAxOjEzNjIwNjctMTQwNTYwNSAoY29pbmNpZGVzIHdpdGggdGhlIHByZXZpb3VzbHkgaWRlbnRpZmllZCBnZW5lICpvcHRpeCogdGhhdCBoYXMgdW5kZXJnb25lIGEgc2VsZWN0aXZlIHN3ZWVwKSBhbmQgSGVyYXRvMTYwMzozNDUwMDAwLTM0OTM1MzggKGEgbmV1dHJhbCBiYWNrZ3JvdW5kIHJlZ2lvbikgKFN1cHBsZW1lbnRhcnkgRGF0YSAxKS4gVGhpcyBkYXRhc2V0IGlzIHByZXZpb3VzbHkgcHVibGlzaGVkIGluIE1laWVyIGV0IGFsLCAyMDIxLiAxMCBpbmRpdmlkdWFscyBvZiAqSC5lLmxhdGl2aXR0YSogYW5kICpILmUubm90YWJpbGlzKiB3ZXJlIGNob3NlbiBmcm9tIG9wcG9zaXRlIGVuZHMgb2YgdGhlIGh5YnJpZCB6b25lIHRyYW5zZWN0IGZvciBBUkcgaW5mZXJlbmNlIChTdXBwbGVtZW50YXJ5IERhdGEgMikuCmBgYHtiYXNofQojc2VsZWN0IHNhbXBsZXMKdGFpbCArMiBzYW1wbGUuY3N2IHwgc2VkICdzL1wsL1x0LycgfCBjdXQgLWYgMSA+IGFsbF9zYW1wbGUudHh0CmBgYAoKIyMjIyBQcmVwcm9jZXNzaW5nIGZpbGVzIGZvciBBUkd3ZWF2ZXIKVG8gcHJlcHJvY2VzcyB0aGUgaW5wdXQgZmlsZXMgZm9yIEFSR3dlYXZlciwgd2UgZmlyc3Qgc3Vic2V0IG91ciAyMCBkaXBsb2lkIGluZGl2aWR1YWxzIGZyb20gdGhlIGZ1bGwgVkNGIGZpbGVzIChzZWUgU3VwcGxlbWVudGFyeSBpbmZvcm1hdGlvbiBpbiBNZWllciBldCBhbCwgMjAyMSksIGFuZCB0aGVuIGNvbnZlcnQgdGhlIFNOUCBpbmZvcm1hdGlvbiBpbnRvIHRoZSAqLnNpdGVzKiBmb3JtYXQgcmVxdWlyZWQgZm9yIEFSR3dlYXZlci4gVGhlICouc2l0ZXMqIGZvcm1hdCBvbmx5IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBwb3NpdGlvbnMgdGhhdCBhcmUgdmFyeWluZyB3aXRoaW4gdGhlIDIwIGluZGl2aWR1YWxzIHRoYXQgd2UgY2hvc2UuIChzZWUgKi5SbWQqIGZpbGUgZm9yIGZ1bGwgY29kZSkKCkluIHRoZSAqb3B0aXgqIHJlZ2lvbiAoNDM1MzggYnAgbG9uZyksIHRoZXJlIGFyZSAyODEyIHNpdGVzIGFsdG9nZXRoZXIgLSAyNDI2IGFyZSB2YXJpYW50IHBvc2l0aW9ucywgd2hpbGUgMzMwIGFuZCA1NiBzaXRlcyBhcmUgZml4ZWQgZm9yIG9uZSBvciB0aGUgb3RoZXIgYWxsZWxlLiBHZW5vbWljIHBvc2l0aW9ucyB0aGF0IGFyZSBuZWl0aGVyIHZhcmlhbnQgbm9yIGZpeGVkIHRvIG9uZSBvciB0aGUgb3RoZXIgYWxsZWxlIChpbiBvdGhlciB3b3JkcywgcG9zaXRpb25zIGFic2VudCBpbiB0aGUgVkNGIGZpbGUpIGFyZSBjb25zaWRlcmVkIG1pc3NpbmcgaW5mb3JtYXRpb24gYW5kIHRoZXJlZm9yZSBtYXNrZWQgZnJvbSBiZWluZyB1c2VkIGFzIGlucHV0IGRhdGEgZm9yIEFSR3dlYXZlci4gQWx0b2dldGhlciwgQVJHd2VhdmVyIHVzZXMgaW5mb3JtYXRpb24gb2YgdmFyaWFudCBhbGxlbGVzIGFuZCBpbnZhcmlhbnQgYWxsZWxlczsgd2hlcmVhcyB0aGUgcmVzdCBpcyBtYXNrZWQgYW5kIHRyZWF0ZWQgYXMgbWlzc2luZyBpbmZvcm1hdGlvbi4KCmBgYHtiYXNoLCBlY2hvPVQsIHdhcm5pbmc9RiwgcmVzdWx0cz1GfQojIyBPUFRJWDogSGVyYXRvMTgwMToxMzYyMDY3LTE0MDU2MDUKIyBJbml0aWF0ZSB2YXJpYWJsZXMKcmVnaW9uTmFtZT1vcHRpeApjaHJvbT1IZXJhdG8xODAxCmNocm9tU3RhcnQ9MTM2MjA2NwpjaHJvbUVuZD0xNDA1NjA1CiMgU3Vic2V0IHNhbXBsZXMgZnJvbSBmdWxsIFZDRiAKY2Qgfi9Qcm9qLURlZi1IYXBsby9WQ0ZzLwpiY2Z0b29scyB2aWV3IC1TIC4uL3NhbXBsZS9hbGxfc2FtcGxlLnR4dCAtTyB6IFwKUEMwNjJfbWVyZ2VkX0hlcmF0bzE4MDEuUEwuQUQuSEFQQ1VUMi5zaXRlX2FsbC52Y2YuZ3ogPiAke2Nocm9tfV8ke2Nocm9tU3RhcnR9LSR7Y2hyb21FbmR9X3N1YnNldC52Y2YuZ3oKdGFiaXggJHtjaHJvbX1fJHtjaHJvbVN0YXJ0fS0ke2Nocm9tRW5kfV9zdWJzZXQudmNmLmd6CmBgYAoKYGBge2Jhc2gsIGVjaG89Rn0KIyBNYWtlIG5ldyBmb2xkZXIgZm9yIG9wdGl4Cm1rZGlyIH4vUHJvai1EZWYtSGFwbG8vJHtyZWdpb25OYW1lfV9uZXdydW4KbWtkaXIgfi9Qcm9qLURlZi1IYXBsby8ke3JlZ2lvbk5hbWV9X25ld3J1bi9WQ0ZzCmNkIH4vUHJvai1EZWYtSGFwbG8vJHtyZWdpb25OYW1lfV9uZXdydW4vVkNGcy8KIyBNYWtlIHN5bWJvbGljIGxpbmsgdG8gdGhlIG9yZ2luYWwgZmlsZQpsbiAtcyAvbmZzL3NjaXN0b3JlMDMvYmFydG9ncnAvYXBhbC9Qcm9qLURlZi1IYXBsby9WQ0ZzLyR7Y2hyb219XyR7Y2hyb21TdGFydH0tJHtjaHJvbUVuZH1fc3Vic2V0LnZjZi5neiAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3oKbG4gLXMgL25mcy9zY2lzdG9yZTAzL2JhcnRvZ3JwL2FwYWwvUHJvai1EZWYtSGFwbG8vVkNGcy8ke2Nocm9tfV8ke2Nocm9tU3RhcnR9LSR7Y2hyb21FbmR9X3N1YnNldC52Y2YuZ3oudGJpICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5nei50YmkKYGBgCgpgYGB7YmFzaCwgZWNobz1UfQojIEtlZXAgb25seSB0aGUgc2l0ZXMgdGhhdCBhcmUgdmFyaWFudCB0byB0aGlzIHN1YnNldCBvZiAyMCBkaXBsb2lkIGluZGl2aWR1YWxzCmJjZnRvb2xzIHZpZXcgLWMxIC1DMzkgLU96ICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5neiA+ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLnZjZi5negpiY2Z0b29scyBxdWVyeSAtLWZvcm1hdCAnJUNIUk9NXHQlUE9TXHQlUkVGXHQlQUxUXHRbJUdUXHRdXG4nICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLnZjZi5neiA+ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLmd0CmBgYAoKYGBge2Jhc2gsIGVjaG89VH0KI2NoZWNrIG51bWJlcnMgb2Ygc2l0ZXMgaW4gdGhlIFZDRiBmaWxlCmJjZnRvb2xzIHZpZXcgLUggJHtyZWdpb25OYW1lfV9IZXJhdG8udmNmLmd6IHwgd2MgLWwgI1RvdGFsIHNpdGVzID0gMjgxMgpiY2Z0b29scyB2aWV3IC1IIC1jMSAtQzM5ICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5neiB8IHdjIC1sICNUb3RhbCB2YXJpYW50IHNpdGVzID0gMjQyNgpiY2Z0b29scyB2aWV3IC1IIC1DMCAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3ogfCB3YyAtbCAjU2l0ZXMgZml4ZWQgdG8gUkVGIGFsbGVsZSA9IDMzMCAoUkVGIGFjY29yZGluZyB0byB0aGUgVkNGIGZvcm1hdCBub21lbmNsYXR1cmUpCmJjZnRvb2xzIHZpZXcgLUggLWM0MCAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3ogfCB3YyAtbCAjU0l0ZXMgZml4ZWQgdG8gQUxUIGFsbGVsZSA9IDU2IChBTFQgYWNjb3JkaW5nIHRvIHRoZSBWQ0YgZm9ybWF0IG5vbWVuY2xhdHVyZSkKYGBgCgpgYGB7YmFzaCwgZWNobz1UfQojIENyZWF0ZSBzaXRlcyBmaWxlIAojIFVTQUdFOiBSc2NyaXB0IHZjZjJzaXRlcy5SIDxzYW1wbGUudHh0PiA8aW5wdXQuZ3Q+IDxjaHI+IDxiZWdpbj4gPGVuZD4gIwpSc2NyaXB0ICR3b3JrZGlyL3NjcmlwdHMvdmNmMnNpdGVzLlIgJHdvcmtkaXIvc2FtcGxlL2FsbF9zYW1wbGUudHh0ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLmd0ICRjaHJvbSAkY2hyb21TdGFydCAkY2hyb21FbmQKY2F0IDwoaGVhZCAtMiAke3JlZ2lvbk5hbWV9X0hlcmF0b192YXJpYW50c19SZWZBbHQuc2l0ZXMpIDwoY3V0IC1mMSwyIDwodGFpbCArMyAke3JlZ2lvbk5hbWV9X0hlcmF0b192YXJpYW50c19SZWZBbHQuc2l0ZXMpKSA+IC4uLyR7cmVnaW9uTmFtZX1fSGVyYXRvLnNpdGVzCmBgYAoKYGBge2Jhc2gsIGVjaG89VH0KIyBDcmVhdGUgbWFzayBmaWxlCmJjZnRvb2xzIHZpZXcgLUggJHtyZWdpb25OYW1lfV9IZXJhdG9fdmFyaWFudHMudmNmLmd6IHwgYXdrICckMCAhfiAvXiMvIHtwcmludCAkMSwkMi0xLCQyfScgfCBiZWRvcHMgLWQgPChlY2hvIC1lICIkY2hyb21cdCQoKCRjaHJvbVN0YXJ0LTEpKVx0JGNocm9tRW5kIikgLSB8IGJnemlwID4gLi4vJHtyZWdpb25OYW1lfV9IZXJhdG9fbWFzay5iZWQuZ3oKYGBgCgpXZSByZXBlYXRlZCB0aGUgc2FtZSBzdGVwcyBmb3IgdGhlIG5ldXRyYWwgYmFja2dyb3VuZCByZWdpb24sIFNjYWZmb2xkIEhlcmF0bzE2MDM6MzQ1MDAwMC0zNDkzNTM4LiBJbiB0aGF0IHJlZ2lvbiAoNDM1MzggYnApLCB0aGVyZSBhcmUgNjQwNyBzaXRlcyBhbHRvZ2V0aGVyIC0gNDkyNiBpcyB2YXJpYW50IHBvc2l0aW9ucywgd2hpbGUgMTQwNSBhbmQgNzYgc2l0ZXMgYXJlIGZpeGVkIGZvciBvbmUgb3IgdGhlIG90aGVyIGFsbGVsZS4gKHNlZSAqLlJtZCogZmlsZSBmb3IgZnVsbCBjb2RlKS4gCgpgYGB7YmFzaCwgZWNobz1GfQojIyBOZXV0cmFsOiBIZXJhdG8xNjAzOjM0NTAwMDAtMzQ5MzUzOAoKIyBJbml0aWF0ZSB2YXJpYWJsZXMKcmVnaW9uTmFtZT1IZXJhdG8xNjAzLTEgIyB3ZSBjYWxsIGl0IEhlcmF0bzE2MDMtMSBzaW5jZSB3ZSBzdWJzZXQgZXhhY3RseSB0aGUgc2FtZSBnZW5vbWljIGxlbmd0aCAoNDM1MzggYnApIGFzIHRoZSBvcHRpeCByZWdpb24KY2hyb209SGVyYXRvMTYwMwpjaHJvbVN0YXJ0PTM0NTAwMDAKY2hyb21FbmQ9MzQ5MzUzOApjZCB+L1Byb2otRGVmLUhhcGxvL1ZDRnMvCgojIFN1YnNldCBzYW1wbGVzIGZyb20gZnVsbCBWQ0YgCmJjZnRvb2xzIHZpZXcgLVMgLi4vc2FtcGxlL2FsbF9zYW1wbGUudHh0IFwKICAtciAkY2hyb206JGNocm9tU3RhcnQtJGNocm9tRW5kIFwKICAtT3ogUEMwNjJfbWVyZ2VkX0hlcmF0bzE2MDMuMy40NU1iLlBMLkFELkhBUENVVDIudmNmLmd6ID4gJHtjaHJvbX1fJHtjaHJvbVN0YXJ0fS0ke2Nocm9tRW5kfV9zdWJzZXQudmNmLmd6CnRhYml4ICR7Y2hyb219XyR7Y2hyb21TdGFydH0tJHtjaHJvbUVuZH1fc3Vic2V0LnZjZi5negoKIyBNYWtlIG5ldyBmb2xkZXIgZm9yIEhlcmF0bzE2MDMKbWtkaXIgfi9Qcm9qLURlZi1IYXBsby8ke3JlZ2lvbk5hbWV9X25ld3J1bgpta2RpciB+L1Byb2otRGVmLUhhcGxvLyR7cmVnaW9uTmFtZX1fbmV3cnVuL1ZDRnMKY2Qgfi9Qcm9qLURlZi1IYXBsby8ke3JlZ2lvbk5hbWV9X25ld3J1bi9WQ0ZzLwoKbG4gLXMgJHdvcmtkaXIvVkNGcy8ke2Nocm9tfV8ke2Nocm9tU3RhcnR9LSR7Y2hyb21FbmR9X3N1YnNldC52Y2YuZ3ogJHtyZWdpb25OYW1lfV9IZXJhdG8udmNmLmd6CmxuIC1zICR3b3JrZGlyL1ZDRnMvJHtjaHJvbX1fJHtjaHJvbVN0YXJ0fS0ke2Nocm9tRW5kfV9zdWJzZXQudmNmLmd6LnRiaSAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3oudGJpCgojIEtlZXAgb25seSB0aGUgc2l0ZXMgdGhhdCBhcmUgdmFyaWFudCB0byB0aGlzIHN1YnNldCBvZiAyMCBkaXBsb2lkIGluZGl2aWR1YWxzCmJjZnRvb2xzIHZpZXcgLWMxIC1DMzkgLU96ICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5neiA+ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLnZjZi5negpiY2Z0b29scyBxdWVyeSAtLWZvcm1hdCAnJUNIUk9NXHQlUE9TXHQlUkVGXHQlQUxUXHRbJUdUXHRdXG4nICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLnZjZi5neiA+ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLmd0CgojY2hlY2sgbnVtYmVycyBvZiBzaXRlcyBpbiB0aGUgVkNGIGZpbGUKYmNmdG9vbHMgdmlldyAtSCAke3JlZ2lvbk5hbWV9X0hlcmF0by52Y2YuZ3ogfCB3YyAtbCAjVG90YWwgc2l0ZXMgPSA2NDA3CmJjZnRvb2xzIHZpZXcgLUggLWMxIC1DMzkgJHtyZWdpb25OYW1lfV9IZXJhdG8udmNmLmd6IHwgd2MgLWwgI1RvdGFsIHZhcmlhbnQgc2l0ZXMgPSA0OTI2CmJjZnRvb2xzIHZpZXcgLUggLUMwICR7cmVnaW9uTmFtZX1fSGVyYXRvLnZjZi5neiB8IHdjIC1sICNTaXRlcyBmaXhlZCB0byBSRUYgYWxsZWxlID0gMTQwNQpiY2Z0b29scyB2aWV3IC1IIC1jNDAgJHtyZWdpb25OYW1lfV9IZXJhdG8udmNmLmd6IHwgd2MgLWwgI1NpdGVzIGZpeGVkIHRvIEFMVCBhbGxlbGUgPSA3NgoKI0NyZWF0ZSBzaXRlcyBmaWxlIAojVVNBR0U6IFJzY3JpcHQgdmNmMnNpdGVzLlIgPHNhbXBsZS50eHQ+IDxpbnB1dC5ndD4gPGNocj4gPGJlZ2luPiA8ZW5kPgpSc2NyaXB0ICR3b3JrZGlyL3NjcmlwdHMvdmNmMnNpdGVzLlIgJHdvcmtkaXIvc2FtcGxlL2FsbF9zYW1wbGUudHh0ICR7cmVnaW9uTmFtZX1fSGVyYXRvX3ZhcmlhbnRzLmd0ICRjaHJvbSAkY2hyb21TdGFydCAkY2hyb21FbmQKY2F0IDwoaGVhZCAtMiAke3JlZ2lvbk5hbWV9X0hlcmF0b192YXJpYW50c19SZWZBbHQuc2l0ZXMpIDwoY3V0IC1mMSwyIDwodGFpbCArMyAke3JlZ2lvbk5hbWV9X0hlcmF0b192YXJpYW50c19SZWZBbHQuc2l0ZXMpKSA+IC4uLyR7cmVnaW9uTmFtZX1fSGVyYXRvLnNpdGVzCgojIyBDcmVhdGUgbWFzayBmaWxlCmJjZnRvb2xzIHZpZXcgLUggJHtyZWdpb25OYW1lfV9IZXJhdG9fdmFyaWFudHMudmNmLmd6IHwgYXdrICckMCAhfiAvXiMvIHtwcmludCAkMSwkMi0xLCQyfScgfCBiZWRvcHMgLWQgPChlY2hvIC1lICIkY2hyb21cdCQoKCRjaHJvbVN0YXJ0LTEpKVx0JGNocm9tRW5kIikgLSB8IGJnemlwID4gLi4vJHtyZWdpb25OYW1lfV9IZXJhdG9fbWFzay5iZWQuZ3oKYGBgCgojIyMjIElucHV0IHBhcmFtZXRlcnMKSW4gb3JkZXIgdG8gcnVuIEFSR3dlYXZlciwgd2UgY29uc2lkZXIgKiRcbXUkKiAobXV0YXRpb24gcmF0ZSkgPSAkMi45IFx0aW1lcyAxMF57LTl9JCBwZXIgYnAgcGVyIGdlbmVyYXRpb24sIGFuZCBpdHMgcmF0aW8gdG8gcmVjb21iaW5hdGlvbiByYXRlLCAkXGZyYWN7XG11fXtyfSQgPSAxLiBXZSBlc3RpbWF0ZSAkTl9lJCBieSBjYWxjdWxhdGluZyBUYWppbWEncyAkXHBpJCAoPSAqJDROX2UgciQqKSBmcm9tIHRoZSBuZXV0cmFsIHJlZ2lvbi4gKiRccGkkKiA9IDAuMDIyNTA0OSwgJE5fZSQgPSAxOTQwMDc4LiBUaGUgdG90YWwgbWFwIGxlbmd0aCBvZiBib3RoICpvcHRpeCogYW5kIG5ldXRyYWwgcmVnaW9uIGlzIDAuMDEyNjI2MDIgY00uIChzZWUgKi5SbWQqIGZpbGUgZm9yIGZ1bGwgY29kZSkKYGBge2Jhc2gsIGVjaG89Rn0KIyMgQ2FsY3VsYXRpbmcgcGkgZnJvbSBvcmlnaW5hbCBIZXJhdG8xNjAzIHNjYWZmb2xkIHBvczozLjQ1LTMuNTUgKDFNQikKIyBUaGlzIG91dHB1dHMgcGkgcGVyIHNpdGUgCnZjZnRvb2xzIC0tZ3p2Y2YgJHdvcmtkaXIvVkNGcy9QQzA2Ml9tZXJnZWRfSGVyYXRvMTYwMy4zLjQ1TWIuUEwuQUQuSEFQQ1VUMi52Y2YuZ3ogXAotLXNpdGUtcGkgXAotLWtlZXAgJHdvcmtkaXIvc2FtcGxlL2FsbF9zYW1wbGUudHh0IFwKLS1vdXQgSGVyYXRvMTYwMwojIFN1bSBvZiBwaSBlc3RpbWF0ZXMgYWNyb3NzIGFsbCBzaXRlcwphd2sgJ3tTVU0rPSQzfSBFTkQge3ByaW50IFNVTX0nIEhlcmF0bzE2MDMuc2l0ZXMucGkgCmBgYApgYGB7ciwgZWNobz1GfQojIyBDYWxjdWxhdGlnIE5lIGZyb20gSGVyYXRvMTYwMzozNDUwMDAwLTM1NTAwMDAKcj0yLjllLTA5ICNyZWNvbWJpbmF0aW9uIHJhdGUKTD0zNTUwMDAwLTM0NTAwMDAgI0dlbm9taWMgbGVuZ3RoCm49NDAgIyBuby4gb2Ygc2FtcGxlcwpwaV9zdW0gPSAyMjUwLjQ5ICMgU3VtIG9mIHBpIGVzdGltYXRlcyBhY3Jvc3MgYWxsIHNpdGVzCnBpID0gcGlfc3VtL0wgI3BpIGVzdGltYXRlClM9MTA1NzEgIyBObyBvZiBzZWdncmVnYXRpbmcgc2l0ZXMgaW4gdGhpcyByZWdpb24gCk5lX3RhamltYT1waS8oNCpyKSAKTmVfd2F0dGVyc29uPVMvKDQqcipMKSooc3VtKGMoMToobi0xKSleKC0xKSkpXi0xICMgV2F0dGVyc29uJ3MgTmUgZm9yIHNhbml0eSBjaGVjawpjYXQocGksIE5lX3RhamltYSwgTmVfd2F0dGVyc29uLCBOZV90YWppbWEvTmVfd2F0dGVyc29uKSAgCiMgMC4wMjI1MDQ5IDE5NDAwNzggMjE0MjQzMyAwLjkwNTU0ODgKCiMjIENhbGN1bGF0aW5nIG1hcCBsZW5ndGgKMi45ZS05KjEwMCo0MzUzOApgYGAKTW9yZW92ZXIsIEFSR3dlYXZlciBhbGxvd3MgY29hbGVzY2VuY2UgYW5kIHJlY29tYmluYXRpb24gZXZlbnRzIHRvIHRha2UgcGxhY2Ugb25seSBhdCBkaXNjcmV0aXplZCB0aW1lIHBvaW50cywgdGhhdCBhcmUgZGVmaW5lZCBieSBhbiBleHBvbmVudGlhbCBmdW5jdGlvbiwgJHQoaSk9XGZyYWMge2V4cChcZnJhY3sgaX17S+KIkjF9bG9nKDErXGRlbHRhIHRfe21heH0pKeKIkjF9e1xkZWx0YX0kOyBmb3IgKksqIHRpbWUgcG9pbnRzIGFuZCAkaVxpbntcezAsIDEsIOKApiwgS+KIkjFcfX0kLiBWZXJ5IHNtYWxsIHZhbHVlcyBvZiAkXGRlbHRhICggPFxmcmFjIHsxfXt0X3ttYXh9fSkkIHdpbGwgeWllbGQgcm91Z2hseSBsaW5lYXIgZGlzdHJpYnV0aW9uIG9mIHRpbWVzLCB3aGVyZWFzIGxhcmdlciB2YWx1ZXMgb2YgJFxkZWx0YSQgd2lsbCBwbGFjZSBtb3JlIHRpbWUgcG9pbnRzIGluIHJlY2VudCBwYXN0IGFuZCBsZXNzIGluIGRlZXAgcGFzdC4gRm9yIHRoaXMgYW5hbHlzaXMsIHdlIHNldCAqSyogPSAzMCwgdGhlIG1heGltdW0gdGltZSBmb3IgdG90YWwgY29hbGVzY2VuY2UgKCokdF97bWF4fSQqKSA9IDIwKiROX2UkKiwgYW5kIHRoZSBzaGFwZSBwYXJhbWV0ZXIgKCokXGRlbHRhJCopID0gMC4wMS4gCmBgYHtyIGZpZzEsICBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD02LCBlY2hvPUYsIHJlc3VsdHMgPSBGfQp0aW1lcG9pbnRzPWZ1bmN0aW9uKEssIGRlbHRhLCB0bWF4KXsoZXhwKChzZXEoSyktMSkvKEstMSkqbG9nKDErZGVsdGEqKHRtYXgpKSktMSkvZGVsdGF9IAoKcGFyKG1hciA9IGMoNSwgNCwgNCwgNCkgKyAxKQpOZT0xOTQwMDc4OyBLPTMwOyB0bWF4PTIwKk5lOyAKI2RhdGEuZnJhbWUoTmUyID0gdGltZXBvaW50cyhLLCAxZS0yLCB0bWF4MikvTmUyLCB0aW1lID0gdGltZXBvaW50cyhLLCAxZS0yLCB0bWF4MikpCnBsb3Qoc2VxKEspLHRpbWVwb2ludHMoSywgMWUtMiwgdG1heCkvTmUsIHlsaW09YygwLDIwKSwgeWxhYiA9ICJUaW1lIChOZSkiLCB4bGFiID0gIlRpbWUgc3RlcHMiLCB0eXBlID0gJ28nLCBwY2g9MjAsIGNvbD0iYmxhY2siLCBsd2Q9MywgbWFpbj0iRGlzY3JldGUgVGltZSBQb2ludHMiKSArCiAgYWJsaW5lKGg9MSwgbHdkPTIsIGNvbD0icmVkIikgKwogIGF4aXMoc2lkZSA9IDQsIGF0PWMoMCwgMWU3LCAyZTcsIDNlNywgNGU3KS9OZSwgbGFiZWxzPWMoMCwxZTcsIDJlNywgM2U3LCA0ZTcpKSArCiAgbXRleHQoIlRpbWUgKGdlbmVyYXRpb25zKSIsIHNpZGUgPSA0LCBsaW5lID0gMykKYGBgCioqRmlnIFMxOioqIERpc2NyZXRlIHRpbWUgcG9pbnRzIGZvciBBUkd3ZWF2ZXIgYW5hbHlzaXMgLSAzMCB0aW1lIHN0ZXBzLCAkTl9lJCA9IDE5NDAwNzgsIExlZnQgeS1heGlzIHNob3dzIHRoZSB0aW1lIHBvaW50cyBpbiAkTl9lJCwgd2hpbGUgcmlnaHQgeS1heGlzIGluIG51bWJlciBvZiBnZW5lcmF0aW9ucy4gUmVkIGxpbmUgZGVub3RlcyAxJE5fZSQuCgoKCiMjIyMgUnVuIEFSR3dlYXZlcgoKQVJHd2VhdmVyIGlzIHJ1biBmb3IgNTAwMCBpdGVyYXRpb25zIGFuZCB0aGVuIHJlc3VtZWQgZm9yIGFub3RoZXIgNTAwMCBpdGVyYXRpb25zIGZvciB0aGUgKm9wdGl4KiByZWdpb24sIHdoZXJlYXMgb25seSA1MDAwIGl0ZXJhdGlvbnMgZm9yIHRoZSBuZXV0cmFsIHJlZ2lvbi4gCmBgYHtiYXNoLCBlY2hvPVR9CiMgUnVuIEFSR3dlYXZlcgp+Ly5sb2NhbC9iaW4vYXJnLXNhbXBsZSAtcyAgc2l0ZXMvJHtyZWdpb25OYW1lfV9IZXJhdG8uc2l0ZXMgXAoJLS1tYXNrbWFwIG1hc2tzLyR7cmVnaW9uTmFtZX1fSGVyYXRvX21hc2suYmVkLmd6IFwKCS1OIDE5NDAwNzggXAoJLW0gMi45ZS05IFwKCS1yIDIuOWUtOSBcCgktLW50aW1lcyAzMCBcCgktLW1heHRpbWUgJCgoMTk0MDA3OCoyMCkpIFwKCS0taXRlcnMgNTAwMCBcCgktLWRlbHRhIDAuMDEgXAoJLS1vdXRwdXQge3JlZ2lvbk5hbWV9L3NhbXBsZS8ke3JlZ2lvbk5hbWV9CgojIFJlc3VtZSBBUkd3ZWF2ZXIgZm9yIG1vcmUgaXRlcmF0aW9ucwp+Ly5sb2NhbC9iaW4vYXJnLXNhbXBsZSAtcyBzaXRlcy8ke3JlZ2lvbk5hbWV9X0hlcmF0by5zaXRlcyBcCgktLW1hc2ttYXAgbWFza3MvJHtyZWdpb25OYW1lfV9IZXJhdG9fbWFzay5iZWQuZ3ogXAoJLU4gMTk0MDA3OCBcCgktbSAyLjllLTkgXAoJLXIgMi45ZS05IFwKCS0tbnRpbWVzIDMwIFwKCS0tbWF4dGltZSAkKCgxOTQwMDc4KjIwKSkgXAoJLS1pdGVycyAxMDAwMCBcCgktLWRlbHRhIDAuMDEgXAoJLS1vdXRwdXQge3JlZ2lvbk5hbWV9L3NhbXBsZS8ke3JlZ2lvbk5hbWV9IFwKCS0tcmVzdW1lCmBgYAoKCgojIyBBbmFseXNpcyBvZiBBUkd3ZWF2ZXIgb3V0cHV0CgpgYGB7cn0KIyMgTG9hZCBwYWNrYWdlcyBhbmQgaW5pdGlhdGUgZnVuY3Rpb25zCnNvdXJjZShmaWxlID0gIn4vUHJvai1EZWYtSGFwbG8vc2NyaXB0cy9mdW5jdGlvbnMuUiIpCmBgYAoKIyMjIyBNQ01DIHN1bW1hcnkKClZpc3VhbGl6aW5nIHRoZSB0cmFjZXMgb2YgbGlrZWxpaG9vZCwgcHJpb3IgYW5kIGpvaW50IHByb2JhYmlsaXRpZXMgZnJvbSB0aGUgTUNNQyBpdGVyYXRpb25zLCB3ZSBkZWNpZGVkIHRvIHNldCB0aGUgZmlyc3QgMzAwMCBpdGVyYXRpb25zIGFzIGJ1cm5pbi4gVGhlIHBsb3QgYmVsb3cgaXMgZm9yIHRoZSAqb3B0aXgqIHJlZ2lvbi4KYGBge3IgZmlnMiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTUsIGVjaG89RiwgbWVzc2FnZT1GLCByZXN1bHRzPUZ9CiNNQ01DIHN1bW1hcnkKbWNtY19zdW1tYXJ5IDwtICJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9zYW1wbGUvb3B0aXhfbmV3TmUuc3RhdHMiCnBsb3RUcmFjZXMobWNtY19zdW1tYXJ5LCBzdGF0cz1jKCJwcmlvciIsICJsaWtlbGlob29kIiwgImpvaW50IiwgInJlY29tYnMiLCAiYXJnbGVuIiwgIm5vbmNvbXBhdHMiKSkKYGBgCioqRmlnIFMyOioqIFRyYWNlcyBhY3Jvc3MgYWxsIE1DTUMgaXRlcmF0aW9ucyBvZiAqKnByaW9yKiogKGxvZyBwcm9iYWJpbGl0eSBvZiB0aGUgc2FtcGxlZCBBUkcgZ2l2ZW4gdGhlIG1vZGVsKSwgKipsaWtlbGlob29kKiogKGxvZyBwcm9iYWJpbGl0eSBvZiB0aGUgZGF0YSBnaXZlbiB0aGUgc2FtcGxlZCBBUkcpLCAqKmpvaW50KiogKHRvdGFsIGxvZyBwcm9iYWJpbGl0eSBvZiB0aGUgQVJHIGFuZCB0aGUgZGF0YSAoKnByaW9yKiArICpsaWtlbGlob29kKikpLCAqKnJlY29tYnMqKiAobnVtYmVyIG9mIHJlY29tYmluYXRpb24gZXZlbnRzIGluIHRoZSBzYW1wbGVkIEFSRyksICoqYXJnbGVuKiogKHRvdGFsIGxlbmd0aCBvZiBhbGwgYnJhbmNoZXMgc3VtbWVkIGFjcm9zcyBzaXRlcykgYW5kICoqbm9uY29tcGF0cyoqIChudW1iZXIgb2YgdmFyaWFudCBzaXRlcyB0aGF0IGNhbm5vdCBiZSBleHBsYWluZWQgYnkgaW5maW5pdGUgc2l0ZXMgbXV0YXRpb24gbW9kZWwpLgoKIyMjIyBQcm9jZXNzIG91dHB1dCBmcm9tIEFSR3dlYXZlcgpUaGUgQVJHd2VhdmVyIG91dHB1dCAqLnNtYyogZmlsZXMgYXJlIHRoZW4gY29udmVydGVkIHRvIGVhc2lseSBtYW5pcHV0YWJsZSAqLmJlZCogZm9ybWF0IHRvIGV4dHJhY3QgVE1SQ0FzLCB0cmVlcywgcmVjb21pbmF0aW9uIGJyZWFrcG9pbnRzIGFuZCB0b3RhbCB0cmVlIGJyYW5jaCBsZW5ndGhzIGFjcm9zcyBhbGwgaXRlcmF0aW9ucyAoZXhjZXB0IGJ1cm5pbikuIFRoZW4sIDIgc3BlY2lmaWMgaXRlcmF0aW9ucyAoSXRlcmF0aW9uIDgyNTAgYW5kIDkwMDApIGFyZSBjaG9zZW4gZm9yIGZ1cnRoZXIgYW5hbHlzaXMgYW5kIGlkZW50aWZpY2F0aW9uIG9mIGhhcGxvdHlwZSBibG9ja3MgKHNlZSAqLlJtZCogZmlsZSBmb3IgZnVsbCBjb2RlLCBhbmQgYW5hbHlzaXMgZm9yIHRoZSBuZXV0cmFsIHJlZ2lvbikKCmBgYHtiYXNoLCBlY2hvPUZ9CiMjIExvYWQgbW9kdWxlcyBhbmQgc291cmNlIC5iYXNocmMgCm1vZHVsZSBsb2FkIHNhbXRvb2xzIGJlZG9wcyBiY2Z0b29scyBSIApzb3VyY2Ugfi8uYmFzaHJjCmV4cG9ydCBQWVRIT05QQVRIPSRIT01FLy5sb2NhbC9iaW4KYGBgCgpgYGB7YmFzaCBlY2hvPVR9CiMjIyMgT1BUSVggIyMjIwoKIyBMb2FkIHZhcmlhYmxlcwp3b3JrZGlyPSRIT01FL1Byb2otRGVmLUhhcGxvCnByZWZpeD1vcHRpeF9uZXdOZQpyZWdpb25OYW1lPW9wdGl4CmNocm9tPUhlcmF0bzE4MDEKY2hyb21TdGFydD0xMzYyMDY3CmNocm9tRW5kPTE0MDU2MDUKCiMgQ29udmVydCAuc21jIHRvIC5iZWQgZm9ybWF0IGZvciBhbGwgaXRlcmF0aW9ucwpjZCAkd29ya2Rpci9vcHRpeF9uZXdydW4vJHByZWZpeApzbWMyYmVkLWFsbCAkd29ya2Rpci9vcHRpeF9uZXdydW4vJHByZWZpeC9zYW1wbGUvJHByZWZpeAoKIyMgQ2hlY2sgbWNtYyBzdGF0cyB0byBjaGVjayBidXJuaW4KYnVybmluPTMwMDAKIyBDb21wdXRlIFRNUkNBIGVzdGltYXRlcyBmb3IgYmV0d2VlbiBhbmQgd2l0aGluIHBvcHVhbHRpb25zIGZyb20gYWxsIGl0ZXJhdGlvbnMKZm9yIHBvcCBpbiBhbGxfc2FtcGxlIEhlcmF0b19ub3RhYmlsaXMgSGVyYXRvX2xhdGl2aXR0YTsgZG8KICAgIGVjaG8gU3VtbWFyaXppbmcgJHBvcAogICAgYXJnLXN1bW1hcml6ZSAtLWFyZy1maWxlIC4vc2FtcGxlLyRwcmVmaXguYmVkLmd6IFwKCQkJIC0tc3Vic2V0LWluZHMgJHdvcmtkaXIvc2FtcGxlLyRwb3AudHh0IFwKCQkJIC0tbG9nLWZpbGUgLi9zYW1wbGUvJHByZWZpeC5sb2cgXAoJCQkgLS10bXJjYSBcCgkJCSAtLWJ1cm5pbiAkYnVybmluIFwKCQkJIC0tbWVhbiAtLXN0ZGV2IC0tcXVhbnRpbGUgMC4wNSwwLjUsMC45NSB8XAoJCWJnemlwID4gJHByZWZpeC50bXJjYS4kcG9wLmJlZC5negoJCWVjaG8gIiAtPiBEb25lIgpkb25lCgojIyBUaGUgc2FtZSBpcyByZXBlYXRlZCBmb3IgdGhlIG5ldXRyYWwgcmVnaW9uIGJlbG93CmBgYAoKYGBge2Jhc2ggZWNobz1UfQojIyBDb21wdXRlIFRNUkNBLCBhbmQgYnJhbmNoIGxlbmd0aCBmcm9tIGluZGl2aWR1YWwgaXRlcmF0aW9ucwpzdGF0c19saXN0PSh0bXJjYSBicmFuY2hsZW4pCml0ZXJzX2xpc3Q9KDgyNTAgOTAwMCkKCmZvciBwb3AgaW4gYWxsX3NhbXBsZSBIZXJhdG9fbm90YWJpbGlzIEhlcmF0b19sYXRpdml0dGE7IGRvCiAgICBlY2hvIFN1bW1hcml6aW5nICRwb3AKICAgIGZvciBzYW1wbGVfbm8gaW4gJHtpdGVyc19saXN0WypdfTsgZG8KICAgIAllY2hvIC1uICJDb21wdXRpbmcgJHNhbXBsZV9ubyIKICAgIAlmb3Igc3RhdCBpbiAke3N0YXRzX2xpc3RbKl19OyBkbwogICAgCSAgZWNobyAtbiAiQ29tcHV0aW5nICRzdGF0IgogICAgCSAgYXJnLXN1bW1hcml6ZSAtLWFyZy1maWxlIC4vc2FtcGxlLyRwcmVmaXguYmVkLmd6IFwKCQkJICAgIC0tc3Vic2V0LWluZHMgJHdvcmtkaXIvc2FtcGxlLyRwb3AudHh0IFwKCQkJICAgIC0tc2FtcGxlICRzYW1wbGVfbm8gXAoJCQkgICAgLS1sb2ctZmlsZSAuL3NhbXBsZS8kcHJlZml4LmxvZyBcCgkJCSAgICAtLSRzdGF0IFwKCQkJICAgIC0tbWVhbiAtLXF1YW50aWxlIDAuMDUsMC41LDAuOTUgfFwKCQkJICBiZ3ppcCA+ICRwcmVmaXguJHN0YXQuJHBvcC4ke3NhbXBsZV9ub30uYmVkLmd6CgkJCSAgZWNobyAiIC0+IERvbmUiCgkJCWRvbmUKICAgIGRvbmUKZG9uZQpgYGAKCmBgYHtiYXNoIGVjaG89Rn0KIyMgR2V0IHRyZWVzIGZyb20gaXRlcmF0aW9uIDgwMDAgYW5kIDkwMDAKemNhdCAkcHJlZml4LjgwMDAuc21jLmd6ID4gJHByZWZpeC44MDAwLnNtYwp0YWlsICszICRwcmVmaXguODAwMC5zbWMgfCBncmVwIFRSRUUgPiAkcHJlZml4LjgwMDBfdHJlZXMudHh0CnRhaWwgKzMgJHByZWZpeC44MDAwLnNtYyB8IGdyZXAgU1BSID4gJHByZWZpeC44MDAwX1NQUi50eHQKCnpjYXQgJHByZWZpeC45MDAwLnNtYy5neiA+ICRwcmVmaXguNTAwMC5zbWMKdGFpbCArMyAkcHJlZml4LjkwMDAuc21jIHwgZ3JlcCBUUkVFID4gJHByZWZpeC45MDAwX3RyZWVzLnR4dAp0YWlsICszICRwcmVmaXguOTAwMC5zbWMgfCBncmVwIFNQUiA+ICRwcmVmaXguOTAwMF9TUFIudHh0Cgp6Y2F0ICRwcmVmaXguODI1MC5zbWMuZ3ogPiAkcHJlZml4LjgyNTAuc21jCnRhaWwgKzMgJHByZWZpeC44MjUwLnNtYyB8IGdyZXAgVFJFRSA+ICRwcmVmaXguODI1MF90cmVlcy50eHQKdGFpbCArMyAkcHJlZml4LjgyNTAuc21jIHwgZ3JlcCBTUFIgPiAkcHJlZml4LjgyNTBfU1BSLnR4dAoKemNhdCAkcHJlZml4LjkyMDAuc21jLmd6ID4gJHByZWZpeC45MjAwLnNtYwp0YWlsICszICRwcmVmaXguOTIwMC5zbWMgfCBncmVwIFRSRUUgPiAkcHJlZml4LjkyMDBfdHJlZXMudHh0CnRhaWwgKzMgJHByZWZpeC45MjAwLnNtYyB8IGdyZXAgU1BSID4gJHByZWZpeC45MjAwX1NQUi50eHQKYGBgCgpgYGB7ciBlY2hvPUYsIHJlc3VsdHM9RiwgbWVzc2FnZT1GLCBpbmNsdWRlPUZ9CiNNQ01DIHN1bW1hcnkgZm9yIHRoZSBuZXV0cmFsIHJlZ2lvbgptY21jX3N1bW1hcnlfbmV1dHJhbCA8LSAifi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9zYW1wbGUvSGVyYXRvMTYwMy0xX25ld05lLnN0YXRzIgpwbG90VHJhY2VzKG1jbWNfc3VtbWFyeV9uZXV0cmFsLCBzdGF0cz1jKCJwcmlvciIsICJsaWtlbGlob29kIiwgImpvaW50IiwgInJlY29tYnMiLCAiYXJnbGVuIiwgIm5vbmNvbXBhdHMiKSkKYGBgCgpgYGB7YmFzaCBlY2hvPUZ9CiMjIyMgSGVyYXRvMTYwMyAjIyMjCgojIENvbnZlcnQgLnNtYyB0byAuYmVkIGZvcm1hdCBmb3IgYWxsIGl0ZXJhdGlvbnMKc21jMmJlZC1hbGwgfi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9zYW1wbGUvSGVyYXRvMTYwMy0xX25ld05lCgojIFNldCB2YXJpYWJsZQp3b3JrZGlyPSRIT01FL1Byb2otRGVmLUhhcGxvCnByZWZpeD1IZXJhdG8xNjAzLTFfbmV3TmUKCiMgQ2hlY2sgbWNtYyBzdGF0cyB0byBjaGVjayBidXJuaW4KYnVybmluPTIwMDAKCiMgQ29tcHV0ZSBUTVJDQSBlc3RpbWF0ZXMgZm9yIGJldHdlZW4gYW5kIHdpdGhpbiBwb3B1YWx0aW9ucyBmcm9tIGFsbCBpdGVyYXRpb25zCmZvciBwb3AgaW4gYWxsX3NhbXBsZSBIZXJhdG9fbm90YWJpbGlzIEhlcmF0b19sYXRpdml0dGE7IGRvCiAgICBlY2hvIFN1bW1hcml6aW5nICRwb3AKICAgIGFyZy1zdW1tYXJpemUgLS1hcmctZmlsZSAuL3NhbXBsZS8kcHJlZml4LmJlZC5neiBcCgkJCSAtLXN1YnNldC1pbmRzICR3b3JrZGlyL3NhbXBsZS8kcG9wLnR4dCBcCgkJCSAtLWxvZy1maWxlIC4vc2FtcGxlLyRwcmVmaXgubG9nIFwKCQkJIC0tdG1yY2EgXAoJCQkgLS1idXJuaW4gJGJ1cm5pbiBcCgkJCSAtLW1lYW4gLS1zdGRldiAtLXF1YW50aWxlIDAuMDUsMC41LDAuOTUgfFwKCQliZ3ppcCA+ICRwcmVmaXgudG1yY2EuJHBvcC5iZWQuZ3oKCQllY2hvICIgLT4gRG9uZSIKZG9uZQpgYGAKCmBgYHtiYXNoIGVjaG89Rn0KIyMgR2V0IHNhbXBsZSBJRHMKemNhdCAkcHJlZml4Ljk1MDAuc21jLmd6IHwgaGVhZCAtMiA+IC4uLy4uLy4uL3NhbXBsZS9uZXdBUkdzYW1wbGVJRC50eHQKYGBgCgpgYGB7ciwgZWNobz1GfQojIyBSZWFkIHNhbXBsZSBJRHMgYW5kIGFzc2lnbiBjb2xvdXJzIGFuZCBJRHMgCiMgUmVhZCBzYW1wbGVzIC0tLS0Kc2FtcElEIDwtIHJlYWQudGFibGUoIn4vUHJvai1EZWYtSGFwbG8vc2FtcGxlL2FsbC5uZXdJRC50eHQiKQpzaG9ydElEIDwtIHJlYWQudGFibGUoIn4vUHJvai1EZWYtSGFwbG8vc2FtcGxlL3Nob3J0SUQudHh0IikKc2FtcElEIDwtIGNiaW5kKHNhbXBJRCxzaG9ydElEKQpjb2xuYW1lcyhzYW1wSUQpIDwtIGMoIklEIiwicGxvdElEIiwic2hvcnRJRCIpCnNhbXBJRCRwb3AgPC0gYyhyZXAoIkhlcmF0b19ub3RhYmlsaXMiLCAyMCksIHJlcCgiSGVyYXRvX2xhdGl2aXR0YSIsIDIwKSkKc2FtcElEJGNvbCA8LSBjKHJlcCgiI0NDQ0MwMCIsIDIwKSwgcmVwKCIjQzAwQzI4IiwgMjApKQojc2FtcElECgojIE1ha2UgbGlzdCBvZiBpbmlkdmlkdWFscyB0byBhc2lnbiBjb2xvdXJzIC0tLS0KaW5kQ29sb3VyPWxpc3QoKQpmb3IgKGlkIGluIHNhbXBJRCRJRCl7aW5kQ29sb3VyW1tpZF1dIDwtIHNhbXBJRFt3aGljaChzYW1wSUQkSUQ9PWlkKSwiY29sIl19CmluZENvbG91cgoKIyBNYWtlIGxpc3Qgb2YgaW5kaXZpZHVhbHMgdG8gYXNpZ24gbmFtZXMgLS0tLQppbmRMYWJlbD1saXN0KCkKZm9yIChpZCBpbiBzYW1wSUQkSUQpe2luZExhYmVsW1tpZF1dIDwtIHNhbXBJRFt3aGljaChzYW1wSUQkSUQ9PWlkKSwic2hvcnRJRCJdfQojaW5kTGFiZWwKCiMgQVJHV0VBVkVSIGhhcyBkaWZmZXJlbnQgc2V0cyBvZiBJRHMgZGVwZW5kaW5nIG9uIGl0cyBpbml0aWFsIEFSRyBzYW1wbGUsIHNvIGZpeCB0aGF0ISAtLS0tCmFyZ0lEX25ldyA8LSByZWFkLnRhYmxlKGZpbGUgPSAic2FtcGxlL25ld0FSR3NhbXBsZUlELnR4dCIsIGhlYWRlciA9IFQpCmNvbG5hbWVzKGFyZ0lEX25ldykgPC0gYygiSUQiLCJBUkd3ZWF2ZXJJRCIpCiMgYXJnSURbNDAsMV0gPC0gMQojIGFyZ0lEWzQwLDJdIDwtIHNldGRpZmYoc2FtcElEJElELCBhcmdJRCRJRCkKIyBhcmdJRCRBUkd3ZWF2ZXJJRCA8LSBhcmdJRCRBUkd3ZWF2ZXJJRC0xCnNhbXBJRCA8LSBtZXJnZShzYW1wSUQsYXJnSURfbmV3LGFsbD1ULCBieT0iSUQiKQoKIyBzZXQgSURzIGZvciBmaW5hbCBwbG90IChvbmx5IGluY2x1ZGluZyBsYXRpdml0dGEgaW5kaXZpZHVhbHMpIC0tLS0KaW5kTGFiZWxfQVJHX2xhdD1saXN0KCkKZm9yIChpZCBpbiBzYW1wSUQkQVJHd2VhdmVySUQpe2luZExhYmVsX0FSR19sYXRbW2FzLmNoYXJhY3RlcihpZCldXSA8LSB3aGljaChzYW1wSUQkQVJHd2VhdmVySUQgPT0gaWQpLTIwfQoKCmluZENvbG91cl9hcmdJRHMgPC0gaW5kQ29sb3VyCm5hbWVzKGluZENvbG91cl9hcmdJRHMpIDwtIGFzLmNoYXJhY3RlcihzYW1wSURbLCJBUkd3ZWF2ZXJJRCJdKQppbmRDb2xvdXJfYXJnSURzCiNpbmRDb2xvdXJfYXJnSURzCgpub3RhYmlsaXNfaW5kaXZpZHVhbHMgPC0gc2FtcElEW3doaWNoKHNhbXBJRCRwb3AgPT0gIkhlcmF0b19ub3RhYmlsaXMiKSwiQVJHd2VhdmVySUQiXQpsYXRpdml0dGFfaW5kaXZpZHVhbHMgPC0gc2FtcElEW3doaWNoKHNhbXBJRCRwb3AgPT0gIkhlcmF0b19sYXRpdml0dGEiKSwiQVJHd2VhdmVySUQiXQoKYGBgCgojIyMjIFJlYWQgU05QcwoKU05QcyBhcmUgY2hhbmdlZCBmcm9tIGl0cyBudWNsb2V0aWRlIGFzaWdubWVudCB0byAwLzE7IGJhc2VkIG9uIGFsbGVsZSBmcmVxdWVuY3kgd2l0aGluIHRoZSAqSC5lLmxhdGl2aXR0YSogc2FtcGxlcy4gKEhpZ2hlciBhbGxlbGUgZnJlcXVlbmN5IC0gMSwgTG93ZXIgYWxsZWxlIGZyZXF1ZW5jeSAtIDApCmBgYHtyLCBlY2hvPVR9CiMjIFJlYWQgYWxsIFNOUHMKb3B0aXhfc2l0ZXMgPC0gcmVhZFNpdGVzKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9zaXRlcy9vcHRpeF9IZXJhdG8uc2l0ZXMiKQojCiMjIFJlYWQgYWxsIHNpdGVzIChTTlBzK2ludmFyaWFudCkKb3B0aXhBTExfc2l0ZXMgPC0gcmVhZFNpdGVzKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9zaXRlcy9vcHRpeEFMTF9IZXJhdG8uc2l0ZXMiKQojCiMjIENoYW5nZSBTTlBzIHRvIDAgYW5kIDEgYmFzZWQgb24gbWFqb3IgYWxsZWxlIGluIGxhdGl2aXR0YQpzaXRlczwtIGRhdGEuZnJhbWUocG9zPW9wdGl4X3NpdGVzJHBvcywgb3B0aXhfc2l0ZXMkc2l0ZXMpCmZvciAoc25wSUQgaW4gYygxOm5yb3coc2l0ZXMpKSl7CiAgY2F0KHNucElELCBzaXRlc1tzbnBJRCwncG9zJ10pCiAgYWxsZWxlcyA8LSBzaXRlc1tzbnBJRCxzYW1wSUQkSURdCiAgYWxsZWxlcyA8LSBhcy5mYWN0b3IoYWxsZWxlcykKICAKICBhbGxlbGVDb3VudDEgPC0gc3VtKGFsbGVsZXNbbGF0XSA9PSBsZXZlbHMoYWxsZWxlcylbMV0pCiAgYWxsZWxlQ291bnQyIDwtIHN1bShhbGxlbGVzW2xhdF0gPT0gbGV2ZWxzKGFsbGVsZXMpWzJdKQogIAogIG1hakFsbGVsZSA8LSBpZmVsc2UoYWxsZWxlQ291bnQxID4gYWxsZWxlQ291bnQyLCBsZXZlbHMoYWxsZWxlcylbMV0sIGxldmVscyhhbGxlbGVzKVsyXSkKICBtaW5BbGxlbGUgPC0gc2V0ZGlmZihsZXZlbHMoYWxsZWxlcyksIG1hakFsbGVsZSkKCiAgc2l0ZXNbc25wSUQsd2hpY2goc2l0ZXNbc25wSUQsXSA9PSBtYWpBbGxlbGUpXSA8LSAxCiAgc2l0ZXNbc25wSUQsd2hpY2goc2l0ZXNbc25wSUQsXSA9PSBtaW5BbGxlbGUpXSA8LSAwCn0KYGBgCgpgYGB7ciBpbmNsdWRlPUZ9CnBsb3Qoc2l0ZXMkcG9zLCByZXAoMSwgbnNpdGVzKSwgdHlwZT0nbicsIHlsaW09YygxLDQwKSwgeGxhYiA9ICJQb3NpdGlvbiIsIHlsYWIgPSAiSW5kaXZpZHVhbCBJRCIpICsKICBwbG90X3NucHMoc2l0ZXMsIDEsICIjQzAwQzI4IikgKwogIHBsb3Rfc25wcyhzaXRlcywgMCwgIiNDQ0NDMDAiKSArCiAgZm9yKGkgaW4gc2V0ZGlmZihzaXRlc0FMTCRwb3MsIHNpdGVzJHBvcykpe3BvaW50cyhyZXAoaSw0MCksIDE6NDAsIGNvbCA9ICJibGFjayIsIGNleCA9IDAuNzUpfQpgYGAKCgojIyMjIFRNUkNBCgpXZSBmaXJzdCBleGFtaW5lIHRoZSBUTVJDQSBvZiB0aGUgdG90YWwgdHJlZSBhbmQgdGhlIGluZGl2aWR1YWwgcG9wdWxhdGlvbnMgLSAqSC5lLmxhdGl2aXR0YSogKGluIHJlZCkgYW5kICpILmUubm90YWJpbGlzKiAoaW4geWVsbG93KS4gVW5saWtlIHRoZSBuZXV0cmFsIHJlZ2lvbiAoKkhlcmF0bzE2MDMqKSB3aGVyZSBhbGwgVE1SQ0EgZXN0aW1hdGVzIGFyZSBmYWlybHkgY29uc3RyYWluZWQgYmV0d2VlbiAxIGFuZCAxMCAkTl9lJCwgVE1SQ0EgdHJhY2VzIGZvciBpbmRpdmlkdWFsIHBvcHVsYXRpb25zIGluIHRoZSAqb3B0aXgqIHJlZ2lvbiBleGhpYml0IHNoYWxsb3cgY29hbGVzY2VuY2UgdGltZXMgYXQgbXVsdGlwbGUgcG9zaXRpb25zIHRocm91Z2hvdXQgdGhlIGVudGlyZSB+NTBrYiByZWdpb24uIEluIGNhc2Ugb2YgYSBzZWxlY3RpdmUgc3dlZXBzLCB3aGVyZSBhIGJlbmVmaWNpYWwgbXV0YXRpb24gc3dlZXBzIHRocm91Z2ggdGhlIHBvcHVsYXRpb24sIFRNUkNBIHRlbmRzIHRvIGJlIHNoYWxsb3cgc2luY2UgYWxsIHNhbXBsZXMgaW4gdGhlIHN3ZXB0IHBvcHVsYXRpb24gY29hbGVzY2VzIHF1aWNrbHkgdG8gdGhlIGluaXRpYWwgImx1Y2t5IiBhbmNlc3Rvci4gTW92aW5nIGF3YXkgZnJvbSB0aGUgZm9jYWwgbXV0YXRpb25zLCBsaW5lYWdlcyByZWNvbWJpbmUgYXdheSBmcm9tIHRoZSBzd2VwdCBhbmNlc3RyYWwgYmFja2dyb3VuZC4gVGhlIFRNUkNBIGVzdGltYXRlcyBmcm9tIHRoZSAqb3B0aXgqIHJlZ2lvbiBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHByZXZpb3VzbHkgaWRlbnRpZmllZCBzZWxlY3RlZCByZWdpb24gaW4gKm9wdGl4Ki4gVG8gaW52ZXN0aWdhdGUgZnVydGhlciB0aGUgaGFwbG90eXBlIGJsb2NrIHN0cnVjdHVyZXMsIHdlIGZvY3VzIGludG8gYSAza2IgcmVnaW9uIGF0IG9wdGl4OjEzODU5NjYtMTM4ODk2Ni4gCgpgYGB7ciBmaWczMCwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTEwLCBtZXNzYWdlPUYsIGVjaG89RiwgcmVzdWx0cz1GfQoKIyMjIyBPUFRJWCAjIyMjIC0tLS0KIyBSRUFEIHRtcmNhCnRtcmNhIDwtIHJlYWRBcmdTdW1tYXJ5KCJvcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUudG1yY2EuYWxsX3NhbXBsZS5iZWQuZ3oiKQp0bXJjYV9ub3QgPC0gcmVhZEFyZ1N1bW1hcnkoIm9wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9vcHRpeF9uZXdOZS50bXJjYS5IZXJhdG9fbm90YWJpbGlzLmJlZC5neiIpCnRtcmNhX2xhdCA8LSByZWFkQXJnU3VtbWFyeSgib3B0aXhfbmV3cnVuL29wdGl4X25ld05lL29wdGl4X25ld05lLnRtcmNhLkhlcmF0b19sYXRpdml0dGEuYmVkLmd6IikKCiMjIFNldCBnZW5vbWljIHNwYW4gYW5kIE5lCk5lPTE5NDAwNzgKZ2VuIDwtIHRtcmNhJGNocm9tU3RhcnQKZ2VuX25vdCA8LSB0bXJjYV9ub3QkY2hyb21TdGFydApnZW5fbGF0IDwtIHRtcmNhX2xhdCRjaHJvbVN0YXJ0CgojIyMjIEhlcmF0bzE2MDMtMSAjIyMjIC0tLS0KICAKdG1yY2FfbmV1dHJhbCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9IZXJhdG8xNjAzLTFfbmV3TmUudG1yY2EuYWxsX3NhbXBsZS5iZWQuZ3oiKQp0bXJjYV9ub3RfbmV1dHJhbCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9IZXJhdG8xNjAzLTFfbmV3TmUudG1yY2EuSGVyYXRvX25vdGFiaWxpcy5iZWQuZ3oiKQp0bXJjYV9sYXRfbmV1dHJhbCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9IZXJhdG8xNjAzLTFfbmV3cnVuL0hlcmF0bzE2MDMtMV9uZXdOZS9IZXJhdG8xNjAzLTFfbmV3TmUudG1yY2EuSGVyYXRvX2xhdGl2aXR0YS5iZWQuZ3oiKQoKIyMgU2V0IGdlbm9taWMgc3BhbgpnZW5fbmV1dHJhbCA8LSB0bXJjYV9uZXV0cmFsJGNocm9tU3RhcnQKZ2VuX25vdF9uZXV0cmFsIDwtIHRtcmNhX25vdF9uZXV0cmFsJGNocm9tU3RhcnQKZ2VuX2xhdF9uZXV0cmFsIDwtIHRtcmNhX2xhdF9uZXV0cmFsJGNocm9tU3RhcnQKCiMjIFBsb3QgVE1SQ0EgIC0tLS0KCnBhcihtZnJvdz1jKDIsMSksIGNleC5sYWI9MS41LCBjZXguYXhpcz0xLjIsIGNleC5tYWluPTEuNSkKIyMgb3B0aXgKcGxvdChnZW4sIHRtcmNhJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBsb2c9InkiLCB5bGltPWMoMWUtMiwyMCksIHR5cGU9J24nLCBjb2wgPSAnYmxhY2snLCBsd2Q9MiwgeWF4dD0ibiIsCiAgICAgeGxhYiA9ICJQb3NpdGlvbiAoTUIpIiwgeWxhYiA9ICJUTVJDQSAoTmUpIiwgbWFpbiA9ICJvcHRpeDogMTM2MjA2Ny0xNDA1NjA1ICg0My41a2IpIikgCiAgcG9seWdvbih4ID0gYyhnZW4sIHJldihnZW4pKSwgeSA9IGModG1yY2EkdG1yY2FfcXVhbnRpbGVfMC4wNTAvTmUsIHJldih0bXJjYSR0bXJjYV9xdWFudGlsZV8wLjk1MC9OZSkpLCAKICAgICAgICBjb2wgPSBhZGp1c3Rjb2xvcigiI0UwRTBFMCIsMC40KSwgYm9yZGVyID0gYWRqdXN0Y29sb3IoIiNFMEUwRTAiLCAwLjQpKSArCiAgcG9seWdvbih4ID0gYyhnZW5fbm90LCByZXYoZ2VuX25vdCkpLCB5ID0gYyh0bXJjYV9ub3QkdG1yY2FfcXVhbnRpbGVfMC4wNTAvTmUsIHJldih0bXJjYV9ub3QkdG1yY2FfcXVhbnRpbGVfMC45NTAvTmUpKSwgCiAgICAgICAgY29sID0gYWRqdXN0Y29sb3IoIiNDQ0NDNzUiLDAuNCksIGJvcmRlciA9IGFkanVzdGNvbG9yKCIjQ0NDQzc1IiwgMC40KSkgKwogIHBvbHlnb24oeCA9IGMoZ2VuX2xhdCwgcmV2KGdlbl9sYXQpKSwgeSA9IGModG1yY2FfbGF0JHRtcmNhX3F1YW50aWxlXzAuMDUwL05lLCByZXYodG1yY2FfbGF0JHRtcmNhX3F1YW50aWxlXzAuOTUwL05lKSksIAogICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCIjRkY2NjY2IiwwLjQpLCBib3JkZXIgPSBhZGp1c3Rjb2xvcigiI0ZGNjY2NiIsIDAuNCkpICsKICBsaW5lcyhnZW5fbm90LCB0bXJjYV9ub3QkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIGNvbCA9IGFkanVzdGNvbG9yKCcjQ0NDQzAwJywgMC43KSwgbHdkPTIpICsKICBsaW5lcyhnZW5fbGF0LCB0bXJjYV9sYXQkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIGNvbCA9IGFkanVzdGNvbG9yKCcjQzAwQzI4JywgMC43KSwgbHdkPTIpICsKICBsaW5lcyhnZW4sIHRtcmNhJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBjb2wgPSBhZGp1c3Rjb2xvcignYmxhY2snKSwgbHdkPTAuNSwgKSArCiAgYXhpcyhzaWRlID0gMiwgYXQgPSBjKDAuMDAxLDAuMDEsMC4xLDEsMTApLCBsYWJlbHMgPSBleHByZXNzaW9uKDEwXi0zLDEwXi0yLDEwXi0xLDEwXjAsMTBeMSkpICsKICBhYmxpbmUgKGg9YygxLDIwKSwgbHdkPTEpCiMjIEhlcmF0bzE2MDMtMQpwbG90KGdlbl9uZXV0cmFsLCB0bXJjYV9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBsb2c9InkiLCB5bGltPWMoMWUtMiwyMCksCiAgICAgdHlwZT0nbicsIGNvbCA9ICdibGFjaycsIGx3ZD0yLCB5YXh0PSJuIiwKICAgICB4bGFiID0gIlBvc2l0aW9uIChNQikiLCB5bGFiID0gIlRNUkNBIChOZSkiLCBtYWluID0gIkhlcmF0bzE2MDM6IDM0NTAwMDAtMzQ5MzUzOCAoNDMuNWtiKSIpICArCiAgcG9seWdvbih4ID0gYyhnZW5fbmV1dHJhbCwgcmV2KGdlbl9uZXV0cmFsKSksIHkgPSBjKHRtcmNhX25ldXRyYWwkdG1yY2FfcXVhbnRpbGVfMC4wNTAvTmUsIHJldih0bXJjYV9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuOTUwL05lKSksIAogICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCIjRTBFMEUwIiwwLjQpLCBib3JkZXIgPSBhZGp1c3Rjb2xvcigiI0UwRTBFMCIsIDAuNCkpICsKICBwb2x5Z29uKHggPSBjKGdlbl9ub3RfbmV1dHJhbCwgcmV2KGdlbl9ub3RfbmV1dHJhbCkpLCB5ID0gYyh0bXJjYV9ub3RfbmV1dHJhbCR0bXJjYV9xdWFudGlsZV8wLjA1MC9OZSwgcmV2KHRtcmNhX25vdF9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuOTUwL05lKSksIAogICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCIjQ0NDQzc1IiwwLjQpLCBib3JkZXIgPSBhZGp1c3Rjb2xvcigiI0NDQ0M3NSIsIDAuNCkpICsKICBwb2x5Z29uKHggPSBjKGdlbl9sYXRfbmV1dHJhbCwgcmV2KGdlbl9sYXRfbmV1dHJhbCkpLCB5ID0gYyh0bXJjYV9sYXRfbmV1dHJhbCR0bXJjYV9xdWFudGlsZV8wLjA1MC9OZSwgcmV2KHRtcmNhX2xhdF9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuOTUwL05lKSksIAogICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCIjRkY2NjY2IiwwLjQpLCBib3JkZXIgPSBhZGp1c3Rjb2xvcigiI0ZGNjY2NiIsIDAuNCkpICsKICBsaW5lcyhnZW5fbm90X25ldXRyYWwsIHRtcmNhX25vdF9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBjb2wgPSBhZGp1c3Rjb2xvcignI0NDQ0MwMCcsIDAuNyksIGx3ZD0yKSArCiAgbGluZXMoZ2VuX2xhdF9uZXV0cmFsLCB0bXJjYV9sYXRfbmV1dHJhbCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgY29sID0gYWRqdXN0Y29sb3IoJyNDMDBDMjgnLCAwLjcpLCBsd2Q9MikgKwogIGxpbmVzKGdlbl9uZXV0cmFsLCB0bXJjYV9uZXV0cmFsJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBjb2wgPSBhZGp1c3Rjb2xvcignYmxhY2snKSwgbHdkPTAuNSwgKSArCiAgYXhpcyhzaWRlID0gMiwgYXQgPSBjKDAuMDAxLDAuMDEsMC4xLDEsMTApLCBsYWJlbHMgPSBleHByZXNzaW9uKDEwXi0zLDEwXi0yLDEwXi0xLDEwXjAsMTBeMSkpICsKICBhYmxpbmUgKGg9YygxLDIwKSwgbHdkPTEpCmBgYAoqKkZpZyBTMzoqKiBUTVJDQSAoTmUpIGZvciBlYWNoIHBvc2l0aW9uIGluIHRoZSAqb3B0aXgqICh0b3AgcGFuZWwpIGFuZCB0aGUgbmV1dHJhbCBnZW5vbWljIHJlZ2lvbiAoYm90dG9tIHBhbmVsKS4gQmxhY2sgbGluZTogdG90YWwgVE1SQ0EsIFJlZDogTWVkaWFuIFRNUkNBIGZvciAqSC5lLmxhdGl2aXR0YSosIFllbGxvdzogVE1SQ0EgZm9yICpILmUubm90YWJpbGlzKi4gQ29ycmVzcG9uZGluZyBzaGFkZWQgcmVnaW9ucyBhcmUgdGhlIDAuMDUgYW5kIDAuOTUgcGVyY2VudGlsZSBpbnRlcnZhbHMuICAKCmBgYHtyfQpjaHJvbVN0YXJ0PTEzODU5NjYKY2hyb21FbmQ9MTM4ODk2NgpjaHJvbUlEcyA8LSByYW5nZSh3aGljaChzaXRlcyRwb3MgPj0gY2hyb21TdGFydCAmIHNpdGVzJHBvcyA8PSBjaHJvbUVuZCkpCmZvY2FsX3NpdGVzIDwtIHNpdGVzW2Nocm9tSURzWzFdOmNocm9tSURzWzJdLF0KbnJvdyhmb2NhbF9zaXRlcykgI3RoZXJlIGFyZSAxMzcgU05QcyAKYGBgCgpJbiB0aGUgZm9jYWwgcmVnaW9uLCB0aGVyZSBhcmUgMTM3IFNOUHMuIAoKYGBge3IgZmlnNCwgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTEwLCBtZXNzYWdlPUYsIGVjaG89RiwgcmVzdWx0cz1GfQpwYXIobWZyb3c9YygyLDEpLCBjZXgubWFpbj0xLjUsIGNleC5sYWI9MS41LCBjZXguYXhpcz0gMS4yKQoKcGxvdChnZW4sIHRtcmNhJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBsb2c9InkiLCB5bGltPWMoMWUtMiwyMCksCiAgICAgeGxpbT1jKGNocm9tU3RhcnQsIGNocm9tRW5kKSwKICAgICB0eXBlPSdsJywgY29sID0gJ2JsYWNrJywgbHdkPTIsIAogICAgIHhsYWIgPSAiUG9zaXRpb24gKE1CKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIsIG1haW4gPSAib3B0aXg6IDEzODU5NjYtMTM4ODk2NiAoM2tiKSIpICsKICBsaW5lcyhnZW5fbm90LCB0bXJjYV9ub3QkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIGNvbCA9IGFkanVzdGNvbG9yKCcjQ0NDQzAwJywgMC43KSwgbHdkPTIpICsKICBsaW5lcyhnZW5fbGF0LCB0bXJjYV9sYXQkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIGNvbCA9IGFkanVzdGNvbG9yKCcjQzAwQzI4JywgMC43KSwgbHdkPTIpICsKICBsaW5lcyhnZW4sIHRtcmNhJHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCBjb2wgPSBhZGp1c3Rjb2xvcignYmxhY2snKSwgbHdkPTEgKQoKcGxvdChmb2NhbF9zaXRlcyRwb3MsIHJlcCgxLCBucm93KGZvY2FsX3NpdGVzKSksIHR5cGU9J24nLCB5bGltPWMoMSw0MCksIHhsYWIgPSAiUG9zaXRpb24iLCB5bGFiID0gIkluZGl2aWR1YWwgSUQiKSArCiAgcGxvdF9zbnBzKGZvY2FsX3NpdGVzLCAxLCAiI0MwMEMyOCIpICsKICBwbG90X3NucHMoZm9jYWxfc2l0ZXMsIDAsICIjQ0NDQzAwIikgKwogIGZvcihpIGluIHNldGRpZmYob3B0aXhBTExfc2l0ZXMkcG9zLCBmb2NhbF9zaXRlcyRwb3MpKXtwb2ludHMocmVwKGksNDApLCAxOjQwLCBjb2wgPSAiYmxhY2siLCBjZXggPSAwLjc1KX0KYGBgCgoKKipGaWdTNDoqKiBUTVJDQSBmb3IgZWFjaCBwb3NpdGlvbiBpbiBmb2NhbCBnZW5vbWljIHJlZ2lvbiAob3B0aXg6MTM4NTk2Ni0xMzg4OTY2KS4gU2FtZSBjb2xvdXIgc2NoZW1lcyBhcyBhYm92ZS4gKipUb3AgcGFuZWw6KiogVE1SQ0EgcGxvdCwgKipCb3R0b20gcGFuZWw6KiogU05QcyBpbiBib3RoIHBvcHVsYXRpb25zOyBSRUQgYW5kIFlFTExPVyBhbGxlbGVzIGFyZSB2YXJpYW50IHBvc2l0aW9ucywgY29sb3VyZWQgYWNjb3JkaW5nIHRvIHRoZSByZXNwZWN0aXZlIGhpZ2hlciBhbmQgbG93ZXIgYWxsZWxlIGNvdW50cyBpbiB0aGUgKkguZS5sYXRpdml0dGEqIHBvcHVsYXRpb24uIEJMQUNLIGFsbGVsZXMgYXJlIGZpeGVkIChpbnZhcmlhbnQpIGluIGJvdGggcG9wdWxhdGlvbnMuIEFsbCBvdGhlciBwb3NpdGlvbnMgKGluIHdoaXRlKSBhcmUgdW5rbm93biwgc2luY2UgdGhvc2UgcG9zaXRpb25zIGRvIG5vdCBoYXZlIFNOUCBpbmZvcm1hdGlvbi4gVGhlc2UgdW5rbm93biBwb3NpdGlvbnMgYXJlIG1hc2tlZCB3aGlsZSBydW5uaW5nIEFSR1dlYXZlciwgdGhlcmVmb3JlIHRoZXkgYXJlIHRyZWF0ZWQgYXMgbWlzc2luZyBpbmZvcm1hdGlvbiBhbmQgTk9UIGFzIGludmFyaWFudCBzaXRlcy4gCgpNYXNraW5nIHNpdGVzIGNhbiBoYXZlIGEgY3JpdGljYWwgZWZmZWN0IG9uIHNhbXBsaW5nIEFSR3MsIHNpbmNlIGludmFyaWFudCBzaXRlcyBjYW4gc2hpZnQgcHJpb3JzIHRvd2FyZHMgYSByZWNlbnQgY29hbGVzY2VuY2UgKGJlY2F1c2UgdGhlcmUgaGFzbid0IGJlZW4gZW5vdWdoIHRpbWUgeWV0IGZvciBhIG11dGF0aW9uIHRvIG9jY3VyIGluIGFueSBvZiB0aGUgYnJhbmNoZXMpLCB3aGVyZWFzIG1pc3NpbmcgaW5mb3JtYXRpb24gZG9lcyBub3Qgc2hpZnQgcHJpb3JzIGFuZCB0aGVyZWZvcmUgQVJHcyBhcmUgc2FtcGxlZCBuZXV0cmFsbHkgaW4gdGhvc2UgcmVnaW9ucy4gSW4gdGhlIGFib3ZlIHJlZ2lvbiBvZiAza2IsIHRoZXJlIGFyZSAxMzcgU05QcyBhbmQgMTYgaW52YXJpYW50IHBvc2l0aW9ucy4gT3V0IG9mIHRoZSAxMzcgU05Qcywgb25seSA1OSBTTlBzIGFyZSBzZWdyZWdhdGluZyB3aXRoaW4gdGhlICpILmUubGF0aXZpdHRhKiBwb3B1bGF0aW9uIGluIGZvY3VzLiBCZWxvdyBpcyB0aGUgZm9sZGVkIFNOUCBmcmVxdWVuY3kgc3BlY3RydW0uIApgYGB7ciBmaWc1LCBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD01fQpiYXJwbG90KHRhYmxlKDIwLSh0cjFfc25wcyRtYWpBbGxlbGVDb3VudF9sYXQpKSwgeWxhYiA9ICJObyBvZiBwb3NpdGlvbnMiLCB4bGFiID0gIkFsbGVsZSBDb3VudCIpCmBgYAoqKkZpZ1M1OioqIEZvbGRlZCBTTlAgZnJlcXVlbmN5IHNwZWN0cnVtIG9mIHRoZSBmb2NhbCByZWdpb24sIG9wdGl4OjEzODU5NjYtMTM4ODk2Ni4KCkhlcmVhZnRlciwgYWxsZWxlcyB3aXRoIGxvd2VyIGZyZXF1ZW5jeSB3aXRoaW4gdGhlICpILmUubGF0aXZpdHRhKiBwb3B1bGF0aW9uIGlzIHJlZmVycmVkIHRvIGFzIHRoZSBtaW5vciBhbGxlbGUsIGFuZCBpbmRpdmlkdWFscyB3aG8gc2hhcmUgdGhlIG1pbm9yIGFsbGVsZSBpcyB0aGUgbWlub3IgY2xhZGUuIENvbnZlcnNlbHksIGluZGl2aWR1YWxzIHRoYXQgY2FycnkgdGhhdCBtYWpvciBhbGxlbGUgaXMgY2FsbGVkIG1ham9yIGNsYWRlLiBNaW5vciBhbGxlbGUgaXMgY29kZWQgYXMgMCBhbmQgbWFqb3IgYXMgMS4gCgojIyMjIEdlbmVyYWwgY29tbWVudHMgb24gaWRlbnRpZnlpbmcgaGFwbG90eXBlIGJsb2NrcyBhcyBlZGdlcyBmcm9tIGVtcGlyaWNhbCBkYXRhc2V0cwpJbiBhIHNlcmllcyBvZiBtYXJnaW5hbCBnZW5lYWxvZ2ljYWwgdHJlZXMgYWxvbmcgdGhlIGdlbm9tZSwgYW4gZWRnZSBpcyBjb25zaWRlcmVkIHVuaXF1ZSBpZiBpdCBvcmlnaW5hdGVzIGF0IGEgcGFydGljdWxhciBjb2FsZXNjZW50IHRpbWUgcG9pbnQsIGFuZCBpcyBhbmNlc3RyYWwgdG8gYSBnaXZlbiBzZXQgb2Ygc2FtcGxlcy4gVW5pcXVlIGVkZ2VzIGV4dGVuZCBhbG9uZyB0aGUgZ2Vub21lIHVudGlsIHJlY29tYmluYXRpb24gYnJlYWtzIHRoZW0gZG93biwgYnV0IGNhbiBmdXJ0aGVyIHJlLWVtZXJnZSBpbiBhIGRpc2p1bmN0IGdlbm9taWMgcmVnaW9uIGlmIHJlY29tYmluYXRpb24gYnJpbmdzIHRoZSBnaXZlbiBzZXQgb2Ygc2FtcGxlcyBiYWNrIHRvZ2V0aGVyLiBNb3Jlb3ZlciwgZWFjaCBlZGdlIGdvZXMgYmFjayBpbiB0aW1lIHVudGlsIGZ1cnRoZXIgY29hbGVzY2VuY2UgZXZlbnRzIGluIGRlZXBlciBwYXN0LiAoRmlndXJlIDMgaW4gbWFpbiB0ZXh0LCBhbmQgQm94IDIpLiBVbmxpa2UgYSBzaW11bGF0aW9uIHdoZXJlIHRoZSBncm91bmQgdHJ1dGggYWJvdXQgb3JpZ2luIGFuZCBleHRlbmQgb2YgZWFjaCB1bmlxdWUgZWRnZSBpcyBwcmVjaXNlbHkga25vd24sIGluZmVycmVkIGVkZ2VzIGZyb20gc2FtcGxlZCBBUkdzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGRhdGEsIGJ1dCBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydGVkIGJ5IHRoZSBTTlAgY29uZmlndXJhdGlvbi4gVGhvc2UgZWRnZXMgb24gd2hpY2ggbXV0YXRpb25zIGFwcGVhciBjYW4gYmUgcmVsaWFibHkgaW5mZXJyZWQgZ2l2ZW4gdGhlIFNOUCBjb25maWd1cmF0aW9uLCB3aGVyZWFzIHRoZSByZXN0IGFyZSByYW5kb20gc2FtcGxlcyBmcm9tIHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uIGFuZCBpcyBzdWJqZWN0IHRvIHN0b2NoYXN0aWMgbm9pc2UsIHN1Z2dlc3RpbmcgaW5mZXJlbmNlIGJlIG1hZGUgZnJvbSBlZGdlcyBzdXBwb3J0ZWQgYnkgU05Qcy4gCgpBUkd3ZWF2ZXIgb3V0cHV0cyBnZW5lYWxvZ2ljYWwgdHJlZXMgYWxvbmcgdGhlIGdlbm9tZSwgYW5kIGVhY2ggcmVjb21iaW5hdGlvbiBicmVha3BvaW50cyBhbmQgdGltZS4gRm9yIGVhY2ggdHJlZSwgbm9kZXMgYW5kIHRpcHMgYXJlIGxhYmVsbGVkIHVuaXF1ZWx5LiBGb3IgZWFjaCByZWNvbWJpbmF0aW9uIGV2ZW50LCB0aGUgbmV3IGFuY2VzdHJhbCBub2RlIElEIG9mIHRoZSByZWNvbWJpbmVkIGJyYW5jaCBiZWNvbWVzIHRoZSBvbGQgbm9kZSBJRCBmcm9tIHRoZSBwcmV2aW91cyB0cmVlLiBUaGVyZWZvcmUsIGFjcm9zcyB0cmVlcywgYWxsIG5vZGVzIGV4Y2VwdCB0aGUgb25lIHRoYXQgdW5kZXJ3ZW50IHJlY29tYmluYXRpb24gaW4gdGhlIHByZWNlZGluZyB0cmVlIHNoYXJlcyB0aGUgc2FtZSBub2RlIElELiBBbHRob3VnaCBpdCBpcyBlYXN5IHRvIHRyYWNrIHVuaXF1ZSBub2RlcyBvdmVyIGEgc2hvcnQgZ2Vub21pYyBkaXN0YW5jZSBieSBqdXN0IHRyYWNraW5nIHRoZSBTUFIgKHN1YnRyZWUgcHJ1bmUgYW5kIHJlZ3JhZnQpIGV2ZW50OyBvbmUgbmVlZHMgdG8gZGV2ZWxvcCBtb3JlIHNvcGhpc3RpY2F0ZWQgY29kZS9hbGdvcml0aG0gdG8gdHJhY2sgb3ZlciBsb25nZXIgZGlzdGFuY2VzIHRoYW4gY29uc2lkZXJlZCBpbiB0aGlzIGFuYWx5c2lzICh3aGljaCB3ZSBkaWQgbm90IGF0dGVtcHQgaGVyZSEpLiBJbnN0ZWFkLCB3ZSBsZXZlcmFnZWQgdGhlIGFydGlmYWN0IGxlZnQgYmVoaW5kIGJ5IHRpbWUtZGlzY3JldGl6YXRpb24gaW4gQVJHd2VhdmVyIHRvIGlkZW50aWZ5IHVuaXF1ZSBlZGdlcy4gCgpUaGUgZXhhY3Qgc3RlcC1ieS1zdGVwIHByb2Nlc3MgdGhhdCB3ZSB1c2VkIHRvIGlkZW50aWZ5IGVkZ2VzIHN1cHBvcnRlZCBieSBTTlBzIGlzIGRlc2NyaWJlZCBiZWxvdy4gV2Ugc3BlY2lmaWNhbGx5IGNob3NlIDIgc2VwYXJhdGUgaXRlcmFpb25zIChpdGVyYXRpb24gSUQgLSA4MjUwIGFuZCA5MDAwKSwgc3VmZmljaWVudGx5IHNlcGFyYXRlZCB0byBhdm9pZCBhdXRvY29yZWxhdGlvbnMgYmV0d2VlbiB0aGVtIHRvIGRlbW9uc3RyYXRlIHRoZSBub2lzZSBpbiBpZGVudGlmeWluZyBoYXBsb3R5cGUgYmxvY2tzIGFzIGVkZ2VzIGJhc2VkIG9uIEFSRyBzYW1wbGVzLiBXZSBvbmx5IGZvY3VzIG9uIHRoZSAqSC5lLmxhdGl2aXR0YSogcG9wdWxhdGlvbiAoYWx3YXlzIGluIHJlZCBsYWJlbHMpLgoKIyMgSXRlcmF0aW9uIDEgKE1DTUMgaXRlcjogODI1MCkKCmBgYHtyLCBmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9NX0KI1JlYWQgdG1yY2EKdG1yY2E4MjUwIDwtIHJlYWRBcmdTdW1tYXJ5KCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9vcHRpeF9uZXdOZS50bXJjYS5hbGxfc2FtcGxlLjgyNTAuYmVkLmd6IikKdG1yY2E4MjUwX25vdCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUudG1yY2EuSGVyYXRvX25vdGFiaWxpcy44MjUwLmJlZC5neiIpCnRtcmNhODI1MF9sYXQgPC0gcmVhZEFyZ1N1bW1hcnkoIn4vUHJvai1EZWYtSGFwbG8vb3B0aXhfbmV3cnVuL29wdGl4X25ld05lL29wdGl4X25ld05lLnRtcmNhLkhlcmF0b19sYXRpdml0dGEuODI1MC5iZWQuZ3oiKQoKIyMgU2V0IGdlbm9taWMgc3BhbiBhbmQgTmUgLS0tLQpOZT0xOTQwMDc4CmdlbjgyNTAgPC0gKHRtcmNhODI1MCRjaHJvbVN0YXJ0KSMvMWUzCmdlbjgyNTBfbm90IDwtICh0bXJjYTgyNTBfbm90JGNocm9tU3RhcnQpIy8xZTMKZ2VuODI1MF9sYXQgPC0gKHRtcmNhODI1MF9sYXQkY2hyb21TdGFydCkjLzFlMwoKcGxvdChnZW44MjUwLCB0bXJjYTgyNTAkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9J3MnLCBjb2wgPSAiYmxhY2siLCBsd2Q9MC44LCBsb2c9InkiLCAKICAgICB5bGltPWMoMWUtMiwyMCksIHhsaW09YygxMzg2MDAwLCAxMzg5MDAwKSwgeGxhYiA9ICJQb3NpdGlvbiAoa0IpIiwgeWxhYiA9ICJUTVJDQSAoTmUpIikgKwogIGxpbmVzKGdlbjgyNTBfbm90LCB0bXJjYTgyNTBfbm90JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDQ0NDMDAiLCBsd2Q9MSkgKwogICAgbGluZXMoZ2VuODI1MF9sYXQsIHRtcmNhODI1MF9sYXQkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9InMiLCBjb2wgPSAiI0MwMEMyOCIsIGx3ZD0zKQpgYGAKCmBgYHtyIGVjaG89VCwgbWVzc2FnZT1GLCByZXN1bHRzPUZ9CiMgUmVhZCB0cmVlcyBpbiB0aGUgd2hvbGUgcmVnaW9uCnRyMSA8LSByZWFkLnRhYmxlKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9zYW1wbGUvb3B0aXhfbmV3TmUuODI1MF90cmVlcy50eHQiKQpjb2xuYW1lcyh0cjEpIDwtIGMoImV2ZW50IiwiY2hyb21TdGFydCIsImNocm9tRW5kIiwidHJlZSIpCnN0cih0cjEpCgojIFJlYWQgU1BScyBpbiB0aGUgd2hvbGUgcmVnaW9uCnNwcjEgPC0gcmVhZC50YWJsZSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvc2FtcGxlL29wdGl4X25ld05lLjgyNTBfU1BSLnR4dCIpCmNvbG5hbWVzKHNwcjEpIDwtIGMoImV2ZW50IiwicG9zaXRpb24iLCAicmVjb21iX25vZGUiLCAicmVjb21iX3RpbWUiLCAiY29hbF9ub2RlIiwgImNvYWxfdGltZSIpCnN0cihzcHIxKQoKIyBGaW5kIHRyZWVzIGluIHRoZSBmb2NhbCByZWdpb24uCmNocm9tU3RhcnQgPC0gMTM4NTk2NgpjaHJvbUVuZCA8LSAxMzg4OTY2CnRyMV9zdWIgPC0gc3Vic2V0X2dlbm9taWNfaW50ZXJ2YWwodHIxLCBjaHJvbVN0YXJ0LCBjaHJvbUVuZCkgIzQ2NCB0cmVlcwpzcHIxX3N1YiA8LSBzdWJzZXRfZ2Vub21pY19pbnRlcnZhbChzcHIxLCBjaHJvbVN0YXJ0LCBjaHJvbUVuZCkKYGBgCgpXZSBleHRyYWN0IEFSR3Mgc2FtcGxlZCBieSBBUkd3ZWF2ZXIgaW4gaXRzIE1DTUMgaXRlcmF0aW9uOiA4MjUwLCBhbmQgZXN0aW1hdGUgdGhlIFRNUkNBICh0b3RhbCBhbmQgd2l0aGluIHBvcHVsYXRpb24pLCB0b3RhbCBicmFuY2ggbGVuZ3RoIG9mIGVhY2ggbWFyZ2luYWwgdHJlZSBhbmQgdGhlIHJlY29tYmluYXRpb24gYnJlYWtwb2ludHMuIEFsdG9nZXRoZXIgaW4gdGhlIH41MGtiIHJlZ2lvbiwgdGhlcmUgYXJlIDY1NzEgdHJlZXMgKGFuZCA2NTcwIHJlY29tYmluYXRpb24gZXZlbnRzKSwgb2Ygd2hpY2ggb25seSA0NjQgdHJlZXMgYXJlIHByZXNlbnQgaW4gdGhlIGZvY2FsIDNrYiByZWdpb24sIG9wdGl4OjEzODU5NjYtMTM4ODk2Ni4KCldlIGludmVzdGlnYXRlIHRoZSBkaXN0cmlidXRpb24gb2YgYnJhbmNoIGxlbmd0aCBvZiB0cmVlcyB3aXRoIHJlc3BlY3QgdG8gdGhlaXIgZ2Vub21pYyBzcGFucyAoRmlnIFM2KS4gV2UgZmluZCBhdmVyYWdlIHRyZWUgc3BhbiBpbiB0aGUgd2hvbGUgcmVnaW9uIGlzIH43IGJwLiBXZSBleHBlY3QgZnJvbSB0aGVvcnkgYXNzdW1pbmcgc3RhbmRhcmQgY29hbGVzY2VuY2UsICRQX3IoZCBcbWlkIFx0YXUpJD0kXGZyYWMge1xyaG99ezJ9TChcdGF1KSQgZXhwJFstXGZyYWMge1xyaG99ezJ9TChcdGF1KSBkXSQgd2hlcmUgJEwoXHRhdSkkIGlzIGluIGNvYWxlc2NlbnQgdW5pdCBvZiAkMk5fZSQgZ2VuZXJhdGlvbnMgYW5kICRcZnJhYyB7XHJob317Mn0kPSQyTl9lciQgZGVub3RlcyB0aGUgcG9wdWxhdGlvbi1zY2FsZWQgcmVjb21iaW5hdGlvbiByYXRlIHBlciBicC4gR2l2ZW4gdGhlIHBhcmFtZXRlcnMsIGFuZCBtZWFuICRMKFx0YXUpJCA9IDIsIHRoaXMgZ2l2ZXMgbWVhbiAqZCogPSAkXGZyYWMgezF9IHtcZnJhYyB7XHJob317Mn1MKFx0YXUpfSQgfiA0NWJwLiBJdCBzZWVtcyBpbiB0aGlzIHJlZ2lvbiwgQVJHd2VhdmVyIHNlZW1zIHRvIGNoYW5nZSB0aGUgdHJlZSB0b3BvbG9neSBtb3JlIG9mdGVuIHRoYW4gdGhlIGV4cGVjdGVkIG1lYW4uIFdlIGhhdmUgbm90IGV4cGxvcmVkIHRoaXMgY2xvc2VseSAoYmV5b25kIHRoZSBtYWluIHJlYWNoIG9mIHRoaXMgYW5hbHlzaXMpLCBob3dldmVyLCB3ZSBub3RlIHRoYXQgYWx0aG91Z2ggdGhlIEFSR3MgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGF0YSwgd2UgbmVlZCB0byB0YWtlIGNhdXRpb24gaW4gYmlvbG9naWNhbCBpbmZlcmVuY2UgZnJvbSB0aGVzZSBzYW1wbGVkIEFSR3MuIAoKYGBge3IgZmlnNjAsIGZpZy53aWR0aD0yMCwgZmlnLmhlaWdodD01LCBlY2hvPVQsIHJlc3VsdHM9Riwgd2FybmluZz1GfQojIyBSZWFkIGFsbCA2NTcxIHRyZWUgbGVuZ3Rocwp0cmVlbGVuMSA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUuYnJhbmNobGVuLmFsbF9zYW1wbGUuODI1MC5iZWQuZ3oiKQp0cmVlbGVuMSR0cmVlc3BhbiA8LSB0cmVlbGVuMSRjaHJvbUVuZC10cmVlbGVuMSRjaHJvbVN0YXJ0CiMjIFJlYWQgNDY0IHRyZWUgbGVuZ3RocyBpbiB0aGUgZm9jYWwgZ2Vub21pYyByZWdpb24KdHJlZWxlbjFfc3ViIDwtIHN1YnNldF9nZW5vbWljX2ludGVydmFsKHRyZWVsZW4xLCBjaHJvbVN0YXJ0LCBjaHJvbUVuZCkKbWVhbih0cmVlbGVuMSR0cmVlc3BhbikKbWVhbih0cmVlbGVuMV9zdWIkdHJlZXNwYW4pCiMjIFBsb3QKcGFyKG1mcm93PWMoMSwzKSwgY2V4Lm1haW49MS41LCBjZXgubGFiPTEuNywgY2V4LmF4aXM9MS41KQojIEhpc3RvZ3JhbQpoaXN0KHRyZWVsZW4xJHRyZWVzcGFuLCB4bGFiID0gIlRyZWUgU3BhbiIpCiMgQnJhbmNoIExlbmd0aCB2cyBUcmVlIHNwYW4gKGFsbCA2NTcxIHRyZWVzKQpwbG90KHRyZWVsZW4xJHRyZWVzcGFuLCB0cmVlbGVuMSRicmFuY2hsZW5fbWVhbiwgeGxhYj0iVHJlZSBTcGFuIiwgeWxhYj0iVHJlZSBMZW5ndGgiKQpwb2ludHMoYWdncmVnYXRlKHRyZWVsZW4xJGJyYW5jaGxlbl9tZWFufnRyZWVsZW4xJHRyZWVzcGFuLCBGVU49bWVhbiksIGNvbD0icmVkIiwgcGNoPTE5LCBjZXg9MS41KQojIEJyYW5jaCBMZW5ndGggdnMgVHJlZSBzcGFuICg0NjQgdHJlZXMgaW4gdGhlIGZvY2FsIGdlbm9taWMgcmVnaW9uKQpwbG90KHRyZWVsZW4xX3N1YiR0cmVlc3BhbiwgdHJlZWxlbjFfc3ViJGJyYW5jaGxlbl9tZWFuLCB4bGFiPSJUcmVlIFNwYW4iLCB5bGFiPSJUcmVlIExlbmd0aCIpCnBvaW50cyhhZ2dyZWdhdGUodHJlZWxlbjFfc3ViJGJyYW5jaGxlbl9tZWFufnRyZWVsZW4xX3N1YiR0cmVlc3BhbiwgRlVOPW1lYW4pLCBjb2w9InJlZCIsIHBjaD0xOSwgY2V4PTEuNSkKYGBgCioqRmlnUzY6KiogKipMZWZ0OioqIEhpc3RvZ3JhbSBvZiB0cmVlIHNwYW5zOyAqKkNlbnRlcjoqKiBCcmFuY2ggbGVuZ3RoIHZzIHRyZWUgc3BhbiBmb3IgYWxsIDY1NzEgbWFyZ2luYWwgdHJlZXMgYWxvbmcgdGhlIGdlbm9tZTsgKipSaWdodDoqKiBCcmFuY2ggbGVuZ3RoIHZzIHRyZWUgc3BhbnMgZm9yIDQ2NCB0cmVlcyBpbiB0aGUgZm9jYWwgZ2Vub21pYyByZWdpb24uIFJFRCBwb2ludHMgYXJlIGF2ZXJhZ2UgdHJlZSBsZW5ndGhzIGZvciBlYWNoIHRyZWUgc3Bhbi4KCkZvciBvdXIgYW5hbHlzaXMsIHdlIHN0cmljdGx5IGZvY3VzIG9uIGlkZW50aWZ5aW5nIGVkZ2VzIHN1cHBvcnRlZCBieSBTTlBzLiBJbiBwcmFjdGljZSwgdGhpcyBpcyBkb25lIGluIGZldyBzdGVwcyAtIEZpcnN0LCBmb3IgZWFjaCBzYW1wbGVkIHRyZWUgYWxvbmcgdGhlIGdlbm9tZSAoPSA0NjQgdHJlZXMpLCB3ZSBleHRyYWN0IHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gLSBhbmNlc3RyYWwgYW5kIGRlc2NlbmRhbnQgbm9kZSBvZiBlYWNoIGVkZ2UsIGVkZ2UgaGVpZ2h0ICg9bGVuZ3RoKSwgdGltZS1wb2ludCBvZiB0aGUgZGVzY2VuZGFudCBub2RlLCBpLmUuLCB3aGVuIHRoZSBlZGdlIG9yaWdpbmF0ZWQgKD1kZXB0aCwgTk9URTogZHVlIHRvIHJvdW5kaW5nIGVycm9ycyBpbiBOZXdpY2sgZm9ybWF0LCB3ZSByb3VuZCB0aGUgZGVwdGggdmFsdWVzIHRvIDMgc2lnbmlmaWNhbnQgZGlnaXRzKSBhbmQgdGhlIHNhbXBsZXMgKD10aXBzLmZyb20uZGVjKSB0aGF0IGVhY2ggZWRnZSBpcyBhbmNlc3RyYWwgdG8uIE5PVEU6IEFsdGhvdWdoIHdlIGFyZSBpZGVudGlmeWluZyBoYXBsb3R5cGUgYmxvY2tzIGluIHRoZSAqSC5lLmxhdGl2aXR0YSogKHJlZCkgcG9wdWxhdGlvbiwgd2UgdXNlIGdlbmVhbG9naWNhbCB0cmVlcyB0aGF0IGluY2x1ZGUgYm90aCBwb3B1bGF0aW9ucy4gVGhpcyBpcyBkb25lIGluIG9yZGVyIHRvIGVzdGltYXRlIHRoZSBlZGdlIGhlaWdodCBvZiB0aGUgbW9zdCByZWNlbnQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBpbmRpdmlkdWFscyBpbiB0aGUgcmVkIHBvcHVsYXRpb24uIElkZWFsbHkgZm9yIG1ha2luZyBiaW9sb2dpY2FsIGluZmVyZW5jZXMgZnJvbSBvbmx5IG9uZSBwb3B1bGF0aW9uLCB0aGlzIG5lZWQgbm90IGJlIGRvbmUuIEhvd2V2ZXIgaW4gb3VyIGFuYWx5c2lzLCBpbiBvcmRlciB0byBpbGx1c3RyYXRlIHRoZSBoYXBsb3R5cGUgYmxvY2sgcGF0dGVybnMgZ2VuZXJhdGVkIGluIGEgc2VsZWN0ZWQgZ2Vub21pYyByZWdpb24sIHdlIGRlY2lkZWQgdG8gaW5jb3Jwb3JhdGUgYm90aCBwb3B1bGF0aW9ucyB0byBnZW5lcmF0ZSB0cmVlcyBhbG9uZyB0aGUgZ2Vub21lLiBOZXZlcnRoZWxlc3MsIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGlkZW50aWZpZWQgaGFwbG90eXBlIGJsb2NrcyB3aWxsIHN0YXkgdGhlIHNhbWUgaXJyZXNwZWN0aXZlIG9mIHdoaWNoIGFuZCBob3cgbWFueSBwb3B1bGF0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIGFuYWx5c2lzOyBob3dldmVyLCB0aGUgZWRnZSBoZWlnaHQgd2lsbCBjaGFuZ2UgYWxvbmcgdGhlIGdlbm9tZS4KCmBgYHtyIGVjaG89VH0KIyMgU3RvcmUgZWRnZSBpbmZvcm1hdGlvbiBvZiBhbGwgNDY0IHRyZWVzIGFzIGEgbGlzdAp0cjFfc3ViX2xpc3QgPC0gZXh0cmFjdF9lZGdlcyh0cjFfc3ViKQpgYGAKClNlY29uZCwgZm9yIGV2ZXJ5IHRyZWUgYXQgZWFjaCBTTlAgcG9zaXRpb24gKD0gMTM3IFNOUHMpLCB3ZSBpZGVudGlmeSBtb3N0IHJlY2VudCB0cmVlIG5vZGUgdGhhdCBpcyBjb21tb25seSBhbmNlc3RyYWwgdG8gYWxsIGluZGl2aWR1YWxzIHRoYXQgc2hhcmUgdGhlIHNhbWUgYWxsZWxlLiAoTm90ZTogdGhpcyBhc3N1bWVzIGluZmluaXRlIHNpdGVzIG11dGF0aW9uIG1vZGVsLCB3aGljaCBpcyBnZW5lcmFsbHkgdGhlIGRlZmF1bHQgb3B0aW9uIGluIEFSR3dlYXZlcikuIFRoaXMgYWxsb3dzIGlkZW50aWZpY2F0aW9uIG9mIDEgbm9kZSBmb3IgdGhlIG1ham9yIGFuZCAxIGZvciB0aGUgbWlub3IgYWxsZWxlIGF0IGVhY2ggU05QIHBvc2l0aW9uLCBoZXJlYWZ0ZXIgY2FsbGVkIG1ham9yIGFuZCBtaW5vciBub2RlIGZvciBlYWNoIHRyZWUuIAoKYGBge3IgZWNobyA9Rn0KIyMgdGhpcyBvbmx5IGV4dHJhY3RzIHRyZWVzIGF0IFNOUHMKdHIxX3NucHMgPC0gZXh0cmFjdF90cmVlc19hdF9TTlBzKGZvY2FsX3NpdGVzLCB0cjEsIHNwcjEpCgp0aW1lU2NhbGUgPSAxL05lCnRyMV9zbnBzX2xpc3QgPC0gbGlzdCgpCmxhdCA8LSBzYW1wSUQkSURbd2hpY2goc2FtcElEJHBvcD09IkhlcmF0b19sYXRpdml0dGEiKV0Kbm90IDwtIHNhbXBJRCRJRFt3aGljaChzYW1wSUQkcG9wPT0iSGVyYXRvX25vdGFiaWxpcyIpXQpmb3IgKHNucElEIGluIGMoMTpucm93KHRyMV9zbnBzKSkpewogIGNhdChzbnBJRCwgdHIxX3NucHNbc25wSUQsInBvcyJdKQogIGFsbGVsZXMgPC0gdHIxX3NucHNbc25wSUQsc2FtcElEJElEXQogIGFsbGVsZXMgPC0gYXMuZmFjdG9yKGFsbGVsZXMpCiAgCiAgYWxsZWxlQ291bnQxIDwtIHN1bShhbGxlbGVzW2xhdF0gPT0gbGV2ZWxzKGFsbGVsZXMpWzFdKQogIGFsbGVsZUNvdW50MiA8LSBzdW0oYWxsZWxlc1tsYXRdID09IGxldmVscyhhbGxlbGVzKVsyXSkKICAKICBtYWpBbGxlbGUgPC0gaWZlbHNlKGFsbGVsZUNvdW50MSA+IGFsbGVsZUNvdW50MiwgbGV2ZWxzKGFsbGVsZXMpWzFdLCBsZXZlbHMoYWxsZWxlcylbMl0pCiAgdHIxX3NucHMkbWFqQWxsZWxlW3NucElEXSA8LSBtYWpBbGxlbGUKICBtaW5BbGxlbGUgPC0gc2V0ZGlmZihsZXZlbHMoYWxsZWxlcyksIG1hakFsbGVsZSkKICB0cjFfc25wcyRtaW5BbGxlbGVbc25wSURdIDwtIG1pbkFsbGVsZQogIAogICNtYWpDbGFkZV9sYXQgPC0gc2V0ZGlmZih3aGljaChhbGxlbGVzID09IG1hakFsbGVsZSksIG5vdGFiaWxpc19pbmRpdmlkdWFscysxKSAjIDEtaW5kZXhlZAogICNtaW5DbGFkZV9sYXQgPC0gc2V0ZGlmZih3aGljaChhbGxlbGVzID09IG1pbkFsbGVsZSksIG5vdGFiaWxpc19pbmRpdmlkdWFscysxKSAjIDEtaW5kZXhlZAogIG1hakNsYWRlX2xhdF9uYW1lcyA8LSBzZXRkaWZmKG5hbWVzKGFsbGVsZXNbd2hpY2goYWxsZWxlcyA9PSBtYWpBbGxlbGUpXSksbm90KQogIG1pbkNsYWRlX2xhdF9uYW1lcyA8LSBzZXRkaWZmKGxhdCwgbWFqQ2xhZGVfbGF0X25hbWVzKQogIAogIG1hakNsYWRlX2xhdCA8LSBzYW1wSURbd2hpY2goc2FtcElEJElEICVpbiUgbWFqQ2xhZGVfbGF0X25hbWVzKSwiQVJHd2VhdmVySUQiXSAjIDAtaW5kZXhlZAogIHRyMV9zbnBzJG1hakNsYWRlX2xhdFtzbnBJRF0gPC0gbGlzdChtYWpDbGFkZV9sYXQpCiAgdHIxX3NucHMkbWFqQWxsZWxlQ291bnRfbGF0W3NucElEXSA8LSBsZW5ndGgodHIxX3NucHMkbWFqQ2xhZGVfbGF0W3NucElEXVtbMV1dKSAKICAKICBtaW5DbGFkZV9sYXQgPC0gc2FtcElEW3doaWNoKHNhbXBJRCRJRCAlaW4lIG1pbkNsYWRlX2xhdF9uYW1lcyksIkFSR3dlYXZlcklEIl0gIyAwLWluZGV4ZWQKICB0cjFfc25wcyRtaW5DbGFkZV9sYXRbc25wSURdIDwtIGxpc3QobWluQ2xhZGVfbGF0KQogIHRyMV9zbnBzJG1pbkFsbGVsZUNvdW50X2xhdFtzbnBJRF0gPC0gMjAtdHIxX3NucHMkbWFqQWxsZWxlQ291bnRfbGF0W3NucElEXQogIAogIHRyZWUgPC0gdHIxX3NucHNbc25wSUQsInRyZWUiXQogIHRyLm5vdCA8LSBwcnVuZVRyZWUodHJlZSA9IHRyZWUsIHNlcXMgPSBhcy5jaGFyYWN0ZXIobm90YWJpbGlzX2luZGl2aWR1YWxzKSkgIyAwLWluZGV4ZWQKICB0ci5sYXQgPC0gcHJ1bmVUcmVlKHRyZWUgPSB0cmVlLCBzZXFzID0gYXMuY2hhcmFjdGVyKGxhdGl2aXR0YV9pbmRpdmlkdWFscykpICMgMC1pbmRleGVkCiAgCiAgdHIxX3NucHNfbGlzdCR0cmVlW3NucElEXSA8LSB0ci5sYXQKICBhcGVUcmVlIDwtIHJlYWQudHJlZSh0ZXh0PXRyLmxhdCkKICAKICAjIyBUcmVlCiAgbmxlYWYgPC0gbGVuZ3RoKGFwZVRyZWUkdGlwLmxhYmVsKQogIHJvb3RhZ2UgPC0gZ2V0VHJlZURlcHRoKGFwZVRyZWUpKnRpbWVTY2FsZQogIHJvb3ROb2RlIDwtIGdldFJvb3ROb2RlKGFwZVRyZWUpCiAgZWRnZSA8LSBhcy5kYXRhLmZyYW1lKGFwZVRyZWUkZWRnZSkKICBuYW1lcyhlZGdlKSA8LSBjKCJhbmMiLCAiZGVjIikKICBlZGdlJGFuYy5sYWJlbCA8LSBzYXBwbHkoYXBlVHJlZSRlZGdlWywxXSwgc2VsZWN0LnRpcC5vci5ub2RlLCB0cmVlID0gYXBlVHJlZSkKICBlZGdlJGRlYy5sYWJlbCA8LSBzYXBwbHkoYXBlVHJlZSRlZGdlWywyXSwgc2VsZWN0LnRpcC5vci5ub2RlLCB0cmVlID0gYXBlVHJlZSkKICAKICBlZGdlIDwtIHJiaW5kKGVkZ2UsIGRhdGEuZnJhbWUoYW5jPS0xLCBkZWM9cm9vdE5vZGUsIGFuYy5sYWJlbD0tMSwgZGVjLmxhYmVsPXJvb3ROb2RlKSkKICBubm9kZSA8LSBucm93KGVkZ2UpCiAgZWRnZSRsZW5ndGggPC0gYyhhcGVUcmVlJGVkZ2UubGVuZ3RoKnRpbWVTY2FsZSwgbWF4KG1heHRpbWUgLSByb290YWdlLCAxKSkKICBlZGdlJGRlcHRoIDwtIHJlcChyb290YWdlLCBubm9kZSkKICBmb3IgKGkgaW4gMTpubm9kZSkge2ogPC0gaQogICAgd2hpbGUgKDEpIHtpZiAoZWRnZSRkZWNbal0gPT0gcm9vdE5vZGUpIGJyZWFrCiAgICAgICAgZWRnZSRkZXB0aFtpXSA8LSBlZGdlJGRlcHRoW2ldIC0gZWRnZSRsZW5ndGhbal0KICAgICAgICBqIDwtIHdoaWNoKGVkZ2VbLCJkZWMiXSA9PSBlZGdlW2osImFuYyJdKX19CiAgCiAgZWRnZVt3aGljaChlZGdlJGFuYyA9PSAtMSksImRlYy5sYWJlbCJdIDwtIGVkZ2VbMSwiYW5jLmxhYmVsIl0KICAjIGVkZ2UkdGlwLmxhYmVsIDwtIHJlcCgiIiwgbnJvdyhlZGdlKSkKICAjIGZvciAoaSBpbiAxOmxlbmd0aChhcGVUcmVlJHRpcC5sYWJlbCkpe2VkZ2VbZWRnZSRkZWM9PWksInRpcC5sYWJlbCJdIDwtIGFwZVRyZWUkdGlwLmxhYmVsW2ldfQoKICBmb3IgKGRlYy5ub2RlSUQgaW4gYygxOm5yb3coZWRnZSkpKXsKICAgIGRlY3MgPC0gRGVzY2VuZGFudHMoYXBlVHJlZSwgZWRnZSRkZWNbZGVjLm5vZGVJRF0sInRpcHMiKVtbMV1dCiAgICBlZGdlJHRpcHMuZnJvbS5kZWNbZGVjLm5vZGVJRF0gPC0gbGlzdChhcGVUcmVlJHRpcC5sYWJlbFtkZWNzXSkKICAgIGVkZ2UkbWFqQ2xhZGUubm9kZVtkZWMubm9kZUlEXSA8LSBhbGwoYXMuY2hhcmFjdGVyKG1hakNsYWRlX2xhdCkgJWluJSBhcGVUcmVlJHRpcC5sYWJlbFtkZWNzXSkKICAgIGVkZ2UkbWluQ2xhZGUubm9kZVtkZWMubm9kZUlEXSA8LSBpZmVsc2UobGVuZ3RoKG1pbkNsYWRlX2xhdCkgIT0gMCwgYWxsKGFzLmNoYXJhY3RlcihtaW5DbGFkZV9sYXQpICVpbiUgYXBlVHJlZSR0aXAubGFiZWxbZGVjc10pLCdOQScpCiAgfQogIAogIHRyMV9zbnBzX2xpc3QkdHJlZS5hdHRyaWJ1dGVzW1tzbnBJRF1dIDwtIGRhdGEuZnJhbWUoZWRnZSkKICBtYWpDbGFkZS5ub2RlIDwtIGVkZ2Vbd2hpY2goZWRnZSRtYWpDbGFkZS5ub2RlPT1UKSwnZGVjLmxhYmVsJ10KICBpZiAobGVuZ3RoKG1hakNsYWRlLm5vZGUpIT0xKXttYWpDbGFkZS5ub2RlIDwtIGVkZ2Vbd2hpY2goZWRnZSRhbmMgIT0gLTEgJiBlZGdlJG1hakNsYWRlLm5vZGU9PVQpLCdkZWMubGFiZWwnXX0KICBpZiAobGVuZ3RoKG1hakNsYWRlLm5vZGUpIT0xKXttYWpDbGFkZS5ub2RlIDwtIGVkZ2Vbd2hpY2goZWRnZSRhbmMgIT0gLTEgJiBlZGdlJG1hakNsYWRlLm5vZGU9PVQpLCdkZWMubGFiZWwnXX0KICBpZiAobGVuZ3RoKG1hakNsYWRlLm5vZGUpIT0xKXsKICAgICBmb3IgKGkgaW4gbWFqQ2xhZGUubm9kZSl7CiAgICAgIGlmIChsZW5ndGgoZWRnZSR0aXBzLmZyb20uZGVjW2ldW1sxXV0pID09IGxlbmd0aChtaW5DbGFkZV9sYXQpKXsKICAgICAgICBtYWpDbGFkZS5ub2RlLmZpbmFsIDwtIGkKICAgICAgfQogICAgfQogIH1lbHNle21hakNsYWRlLm5vZGUuZmluYWwgPC0gbWFqQ2xhZGUubm9kZX0KICAKICB0cjFfc25wcyRtYWpDbGFkZS5ub2RlLmRlcHRoW3NucElEXSA8LSBlZGdlW3doaWNoKGVkZ2UkZGVjLmxhYmVsID09IG1hakNsYWRlLm5vZGUuZmluYWwpLCdkZXB0aCddCiAgdHIxX3NucHMkc25wSURbc25wSURdIDwtIHNucElECn0KdHIxX3NucHMkbm9kZS5qdW1wIDwtIGMoJ05BJyxkaWZmKGZsb29yKGFzLm51bWVyaWModHIxX3NucHMkbWFqQ2xhZGUubm9kZSkpKSkKdHIxX3NucHMkZGVwdGguanVtcCA8LSBjKCdOQScsZGlmZihmbG9vcih0cjFfc25wcyRtYWpDbGFkZS5ub2RlLmRlcHRoKSkpCmBgYAoKVGhlIHRhYmxlIGJlbG93IGlsbHVzdHJhdGVzIGluZm9ybWF0aW9uIGZyb20gdGhlIHRyZWUgd2hvc2UgZ2Vub21pYyBzcGFuIGNvaW5jaWRlcyB3aXRoIHRoZSBmaXJzdCBTTlAgcG9zaXRpb24gLSAxMzg1OTg1LiAKCmBgYHtyIGVjaG89Rn0KdGFiMSA8LSB0cjFfc25wc19saXN0JHRyZWUuYXR0cmlidXRlc1tbMV1dWywzOjddCmtuaXRyOjprYWJsZSh0YWIxKQpgYGAKKipUYWJsZSBTMSoqOiBGb3IgdGhlIGFib3ZlIHRyZWUgYXQgU05QIHBvc2l0aW9uIDEzODU5ODUsIGluZGl2aWR1YWxzIDE4IGFuZCAyMiBzaGFyZSBhbGxlbGUgMCwgYW5kIHRoZXJlZm9yZSB0aGVpciBtb3N0IHJlY2VudCBjb21tb24gYW5jZXN0b3IgaXMgbm9kZSA3NSAoY2FsbGVkIGFzIG1pbm9yIG5vZGUpIHdoaWNoIG9yaWdpbmF0ZWQgYXQgdGltZSAoaW4gJE5fZSQpID0gMC4yMzYgYW5kIGhhcyBhIGxlbmd0aCBvZiAzLjE1MyAoaW4gJE5fZSQpLiAKClRoaXJkLCBmb3IgZWFjaCBtaW5vciBub2RlIChhbmQgbWFqb3Igbm9kZSBpZiB0aGUgU05QIGlzIGZpeGVkIHdpdGhpbiB0aGUgKkguZS5sYXRpdml0dGEqIHBvcHVsYXRpb24pIGlkZW50aWZpZWQgZnJvbSB0cmVlcyBhdCBlYWNoIG9mIHRoZSAxMzcgU05Qcywgd2UgaWRlbnRpZnkgYWxsIHRyZWVzIGFsb25nIHRoZSBnZW5vbWUgd2hpY2ggY29udGFpbnMgdGhhdCB1bmlxdWUgYW5jZXN0cmFsIG5vZGUuIFNpbmNlIHdlIGRvIG5vdCBrbm93IHRoZSBhbmNlc3RyYWwgcmVmZXJlbmNlIGFsbGVsZSBhdCBlYWNoIFNOUCBwb3NpdGlvbiBhbmQgd2UgYXNzdW1lIGluZmluaXRlIHNpdGVzIG11dGF0aW9uLCBhbnkgbWlub3Igbm9kZSB0aGF0IGlzIGFuY2VzdHJhbCBleGNsdXNpdmVseSB0byB0aGUgbWlub3IgY2xhZGUgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBjYXVzYWwgYWx0ZXJuYXRlIGFsbGVsZSBhbmQgaXMgY29uc2lkZXJlZCBhcyBhIGJyYW5jaCBvbiB3aGljaCBhIG11dGF0aW9uIGhhcyBvY2N1cnJlZC4gVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBleHRlbnQgb2YgdGhlIGFib3ZlIG5vZGUgNzUgdGhhdCBpcyBhbmNlc3RyYWwgdG8gaW5kbml2aWR1YWxzIDE4IGFuZCAyMiBhdCBTTlAgcG9zaXRpb24gMTM4NTk4NS4gKE5PVEU6IG9ubHkgMTAgcm93cyBzaG93ZWQgZm9yIGlsbHVzdHJhdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgaG93IHRoZSBoYXBsb3R5cGUgYmxvY2tzIGFyZSBlbmNvZGVkIGFzIGVkZ2VzLiAKYGBge3IgZWNobyA9Rn0KdGFiMiA8LSBoYXBibG9jazRfYzJfYWxsW1sxXV1bMToxMCxjKDM6Nyw5OjEzKV0gCmtuaXRyOjprYWJsZSh0YWIyKQpgYGAKKipUYWJsZSBTMioqOiBIYXBsb3R5cGUgYmxvY2sgYXMgYSB1bmlxdWUgZWRnZSB0aGF0IGNvbnRhaW5zIHRoZSBtdXRhdGlvbiBhdCBwb3M6IDEzODU5ODUsIHNoYXJlZCBiZXR3ZWVuIGluZGl2aWR1YWxzIDE4LCAyMi4gRWFjaCByb3cgcmVwcmVzZW50cyAxIHRyZWUuIEZvciBleGFtcGxlLCB0cmVlIDcgc3BhbnMgZnJvbSAxMzg1OTk0IHRvCTEzODYwMDUsIGlzCTEyIGJwIGxvbmc7IHRoZSBoYXBsb3R5cGUgYmxvY2sgYXQgdGhpcyB0cmVlIGhhcyBhIGhlaWdodCBvZiAwLjMzNzkgYW5kIHRoZXJlZm9yZSBhbiBhcmVhIChoZWlnaHQgeCB0cmVlIHNwYW4pIG9mIDQuMDU1NzYzLgoKRm9sbG93aW5nIHRoZSBhYm92ZSBzdGVwcywgd2UgY2FuIGlkZW50aWZ5IGVhY2ggbWFqb3IvbWlub3Igbm9kZSBhbmNlc3RyYWwgdG8gZWFjaCBtYWpvci9taW5vciBjbGFkZSBhbmQgb2NjdXJzIGF0IGEgcGFydGljdWxhciB0aW1lIHBvaW50IGluIHRoZSBwYXN0LCB0aGF0IGluIHByYWN0aWNlIGluZm9ybXMgdXMgb2YgYWxsIHRoZSBlZGdlcyBpbmZvcm1lZCBieSBTTlBzLiBXaXRoIDEzNyBTTlBzLCB3ZSBoYXZlIDM2IGVkZ2VzIHN1cHBvcnRlZCBieSBTTlBzICh0YWJsZSBiZWxvdykuCgpgYGB7ciwgZWNobz1GfQplZGdlczE8LSBkYXRhLmZyYW1lKCkKZm9yKGkgaW4gYygxMDoxMSwxMzoxOSkpewogIGNhdChpLCJcbiIpCiAgbm9kZXMgPC0gc3Vic2V0X2NsYWRlcyh0cjFfc25wcywgaSkKICBpZihucm93KG5vZGUpIT0wKXsKICAgICAgbm9kZXMgJT4lCiAgICAgICAgZHBseXI6OmRpc3RpbmN0KG1pbkNsYWRlX2xhdCkgLT4gdW5pcXVlSW5kcwogICAgZm9yIChqIGluIHNlcShucm93KHVuaXF1ZUluZHMpKSl7CiAgICAgIGNhdCgiXHQiLGosIlxuIikKICAgICAgaW5kcyA9IHVuaXF1ZUluZHNbaixdW1sxXV0KICAgICAgZWRnZXNfcmF3IDwtIGZpbmRfY2xhZGVfZGVwdGhzKG5vZGVzLCB0cjFfc25wc19saXN0LCBjb3VudCA9IGksIGluZHMpCiAgICAgIAogICAgICBpZihucm93KGVkZ2VzX3JhdykgPT0gMCl7CiAgICAgICAgZWRnZXNfcmF3IDwtIGRhdGEuZnJhbWUoZGVwdGggPSBOQSkKICAgICAgICBlZGdlc19yYXckdGlwcy5mcm9tLmRlY1sxXSA8LSBsaXN0KGluZHMpCiAgICAgICAgcm93SUQgPC0gc2FwcGx5KG5vZGVzJG1pbkNsYWRlX2xhdCwgZnVuY3Rpb24oZGVjcykgYWxsKGluZHMgJWluJSBkZWNzKSkKICAgICAgICBlZGdlc19yYXckc25wSUQgPC0gbGlzdChub2Rlc1tyb3dJRCwic25wSUQiXSkKICAgICAgICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICAgICAgfWVsc2V7CiAgICAgICAgZWRnZXNfcmF3JHNucElEIDwtIGxpc3QoZWRnZXNfcmF3JHNucElEKQogICAgICAgIGVkZ2VzX3JhdyRkZXB0aCA8LSByb3VuZChlZGdlc19yYXckZGVwdGgsNCkKICAgICAgICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICAgICAgICBlZGdlc19yYXcgPC0gZWRnZXNfcmF3WzEsYygiZGVwdGgiLCAidGlwcy5mcm9tLmRlYyIsInNucElEIiwiTm8ub2YuU05QcyIpXQogICAgICB9CiAgICAgIGVkZ2VzMSA8LSByYmluZChlZGdlczEsIGVkZ2VzX3JhdykKICAgIH0KICB9ZWxzZXsKICAgIGVkZ2VzMSA8LSBlZGdlczEKICB9Cn0KCm5vZGVzIDwtIHN1YnNldF9jbGFkZXModHIxX3NucHMsMjApCm5vZGVzJG1hakNsYWRlLm5vZGUuZGVwdGggPC0gcm91bmQobm9kZXMkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KQpub2RlcyAlPiUKICBkcGx5cjo6ZGlzdGluY3QobWFqQ2xhZGUubm9kZS5kZXB0aCkgLT4gdW5pcXVlQ29hbFRpbWUKZm9yIChpIGluIHNlcShucm93KHVuaXF1ZUNvYWxUaW1lKSkpewogIGVkZ2VzX3JhdyA8LSBub2Rlc1t3aGljaChub2RlcyRtYWpDbGFkZS5ub2RlLmRlcHRoID09IHVuaXF1ZUNvYWxUaW1lW2ksXSksXQogIGVkZ2VzX3JhdyRzbnBJRCA8LSBsaXN0KGVkZ2VzX3JhdyRzbnBJRCkKICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICBlZGdlc19yYXckdGlwcy5mcm9tLmRlYyA8LSAiQUxMIgogIGVkZ2VzX3JhdyRkZXB0aCAgPC0gZWRnZXNfcmF3JG1hakNsYWRlLm5vZGUuZGVwdGgKICBlZGdlc19yYXcgPC0gZWRnZXNfcmF3WzEsYygiZGVwdGgiLCAidGlwcy5mcm9tLmRlYyIsInNucElEIiwiTm8ub2YuU05QcyIpXQogIGVkZ2VzMTwtIHJiaW5kKGVkZ2VzMSwgZWRnZXNfcmF3KQp9CnJvdy5uYW1lcyhlZGdlczEpIDwtIHNlcShucm93KGVkZ2VzMSkpCmVkZ2VzMSRlZGdlSUQgPC0gc2VxKG5yb3coZWRnZXMxKSkKYGBgCgpgYGB7ciwgZWNobz1GfQp0YWIzIDwtIGVkZ2VzMVssMTo1XQprbml0cjo6a2FibGUodGFiMykKYGBgCgoqKlRhYmxlIFMzKio6IEFsbCAzNiBoYXBsb3R5cGUgYmxvY2tzIGFzIGVkZ2VzIGZyb20gaXRlcmF0aW9uIDgyNTA7IGVhY2ggcm93IHJlcHJlc2VudHMgYW4gdW5pcXVlIGVkZ2UuIEFzIG1lbnRpb25lZCBhYm92ZSwgZWFjaCBlZGdlIGlzIGRlZmluZWQgdW5pcXVlbHkgYnkgaXRzIG9yaWdpbiB0aW1lLXBvaW50ICg9ZGVwdGgpIGFuZCB0aGUgc2V0IG9mIGRlc2NlbmRlbnQgaW5kaXZpZHVhbHMgKD10aXBzLmZyb20uZGVjKS4gRm9yIGV4YW1wbGUsIGVkZ2UgMTcgKHNhbWUgZWRnZSBhcyB0aGUgVGFibGUgUzEsIFMyIHJlZmVycyB0bykgb3JpZ2luYXRlcyBhdCAwLjIzNjUgKHRpbWUgaW4gTmUpLCBzaGFyZWQgYnkgaW5kaXZpZHVhbHMgMTgsIDIyIGFuZCBpcyBzdXBwb3J0ZWQgYnkgMyBTTlBzIGF0IHBvc2l0aW9uIChyYW5rIHN1bSBvcmRlcikgMSwyLDMuIEVkZ2VzIHdpdGggZGVwdGggPSBOQSByZWZlcnMgdG8gU05QcyB0aGF0IGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgaW5maW5pdGUgc2l0ZXMgbXV0YXRpb24gbW9kZWwsIGFuZCBoZW5jZSBjYW5ub3QgYmUgZXhwbGFpbmVkIGJ5IG9uZSBtdXRhdGlvbiBldmVudC4gCgpJdCBpcyBpbXBvcnRhbnQgdG8gY2xhcmlmeSB0aGF0IHRoaXMgc3RyYXRlZ3kgb2YgaWRlbnRpZnlpbmcgbm9kZXMgYWNyb3NzIHN1Y2Nlc3NpdmUgdHJlZXMgYWxvbmcgdGhlIGdlbm9tZSBjYW4gZWFzaWx5IGJlIHRyYW5zbGF0ZWQgdG8gdGhlIG1hdGhlbWF0aWNhbCBub3RhdGlvbiB1c2VkIGZvciB0aGUgaGFwbG90eXBlIGJsb2NrIHNpbXVsYXRpb25zLiBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIGVkZ2UgY2FuIGJlIHJlcHJlc2VudGVkIGFzIHswLCB7MzR9LCB7ezE4LDIyfSx7fX19LCBpLmUuLCB0aGUgYW5jZXN0cmFsIGdlbm9tZSBvbiB0aGlzIGhhcGxvdHlwZSBibG9jayBjYXJyaWVzIHRoZSBhbGxlbGUgMCBhdCBTTlAgcG9zaXRpb24gMTsgYW5kIGlzIGJyb2tlbiBkb3duIGludG8gcmVnaW9ucyBkZWZpbmVkIGJ5IHRyZWVzIHsxLDkzfSwgezk0LDQ2NH0gYW5kIGlzIGFuY2VzdHJhbCB0byBzYW1wbGVzIHsxOCwyMn0se30gcmVzcGVjdGl2ZWx5LiAKCiMjIyMgSGFwbG90eXBlIGJsb2NrIHZpc3VhbGl6YXRpb24KCkZvciB2aXN1YWxpemF0aW9uLCB3ZSBjaG9vc2UgdG8gb25seSBwbG90IHRoZSBlZGdlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgMyBvciBtb3JlIFNOUHMuIE1vcmVvdmVyLCBmb3IgU05QcyB0aGF0IGFyZSBmaXhlZCBpbiB0aGUgcmVkIHBvcHVsYXRpb24sIHdlIG9ubHkgc2hvdyBlZGdlcyB0aGF0IG9yaWdpbmF0ZSBhdCBhbnkgdGltZS1wb2ludCBiZWxvdyA1JE5fZSQuIFRoaXMgbGVhdmVzIHVzIHdpdGggb25seSA4IGVkZ2VlLiAoc2VlIC5SbWQgZmlsZSBmb3IgZnVsbCBjb2RlKQoKYGBge3IgZWNobz1UfQojIyBTZWxlY3QgZWRnZXMgc3VwcG9ydGVkIGJ5IDMgb3IgbW9yZSBTTlBzCmltcF9lZGdlczEgPC0gZWRnZXMxW2VkZ2VzMSROby5vZi5TTlBzID49MyAmIGVkZ2VzMSRkZXB0aCA8PTUgLCBdICMxMiBpbXBvcnRhbnQgZWRnZXMKbnJvdyhpbXBfZWRnZXMxKQppbXBfZWRnZXMxIDwtIGltcF9lZGdlczFbb3JkZXIoaW1wX2VkZ2VzMSRkZXB0aCksXQpgYGAKCmBgYHtyIGVjaG89Rn0KIyMgRmluZCBoYXBsb3R5cGUgYmxvY2tzCgojc2luZ2xldG9ucwpibDFfYzE8LWZpbmRfY2xhZGVfZGVwdGhzKHN1YnNldF9jbGFkZXModHIxX3NucHMsIDE5KSwgdHIxX3NucHNfbGlzdCwgY291bnQgPSAxOSwgaW5kcyA9IGMoMzApKQppbmRzMV9jMSA8LSBjKDMwKQpoYXBibG9jazFfYzEgPC0gZmluZF9oYXBibG9ja3MoaW5kczFfYzEsIGltcF9lZGdlczEkZGVwdGhbMV0sICJhbGwiLCBULCB0cjFfc3ViX2xpc3QpCmhhcGJsb2NrMV9jMV9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2sxX2MxKQoKYmwyX2MxPC1maW5kX2NsYWRlX2RlcHRocyhzdWJzZXRfY2xhZGVzKHRyMV9zbnBzLCAxOSksIHRyMV9zbnBzX2xpc3QsIGNvdW50ID0gMTksIGluZHMgPSBjKDEzKSkKaW5kczJfYzEgPC0gYygxMykKaGFwYmxvY2syX2MxIDwtIGZpbmRfaGFwYmxvY2tzKGluZHMyX2MxLCBpbXBfZWRnZXMxJGRlcHRoWzJdLCAiYWxsIiwgVCwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazJfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrMl9jMSkKCiNkb3VibGV0b25zCmJsM19jMTwtZmluZF9jbGFkZV9kZXB0aHMoc3Vic2V0X2NsYWRlcyh0cjFfc25wcywgMTgpLCB0cjFfc25wc19saXN0LCBjb3VudCA9IDE4LCBpbmRzID0gYygyMSwyMikpCmluZHMzX2MxIDwtIGMoMjEsMjIpCmhhcGJsb2NrM19jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzM19jMSwgaW1wX2VkZ2VzMSRkZXB0aFszXSwgImFsbCIsIEYsIHRyMV9zdWJfbGlzdCkKaGFwYmxvY2szX2MxX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazNfYzEpCgpibDRfYzE8LWZpbmRfY2xhZGVfZGVwdGhzKHN1YnNldF9jbGFkZXModHIxX3NucHMsIDE4KSwgdHIxX3NucHNfbGlzdCwgY291bnQgPSAxOCwgaW5kcyA9IGMoMTgsMjIpKQppbmRzNF9jMSA8LSBjKDE4LDIyKQpoYXBibG9jazRfYzEgPC0gZmluZF9oYXBibG9ja3MoaW5kczRfYzEsIGltcF9lZGdlczEkZGVwdGhbNF0sICJhbGwiLCBGLCB0cjFfc3ViX2xpc3QpCmhhcGJsb2NrNF9jMV9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2s0X2MxKQoKIyMgRml4ZWQgU05QcwppbmRzQUxMIDwtIGxhdGl2aXR0YV9pbmRpdmlkdWFscwp0cjFfY291bnQyMCA8LSBzdWJzZXRfY2xhZGVzKHRyMV9zbnBzLCAyMCkKCmJsNl9jMSA8LSB0cjFfY291bnQyMFt3aGljaChyb3VuZCh0cjFfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczEkZGVwdGhbNV0pLGMoInBvcyIsInNucElEIildCmhhcGJsb2NrNl9jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMxJGRlcHRoWzVdLCAiYWxsIiwgRiwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazZfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrNl9jMSkKCmJsN19jMSA8LSB0cjFfY291bnQyMFt3aGljaChyb3VuZCh0cjFfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczEkZGVwdGhbN10pLGMoInBvcyIsInNucElEIildCmhhcGJsb2NrN19jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMxJGRlcHRoWzddLCAiYWxsIiwgRiwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazdfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrN19jMSkKCmJsOF9jMSA8LSB0cjFfY291bnQyMFt3aGljaChyb3VuZCh0cjFfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczEkZGVwdGhbOF0pLGMoInBvcyIsInNucElEIildCmhhcGJsb2NrOF9jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMxJGRlcHRoWzhdLCAiYWxsIiwgRiwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazhfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrOF9jMSkKCmJsOV9jMSA8LSB0cjFfY291bnQyMFt3aGljaChyb3VuZCh0cjFfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczEkZGVwdGhbOV0pLGMoInBvcyIsInNucElEIildCmhhcGJsb2NrOV9jMSA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMxJGRlcHRoWzldLCAiYWxsIiwgRiwgdHIxX3N1Yl9saXN0KQpoYXBibG9jazlfYzFfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrOV9jMSkKYGBgCgpgYGB7ciBmaWc3LCBmaWcud2lkdGg9MTcsIGZpZy5oZWlnaHQ9OCwgZWNobyA9IFQsIHJlc3VsdHM9Riwgd2FybmluZz1GIH0KcGFyKG1mcm93PWMoMiwxKSwgY2V4LmxhYj0xLjUsIGNleC5heGlzPTEuMykKcGxvdF9hbGxfc2l0ZXMoZm9jYWxfc2l0ZXMsIGFzLmNoYXJhY3RlcigxKSkgKwogIGF4aXMoc2lkZSA9MiwgdGljayA9VCwgYXQgPSBjKDIxOjQwKSwgbGFiZWxzID0gRikgKwogIHBvaW50cyhibDFfYzEkcG9zLCByZXAod2hpY2goc2FtcElEJEFSR3dlYXZlcklEID09IGMoMzApKSxucm93KGJsMV9jMSkpLCBjb2w9J2JsYWNrJywgcGNoPTE5LCBjZXggPSAxKQpwbG90KGhhcGJsb2NrMV9jMSRjaHJvbVN0YXJ0LCBoYXBibG9jazFfYzEkbGVuZ3RoLCB0eXBlPSJuIiwgbG9nPSJ5IiwgeWxpbT1jKDAuMDUsMTUpLCB4bGFiPSJQb3NpdGlvbiAoYnApIiwgeWxhYj0iVGltZSAoTmUpIiwgeGxpbT1jKGNocm9tU3RhcnQsIGNocm9tRW5kKSkgKyAgIAogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2sxX2MxX2FsbCwgImJsYWNrIiwgVCkKYGBgCioqRmlnIFM3Kio6IEhhcGxvdHlwZSBibG9jayB0aGF0IGlzIHN1cHBvcnRlZCBieSBzaW5nbGV0b25zLiBUaGVzZSBlZGdlcyBvcmlnaW5hdGUgZGlyZWN0bHkgZnJvbSB0aGUgdHJlZSB0aXBzLCBpZSwgdGhlIHNhbXBsZXMgYW5kIHRoZXJlZm9yZSBleHRlbmRzIGFsbCBhbG9uZyB0aGUgZ2Vub21pYyByZWdpb24uIEFsdGhvdWdoIGZvciBiaW9sb2dpY2FsIGluZmVyZW5jZSwgc2luZ2xldG9ucyBhcmUgb2Z0ZW4gdW5pbmZvcm1hdGl2ZSwgdGhpcyBzaG93cyB0aGUgZmVhdHVyZSBvZiBhbiBlZGdlIHN1cHBvcnRlZCBieSBzaW5nbGV0b25zLCB3aGljaCBleHRlbmRzIGFsbCBhbG9uZyB0aGUgZ2Vub21lLCBpcyBub3JtYWxseSBzaGFsbG93IHdpdGggY2VydGFpbiByZWdpb25zIHRoYXQgZ28gYXJlIGhpZ2gsIHdoZXJlIGEgbG90IG9mIHNpbmdsZXRvbiBjbHVzdGVycyB0b2dldGhlci4gVGhlc2UgYXJlIG5vcm1hbGx5IHJlZ2lvbnMgb2YgdGhlIGdlbm9tZSwgd2hpY2ggaGF2ZSByZWNvbWJpbmVkIG91dCBhbmQgZ29lcyBhbGwgdGhlIHdheSBiYWNrIHRvIGFuIGFuY2VzdG9yIGluIHRoZSBkZWVwIHBhc3QuIFRoZSBvcmFuZ2UgYmxvY2sgc2hvd3MgY2x1c3RlcmluZyBvZiBTTlBzIGluIHRoZSBoaWdoZXIgcmVnaW9uIG9mIHRoZSBlZGdlcywgd2hlcmVhcywgdGhlIGdyZWVuIGVkZ2Ugc2hvd3MgaG93IFNOUHMgY2FuIGFsc28gb2NjdXIgYnkgY2hhbmNlIGF0IG90aGVyIHJlZ2lvbnMuIAoKTm93LCBwbG90aW5nIGFsbCB0aGUgaGFwbG95cGUgYmxvY2tzIGV4Y2VwdCBzaW5nbGV0b25zIChGaWcgUzgpLCBzYW1lIGFzIHRoZSBmaWd1cmUgaW4gbWFpbiB0ZXh0IChzZWUgTWFpbiBUZXh0IGZvciBjYXB0aW9uKS4KYGBge3IgZmlnIDEwMDAwLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xNSwgcmVzdWx0cz1GLCBlY2hvPUYsIHdhcm5pbmc9Rn0KdHJlZXNfdG9fcGxvdCA8LSBjKDIsIDIzLCA1MSwgNTcsIDc1LCA5NSwgMTM3KQoKcGFyKG1mcm93PWMoMywxKSwgY2V4Lm1haW49MS41LCBjZXgubGFiPTEuMywgY2V4LmF4aXM9MS4yKQoKcGxvdF9hbGxfc2l0ZXMoZm9jYWxfc2l0ZXMsIGFzLmNoYXJhY3RlcigxKSkgKwogIGF4aXMoc2lkZSA9MiwgdGljayA9VCwgYXQgPSBjKDIxOjQwKSwgbGFiZWxzID0gRikgKwogIHBvaW50cyhyZXAoKGJsM19jMSRwb3MpLCBlYWNoID0gMiksIHJlcCh3aGljaChzYW1wSUQkQVJHd2VhdmVySUQgPT0gYygyMSwyMikpLG5yb3coYmwzX2MxKSkgLCBjb2w9J3BpbmsnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDRfYzEkcG9zKSwgZWFjaCA9IDIpLCByZXAod2hpY2goc2FtcElEJEFSR3dlYXZlcklEID09IGMoMTgsMjIpKSxucm93KGJsNF9jMSkpICwgY29sPSd5ZWxsb3cnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDZfYzEkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsNl9jMSkpICwgY29sPSdkYXJrYmx1ZScsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsN19jMSRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw3X2MxKSkgLCBjb2w9J2N5YW4nLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDhfYzEkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsOF9jMSkpICwgY29sPSdtYWdlbnRhJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw5X2MxJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDlfYzEpKSAsIGNvbD0nc2llbm5hJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKChmb2NhbF9zaXRlcyRwb3Nbd2hpY2goZm9jYWxfc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMSw3KSwgcGNoID0xNywgY2V4ID0gMikgKwogICAgYWJsaW5lKHY9KGZvY2FsX3NpdGVzJHBvc1t3aGljaChmb2NhbF9zaXRlcyRzbnBJRCAlaW4lIHRyZWVzX3RvX3Bsb3QpXSksIGx0eSA9IDIsIGx3ZCA9IDAuOCkKCgoKcGxvdChoYXBibG9jazFfYzEkY2hyb21TdGFydCwgaGFwYmxvY2sxX2MxJGxlbmd0aCwgdHlwZT0ibiIsIGxvZz0ieSIsIHlsaW09YygwLjA1LDE1KSwgeGxhYj0iIiwgeWxhYj0iVGltZSAoTmUpIiwgeGxpbT1jKGNocm9tU3RhcnQsIGNocm9tRW5kKSkgKwogICNwbG90X2hhcGJsb2NrKGhhcGJsb2NrMl9jMV9hbGwsICJwaW5rIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2szX2MxX2FsbCwgInBpbmsiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazRfYzFfYWxsLCAieWVsbG93IiwgRikgKwogICMgcGxvdF9oYXBibG9jayhoYXBibG9jazVfYzFfYWxsLCAiYmx1ZSIsIFQpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrNl9jMV9hbGwsICJkYXJrYmx1ZSIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrN19jMV9hbGwsICJjeWFuIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s4X2MxX2FsbCwgIm1hZ2VudGEiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazlfYzFfYWxsLCAic2llbm5hIiwgRikgKwogIHBvaW50cyhmb2NhbF9zaXRlcyRwb3Nbd2hpY2goZm9jYWxfc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0sIHJlcCgwLjA1LDcpLCBwY2ggPTE3LCBjZXggPSAyKSArCiAgYWJsaW5lKHY9KGZvY2FsX3NpdGVzJHBvc1t3aGljaChmb2NhbF9zaXRlcyRzbnBJRCAlaW4lIHRyZWVzX3RvX3Bsb3QpXSksIGx0eSA9IDIsIGx3ZCA9IDAuOCkKCgpwbG90KGdlbjgyNTAsIHRtcmNhODI1MCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0ncycsIGNvbCA9ICJibGFjayIsIGx3ZD0zLCBsb2c9InkiLCAKICAgICB5bGltPWMoMC4wNSwxNSksIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCksIHhsYWIgPSAiUG9zaXRpb24gKGJwKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIpICsKICAgIGxpbmVzKGdlbjgyNTBfbGF0LCB0bXJjYTgyNTBfbGF0JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDMDBDMjgiLCBsd2Q9MykgKwogICAgcG9pbnRzKGZvY2FsX3NpdGVzJHBvc1t3aGljaChmb2NhbF9zaXRlcyRzbnBJRCAlaW4lIHRyZWVzX3RvX3Bsb3QpXSwgcmVwKDAuMDUsNyksIHBjaCA9MTcsIGNleCA9IDIpICsKICBhYmxpbmUodj0oZm9jYWxfc2l0ZXMkcG9zW3doaWNoKGZvY2FsX3NpdGVzJHNucElEICVpbiUgdHJlZXNfdG9fcGxvdCldKSwgbHR5ID0gMiwgbHdkID0gMC44KQpgYGAKCgpTZWUgKi5SbWQqIGZpbGUgZm9yIGFsbCAxMzcgdHJlZXMgYXQgZWFjaCBTTlAgcG9zaXRpb24uCmBgYHtyIGZpZzEwMCwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTcsIGVjaG89RiwgcmVzdWx0cz1GLCBtZXNzYWdlPUYsIGluY2x1ZGU9Rn0KcGFyKG1mcm93PWMoMiw0KSkKZm9yIChpIGluIDE6MTM3KXsKICBwbG90VHJlZSh0cjFfc25wcyR0cmVlW2ldLCAKICAgICAgICAgICNrZWVwU2VxcyA9IGFzLmNoYXJhY3RlcihsYXRpdml0dGFfaW5kaXZpZHVhbHMpLAogICAgICAgICAgbGVhZkNvbCA9IGluZENvbG91cl9hcmdJRHMsIHlsYWI9aSwgCiAgICAgICAgICBsb2dTY2FsZSA9IFQsIHlsaW09Yyg0ZS0zLDIwKSwgdGltZVNjYWxlID0gMS9OZSwgY2V4LmxhYiA9IDEuMykKfQpgYGAKCiMjIyMgQ2FzZSAyOiBpdGVyYXRpb24gOTAwMApUaGVyZSBhcmUgYWx0b2dldGhlciA2NDU3IHRyZWVzIGluIHRoZSB+NTBrYiByZWdpb24sIGFuZCA0MjUgaW4gdGhlIGZvY2FsIGdlbm9taWMgcmVnaW9uLiAKCmBgYHtyIGVjaG89Rn0KIyMgUmVhZCB0cmVlIGxlbmd0aAp0cmVlbGVuMiA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUuYnJhbmNobGVuLmFsbF9zYW1wbGUuOTIwMC5iZWQuZ3oiKQpzdHIodHJlZWxlbjIpCnRyZWVsZW4yJHRyZWVzcGFuIDwtIHRyZWVsZW4yJGNocm9tRW5kLXRyZWVsZW4yJGNocm9tU3RhcnQKCnRyZWVsZW4yX3N1YiA8LSBzdWJzZXRfZ2Vub21pY19pbnRlcnZhbCh0cmVlbGVuMiwgY2hyb21TdGFydCwgY2hyb21FbmQpCnBhcihtZnJvdz1jKDIsMSkpCnBsb3QodHJlZWxlbjJfc3ViJGNocm9tU3RhcnQsIHRyZWVsZW4yX3N1YiRicmFuY2hsZW5fbWVhbiwgdHlwZT0icyIsIGxvZz0ieSIsIHhsYWI9IlBvc2l0aW9uIiwgeWxhYj0iVHJlZSBMZW5ndGgiKQpwbG90KHRyZWVsZW4yX3N1YiRjaHJvbUVuZCwodHJlZWxlbjJfc3ViJGNocm9tRW5kLXRyZWVsZW4yX3N1YiRjaHJvbVN0YXJ0KSwgdHlwZT0icyIsIGxvZz0ieSIsIHhsYWI9IlBvc2l0aW9uIiwgeWxhYj0iVHJlZSBTcGFuIikKYGBgCmBgYHtyIGZpZywgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTUsIGluY2x1ZGU9RkFMU0V9CiNwbG90KHRyZWVsZW4yX3N1YiRicmFuY2hsZW5fbWVhbiwgdHJlZWxlbjJfc3ViJHRyZWVzcGFuLCB4bGFiPSJUcmVlIExlbmd0aCIsIHlsYWI9IlRyZWUgU3BhbiIpCm1lYW4odHJlZWxlbjIkdHJlZXNwYW4pCm1lYW4odHJlZWxlbjJfc3ViJHRyZWVzcGFuKQp0YWJsZSh0cmVlbGVuMiR0cmVlc3BhbikKbnJvdyh0cmVlbGVuMikKcGFyKG1mcm93PWMoMSwyKSkKcGxvdCh0cmVlbGVuMiR0cmVlc3BhbiwgdHJlZWxlbjIkYnJhbmNobGVuX21lYW4sIHhsYWI9IlRyZWUgU3BhbiIsIHlsYWI9IlRyZWUgTGVuZ3RoIikKcG9pbnRzKGFnZ3JlZ2F0ZSh0cmVlbGVuMiRicmFuY2hsZW5fbWVhbn50cmVlbGVuMiR0cmVlc3BhbiwgRlVOPW1lYW4pLCBjb2w9InJlZCIsIHBjaD0xOSkKcGxvdCh0cmVlbGVuMl9zdWIkdHJlZXNwYW4sIHRyZWVsZW4yX3N1YiRicmFuY2hsZW5fbWVhbiwgeGxhYj0iVHJlZSBTcGFuIiwgeWxhYj0iVHJlZSBMZW5ndGgiKQpwb2ludHMoYWdncmVnYXRlKHRyZWVsZW4yX3N1YiRicmFuY2hsZW5fbWVhbn50cmVlbGVuMl9zdWIkdHJlZXNwYW4sIEZVTj1tZWFuKSwgY29sPSJyZWQiLCBwY2g9MTkpCmBgYAoKYGBge3IsIGZpZy53aWR0aD0yMCwgZmlnLmhlaWdodD0xMCwgaW5jbHVkZT1GfQojUmVhZCB0bXJjYQp0bXJjYTkyMDAgPC0gcmVhZEFyZ1N1bW1hcnkoIn4vUHJvai1EZWYtSGFwbG8vb3B0aXhfbmV3cnVuL29wdGl4X25ld05lL29wdGl4X25ld05lLnRtcmNhLmFsbF9zYW1wbGUuOTIwMC5iZWQuZ3oiKQp0bXJjYTkyMDBfbm90IDwtIHJlYWRBcmdTdW1tYXJ5KCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9vcHRpeF9uZXdOZS50bXJjYS5IZXJhdG9fbm90YWJpbGlzLjkyMDAuYmVkLmd6IikKdG1yY2E5MjAwX2xhdCA8LSByZWFkQXJnU3VtbWFyeSgifi9Qcm9qLURlZi1IYXBsby9vcHRpeF9uZXdydW4vb3B0aXhfbmV3TmUvb3B0aXhfbmV3TmUudG1yY2EuSGVyYXRvX2xhdGl2aXR0YS45MjAwLmJlZC5neiIpCiMjIFNldCBnZW5vbWljIHNwYW4gYW5kIE5lIApOZT0xOTQwMDc4CmdlbjkyMDAgPC0gKHRtcmNhOTIwMCRjaHJvbVN0YXJ0KSMvMWUzCmdlbjkyMDBfbm90IDwtICh0bXJjYTkyMDBfbm90JGNocm9tU3RhcnQpIy8xZTMKZ2VuOTIwMF9sYXQgPC0gKHRtcmNhOTIwMF9sYXQkY2hyb21TdGFydCkjLzFlMwoKcGxvdChnZW45MjAwLCB0bXJjYTkyMDAkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9J3MnLCBjb2wgPSAiYmxhY2siLCBsd2Q9MC44LCBsb2c9InkiLCAKICAgICB5bGltPWMoMWUtMiwyMCksIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCksIHhsYWIgPSAiUG9zaXRpb24gKGtCKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIpICsKICBsaW5lcyhnZW45MjAwX25vdCwgdG1yY2E5MjAwX25vdCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0icyIsIGNvbCA9ICIjQ0NDQzAwIiwgbHdkPTEpICsKICAgIGxpbmVzKGdlbjkyMDBfbGF0LCB0bXJjYTkyMDBfbGF0JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDMDBDMjgiLCBsd2Q9MykKYGBgCgpgYGB7ciBpbmNsdWRlPUZ9CiNSZWFkIHRyZWVzCnRyMiA8LSByZWFkLnRhYmxlKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9zYW1wbGUvb3B0aXhfbmV3TmUuOTIwMF90cmVlcy50eHQiKQpjb2xuYW1lcyh0cjIpIDwtIGMoImV2ZW50IiwiY2hyb21TdGFydCIsImNocm9tRW5kIiwidHJlZSIpCnN0cih0cjIpCiNSZWFkIFNQUnMKc3ByMiA8LSByZWFkLnRhYmxlKCJ+L1Byb2otRGVmLUhhcGxvL29wdGl4X25ld3J1bi9vcHRpeF9uZXdOZS9zYW1wbGUvb3B0aXhfbmV3TmUuOTIwMF9TUFIudHh0IikKY29sbmFtZXMoc3ByMikgPC0gYygiZXZlbnQiLCJwb3NpdGlvbiIsICJyZWNvbWJfbm9kZSIsICJyZWNvbWJfdGltZSIsICJjb2FsX25vZGUiLCAiY29hbF90aW1lIikKc3RyKHNwcjIpCmBgYAoKYGBge3J9CiNGaW5kIHRyZWVzIGluIHRoZSByZWdpb24gb2YgaW50ZXJlc3QKdHIyX3N1YiA8LSBzdWJzZXRfZ2Vub21pY19pbnRlcnZhbCh0cjIsIGNocm9tU3RhcnQsIGNocm9tRW5kKSAjNDI1IHRyZWVzCnN0cih0cjJfc3ViKQpzcHIyX3N1YiA8LSBzdWJzZXRfZ2Vub21pY19pbnRlcnZhbChzcHIyLCBjaHJvbVN0YXJ0LCBjaHJvbUVuZCkKYGBgCgpgYGB7cn0KI1N0b3JlIHRyZWVzIGFuZCBlZGdlIGluZm9ybWF0aW9uIGFzIGEgbGlzdAp0cjJfc3ViX2xpc3QgPC0gZXh0cmFjdF9lZGdlcyh0cjJfc3ViKQpgYGAKYGBge3J9CiMjIHRoaXMgb25seSBleHRyYWN0cyB0cmVlcyBhdCBTTlBzCnRyMl9zbnBzIDwtIGV4dHJhY3RfdHJlZXNfYXRfU05Qcyhmb2NhbF9zaXRlcywgdHIyLCBzcHIyKQpzdHIodHIyX3NucHMpCmBgYAoKYGBge3J9CnRpbWVTY2FsZSA9IDEvTmUKdHIyX3NucHNfbGlzdCA8LSBsaXN0KCkKbGF0IDwtIHNhbXBJRCRJRFt3aGljaChzYW1wSUQkcG9wPT0iSGVyYXRvX2xhdGl2aXR0YSIpXQpub3QgPC0gc2FtcElEJElEW3doaWNoKHNhbXBJRCRwb3A9PSJIZXJhdG9fbm90YWJpbGlzIildCmZvciAoc25wSUQgaW4gYygxOm5yb3codHIyX3NucHMpKSl7CiAgY2F0KHNucElELCB0cjJfc25wc1tzbnBJRCwicG9zIl0pCiAgYWxsZWxlcyA8LSB0cjJfc25wc1tzbnBJRCxzYW1wSUQkSURdCiAgYWxsZWxlcyA8LSBhcy5mYWN0b3IoYWxsZWxlcykKICAKICBhbGxlbGVDb3VudDEgPC0gc3VtKGFsbGVsZXNbbGF0XSA9PSBsZXZlbHMoYWxsZWxlcylbMV0pCiAgYWxsZWxlQ291bnQyIDwtIHN1bShhbGxlbGVzW2xhdF0gPT0gbGV2ZWxzKGFsbGVsZXMpWzJdKQogIAogIG1hakFsbGVsZSA8LSBpZmVsc2UoYWxsZWxlQ291bnQxID4gYWxsZWxlQ291bnQyLCBsZXZlbHMoYWxsZWxlcylbMV0sIGxldmVscyhhbGxlbGVzKVsyXSkKICB0cjJfc25wcyRtYWpBbGxlbGVbc25wSURdIDwtIG1hakFsbGVsZQogIG1pbkFsbGVsZSA8LSBzZXRkaWZmKGxldmVscyhhbGxlbGVzKSwgbWFqQWxsZWxlKQogIHRyMl9zbnBzJG1pbkFsbGVsZVtzbnBJRF0gPC0gbWluQWxsZWxlCiAgCiAgI21hakNsYWRlX2xhdCA8LSBzZXRkaWZmKHdoaWNoKGFsbGVsZXMgPT0gbWFqQWxsZWxlKSwgbm90YWJpbGlzX2luZGl2aWR1YWxzKzEpICMgMS1pbmRleGVkCiAgI21pbkNsYWRlX2xhdCA8LSBzZXRkaWZmKHdoaWNoKGFsbGVsZXMgPT0gbWluQWxsZWxlKSwgbm90YWJpbGlzX2luZGl2aWR1YWxzKzEpICMgMS1pbmRleGVkCiAgbWFqQ2xhZGVfbGF0X25hbWVzIDwtIHNldGRpZmYobmFtZXMoYWxsZWxlc1t3aGljaChhbGxlbGVzID09IG1hakFsbGVsZSldKSxub3QpCiAgbWluQ2xhZGVfbGF0X25hbWVzIDwtIHNldGRpZmYobGF0LCBtYWpDbGFkZV9sYXRfbmFtZXMpCiAgCiAgbWFqQ2xhZGVfbGF0IDwtIHNhbXBJRFt3aGljaChzYW1wSUQkSUQgJWluJSBtYWpDbGFkZV9sYXRfbmFtZXMpLCJBUkd3ZWF2ZXJJRCJdICMgMC1pbmRleGVkCiAgdHIyX3NucHMkbWFqQ2xhZGVfbGF0W3NucElEXSA8LSBsaXN0KG1hakNsYWRlX2xhdCkKICB0cjJfc25wcyRtYWpBbGxlbGVDb3VudF9sYXRbc25wSURdIDwtIGxlbmd0aCh0cjJfc25wcyRtYWpDbGFkZV9sYXRbc25wSURdW1sxXV0pIAogIAogIG1pbkNsYWRlX2xhdCA8LSBzYW1wSURbd2hpY2goc2FtcElEJElEICVpbiUgbWluQ2xhZGVfbGF0X25hbWVzKSwiQVJHd2VhdmVySUQiXSAjIDAtaW5kZXhlZAogIHRyMl9zbnBzJG1pbkNsYWRlX2xhdFtzbnBJRF0gPC0gbGlzdChtaW5DbGFkZV9sYXQpCiAgdHIyX3NucHMkbWluQWxsZWxlQ291bnRfbGF0W3NucElEXSA8LSAyMC10cjJfc25wcyRtYWpBbGxlbGVDb3VudF9sYXRbc25wSURdCiAgCiAgdHJlZSA8LSB0cjJfc25wc1tzbnBJRCwidHJlZSJdCiAgdHIubm90IDwtIHBydW5lVHJlZSh0cmVlID0gdHJlZSwgc2VxcyA9IGFzLmNoYXJhY3Rlcihub3RhYmlsaXNfaW5kaXZpZHVhbHMpKSAjIDAtaW5kZXhlZAogIHRyLmxhdCA8LSBwcnVuZVRyZWUodHJlZSA9IHRyZWUsIHNlcXMgPSBhcy5jaGFyYWN0ZXIobGF0aXZpdHRhX2luZGl2aWR1YWxzKSkgIyAwLWluZGV4ZWQKICAKICB0cjJfc25wc19saXN0JHRyZWVbc25wSURdIDwtIHRyLmxhdAogIGFwZVRyZWUgPC0gcmVhZC50cmVlKHRleHQ9dHIubGF0KQogIAogICMjIFRyZWUKICBubGVhZiA8LSBsZW5ndGgoYXBlVHJlZSR0aXAubGFiZWwpCiAgcm9vdGFnZSA8LSBnZXRUcmVlRGVwdGgoYXBlVHJlZSkqdGltZVNjYWxlCiAgcm9vdE5vZGUgPC0gZ2V0Um9vdE5vZGUoYXBlVHJlZSkKICBlZGdlIDwtIGFzLmRhdGEuZnJhbWUoYXBlVHJlZSRlZGdlKQogIG5hbWVzKGVkZ2UpIDwtIGMoImFuYyIsICJkZWMiKQogIGVkZ2UkYW5jLmxhYmVsIDwtIHNhcHBseShhcGVUcmVlJGVkZ2VbLDFdLCBzZWxlY3QudGlwLm9yLm5vZGUsIHRyZWUgPSBhcGVUcmVlKQogIGVkZ2UkZGVjLmxhYmVsIDwtIHNhcHBseShhcGVUcmVlJGVkZ2VbLDJdLCBzZWxlY3QudGlwLm9yLm5vZGUsIHRyZWUgPSBhcGVUcmVlKQogIAogIGVkZ2UgPC0gcmJpbmQoZWRnZSwgZGF0YS5mcmFtZShhbmM9LTEsIGRlYz1yb290Tm9kZSwgYW5jLmxhYmVsPS0xLCBkZWMubGFiZWw9cm9vdE5vZGUpKQogIG5ub2RlIDwtIG5yb3coZWRnZSkKICBlZGdlJGxlbmd0aCA8LSBjKGFwZVRyZWUkZWRnZS5sZW5ndGgqdGltZVNjYWxlLCBtYXgobWF4dGltZSAtIHJvb3RhZ2UsIDEpKQogIGVkZ2UkZGVwdGggPC0gcmVwKHJvb3RhZ2UsIG5ub2RlKQogIGZvciAoaSBpbiAxOm5ub2RlKSB7aiA8LSBpCiAgICB3aGlsZSAoMSkge2lmIChlZGdlJGRlY1tqXSA9PSByb290Tm9kZSkgYnJlYWsKICAgICAgICBlZGdlJGRlcHRoW2ldIDwtIGVkZ2UkZGVwdGhbaV0gLSBlZGdlJGxlbmd0aFtqXQogICAgICAgIGogPC0gd2hpY2goZWRnZVssImRlYyJdID09IGVkZ2VbaiwiYW5jIl0pfX0KICAKICBlZGdlW3doaWNoKGVkZ2UkYW5jID09IC0xKSwiZGVjLmxhYmVsIl0gPC0gZWRnZVsxLCJhbmMubGFiZWwiXQogICMgZWRnZSR0aXAubGFiZWwgPC0gcmVwKCIiLCBucm93KGVkZ2UpKQogICMgZm9yIChpIGluIDE6bGVuZ3RoKGFwZVRyZWUkdGlwLmxhYmVsKSl7ZWRnZVtlZGdlJGRlYz09aSwidGlwLmxhYmVsIl0gPC0gYXBlVHJlZSR0aXAubGFiZWxbaV19CgogIGZvciAoZGVjLm5vZGVJRCBpbiBjKDE6bnJvdyhlZGdlKSkpewogICAgZGVjcyA8LSBEZXNjZW5kYW50cyhhcGVUcmVlLCBlZGdlJGRlY1tkZWMubm9kZUlEXSwidGlwcyIpW1sxXV0KICAgIGVkZ2UkdGlwcy5mcm9tLmRlY1tkZWMubm9kZUlEXSA8LSBsaXN0KGFwZVRyZWUkdGlwLmxhYmVsW2RlY3NdKQogICAgZWRnZSRtYWpDbGFkZS5ub2RlW2RlYy5ub2RlSURdIDwtIGFsbChhcy5jaGFyYWN0ZXIobWFqQ2xhZGVfbGF0KSAlaW4lIGFwZVRyZWUkdGlwLmxhYmVsW2RlY3NdKQogICAgZWRnZSRtaW5DbGFkZS5ub2RlW2RlYy5ub2RlSURdIDwtIGlmZWxzZShsZW5ndGgobWluQ2xhZGVfbGF0KSAhPSAwLCBhbGwoYXMuY2hhcmFjdGVyKG1pbkNsYWRlX2xhdCkgJWluJSBhcGVUcmVlJHRpcC5sYWJlbFtkZWNzXSksJ05BJykKICB9CiAgCiAgdHIyX3NucHNfbGlzdCR0cmVlLmF0dHJpYnV0ZXNbW3NucElEXV0gPC0gZGF0YS5mcmFtZShlZGdlKQogIG1hakNsYWRlLm5vZGUgPC0gZWRnZVt3aGljaChlZGdlJG1hakNsYWRlLm5vZGU9PVQpLCdkZWMubGFiZWwnXQogIGlmIChsZW5ndGgobWFqQ2xhZGUubm9kZSkhPTEpe21hakNsYWRlLm5vZGUgPC0gZWRnZVt3aGljaChlZGdlJGFuYyAhPSAtMSAmIGVkZ2UkbWFqQ2xhZGUubm9kZT09VCksJ2RlYy5sYWJlbCddfQogIGlmIChsZW5ndGgobWFqQ2xhZGUubm9kZSkhPTEpe21hakNsYWRlLm5vZGUgPC0gZWRnZVt3aGljaChlZGdlJGFuYyAhPSAtMSAmIGVkZ2UkbWFqQ2xhZGUubm9kZT09VCksJ2RlYy5sYWJlbCddfQogIGlmIChsZW5ndGgobWFqQ2xhZGUubm9kZSkhPTEpewogICAgIGZvciAoaSBpbiBtYWpDbGFkZS5ub2RlKXsKICAgICAgaWYgKGxlbmd0aChlZGdlJHRpcHMuZnJvbS5kZWNbaV1bWzFdXSkgPT0gbGVuZ3RoKG1pbkNsYWRlX2xhdCkpewogICAgICAgIG1hakNsYWRlLm5vZGUuZmluYWwgPC0gaQogICAgICB9CiAgICB9CiAgfWVsc2V7bWFqQ2xhZGUubm9kZS5maW5hbCA8LSBtYWpDbGFkZS5ub2RlfQogIAogIHRyMl9zbnBzJG1hakNsYWRlLm5vZGUuZGVwdGhbc25wSURdIDwtIGVkZ2Vbd2hpY2goZWRnZSRkZWMubGFiZWwgPT0gbWFqQ2xhZGUubm9kZS5maW5hbCksJ2RlcHRoJ10KICB0cjJfc25wcyRzbnBJRFtzbnBJRF0gPC0gc25wSUQKfQojY29sbmFtZXModHIyX3NucHMpW25jb2wodHIyX3NucHMpXSA8LSAic25wSUQiCnRyMl9zbnBzJG5vZGUuanVtcCA8LSBjKCdOQScsZGlmZihmbG9vcihhcy5udW1lcmljKHRyMl9zbnBzJG1hakNsYWRlLm5vZGUpKSkpCnRyMl9zbnBzJGRlcHRoLmp1bXAgPC0gYygnTkEnLGRpZmYoZmxvb3IodHIyX3NucHMkbWFqQ2xhZGUubm9kZS5kZXB0aCkpKQpgYGAKCmBgYHtyfQplZGdlczI8LSBkYXRhLmZyYW1lKCkKZm9yKGkgaW4gYygxMDoxMSwxMzoxOSkpewogIGNhdChpLCJcbiIpCiAgbm9kZXMgPC0gc3Vic2V0X2NsYWRlcyh0cjJfc25wcywgaSkKICBpZihucm93KG5vZGUpIT0wKXsKICAgICAgbm9kZXMgJT4lCiAgICAgICAgZHBseXI6OmRpc3RpbmN0KG1pbkNsYWRlX2xhdCkgLT4gdW5pcXVlSW5kcwogICAgZm9yIChqIGluIHNlcShucm93KHVuaXF1ZUluZHMpKSl7CiAgICAgIGNhdCgiXHQiLGosIlxuIikKICAgICAgaW5kcyA9IHVuaXF1ZUluZHNbaixdW1sxXV0KICAgICAgZWRnZXNfcmF3IDwtIGZpbmRfY2xhZGVfZGVwdGhzKG5vZGVzLCB0cjJfc25wc19saXN0LCBjb3VudCA9IGksIGluZHMpCiAgICAgIAogICAgICBpZihucm93KGVkZ2VzX3JhdykgPT0gMCl7CiAgICAgICAgZWRnZXNfcmF3IDwtIGRhdGEuZnJhbWUoZGVwdGggPSBOQSkKICAgICAgICBlZGdlc19yYXckdGlwcy5mcm9tLmRlY1sxXSA8LSBsaXN0KGluZHMpCiAgICAgICAgcm93SUQgPC0gc2FwcGx5KG5vZGVzJG1pbkNsYWRlX2xhdCwgZnVuY3Rpb24oZGVjcykgYWxsKGluZHMgJWluJSBkZWNzKSkKICAgICAgICBlZGdlc19yYXckc25wSUQgPC0gbGlzdChub2Rlc1tyb3dJRCwic25wSUQiXSkKICAgICAgICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICAgICAgfWVsc2V7CiAgICAgICAgZWRnZXNfcmF3JHNucElEIDwtIGxpc3QoZWRnZXNfcmF3JHNucElEKQogICAgICAgIGVkZ2VzX3JhdyRkZXB0aCA8LSByb3VuZChlZGdlc19yYXckZGVwdGgsNCkKICAgICAgICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICAgICAgICBlZGdlc19yYXcgPC0gZWRnZXNfcmF3WzEsYygiZGVwdGgiLCAidGlwcy5mcm9tLmRlYyIsInNucElEIiwiTm8ub2YuU05QcyIpXQogICAgICB9CiAgICAgIGVkZ2VzMiA8LSByYmluZChlZGdlczIsIGVkZ2VzX3JhdykKICAgIH0KICB9ZWxzZXsKICAgIGVkZ2VzMiA8LSBlZGdlczIKICB9Cn0KCm5vZGVzIDwtIHN1YnNldF9jbGFkZXModHIyX3NucHMsMjApCm5vZGVzJG1hakNsYWRlLm5vZGUuZGVwdGggPC0gcm91bmQobm9kZXMkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KQpub2RlcyAlPiUKICBkcGx5cjo6ZGlzdGluY3QobWFqQ2xhZGUubm9kZS5kZXB0aCkgLT4gdW5pcXVlQ29hbFRpbWUKZm9yIChpIGluIHNlcShucm93KHVuaXF1ZUNvYWxUaW1lKSkpewogIGVkZ2VzX3JhdyA8LSBub2Rlc1t3aGljaChub2RlcyRtYWpDbGFkZS5ub2RlLmRlcHRoID09IHVuaXF1ZUNvYWxUaW1lW2ksXSksXQogIGVkZ2VzX3JhdyRzbnBJRCA8LSBsaXN0KGVkZ2VzX3JhdyRzbnBJRCkKICBlZGdlc19yYXckTm8ub2YuU05QcyA8LSBucm93KGVkZ2VzX3JhdykKICBlZGdlc19yYXckdGlwcy5mcm9tLmRlYyA8LSAiQUxMIgogIGVkZ2VzX3JhdyRkZXB0aCAgPC0gZWRnZXNfcmF3JG1hakNsYWRlLm5vZGUuZGVwdGgKICBlZGdlc19yYXcgPC0gZWRnZXNfcmF3WzEsYygiZGVwdGgiLCAidGlwcy5mcm9tLmRlYyIsInNucElEIiwiTm8ub2YuU05QcyIpXQogIGVkZ2VzMjwtIHJiaW5kKGVkZ2VzMiwgZWRnZXNfcmF3KQp9CnJvdy5uYW1lcyhlZGdlczIpIDwtIHNlcShucm93KGVkZ2VzMikpCmVkZ2VzMiRlZGdlSUQgPC0gc2VxKG5yb3coZWRnZXMyKSkKYGBgCgpgYGB7cn0KIyMgU2VsZWN0IGVkZ2VzIHN1cHBvcnRlZCBieSAzIG9yIG1vcmUgU05QcwppbXBfZWRnZXMyIDwtIGVkZ2VzMltlZGdlczIkTm8ub2YuU05QcyA+PTMgJiBlZGdlczIkZGVwdGggPD01ICwgXSAjMTIgaW1wb3J0YW50IGVkZ2VzCm5yb3coaW1wX2VkZ2VzMikKaW1wX2VkZ2VzMiA8LSBpbXBfZWRnZXMyW29yZGVyKGltcF9lZGdlczIkZGVwdGgpLF0KYGBgCgpgYGB7cn0KIyMgRmluZCBoYXBsb3R5cGUgYmxvY2tzCgojc2luZ2xldG9ucwpibDFfYzI8LWZpbmRfY2xhZGVfZGVwdGhzKHN1YnNldF9jbGFkZXModHIyX3NucHMsIDE5KSwgdHIyX3NucHNfbGlzdCwgY291bnQgPSAxOSwgaW5kcyA9IGMoMzApKQppbmRzMV9jMiA8LSBjKDMwKQpoYXBibG9jazFfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kczFfYzIsIGltcF9lZGdlczIkZGVwdGhbMV0sICJhbGwiLCBULCB0cjJfc3ViX2xpc3QpCmhhcGJsb2NrMV9jMl9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2sxX2MyKQoKYmwyX2MyPC1maW5kX2NsYWRlX2RlcHRocyhzdWJzZXRfY2xhZGVzKHRyMl9zbnBzLCAxOSksIHRyMl9zbnBzX2xpc3QsIGNvdW50ID0gMTksIGluZHMgPSBjKDEzKSkKaW5kczJfYzIgPC0gYygxMykKaGFwYmxvY2syX2MyIDwtIGZpbmRfaGFwYmxvY2tzKGluZHMyX2MyLCBpbXBfZWRnZXMyJGRlcHRoWzJdLCAiYWxsIiwgVCwgdHIyX3N1Yl9saXN0KQpoYXBibG9jazJfYzJfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrMl9jMikKCiNkb3VibGV0b25zCmJsM19jMjwtZmluZF9jbGFkZV9kZXB0aHMoc3Vic2V0X2NsYWRlcyh0cjJfc25wcywgMTgpLCB0cjJfc25wc19saXN0LCBjb3VudCA9IDE4LCBpbmRzID0gYygyMiwyMSkpCmluZHMzX2MyIDwtIGMoMjIsMjEpCmhhcGJsb2NrM19jMiA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzM19jMiwgaW1wX2VkZ2VzMiRkZXB0aFszXSwgImFsbCIsIFQsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2szX2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazNfYzIpCgpibDRfYzI8LWZpbmRfY2xhZGVfZGVwdGhzKHN1YnNldF9jbGFkZXModHIyX3NucHMsIDE4KSwgdHIyX3NucHNfbGlzdCwgY291bnQgPSAxOCwgaW5kcyA9IGMoMTgsMjIpKQppbmRzNF9jMiA8LSBjKDE4LDIyKQpoYXBibG9jazRfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kczRfYzIsIGltcF9lZGdlczIkZGVwdGhbNF0sICJhbGwiLCBULCB0cjJfc3ViX2xpc3QpCmhhcGJsb2NrNF9jMl9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2s0X2MyKQoKCiMjIEZpeGVkIFNOUHMKaW5kc0FMTCA8LSBsYXRpdml0dGFfaW5kaXZpZHVhbHMKdHIyX2NvdW50MjAgPC0gc3Vic2V0X2NsYWRlcyh0cjJfc25wcywgMjApCgpibDZfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzZdKSxjKCJwb3MiLCJzbnBJRCIpXQpoYXBibG9jazZfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFs2XSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2s2X2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazZfYzIpCgpibDdfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzddKSxjKCJwb3MiLCJzbnBJRCIpXQpoYXBibG9jazdfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFs3XSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2s3X2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazdfYzIpCgpibDhfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzhdKSxjKCJwb3MiLCJzbnBJRCIpXQpoYXBibG9jazhfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFs4XSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2s4X2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazhfYzIpCgpibDlfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzldKSxjKCJwb3MiLCJzbnBJRCIpXQpoYXBibG9jazlfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFs5XSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKaGFwYmxvY2s5X2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazlfYzIpCgojIGJsMTBfYzIgPC0gdHIyX2NvdW50MjBbd2hpY2gocm91bmQodHIyX2NvdW50MjAkbWFqQ2xhZGUubm9kZS5kZXB0aCw0KSA9PSBpbXBfZWRnZXMyJGRlcHRoWzEwXSksYygicG9zIiwic25wSUQiKV0KIyBoYXBibG9jazEwX2MyIDwtIGZpbmRfaGFwYmxvY2tzKGluZHNBTEwsIGltcF9lZGdlczIkZGVwdGhbMTBdLCAiYWxsIiwgRiwgdHIyX3N1Yl9saXN0KQojIGhhcGJsb2NrMTBfYzJfYWxsIDwtIGZpbmRfZGlzanVuY3RfaGFwYmxvY2tzKGhhcGJsb2NrMTBfYzIpCiMgCiMgYmwxMV9jMiA8LSB0cjJfY291bnQyMFt3aGljaChyb3VuZCh0cjJfY291bnQyMCRtYWpDbGFkZS5ub2RlLmRlcHRoLDQpID09IGltcF9lZGdlczIkZGVwdGhbMTFdKSxjKCJwb3MiLCJzbnBJRCIpXQojIGhhcGJsb2NrMTFfYzIgPC0gZmluZF9oYXBibG9ja3MoaW5kc0FMTCwgaW1wX2VkZ2VzMiRkZXB0aFsxMV0sICJhbGwiLCBGLCB0cjJfc3ViX2xpc3QpCiMgaGFwYmxvY2sxMV9jMl9hbGwgPC0gZmluZF9kaXNqdW5jdF9oYXBibG9ja3MoaGFwYmxvY2sxMV9jMikKIyAKIyBibDEyX2MyIDwtIHRyMl9jb3VudDIwW3doaWNoKHJvdW5kKHRyMl9jb3VudDIwJG1hakNsYWRlLm5vZGUuZGVwdGgsNCkgPT0gaW1wX2VkZ2VzMiRkZXB0aFsxMl0pLGMoInBvcyIsInNucElEIildCiMgaGFwYmxvY2sxMl9jMiA8LSBmaW5kX2hhcGJsb2NrcyhpbmRzQUxMLCBpbXBfZWRnZXMyJGRlcHRoWzEyXSwgImFsbCIsIEYsIHRyMl9zdWJfbGlzdCkKIyBoYXBibG9jazEyX2MyX2FsbCA8LSBmaW5kX2Rpc2p1bmN0X2hhcGJsb2NrcyhoYXBibG9jazEyX2MyKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MjAsIGVjaG89RiwgcmVzdWx0cz1GLCB3YXJuaW5nPUYsIGluY2x1ZGU9Rn0KcGFyKG1mcm93PWMoMywxKSkKCnBsb3RfYWxsX3NpdGVzKGZvY2FsX3NpdGVzLCBhcy5jaGFyYWN0ZXIoMSkpICsKICAjYXhpcyhzaWRlID0yLCB0aWNrID1ULCBhdCA9IGMoMjE6NDApLCBsYWJlbHMgPSBGKSArCiAgcG9pbnRzKHJlcCgoYmwzX2MyJHBvcyksIGVhY2ggPSAyKSwgcmVwKHdoaWNoKHNhbXBJRCRBUkd3ZWF2ZXJJRCA9PSBjKDIxLDIyKSksbnJvdyhibDNfYzIpKSAsIGNvbD0ncGluaycsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsNF9jMiRwb3MpLCBlYWNoID0gMiksIHJlcCh3aGljaChzYW1wSUQkQVJHd2VhdmVySUQgPT0gYygxOCwyMikpLG5yb3coYmw0X2MyKSkgLCBjb2w9J3llbGxvdycsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsNl9jMiRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw2X2MyKSkgLCBjb2w9J2RhcmtibHVlJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw3X2MyJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDdfYzIpKSAsIGNvbD0nY3lhbicsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsOF9jMiRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw4X2MyKSkgLCBjb2w9J21hZ2VudGEnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDlfYzIkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsOV9jMikpICwgY29sPSdzaWVubmEnLCBwY2g9MTksIGNleCA9IDEpCgogIyBwb2ludHMoKHNpdGVzJHBvc1t3aGljaChzaXRlcyRzbnBJRCAlaW4lIHRyZWVzX3RvX3Bsb3QpXS1wb3MwKS8xZTMsIHJlcCgxLDYpLCBwY2ggPTE3LCBjZXggPSAyKQoKCnBsb3QoaGFwYmxvY2s0X2MyJGNocm9tU3RhcnQsIGhhcGJsb2NrNF9jMiRsZW5ndGgsIHR5cGU9Im4iLCBsb2c9InkiLCB5bGltPWMoMC4wMSwxNSksIHhsYWI9IiIsIHlsYWI9IlRpbWUgKE5lKSIsIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCkpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrM19jMl9hbGwsICJwaW5rIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MyX2FsbCwgInllbGxvdyIsIEYpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2szX2MyX2FsbCwgInJlZCIsIFQpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MyX2FsbCwgImJsdWUiLCBUKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazZfYzJfYWxsLCAiZGFya2JsdWUiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazdfYzJfYWxsLCAiY3lhbiIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrOF9jMl9hbGwsICJtYWdlbnRhIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s5X2MyX2FsbCwgInNpZW5uYSIsIEYpCgogICMgcG9pbnRzKChzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMC4wMDEsNiksIHBjaCA9MTcsIGNleCA9IDIpICsKICAjIGFibGluZSh2PShzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCBsdHkgPSAyLCBsd2QgPSAwLjgpCgoKcGxvdChnZW45MjAwLCB0bXJjYTkyMDAkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9J3MnLCBjb2wgPSAiYmxhY2siLCBsd2Q9MC44LCBsb2c9InkiLCAKICAgICB5bGltPWMoMWUtMiwxNSksIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCksIHhsYWIgPSAiUG9zaXRpb24gKGtCKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIpICsKICBsaW5lcyhnZW45MjAwX25vdCwgdG1yY2E5MjAwX25vdCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0icyIsIGNvbCA9ICIjQ0NDQzAwIiwgbHdkPTEpICsKICAgIGxpbmVzKGdlbjkyMDBfbGF0LCB0bXJjYTkyMDBfbGF0JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDMDBDMjgiLCBsd2Q9MykKYGBgCgpgYGB7ciBmaWc2LCBmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9NywgZWNobz1GLCByZXN1bHRzPUYsIG1lc3NhZ2U9RiwgaW5jbHVkZT1GfQpwYXIobWZyb3c9YygyLDUpKQpmb3IgKGkgaW4gYygxOjEzNykpewogIHBsb3RUcmVlKHRyMl9zbnBzJHRyZWVbaV0sIAogICAgICAgICAgI2tlZXBTZXFzID0gYXMuY2hhcmFjdGVyKGxhdGl2aXR0YV9pbmRpdmlkdWFscyksCiAgICAgICAgICBsZWFmQ29sID0gaW5kQ29sb3VyX2FyZ0lEcywgeWxhYj1pLCAKICAgICAgICAgIGxvZ1NjYWxlID0gVCwgeWxpbT1jKDFlLTIsMTUpLCB0aW1lU2NhbGUgPSAxL05lLCBjZXgubGFiID0gMS4zKQp9CmBgYAoKIyMjIyBIYXBvdHlwZSBibG9ja3MgZnJvbSBib3RoIGl0ZXJhdGlvbnMKKipGaWdTOSoqIHNob3dzIHRoZSBoYXBsb3R5cGUgYmxvY2tzIGFuZCB0aGUgU05QcyB0aGF0IHN1cHBvcnQgZWFjaCBibG9jayBmcm9tIGJvdGggaXRlcmF0aW9ucy4gCgoKYGBge3IgZmlnOSwgZmlnLndpZHRoPTE3LCBmaWcuaGVpZ2h0PTgsIGVjaG89RiwgcmVzdWx0cz1GLCBtZXNzYWdlPUZ9CiMjIHBsb3QgMiBpdGVyYXRpb25zIHNpZGUgYnkgc2lkZQpwYXIobWZyb3c9YygzLDIpLCBjZXgubGFiID0gMS40LCBjZXguYXhpcyA9IDEuMikKCnBsb3RfYWxsX3NpdGVzKGZvY2FsX3NpdGVzLCBhcy5jaGFyYWN0ZXIoMSkpICsKICBheGlzKHNpZGUgPTIsIHRpY2sgPVQsIGF0ID0gYygyMTo0MCksIGxhYmVscyA9IEYpICsKICBwb2ludHMocmVwKChibDNfYzEkcG9zKSwgZWFjaCA9IDIpLCByZXAod2hpY2goc2FtcElEJEFSR3dlYXZlcklEID09IGMoMjEsMjIpKSxucm93KGJsM19jMSkpICwgY29sPSdwaW5rJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw0X2MxJHBvcyksIGVhY2ggPSAyKSwgcmVwKHdoaWNoKHNhbXBJRCRBUkd3ZWF2ZXJJRCA9PSBjKDE4LDIyKSksbnJvdyhibDRfYzEpKSAsIGNvbD0neWVsbG93JywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw2X2MxJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDZfYzEpKSAsIGNvbD0nZGFya2JsdWUnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDdfYzEkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsN19jMSkpICwgY29sPSdjeWFuJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw4X2MxJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDhfYzEpKSAsIGNvbD0nbWFnZW50YScsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsOV9jMSRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw5X2MxKSkgLCBjb2w9J3NpZW5uYScsIHBjaD0xOSwgY2V4ID0gMSkgIysKCiAjIHBvaW50cygoc2l0ZXMkcG9zW3doaWNoKHNpdGVzJHNucElEICVpbiUgdHJlZXNfdG9fcGxvdCldLXBvczApLzFlMywgcmVwKDEsNiksIHBjaCA9MTcsIGNleCA9IDIpCgpwbG90X2FsbF9zaXRlcyhmb2NhbF9zaXRlcywgYXMuY2hhcmFjdGVyKDEpKSArCiAgI2F4aXMoc2lkZSA9MiwgdGljayA9VCwgYXQgPSBjKDIxOjQwKSwgbGFiZWxzID0gRikgKwogIHBvaW50cyhyZXAoKGJsM19jMiRwb3MpLCBlYWNoID0gMiksIHJlcCh3aGljaChzYW1wSUQkQVJHd2VhdmVySUQgPT0gYygyMSwyMikpLG5yb3coYmwzX2MyKSkgLCBjb2w9J3BpbmsnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDRfYzIkcG9zKSwgZWFjaCA9IDIpLCByZXAod2hpY2goc2FtcElEJEFSR3dlYXZlcklEID09IGMoMTgsMjIpKSxucm93KGJsNF9jMikpICwgY29sPSd5ZWxsb3cnLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDZfYzIkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsNl9jMikpICwgY29sPSdkYXJrYmx1ZScsIHBjaD0xOSwgY2V4ID0gMSkgKwogIHBvaW50cyhyZXAoKGJsN19jMiRwb3MpLCBlYWNoID0gMjApLCByZXAoMjE6NDAsIG5yb3coYmw3X2MyKSkgLCBjb2w9J2N5YW4nLCBwY2g9MTksIGNleCA9IDEpICsKICBwb2ludHMocmVwKChibDhfYzIkcG9zKSwgZWFjaCA9IDIwKSwgcmVwKDIxOjQwLCBucm93KGJsOF9jMikpICwgY29sPSdtYWdlbnRhJywgcGNoPTE5LCBjZXggPSAxKSArCiAgcG9pbnRzKHJlcCgoYmw5X2MyJHBvcyksIGVhY2ggPSAyMCksIHJlcCgyMTo0MCwgbnJvdyhibDlfYzIpKSAsIGNvbD0nc2llbm5hJywgcGNoPTE5LCBjZXggPSAxKQoKICMgcG9pbnRzKChzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMSw2KSwgcGNoID0xNywgY2V4ID0gMikKCnBsb3QoaGFwYmxvY2sxX2MxJGNocm9tU3RhcnQsIGhhcGJsb2NrMV9jMSRsZW5ndGgsIHR5cGU9Im4iLCBsb2c9InkiLCB5bGltPWMoMC4wMSwxNSksIHhsYWI9IiIsIHlsYWI9IlRpbWUgKE5lKSIsIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCkpICsKICAjcGxvdF9oYXBibG9jayhoYXBibG9jazJfYzFfYWxsLCAicGluayIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrM19jMV9hbGwsICJwaW5rIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MxX2FsbCwgInllbGxvdyIsIEYpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s1X2MxX2FsbCwgImJsdWUiLCBUKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazZfYzFfYWxsLCAiZGFya2JsdWUiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazdfYzFfYWxsLCAiY3lhbiIsIEYpICMrCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazhfYzFfYWxsLCAibWFnZW50YSIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrOV9jMV9hbGwsICJzaWVubmEiLCBGKQogICMgcG9pbnRzKChzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMC4wMDEsNiksIHBjaCA9MTcsIGNleCA9IDIpICsKICAjIGFibGluZSh2PShzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCBsdHkgPSAyLCBsd2QgPSAwLjgpCgoKCnBsb3QoaGFwYmxvY2s0X2MyJGNocm9tU3RhcnQsIGhhcGJsb2NrNF9jMiRsZW5ndGgsIHR5cGU9Im4iLCBsb2c9InkiLCB5bGltPWMoMC4wMSwxNSksIHhsYWI9IiIsIHlsYWI9IlRpbWUgKE5lKSIsIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCkpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrM19jMl9hbGwsICJwaW5rIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MyX2FsbCwgInllbGxvdyIsIEYpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2szX2MyX2FsbCwgInJlZCIsIFQpICsKICAjIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s0X2MyX2FsbCwgImJsdWUiLCBUKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazZfYzJfYWxsLCAiZGFya2JsdWUiLCBGKSArCiAgcGxvdF9oYXBibG9jayhoYXBibG9jazdfYzJfYWxsLCAiY3lhbiIsIEYpICsKICBwbG90X2hhcGJsb2NrKGhhcGJsb2NrOF9jMl9hbGwsICJtYWdlbnRhIiwgRikgKwogIHBsb3RfaGFwYmxvY2soaGFwYmxvY2s5X2MyX2FsbCwgInNpZW5uYSIsIEYpCgogICMgcG9pbnRzKChzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCByZXAoMC4wMDEsNiksIHBjaCA9MTcsIGNleCA9IDIpICsKICAjIGFibGluZSh2PShzaXRlcyRwb3Nbd2hpY2goc2l0ZXMkc25wSUQgJWluJSB0cmVlc190b19wbG90KV0tcG9zMCkvMWUzLCBsdHkgPSAyLCBsd2QgPSAwLjgpCgpwbG90KGdlbjgyNTAsIHRtcmNhODI1MCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0ncycsIGNvbCA9ICJibGFjayIsIGx3ZD0wLjgsIGxvZz0ieSIsIAogICAgIHlsaW09YygxZS0yLDE1KSwgeGxpbT1jKDEzODYwMDAsIDEzODkwMDApLCB4bGFiID0gIlBvc2l0aW9uIChrQikiLCB5bGFiID0gIlRNUkNBIChOZSkiKSArCiAgbGluZXMoZ2VuODI1MF9ub3QsIHRtcmNhODI1MF9ub3QkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9InMiLCBjb2wgPSAiI0NDQ0MwMCIsIGx3ZD0xKSArCiAgICBsaW5lcyhnZW44MjUwX2xhdCwgdG1yY2E4MjUwX2xhdCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0icyIsIGNvbCA9ICIjQzAwQzI4IiwgbHdkPTMpCgoKcGxvdChnZW45MjAwLCB0bXJjYTkyMDAkdG1yY2FfcXVhbnRpbGVfMC41MDAvTmUsIHR5cGU9J3MnLCBjb2wgPSAiYmxhY2siLCBsd2Q9MC44LCBsb2c9InkiLCAKICAgICB5bGltPWMoMWUtMiwxNSksIHhsaW09YyhjaHJvbVN0YXJ0LCBjaHJvbUVuZCksIHhsYWIgPSAiUG9zaXRpb24gKGtCKSIsIHlsYWIgPSAiVE1SQ0EgKE5lKSIpICsKICBsaW5lcyhnZW45MjAwX25vdCwgdG1yY2E5MjAwX25vdCR0bXJjYV9xdWFudGlsZV8wLjUwMC9OZSwgdHlwZT0icyIsIGNvbCA9ICIjQ0NDQzAwIiwgbHdkPTEpICsKICAgIGxpbmVzKGdlbjkyMDBfbGF0LCB0bXJjYTkyMDBfbGF0JHRtcmNhX3F1YW50aWxlXzAuNTAwL05lLCB0eXBlPSJzIiwgY29sID0gIiNDMDBDMjgiLCBsd2Q9MykKYGBgCgo=