Participants
- Okezie Uche-Ikonne, Department of Mathematics and Statistics, Lancaster University, Lancaster, UK, o.uche-ikonne@lancaster.ac.uk
- Michael Holmes, Medical Research Council Population Health Research Unit at the University of Oxford, Oxford, UK.
- Frank Dondelinger, Faculty of Health and Medicine, Lancaster University, Lancaster, UK.
- Tom Palmer, Department of Mathematics and Statistics, Lancaster University, Lancaster, UK.
Motivation
There has been considerable research on the role of blood lipids and their associations with various cardiovascular traits (Holmes and Davey Smith 2018). While observational analyses have led to naïve classifications of “good” (higher density lipoprotein, HDL) and “bad” (lower density lipoprotein, LDL) blood lipids, the underlying causal relationships suggest that while LDL and triglycerides may have atherogenic characteristics, HDL-cholesterol is unlikely to play an important role in atherogenesis.
The MRDataChallenge provides a summary level dataset by which contains the associations of genotypes (comprising 148 SNPs) with lipid traits and the associations of genotypes with 7 outcomes (W. Spiller, Bowden, and Zuber 2019). Of the seven outcomes, we selected ischemic stroke to investigate the casual relationship of LDL and HDL lipid traits using the Mendelian randomization (MR) approach (Davey Smith and Ibrahim 2003). Figures 2.1 and 2.2 represent the DAGs for the proposed analysis.
One cause of ischaemic stroke is the development of atherosclerosis, in which build-up of fatty deposits in the arterial wall leads to development of a plaque, which can disrupt the supply of oxygenated blood flow to the brain. There is strong evidence that LDL-related lipid phenotypes are causally implicated in the aetiology of atherosclerosis and coronary heart disease.
In a recent comment piece, Holmes and Ala-Korpela (2019) discussed that there is a size dependent threshold whereby lipid species that are bigger than small VLDLs, are too large to enter the arterial intima, as shown in Figure 2.3. Therefore, in our analysis we focused our investigation on those lipid species smaller than small VLDL: i.e. IDL and LDL. In addition, we wished to assess the causal relevance of HDL species.
Data
The MR Challenge data consists of summary data of the association of 148 genotypes with 118 lipid traits and 7 outcomes. We have trimmed the number of exposures used. Our low-density lipoprotein (LDL) analysis consists of 11 exposures whilst we have used 14 lipid traits associated with high-density lipoproteins (HDL).
The atherogenic lipid traits we investigated are;
- Concentration of IDL particles
- Free cholesterol in IDL
- Cholesterol esters in large LDL
- Free cholesterol in large LDL
- Phospholipids in IDL
- Concentration of Large LDL particles
- Phospholipids in large LDL
- Cholesterol esters in medium LDL
- Concentration of medium LDL particles
- Phospholipids in medium LDL
- Concentration of small LDL particles.
The lipid traits related to HDL that we investigated are;
- Cholesterol esters in large HDL
- Concentration of large HDL particles
- Phospholipids in large HDL
- Cholesterol esters in medium HDL
- Free cholesterol in medium HDL
- Concentration of medium HDL particles
- Phospholipids in medium HDL
- Concentration of small HDL particles
- Triglycerides in small HDL
- Cholesterol esters in very large HDL
- Free cholesterol in very large HDL
- Concentration of very large HDL particles
- Phospholipids in very large HDL
- Triglycerides in very large HDL.
Analysis Methods
We used the inverse variance weighted (IVW) method to estimate the causal effect in summary-level data (Burgess, Butterworth, and Thompson 2013). The IVW model is denoted in equation (4.1) where for a genotype \(j\), \(\widehat\Gamma_j\) represents the estimated genotype-outcome associations, \(\widehat\gamma_j\) represents the estimated genotype-phenotype associations, and \(\sigma_{yj}\) represents the estimated standard errors of the genotype-outcome associations.
\[
\frac{\hat{\Gamma}_{j}}{\sigma_{y_j}} = \frac{\beta\gamma_j}{\sigma_{y_j}} + \varepsilon_j, \quad \varepsilon_j \sim N(0,1)
\tag{4.1}
\]
We perform sensitivity analysis for our IVW estimates using the MR-Egger model (Bowden, Davey Smith, and Burgess 2015). The MR-Egger model is an extension of the IVW model (4.1) which includes the average pleiotropic effect as an intercept. By convention the residual variance is constrained to be greater than 1, which usually means that the MR-Egger model gives larger standard errors on its estimated causal effect than the IVW model. Equation (4.2) denotes the MR-Egger model.
\[
\frac{\hat{\Gamma}_{j}}{\sigma_{y_j}} = \frac{\beta_0}{\sigma_{y_j}} + \frac{\beta\gamma_j}{\sigma_{y_j}} + \varepsilon_j, \quad \varepsilon_j \sim N(0,\sigma^2)
\tag{4.2}
\]
We also investigated causal effects of lipid traits adjusted for other traits using the multivariable MR (MVMR) method (Burgess, Dudbridge, and Thompson 2015) as shown in equation (4.3).
\[
\hat{\Gamma}_j = \beta_1\hat{\gamma}_{1,j} + \beta_2\hat{\gamma}_{2,j} + \varepsilon_j, \quad \varepsilon_j \sim N(0,\sigma^2).
\tag{4.3}
\]
To select which of the 148 genotypes to include in our analysis we took two approaches:
- We selected genotypes with genome-wide significant p-values (\(p < 5 \times 10^{-8}\)) with the specific lipid trait of interest. These results are in Section 4;
- We also selected genotypes based upon their individual contribution towards the Q-statistic, for either the IVW or MR-Egger model (Bowden et al. 2018). Therefore, in this case we selected genotypes with Q-statistic p-values \(\geq 0.05\). These results are in Section 5.
We investigated the causal effect of each selected lipid trait and we then perform a meta-analysis our causal effect estimates according to their size and their specific trait.
Results
GWAS-significant genotype-phenotype associations
IVW estimates
IVW estimates of the causal effect of lipid fractions related to LDLs are shown in Table 5.1 and Figure 5.1. We can see from the SNPs column that the number of selected SNPs is small for all the traits. The MR point estimates are positive which means that on average a higher level of LDL related lipid is related to a higher risk of ischemic stroke (since the associations are risk estimates on the log scale). However, the estimates all report confidence intervals spanning the null. The positive point estimates concur with our scientific expectations as the atherogenic characteristic increase the risk of ischemic stroke. However, more instruments would be needed to increase the statistical power of these estimates.
Table 5.1: IVW estimates for exposures related LDLs
Exposures
|
Estimate
|
SE
|
LI
|
UI
|
Pval
|
SNPs
|
Free cholesterol in IDL
|
0.0168
|
0.0723
|
-0.1249
|
0.1584
|
0.8165
|
4
|
Concentration of IDL particles
|
0.0137
|
0.058
|
-0.1
|
0.1274
|
0.8131
|
5
|
Phospholipids in IDL
|
0.0178
|
0.0756
|
-0.1303
|
0.1659
|
0.8138
|
4
|
Cholesterol esters in large LDL
|
0.0446
|
0.0659
|
-0.0846
|
0.1738
|
0.4988
|
3
|
Free cholesterol in large LDL
|
0.0926
|
0.0863
|
-0.0765
|
0.2616
|
0.2831
|
4
|
Concentration of large LDL particles
|
0.0483
|
0.0651
|
-0.0792
|
0.1759
|
0.4578
|
3
|
Phospholipids in large LDL
|
0.0411
|
0.0742
|
-0.1043
|
0.1864
|
0.5797
|
6
|
Cholesterol esters in medium LDL
|
0.0423
|
0.0674
|
-0.0898
|
0.1744
|
0.5306
|
3
|
Concentration of medium LDL particles
|
0.0445
|
0.0675
|
-0.0879
|
0.1768
|
0.5101
|
3
|
Phospholipids in medium LDL
|
0.091
|
0.0923
|
-0.09
|
0.272
|
0.3247
|
4
|
Concentration of small LDL particles
|
0.0344
|
0.0738
|
-0.1102
|
0.179
|
0.6408
|
4
|
Table 5.2 and Figure 5.2 show causal estimates of lipid fractions related to the HDLs. These point estimates are generally negative with confidence intervals spanning the null. In the Table shaded cells indicate a small number of genotypes, which is of interest because the MR-Egger estimator cannot be performed with these lipid traits due to the low number of instruments.
Table 5.2: IVW estimates for exposures related HDLs
Exposures
|
Estimate
|
SE
|
LI
|
UI
|
Pval
|
SNPs
|
Cholesterol esters in large HDL
|
-0.0134
|
0.048
|
-0.1075
|
0.0807
|
0.7807
|
3
|
Concentration of large HDL particles
|
-0.0179
|
0.0471
|
-0.1102
|
0.0745
|
0.7045
|
3
|
Phospholipids in large HDL
|
-0.0222
|
0.0505
|
-0.1211
|
0.0767
|
0.66
|
3
|
Cholesterol esters in medium HDL
|
-0.0399
|
0.1071
|
-0.2497
|
0.17
|
0.7096
|
1
|
Free cholesterol in medium HDL
|
-0.0486
|
0.1306
|
-0.3045
|
0.2073
|
0.7096
|
1
|
Concentration of medium HDL particles
|
-0.1014
|
0.1221
|
-0.3407
|
0.1379
|
0.4064
|
1
|
Phospholipids in medium HDL
|
-0.1212
|
0.146
|
-0.4074
|
0.1649
|
0.4064
|
1
|
Concentration of small HDL particles
|
-0.0225
|
0.0524
|
-0.1253
|
0.0802
|
0.6673
|
2
|
Triglycerides in small HDL
|
-0.0268
|
0.0901
|
-0.2035
|
0.1498
|
0.7659
|
2
|
Cholesterol esters in very large HDL
|
-0.0048
|
0.056
|
-0.1145
|
0.1049
|
0.932
|
2
|
Free cholesterol in very large HDL
|
8e-04
|
0.0482
|
-0.0937
|
0.0952
|
0.9875
|
3
|
Concentration of very large HDL particles
|
-0.0042
|
0.0479
|
-0.098
|
0.0896
|
0.9297
|
2
|
Phospholipids in very large HDL
|
-0.0032
|
0.0393
|
-0.0802
|
0.0738
|
0.9357
|
4
|
Triglycerides in very large HDL
|
-0.0121
|
0.0385
|
-0.0875
|
0.0633
|
0.7524
|
2
|
MR-Egger estimates
In this section, we use the MR-Egger model to perform sensitivity analysis for the IVW estimates. Table 5.3 shows estimates from the MR-Egger model for lipid fractions related to LDLs. In general the point estimates are positive and larger in magnitude than the IVW estimates. The one exception is the point estimate for phospholipids in medium LDL, which shows a negative causal estimate with a confidence interval spanning the null. We find no strong evidence against the null hypothesis of no pleiotropy, since the estimates of the intercepts (AvgPleio
) are all close to the null with large p-values.
Table 5.3: MR-Egger estimates for LDL related phenotypes
|
Estimate
|
SE
|
LI
|
UI
|
Pval
|
Free cholesterol in IDL
|
AvgPleio
|
-0.0156
|
0.0277
|
-0.0699
|
0.0387
|
0.5738
|
Causal
|
0.1787
|
0.2994
|
-0.4081
|
0.7654
|
0.5506
|
Concentration of IDL particles
|
AvgPleio
|
-0.0151
|
0.0257
|
-0.0656
|
0.0353
|
0.5563
|
Causal
|
0.1674
|
0.2688
|
-0.3594
|
0.6942
|
0.5335
|
Phospholipids in IDL
|
AvgPleio
|
-0.0196
|
0.0299
|
-0.0781
|
0.0390
|
0.5128
|
Causal
|
0.2321
|
0.3380
|
-0.4304
|
0.8945
|
0.4923
|
Concentration of IDL particles
|
AvgPleio
|
-0.0462
|
0.0627
|
-0.1691
|
0.0766
|
0.4608
|
Causal
|
0.5433
|
0.6840
|
-0.7973
|
1.8840
|
0.4270
|
Free cholesterol in large LDL
|
AvgPleio
|
0.0020
|
0.0339
|
-0.0645
|
0.0685
|
0.9531
|
Causal
|
0.0688
|
0.4174
|
-0.7493
|
0.8870
|
0.8690
|
Concentration of large LDL particles
|
AvgPleio
|
-0.0451
|
0.0470
|
-0.1372
|
0.0471
|
0.3377
|
Causal
|
0.5262
|
0.5064
|
-0.4664
|
1.5188
|
0.2988
|
Phospholipids in large LDL
|
AvgPleio
|
-0.0092
|
0.0268
|
-0.0618
|
0.0433
|
0.7307
|
Causal
|
0.1594
|
0.3535
|
-0.5334
|
0.8523
|
0.6519
|
Cholesterol esters in medium LDL
|
AvgPleio
|
-0.0531
|
0.0828
|
-0.2152
|
0.1091
|
0.5214
|
Causal
|
0.6299
|
0.9232
|
-1.1795
|
2.4394
|
0.4950
|
Concentration of medium LDL particles
|
AvgPleio
|
-0.0536
|
0.0701
|
-0.1911
|
0.0839
|
0.4447
|
Causal
|
0.6382
|
0.7838
|
-0.8979
|
2.1743
|
0.4155
|
Phospholipids in medium LDL
|
AvgPleio
|
0.0210
|
0.0606
|
-0.0977
|
0.1397
|
0.7287
|
Causal
|
-0.1769
|
0.7799
|
-1.7056
|
1.3518
|
0.8206
|
Concentration of small LDL particles
|
AvgPleio
|
-0.0046
|
0.0452
|
-0.0932
|
0.0840
|
0.9193
|
Causal
|
0.0853
|
0.5099
|
-0.9140
|
1.0846
|
0.8672
|
Sensitivity analysis of the lipid traits related to HDLs in Table 5.4 show negative point estimates with confidence intervals spanning the null. This would fit with a narrative of HDL either being protective or having a null effect on the risk of ischemic stroke, however the evidence against the null hypothesis is very weak.
Table 5.4: MR-Egger estimates for HDL related phenotypes
|
Estimate
|
SE
|
LI
|
UI
|
Pval
|
Cholesterol esters in large HDL
|
AvgPleio
|
0.0407
|
0.0442
|
-0.0459
|
0.1274
|
0.3570
|
Causal
|
-0.2675
|
0.2801
|
-0.8165
|
0.2814
|
0.3395
|
Concentration of large HDL particles
|
AvgPleio
|
0.0359
|
0.0328
|
-0.0284
|
0.1002
|
0.2741
|
Causal
|
-0.2350
|
0.2040
|
-0.6348
|
0.1649
|
0.2495
|
Phospholipids in large HDL
|
AvgPleio
|
0.0282
|
0.0265
|
-0.0237
|
0.0800
|
0.2869
|
Causal
|
-0.2019
|
0.1761
|
-0.5471
|
0.1433
|
0.2517
|
Free cholesterol in very large HDL
|
AvgPleio
|
0.0249
|
0.0285
|
-0.0310
|
0.0808
|
0.3819
|
Causal
|
-0.1686
|
0.1996
|
-0.5599
|
0.2226
|
0.3983
|
Phospholipids in very large HDL
|
AvgPleio
|
0.0182
|
0.0253
|
-0.0314
|
0.0678
|
0.4714
|
Causal
|
-0.1080
|
0.1508
|
-0.4037
|
0.1876
|
0.4737
|
Selecting genetic variants using Q-statistics
As most of the results presented hitherto have lacked statistical power, we therefore sought to increase the number of SNPs used as instruments, with the hope of increasing power, through the use of Q-statistics. This section presents results using genotypes based on their contribution to the Q-statistic in the IVW models.
IVW estimates
The estimates from the IVW model are given in Tables 5.11 and 5.12.
MR estimates in Table
5.11 show positive point estimates which agree with our expectations, the estimates also show significance (confidence intervals exclude null). However a major limitation here is that the SNPs used in the models are the same or largely overlapping, meaning that the MR estimates are unlikely to be valid. This is because the estimates from the genotype-outcome association are the same in each model with the genotype-exposure association varying for each lipid trait leading to a simple scaling of the genotype-outcome associations for each trait. This makes it impossible to disentangle which trait has a true causal effect and which is confounded by using the same SNPs. This issue has been discussed previously by
Holmes, Ala-Korpela, and Davey Smith (2017).
Table 5.11: IVW estimates for exposures related LDLs
Exposures
|
Estimates
|
SE
|
LI
|
UI
|
Pval
|
SNPs
|
Free cholesterol in IDL
|
0.0965
|
0.0338
|
0.0302
|
0.1629
|
0.0043
|
133
|
Concentration of IDL particles
|
0.0991
|
0.0326
|
0.0353
|
0.163
|
0.0024
|
133
|
Phospholipids in IDL
|
0.102
|
0.0341
|
0.0352
|
0.1688
|
0.0028
|
134
|
Cholesterol esters in large LDL
|
0.1068
|
0.0358
|
0.0366
|
0.177
|
0.0029
|
133
|
Free cholesterol in large LDL
|
0.0984
|
0.0361
|
0.0277
|
0.1692
|
0.0064
|
133
|
Concentration of large LDL particles
|
0.1039
|
0.0343
|
0.0367
|
0.1712
|
0.0025
|
133
|
Phospholipids in large LDL
|
0.0991
|
0.0359
|
0.0287
|
0.1695
|
0.0058
|
133
|
Cholesterol esters in medium LDL
|
0.1105
|
0.0363
|
0.0393
|
0.1818
|
0.0024
|
133
|
Concentration of medium LDL particles
|
0.107
|
0.0357
|
0.037
|
0.1769
|
0.0027
|
133
|
Phospholipids in medium LDL
|
0.0946
|
0.0373
|
0.0214
|
0.1678
|
0.0113
|
133
|
Concentration of small LDL particles
|
0.0993
|
0.0362
|
0.0284
|
0.1703
|
0.0061
|
133
|
Results from Table 5.12 show causal estimates of lipid traits related to HDL with the increased number of SNPs. The point estimates are generally null or negative with small p-values. Triglycerides in small HDL show a positive causal effect on ischemic stroke with statistical significance. We show the MR-Egger model for this estimate below. Precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning the effect estimates from MR are unlikely to be valid.
Table 5.12: IVW estimates for exposures related HDLs
Exposures
|
Estimates
|
SE
|
LI
|
UI
|
Pval
|
SNPs
|
Cholesterol esters in large HDL
|
-0.0967
|
0.0301
|
-0.1557
|
-0.0378
|
0.0013
|
134
|
Concentration of large HDL particles
|
-0.0879
|
0.0302
|
-0.1471
|
-0.0288
|
0.0036
|
133
|
Phospholipids in large HDL
|
-0.0924
|
0.0312
|
-0.1535
|
-0.0313
|
0.0031
|
133
|
Cholesterol esters in medium HDL
|
-0.1651
|
0.0419
|
-0.2472
|
-0.083
|
1e-04
|
135
|
Free cholesterol in medium HDL
|
-0.1531
|
0.0442
|
-0.2396
|
-0.0665
|
5e-04
|
135
|
Concentration of medium HDL particles
|
-0.1391
|
0.0447
|
-0.2267
|
-0.0515
|
0.0019
|
135
|
Phospholipids in medium HDL
|
-0.1567
|
0.0454
|
-0.2456
|
-0.0678
|
6e-04
|
135
|
Concentration of small HDL particles
|
-0.0656
|
0.0409
|
-0.1458
|
0.0146
|
0.1091
|
135
|
Triglycerides in small HDL
|
0.1583
|
0.0411
|
0.0778
|
0.2387
|
1e-04
|
134
|
Cholesterol esters in very large HDL
|
-0.0832
|
0.0385
|
-0.1586
|
-0.0078
|
0.0305
|
131
|
Free cholesterol in very large HDL
|
-0.0827
|
0.0348
|
-0.1509
|
-0.0145
|
0.0174
|
132
|
Concentration of very large HDL particles
|
-0.0692
|
0.0348
|
-0.1374
|
-0.001
|
0.0467
|
131
|
Phospholipids in very large HDL
|
-0.0655
|
0.0299
|
-0.1242
|
-0.0068
|
0.0288
|
132
|
Triglycerides in very large HDL
|
0.026
|
0.0301
|
-0.033
|
0.085
|
0.3874
|
134
|
MR-Egger estimates
Table 5.13 shows results from the MR-Egger model for the lipid fractions related to LDLs. The results show no strong evidence against no pleiotropy with values from the AvgPleio
being close to the null with large p-values.
Note that precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning that the effect estimates from MR are unlikely to be valid.
Table 5.13: MR-Egger estimates for LDLs
|
Estimate
|
SE
|
LI
|
UI
|
Pval
|
Free cholesterol in IDL
|
AvgPleio
|
0.0010
|
0.0014
|
-0.0016
|
0.0037
|
0.4465
|
Causal
|
0.0689
|
0.0497
|
-0.0285
|
0.1662
|
0.1655
|
Concentration of IDL particles
|
AvgPleio
|
0.0019
|
0.0013
|
-0.0007
|
0.0045
|
0.1482
|
Causal
|
0.0501
|
0.0471
|
-0.0421
|
0.1423
|
0.2872
|
Phospholipids in IDL
|
AvgPleio
|
0.0025
|
0.0014
|
-0.0002
|
0.0051
|
0.0689
|
Causal
|
0.0349
|
0.0502
|
-0.0635
|
0.1333
|
0.4873
|
Concentration of IDL particles
|
AvgPleio
|
0.0006
|
0.0014
|
-0.0021
|
0.0032
|
0.6729
|
Causal
|
0.0906
|
0.0525
|
-0.0123
|
0.1935
|
0.0844
|
Free cholesterol in large LDL
|
AvgPleio
|
0.0018
|
0.0014
|
-0.0009
|
0.0044
|
0.1874
|
Causal
|
0.0474
|
0.0529
|
-0.0564
|
0.1512
|
0.3706
|
Concentration of large LDL particles
|
AvgPleio
|
0.0010
|
0.0013
|
-0.0016
|
0.0037
|
0.4469
|
Causal
|
0.0763
|
0.0500
|
-0.0217
|
0.1742
|
0.1268
|
Phospholipids in large LDL
|
AvgPleio
|
0.0013
|
0.0014
|
-0.0013
|
0.0040
|
0.3232
|
Causal
|
0.0608
|
0.0528
|
-0.0427
|
0.1643
|
0.2495
|
Cholesterol esters in medium LDL
|
AvgPleio
|
0.0004
|
0.0014
|
-0.0023
|
0.0031
|
0.7494
|
Causal
|
0.0978
|
0.0540
|
-0.0080
|
0.2036
|
0.0701
|
Concentration of medium LDL particles
|
AvgPleio
|
0.0000
|
0.0014
|
-0.0027
|
0.0027
|
0.9774
|
Causal
|
0.1058
|
0.0532
|
0.0016
|
0.2101
|
0.0465
|
Phospholipids in medium LDL
|
AvgPleio
|
0.0015
|
0.0014
|
-0.0013
|
0.0042
|
0.2917
|
Causal
|
0.0506
|
0.0560
|
-0.0591
|
0.1604
|
0.3657
|
Concentration of small LDL particles
|
AvgPleio
|
0.0003
|
0.0014
|
-0.0024
|
0.0030
|
0.8324
|
Causal
|
0.0907
|
0.0546
|
-0.0162
|
0.1976
|
0.0965
|
Results from Table 5.14 show some statistically significant average pleiotropic estimates and non-significant estimates, however the estimates are close to the null. The point estimate of triglycerides in small HDL shows an increase compared to its IVW estimate, and we note that both are positive. There was no evidence against no pleiotropy for this estimate. Figure 5.3 shows the association of triglycerides in small HDL and ischemic stroke. Note that precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning that the effect estimates from MR are unlikely to be valid.
Table 5.14: MR-Egger estimates for HDLs
|
Estimate
|
SE
|
LI
|
UI
|
Pval
|
Cholesterol esters in large HDL
|
AvgPleio
|
-0.0043
|
0.0013
|
-0.0067
|
-0.0018
|
0.0006
|
Causal
|
-0.0016
|
0.0409
|
-0.0818
|
0.0787
|
0.9695
|
Concentration of large HDL particles
|
AvgPleio
|
-0.0029
|
0.0012
|
-0.0053
|
-0.0004
|
0.0213
|
Causal
|
-0.0258
|
0.0405
|
-0.1051
|
0.0535
|
0.5236
|
Phospholipids in large HDL
|
AvgPleio
|
-0.0040
|
0.0013
|
-0.0065
|
-0.0016
|
0.0014
|
Causal
|
-0.0004
|
0.0424
|
-0.0836
|
0.0827
|
0.9918
|
Cholesterol esters in medium HDL
|
AvgPleio
|
-0.0028
|
0.0013
|
-0.0053
|
-0.0002
|
0.0328
|
Causal
|
-0.0756
|
0.0593
|
-0.1918
|
0.0406
|
0.2024
|
Free cholesterol in medium HDL
|
AvgPleio
|
-0.0016
|
0.0013
|
-0.0041
|
0.0009
|
0.2164
|
Causal
|
-0.0993
|
0.0620
|
-0.2208
|
0.0222
|
0.1094
|
Concentration of medium HDL particles
|
AvgPleio
|
-0.0019
|
0.0012
|
-0.0044
|
0.0005
|
0.1190
|
Causal
|
-0.0754
|
0.0605
|
-0.1940
|
0.0433
|
0.2130
|
Phospholipids in medium HDL
|
AvgPleio
|
-0.0035
|
0.0013
|
-0.0060
|
-0.0010
|
0.0054
|
Causal
|
-0.0362
|
0.0627
|
-0.1591
|
0.0866
|
0.5632
|
Concentration of small HDL particles
|
AvgPleio
|
-0.0003
|
0.0012
|
-0.0026
|
0.0020
|
0.7868
|
Causal
|
-0.0576
|
0.0505
|
-0.1567
|
0.0414
|
0.2539
|
Triglycerides in small HDL
|
AvgPleio
|
-0.0004
|
0.0014
|
-0.0032
|
0.0024
|
0.7743
|
Causal
|
0.1719
|
0.0629
|
0.0486
|
0.2952
|
0.0063
|
Cholesterol esters in very large HDL
|
AvgPleio
|
-0.0009
|
0.0012
|
-0.0032
|
0.0015
|
0.4675
|
Causal
|
-0.0605
|
0.0496
|
-0.1577
|
0.0367
|
0.2226
|
Free cholesterol in very large HDL
|
AvgPleio
|
-0.0032
|
0.0012
|
-0.0054
|
-0.0009
|
0.0067
|
Causal
|
-0.0117
|
0.0435
|
-0.0971
|
0.0736
|
0.7875
|
Concentration of small HDL particles
|
AvgPleio
|
-0.0015
|
0.0012
|
-0.0038
|
0.0008
|
0.2037
|
Causal
|
-0.0362
|
0.0434
|
-0.1213
|
0.0490
|
0.4051
|
Phospholipids in very large HDL
|
AvgPleio
|
-0.0032
|
0.0012
|
-0.0055
|
-0.0010
|
0.0053
|
Causal
|
-0.0021
|
0.0376
|
-0.0758
|
0.0716
|
0.9561
|
Triglycerides in very large HDL
|
AvgPleio
|
-0.0007
|
0.0012
|
-0.0029
|
0.0016
|
0.5665
|
Causal
|
0.0382
|
0.0369
|
-0.0341
|
0.1104
|
0.3007
|
MVMR of Concentration
We were additionally interested in whether mutually adjusting for lipid traits in our IVW models would affect our causal effects. We therefore fitted MVMR models as shown in Figure
5.4.
We fitted MVMR models using the MVMR
package (W. Spiller, Bowden, and Sanderson 2019). We investigated invalid instruments using each genotype’s contribution to the adjusted Q-statistic (Sanderson et al. 2018) and only found 2 outlying genotypes, hence for simplicity we performed these analyses using all 148 genotypes.
LDL
The results of the MVMR analysis for the concentration of LDL particles is shown in Table 5.19. Concentration for IDLs and medium LDL particles have negative causal estimates, with the concentration of IDL particles estimate giving a small p-value.
The column of Q-statistics (Q) shows evidence of heterogeneity. In the MVMR context, this suggests that there is enough information from the instruments to predict the exposures. The test based on the adjusted Q statistic (\(p(Q_A) = 0.99\)) shows evidence of pleiotropy, which can suggest that there are instruments which are related to the outcome through other pathways (more exposures).
Note that precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning that the effect estimates from MVMR are unlikely to be valid.
Table 5.19: IVW Estimates from Multivariate MR using 148 SNPs
|
Estimate
|
Std. Error
|
t value
|
Pr(>|t|)
|
Q
|
Concentration of IDL particles
|
-1.7362
|
0.2718
|
-6.3866
|
0.0000
|
10.5582
|
Concentration of Large LDL particles
|
2.1343
|
0.3712
|
5.7491
|
0.0000
|
93.5366
|
Concentration of Medium LDL particles
|
-0.0861
|
0.3069
|
-0.2807
|
0.7793
|
105.3149
|
Concentration of Small particles
|
0.8309
|
0.0900
|
9.2292
|
0.0000
|
1187.1912
|
HDL
The results from the MVMR analysis for concentrations of HDL particles are shown in Table 5.20. These show positive causal estimates for medium and very large HDL, however the estimates should be interpreted with caution. The Q-statistic column suggests that there is enough information from the instruments to predict the exposure variables. The adjusted Q-statistic for this model gave a p-value of 0.88, which suggests that there are instruments which affect ischemic stroke through other exposures.
Note that precisely the same issue as noted above applies in this setting where SNPs used in the IVs overlap between exposures, meaning that the effect estimates from MVMR are unlikely to be valid.
Table 5.20: IVW Estimates from Multivariate MR for HDLs using 148 SNPs
|
Estimate
|
Std. Error
|
t value
|
Pr(>|t|)
|
Q
|
Concentration of Large HDL particles
|
-0.1188
|
0.1611
|
-0.7371
|
0.4622
|
26.0627
|
Concentration of Medium HDL particles
|
0.5846
|
0.1928
|
3.0329
|
0.0029
|
29.2731
|
Concentration of Small HDL particles
|
-0.2440
|
0.1108
|
-2.2026
|
0.0292
|
33.5726
|
Concentration of Very Large HDL particles
|
0.5252
|
0.1097
|
4.7892
|
0.0000
|
28.5134
|
Discussion and Conclusions
We have presented estimates of the effect of different traits related to LDL and HDL on the risk of ischemic stroke and attempted to group traits based on characteristics of lipid or size.
Selecting instruments for each trait based on SNPs that surpass conventional levels of genome-wide significance led to no meaningful conclusions being drawn based on limited statistical power.
In contrast, selecting instruments based on their individual contribution to the Q-statistics led to instruments consisting of many more SNPs and therefore greater statistical power. In this setting, we identified many strong MR associations, which could be construed as evidence of causation. However this approach has a major flaw insofar as the same SNPs were used as IVs for multiple exposures. In this context, it becomes impossible to disentangle which of the traits are causal because in essence the genotype-disease association is fixed and all that varies in each MR model is the genotype-exposure association. Furthermore, in the context of MVMR, we cannot see how using the same SNPs for multiple exposures in the same model can lead to valid MR estimates.
Thus, this MR data challenge nicely demonstrates a key challenge in conducting MR of highly correlated traits. Selecting SNPs on the basis of GWAS significance derived from modestly-sized GWAS studies is likely to lead to poorly performing instruments on the basis of lack of statistical power. Inclusion of greater numbers of SNPs by more permissive entry criteria, especially in the context of only 148 SNPs in total across the lipid traits in this data example, means that we in essence use the same SNPs multiple times which means that we cannot use MR in either the univariate or multivariate setting to disentangle which traits are driving the causal relationship. We are not therefore able to make any meaningful conclusions about the causal role of these traits in ischaemic stroke. Our analyses highlight a potential misuse of genetic instruments where the same instruments are used for multiple exposures, which might lead to erroneous interpretations.
Software
The R Markdown code is available by clicking on the Code button in the top righthand corner of this document. Click here to navigate to the top of the document.
References
Bowden, Jack, George Davey Smith, and Stephen Burgess. 2015. “Mendelian Randomization with Invalid Instruments: Effect Estimation and Bias Detection Through Egger Regression.” International Journal of Epidemiology 44 (2): 512–25.
Bowden, Jack, Wesley Spiller, Fabiola Del Greco M, Nuala Sheehan, John Thompson, Cosetta Minelli, and George Davey Smith. 2018. “Improving the Visualization, Interpretation and Analysis of Two-Sample Summary Data Mendelian Randomization via the Radial Plot and Radial Regression.” International Journal of Epidemiology 47 (4): 1264–78.
Burgess, Stephen, Adam Butterworth, and Simon G Thompson. 2013. “Mendelian Randomization Analysis with Multiple Genetic Variants Using Summarized Data.” Genetic Epidemiology 37 (7): 658–65.
Burgess, Stephen, Frank Dudbridge, and Simon G Thompson. 2015. “Re:“Multivariable Mendelian Randomization: The Use of Pleiotropic Genetic Variants to Estimate Causal Effects".” American Journal of Epidemiology 181 (4): 290–91.
Davey Smith, G., and S. Ibrahim. 2003. “‘Mendelian randomization’: can genetic epidemiology contribute to understanding environmental determinants of disease?” International Journal of Epidemiology 32 (1): 1–22.
Holmes, Michael V, and Mika Ala-Korpela. 2019. “What is ‘LDL cholesterol’?” Nature Reviews Cardiology 16: 197–98.
Holmes, Michael V., Mika Ala-Korpela, and George Davey Smith. 2017. “Mendelian randomization in cardiometabolic disease: challenges in evaluating causality.” Nature Reviews Cardiology 14: 577–90. https://doi.org/10.1038/nrcardio.2017.78.
Holmes, M. V., and G. Davey Smith. 2018. “Challenges in Interpreting Multivariable Mendelian Randomization: Might ‘Good Cholesterol’ Be Good After All?” 71 (2): 149–53.
Sanderson, Eleanor, George Davey Smith, Frank Windmeijer, and Jack Bowden. 2018. “An examination of multivariable Mendelian randomization in the single-sample and two-sample summary data settings.” International Journal of Epidemiology, December. https://doi.org/10.1093/ije/dyy262.
Spiller, Wes, Jack Bowden, and Eleanor Sanderson. 2019. MVMR: R package to perform multivariable Mendelian randomization analyses. https://github.com/WSpiller/MVMR.
LS0tDQp0aXRsZTogIk1SIERhdGEgQ2hhbGxlbmdlIDIwMTk6IEludmVzdGlnYXRpbmcgdGhlIENhdXNhbCBFZmZlY3Qgb2YgTERMIGFuZCBIREwgb24gSXNjaGVtaWMgU3Ryb2tlIg0KIyBhdXRob3I6DQojIC0gbmFtZTogIk9rZXppZSBVY2hlLUlrb25uZSINCiMgICBhZmZpbGlhdGlvbjogIkRlcGFydG1lbnQgb2YgTWF0aGVtYXRpY3MgYW5kIFN0YXRpc3RpY3MsIExhbmNhc3RlciBVbml2ZXJzaXR5LCBMYW5jYXN0ZXIsIFVLIg0KIyAgIGVtYWlsOiBvLnVjaGUtaWtvbm5lQGxhbmNhc3Rlci5hYy51aw0KIyAtIG5hbWU6ICJNaWNoYWVsIEhvbG1lcyINCiMgICBhZmZpbGlhdGlvbjogIk1lZGljYWwgUmVzZWFyY2ggQ291bmNpbCBQb3B1bGF0aW9uIEhlYWx0aCBSZXNlYXJjaCBVbml0IGF0IHRoZSBVbml2ZXJzaXR5IG9mIE94Zm9yZCwgT3hmb3JkLCBVSy4iDQojICAgZW1haWw6IG1pY2hhZWwuaG9sbWVzQG5kcGgub3guYWMudWsNCiMgLSBuYW1lOiAiRnJhbmsgRG9uZGVsaW5nZXIiDQojICAgYWZmaWxpYXRpb246ICJGYWN1bHR5IG9mIEhlYWx0aCBhbmQgTWVkaWNpbmUsIExhbmNhc3RlciBVbml2ZXJzaXR5LCBMYW5jYXN0ZXIsIFVLIg0KIyAgIGVtYWlsOiBmLmRvbmRlbGluZ2VyQGxhbmNhc3Rlci5hYy51aw0KIyAtIG5hbWU6ICJUb20gUGFsbWVyIg0KIyAgIGFmZmlsaWF0aW9uOiAiRGVwYXJ0bWVudCBvZiBNYXRoZW1hdGljcyBhbmQgU3RhdGlzdGljcywgTGFuY2FzdGVyIFVuaXZlcnNpdHksIExhbmNhc3RlciwgVUsiDQojICAgZW1haWw6IHRvbS5wYWxtZXJAbGFuY2FzdGVyLmFjLnVrDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWScpYCINCm91dHB1dDoNCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlLmJpYg0KbGluay1jaXRhdGlvbnM6IFRSVUUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlID0gRkFMU0UpDQpsaWJyYXJ5KE1SQ2hhbGxlbmdlMjAxOSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoTWVuZGVsaWFuUmFuZG9taXphdGlvbikNCnJlcXVpcmUoa25pdHIpDQpyZXF1aXJlKHJtYXJrZG93bikNCnJlcXVpcmUoYm9va2Rvd24pDQpyZXF1aXJlKHN0eWxlcikNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShtdm1ldGEpDQpsaWJyYXJ5KG1ldGEpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShkaWFncmFtKQ0KbGlicmFyeShNVk1SKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0Kc291cmNlKCJtdm1yMi5SIikNCmBgYA0KDQpgYGB7cn0NCmRhdGEoQ2hhbGxlbmdlX2RhdCkNCmJldGFfbWF0IDwtIENoYWxsZW5nZV9kYXRbMzI6MTQ5XQ0KcF9tYXQgPC0gQ2hhbGxlbmdlX2RhdFsxNTA6MjY3XQ0KDQojIyMgT3V0Y29tZXMgDQpvdXRfeWJldGE8LSBjYmluZChDaGFsbGVuZ2VfZGF0JGJldGFfYW1kLENoYWxsZW5nZV9kYXQkYmV0YV9hbHosQ2hhbGxlbmdlX2RhdCRiZXRhX3QyZCxDaGFsbGVuZ2VfZGF0JGJldGFfaXNjaCxDaGFsbGVuZ2VfZGF0JGJldGFfbGFzLENoYWxsZW5nZV9kYXQkYmV0YV9jZXMsQ2hhbGxlbmdlX2RhdCRiZXRhX3N2cykNCg0Kb3V0X3lzZTwtIGNiaW5kKENoYWxsZW5nZV9kYXQkc2VfYW1kLENoYWxsZW5nZV9kYXQkc2VfYWx6LENoYWxsZW5nZV9kYXQkc2VfdDJkLENoYWxsZW5nZV9kYXQkc2VfaXNjaCxDaGFsbGVuZ2VfZGF0JHNlX2xhcyxDaGFsbGVuZ2VfZGF0JHNlX2NlcyxDaGFsbGVuZ2VfZGF0JHNlX3N2cykNCg0KIyMgZXhwb3N1cmVzIChMRExzKQ0KbGRsX3hiZXRhPC0gY2JpbmQoYmV0YV9tYXRbMzBdLGJldGFfbWF0WzMyXSxiZXRhX21hdFszM10sYmV0YV9tYXRbNDJdLGJldGFfbWF0WzQzXSxiZXRhX21hdFs0NV0sYmV0YV9tYXRbNDZdLGJldGFfbWF0WzY2XSxiZXRhX21hdFs2OF0sYmV0YV9tYXRbNjldLGJldGFfbWF0Wzg2XSkNCg0KbGRsX3B2YWw8LSBjYmluZChwX21hdFszMF0scF9tYXRbMzJdLHBfbWF0WzMzXSxwX21hdFs0Ml0scF9tYXRbNDNdLHBfbWF0WzQ1XSxwX21hdFs0Nl0scF9tYXRbNjZdLHBfbWF0WzY4XSxwX21hdFs2OV0scF9tYXRbODZdKQ0KDQojIyBleHBvc3VyZXMgKEhETHMpDQpoZGxfeGJldGEgPC0gY2JpbmQoYmV0YV9tYXRbMzddLGJldGFfbWF0WzM5XSxiZXRhX21hdFs0MF0sYmV0YV9tYXRbNjBdLGJldGFfbWF0WzYxXSxiZXRhX21hdFs2M10sYmV0YV9tYXRbNjRdLGJldGFfbWF0WzgyXSxiZXRhX21hdFs4M10sYmV0YV9tYXRbMTAzXSxiZXRhX21hdFsxMDRdLGJldGFfbWF0WzEwNl0sYmV0YV9tYXRbMTA3XSxiZXRhX21hdFsxMDhdKQ0KDQpoZGxfcHZhbCA8LSBjYmluZChwX21hdFszN10scF9tYXRbMzldLHBfbWF0WzQwXSxwX21hdFs2MF0scF9tYXRbNjFdLHBfbWF0WzYzXSxwX21hdFs2NF0scF9tYXRbODJdLHBfbWF0WzgzXSxwX21hdFsxMDNdLHBfbWF0WzEwNF0scF9tYXRbMTA2XSxwX21hdFsxMDddLHBfbWF0WzEwOF0pDQpgYGANCg0KIyBQYXJ0aWNpcGFudHMNCg0KLSBPa2V6aWUgVWNoZS1Ja29ubmUsIERlcGFydG1lbnQgb2YgTWF0aGVtYXRpY3MgYW5kIFN0YXRpc3RpY3MsIExhbmNhc3RlciBVbml2ZXJzaXR5LCBMYW5jYXN0ZXIsIFVLLCBvLnVjaGUtaWtvbm5lQGxhbmNhc3Rlci5hYy51aw0KLSBNaWNoYWVsIEhvbG1lcywgTWVkaWNhbCBSZXNlYXJjaCBDb3VuY2lsIFBvcHVsYXRpb24gSGVhbHRoIFJlc2VhcmNoIFVuaXQgYXQgdGhlIFVuaXZlcnNpdHkgb2YgT3hmb3JkLCBPeGZvcmQsIFVLLg0KLSBGcmFuayBEb25kZWxpbmdlciwgRmFjdWx0eSBvZiBIZWFsdGggYW5kIE1lZGljaW5lLCBMYW5jYXN0ZXIgVW5pdmVyc2l0eSwgTGFuY2FzdGVyLCBVSy4NCi0gVG9tIFBhbG1lciwgRGVwYXJ0bWVudCBvZiBNYXRoZW1hdGljcyBhbmQgU3RhdGlzdGljcywgTGFuY2FzdGVyIFVuaXZlcnNpdHksIExhbmNhc3RlciwgVUsuDQoNCiMgTW90aXZhdGlvbg0KDQpUaGVyZSBoYXMgYmVlbiBjb25zaWRlcmFibGUgcmVzZWFyY2ggb24gdGhlIHJvbGUgb2YgYmxvb2QgbGlwaWRzIGFuZCB0aGVpciBhc3NvY2lhdGlvbnMgd2l0aCB2YXJpb3VzIGNhcmRpb3Zhc2N1bGFyIHRyYWl0cyBbQGhvbG1lc2Fqa2QyMDE4XS4gV2hpbGUgb2JzZXJ2YXRpb25hbCBhbmFseXNlcyBoYXZlIGxlZCB0byBuYcOvdmUgY2xhc3NpZmljYXRpb25zIG9mICJnb29kIiAoaGlnaGVyIGRlbnNpdHkgbGlwb3Byb3RlaW4sIEhETCkgYW5kICJiYWQiIChsb3dlciBkZW5zaXR5IGxpcG9wcm90ZWluLCBMREwpIGJsb29kIGxpcGlkcywgdGhlIHVuZGVybHlpbmcgY2F1c2FsIHJlbGF0aW9uc2hpcHMgc3VnZ2VzdCB0aGF0IHdoaWxlIExETCBhbmQgdHJpZ2x5Y2VyaWRlcyBtYXkgaGF2ZSBhdGhlcm9nZW5pYyBjaGFyYWN0ZXJpc3RpY3MsIEhETC1jaG9sZXN0ZXJvbCBpcyB1bmxpa2VseSB0byBwbGF5IGFuIGltcG9ydGFudCByb2xlIGluIGF0aGVyb2dlbmVzaXMuDQoNClRoZSBbTVJEYXRhQ2hhbGxlbmdlXShodHRwczovL3d3dy5tZW5kZWxpYW5yYW5kb21pemF0aW9uLm9yZy51ay90aGUtbXItZGF0YS1jaGFsbGVuZ2UtMjAxOS8pIHByb3ZpZGVzIGEgc3VtbWFyeSBsZXZlbCBkYXRhc2V0IGJ5IHdoaWNoIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGlvbnMgb2YgZ2Vub3R5cGVzIChjb21wcmlzaW5nIDE0OCBTTlBzKSB3aXRoIGxpcGlkIHRyYWl0cyBhbmQgdGhlIGFzc29jaWF0aW9ucyBvZiBnZW5vdHlwZXMgd2l0aCA3IG91dGNvbWVzIFtAbXJjaGFsbGVuZ2UyMDE5XS4gT2YgdGhlIHNldmVuIG91dGNvbWVzLCB3ZSBzZWxlY3RlZCBpc2NoZW1pYyBzdHJva2UgdG8gaW52ZXN0aWdhdGUgdGhlIGNhc3VhbCByZWxhdGlvbnNoaXAgb2YgTERMIGFuZCBIREwgbGlwaWQgdHJhaXRzIHVzaW5nIHRoZSBNZW5kZWxpYW4gcmFuZG9taXphdGlvbiAoTVIpIGFwcHJvYWNoIFtAZGF2ZXlzbWl0aF0uIEZpZ3VyZXMgXEByZWYoZmlnOmRhZzEpIGFuZCBcQHJlZihmaWc6ZGFnMikgcmVwcmVzZW50IHRoZSBEQUdzIGZvciB0aGUgcHJvcG9zZWQgYW5hbHlzaXMuIA0KDQpgYGB7ciBkYWcxLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iRGlyZWN0ZWQgYWN5Y2xpYyBncmFwaCAoREFHKSBvZiB0aGUgTVIgYW5hbHlzaXMgdG8gaW52ZXN0aWdhdGUgdGhlIGVmZmVjdCBvZiBMREwgdG8gaXNjaGVtaWMgc3Ryb2tlLiJ9DQpEaWFncmFtbWVSOjpnclZpeigiDQogICAgICBkaWdyYXBoIG1yZGFnIHsNCg0KICAgICAgZ3JhcGggW3JhbmtkaXI9VEIsIGxheW91dD1uZWF0b10NCg0KICAgICAgbm9kZSBbc2hhcGU9Ym94LGVpZ2h0PTAuMywgd2lkdGg9MC4zXQ0KICAgICAgVSBbbGFiZWw9J0NvbmZvdW5kZXJzJywgcG9zPSczLDEhJ10NCiAgICAgIA0KICAgICAgbm9kZSBbc2hhcGU9Ym94LCBoZWlnaHQ9MC41LCB3aWR0aD0wLjVdDQogICAgICBZMSBbbGFiZWw9J0lzY2hlbWljIFN0cm9rZScsIHBvcz0nNCwwISddDQoNCiAgICAgIG5vZGUgW3NoYXBlPWJveCwgaGVpZ2h0PTAuMywgd2lkdGg9MC4zXQ0KICAgICAgRzEgW2xhYmVsPSdHQF97MX0nLCBwb3M9JzAsMSEnXQ0KCSAgICBHMiBbbGFiZWw9J0dAX3syfScsIHBvcz0nMCwwISddDQoJICAgIEczIFtsYWJlbD0nR0BfezN9JywgcG9zPScwLC0xISddDQogICAgICBYMSBbbGFiZWw9J0xETCcsIHBvcz0nMiwwISddDQogICAgICANCiAgICAgIHsgcmFuayA9IHNhbWU7ICBZMSB9DQoNCiAgICAgIEcxIC0+IHtYMX0NCgkgICAgRzIgLT4ge1gxfQ0KCSAgICBHMyAtPiB7WDF9DQogICAgICBVIC0+IFgxDQogICAgICBVIC0+IFkxDQogICAgICBYMSAtPiB7WTF9DQogICAgICANCiAgICAgIH0NCiAgICAgICIsIGhlaWdodCA9IDMwMCkNCmBgYA0KDQpgYGB7ciBkYWcyLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iREFHIHJlcHJlc2VudGluZyB0aGUgTVIgYW5hbHlzaXMgZm9yIHRoZSBlZmZlY3Qgb2YgSERMIG9uIGlzY2hlbWljIHN0cm9rZS4ifQ0KRGlhZ3JhbW1lUjo6Z3JWaXooIg0KICAgICAgZGlncmFwaCBtcmRhZyB7DQoNCiAgICAgIGdyYXBoIFtyYW5rZGlyPVRCLCBsYXlvdXQ9bmVhdG9dDQoNCiAgICAgIG5vZGUgW3NoYXBlPWJveCxlaWdodD0wLjMsIHdpZHRoPTAuM10NCiAgICAgIFUgW2xhYmVsPSdDb25mb3VuZGVycycsIHBvcz0nMywxISddDQogICAgICANCiAgICAgIG5vZGUgW3NoYXBlPWJveCwgaGVpZ2h0PTAuNSwgd2lkdGg9MC41XQ0KICAgICAgWTEgW2xhYmVsPSdJc2NoZW1pYyBTdHJva2UnLCBwb3M9JzQsMCEnXQ0KDQogICAgICBub2RlIFtzaGFwZT1ib3gsIGhlaWdodD0wLjMsIHdpZHRoPTAuM10NCiAgICAgIEcxIFtsYWJlbD0nR0BfezF9JywgcG9zPScwLDEhJ10NCgkgICAgRzIgW2xhYmVsPSdHQF97Mn0nLCBwb3M9JzAsMCEnXQ0KCSAgICBHMyBbbGFiZWw9J0dAX3szfScsIHBvcz0nMCwtMSEnXQ0KICAgICAgWDEgW2xhYmVsPSdIREwnLCBwb3M9JzIsMCEnXQ0KICAgICAgDQogICAgICB7IHJhbmsgPSBzYW1lOyAgWTEgfQ0KDQogICAgICBHMSAtPiB7WDF9DQoJICAgIEcyIC0+IHtYMX0NCgkgICAgRzMgLT4ge1gxfQ0KICAgICAgVSAtPiBYMQ0KICAgICAgVSAtPiBZMQ0KICAgICAgWDEgLT4ge1kxfQ0KICAgICAgDQogICAgICB9DQogICAgICAiLCBoZWlnaHQgPSAzMDApDQpgYGANCg0KT25lIGNhdXNlIG9mIGlzY2hhZW1pYyBzdHJva2UgaXMgdGhlIGRldmVsb3BtZW50IG9mIGF0aGVyb3NjbGVyb3NpcywgaW4gd2hpY2ggYnVpbGQtdXAgb2YgZmF0dHkgZGVwb3NpdHMgaW4gdGhlIGFydGVyaWFsIHdhbGwgbGVhZHMgdG8gZGV2ZWxvcG1lbnQgb2YgYSBwbGFxdWUsIHdoaWNoIGNhbiBkaXNydXB0IHRoZSBzdXBwbHkgb2Ygb3h5Z2VuYXRlZCBibG9vZCBmbG93IHRvIHRoZSBicmFpbi4gVGhlcmUgaXMgc3Ryb25nIGV2aWRlbmNlIHRoYXQgTERMLXJlbGF0ZWQgbGlwaWQgcGhlbm90eXBlcyBhcmUgY2F1c2FsbHkgaW1wbGljYXRlZCBpbiB0aGUgYWV0aW9sb2d5IG9mIGF0aGVyb3NjbGVyb3NpcyBhbmQgY29yb25hcnkgaGVhcnQgZGlzZWFzZS4NCg0KSW4gYSByZWNlbnQgY29tbWVudCBwaWVjZSwgQGhvbG1lczIwMTlsZGwgZGlzY3Vzc2VkIHRoYXQgdGhlcmUgaXMgYSBzaXplIGRlcGVuZGVudCB0aHJlc2hvbGQgd2hlcmVieSBsaXBpZCBzcGVjaWVzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIHNtYWxsIFZMRExzLCBhcmUgdG9vIGxhcmdlIHRvIGVudGVyIHRoZSBhcnRlcmlhbCBpbnRpbWEsIGFzIHNob3duIGluIEZpZ3VyZSBcQHJlZihmaWc6aG9sbWVzMjAxOWZpZzEpLiBUaGVyZWZvcmUsIGluIG91ciBhbmFseXNpcyB3ZSBmb2N1c2VkIG91ciBpbnZlc3RpZ2F0aW9uIG9uIHRob3NlIGxpcGlkIHNwZWNpZXMgc21hbGxlciB0aGFuIHNtYWxsIFZMREw6IGkuZS4gSURMIGFuZCBMREwuIEluIGFkZGl0aW9uLCB3ZSB3aXNoZWQgdG8gYXNzZXNzIHRoZSBjYXVzYWwgcmVsZXZhbmNlIG9mIEhETCBzcGVjaWVzLg0KDQpgYGB7ciwgaG9sbWVzMjAxOWZpZzEsIGZpZy5jYXA9J0ZpZ3VyZSAxIG9mIEBob2xtZXMyMDE5bGRsIHNob3dpbmcgd2hpY2ggc2l6ZXMgb2YgbGlwaWQgdHJhaXQgZW50ZXIgdGhlIGFydGVyaWFsIGludGltYS4nLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJob2xtZXMtbnJjLTIwMTktZmlnMS5wbmciKQ0KYGBgDQoNCiMgRGF0YQ0KDQpUaGUgTVIgQ2hhbGxlbmdlIGRhdGEgY29uc2lzdHMgb2Ygc3VtbWFyeSBkYXRhIG9mIHRoZSBhc3NvY2lhdGlvbiBvZiAxNDggZ2Vub3R5cGVzIHdpdGggMTE4IGxpcGlkIHRyYWl0cyBhbmQgNyBvdXRjb21lcy4gV2UgaGF2ZSB0cmltbWVkIHRoZSBudW1iZXIgb2YgZXhwb3N1cmVzIHVzZWQuIE91ciBsb3ctZGVuc2l0eSBsaXBvcHJvdGVpbiAoTERMKSBhbmFseXNpcyBjb25zaXN0cyBvZiAxMSBleHBvc3VyZXMgd2hpbHN0IHdlIGhhdmUgdXNlZCAxNCBsaXBpZCB0cmFpdHMgYXNzb2NpYXRlZCB3aXRoIGhpZ2gtZGVuc2l0eSBsaXBvcHJvdGVpbnMgKEhETCkuIA0KDQpUaGUgYXRoZXJvZ2VuaWMgbGlwaWQgdHJhaXRzIHdlIGludmVzdGlnYXRlZCBhcmU7DQoNCiAgKiBDb25jZW50cmF0aW9uIG9mIElETCBwYXJ0aWNsZXMNCiAgKiBGcmVlIGNob2xlc3Rlcm9sIGluIElETA0KICAqIENob2xlc3Rlcm9sIGVzdGVycyBpbiBsYXJnZSBMREwNCiAgKiBGcmVlIGNob2xlc3Rlcm9sIGluIGxhcmdlIExETA0KICAqIFBob3NwaG9saXBpZHMgaW4gSURMDQogICogQ29uY2VudHJhdGlvbiBvZiBMYXJnZSBMREwgcGFydGljbGVzDQogICogUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBMREwNCiAgKiBDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gbWVkaXVtIExETA0KICAqIENvbmNlbnRyYXRpb24gb2YgbWVkaXVtIExETCBwYXJ0aWNsZXMNCiAgKiBQaG9zcGhvbGlwaWRzIGluIG1lZGl1bSBMREwNCiAgKiBDb25jZW50cmF0aW9uIG9mIHNtYWxsIExETCBwYXJ0aWNsZXMuDQoNClRoZSBsaXBpZCB0cmFpdHMgcmVsYXRlZCB0byBIREwgdGhhdCB3ZSBpbnZlc3RpZ2F0ZWQgYXJlOw0KDQogICogQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIGxhcmdlIEhETCAgICAgICAgICAgDQogICogQ29uY2VudHJhdGlvbiBvZiBsYXJnZSBIREwgcGFydGljbGVzDQogICogUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBIREwgDQogICogQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIG1lZGl1bSBIREwgICAgICAgICAgDQogICogRnJlZSBjaG9sZXN0ZXJvbCBpbiBtZWRpdW0gSERMICAgICAgICAgICAgDQogICogQ29uY2VudHJhdGlvbiBvZiBtZWRpdW0gSERMIHBhcnRpY2xlcyAgICAgDQogICogUGhvc3Bob2xpcGlkcyBpbiBtZWRpdW0gSERMICAgICAgICAgICAgICAgDQogICogQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBIREwgcGFydGljbGVzICAgICAgDQogICogVHJpZ2x5Y2VyaWRlcyBpbiBzbWFsbCBIREwNCiAgKiBDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gdmVyeSBsYXJnZSBIREwgICAgICANCiAgKiBGcmVlIGNob2xlc3Rlcm9sIGluIHZlcnkgbGFyZ2UgSERMICAgICAgDQogICogQ29uY2VudHJhdGlvbiBvZiB2ZXJ5IGxhcmdlIEhETCBwYXJ0aWNsZXMgDQogICogUGhvc3Bob2xpcGlkcyBpbiB2ZXJ5IGxhcmdlIEhETCAgICAgICAgICAgDQogICogVHJpZ2x5Y2VyaWRlcyBpbiB2ZXJ5IGxhcmdlIEhETC4NCg0KIyBBbmFseXNpcyBNZXRob2RzDQoNCldlIHVzZWQgdGhlIGludmVyc2UgdmFyaWFuY2Ugd2VpZ2h0ZWQgKElWVykgbWV0aG9kIHRvIGVzdGltYXRlIHRoZSBjYXVzYWwgZWZmZWN0IGluIHN1bW1hcnktbGV2ZWwgZGF0YSBbQGJ1cmdlc3MyMDEzbWVuZGVsaWFuXS4gVGhlIElWVyBtb2RlbCBpcyBkZW5vdGVkIGluIGVxdWF0aW9uIFxAcmVmKGVxOklWVykgd2hlcmUgZm9yIGEgZ2Vub3R5cGUgJGokLCAkXHdpZGVoYXRcR2FtbWFfaiQgcmVwcmVzZW50cyB0aGUgZXN0aW1hdGVkIGdlbm90eXBlLW91dGNvbWUgYXNzb2NpYXRpb25zLCAkXHdpZGVoYXRcZ2FtbWFfaiQgcmVwcmVzZW50cyB0aGUgZXN0aW1hdGVkIGdlbm90eXBlLXBoZW5vdHlwZSBhc3NvY2lhdGlvbnMsIGFuZCAkXHNpZ21hX3t5an0kIHJlcHJlc2VudHMgdGhlIGVzdGltYXRlZCBzdGFuZGFyZCBlcnJvcnMgb2YgdGhlIGdlbm90eXBlLW91dGNvbWUgYXNzb2NpYXRpb25zLg0KDQokJA0KXGZyYWN7XGhhdHtcR2FtbWF9X3tqfX17XHNpZ21hX3t5X2p9fSA9IFxmcmFje1xiZXRhXGdhbW1hX2p9e1xzaWdtYV97eV9qfX0gKyBcdmFyZXBzaWxvbl9qLCBccXVhZCBcdmFyZXBzaWxvbl9qIFxzaW0gTigwLDEpDQooXCNlcTpJVlcpDQokJA0KDQpXZSBwZXJmb3JtIHNlbnNpdGl2aXR5IGFuYWx5c2lzIGZvciBvdXIgSVZXIGVzdGltYXRlcyB1c2luZyB0aGUgTVItRWdnZXIgbW9kZWwgW0Bib3dkZW4yMDE1bWVuZGVsaWFuXS4gVGhlIE1SLUVnZ2VyIG1vZGVsIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgSVZXIG1vZGVsIFxAcmVmKGVxOklWVykgd2hpY2ggaW5jbHVkZXMgdGhlIGF2ZXJhZ2UgcGxlaW90cm9waWMgZWZmZWN0IGFzIGFuIGludGVyY2VwdC4gQnkgY29udmVudGlvbiB0aGUgcmVzaWR1YWwgdmFyaWFuY2UgaXMgY29uc3RyYWluZWQgdG8gYmUgZ3JlYXRlciB0aGFuIDEsIHdoaWNoIHVzdWFsbHkgbWVhbnMgdGhhdCB0aGUgTVItRWdnZXIgbW9kZWwgZ2l2ZXMgbGFyZ2VyIHN0YW5kYXJkIGVycm9ycyBvbiBpdHMgZXN0aW1hdGVkIGNhdXNhbCBlZmZlY3QgdGhhbiB0aGUgSVZXIG1vZGVsLiBFcXVhdGlvbiBcQHJlZihlcTplZ2dlcikgZGVub3RlcyB0aGUgTVItRWdnZXIgbW9kZWwuDQoNCiQkDQpcZnJhY3tcaGF0e1xHYW1tYX1fe2p9fXtcc2lnbWFfe3lfan19ID0gXGZyYWN7XGJldGFfMH17XHNpZ21hX3t5X2p9fSArIFxmcmFje1xiZXRhXGdhbW1hX2p9e1xzaWdtYV97eV9qfX0gKyBcdmFyZXBzaWxvbl9qLCBccXVhZCBcdmFyZXBzaWxvbl9qIFxzaW0gTigwLFxzaWdtYV4yKQ0KKFwjZXE6ZWdnZXIpDQokJA0KV2UgYWxzbyBpbnZlc3RpZ2F0ZWQgY2F1c2FsIGVmZmVjdHMgb2YgbGlwaWQgdHJhaXRzIGFkanVzdGVkIGZvciBvdGhlciB0cmFpdHMgdXNpbmcgdGhlIG11bHRpdmFyaWFibGUgTVIgKE1WTVIpIG1ldGhvZCBbQGJ1cmdlc3MyMDE1cmVdIGFzIHNob3duIGluIGVxdWF0aW9uIFxAcmVmKGVxOm12bXJyKS4NCiQkDQpcaGF0e1xHYW1tYX1faiA9IFxiZXRhXzFcaGF0e1xnYW1tYX1fezEsan0gKyBcYmV0YV8yXGhhdHtcZ2FtbWF9X3syLGp9ICsgXHZhcmVwc2lsb25faiwgXHF1YWQgXHZhcmVwc2lsb25faiBcc2ltIE4oMCxcc2lnbWFeMikuDQooXCNlcTptdm1ycikNCiQkDQoNClRvIHNlbGVjdCB3aGljaCBvZiB0aGUgMTQ4IGdlbm90eXBlcyB0byBpbmNsdWRlIGluIG91ciBhbmFseXNpcyB3ZSB0b29rIHR3byBhcHByb2FjaGVzOg0KDQppLiBXZSBzZWxlY3RlZCBnZW5vdHlwZXMgd2l0aCBnZW5vbWUtd2lkZSBzaWduaWZpY2FudCBwLXZhbHVlcyAoJHAgPCA1IFx0aW1lcyAxMF57LTh9JCkgd2l0aCB0aGUgc3BlY2lmaWMgbGlwaWQgdHJhaXQgb2YgaW50ZXJlc3QuIFRoZXNlIHJlc3VsdHMgYXJlIGluIFtTZWN0aW9uIDRdKCNzZWN0aW9uNCk7DQppaS4gV2UgYWxzbyBzZWxlY3RlZCBnZW5vdHlwZXMgYmFzZWQgdXBvbiB0aGVpciBpbmRpdmlkdWFsIGNvbnRyaWJ1dGlvbiB0b3dhcmRzIHRoZSBRLXN0YXRpc3RpYywgZm9yIGVpdGhlciB0aGUgSVZXIG9yIE1SLUVnZ2VyIG1vZGVsIFtAYm93ZGVuMjAxOGltcHJvdmluZ10uIFRoZXJlZm9yZSwgaW4gdGhpcyBjYXNlIHdlIHNlbGVjdGVkIGdlbm90eXBlcyB3aXRoIFEtc3RhdGlzdGljIHAtdmFsdWVzICRcZ2VxIDAuMDUkLiBUaGVzZSByZXN1bHRzIGFyZSBpbiBbU2VjdGlvbiA1XSgjc2VjdGlvbjUpLg0KDQpXZSBpbnZlc3RpZ2F0ZWQgdGhlIGNhdXNhbCBlZmZlY3Qgb2YgZWFjaCBzZWxlY3RlZCBsaXBpZCB0cmFpdCBhbmQgd2UgdGhlbiBwZXJmb3JtIGEgbWV0YS1hbmFseXNpcyBvdXIgY2F1c2FsIGVmZmVjdCBlc3RpbWF0ZXMgYWNjb3JkaW5nIHRvIHRoZWlyIHNpemUgYW5kIHRoZWlyIHNwZWNpZmljIHRyYWl0Lg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMgRnVuY3Rpb25zICMjIyMjIyMjIyMNCg0KI0Z1bmN0aW9uIGZvciBHV0FTIHNpZ25pZmljYW50IHNucHMNCnNpZXZlIDwtIGZ1bmN0aW9uKHhiZXRhLHB2YWwseWJldGEseXNlKXsNCiAgZGYgPSBjYmluZCh4YmV0YSxwdmFsLHliZXRhLHlzZSkNCiAgZGF0ID0gc3Vic2V0KGRmLCBwdmFsIDwgNWUtOCwgc2VsZWN0ID0gYyh4YmV0YSxwdmFsLHliZXRhLHlzZSkpDQogIGRhdDIgPSBuYS5leGNsdWRlKGRhdCkNCiAgcmV0dXJuKGRhdDIpDQp9DQoNCiNGdW5jdGlvbiBmb3IgSVZXDQppdncgPC0gZnVuY3Rpb24oeCwgeHNlLCB5LCB5c2UpIHsNCiAgZGF0ID0gbXJfaW5wdXQoeCwgeHNlLCB5LCB5c2UpDQogIG1yaXZ3ID0gTWVuZGVsaWFuUmFuZG9taXphdGlvbjo6bXJfaXZ3KGRhdCkNCiAgZXN0ID0gbXJpdndARXN0aW1hdGUNCiAgc2UgPSBtcml2d0BTdGRFcnJvcg0KICBMQ0kgPSBtcml2d0BDSUxvd2VyDQogIFVDSSA9IG1yaXZ3QENJVXBwZXINCiAgUHZhbCA9IG1yaXZ3QFB2YWx1ZQ0KICBzbnBzID0gbXJpdndAU05Qcw0KICBhbnMgPSBjKGVzdCwgc2UsIExDSSwgVUNJLCBQdmFsLCBzbnBzKQ0KICBhbnMgPSByb3VuZChhbnMsIGRpZ2l0cyA9IDQpDQogIHJldHVybihhbnMpDQp9DQoNCiNGdW5jdGlvbiBmb3IgTVItRWdnZXINCm1yZWdnZXIgPC0gZnVuY3Rpb24oeCwgeHNlLCB5LCB5c2UpIHsNCiAgZGF0ID0gbXJfaW5wdXQoeCwgeHNlLCB5LCB5c2UpDQogIG1yZWdnZXIgPSBNZW5kZWxpYW5SYW5kb21pemF0aW9uOjptcl9lZ2dlcihkYXQpDQogIGludCA9IG1yZWdnZXJASW50ZXJjZXB0DQogIGludF9zZSA9IG1yZWdnZXJAU3RkRXJyb3IuSW50DQogIGludF9MSSA9IG1yZWdnZXJAQ0lMb3dlci5JbnQNCiAgaW50X1VJID0gbXJlZ2dlckBDSVVwcGVyLkludA0KICBpbnRfcHZhbCA9IG1yZWdnZXJAUHZhbHVlLkludA0KICBlc3QgPSBtcmVnZ2VyQEVzdGltYXRlDQogIHNlID0gbXJlZ2dlckBTdGRFcnJvci5Fc3QNCiAgTENJID0gbXJlZ2dlckBDSUxvd2VyLkVzdA0KICBVQ0kgPSBtcmVnZ2VyQENJVXBwZXIuRXN0DQogIGVzdF9wdmFsID0gbXJlZ2dlckBQdmFsdWUuRXN0DQogIEF2Z1BsZWlvID0gYyhpbnQsIGludF9zZSxpbnRfTEksaW50X1VJLGludF9wdmFsKQ0KICBDYXVzYWwgPSBjKGVzdCwgc2UsIExDSSwgVUNJLCBlc3RfcHZhbCkNCiAgYW5zID0gcmJpbmQoQXZnUGxlaW8sQ2F1c2FsKQ0KICByZXR1cm4oYW5zKQ0KfQ0KDQojIyBTZWxlY3RpbmcgZ2VuZXRpYyB2YXJpYW50cyBiYXNlZCBvbiB0aGVpciBpbmRpdmlkdWFsIGNvbnRyaWJ1dGlvbiB0byBRLXN0YXRpc3RpY3MNCg0Kc2VsZWN0c25wPC0gZnVuY3Rpb24ocnNpZCx4YmV0YSx5YmV0YSx5c2Upew0KICANCiAgZGF0ID0gZGF0YS5mcmFtZShyc2lkLHhiZXRhLHliZXRhLHlzZSkNCiAgI2RhdCA9IG5hLmV4Y2x1ZGUoZGF0KQ0KICANCiAgIyByYXRpbyBlc3RpbWF0ZQ0KICByYXRpbyA9IHliZXRhL3hiZXRhDQogICMgZmlyc3Qgb3JkZXIgd2VpZ2h0cw0KICB3ZWlnaHQgPSAoeGJldGEveXNlKV4yDQogICMgTXVsdGlwbGljYXRpb24gb2Ygd2VpZ2h0cyBhbmQgcmF0aW8gZXN0aW1hdGUNCiAgcmF0d2VpZ2h0ID0gcmF0aW8gKiBzcXJ0KHdlaWdodCkNCiAgIyBFc3RpbWF0aW5nIGNhdXNhbGl0eSB1c2luZyBJVlcNCiAgY2F1c2FsID0gc3VtbWFyeShsbShyYXR3ZWlnaHQgfiAwICsgc3FydCh3ZWlnaHQpKSkkY29lZlsxXQ0KICAjIENhbGN1bGF0aW5nIGluZGl2aWR1YWwgUS1zdGF0aXN0aWNzDQogIFFqID0gd2VpZ2h0ICogKHJhdGlvIC0gY2F1c2FsKV4yDQogICMgRGVmaW5lIGNoaS1zcXVhcmUgdGVzdCANCiAgY2hpX1FqID0gMA0KICAjIENoaS1zcXVhcmVkIHRlc3QgZm9yIGVhY2ggUS1zdGF0cw0KICBmb3IoIGkgaW4gMTpsZW5ndGgoUWopKXsNCiAgICBjaGlfUWpbaV0gPSBwY2hpc3EoUWpbaV0sMSxsb3dlci50YWlsID0gRkFMU0UpDQogIH0NCiAgDQogIA0KICAgIyBpbmRpY2F0aW5nIG91dGxpZXIgZm9yIGVhY2ggUS1zdGF0cw0KICAgIyBvdXRsaWVyIDwtIHJlcCgwLGxlbmd0aChkYXRbLDJdKSkNCiAgIA0KICAgZGF0JFFqIDwtIFFqDQogICBkYXQkY2hpX1FqIDwtIGNoaV9Rag0KICAgZGF0JG91dGxpZXIgPC0gcmVwKDAsbGVuZ3RoKGRhdFssMV0pKQ0KICAgDQogICBkYXQgPSBuYS5leGNsdWRlKGRhdCkNCiAgIA0KICAgYWxwaGEgPSAwLjA1DQoNCiAgIGZvciAoaSBpbiAxOmxlbmd0aChkYXRbLDFdKSl7DQogICAgIGlmKGRhdCRjaGlfUWpbaV08YWxwaGEpIHsNCiAgICAgICBkYXQkb3V0bGllcltpXSA8LSAxDQogICAgIH0NCiAgIH0NCg0KICAjIEV4dHJhY3Rpbmcgbm9uLW91dGxpZXJzIGJhc2VkIG9uIHRoZWlyIFEgY29udHJpYnV0aW9uDQogICBkYXQkT3V0bGllcjwtZmFjdG9yKGRhdCRvdXRsaWVyKQ0KICAgbGV2ZWxzKGRhdCRPdXRsaWVyKVtsZXZlbHMoZGF0JE91dGxpZXIpPT0iMCJdIDwtICJWYXJpYW50Ig0KICAgbGV2ZWxzKGRhdCRPdXRsaWVyKVtsZXZlbHMoZGF0JE91dGxpZXIpPT0iMSJdIDwtICJPdXRsaWVyIg0KICAgDQogICANCiAgZGF0X291dCA9IHN1YnNldChkYXQsIE91dGxpZXIgPT0gIlZhcmlhbnQiKQ0KDQogIHJldHVybihkYXRfb3V0KQ0KfQ0KDQojIyBzaWV2aW5nIHNucHMgd2l0aCBHV0FTIHNpZ25maWNhbnQgdmFsdWVzDQpsZGxfbWF0MTwtc2lldmUobGRsX3hiZXRhWywxXSxsZGxfcHZhbFssMV0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbF9tYXQyPC1zaWV2ZShsZGxfeGJldGFbLDJdLGxkbF9wdmFsWywyXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsX21hdDM8LXNpZXZlKGxkbF94YmV0YVssM10sbGRsX3B2YWxbLDNdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxfbWF0NDwtc2lldmUobGRsX3hiZXRhWyw0XSxsZGxfcHZhbFssNF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbF9tYXQ1PC1zaWV2ZShsZGxfeGJldGFbLDVdLGxkbF9wdmFsWyw1XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsX21hdDY8LXNpZXZlKGxkbF94YmV0YVssNl0sbGRsX3B2YWxbLDZdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxfbWF0Nzwtc2lldmUobGRsX3hiZXRhWyw3XSxsZGxfcHZhbFssN10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbF9tYXQ4PC1zaWV2ZShsZGxfeGJldGFbLDhdLGxkbF9wdmFsWyw4XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsX21hdDk8LXNpZXZlKGxkbF94YmV0YVssOV0sbGRsX3B2YWxbLDldLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxfbWF0MTA8LXNpZXZlKGxkbF94YmV0YVssMTBdLGxkbF9wdmFsWywxMF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbF9tYXQxMTwtc2lldmUobGRsX3hiZXRhWywxMV0sbGRsX3B2YWxbLDExXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KDQpoZGxfbWF0MTwtc2lldmUoaGRsX3hiZXRhWywxXSxoZGxfcHZhbFssMV0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQyPC1zaWV2ZShoZGxfeGJldGFbLDJdLGhkbF9wdmFsWywyXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsX21hdDM8LXNpZXZlKGhkbF94YmV0YVssM10saGRsX3B2YWxbLDNdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxfbWF0NDwtc2lldmUoaGRsX3hiZXRhWyw0XSxoZGxfcHZhbFssNF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQ1PC1zaWV2ZShoZGxfeGJldGFbLDVdLGhkbF9wdmFsWyw1XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsX21hdDY8LXNpZXZlKGhkbF94YmV0YVssNl0saGRsX3B2YWxbLDZdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxfbWF0Nzwtc2lldmUoaGRsX3hiZXRhWyw3XSxoZGxfcHZhbFssN10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQ4PC1zaWV2ZShoZGxfeGJldGFbLDhdLGhkbF9wdmFsWyw4XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsX21hdDk8LXNpZXZlKGhkbF94YmV0YVssOV0saGRsX3B2YWxbLDldLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxfbWF0MTA8LXNpZXZlKGhkbF94YmV0YVssMTBdLGhkbF9wdmFsWywxMF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQxMTwtc2lldmUoaGRsX3hiZXRhWywxMV0saGRsX3B2YWxbLDExXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsX21hdDEyPC1zaWV2ZShoZGxfeGJldGFbLDEyXSxoZGxfcHZhbFssMTJdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxfbWF0MTM8LXNpZXZlKGhkbF94YmV0YVssMTNdLGhkbF9wdmFsWywxM10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbF9tYXQxNDwtc2lldmUoaGRsX3hiZXRhWywxNF0saGRsX3B2YWxbLDE0XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KDQojIFNlbGVjdGluZyBpbnN0cnVtZW50cyB1c2luZyB0aGVpciBpbmRpdmlkdWFsIFEtc3RhdGlzdGljcyBMRExzDQpsZGxzbnBzX1E8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsbGRsX3hiZXRhWywxXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsc25wc19RMTwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxsZGxfeGJldGFbLDJdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxzbnBzX1EyPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGxkbF94YmV0YVssM10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbHNucHNfUTM8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsbGRsX3hiZXRhWyw0XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsc25wc19RNDwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxsZGxfeGJldGFbLDVdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxzbnBzX1E1PC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGxkbF94YmV0YVssNl0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbHNucHNfUTY8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsbGRsX3hiZXRhWyw3XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KbGRsc25wc19RNzwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxsZGxfeGJldGFbLDhdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpsZGxzbnBzX1E4PC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGxkbF94YmV0YVssOV0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbHNucHNfUTk8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsbGRsX3hiZXRhWywxMF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmxkbHNucHNfUTEwPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGxkbF94YmV0YVssMTFdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQoNCiNIRExzDQpoZGxzbnBzX1E8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWywxXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsc25wc19RMTwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxoZGxfeGJldGFbLDJdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxzbnBzX1EyPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssM10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTM8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWyw0XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsc25wc19RNDwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxoZGxfeGJldGFbLDVdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxzbnBzX1E1PC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssNl0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTY8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWyw3XSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsc25wc19RNzwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxoZGxfeGJldGFbLDhdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxzbnBzX1E4PC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssOV0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTk8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWywxMF0sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTEwPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssMTFdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpoZGxzbnBzX1ExMTwtc2VsZWN0c25wKENoYWxsZW5nZV9kYXQkcnNpZCxoZGxfeGJldGFbLDEyXSxvdXRfeWJldGFbLDRdLG91dF95c2VbLDRdKQ0KaGRsc25wc19RMTI8LXNlbGVjdHNucChDaGFsbGVuZ2VfZGF0JHJzaWQsaGRsX3hiZXRhWywxM10sb3V0X3liZXRhWyw0XSxvdXRfeXNlWyw0XSkNCmhkbHNucHNfUTEzPC1zZWxlY3RzbnAoQ2hhbGxlbmdlX2RhdCRyc2lkLGhkbF94YmV0YVssMTRdLG91dF95YmV0YVssNF0sb3V0X3lzZVssNF0pDQpgYGANCg0KIyBSZXN1bHRzDQoNCiMjIEdXQVMtc2lnbmlmaWNhbnQgZ2Vub3R5cGUtcGhlbm90eXBlIGFzc29jaWF0aW9ucyB7I3NlY3Rpb240fQ0KDQojIyMgSVZXIGVzdGltYXRlcw0KDQpgYGB7cn0NCiMjIyBJVlcgZm9yIExETA0KbGRsX2l2dzE8LWl2dyhsZGxfbWF0MVssMV0sbGRsX21hdDFbLDFdLGxkbF9tYXQxWywzXSxsZGxfbWF0MVssNF0pDQpsZGxfaXZ3MjwtaXZ3KGxkbF9tYXQyWywxXSxsZGxfbWF0MlssMl0sbGRsX21hdDJbLDNdLGxkbF9tYXQyWyw0XSkNCmxkbF9pdnczPC1pdncobGRsX21hdDNbLDFdLGxkbF9tYXQzWywyXSxsZGxfbWF0M1ssM10sbGRsX21hdDNbLDRdKQ0KbGRsX2l2dzQ8LWl2dyhsZGxfbWF0NFssMV0sbGRsX21hdDRbLDJdLGxkbF9tYXQ0WywzXSxsZGxfbWF0NFssNF0pDQpsZGxfaXZ3NTwtaXZ3KGxkbF9tYXQ1WywxXSxsZGxfbWF0NVssMl0sbGRsX21hdDVbLDNdLGxkbF9tYXQ1Wyw0XSkNCmxkbF9pdnc2PC1pdncobGRsX21hdDZbLDFdLGxkbF9tYXQ2WywyXSxsZGxfbWF0NlssM10sbGRsX21hdDZbLDRdKQ0KbGRsX2l2dzc8LWl2dyhsZGxfbWF0N1ssMV0sbGRsX21hdDdbLDJdLGxkbF9tYXQ3WywzXSxsZGxfbWF0N1ssNF0pDQpsZGxfaXZ3ODwtaXZ3KGxkbF9tYXQ4WywxXSxsZGxfbWF0OFssMl0sbGRsX21hdDhbLDNdLGxkbF9tYXQ4Wyw0XSkNCmxkbF9pdnc5PC1pdncobGRsX21hdDlbLDFdLGxkbF9tYXQ5WywyXSxsZGxfbWF0OVssM10sbGRsX21hdDlbLDRdKQ0KbGRsX2l2dzEwPC1pdncobGRsX21hdDEwWywxXSxsZGxfbWF0MTBbLDJdLGxkbF9tYXQxMFssM10sbGRsX21hdDEwWyw0XSkNCmxkbF9pdncxMTwtaXZ3KGxkbF9tYXQxMVssMV0sbGRsX21hdDExWywyXSxsZGxfbWF0MTFbLDNdLGxkbF9tYXQxMVssNF0pDQoNCnRhYiA8LSByYmluZChsZGxfaXZ3MSxsZGxfaXZ3MixsZGxfaXZ3MyxsZGxfaXZ3NCxsZGxfaXZ3NSxsZGxfaXZ3NixsZGxfaXZ3NyxsZGxfaXZ3OCxsZGxfaXZ3OSxsZGxfaXZ3MTAsbGRsX2l2dzExKQ0KbGlwaWRfdHJhaXRzIDwtIGMoDQogICJGcmVlIGNob2xlc3Rlcm9sIGluIElETCIsICAgICAgICAgICAgICAgICAgICANCiAgIkNvbmNlbnRyYXRpb24gb2YgSURMIHBhcnRpY2xlcyIsICAgICAgICAgICANCiAgIlBob3NwaG9saXBpZHMgaW4gSURMIiwgICAgICAgICAgICAgICAgICAgICAgIA0KICAiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIGxhcmdlIExETCIsDQogICJGcmVlIGNob2xlc3Rlcm9sIGluIGxhcmdlIExETCIsDQogICJDb25jZW50cmF0aW9uIG9mIGxhcmdlIExETCBwYXJ0aWNsZXMiLA0KICAiUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBMREwiLA0KICAiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIG1lZGl1bSBMREwiLA0KICAiQ29uY2VudHJhdGlvbiBvZiBtZWRpdW0gTERMIHBhcnRpY2xlcyIsDQogICJQaG9zcGhvbGlwaWRzIGluIG1lZGl1bSBMREwiLA0KICAiQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBMREwgcGFydGljbGVzIg0KICApDQoNCnRhYiA8LSBjYmluZCAobGlwaWRfdHJhaXRzLHVubmFtZSh0YWIpKQ0KY29sbmFtZXModGFiKSA8LSBjKCJFeHBvc3VyZXMiLCJFc3RpbWF0ZSIsICJTRSIsIkxJIiwiVUkiLCAiUHZhbCIsIlNOUHMiKQ0KDQojIyMgSERMcyMjDQpoZGxfaXZ3MTwtaXZ3KGhkbF9tYXQxWywxXSxoZGxfbWF0MVssMl0saGRsX21hdDFbLDNdLGhkbF9tYXQxWyw0XSkNCmhkbF9pdncyPC1pdncoaGRsX21hdDJbLDFdLGhkbF9tYXQyWywyXSxoZGxfbWF0MlssM10saGRsX21hdDJbLDRdKQ0KaGRsX2l2dzM8LWl2dyhoZGxfbWF0M1ssMV0saGRsX21hdDNbLDJdLGhkbF9tYXQzWywzXSxoZGxfbWF0M1ssNF0pDQpoZGxfaXZ3NDwtaXZ3KGhkbF9tYXQ0WywxXSxoZGxfbWF0NFssMl0saGRsX21hdDRbLDNdLGhkbF9tYXQ0Wyw0XSkNCmhkbF9pdnc1PC1pdncoaGRsX21hdDVbLDFdLGhkbF9tYXQ1WywyXSxoZGxfbWF0NVssM10saGRsX21hdDVbLDRdKQ0KaGRsX2l2dzY8LWl2dyhoZGxfbWF0NlssMV0saGRsX21hdDZbLDJdLGhkbF9tYXQ2WywzXSxoZGxfbWF0NlssNF0pDQpoZGxfaXZ3NzwtaXZ3KGhkbF9tYXQ3WywxXSxoZGxfbWF0N1ssMl0saGRsX21hdDdbLDNdLGhkbF9tYXQ3Wyw0XSkNCmhkbF9pdnc4PC1pdncoaGRsX21hdDhbLDFdLGhkbF9tYXQ4WywyXSxoZGxfbWF0OFssM10saGRsX21hdDhbLDRdKQ0KaGRsX2l2dzk8LWl2dyhoZGxfbWF0OVssMV0saGRsX21hdDlbLDJdLGhkbF9tYXQ5WywzXSxoZGxfbWF0OVssNF0pDQpoZGxfaXZ3MTA8LWl2dyhoZGxfbWF0MTBbLDFdLGhkbF9tYXQxMFssMl0saGRsX21hdDEwWywzXSxoZGxfbWF0MTBbLDRdKQ0KaGRsX2l2dzExPC1pdncoaGRsX21hdDExWywxXSxoZGxfbWF0MTFbLDJdLGhkbF9tYXQxMVssM10saGRsX21hdDExWyw0XSkNCmhkbF9pdncxMjwtaXZ3KGhkbF9tYXQxMlssMV0saGRsX21hdDEyWywyXSxoZGxfbWF0MTJbLDNdLGhkbF9tYXQxMlssNF0pDQpoZGxfaXZ3MTM8LWl2dyhoZGxfbWF0MTNbLDFdLGhkbF9tYXQxM1ssMl0saGRsX21hdDEzWywzXSxoZGxfbWF0MTNbLDRdKQ0KaGRsX2l2dzE0PC1pdncoaGRsX21hdDE0WywxXSxoZGxfbWF0MTRbLDJdLGhkbF9tYXQxNFssM10saGRsX21hdDE0Wyw0XSkNCg0KdGFiMSA8LSByYmluZChoZGxfaXZ3MSxoZGxfaXZ3MixoZGxfaXZ3MyxoZGxfaXZ3NCxoZGxfaXZ3NSxoZGxfaXZ3NixoZGxfaXZ3NyxoZGxfaXZ3OCxoZGxfaXZ3OSxoZGxfaXZ3MTAsaGRsX2l2dzExLGhkbF9pdncxMixoZGxfaXZ3MTMsaGRsX2l2dzE0KQ0KdHJhaXRzIDwtIGMoDQogICJDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gbGFyZ2UgSERMIiwNCiAgIkNvbmNlbnRyYXRpb24gb2YgbGFyZ2UgSERMIHBhcnRpY2xlcyIsDQogICJQaG9zcGhvbGlwaWRzIGluIGxhcmdlIEhETCIsDQogICJDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gbWVkaXVtIEhETCIsDQogICJGcmVlIGNob2xlc3Rlcm9sIGluIG1lZGl1bSBIREwiLA0KICAiQ29uY2VudHJhdGlvbiBvZiBtZWRpdW0gSERMIHBhcnRpY2xlcyIsDQogICJQaG9zcGhvbGlwaWRzIGluIG1lZGl1bSBIREwiLA0KICAiQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBIREwgcGFydGljbGVzIiwNCiAgIlRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIiwNCiAgIkNob2xlc3Rlcm9sIGVzdGVycyBpbiB2ZXJ5IGxhcmdlIEhETCIsDQogICJGcmVlIGNob2xlc3Rlcm9sIGluIHZlcnkgbGFyZ2UgSERMIiwNCiAgIkNvbmNlbnRyYXRpb24gb2YgdmVyeSBsYXJnZSBIREwgcGFydGljbGVzIiwNCiAgIlBob3NwaG9saXBpZHMgaW4gdmVyeSBsYXJnZSBIREwiLA0KICAiVHJpZ2x5Y2VyaWRlcyBpbiB2ZXJ5IGxhcmdlIEhETCINCiAgKQ0KDQp0YWIxIDwtIGNiaW5kKHRyYWl0cywgdW5uYW1lKHRhYjEpKQ0KY29sbmFtZXModGFiMSkgPC0gYygiRXhwb3N1cmVzIiwiRXN0aW1hdGUiLCAiU0UiLCJMSSIsIlVJIiwgIlB2YWwiLCAiU05QcyIpDQpgYGANCg0KSVZXIGVzdGltYXRlcyBvZiB0aGUgY2F1c2FsIGVmZmVjdCBvZiBsaXBpZCBmcmFjdGlvbnMgcmVsYXRlZCB0byBMRExzIGFyZSBzaG93biBpbiBUYWJsZSBcQHJlZih0YWI6dGFiKSBhbmQgRmlndXJlIFxAcmVmKGZpZzpwbDEpLiBXZSBjYW4gc2VlIGZyb20gdGhlIFNOUHMgY29sdW1uIHRoYXQgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBTTlBzIGlzIHNtYWxsIGZvciBhbGwgdGhlIHRyYWl0cy4gVGhlIE1SIHBvaW50IGVzdGltYXRlcyBhcmUgcG9zaXRpdmUgd2hpY2ggbWVhbnMgdGhhdCBvbiBhdmVyYWdlIGEgaGlnaGVyIGxldmVsIG9mIExETCByZWxhdGVkIGxpcGlkIGlzIHJlbGF0ZWQgdG8gYSBoaWdoZXIgcmlzayBvZiBpc2NoZW1pYyBzdHJva2UgKHNpbmNlIHRoZSBhc3NvY2lhdGlvbnMgYXJlIHJpc2sgZXN0aW1hdGVzIG9uIHRoZSBsb2cgc2NhbGUpLiBIb3dldmVyLCB0aGUgZXN0aW1hdGVzIGFsbCByZXBvcnQgY29uZmlkZW5jZSBpbnRlcnZhbHMgc3Bhbm5pbmcgdGhlIG51bGwuIFRoZSBwb3NpdGl2ZSBwb2ludCBlc3RpbWF0ZXMgY29uY3VyIHdpdGggb3VyIHNjaWVudGlmaWMgZXhwZWN0YXRpb25zIGFzIHRoZSBhdGhlcm9nZW5pYyBjaGFyYWN0ZXJpc3RpYyBpbmNyZWFzZSB0aGUgcmlzayBvZiBpc2NoZW1pYyBzdHJva2UuIEhvd2V2ZXIsIG1vcmUgaW5zdHJ1bWVudHMgd291bGQgYmUgbmVlZGVkIHRvIGluY3JlYXNlIHRoZSBzdGF0aXN0aWNhbCBwb3dlciBvZiB0aGVzZSBlc3RpbWF0ZXMuIA0KDQpgYGB7ciB0YWIsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCnRhYiA8LSBhcy5kYXRhLmZyYW1lKHRhYikNCg0KdGFiICU+JQ0KICBtdXRhdGUoU05QcyA9ICBpZmVsc2UgKA0KICBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihTTlBzKSkgPCAyLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoU05QcykpLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiZ3JleSIpLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoU05QcykpLCBjb2xvciA9ICJibGFjayIsIGJhY2tncm91bmQgPSAid2hpdGUiKQ0KICApKSU+JQ0KICBtdXRhdGUoRXN0aW1hdGUgPSAgaWZlbHNlICgNCiAgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGUpKSA8IDAsDQogIGNlbGxfc3BlYyhhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZSkpLCBjb2xvciA9ICJibGFjayIsIGJhY2tncm91bmQgPSAiZ3JleSIpLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGUpKSwgY29sb3IgPSAiYmxhY2siLCBiYWNrZ3JvdW5kID0gIndoaXRlIikNCiAgKSklPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiSVZXIGVzdGltYXRlcyBmb3IgZXhwb3N1cmVzIHJlbGF0ZWQgTERMcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQoNCg0KYGBge3J9DQp0YWJ4IDwtDQogIHJiaW5kKA0KICAgIGxkbF9pdncxLA0KICAgIGxkbF9pdncyLA0KICAgIGxkbF9pdnczLA0KICAgIGxkbF9pdnc0LA0KICAgIGxkbF9pdnc1LA0KICAgIGxkbF9pdnc2LA0KICAgIGxkbF9pdnc3LA0KICAgIGxkbF9pdnc4LA0KICAgIGxkbF9pdnc5LA0KICAgIGxkbF9pdncxMCwNCiAgICBsZGxfaXZ3MTENCiAgKQ0KdGFiZyA8LQ0KICBkYXRhLmZyYW1lKA0KICAgIEVzdGltYXRlcyA9IHRhYnhbLCAxXSwNCiAgICBTRSA9IHRhYnhbLCAyXSwNCiAgICBMSSA9IHRhYnhbLCAzXSwNCiAgICBVSSA9IHRhYnhbLCA0XSwNCiAgICBleHBvc3VyZXMgPSBsaXBpZF90cmFpdHMNCiAgKQ0KDQpwbDEgPC0NCiAgZ2dwbG90KCkgKyBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IHRhYmcsIGFlcygNCiAgICB4ID0gZXhwb3N1cmVzLA0KICAgIHkgPSBFc3RpbWF0ZXMsDQogICAgeW1pbiA9IExJLA0KICAgIHltYXggPSBVSQ0KICApKSArIHhsYWIoIkV4cG9zdXJlcyIpICsgeWxhYigiRXN0aW1hdGVzIikgKyBnZ3RpdGxlKCJMRExzIikgKyBjb29yZF9mbGlwKCkgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbHR5ID0gMikNCmBgYA0KDQpgYGB7ciwgcGwxLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iSVZXIEVzdGltYXRlcyBmb3IgTERMcyJ9DQpwbDENCmBgYA0KDQpUYWJsZSBcQHJlZih0YWI6dGFiMSkgYW5kIEZpZ3VyZSBcQHJlZihmaWc6cGwyKSBzaG93IGNhdXNhbCBlc3RpbWF0ZXMgb2YgbGlwaWQgZnJhY3Rpb25zIHJlbGF0ZWQgdG8gdGhlIEhETHMuIFRoZXNlIHBvaW50IGVzdGltYXRlcyBhcmUgZ2VuZXJhbGx5IG5lZ2F0aXZlIHdpdGggY29uZmlkZW5jZSBpbnRlcnZhbHMgc3Bhbm5pbmcgdGhlIG51bGwuIEluIHRoZSBUYWJsZSBzaGFkZWQgY2VsbHMgaW5kaWNhdGUgYSBzbWFsbCBudW1iZXIgb2YgZ2Vub3R5cGVzLCB3aGljaCBpcyBvZiBpbnRlcmVzdCBiZWNhdXNlIHRoZSBNUi1FZ2dlciBlc3RpbWF0b3IgY2Fubm90IGJlIHBlcmZvcm1lZCB3aXRoIHRoZXNlIGxpcGlkIHRyYWl0cyBkdWUgdG8gdGhlIGxvdyBudW1iZXIgb2YgaW5zdHJ1bWVudHMuDQoNCmBgYHtyIHRhYjEsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCnRhYjEgPC0gYXMuZGF0YS5mcmFtZSh0YWIxKQ0KDQp0YWIxICU+JQ0KICBtdXRhdGUoU05QcyA9ICBpZmVsc2UgKA0KICBhcy5udW1lcmljKFNOUHMpIDwgMywNCiAgY2VsbF9zcGVjKFNOUHMsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICJncmV5IiksDQogIGNlbGxfc3BlYyhTTlBzLCBjb2xvciA9ICJibGFjayIsIGJhY2tncm91bmQgPSAid2hpdGUiKQ0KICApKSU+JQ0KICBtdXRhdGUoRXN0aW1hdGUgPSAgaWZlbHNlICgNCiAgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGUpKSA+IDAuMDEsDQogIGNlbGxfc3BlYyhhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZSkpLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiZ3JleSIpLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGUpKSwgY29sb3IgPSAiYmxhY2siLCBiYWNrZ3JvdW5kID0gIndoaXRlIikNCiAgKSklPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiSVZXIGVzdGltYXRlcyBmb3IgZXhwb3N1cmVzIHJlbGF0ZWQgSERMcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCnRhYngxIDwtIHJiaW5kKGhkbF9pdncxLGhkbF9pdncyLGhkbF9pdnczLGhkbF9pdnc0LGhkbF9pdnc1LGhkbF9pdnc2LGhkbF9pdnc3LGhkbF9pdnc4LGhkbF9pdnc5LGhkbF9pdncxMCxoZGxfaXZ3MTEsaGRsX2l2dzEyLGhkbF9pdncxMyxoZGxfaXZ3MTQpDQp0YWJnMSA8LSBkYXRhLmZyYW1lKEVzdGltYXRlcyA9IHRhYngxWywxXSwgU0UgPSB0YWJ4MVssMl0sIExJID0gdGFieDFbLDNdLCBVSSA9IHRhYngxWyw0XSwgZXhwb3N1cmVzID0gdHJhaXRzKQ0KDQpwbDIgPC0gZ2dwbG90KGRhdGE9dGFiZzEsIGFlcyh4PWV4cG9zdXJlcyx5PUVzdGltYXRlcywgeW1pbj1MSSwgeW1heD1VSSkpICsgZ2VvbV9wb2ludHJhbmdlKCkgK3hsYWIoIkV4cG9zdXJlcyIpKyB5bGFiKCJFc3RpbWF0ZXMiKSArIGdndGl0bGUoIkhETHMiKSArIGNvb3JkX2ZsaXAoKSArIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsdHk9MikNCmBgYA0KDQpgYGB7ciwgcGwyLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmNhcD0iSVZXIEVzdGltYXRlcyBmb3IgSERMcyJ9DQpwbDINCmBgYA0KDQojIyMgTVItRWdnZXIgZXN0aW1hdGVzDQoNCmBgYHtyfQ0KbGRsX21yZWdnZXIxPC1tcmVnZ2VyKGxkbF9tYXQxWywxXSxsZGxfbWF0MVssMl0sbGRsX21hdDFbLDNdLGxkbF9tYXQxWyw0XSkNCmxkbF9tcmVnZ2VyMjwtbXJlZ2dlcihsZGxfbWF0MlssMV0sbGRsX21hdDJbLDJdLGxkbF9tYXQyWywzXSxsZGxfbWF0MlssNF0pDQpsZGxfbXJlZ2dlcjM8LW1yZWdnZXIobGRsX21hdDNbLDFdLGxkbF9tYXQzWywyXSxsZGxfbWF0M1ssM10sbGRsX21hdDNbLDRdKQ0KbGRsX21yZWdnZXI0PC1tcmVnZ2VyKGxkbF9tYXQ0WywxXSxsZGxfbWF0NFssMl0sbGRsX21hdDRbLDNdLGxkbF9tYXQ0Wyw0XSkNCmxkbF9tcmVnZ2VyNTwtbXJlZ2dlcihsZGxfbWF0NVssMV0sbGRsX21hdDVbLDJdLGxkbF9tYXQ1WywzXSxsZGxfbWF0NVssNF0pDQpsZGxfbXJlZ2dlcjY8LW1yZWdnZXIobGRsX21hdDZbLDFdLGxkbF9tYXQ2WywyXSxsZGxfbWF0NlssM10sbGRsX21hdDZbLDRdKQ0KbGRsX21yZWdnZXI3PC1tcmVnZ2VyKGxkbF9tYXQ3WywxXSxsZGxfbWF0N1ssMl0sbGRsX21hdDdbLDNdLGxkbF9tYXQ3Wyw0XSkNCmxkbF9tcmVnZ2VyODwtbXJlZ2dlcihsZGxfbWF0OFssMV0sbGRsX21hdDhbLDJdLGxkbF9tYXQ4WywzXSxsZGxfbWF0OFssNF0pDQpsZGxfbXJlZ2dlcjk8LW1yZWdnZXIobGRsX21hdDlbLDFdLGxkbF9tYXQ5WywyXSxsZGxfbWF0OVssM10sbGRsX21hdDlbLDRdKQ0KbGRsX21yZWdnZXIxMDwtbXJlZ2dlcihsZGxfbWF0MTBbLDFdLGxkbF9tYXQxMFssMl0sbGRsX21hdDEwWywzXSxsZGxfbWF0MTBbLDRdKQ0KbGRsX21yZWdnZXIxMTwtbXJlZ2dlcihsZGxfbWF0MTFbLDFdLGxkbF9tYXQxMVssMl0sbGRsX21hdDExWywzXSxsZGxfbWF0MTFbLDRdKQ0KDQp0YWJrIDwtIHJiaW5kKGxkbF9tcmVnZ2VyMSxsZGxfbXJlZ2dlcjIsbGRsX21yZWdnZXIzLGxkbF9tcmVnZ2VyNCxsZGxfbXJlZ2dlcjUsbGRsX21yZWdnZXI2LGxkbF9tcmVnZ2VyNyxsZGxfbXJlZ2dlcjgsbGRsX21yZWdnZXI5LGxkbF9tcmVnZ2VyMTAsbGRsX21yZWdnZXIxMSkNCmNvbG5hbWVzKHRhYmspIDwtIGMoIkVzdGltYXRlIiwgIlNFIiwiTEkiLCJVSSIsICJQdmFsIikNCg0KIyMjIEhETHMjIw0KaGRsX21yZWdnZXIxPC1tcmVnZ2VyKGhkbF9tYXQxWywxXSxoZGxfbWF0MVssMl0saGRsX21hdDFbLDNdLGhkbF9tYXQxWyw0XSkNCmhkbF9tcmVnZ2VyMjwtbXJlZ2dlcihoZGxfbWF0MlssMV0saGRsX21hdDJbLDJdLGhkbF9tYXQyWywzXSxoZGxfbWF0MlssNF0pDQpoZGxfbXJlZ2dlcjM8LW1yZWdnZXIoaGRsX21hdDNbLDFdLGhkbF9tYXQzWywyXSxoZGxfbWF0M1ssM10saGRsX21hdDNbLDRdKQ0KaGRsX21yZWdnZXI0PC1tcmVnZ2VyKGhkbF9tYXQxMVssMV0saGRsX21hdDExWywyXSxoZGxfbWF0MTFbLDNdLGhkbF9tYXQxMVssNF0pDQpoZGxfbXJlZ2dlcjU8LW1yZWdnZXIoaGRsX21hdDEzWywxXSxoZGxfbWF0MTNbLDJdLGhkbF9tYXQxM1ssM10saGRsX21hdDEzWyw0XSkNCg0KdGFiazEgPC0gcmJpbmQoaGRsX21yZWdnZXIxLGhkbF9tcmVnZ2VyMixoZGxfbXJlZ2dlcjMsaGRsX21yZWdnZXI0LGhkbF9tcmVnZ2VyNSkNCmNvbG5hbWVzKHRhYmsxKSA8LSBjKCJFc3RpbWF0ZSIsICJTRSIsIkxJIiwiVUkiLCAiUHZhbCIpDQpgYGANCg0KSW4gdGhpcyBzZWN0aW9uLCB3ZSB1c2UgdGhlIE1SLUVnZ2VyIG1vZGVsIHRvIHBlcmZvcm0gc2Vuc2l0aXZpdHkgYW5hbHlzaXMgZm9yIHRoZSBJVlcgZXN0aW1hdGVzLiBUYWJsZSBcQHJlZih0YWI6dGFiaykgc2hvd3MgZXN0aW1hdGVzIGZyb20gdGhlIE1SLUVnZ2VyIG1vZGVsIGZvciBsaXBpZCBmcmFjdGlvbnMgcmVsYXRlZCB0byBMRExzLiBJbiBnZW5lcmFsIHRoZSBwb2ludCBlc3RpbWF0ZXMgYXJlIHBvc2l0aXZlIGFuZCBsYXJnZXIgaW4gbWFnbml0dWRlIHRoYW4gdGhlIElWVyBlc3RpbWF0ZXMuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIHRoZSBwb2ludCBlc3RpbWF0ZSBmb3IgcGhvc3Bob2xpcGlkcyBpbiBtZWRpdW0gTERMLCB3aGljaCBzaG93cyBhIG5lZ2F0aXZlIGNhdXNhbCBlc3RpbWF0ZSB3aXRoIGEgY29uZmlkZW5jZSBpbnRlcnZhbCBzcGFubmluZyB0aGUgbnVsbC4gV2UgZmluZCBubyBzdHJvbmcgZXZpZGVuY2UgYWdhaW5zdCB0aGUgbnVsbCBoeXBvdGhlc2lzIG9mIG5vIHBsZWlvdHJvcHksIHNpbmNlIHRoZSBlc3RpbWF0ZXMgb2YgdGhlIGludGVyY2VwdHMgKGBBdmdQbGVpb2ApIGFyZSBhbGwgY2xvc2UgdG8gdGhlIG51bGwgd2l0aCBsYXJnZSBwLXZhbHVlcy4NCg0KYGBge3IgdGFiaywgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcid9DQojIHRhYmUxIDwtIGthYmxlKHRhYjEsIGRpZ2l0cyA9IDMpDQojIGthYmxlX3N0eWxpbmcodGFiZTEsICJzdHJpcGVkIiwgcG9zaXRpb24gPSAiY2VudGVyIikNCg0Ka2FibGUodGFiaywgY2FwdGlvbiA9ICJNUi1FZ2dlciBlc3RpbWF0ZXMgZm9yIExETCByZWxhdGVkIHBoZW5vdHlwZXMiLCBkaWdpdHMgPSA0KSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUKSAlPiUNCiAgcGFja19yb3dzKCJGcmVlIGNob2xlc3Rlcm9sIGluIElETCIsIDEsIDIpICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgSURMIHBhcnRpY2xlcyIsIDMsIDQpICU+JQ0KICBwYWNrX3Jvd3MoIlBob3NwaG9saXBpZHMgaW4gSURMIiwgNSwgNikgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBJREwgcGFydGljbGVzIiwgNywgOCkgJT4lDQogIHBhY2tfcm93cygiRnJlZSBjaG9sZXN0ZXJvbCBpbiBsYXJnZSBMREwiLCA5LCAxMCkgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBsYXJnZSBMREwgcGFydGljbGVzIiwgMTEsIDEyKSAlPiUNCiAgcGFja19yb3dzKCJQaG9zcGhvbGlwaWRzIGluIGxhcmdlIExETCIsIDEzLCAxNCkgJT4lDQogIHBhY2tfcm93cygiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIG1lZGl1bSBMREwiLCAxNSwgMTYpICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgbWVkaXVtIExETCBwYXJ0aWNsZXMiLCAxNywgMTgpICU+JQ0KICBwYWNrX3Jvd3MoIlBob3NwaG9saXBpZHMgaW4gbWVkaXVtIExETCIsIDE5LCAyMCkgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBMREwgcGFydGljbGVzIiwgMjEsIDIyKQ0KYGBgDQoNClNlbnNpdGl2aXR5IGFuYWx5c2lzIG9mIHRoZSBsaXBpZCB0cmFpdHMgcmVsYXRlZCB0byBIRExzIGluIFRhYmxlIFxAcmVmKHRhYjp0YWJrMSkgc2hvdyBuZWdhdGl2ZSBwb2ludCBlc3RpbWF0ZXMgd2l0aCBjb25maWRlbmNlIGludGVydmFscyBzcGFubmluZyB0aGUgbnVsbC4gVGhpcyB3b3VsZCBmaXQgd2l0aCBhIG5hcnJhdGl2ZSBvZiBIREwgZWl0aGVyIGJlaW5nIHByb3RlY3RpdmUgb3IgaGF2aW5nIGEgbnVsbCBlZmZlY3Qgb24gdGhlIHJpc2sgb2YgaXNjaGVtaWMgc3Ryb2tlLCBob3dldmVyIHRoZSBldmlkZW5jZSBhZ2FpbnN0IHRoZSBudWxsIGh5cG90aGVzaXMgaXMgdmVyeSB3ZWFrLg0KDQpgYGB7ciB0YWJrMSwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcid9DQprYWJsZSh0YWJrMSwgY2FwdGlvbiA9ICJNUi1FZ2dlciBlc3RpbWF0ZXMgZm9yIEhETCByZWxhdGVkIHBoZW5vdHlwZXMiLCBkaWdpdHMgPSA0KSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUKSAlPiUNCiAgcGFja19yb3dzKCJDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gbGFyZ2UgSERMIiwgMSwgMikgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBsYXJnZSBIREwgcGFydGljbGVzIiwgMywgNCkgJT4lDQogIHBhY2tfcm93cygiUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBIREwiLCA1LCA2KSAlPiUNCiAgcGFja19yb3dzKCJGcmVlIGNob2xlc3Rlcm9sIGluIHZlcnkgbGFyZ2UgSERMIiwgNywgOCkgJT4lDQogIHBhY2tfcm93cygiUGhvc3Bob2xpcGlkcyBpbiB2ZXJ5IGxhcmdlIEhETCIsIDksIDEwKQ0KYGBgDQoNCiMjIyBNZXRhLWFuYWx5c2lzIG9mIGV4cG9zdXJlIHRyYWl0cw0KDQpJbiBhbiBhdHRlbXB0IHRvIGluY3JlYXNlIHN0YXRpc3RpY2FsIHBvd2VyLCB3ZSBwZXJmb3JtZWQgYSBtZXRhLWFuYWx5c2lzIG9mIHRoZSByZXN1bHRzIGJ5IGxpcGlkIGNhdGVnb3J5IGFuZCBtb2xlY3VsYXIgc2l6ZS4NCg0KIyMjIyBSaXNrIGZhY3RvciBjYXRlZ29yaWVzDQoNCmBgYHtyfQ0KIyMjIExETCBncm91cHMNCiMjIw0KY29uX2xkbDwtIHJiaW5kKHRhYmdbMixdLHRhYmdbNixdLHRhYmdbOSxdLHRhYmdbMTEsXSkNCg0KbGRsbWV0YW4yIDwtIG1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gY29uX2xkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkNvbmNlbnRyYXRpb24iKQ0KDQojIyMNCnBob19sZGwgPC0gcmJpbmQodGFiZ1szLF0sdGFiZ1s3LF0sdGFiZ1sxMCxdKQ0KDQpsZGxtZXRhbjMgPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBwaG9fbGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiUGhvc3Bob2xpcGlkcyIpDQoNCiMjIw0KZnJlZWNob2xfbGRsIDwtIHJiaW5kKHRhYmdbMSxdLHRhYmdbNSxdKQ0KDQpsZGxtZXRhbjQgPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBmcmVlY2hvbF9sZGwsIHN0dWRsYWIgPSBwYXN0ZShleHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJGcmVlIENob2xlc3Rlcm9sIikNCg0KI3Bsb3RtZXRhbjQ8LW1ldGE6OmZvcmVzdChsZGxtZXRhbjQpDQoNCiMjIw0KY2hvbGVzdF9sZGwgPC0gcmJpbmQodGFiZ1s0LF0sdGFiZ1s4LF0pDQoNCmxkbG1ldGFuNSA8LSBtZXRhZ2VuKEVzdGltYXRlcyxTRSwgZGF0YSA9IGNob2xlc3RfbGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ2hvbGVzdGVyb2wgRXN0ZXJzIikNCg0KI3Bsb3RtZXRhbjU8LW1ldGE6OmZvcmVzdChsZGxtZXRhbjUpDQpyZXNsZGxlc3QyPC1jKGxkbG1ldGFuMiRrLGxkbG1ldGFuMiRURS5yYW5kb20sbGRsbWV0YW4yJHNlVEUucmFuZG9tLGxkbG1ldGFuMiRsb3dlci5yYW5kb20sbGRsbWV0YW4yJHVwcGVyLnJhbmRvbSxyb3VuZChsZGxtZXRhbjIkcHZhbC5yYW5kb20sIGRpZ2l0cyA9IDQpKQ0KcmVzbGRsZXN0MzwtYyhsZGxtZXRhbjMkayxsZGxtZXRhbjMkVEUucmFuZG9tLGxkbG1ldGFuMyRzZVRFLnJhbmRvbSxsZGxtZXRhbjMkbG93ZXIucmFuZG9tLGxkbG1ldGFuMyR1cHBlci5yYW5kb20scm91bmQobGRsbWV0YW4zJHB2YWwucmFuZG9tLCBkaWdpdHMgPSA0KSkNCnJlc2xkbGVzdDQ8LWMobGRsbWV0YW40JGssbGRsbWV0YW40JFRFLnJhbmRvbSxsZGxtZXRhbjQkc2VURS5yYW5kb20sbGRsbWV0YW40JGxvd2VyLnJhbmRvbSxsZGxtZXRhbjQkdXBwZXIucmFuZG9tLHJvdW5kKGxkbG1ldGFuNCRwdmFsLnJhbmRvbSwgZGlnaXRzID0gNCkpDQpyZXNsZGxlc3Q1PC1jKGxkbG1ldGFuNSRrLGxkbG1ldGFuNSRURS5yYW5kb20sbGRsbWV0YW41JHNlVEUucmFuZG9tLGxkbG1ldGFuNSRsb3dlci5yYW5kb20sbGRsbWV0YW41JHVwcGVyLnJhbmRvbSxyb3VuZChsZGxtZXRhbjUkcHZhbC5yYW5kb20sIGRpZ2l0cyA9IDQpKQ0KdGFiZmY8LSByYmluZChyZXNsZGxlc3QyLHJlc2xkbGVzdDMscmVzbGRsZXN0NCxyZXNsZGxlc3Q1KQ0KY29sbmFtZXModGFiZmYpPC0gYygiTiIsIkVzdGltYXRlIiwgIlNFIiwiTEkiLCJVSSIsIlB2YWwiKQ0Kcm93bmFtZXModGFiZmYpPC0gYygiQ29uY2VudHJhdGlvbiIsICJQaG9zcGhvbGlwaWRzIiwiRnJlZSBDaG9sZXN0ZXJvbCIsIkNob2xlc3Rlcm9sIGVzdGVycyIpDQpgYGANCg0KVGFibGUgXEByZWYodGFiOnRhYmZmKSBzaG93cyByZXN1bHRzIGZyb20gdGhlIG1ldGEtYW5hbHlzaXMgb2YgdGhlIElWVyBlc3RpbWF0ZXMuIFRoZSBwb2ludCBlc3RpbWF0ZXMgc2hvdyBudWxsIG9yIHBvc2l0aXZlIGVzdGltYXRlcyB3aXRoIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHNwYW5uaW5nIHRoZSBudWxsLCBob3dldmVyIGdpdmVuIHRoZSBudW1iZXIgb2YgaW5zdHJ1bWVudHMgdGhlIGVzdGltYXRlcyBzaG93IGhvdyBkZXNwaXRlIHRoZSBtZXRhLWFuYWx5c2lzLCB0aGUgYW5hbHlzZXMgeWllbGQgaW1wcmVjaXNlIGNhdXNhbCBlc3RpbWF0ZXMuIFJlc3VsdHMgaW4gVGFibGUgXEByZWYodGFiOnRhYmZmMSkgYXJlIHNpbWlsYXIgdG8gdGhlIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMgb2YgTERMcy4gVGhlIHBvaW50IGVzdGltYXRlcyBzaG93IG51bGwgb3IgbmVnYXRpdmUgZXN0aW1hdGVzIHdpdGggY29uZmlkZW5jZSBpbnRlcnZhbHMgc3Bhbm5pbmcgdGhlIG51bGwuDQoNCmBgYHtyIHRhYmZmLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0V9DQp0YWJmZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmZmKQ0KdGFiZmYgJT4lDQogIGthYmxlKCJodG1sIixlc2NhcGUgPSBGLCBjYXB0aW9uID0gIk1ldGEtYW5hbHlzaXMgb2YgSVZXIGVzdGltYXRlcyBmcm9tIExETCByZWxhdGVkIHBoZW5vdHlwZXMiLCBkaWdpdHMgPSA0KSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQojIyMgSERMIGdyb3Vwcw0KbWV0YXRhYmcxPC0gY2JpbmQodGFiZzEsYXMuY2hhcmFjdGVyKHRyYWl0cykpDQpoZGxtZXRhbjwtbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBtZXRhdGFiZzEsIHN0dWRsYWIgPSBwYXN0ZShleHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJUb3RhbCBDaG9sZXN0ZXJvbCIpDQoNCiMjIw0KY2hvbGVzdF9oZGw8LSByYmluZCh0YWJnMVsxLF0sdGFiZzFbNCxdLHRhYmcxWzEwLF0pDQoNCmhkbG1ldGExPC1tZXRhZ2VuKEVzdGltYXRlcyxTRSwgZGF0YSA9IGNob2xlc3RfaGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ2hvbGVzdGVyb2wgZXN0ZXJzIikNCg0KIyMjDQpmcmVlY2hvbF9oZGw8LSByYmluZCh0YWJnMVs1LF0sIHRhYmcxWzExLF0pDQoNCmhkbG1ldGEyPC1tZXRhZ2VuKEVzdGltYXRlcyxTRSwgZGF0YSA9IGZyZWVjaG9sX2hkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkZyZWUgQ2hvbGVzdGVyb2wiKQ0KDQojIyMNCmNvbl9oZGw8LSByYmluZCh0YWJnMVsyLF0sdGFiZzFbNixdLHRhYmcxWzgsXSx0YWJnMVsxMixdKQ0KDQpoZGxtZXRhMzwtbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBjb25faGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ29uY2VudHJhdGlvbiIpDQoNCiMjIw0KcGhvX2hkbDwtIHJiaW5kKHRhYmcxWzMsXSx0YWJnMVs3LF0sdGFiZzFbMTQsXSkNCg0KaGRsbWV0YTQ8LW1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gcGhvX2hkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIlBob3NwaG9saXBpZHMiKQ0KDQojIyMNCnRyaWdfaGRsPC0gcmJpbmQodGFiZzFbOSxdLHRhYmcxWzE0LF0pDQoNCmhkbG1ldGE1PC1tZXRhZ2VuKEVzdGltYXRlcyxTRSwgZGF0YSA9IHRyaWdfaGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiVHJpZ2x5Y2VyaWRlcyIpDQoNCnJlc2hkbGVzdDE8LWMoaGRsbWV0YTEkayxoZGxtZXRhMSRURS5yYW5kb20saGRsbWV0YTEkc2VURS5yYW5kb20saGRsbWV0YTEkbG93ZXIucmFuZG9tLGhkbG1ldGExJHVwcGVyLnJhbmRvbSxoZGxtZXRhMSRwdmFsLnJhbmRvbSkNCnJlc2hkbGVzdDI8LWMoaGRsbWV0YTIkayxoZGxtZXRhMiRURS5yYW5kb20saGRsbWV0YTIkc2VURS5yYW5kb20saGRsbWV0YTIkbG93ZXIucmFuZG9tLGhkbG1ldGEyJHVwcGVyLnJhbmRvbSxoZGxtZXRhMiRwdmFsLnJhbmRvbSkNCnJlc2hkbGVzdDM8LWMoaGRsbWV0YTMkayxoZGxtZXRhMyRURS5yYW5kb20saGRsbWV0YTMkc2VURS5yYW5kb20saGRsbWV0YTMkbG93ZXIucmFuZG9tLGhkbG1ldGEzJHVwcGVyLnJhbmRvbSxoZGxtZXRhMyRwdmFsLnJhbmRvbSkNCnJlc2hkbGVzdDQ8LWMoaGRsbWV0YTQkayxoZGxtZXRhNCRURS5yYW5kb20saGRsbWV0YTQkc2VURS5yYW5kb20saGRsbWV0YTQkbG93ZXIucmFuZG9tLGhkbG1ldGE0JHVwcGVyLnJhbmRvbSxoZGxtZXRhNCRwdmFsLnJhbmRvbSkNCnJlc2hkbGVzdDU8LWMoaGRsbWV0YTUkayxoZGxtZXRhNSRURS5yYW5kb20saGRsbWV0YTUkc2VURS5yYW5kb20saGRsbWV0YTUkbG93ZXIucmFuZG9tLGhkbG1ldGE1JHVwcGVyLnJhbmRvbSxoZGxtZXRhNSRwdmFsLnJhbmRvbSkNCg0KdGFiZmYxPC0gcmJpbmQocmVzaGRsZXN0MSxyZXNoZGxlc3QyLHJlc2hkbGVzdDMscmVzaGRsZXN0NCxyZXNoZGxlc3Q1KQ0KY29sbmFtZXModGFiZmYxKTwtIGMoIk4iLCJNZWFuIiwgIlNFIiwiTEkiLCJVSSIsIlB2YWwiKQ0Kcm93bmFtZXModGFiZmYxKTwtIGMoIkNob2xlc3Rlcm9sIEVzdGVycyIsIkZyZWUgQ2hvbGVzdGVyb2wiLCANCiAgICAgICAgICAgICAgICAiQ29uY2VudHJhdGlvbiIsInBob3NwaG9saXBpZHMiLCJUcmlnbHljZXJpZGVzIikNCmBgYA0KDQpgYGB7ciB0YWJmZjEsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCnRhYmZmMSA8LSBhcy5kYXRhLmZyYW1lKHRhYmZmMSkNCg0KdGFiZmYxICU+JQ0KICBrYWJsZSgiaHRtbCIsZXNjYXBlID0gRiwgY2FwdGlvbiA9ICJNZXRhLWFuYWx5c2lzIG9mIElWVyBlc3RpbWF0ZXMgZm9yIEhETCByZWxhdGVkIHBoZW5vdHlwZXMiLCBkaWdpdHMgPSA0KSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFRSVUUpDQpgYGANCg0KIyMjIyBTaXplcw0KYGBge3J9DQojIyMgTERMIHNpemVzDQppbnRlcm1lZGlhdGVfbGRsPC0gcmJpbmQodGFiZ1sxLF0sdGFiZ1syLF0sdGFiZ1szLF0pDQpsZGxzaXplMTwtIG1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gaW50ZXJtZWRpYXRlX2xkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkludGVybWVkaWF0ZSBMRExzIikNCg0KbWVkX2xkbDwtIHJiaW5kKHRhYmdbOCxdLHRhYmdbOSxdLHRhYmdbMTAsXSkNCmxkbHNpemUyPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBtZWRfbGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiTWVkaXVtIExETHMiKQ0KDQpsYXJfbGRsPC0gcmJpbmQodGFiZ1s0LF0sdGFiZ1s1LF0sdGFiZ1s2LF0sdGFiZ1s3LF0pDQpsZGxzaXplMzwtIG1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gbGFyX2xkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkxhcmdlIExETHMiKQ0KDQpsZGxzaXplczE8LSBjKGxkbHNpemUxJGssbGRsc2l6ZTEkVEUucmFuZG9tLGxkbHNpemUxJHNlVEUucmFuZG9tLGxkbHNpemUxJGxvd2VyLnJhbmRvbSxsZGxzaXplMSR1cHBlci5yYW5kb20scm91bmQobGRsc2l6ZTEkcHZhbC5yYW5kb20sZGlnaXRzID0gNCkpDQpsZGxzaXplczI8LSBjKGxkbHNpemUyJGssbGRsc2l6ZTIkVEUucmFuZG9tLGxkbHNpemUyJHNlVEUucmFuZG9tLGxkbHNpemUyJGxvd2VyLnJhbmRvbSxsZGxzaXplMiR1cHBlci5yYW5kb20scm91bmQobGRsc2l6ZTIkcHZhbC5yYW5kb20sZGlnaXRzID0gNCkpDQpsZGxzaXplczM8LSBjKGxkbHNpemUzJGssbGRsc2l6ZTMkVEUucmFuZG9tLGxkbHNpemUzJHNlVEUucmFuZG9tLGxkbHNpemUzJGxvd2VyLnJhbmRvbSxsZGxzaXplMyR1cHBlci5yYW5kb20scm91bmQobGRsc2l6ZTMkcHZhbC5yYW5kb20sZGlnaXRzID0gNCkpDQp0YWJiZjwtIHJiaW5kKGxkbHNpemVzMSxsZGxzaXplczIsbGRsc2l6ZXMzKQ0KY29sbmFtZXModGFiYmYpPC0gYygiTiIsIk1lYW4iLCAiU0UiLCJMSSIsIlVJIiwiUC12YWwiKQ0Kcm93bmFtZXModGFiYmYpPC0gYygiSW50ZXJtZWRpYXRlIiwiTWVkaXVtIiwiTGFyZ2UiKQ0KYGBgDQoNCkluIHRoaXMgc2VjdGlvbiB3ZSBwcmVzZW50IHJlc3VsdCBtZXRhLWFuYWx5c2luZyBvdmVyIHRoZSBsaXBpZCB0cmFpdHMgZm9yIGVhY2ggc2l6ZSBvZiBtb2xlY3VsZS4gTERMIHJlc3VsdHMgYXJlIHNob3duIGluIFRhYmxlIFxAcmVmKHRhYjp0YWJiZikuIFNpbWlsYXIgdG8gdGhlIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMgaW4gXEByZWYodGFiOnRhYmZmKSB0aGUgc2l6ZXMgaGF2ZSBudWxsIG9yIHBvc2l0aXZlIGNhdXNhbCBlc3RpbWF0ZSB3aXRoIG5vIHN0cm9uZyBldmlkZW5jZSBhZ2FpbnN0IHRoZSBudWxsLiBUYWJsZSBcQHJlZih0YWI6dGFiYmYpIHNob3dzIHRoYXQgdGhlIG1lZGl1bSBhbmQgbGFyZ2Ugc2l6ZWQgTERMcyBoYXZlIGEgZ3JlYXRlciBtYWduaXR1ZGUgb2YgZWZmZWN0IHRoYW4gdGhlIGludGVybWVkaWF0ZXMgc2l6ZXMgd2hpY2ggbWF0Y2hlcyBvdXIgc2NpZW50aWZpYyByYXRpb25hbGUuDQoNCmBgYHtyLCB0YWJiZiwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0KdGFiYmYgPC0gYXMuZGF0YS5mcmFtZSh0YWJiZikNCg0KdGFiYmYgJT4lDQogIGthYmxlKCJodG1sIixlc2NhcGUgPSBGLCBjYXB0aW9uID0gIk1ldGEtYW5hbHlzaXMgb2YgSVZXIGVzdGltYXRlcyBmb3IgTERMIHNpemVzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIEhETCBzaXplcw0Kc21hbGxfaGRsPC0gcmJpbmQodGFiZzFbOCxdLHRhYmcxWzksXSkNCmhkbHNpemUxPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBzbWFsbF9oZGwsIHN0dWRsYWIgPSBwYXN0ZShleHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJTbWFsbCBoZGxzIikNCg0KbWVkX2hkbDwtIHJiaW5kKHRhYmcxWzQsXSx0YWJnMVs1LF0sdGFiZzFbNixdLHRhYmcxWzcsXSkNCmhkbHNpemUyPC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSBtZWRfaGRsLCBzdHVkbGFiID0gcGFzdGUoZXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiTWVkaXVtIGhkbHMiKQ0KDQpsYXJfaGRsPC0gcmJpbmQodGFiZzFbMSxdLHRhYmcxWzIsXSx0YWJnMVszLF0pDQpoZGxzaXplMzwtIG1ldGFnZW4oRXN0aW1hdGVzLFNFLCBkYXRhID0gbGFyX2hkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIkxhcmdlIGhkbHMiKQ0KDQp2bGFyX2hkbDwtIHJiaW5kKHRhYmcxWzEwLF0sdGFiZzFbMTEsXSx0YWJnMVsxMixdLHRhYmcxWzEzLF0sdGFiZzFbMTQsXSkNCmhkbHNpemU0PC0gbWV0YWdlbihFc3RpbWF0ZXMsU0UsIGRhdGEgPSB2bGFyX2hkbCwgc3R1ZGxhYiA9IHBhc3RlKGV4cG9zdXJlcyksIGNvbWIuZml4ZWQgPSBGQUxTRSwgY29tYi5yYW5kb20gPSBUUlVFLGhha24gPSBGQUxTRSxwcmVkaWN0aW9uPVRSVUUsc209IlNNRCIsIG1ldGhvZC50YXUgPSAiUkVNTCIsIHRpdGxlID0gIlZlcnkgbGFyZ2UgaGRscyIpDQoNCmhkbHNpemVzMTwtIGMoaGRsc2l6ZTEkayxoZGxzaXplMSRURS5yYW5kb20saGRsc2l6ZTEkc2VURS5yYW5kb20saGRsc2l6ZTEkbG93ZXIucmFuZG9tLGhkbHNpemUxJHVwcGVyLnJhbmRvbSxyb3VuZChoZGxzaXplMSRwdmFsLnJhbmRvbSxkaWdpdHMgPSA0KSkNCmhkbHNpemVzMjwtIGMoaGRsc2l6ZTIkayxoZGxzaXplMiRURS5yYW5kb20saGRsc2l6ZTIkc2VURS5yYW5kb20saGRsc2l6ZTIkbG93ZXIucmFuZG9tLGhkbHNpemUyJHVwcGVyLnJhbmRvbSxyb3VuZChoZGxzaXplMiRwdmFsLnJhbmRvbSxkaWdpdHMgPSA0KSkNCmhkbHNpemVzMzwtIGMoaGRsc2l6ZTMkayxoZGxzaXplMyRURS5yYW5kb20saGRsc2l6ZTMkc2VURS5yYW5kb20saGRsc2l6ZTMkbG93ZXIucmFuZG9tLGhkbHNpemUzJHVwcGVyLnJhbmRvbSxyb3VuZChoZGxzaXplMyRwdmFsLnJhbmRvbSxkaWdpdHMgPSA0KSkNCmhkbHNpemVzNDwtIGMoaGRsc2l6ZTQkayxoZGxzaXplNCRURS5yYW5kb20saGRsc2l6ZTQkc2VURS5yYW5kb20saGRsc2l6ZTQkbG93ZXIucmFuZG9tLGhkbHNpemU0JHVwcGVyLnJhbmRvbSxyb3VuZChoZGxzaXplNCRwdmFsLnJhbmRvbSxkaWdpdHMgPSA0KSkNCnRhYmJmMTwtIHJiaW5kKGhkbHNpemVzMSxoZGxzaXplczIsaGRsc2l6ZXMzLGhkbHNpemVzNCkNCmNvbG5hbWVzKHRhYmJmMSk8LSBjKCJOIiwiTWVhbiIsICJTRSIsIkxJIiwiVUkiLCJQLXZhbCIpDQpyb3duYW1lcyh0YWJiZjEpPC0gYygiU21hbGwiLCJNZWRpdW0iLCJMYXJnZSIsIlZlcnkgTGFyZ2UiKQ0KYGBgDQoNCkZvciB0aGUgSERMIHNpemVzIGluIFRhYmxlIFxAcmVmKHRhYjp0YWJiZjEpIHRoZSBwb2ludCBlc3RpbWF0ZXMgc2hvdyBuZWdhdGl2ZSBwb2ludCBlc3RpbWF0ZXMgY2xvc2UgdG8gdGhlIG51bGwgaG93ZXZlciBub25lIG9mIHRoZSBlc3RpbWF0ZXMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFdlIGZpbmQgdGhhdCB0aGUgcG9vbGVkIHBvaW50IGVzdGltYXRlZCBmb3IgdGhlIHZlcnkgbGFyZ2UgSERMIG1vbGVjdWxlcyBpcyBjbG9zZXN0IHRvIHRoZSBudWxsLg0KDQpgYGB7ciwgdGFiYmYxLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnRhYmJmMSA8LSBhcy5kYXRhLmZyYW1lKHRhYmJmMSkNCg0KdGFiYmYxICU+JQ0KICBrYWJsZSgiaHRtbCIsZXNjYXBlID0gRiwgY2FwdGlvbiA9ICJNZXRhLWFuYWx5c2lzIG9mIElWVyBlc3RpbWF0ZXMgZm9yIEhETCBTaXplcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQojIyMgTXVsdGl2YXJpYXRlIE1ldGEtYW5hbHlzaXMgb2YgTVItRWdnZXIgZXN0aW1hdGVzDQoNCmBgYHtyfQ0KIyMjIyAgRnJlZSBDaG9sZXN0ZXJvbA0KYmV0YWxkbDE8LSBtYXRyaXgobnJvdyA9IDIsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YWxkbDFbMSxdIDwtIGModGFia1sxLDFdLHRhYmtbMiwxXSkNCmJldGFsZGwxWzIsXSA8LSBjKHRhYmtbOSwxXSx0YWJrWzEwLDFdKQ0KDQpsZGwxY292PC0gbWF0cml4KGMoKHRhYmtbMSwyXSleMiwwLDAsKHRhYmtbMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbDJjb3Y8LSBtYXRyaXgoYygodGFia1s5LDJdKV4yLDAsMCwodGFia1sxMCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21hdGxpc3QxPC0gbGlzdChsZGwxY292LCBsZGwyY292KQ0KbGRsMW12bWV0YTwtIG12bWV0YShiZXRhbGRsMSwgc21hdGxpc3QxKQ0KDQojIyMjIENvbmNlbnRyYXRpb24NCmJldGFsZGwzPC0gbWF0cml4KG5yb3cgPSA0LCBuY29sID0gMiwgTkEpDQoNCmJldGFsZGwzWzEsXSA8LSBjKHRhYmtbMywxXSx0YWJrWzQsMV0pDQpiZXRhbGRsM1syLF0gPC0gYyh0YWJrWzExLDFdLHRhYmtbMTIsMV0pDQpiZXRhbGRsM1szLF0gPC0gYyh0YWJrWzE3LDFdLHRhYmtbMTgsMV0pDQpiZXRhbGRsM1s0LF0gPC0gYyh0YWJrWzIxLDFdLHRhYmtbMjIsMV0pDQoNCmxkbHZjb292PC0gbWF0cml4KGMoKHRhYmtbMywyXSleMiwwLDAsKHRhYmtbNCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbHZjb292MTwtIG1hdHJpeChjKCh0YWJrWzExLDJdKV4yLDAsMCwodGFia1sxMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbHZjb292MjwtIG1hdHJpeChjKCh0YWJrWzE3LDJdKV4yLDAsMCwodGFia1sxOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbHZjb292MzwtIG1hdHJpeChjKCh0YWJrWzIxLDJdKV4yLDAsMCwodGFia1syMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21hdGxpc3QzPC0gbGlzdChsZGx2Y29vdiwgbGRsdmNvb3YxLCBsZGx2Y29vdjIsIGxkbHZjb292MykNCmxkbDNtdm1ldGE8LSBtdm1ldGEoYmV0YWxkbDMsIHNtYXRsaXN0MykNCg0KIyMjIyBwaG9zcGhvbGlwaWRzDQpiZXRhbGRsNDwtIG1hdHJpeChucm93ID0gMywgbmNvbCA9IDIsIE5BKQ0KDQpiZXRhbGRsNFsxLF0gPC0gYyh0YWJrWzUsMV0sdGFia1s2LDFdKQ0KYmV0YWxkbDRbMixdIDwtIGModGFia1sxMywxXSx0YWJrWzE0LDFdKQ0KYmV0YWxkbDRbMyxdIDwtIGModGFia1sxOSwxXSx0YWJrWzIwLDFdKQ0KDQpsZGwxY29vdjwtIG1hdHJpeChjKCh0YWJrWzUsMl0pXjIsMCwwLCh0YWJrWzYsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGwyY29vdjwtIG1hdHJpeChjKCh0YWJrWzEzLDJdKV4yLDAsMCwodGFia1sxNCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbDNjb292PC0gbWF0cml4KGMoKHRhYmtbMTksMl0pXjIsMCwwLCh0YWJrWzIwLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpzbWF0bGlzdDQ8LSBsaXN0KGxkbDFjb292LCBsZGwyY29vdiwgbGRsM2Nvb3YpDQpsZGw0bXZtZXRhPC0gbXZtZXRhKGJldGFsZGw0LCBzbWF0bGlzdDQpDQoNCiMjIyMgQ2hvbGVzdGVyb2wgZXN0ZXJzDQpiZXRhbGRsNTwtIG1hdHJpeChucm93ID0gMiwgbmNvbCA9IDIsIE5BKQ0KDQpiZXRhbGRsNVsxLF0gPC0gYyh0YWJrWzcsMV0sdGFia1s4LDFdKQ0KYmV0YWxkbDVbMixdIDwtIGModGFia1sxNSwxXSx0YWJrWzE2LDFdKQ0KDQpsZGRsMWNvdjwtIG1hdHJpeChjKCh0YWJrWzcsMl0pXjIsMCwwLCh0YWJrWzgsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGRsMmNvdjwtIG1hdHJpeChjKCh0YWJrWzE1LDJdKV4yLDAsMCwodGFia1sxNiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21hdGxpc3Q1PC0gbGlzdChsZGRsMWNvdiwgbGRkbDJjb3YpDQpsZGw1bXZtZXRhPC0gbXZtZXRhKGJldGFsZGw1LCBzbWF0bGlzdDUpDQoNCiMjIyMgY29sbGF0ZSByZXN1bHRzDQp0cmFpdHNfbGRsbXZtZXRhIDwtDQogIHJiaW5kKA0KICBjKGxkbG1ldGFuMiRrLHVubmFtZShsZGwxbXZtZXRhJGNvZWZmaWNpZW50cyksc3VtbWFyeShsZGwxbXZtZXRhKSRjb2VmWzEsIDRdLHN1bW1hcnkobGRsMW12bWV0YSkkY29lZlsyLCA0XSksDQogIGMobGRsbWV0YW4zJGssdW5uYW1lKGxkbDNtdm1ldGEkY29lZmZpY2llbnRzKSxzdW1tYXJ5KGxkbDNtdm1ldGEpJGNvZWZbMSwgNF0sc3VtbWFyeShsZGwzbXZtZXRhKSRjb2VmWzIsIDRdKSwNCiAgYyhsZGxtZXRhbjQkayx1bm5hbWUobGRsNG12bWV0YSRjb2VmZmljaWVudHMpLHN1bW1hcnkobGRsNG12bWV0YSkkY29lZlsxLCA0XSxzdW1tYXJ5KGxkbDRtdm1ldGEpJGNvZWZbMiwgNF0pLA0KICBjKGxkbG1ldGFuNSRrLHVubmFtZShsZGw1bXZtZXRhJGNvZWZmaWNpZW50cyksc3VtbWFyeShsZGw1bXZtZXRhKSRjb2VmWzEsIDRdLHN1bW1hcnkobGRsNW12bWV0YSkkY29lZlsyLCA0XSkNCiAgKQ0Kcm93bmFtZXModHJhaXRzX2xkbG12bWV0YSk8LSBjKCJGcmVlIENob2xlc3Rlcm9sIiwiQ29uY2VudHJhdGlvbiIsIlBob3NwaG9saXBpZHMiLCJDaG9sZXN0ZXJvbCBlc3RlcnMiKQ0KY29sbmFtZXModHJhaXRzX2xkbG12bWV0YSk8LSBjKCJOIiwiQVZnIFBsZWlvIiwgIlNsb3BlIiwgIlB2YWwoUGxlaW8pIiwgIlB2YWwoRXN0KSIpDQpgYGANCg0KV2UgYWxzbyBwcmVzZW50IGVxdWl2YWxlbnQgbWV0YS1hbmFseXNpcyBlc3RpbWF0ZXMgZm9yIG91ciBNUi1FZ2dlciByZXN1bHRzLCB0aGUgZGlmZmVyZW5jZSBiZWluZyB0aGF0IHdlIHVzZSBtdWx0aXZhcmlhdGUgbWV0YS1hbmFseXNpcyBzaW5jZSB0aGUgTVItRWdnZXIgbW9kZWwgcmV0dXJucyAyIHBhcmFtZXRlcnMgKHNsb3BlIGFuZCBpbnRlcmNlcHQpLiBUaGUgbG93IG51bWJlciBvZiBNUi1FZ2dlciBlc3RpbWF0ZXMgZnJvbSB0aGUgZXhwb3N1cmUgdHJhaXRzIHJlbGF0ZWQgdG8gSERMLXJlbGF0ZWQgcGhlbm90eXBlcyBtZWFudCB0aGF0IHdlIGNvdWxkIG5vdCByZXBvcnQgYW55IGVzdGltYXRlcy4gVGhlIHJlc3VsdHMgb2YgdGhlIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMgaW4gVGFibGUgXEByZWYodGFiOmxkbG12bWV0YTEpIHNob3cgbm8gc3Ryb25nIGV2aWRlbmNlIGFnYWluc3QgdGhlIG51bGwgb2Ygbm8gcGxlaW90cm9weS4gQ2hvbGVzdGVyb2wgZXN0ZXJzIHNob3cgYSBncmVhdGVyIGVmZmVjdCBvbiBpc2NoZW1pYyBzdHJva2Ugd2l0aGluIHRoZSBkaWZmZXJlbnQgTERMIHRyYWl0cy4gVGFibGUgXEByZWYodGFiOmxkbG12bWV0YTIpIHNob3dzIG5vIHN0cm9uZyBldmlkZW5jZSBhZ2FpbnN0IHRoZSBudWxsIGh5cG90aGVzaXMgb2Ygbm8gcGxlaW90cm9weS4gVGhlIHN1bW1hcnkgcG9pbnQgZXN0aW1hdGVzIGFyZSBiaWdnZXIgaW4gbWFnbml0dWRlIHRoYW4gdGhlIElWVyBlc3RpbWF0ZXMgaW4gVGFibGUgXEByZWYodGFiOnRhYmJmKS4gVGhlIGludGVybWVkaWF0ZSBzaXplZCB0cmFpdHMgcmV0dXJuZWQgYSBwb3NpdGl2ZSBlc3RpbWF0ZSBzdWdnZXN0aW5nIGFuIGluY3JlYXNlZCByaXNrIG9mIGlzY2hlbWljIHN0cm9rZS4NCg0KYGBge3IsIGxkbG12bWV0YTEsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCnRyYWl0c19sZGxtdm1ldGEgPC0gYXMuZGF0YS5mcmFtZSh0cmFpdHNfbGRsbXZtZXRhKQ0KDQp0cmFpdHNfbGRsbXZtZXRhICU+JQ0KICBrYWJsZSgiaHRtbCIsZXNjYXBlID0gRiwgY2FwdGlvbiA9ICJSZXN1bHRzIGZyb20gTXVsdGl2YXJpYXRlIE1ldGEtYW5hbHlzaXMgb2YgTERMIHJlbGF0ZWQgcGhlbm90eXBlcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCiMjIGludGVybWVkaWF0ZQ0KDQppYmV0YWxkbDwtIG1hdHJpeChucm93ID0gMywgbmNvbCA9IDIsIE5BKQ0KDQppYmV0YWxkbFsxLF0gPC0gYyh0YWJrWzEsMV0sdGFia1syLDFdKQ0KaWJldGFsZGxbMixdIDwtIGModGFia1szLDFdLHRhYmtbNCwxXSkNCmliZXRhbGRsWzMsXSA8LSBjKHRhYmtbNSwxXSx0YWJrWzYsMV0pDQoNCmlsZGxjb3YxPC0gbWF0cml4KGMoKHRhYmtbMSwyXSleMiwwLDAsKHRhYmtbMSwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmlsZGxjb3YyPC0gbWF0cml4KGMoKHRhYmtbMywyXSleMiwwLDAsKHRhYmtbNCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmlsZGxjb3YzPC0gbWF0cml4KGMoKHRhYmtbNSwyXSleMiwwLDAsKHRhYmtbNiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21tYXRsaXN0PC0gbGlzdChpbGRsY292MSwgaWxkbGNvdjIsIGlsZGxjb3YzKQ0KaWxkbG12bWV0YTwtIG12bWV0YShpYmV0YWxkbCwgc21tYXRsaXN0KQ0KDQojIyMgTWVkaXVtDQoNCm1iZXRhbGRsPC0gbWF0cml4KG5yb3cgPSAzLCBuY29sID0gMiwgTkEpDQoNCm1iZXRhbGRsWzEsXSA8LSBjKHRhYmtbMTUsMV0sdGFia1sxNiwxXSkNCm1iZXRhbGRsWzIsXSA8LSBjKHRhYmtbMTcsMV0sdGFia1sxOCwxXSkNCm1iZXRhbGRsWzMsXSA8LSBjKHRhYmtbMTksMV0sdGFia1syMCwxXSkNCg0KbWxkbGNvdjE8LSBtYXRyaXgoYygodGFia1sxNSwyXSleMiwwLDAsKHRhYmtbMTYsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQptbGRsY292MjwtIG1hdHJpeChjKCh0YWJrWzE3LDJdKV4yLDAsMCwodGFia1sxOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCm1sZGxjb3YzPC0gbWF0cml4KGMoKHRhYmtbMTksMl0pXjIsMCwwLCh0YWJrWzIwLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpzbW1hdGxpc3QxPC0gbGlzdChtbGRsY292MSxtbGRsY292MixtbGRsY292MykNCnNsZGxtdm1ldGExPC0gbXZtZXRhKG1iZXRhbGRsLCBzbW1hdGxpc3QxKQ0KDQojIyMgbGFyZ2UNCg0KbGJldGFsZGw8LSBtYXRyaXgobnJvdyA9IDQsIG5jb2wgPSAyLCBOQSkNCg0KbGJldGFsZGxbMSxdIDwtIGModGFia1s3LDFdLHRhYmtbOCwxXSkNCmxiZXRhbGRsWzIsXSA8LSBjKHRhYmtbOSwxXSx0YWJrWzEwLDFdKQ0KbGJldGFsZGxbMyxdIDwtIGModGFia1sxMSwxXSx0YWJrWzEyLDFdKQ0KbGJldGFsZGxbNCxdIDwtIGModGFia1sxMywxXSx0YWJrWzE0LDFdKQ0KDQpsbGRsY292MTwtIG1hdHJpeChjKCh0YWJrWzcsMl0pXjIsMCwwLCh0YWJrWzgsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsbGRsY292MjwtIG1hdHJpeChjKCh0YWJrWzksMl0pXjIsMCwwLCh0YWJrWzEwLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KbGxkbGNvdjM8LSBtYXRyaXgoYygodGFia1sxMSwyXSleMiwwLDAsKHRhYmtbMTIsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsbGRsY292NDwtIG1hdHJpeChjKCh0YWJrWzEzLDJdKV4yLDAsMCwodGFia1sxNCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0Kc21tYXRsaXN0MjwtIGxpc3QobGxkbGNvdjEsbGxkbGNvdjIsbGxkbGNvdjMsbGxkbGNvdjQpDQpzbGRsbXZtZXRhMjwtIG12bWV0YShsYmV0YWxkbCwgc21tYXRsaXN0MikNCg0Kc2l6ZXNfbGRsbXZtZXRhIDwtDQogIHJiaW5kKA0KICBjKGxkbHNpemUxJGssDQogIHVubmFtZShpbGRsbXZtZXRhJGNvZWZmaWNpZW50cyksDQogIHN1bW1hcnkoaWxkbG12bWV0YSkkY29lZlsxLCA0XSwNCiAgc3VtbWFyeShpbGRsbXZtZXRhKSRjb2VmWzIsIDRdDQogICksDQogIGMobGRsc2l6ZTIkaywNCiAgdW5uYW1lKHNsZGxtdm1ldGExJGNvZWZmaWNpZW50cyksDQogIHN1bW1hcnkoc2xkbG12bWV0YTEpJGNvZWZbMSwgNF0sDQogIHN1bW1hcnkoc2xkbG12bWV0YTEpJGNvZWZbMiwgNF0NCiAgKSwNCiAgYyhsZGxzaXplMyRrLA0KICB1bm5hbWUoc2xkbG12bWV0YTIkY29lZmZpY2llbnRzKSwNCiAgc3VtbWFyeShzbGRsbXZtZXRhMikkY29lZlsxLCA0XSwNCiAgc3VtbWFyeShzbGRsbXZtZXRhMikkY29lZlsyLCA0XQ0KICApDQogICkNCg0Kcm93bmFtZXMoc2l6ZXNfbGRsbXZtZXRhKTwtIGMoIkludGVybWVkaWF0ZSIsICJNZWRpdW0iLCAiTGFyZ2UiKQ0KY29sbmFtZXMoc2l6ZXNfbGRsbXZtZXRhKTwtIGMoIk4iLCJBdmcgUGxlaW8iLCAiRXN0aW1hdGUiLCAiUHZhbChQbGVpbykiLCAiUHZhbChFc3QpIikNCmBgYA0KDQpgYGB7ciwgbGRsbXZtZXRhMiwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0Kc2l6ZXNfbGRsbXZtZXRhIDwtIGFzLmRhdGEuZnJhbWUoc2l6ZXNfbGRsbXZtZXRhKQ0KDQpzaXplc19sZGxtdm1ldGEgJT4lDQogIGthYmxlKCJodG1sIixlc2NhcGUgPSBGLCBjYXB0aW9uID0gIk11bHRpdmFyaWF0ZSBtZXRhLWFuYWx5c2lzIG9mIE1SLUVnZ2VyIGVzdGltYXRlcyBmb3IgTERMIHNpemVzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCg0KIyMgU2VsZWN0aW5nIGdlbmV0aWMgdmFyaWFudHMgdXNpbmcgUS1zdGF0aXN0aWNzIHsjc2VjdGlvbjV9DQoNCkFzIG1vc3Qgb2YgdGhlIHJlc3VsdHMgcHJlc2VudGVkIGhpdGhlcnRvIGhhdmUgbGFja2VkIHN0YXRpc3RpY2FsIHBvd2VyLCB3ZSB0aGVyZWZvcmUgc291Z2h0IHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgU05QcyB1c2VkIGFzIGluc3RydW1lbnRzLCB3aXRoIHRoZSBob3BlIG9mIGluY3JlYXNpbmcgcG93ZXIsIHRocm91Z2ggdGhlIHVzZSBvZiBRLXN0YXRpc3RpY3MuIFRoaXMgc2VjdGlvbiBwcmVzZW50cyByZXN1bHRzIHVzaW5nIGdlbm90eXBlcyBiYXNlZCBvbiB0aGVpciBjb250cmlidXRpb24gdG8gdGhlIFEtc3RhdGlzdGljIGluIHRoZSBJVlcgbW9kZWxzLg0KDQojIyMgSVZXIGVzdGltYXRlcw0KDQpUaGUgZXN0aW1hdGVzIGZyb20gdGhlIElWVyBtb2RlbCBhcmUgZ2l2ZW4gaW4gVGFibGVzIFxAcmVmKHRhYjpsZGxpdndRKSBhbmQgXEByZWYodGFiOmhkbGl2d1EpLg0KYGBge3J9DQpsZGxRX2l2dyA8LSBpdncobGRsc25wc19RWywyXSxsZGxzbnBzX1FbLDRdLGxkbHNucHNfUVssM10sbGRsc25wc19RWyw0XSkNCmxkbFFfaXZ3MSA8LSBpdncobGRsc25wc19RMVssMl0sbGRsc25wc19RMVssNF0sbGRsc25wc19RMVssM10sbGRsc25wc19RMVssNF0pDQpsZGxRX2l2dzIgPC0gaXZ3KGxkbHNucHNfUTJbLDJdLGxkbHNucHNfUTJbLDRdLGxkbHNucHNfUTJbLDNdLGxkbHNucHNfUTJbLDRdKQ0KbGRsUV9pdnczIDwtIGl2dyhsZGxzbnBzX1EzWywyXSxsZGxzbnBzX1EzWyw0XSxsZGxzbnBzX1EzWywzXSxsZGxzbnBzX1EzWyw0XSkNCmxkbFFfaXZ3NCA8LSBpdncobGRsc25wc19RNFssMl0sbGRsc25wc19RNFssNF0sbGRsc25wc19RNFssM10sbGRsc25wc19RNFssNF0pDQpsZGxRX2l2dzUgPC0gaXZ3KGxkbHNucHNfUTVbLDJdLGxkbHNucHNfUTVbLDRdLGxkbHNucHNfUTVbLDNdLGxkbHNucHNfUTVbLDRdKQ0KbGRsUV9pdnc2IDwtIGl2dyhsZGxzbnBzX1E2WywyXSxsZGxzbnBzX1E2Wyw0XSxsZGxzbnBzX1E2WywzXSxsZGxzbnBzX1E2Wyw0XSkNCmxkbFFfaXZ3NyA8LSBpdncobGRsc25wc19RN1ssMl0sbGRsc25wc19RN1ssNF0sbGRsc25wc19RN1ssM10sbGRsc25wc19RN1ssNF0pDQpsZGxRX2l2dzggPC0gaXZ3KGxkbHNucHNfUThbLDJdLGxkbHNucHNfUThbLDRdLGxkbHNucHNfUThbLDNdLGxkbHNucHNfUThbLDRdKQ0KbGRsUV9pdnc5IDwtIGl2dyhsZGxzbnBzX1E5WywyXSxsZGxzbnBzX1E5Wyw0XSxsZGxzbnBzX1E5WywzXSxsZGxzbnBzX1E5Wyw0XSkNCmxkbFFfaXZ3MTAgPC0gaXZ3KGxkbHNucHNfUTEwWywyXSxsZGxzbnBzX1ExMFssNF0sbGRsc25wc19RMTBbLDNdLGxkbHNucHNfUTEwWyw0XSkNCg0KbGRsaXZ3UTwtIHJiaW5kKGxkbFFfaXZ3LGxkbFFfaXZ3MSxsZGxRX2l2dzIsbGRsUV9pdnczLGxkbFFfaXZ3NCxsZGxRX2l2dzUsbGRsUV9pdnc2LGxkbFFfaXZ3NyxsZGxRX2l2dzgsbGRsUV9pdnc5LGxkbFFfaXZ3MTApDQpsZGxpdndRIDwtIGNiaW5kIChsaXBpZF90cmFpdHMsdW5uYW1lKGxkbGl2d1EpKQ0KY29sbmFtZXMobGRsaXZ3USkgPC0gYygiRXhwb3N1cmVzIiwiRXN0aW1hdGVzIiwgIlNFIiwiTEkiLCJVSSIsICJQdmFsIiwiU05QcyIpDQoNCiMjIEhETFMNCmhkbFFfaXZ3IDwtIGl2dyhoZGxzbnBzX1FbLDJdLGhkbHNucHNfUVssNF0saGRsc25wc19RWywzXSxoZGxzbnBzX1FbLDRdKQ0KaGRsUV9pdncxIDwtIGl2dyhoZGxzbnBzX1ExWywyXSxoZGxzbnBzX1ExWyw0XSxoZGxzbnBzX1ExWywzXSxoZGxzbnBzX1ExWyw0XSkNCmhkbFFfaXZ3MiA8LSBpdncoaGRsc25wc19RMlssMl0saGRsc25wc19RMlssNF0saGRsc25wc19RMlssM10saGRsc25wc19RMlssNF0pDQpoZGxRX2l2dzMgPC0gaXZ3KGhkbHNucHNfUTNbLDJdLGhkbHNucHNfUTNbLDRdLGhkbHNucHNfUTNbLDNdLGhkbHNucHNfUTNbLDRdKQ0KaGRsUV9pdnc0IDwtIGl2dyhoZGxzbnBzX1E0WywyXSxoZGxzbnBzX1E0Wyw0XSxoZGxzbnBzX1E0WywzXSxoZGxzbnBzX1E0Wyw0XSkNCmhkbFFfaXZ3NSA8LSBpdncoaGRsc25wc19RNVssMl0saGRsc25wc19RNVssNF0saGRsc25wc19RNVssM10saGRsc25wc19RNVssNF0pDQpoZGxRX2l2dzYgPC0gaXZ3KGhkbHNucHNfUTZbLDJdLGhkbHNucHNfUTZbLDRdLGhkbHNucHNfUTZbLDNdLGhkbHNucHNfUTZbLDRdKQ0KaGRsUV9pdnc3IDwtIGl2dyhoZGxzbnBzX1E3WywyXSxoZGxzbnBzX1E3Wyw0XSxoZGxzbnBzX1E3WywzXSxoZGxzbnBzX1E3Wyw0XSkNCmhkbFFfaXZ3OCA8LSBpdncoaGRsc25wc19ROFssMl0saGRsc25wc19ROFssNF0saGRsc25wc19ROFssM10saGRsc25wc19ROFssNF0pDQpoZGxRX2l2dzkgPC0gaXZ3KGhkbHNucHNfUTlbLDJdLGhkbHNucHNfUTlbLDRdLGhkbHNucHNfUTlbLDNdLGhkbHNucHNfUTlbLDRdKQ0KaGRsUV9pdncxMCA8LSBpdncoaGRsc25wc19RMTBbLDJdLGhkbHNucHNfUTEwWyw0XSxoZGxzbnBzX1ExMFssM10saGRsc25wc19RMTBbLDRdKQ0KaGRsUV9pdncxMSA8LSBpdncoaGRsc25wc19RMTFbLDJdLGhkbHNucHNfUTExWyw0XSxoZGxzbnBzX1ExMVssM10saGRsc25wc19RMTFbLDRdKQ0KaGRsUV9pdncxMiA8LSBpdncoaGRsc25wc19RMTJbLDJdLGhkbHNucHNfUTEyWyw0XSxoZGxzbnBzX1ExMlssM10saGRsc25wc19RMTJbLDRdKQ0KaGRsUV9pdncxMyA8LSBpdncoaGRsc25wc19RMTNbLDJdLGhkbHNucHNfUTEzWyw0XSxoZGxzbnBzX1ExM1ssM10saGRsc25wc19RMTNbLDRdKQ0KDQpoZGxpdndRPC0gcmJpbmQoaGRsUV9pdncsaGRsUV9pdncxLGhkbFFfaXZ3MixoZGxRX2l2dzMsaGRsUV9pdnc0LGhkbFFfaXZ3NSxoZGxRX2l2dzYsaGRsUV9pdnc3LGhkbFFfaXZ3OCxoZGxRX2l2dzksaGRsUV9pdncxMCxoZGxRX2l2dzExLGhkbFFfaXZ3MTIsaGRsUV9pdncxMykNCmhkbGl2d1EgPC0gY2JpbmQgKHRyYWl0cyx1bm5hbWUoaGRsaXZ3USkpDQpjb2xuYW1lcyhoZGxpdndRKSA8LSBjKCJFeHBvc3VyZXMiLCJFc3RpbWF0ZXMiLCAiU0UiLCJMSSIsIlVJIiwgIlB2YWwiLCJTTlBzIikNCmBgYA0KDQpNUiBlc3RpbWF0ZXMgaW4gVGFibGUgXEByZWYodGFiOmxkbGl2d1EpIHNob3cgcG9zaXRpdmUgcG9pbnQgZXN0aW1hdGVzIHdoaWNoIGFncmVlIHdpdGggb3VyIGV4cGVjdGF0aW9ucywgdGhlIGVzdGltYXRlcyBhbHNvIHNob3cgc2lnbmlmaWNhbmNlIChjb25maWRlbmNlIGludGVydmFscyBleGNsdWRlIG51bGwpLiBIb3dldmVyIGEgbWFqb3IgbGltaXRhdGlvbiBoZXJlIGlzIHRoYXQgdGhlIFNOUHMgdXNlZCBpbiB0aGUgbW9kZWxzIGFyZSB0aGUgc2FtZSBvciBsYXJnZWx5IG92ZXJsYXBwaW5nLCBtZWFuaW5nIHRoYXQgdGhlIE1SIGVzdGltYXRlcyBhcmUgdW5saWtlbHkgdG8gYmUgdmFsaWQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgZXN0aW1hdGVzIGZyb20gdGhlIGdlbm90eXBlLW91dGNvbWUgYXNzb2NpYXRpb24gYXJlIHRoZSBzYW1lIGluIGVhY2ggbW9kZWwgd2l0aCB0aGUgZ2Vub3R5cGUtZXhwb3N1cmUgYXNzb2NpYXRpb24gdmFyeWluZyBmb3IgZWFjaCBsaXBpZCB0cmFpdCBsZWFkaW5nIHRvIGEgc2ltcGxlIHNjYWxpbmcgb2YgdGhlIGdlbm90eXBlLW91dGNvbWUgYXNzb2NpYXRpb25zIGZvciBlYWNoIHRyYWl0LiBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gZGlzZW50YW5nbGUgd2hpY2ggdHJhaXQgaGFzIGEgdHJ1ZSBjYXVzYWwgZWZmZWN0IGFuZCB3aGljaCBpcyBjb25mb3VuZGVkIGJ5IHVzaW5nIHRoZSBzYW1lIFNOUHMuIFRoaXMgaXNzdWUgaGFzIGJlZW4gZGlzY3Vzc2VkIHByZXZpb3VzbHkgYnkgQGhvbG1lcy1ucmctMjAxNy4NCmBgYHtyIGxkbGl2d1EsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCmxkbGl2d1EgPC0gYXMuZGF0YS5mcmFtZShsZGxpdndRKQ0KDQpsZGxpdndRICU+JQ0KICBtdXRhdGUoU05QcyA9ICBpZmVsc2UgKA0KICBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigoU05QcykpKSA8IDMsDQogIGNlbGxfc3BlYyhTTlBzLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiZ3JleSIpLA0KICBjZWxsX3NwZWMoU05QcywgY29sb3IgPSAiYmxhY2siLCBiYWNrZ3JvdW5kID0gIndoaXRlIikNCiAgKSklPiUNCiAgbXV0YXRlKEVzdGltYXRlcyA9ICBpZmVsc2UgKA0KICBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSA8IDAuMDEsDQogIGNlbGxfc3BlYyhhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gImdyZXkiKSwNCiAgY2VsbF9zcGVjKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKEVzdGltYXRlcykpLCBjb2xvciA9ICJibGFjayIsIGJhY2tncm91bmQgPSAid2hpdGUiKQ0KICApKSU+JQ0KICBrYWJsZSgiaHRtbCIsZXNjYXBlID0gRiwgY2FwdGlvbiA9ICJJVlcgZXN0aW1hdGVzIGZvciBleHBvc3VyZXMgcmVsYXRlZCBMRExzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNClJlc3VsdHMgZnJvbSBUYWJsZSBcQHJlZih0YWI6aGRsaXZ3USkgc2hvdyBjYXVzYWwgZXN0aW1hdGVzIG9mIGxpcGlkIHRyYWl0cyByZWxhdGVkIHRvIEhETCB3aXRoIHRoZSBpbmNyZWFzZWQgbnVtYmVyIG9mIFNOUHMuIFRoZSBwb2ludCBlc3RpbWF0ZXMgYXJlIGdlbmVyYWxseSBudWxsIG9yIG5lZ2F0aXZlIHdpdGggc21hbGwgcC12YWx1ZXMuIFRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIHNob3cgYSBwb3NpdGl2ZSBjYXVzYWwgZWZmZWN0IG9uIGlzY2hlbWljIHN0cm9rZSB3aXRoIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZS4gV2Ugc2hvdyB0aGUgTVItRWdnZXIgbW9kZWwgZm9yIHRoaXMgZXN0aW1hdGUgYmVsb3cuIFByZWNpc2VseSB0aGUgc2FtZSBpc3N1ZSBhcyBub3RlZCBhYm92ZSBhcHBsaWVzIGluIHRoaXMgc2V0dGluZyB3aGVyZSBTTlBzIHVzZWQgaW4gdGhlIElWcyBvdmVybGFwIGJldHdlZW4gZXhwb3N1cmVzLCBtZWFuaW5nIHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLg0KDQpgYGB7ciBoZGxpdndRLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0V9DQpoZGxpdndRIDwtIGFzLmRhdGEuZnJhbWUoaGRsaXZ3USkNCg0KaGRsaXZ3USAlPiUNCiAgbXV0YXRlKFNOUHMgPSAgaWZlbHNlICgNCiAgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoKFNOUHMpKSkgPCAzLA0KICBjZWxsX3NwZWMoU05QcywgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gImdyZXkiKSwNCiAgY2VsbF9zcGVjKFNOUHMsIGNvbG9yID0gImJsYWNrIiwgYmFja2dyb3VuZCA9ICJ3aGl0ZSIpDQogICkpJT4lDQogIG11dGF0ZShFc3RpbWF0ZXMgPSAgaWZlbHNlICgNCiAgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGVzKSkgPiAwLjAxLA0KICBjZWxsX3NwZWMoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGVzKSksIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICJncmV5IiksDQogIGNlbGxfc3BlYyhhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSwgY29sb3IgPSAiYmxhY2siLCBiYWNrZ3JvdW5kID0gIndoaXRlIikNCiAgKSklPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiSVZXIGVzdGltYXRlcyBmb3IgZXhwb3N1cmVzIHJlbGF0ZWQgSERMcyIsIGRpZ2l0cyA9IDQpJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVFJVRSkNCmBgYA0KDQojIyMgTVItRWdnZXIgZXN0aW1hdGVzDQoNCmBgYHtyfQ0KbGRsUV9tcmVnZ2VyIDwtIG1yZWdnZXIobGRsc25wc19RWywyXSxsZGxzbnBzX1FbLDRdLGxkbHNucHNfUVssM10sbGRsc25wc19RWyw0XSkNCmxkbFFfbXJlZ2dlcjEgPC0gbXJlZ2dlcihsZGxzbnBzX1ExWywyXSxsZGxzbnBzX1ExWyw0XSxsZGxzbnBzX1ExWywzXSxsZGxzbnBzX1ExWyw0XSkNCmxkbFFfbXJlZ2dlcjIgPC0gbXJlZ2dlcihsZGxzbnBzX1EyWywyXSxsZGxzbnBzX1EyWyw0XSxsZGxzbnBzX1EyWywzXSxsZGxzbnBzX1EyWyw0XSkNCmxkbFFfbXJlZ2dlcjMgPC0gbXJlZ2dlcihsZGxzbnBzX1EzWywyXSxsZGxzbnBzX1EzWyw0XSxsZGxzbnBzX1EzWywzXSxsZGxzbnBzX1EzWyw0XSkNCmxkbFFfbXJlZ2dlcjQgPC0gbXJlZ2dlcihsZGxzbnBzX1E0WywyXSxsZGxzbnBzX1E0Wyw0XSxsZGxzbnBzX1E0WywzXSxsZGxzbnBzX1E0Wyw0XSkNCmxkbFFfbXJlZ2dlcjUgPC0gbXJlZ2dlcihsZGxzbnBzX1E1WywyXSxsZGxzbnBzX1E1Wyw0XSxsZGxzbnBzX1E1WywzXSxsZGxzbnBzX1E1Wyw0XSkNCmxkbFFfbXJlZ2dlcjYgPC0gbXJlZ2dlcihsZGxzbnBzX1E2WywyXSxsZGxzbnBzX1E2Wyw0XSxsZGxzbnBzX1E2WywzXSxsZGxzbnBzX1E2Wyw0XSkNCmxkbFFfbXJlZ2dlcjcgPC0gbXJlZ2dlcihsZGxzbnBzX1E3WywyXSxsZGxzbnBzX1E3Wyw0XSxsZGxzbnBzX1E3WywzXSxsZGxzbnBzX1E3Wyw0XSkNCmxkbFFfbXJlZ2dlcjggPC0gbXJlZ2dlcihsZGxzbnBzX1E4WywyXSxsZGxzbnBzX1E4Wyw0XSxsZGxzbnBzX1E4WywzXSxsZGxzbnBzX1E4Wyw0XSkNCmxkbFFfbXJlZ2dlcjkgPC0gbXJlZ2dlcihsZGxzbnBzX1E5WywyXSxsZGxzbnBzX1E5Wyw0XSxsZGxzbnBzX1E5WywzXSxsZGxzbnBzX1E5Wyw0XSkNCmxkbFFfbXJlZ2dlcjEwIDwtIG1yZWdnZXIobGRsc25wc19RMTBbLDJdLGxkbHNucHNfUTEwWyw0XSxsZGxzbnBzX1ExMFssM10sbGRsc25wc19RMTBbLDRdKQ0KDQpsZGxtcmVnZ2VyUTwtIHJiaW5kKGxkbFFfbXJlZ2dlcixsZGxRX21yZWdnZXIxLGxkbFFfbXJlZ2dlcjIsbGRsUV9tcmVnZ2VyMyxsZGxRX21yZWdnZXI0LGxkbFFfbXJlZ2dlcjUsbGRsUV9tcmVnZ2VyNixsZGxRX21yZWdnZXI3LGxkbFFfbXJlZ2dlcjgsbGRsUV9tcmVnZ2VyOSxsZGxRX21yZWdnZXIxMCkNCmNvbG5hbWVzKGxkbG1yZWdnZXJRKSA8LSBjKCJFc3RpbWF0ZSIsICJTRSIsIkxJIiwiVUkiLCAiUHZhbCIpDQoNCiMgSGRscw0KaGRsUV9tcmVnZ2VyIDwtIG1yZWdnZXIoaGRsc25wc19RWywyXSxoZGxzbnBzX1FbLDRdLGhkbHNucHNfUVssM10saGRsc25wc19RWyw0XSkNCmhkbFFfbXJlZ2dlcjEgPC0gbXJlZ2dlcihoZGxzbnBzX1ExWywyXSxoZGxzbnBzX1ExWyw0XSxoZGxzbnBzX1ExWywzXSxoZGxzbnBzX1ExWyw0XSkNCmhkbFFfbXJlZ2dlcjIgPC0gbXJlZ2dlcihoZGxzbnBzX1EyWywyXSxoZGxzbnBzX1EyWyw0XSxoZGxzbnBzX1EyWywzXSxoZGxzbnBzX1EyWyw0XSkNCmhkbFFfbXJlZ2dlcjMgPC0gbXJlZ2dlcihoZGxzbnBzX1EzWywyXSxoZGxzbnBzX1EzWyw0XSxoZGxzbnBzX1EzWywzXSxoZGxzbnBzX1EzWyw0XSkNCmhkbFFfbXJlZ2dlcjQgPC0gbXJlZ2dlcihoZGxzbnBzX1E0WywyXSxoZGxzbnBzX1E0Wyw0XSxoZGxzbnBzX1E0WywzXSxoZGxzbnBzX1E0Wyw0XSkNCmhkbFFfbXJlZ2dlcjUgPC0gbXJlZ2dlcihoZGxzbnBzX1E1WywyXSxoZGxzbnBzX1E1Wyw0XSxoZGxzbnBzX1E1WywzXSxoZGxzbnBzX1E1Wyw0XSkNCmhkbFFfbXJlZ2dlcjYgPC0gbXJlZ2dlcihoZGxzbnBzX1E2WywyXSxoZGxzbnBzX1E2Wyw0XSxoZGxzbnBzX1E2WywzXSxoZGxzbnBzX1E2Wyw0XSkNCmhkbFFfbXJlZ2dlcjcgPC0gbXJlZ2dlcihoZGxzbnBzX1E3WywyXSxoZGxzbnBzX1E3Wyw0XSxoZGxzbnBzX1E3WywzXSxoZGxzbnBzX1E3Wyw0XSkNCmhkbFFfbXJlZ2dlcjggPC0gbXJlZ2dlcihoZGxzbnBzX1E4WywyXSxoZGxzbnBzX1E4Wyw0XSxoZGxzbnBzX1E4WywzXSxoZGxzbnBzX1E4Wyw0XSkNCmhkbFFfbXJlZ2dlcjkgPC0gbXJlZ2dlcihoZGxzbnBzX1E5WywyXSxoZGxzbnBzX1E5Wyw0XSxoZGxzbnBzX1E5WywzXSxoZGxzbnBzX1E5Wyw0XSkNCmhkbFFfbXJlZ2dlcjEwIDwtIG1yZWdnZXIoaGRsc25wc19RMTBbLDJdLGhkbHNucHNfUTEwWyw0XSxoZGxzbnBzX1ExMFssM10saGRsc25wc19RMTBbLDRdKQ0KaGRsUV9tcmVnZ2VyMTEgPC0gbXJlZ2dlcihoZGxzbnBzX1ExMVssMl0saGRsc25wc19RMTFbLDRdLGhkbHNucHNfUTExWywzXSxoZGxzbnBzX1ExMVssNF0pDQpoZGxRX21yZWdnZXIxMiA8LSBtcmVnZ2VyKGhkbHNucHNfUTEyWywyXSxoZGxzbnBzX1ExMlssNF0saGRsc25wc19RMTJbLDNdLGhkbHNucHNfUTEyWyw0XSkNCmhkbFFfbXJlZ2dlcjEzIDwtIG1yZWdnZXIgKGhkbHNucHNfUTEzWywyXSxoZGxzbnBzX1ExM1ssNF0saGRsc25wc19RMTNbLDNdLGhkbHNucHNfUTEzWyw0XSkNCg0KaGRsbXJlZ2dlclE8LSByYmluZChoZGxRX21yZWdnZXIsaGRsUV9tcmVnZ2VyMSxoZGxRX21yZWdnZXIyLGhkbFFfbXJlZ2dlcjMsaGRsUV9tcmVnZ2VyNCxoZGxRX21yZWdnZXI1LGhkbFFfbXJlZ2dlcjYsaGRsUV9tcmVnZ2VyNyxoZGxRX21yZWdnZXI4LGhkbFFfbXJlZ2dlcjksaGRsUV9tcmVnZ2VyMTAsaGRsUV9tcmVnZ2VyMTEsaGRsUV9tcmVnZ2VyMTIsaGRsUV9tcmVnZ2VyMTMpDQpjb2xuYW1lcyhoZGxtcmVnZ2VyUSkgPC0gYygiRXN0aW1hdGUiLCAiU0UiLCJMSSIsIlVJIiwgIlB2YWwiKQ0KYGBgDQoNClRhYmxlIFxAcmVmKHRhYjpsZGxtcmVnZ2VycSkgc2hvd3MgcmVzdWx0cyBmcm9tIHRoZSBNUi1FZ2dlciBtb2RlbCBmb3IgdGhlIGxpcGlkIGZyYWN0aW9ucyByZWxhdGVkIHRvIExETHMuIFRoZSByZXN1bHRzIHNob3cgbm8gc3Ryb25nIGV2aWRlbmNlIGFnYWluc3Qgbm8gcGxlaW90cm9weSB3aXRoIHZhbHVlcyBmcm9tIHRoZSBgQXZnUGxlaW9gIGJlaW5nIGNsb3NlIHRvIHRoZSBudWxsIHdpdGggbGFyZ2UgcC12YWx1ZXMuDQoNCk5vdGUgdGhhdCBwcmVjaXNlbHkgdGhlIHNhbWUgaXNzdWUgYXMgbm90ZWQgYWJvdmUgYXBwbGllcyBpbiB0aGlzIHNldHRpbmcgd2hlcmUgU05QcyB1c2VkIGluIHRoZSBJVnMgb3ZlcmxhcCBiZXR3ZWVuIGV4cG9zdXJlcywgbWVhbmluZyB0aGF0IHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLg0KDQpgYGB7ciBsZGxtcmVnZ2VycSwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0Ka2FibGUobGRsbXJlZ2dlclEsIGNhcHRpb24gPSAiTVItRWdnZXIgZXN0aW1hdGVzIGZvciBMRExzIiwgZGlnaXRzID0gNCkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVCkgJT4lDQogIHBhY2tfcm93cygiRnJlZSBjaG9sZXN0ZXJvbCBpbiBJREwiLCAxLCAyKSAlPiUNCiAgcGFja19yb3dzKCJDb25jZW50cmF0aW9uIG9mIElETCBwYXJ0aWNsZXMiLCAzLCA0KSAlPiUNCiAgcGFja19yb3dzKCJQaG9zcGhvbGlwaWRzIGluIElETCIsIDUsIDYpICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgSURMIHBhcnRpY2xlcyIsIDcsIDgpICU+JQ0KICBwYWNrX3Jvd3MoIkZyZWUgY2hvbGVzdGVyb2wgaW4gbGFyZ2UgTERMIiwgOSwgMTApICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgbGFyZ2UgTERMIHBhcnRpY2xlcyIsIDExLCAxMikgJT4lDQogIHBhY2tfcm93cygiUGhvc3Bob2xpcGlkcyBpbiBsYXJnZSBMREwiLCAxMywgMTQpICU+JQ0KICBwYWNrX3Jvd3MoIkNob2xlc3Rlcm9sIGVzdGVycyBpbiBtZWRpdW0gTERMIiwgMTUsIDE2KSAlPiUNCiAgcGFja19yb3dzKCJDb25jZW50cmF0aW9uIG9mIG1lZGl1bSBMREwgcGFydGljbGVzIiwgMTcsIDE4KSAlPiUNCiAgcGFja19yb3dzKCJQaG9zcGhvbGlwaWRzIGluIG1lZGl1bSBMREwiLCAxOSwgMjApICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2Ygc21hbGwgTERMIHBhcnRpY2xlcyIsIDIxLCAyMikNCmBgYA0KDQpSZXN1bHRzIGZyb20gVGFibGUgXEByZWYodGFiOmhkbG1yZWdnZXJxKSBzaG93IHNvbWUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhdmVyYWdlIHBsZWlvdHJvcGljIGVzdGltYXRlcyBhbmQgbm9uLXNpZ25pZmljYW50IGVzdGltYXRlcywgaG93ZXZlciB0aGUgZXN0aW1hdGVzIGFyZSBjbG9zZSB0byB0aGUgbnVsbC4gVGhlIHBvaW50IGVzdGltYXRlIG9mIHRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIHNob3dzIGFuIGluY3JlYXNlIGNvbXBhcmVkIHRvIGl0cyBJVlcgZXN0aW1hdGUsIGFuZCB3ZSBub3RlIHRoYXQgYm90aCBhcmUgcG9zaXRpdmUuIFRoZXJlIHdhcyBubyBldmlkZW5jZSBhZ2FpbnN0IG5vIHBsZWlvdHJvcHkgZm9yIHRoaXMgZXN0aW1hdGUuIEZpZ3VyZSBcQHJlZihmaWc6dHJpcGxvdCkgc2hvd3MgdGhlIGFzc29jaWF0aW9uIG9mIHRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIGFuZCBpc2NoZW1pYyBzdHJva2UuIE5vdGUgdGhhdCBwcmVjaXNlbHkgdGhlIHNhbWUgaXNzdWUgYXMgbm90ZWQgYWJvdmUgYXBwbGllcyBpbiB0aGlzIHNldHRpbmcgd2hlcmUgU05QcyB1c2VkIGluIHRoZSBJVnMgb3ZlcmxhcCBiZXR3ZWVuIGV4cG9zdXJlcywgbWVhbmluZyB0aGF0IHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLiAgIA0KDQpgYGB7ciBoZGxtcmVnZ2VycSwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0Ka2FibGUoaGRsbXJlZ2dlclEsIGNhcHRpb24gPSAiTVItRWdnZXIgZXN0aW1hdGVzIGZvciBIRExzIiwgZGlnaXRzID0gNCkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gVCkgJT4lDQogIHBhY2tfcm93cygiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIGxhcmdlIEhETCIsIDEsIDIpICU+JQ0KICBwYWNrX3Jvd3MoIkNvbmNlbnRyYXRpb24gb2YgbGFyZ2UgSERMIHBhcnRpY2xlcyIsIDMsIDQpICU+JQ0KICBwYWNrX3Jvd3MoIlBob3NwaG9saXBpZHMgaW4gbGFyZ2UgSERMIiwgNSwgNikgJT4lDQogIHBhY2tfcm93cygiQ2hvbGVzdGVyb2wgZXN0ZXJzIGluIG1lZGl1bSBIREwiLCA3LCA4KSAlPiUNCiAgcGFja19yb3dzKCJGcmVlIGNob2xlc3Rlcm9sIGluIG1lZGl1bSBIREwiLCA5LCAxMCkgJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBtZWRpdW0gSERMIHBhcnRpY2xlcyIsIDExLCAxMikgJT4lDQogIHBhY2tfcm93cygiUGhvc3Bob2xpcGlkcyBpbiBtZWRpdW0gSERMIiwgMTMsIDE0KSAlPiUNCiAgcGFja19yb3dzKCJDb25jZW50cmF0aW9uIG9mIHNtYWxsIEhETCBwYXJ0aWNsZXMiLCAxNSwgMTYpICU+JQ0KICBwYWNrX3Jvd3MoIlRyaWdseWNlcmlkZXMgaW4gc21hbGwgSERMIiwgMTcsIDE4KSAlPiUNCiAgcGFja19yb3dzKCJDaG9sZXN0ZXJvbCBlc3RlcnMgaW4gdmVyeSBsYXJnZSBIREwiLCAxOSwgMjApICU+JQ0KICBwYWNrX3Jvd3MoIkZyZWUgY2hvbGVzdGVyb2wgaW4gdmVyeSBsYXJnZSBIREwiLCAyMSwgMjIpJT4lDQogIHBhY2tfcm93cygiQ29uY2VudHJhdGlvbiBvZiBzbWFsbCBIREwgcGFydGljbGVzIiwgMjMsIDI0KSAlPiUNCiAgcGFja19yb3dzKCJQaG9zcGhvbGlwaWRzIGluICB2ZXJ5IGxhcmdlIEhETCIsIDI1LCAyNikgJT4lDQogIHBhY2tfcm93cygiVHJpZ2x5Y2VyaWRlcyBpbiB2ZXJ5IGxhcmdlIEhETCIsIDI3LCAyOCkNCmBgYA0KDQoNCmBgYHtyIHRyaXBsb3QsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRSwgZmlnLmNhcD0iQXNzb2NpYXRpb24gb2YgdHJpZ2x5Y2VyaWRlcyBpbiBzbWFsbCBIRExzIGFuZCBpc2NoZW1pYyBzdHJva2UuIENhdXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgaW4gaW50ZXJwcmV0aW5nIHRoZXNlIGRhdGEgYXMgdGhlIFNOUHMgdXNlZCBhcmUgcGxlaW90cm9waWMuIiwgZmlnLmFsaWduPSJjZW50ZXIifQ0KdHJpZGF0PC0gZGF0YS5mcmFtZShpbnRlcmNlcHQgPSBjKDAsaGRsUV9tcmVnZ2VyOFsxLDFdKSwgc2xvcGUgPSBjKGhkbFFfaXZ3OFsxXSxoZGxRX21yZWdnZXI4WzIsMV0pLCBtb2RlbCA9IGMoIklWVyIsIk1SLUVnZ2VyIikpDQoNCmdncGxvdChkYXRhID0gaGRsc25wc19ROCwgYWVzKHhiZXRhLHliZXRhKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fYWJsaW5lKGRhdGEgPSB0cmlkYXQsIGFlcyhpbnRlcmNlcHQgPSBpbnRlcmNlcHQsIHNsb3BlID0gc2xvcGUsIGNvbG91cj1tb2RlbCkpICsgDQogIHhsYWIoZXhwcmVzc2lvbihiZXRhW3hdKSkgKyANCiAgeWxhYihleHByZXNzaW9uKGJldGFbeV0pKQ0KYGBgDQoNCiMjIyBNZXRhLWFuYWx5c2lzIG9mIGV4cG9zdXJlIHRyYWl0cw0KDQpTZWxlY3Rpb24gb2YgU05QcyB0aHJvdWdoIHRoZWlyIGluZGl2aWR1YWwgY29udHJpYnV0aW9uIHRvIHRoZSBRLXN0YXRpc3RpY3MgeWllbGRlZCBhIGxhcmdlIG51bWJlciBvZiBpbnN0cnVtZW50cyBhbmQgdGhlcmVmb3JlIHN0YXRpc3RpY2FsIHBvd2VyLiBBcyBiZWZvcmUsIHdlIHNvdWdodCB0byBjb21iaW5lIGNhdGVnb3JpZXMgb2YgdHJhaXRzIHRvIGluY3JlYXNlIHBvd2VyIGZ1cnRoZXIuDQoNClRoZSBtZXRhLWFuYWx5c2lzIGV4cG9zdXJlIHRyYWl0IGVzdGltYXRlcyBpbiBUYWJsZSBcQHJlZih0YWI6bWV0YVFsZGwpIGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB3aXRoIHRoZSBlc3RpbWF0ZSBmb3IgY2hvbGVzdGVyb2wgZXN0ZXJzIGJlaW5nIHRoZSBsYXJnZXN0IGluIG1hZ25pdHVkZS4gVGhlIHJlc3VsdHMgaW4gVGFibGUgXEByZWYodGFiOm1ldGFRaGRsKSBzaG93IHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGluIHRlcm1zIG9mIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSwgYXBhcnQgZnJvbSByaXNrIGNhdGVnb3JpZXMgb2YgdHJpZ2x5Y2VyaWRlcyByZWxhdGVkIHRvIEhETHMgd2hpY2ggc2hvdyBhIHBvc2l0aXZlIGVmZmVjdCBlc3RpbWF0ZSB3aXRoIGEgbGFyZ2UgcC12YWx1ZXMuDQoNCk5vdGUgdGhhdCBwcmVjaXNlbHkgdGhlIHNhbWUgaXNzdWUgYXMgbm90ZWQgYWJvdmUgYXBwbGllcyBpbiB0aGlzIHNldHRpbmcgd2hlcmUgU05QcyB1c2VkIGluIHRoZSBJVnMgb3ZlcmxhcCBiZXR3ZWVuIGV4cG9zdXJlcywgbWVhbmluZyB0aGF0IHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLg0KDQpgYGB7ciBtZXRhUWxkbCwgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0KIyBMREwNCmZyZWVRX2xkbCA8LSByYmluZChsZGxpdndRWzEsXSxsZGxpdndRWzUsXSkNCmZyZWVRX21ldGE8LSBtZXRhZ2VuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKEVzdGltYXRlcykpLGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFNFKSksIGRhdGEgPSBmcmVlUV9sZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJGcmVlIENob2xlc3Rlcm9sIikNCnJlc2ZyZWVRPC0gYyhmcmVlUV9tZXRhJGssZnJlZVFfbWV0YSRURS5yYW5kb20sZnJlZVFfbWV0YSRzZVRFLnJhbmRvbSxmcmVlUV9tZXRhJGxvd2VyLnJhbmRvbSxmcmVlUV9tZXRhJHVwcGVyLnJhbmRvbSxmcmVlUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQoNCmNvblFfbGRsIDwtIHJiaW5kKGxkbGl2d1FbMixdLGxkbGl2d1FbNixdLGxkbGl2d1FbOSxdLGxkbGl2d1FbMTEsXSkNCmNvblFfbWV0YTwtIG1ldGFnZW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGVzKSksYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoU0UpKSwgZGF0YSA9IGNvblFfbGRsLCBzdHVkbGFiID0gcGFzdGUoRXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ29uY2VudHJhdGlvbiIpDQpyZXNjb25RPC0gYyhjb25RX21ldGEkayxjb25RX21ldGEkVEUucmFuZG9tLGNvblFfbWV0YSRzZVRFLnJhbmRvbSxjb25RX21ldGEkbG93ZXIucmFuZG9tLGNvblFfbWV0YSR1cHBlci5yYW5kb20sY29uUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQoNCnBob1FfbGRsIDwtIHJiaW5kKGxkbGl2d1FbMyxdLGxkbGl2d1FbNyxdLGxkbGl2d1FbMTAsXSkNCnBob1FfbWV0YTwtIG1ldGFnZW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoRXN0aW1hdGVzKSksYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoU0UpKSwgZGF0YSA9IHBob1FfbGRsLCBzdHVkbGFiID0gcGFzdGUoRXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiUGhvc3Bob2xpcGlkcyIpDQpyZXNwaG9RPC0gYyhwaG9RX21ldGEkayxwaG9RX21ldGEkVEUucmFuZG9tLHBob1FfbWV0YSRzZVRFLnJhbmRvbSxwaG9RX21ldGEkbG93ZXIucmFuZG9tLHBob1FfbWV0YSR1cHBlci5yYW5kb20scGhvUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQpjaG9sUV9sZGwgPC0gcmJpbmQobGRsaXZ3UVs0LF0sbGRsaXZ3UVs4LF0pDQpjaG9sUV9tZXRhPC0gbWV0YWdlbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSxhcy5udW1lcmljKGFzLmNoYXJhY3RlcihTRSkpLCBkYXRhID0gY2hvbFFfbGRsLCBzdHVkbGFiID0gcGFzdGUoRXhwb3N1cmVzKSwgY29tYi5maXhlZCA9IEZBTFNFLCBjb21iLnJhbmRvbSA9IFRSVUUsaGFrbiA9IEZBTFNFLHByZWRpY3Rpb249VFJVRSxzbT0iU01EIiwgbWV0aG9kLnRhdSA9ICJSRU1MIiwgdGl0bGUgPSAiQ2hvbGVzdGVyb2wgZXN0ZXJzIikNCnJlc2Nob2xRPC0gYyhjaG9sUV9tZXRhJGssY2hvbFFfbWV0YSRURS5yYW5kb20sY2hvbFFfbWV0YSRzZVRFLnJhbmRvbSxjaG9sUV9tZXRhJGxvd2VyLnJhbmRvbSxjaG9sUV9tZXRhJHVwcGVyLnJhbmRvbSxjaG9sUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQptZXRhUV9sZGwgPC0gcmJpbmQocmVzZnJlZVEscmVzY29uUSxyZXNwaG9RLHJlc2Nob2xRKQ0KY29sbmFtZXMobWV0YVFfbGRsKSA8LSBjKCJOIiwiRXN0aW1hdGUiLCAiU0UiLCJMSSIsIlVJIiwiUHZhbCIpDQpyb3duYW1lcyhtZXRhUV9sZGwpIDwtIGMoIkZyZWUgQ2hvbGVzdGVyb2wiLCJDb25jZW50cmF0aW9uIiwiUGhvc3Bob2xpcGlkcyIsIkNob2xlc3Rlcm9sIGVzdGVycyIpDQoNCm1ldGFRX2xkbCA8LSBhcy5kYXRhLmZyYW1lKG1ldGFRX2xkbCkNCg0Ka2FibGUobWV0YVFfbGRsLCBjYXB0aW9uID0gIk1ldGEtYW5hbHlzaXMgb2YgcmlzayBmYWN0b3JzIGZvciBMRExzIHVzaW5nIElWVyBlc3RpbWF0ZXMiLCBkaWdpdHMgPSA0KSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFQpDQpgYGANCg0KYGBge3IgbWV0YVFoZGwsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCmNob2xRX2hkbDwtIHJiaW5kKGhkbGl2d1FbMSxdLGhkbGl2d1FbNCxdLGhkbGl2d1FbMTAsXSkNCmNob2xRX21ldGE8LSBtZXRhZ2VuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKEVzdGltYXRlcykpLGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFNFKSksIGRhdGEgPSBjaG9sUV9oZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJDaG9sZXN0ZXJvbCBlc3RlcnMiKQ0KcmVzY2hvbFE8LSBjKGNob2xRX21ldGEkayxjaG9sUV9tZXRhJFRFLnJhbmRvbSxjaG9sUV9tZXRhJHNlVEUucmFuZG9tLGNob2xRX21ldGEkbG93ZXIucmFuZG9tLGNob2xRX21ldGEkdXBwZXIucmFuZG9tLGNob2xRX21ldGEkcHZhbC5yYW5kb20pDQoNCmNvblFfaGRsPC0gcmJpbmQoaGRsaXZ3UVsyLF0saGRsaXZ3UVs2LF0saGRsaXZ3UVs4LF0saGRsaXZ3UVsxMixdKQ0KY29uUV9tZXRhPC0gbWV0YWdlbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSxhcy5udW1lcmljKGFzLmNoYXJhY3RlcihTRSkpLCBkYXRhID0gY29uUV9oZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJDb25jZW50cmF0aW9uIikNCnJlc2NvblE8LSBjKGNvblFfbWV0YSRrLGNvblFfbWV0YSRURS5yYW5kb20sY29uUV9tZXRhJHNlVEUucmFuZG9tLGNvblFfbWV0YSRsb3dlci5yYW5kb20sY29uUV9tZXRhJHVwcGVyLnJhbmRvbSxjb25RX21ldGEkcHZhbC5yYW5kb20pDQoNCnBob1FfaGRsPC0gcmJpbmQoaGRsaXZ3UVszLF0saGRsaXZ3UVs3LF0saGRsaXZ3UVsxMSxdKQ0KcGhvUV9tZXRhPC0gbWV0YWdlbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihFc3RpbWF0ZXMpKSxhcy5udW1lcmljKGFzLmNoYXJhY3RlcihTRSkpLCBkYXRhID0gcGhvUV9oZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJQaG9zcGhvbGlwaWRzIikNCnJlc3Bob1E8LSBjKHBob1FfbWV0YSRrLHBob1FfbWV0YSRURS5yYW5kb20scGhvUV9tZXRhJHNlVEUucmFuZG9tLHBob1FfbWV0YSRsb3dlci5yYW5kb20scGhvUV9tZXRhJHVwcGVyLnJhbmRvbSxwaG9RX21ldGEkcHZhbC5yYW5kb20pDQoNCnRyaWdRX2hkbDwtIHJiaW5kKGhkbGl2d1FbOSxdLGhkbGl2d1FbMTQsXSkNCnRyaWdRX21ldGE8LSBtZXRhZ2VuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKEVzdGltYXRlcykpLGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKFNFKSksIGRhdGEgPSB0cmlnUV9oZGwsIHN0dWRsYWIgPSBwYXN0ZShFeHBvc3VyZXMpLCBjb21iLmZpeGVkID0gRkFMU0UsIGNvbWIucmFuZG9tID0gVFJVRSxoYWtuID0gRkFMU0UscHJlZGljdGlvbj1UUlVFLHNtPSJTTUQiLCBtZXRob2QudGF1ID0gIlJFTUwiLCB0aXRsZSA9ICJUcmlnbHljZXJpZGVzIikNCnJlc3RyaWdRPC0gYyh0cmlnUV9tZXRhJGssdHJpZ1FfbWV0YSRURS5yYW5kb20sdHJpZ1FfbWV0YSRzZVRFLnJhbmRvbSx0cmlnUV9tZXRhJGxvd2VyLnJhbmRvbSx0cmlnUV9tZXRhJHVwcGVyLnJhbmRvbSx0cmlnUV9tZXRhJHB2YWwucmFuZG9tKQ0KDQptZXRhUV9oZGw8LSByYmluZChyZXNjaG9sUSxyZXNjb25RLHJlc3Bob1EscmVzdHJpZ1EpDQpjb2xuYW1lcyhtZXRhUV9oZGwpIDwtIGMoIk4iLCJFc3RpbWF0ZSIsICJTRSIsIkxJIiwiVUkiLCJQdmFsIikNCnJvd25hbWVzKG1ldGFRX2hkbCkgPC0gYygiQ2hvbGVzdGVyb2wgZXN0ZXJzIiwiQ29uY2VudHJhdGlvbiIsIlBob3NwaG9saXBpZHMiLCJUcmlnbHljZXJpZGVzIikNCg0Ka2FibGUobWV0YVFfaGRsLCBjYXB0aW9uID0gIk1ldGEtYW5hbHlzaXMgb2YgcmlzayBmYWN0b3JzIGZvciBIRExzIHVzaW5nIElWVyBlc3RpbWF0ZXMiLCBkaWdpdHMgPSA0KSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFQpDQpgYGANCg0KDQojIyMgTXVsdGl2YXJpYXRlIE1ldGEtYW5hbHlzaXMgb2YgTVItRWdnZXIgZXN0aW1hdGVzDQoNCmBgYHtyfQ0KIyMjIyAgRnJlZSBDaG9sZXN0ZXJvbA0KYmV0YVFsZGwxPC0gbWF0cml4KG5yb3cgPSAyLCBuY29sID0gMiwgTkEpDQoNCmJldGFRbGRsMVsxLF0gPC0gYyhsZGxtcmVnZ2VyUVsxLDFdLGxkbG1yZWdnZXJRWzIsMV0pDQpiZXRhUWxkbDFbMixdIDwtIGMobGRsbXJlZ2dlclFbOSwxXSxsZGxtcmVnZ2VyUVsxMCwxXSkNCg0KbGRsMVFjb3Y8LSBtYXRyaXgoYygobGRsbXJlZ2dlclFbMSwyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzIsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGwyUWNvdjwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVs5LDJdKV4yLDAsMCwobGRsbXJlZ2dlclFbMTAsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQoNCnNtYXRRbGlzdDE8LSBsaXN0KGxkbDFjb3YsIGxkbDJjb3YpDQpsZGwxbXZtZXRhUTwtIG12bWV0YShiZXRhUWxkbDEsIHNtYXRRbGlzdDEpDQoNCiMjIyMgQ29uY2VudHJhdGlvbg0KYmV0YVFsZGwzPC0gbWF0cml4KG5yb3cgPSA0LCBuY29sID0gMiwgTkEpDQoNCmJldGFRbGRsM1sxLF0gPC0gYyhsZGxtcmVnZ2VyUVszLDFdLGxkbG1yZWdnZXJRWzQsMV0pDQpiZXRhUWxkbDNbMixdIDwtIGMobGRsbXJlZ2dlclFbMTEsMV0sbGRsbXJlZ2dlclFbMTIsMV0pDQpiZXRhUWxkbDNbMyxdIDwtIGMobGRsbXJlZ2dlclFbMTcsMV0sbGRsbXJlZ2dlclFbMTgsMV0pDQpiZXRhUWxkbDNbNCxdIDwtIGMobGRsbXJlZ2dlclFbMjEsMV0sbGRsbXJlZ2dlclFbMjIsMV0pDQoNCmxkbFF2Y29vdlE8LSBtYXRyaXgoYygobGRsbXJlZ2dlclFbMywyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzQsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGxRdmNvb3ZRMTwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVsxMSwyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzEyLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KbGRsUXZjb292UTI8LSBtYXRyaXgoYygobGRsbXJlZ2dlclFbMTcsMl0pXjIsMCwwLChsZGxtcmVnZ2VyUVsxOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbFF2Y29vdlEzPC0gbWF0cml4KGMoKGxkbG1yZWdnZXJRWzIxLDJdKV4yLDAsMCwobGRsbXJlZ2dlclFbMjIsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQoNCnNtYXRRbGlzdDM8LSBsaXN0KGxkbFF2Y29vdlEsIGxkbFF2Y29vdlExLCBsZGxRdmNvb3ZRMiwgbGRsUXZjb292UTMpDQpsZGwzbXZtZXRhUTwtIG12bWV0YShiZXRhUWxkbDMsIHNtYXRRbGlzdDMpDQoNCiMjIyMgcGhvc3Bob2xpcGlkcw0KYmV0YVFsZGw0PC0gbWF0cml4KG5yb3cgPSAzLCBuY29sID0gMiwgTkEpDQoNCmJldGFRbGRsNFsxLF0gPC0gYyhsZGxtcmVnZ2VyUVs1LDFdLGxkbG1yZWdnZXJRWzYsMV0pDQpiZXRhUWxkbDRbMixdIDwtIGMobGRsbXJlZ2dlclFbMTMsMV0sbGRsbXJlZ2dlclFbMTQsMV0pDQpiZXRhUWxkbDRbMyxdIDwtIGMobGRsbXJlZ2dlclFbMTksMV0sbGRsbXJlZ2dlclFbMjAsMV0pDQoNCmxkbDFjb292UTwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVs1LDJdKV4yLDAsMCwobGRsbXJlZ2dlclFbNiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmxkbDJjb292UTwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVsxMywyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzE0LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KbGRsM2Nvb3ZRPC0gbWF0cml4KGMoKGxkbG1yZWdnZXJRWzE5LDJdKV4yLDAsMCwobGRsbXJlZ2dlclFbMjAsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQoNCnNtYXRRbGlzdDQ8LSBsaXN0KGxkbDFjb292USwgbGRsMmNvb3ZRLCBsZGwzY29vdlEpDQpsZGw0bXZtZXRhUTwtIG12bWV0YShiZXRhUWxkbDQsIHNtYXRRbGlzdDQpDQoNCiMjIyMgQ2hvbGVzdGVyb2wgZXN0ZXJzDQpiZXRhUWxkbDU8LSBtYXRyaXgobnJvdyA9IDIsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YVFsZGw1WzEsXSA8LSBjKGxkbG1yZWdnZXJRWzcsMV0sbGRsbXJlZ2dlclFbOCwxXSkNCmJldGFRbGRsNVsyLF0gPC0gYyhsZGxtcmVnZ2VyUVsxNSwxXSxsZGxtcmVnZ2VyUVsxNiwxXSkNCg0KbGRkbDFjb3Y8LSBtYXRyaXgoYygobGRsbXJlZ2dlclFbNywyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzgsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpsZGRsMmNvdjwtIG1hdHJpeChjKChsZGxtcmVnZ2VyUVsxNSwyXSleMiwwLDAsKGxkbG1yZWdnZXJRWzE2LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpzbWF0UWxpc3Q1PC0gbGlzdChsZGRsMWNvdiwgbGRkbDJjb3YpDQpsZGw1bXZtZXRhUTwtIG12bWV0YShiZXRhUWxkbDUsIHNtYXRRbGlzdDUpDQoNCiMjIyMgY29sbGF0ZSByZXN1bHRzDQp0cmFpdHNfbGRsbXZtZXRhUSA8LQ0KICByYmluZCgNCiAgYyhsZGxtZXRhbjIkayx1bm5hbWUobGRsMW12bWV0YVEkY29lZmZpY2llbnRzKSxzdW1tYXJ5KGxkbDFtdm1ldGFRKSRjb2VmWzEsIDRdLHN1bW1hcnkobGRsMW12bWV0YVEpJGNvZWZbMiwgNF0pLA0KICBjKGxkbG1ldGFuMyRrLHVubmFtZShsZGwzbXZtZXRhUSRjb2VmZmljaWVudHMpLHN1bW1hcnkobGRsM212bWV0YVEpJGNvZWZbMSwgNF0sc3VtbWFyeShsZGwzbXZtZXRhUSkkY29lZlsyLCA0XSksDQogIGMobGRsbWV0YW40JGssdW5uYW1lKGxkbDRtdm1ldGFRJGNvZWZmaWNpZW50cyksc3VtbWFyeShsZGw0bXZtZXRhUSkkY29lZlsxLCA0XSxzdW1tYXJ5KGxkbDRtdm1ldGFRKSRjb2VmWzIsIDRdKSwNCiAgYyhsZGxtZXRhbjUkayx1bm5hbWUobGRsNW12bWV0YVEkY29lZmZpY2llbnRzKSxzdW1tYXJ5KGxkbDVtdm1ldGFRKSRjb2VmWzEsIDRdLHN1bW1hcnkobGRsNW12bWV0YVEpJGNvZWZbMiwgNF0pDQogICkNCnJvd25hbWVzKHRyYWl0c19sZGxtdm1ldGFRKTwtIGMoIkZyZWUgQ2hvbGVzdGVyb2wiLCJDb25jZW50cmF0aW9uIiwiUGhvc3Bob2xpcGlkcyIsIkNob2xlc3Rlcm9sIGVzdGVycyIpDQpjb2xuYW1lcyh0cmFpdHNfbGRsbXZtZXRhUSk8LSBjKCJOIiwiQVZnIFBsZWlvIiwgIlNsb3BlIiwgIlB2YWwoUGxlaW8pIiwgIlB2YWwoRXN0KSIpDQpgYGANCg0KV2UgZXhwbG9yZSB0aGUgcmVzdWx0cyBmcm9tIHRoZSBNUi1FZ2dlciBtb2RlbCB1c2luZyBtdWx0aXZhcmlhdGUgbWV0YS1hbmFseXNpcywgdGhlIGFuYWx5c2lzIGlzIHBlcmZvcm1lZCBvbiB0aGUgcmlzayBmYWN0b3IgY2F0ZWdvcmllcyBmb3IgTERMcyAoVGFibGUgXEByZWYodGFiOmxkbG12bWV0YVEpKSBhbmQgSERMcyAoVGFibGUgXEByZWYodGFiOmhkbG12bWV0YVEpKS4gUmVzdWx0cyBmcm9tIFRhYmxlIFxAcmVmKHRhYjpsZGxtdm1ldGFRKSBzaG93IG5vIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW50ZXJjZXB0IGVzdGltYXRlcyBleGNlcHQgZm9yIHRoZSBwaG9zcGhvbGlwaWRzIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMuIFRoZSBzbG9wZSBmb3IgdGhlIGNob2xlc3Rlcm9sIGVzdGVycyBhbmQgY29uY2VudHJhdGlvbiBncm91cHMgc2hvdyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UuIA0KDQpGcm9tIFRhYmxlIFxAcmVmKHRhYjpoZGxtdm1ldGFRKSwgdGhlIHJpc2sgZmFjdG9yIGdyb3VwIG9mIHRyaWdseWNlcmlkZXMgaW4gSERMcyBzaG93IGVzdGltYXRlcyBvZiB0aGUgaW50ZXJjZXB0IGFuZCBzbG9wZSBvZiBubyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UuIFRoZSBvdGhlciByaXNrIGZhY3RvciBncm91cHMgaGF2ZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGludGVyY2VwdCBlc3RpbWF0ZXMgYW5kIG5vbiBzaWduaWZpY2FudCBzbG9wZXMuDQoNCldlIG5vdGUgdGhhdCB0aGUgc2FtZSBTTlBzIGhhdmUgYmVlbiB1c2VkIG11bHRpcGxlIHRpbWVzIGZvciBlYWNoIGV4cG9zdXJlcywgYW5kIHRoZW4gZml0dGVkIGluIGEgbXVsdGl2YXJpYXRlIG1ldGEtYW5hbHlzaXMgbW9kZWwuIFRvIG91ciBtaW5kcyB0aGUgbXVsdGl2YXJpYXRlIG1ldGEtYW5hbHlzaXMgb2YgdGhlc2UgTVItRWdnZXIgZXN0aW1hdGVzIGNhbm5vdCB5aWVsZCB2YWxpZCBjYXVzYWwgZXN0aW1hdGVzIGdpdmVuIHRoYXQgaW4gZWZmZWN0IHRoZSBzYW1lIFNOUHMgYXJlIHVzZWQgdG8gaW5zdHJ1bWVudCBkaWZmZXJlbnQgZXhwb3N1cmVzLg0KDQpgYGB7ciBsZGxtdm1ldGFRLCBpbmNsdWRlPVRSVUUsZWNobyA9RkFMU0V9DQp0cmFpdHNfbGRsbXZtZXRhUSA8LSBhcy5kYXRhLmZyYW1lKHRyYWl0c19sZGxtdm1ldGFRKQ0KDQp0cmFpdHNfbGRsbXZtZXRhUSAlPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiUmVzdWx0cyBmcm9tIE11bHRpdmFyaWF0ZSBNZXRhLWFuYWx5c2lzIExETCByaXNrIGZhY3RvciBjYXRlZ29yaWVzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KIyMgQ2hvbGVzdGVyb2wgZXN0ZXJzDQpiZXRhUWhkbDE8LSBtYXRyaXgobnJvdyA9IDMsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YVFoZGwxWzEsXSA8LSBjKGhkbG1yZWdnZXJRWzEsMV0saGRsbXJlZ2dlclFbMiwxXSkNCmJldGFRaGRsMVsyLF0gPC0gYyhoZGxtcmVnZ2VyUVs3LDFdLGhkbG1yZWdnZXJRWzgsMV0pDQpiZXRhUWhkbDFbMyxdIDwtIGMoaGRsbXJlZ2dlclFbMTksMV0saGRsbXJlZ2dlclFbMjAsMV0pDQoNCnNoZGwxUWNvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVsxLDJdKV4yLDAsMCwoaGRsbXJlZ2dlclFbMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCnNoZGwyUWNvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVs3LDJdKV4yLDAsMCwoaGRsbXJlZ2dlclFbOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCnNoZGwzUWNvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVsxOSwyXSleMiwwLDAsKGhkbG1yZWdnZXJRWzIwLDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQoNCmhzbWF0UWxpc3QxPC0gbGlzdChzaGRsMVFjb3YsIHNoZGwyUWNvdiwgc2hkbDNRY292KQ0KaGRsMW12bWV0YVE8LSBtdm1ldGEoYmV0YVFoZGwxLCBoc21hdFFsaXN0MSkNCg0KIyMgY29uY2VudHJhdGlvbg0KYmV0YVFoZGwyPC0gbWF0cml4KG5yb3cgPSA0LCBuY29sID0gMiwgTkEpDQoNCmJldGFRaGRsMlsxLF0gPC0gYyhoZGxtcmVnZ2VyUVszLDFdLGhkbG1yZWdnZXJRWzQsMV0pDQpiZXRhUWhkbDJbMixdIDwtIGMoaGRsbXJlZ2dlclFbMTEsMV0saGRsbXJlZ2dlclFbMTIsMV0pDQpiZXRhUWhkbDJbMyxdIDwtIGMoaGRsbXJlZ2dlclFbMTUsMV0saGRsbXJlZ2dlclFbMTYsMV0pDQpiZXRhUWhkbDJbNCxdIDwtIGMoaGRsbXJlZ2dlclFbMjMsMV0saGRsbXJlZ2dlclFbMjQsMV0pDQoNCmhkbDFRY292PC0gbWF0cml4KGMoKGhkbG1yZWdnZXJRWzMsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVs0LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KaGRsMlFjb3Y8LSBtYXRyaXgoYygoaGRsbXJlZ2dlclFbMTEsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVsxMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmhkbDNRY292PC0gbWF0cml4KGMoKGhkbG1yZWdnZXJRWzE1LDJdKV4yLDAsMCwoaGRsbXJlZ2dlclFbMTYsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpoZGw0UWNvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVsyMywyXSleMiwwLDAsKGhkbG1yZWdnZXJRWzI0LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpoc21hdFFsaXN0MjwtIGxpc3QoaGRsMVFjb3YsIGhkbDJRY292LCBoZGwzUWNvdiwgaGRsNFFjb3YpDQpoZGwybXZtZXRhUTwtIG12bWV0YShiZXRhUWhkbDIsIGhzbWF0UWxpc3QyKQ0KDQojIyBwaG9zcGhvbGlwaWRzDQpiZXRhUWhkbDM8LSBtYXRyaXgobnJvdyA9IDMsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YVFoZGwzWzEsXSA8LSBjKGhkbG1yZWdnZXJRWzUsMV0saGRsbXJlZ2dlclFbNiwxXSkNCmJldGFRaGRsM1syLF0gPC0gYyhoZGxtcmVnZ2VyUVsxMywxXSxoZGxtcmVnZ2VyUVsxNCwxXSkNCmJldGFRaGRsM1szLF0gPC0gYyhoZGxtcmVnZ2VyUVsyMSwxXSxoZGxtcmVnZ2VyUVsyMiwxXSkNCg0KaGRsMVFjb3Z2PC0gbWF0cml4KGMoKGhkbG1yZWdnZXJRWzUsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVs2LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KaGRsMlFjb3Z2PC0gbWF0cml4KGMoKGhkbG1yZWdnZXJRWzEyLDJdKV4yLDAsMCwoaGRsbXJlZ2dlclFbMTQsMl0pXjIpLCBieXJvdyA9IFQsbmNvbCA9IDIpDQpoZGwzUWNvdnY8LSBtYXRyaXgoYygoaGRsbXJlZ2dlclFbMjEsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVsyMiwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCg0KaHNtYXRRbGlzdDM8LSBsaXN0KGhkbDFRY292diwgaGRsMlFjb3Z2LCBoZGwzUWNvdnYpDQpoZGwzbXZtZXRhUTwtIG12bWV0YShiZXRhUWhkbDMsIGhzbWF0UWxpc3QzKQ0KDQojIyB0cmlnbHljZXJpZGVzDQpiZXRhUWhkbDQ8LSBtYXRyaXgobnJvdyA9IDIsIG5jb2wgPSAyLCBOQSkNCg0KYmV0YVFoZGw0WzEsXSA8LSBjKGhkbG1yZWdnZXJRWzE3LDFdLGhkbG1yZWdnZXJRWzE4LDFdKQ0KYmV0YVFoZGw0WzIsXSA8LSBjKGhkbG1yZWdnZXJRWzI3LDFdLGhkbG1yZWdnZXJRWzI4LDFdKQ0KDQpoZGwxUWNjb3Y8LSBtYXRyaXgoYygoaGRsbXJlZ2dlclFbMTcsMl0pXjIsMCwwLChoZGxtcmVnZ2VyUVsxOCwyXSleMiksIGJ5cm93ID0gVCxuY29sID0gMikNCmhkbDJRY2NvdjwtIG1hdHJpeChjKChoZGxtcmVnZ2VyUVsyNywyXSleMiwwLDAsKGhkbG1yZWdnZXJRWzI4LDJdKV4yKSwgYnlyb3cgPSBULG5jb2wgPSAyKQ0KDQpoc21hdFFsaXN0NDwtIGxpc3QoaGRsMVFjY292LCBoZGwyUWNjb3YpDQpoZGw0bXZtZXRhUTwtIG12bWV0YShiZXRhUWhkbDQsIGhzbWF0UWxpc3Q0KQ0KDQp0cmFpdHNfaGRsbXZtZXRhUSA8LSByYmluZCggcmJpbmQoDQogIGModW5uYW1lKGhkbDFtdm1ldGFRJGNvZWZmaWNpZW50cyksc3VtbWFyeShoZGwxbXZtZXRhUSkkY29lZlsxLCA0XSxzdW1tYXJ5KGhkbDFtdm1ldGFRKSRjb2VmWzIsIDRdKSwNCiAgYyh1bm5hbWUoaGRsMm12bWV0YVEkY29lZmZpY2llbnRzKSxzdW1tYXJ5KGhkbDJtdm1ldGFRKSRjb2VmWzEsIDRdLHN1bW1hcnkoaGRsMm12bWV0YVEpJGNvZWZbMiwgNF0pLA0KICBjKHVubmFtZShoZGwzbXZtZXRhUSRjb2VmZmljaWVudHMpLHN1bW1hcnkoaGRsM212bWV0YVEpJGNvZWZbMSwgNF0sc3VtbWFyeShoZGwzbXZtZXRhUSkkY29lZlsyLCA0XSksDQogIGModW5uYW1lKGhkbDRtdm1ldGFRJGNvZWZmaWNpZW50cyksc3VtbWFyeShoZGw0bXZtZXRhUSkkY29lZlsxLCA0XSxzdW1tYXJ5KGhkbDRtdm1ldGFRKSRjb2VmWzIsIDRdKQ0KICApKQ0KDQpzdHVkeTwtIGMoMyw0LDMsMikNCg0KdHJhaXRzX2hkbG12bWV0YVE8LSBjYmluZChzdHVkeSx0cmFpdHNfaGRsbXZtZXRhUSkNCnJvd25hbWVzKHRyYWl0c19oZGxtdm1ldGFRKTwtIGMoIkNob2xlc3Rlcm9sIGVzdGVycyIsIkNvbmNlbnRyYXRpb24iLCJQaG9zcGhvbGlwaWRzIiwiVHJpZ2x5Y2VyaWRlcyIpDQpjb2xuYW1lcyh0cmFpdHNfaGRsbXZtZXRhUSk8LSBjKCJOIiwiQVZnIFBsZWlvIiwgIlNsb3BlIiwgIlB2YWwoUGxlaW8pIiwgIlB2YWwoRXN0KSIpDQpgYGANCg0KDQpgYGB7ciBoZGxtdm1ldGFRLCBpbmNsdWRlPVRSVUUsZWNobyA9RkFMU0V9DQp0cmFpdHNfaGRsbXZtZXRhUSA8LSBhcy5kYXRhLmZyYW1lKHRyYWl0c19oZGxtdm1ldGFRKQ0KDQp0cmFpdHNfaGRsbXZtZXRhUSAlPiUNCiAga2FibGUoImh0bWwiLGVzY2FwZSA9IEYsIGNhcHRpb24gPSAiUmVzdWx0cyBmcm9tIE11bHRpdmFyaWF0ZSBNZXRhLWFuYWx5c2lzIEhETCByaXNrIGZhY3RvciBjYXRlZ29yaWVzIiwgZGlnaXRzID0gNCklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCiMjIE1WTVIgb2YgQ29uY2VudHJhdGlvbg0KDQpXZSB3ZXJlIGFkZGl0aW9uYWxseSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgbXV0dWFsbHkgYWRqdXN0aW5nIGZvciBsaXBpZCB0cmFpdHMgaW4gb3VyIElWVyBtb2RlbHMgd291bGQgYWZmZWN0IG91ciBjYXVzYWwgZWZmZWN0cy4gV2UgdGhlcmVmb3JlIGZpdHRlZCBNVk1SIG1vZGVscyBhcyBzaG93biBpbiBGaWd1cmUgXEByZWYoZmlnOm12ZGFnKS4gDQpgYGB7ciBtdmRhZywgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9IkRpcmVjdGVkIGFjeWNsaWMgZ3JhcGggKERBRykgb2YgTXVsdGl2YXJpYWJsZSBNUiBhbmFseXNpcyBvZiBjb25jZW50cmF0aW9uIHJpc2sgZmFjdG9yIGNhdGVnb3JpZXMgaW4gTERMcy4ifQ0KRGlhZ3JhbW1lUjo6Z3JWaXooIg0KICAgICAgZGlncmFwaCBtcmRhZyB7DQoNCiAgICAgIGdyYXBoIFtyYW5rZGlyPVRCLCBsYXlvdXQ9bmVhdG9dDQoNCiAgICAgIG5vZGUgW3NoYXBlPWJveCxlaWdodD0wLjMsIHdpZHRoPTAuM10NCiAgICAgIFUgW2xhYmVsPSdDb25mb3VuZGVycycsIHBvcz0nMywxISddDQogICAgICANCiAgICAgIG5vZGUgW3NoYXBlPWJveCwgaGVpZ2h0PTAuNSwgd2lkdGg9MC41XQ0KICAgICAgWTEgW2xhYmVsPSdJc2NoZW1pYyBTdHJva2UnLCBwb3M9JzQsLTEhJ10NCg0KICAgICAgbm9kZSBbc2hhcGU9Ym94LCBoZWlnaHQ9MC4zLCB3aWR0aD0wLjNdDQogICAgICBHMSBbbGFiZWw9J0dAX3sxfScsIHBvcz0nMCwtMSEnXQ0KCSAgICBHMiBbbGFiZWw9J0dAX3tKfScsIHBvcz0nMCwtMiEnXQ0KICAgICAgWDEgW2xhYmVsPSdTbWFsbCBMREwnLCBwb3M9JzIsMCEnXQ0KICAgICAgWDIgW2xhYmVsPSdNZWRpdW0gTERMJywgcG9zPScyLC0xISddDQogICAgICBYMyBbbGFiZWw9J0xhcmdlIExETCcsIHBvcz0nMiwtMiEnXQ0KICAgICAgWDQgW2xhYmVsPSdJREwnLCBwb3M9JzIsLTMhJ10NCiAgICAgIA0KICAgICAgeyByYW5rID0gc2FtZTsgIFkxIH0NCg0KICAgICAgRzEgLT4ge1gxLFgyLFgzLFg0fQ0KCSAgICBHMiAtPiB7WDEsWDIsWDMsWDR9DQogICAgICBVIC0+IFgxDQogICAgICBVIC0+IFgyDQogICAgICBVIC0+IFgzDQogICAgICBVIC0+IFg0DQogICAgICBVIC0+IFkxDQogICAgICBYMSxYMixYMyxYNCAtPiB7WTF9DQogICAgICANCiAgICAgIH0NCiAgICAgICIsIGhlaWdodCA9IDMwMCkNCmBgYA0KDQpXZSBmaXR0ZWQgTVZNUiBtb2RlbHMgdXNpbmcgdGhlIGBNVk1SYCBwYWNrYWdlIFtAc3BpbGxlci1tdm1yXS4gV2UgaW52ZXN0aWdhdGVkIGludmFsaWQgaW5zdHJ1bWVudHMgdXNpbmcgZWFjaCBnZW5vdHlwZSdzIGNvbnRyaWJ1dGlvbiB0byB0aGUgYWRqdXN0ZWQgUS1zdGF0aXN0aWMgW0BzYW5kZXJzb24taWplLTIwMThdIGFuZCBvbmx5IGZvdW5kIDIgb3V0bHlpbmcgZ2Vub3R5cGVzLCBoZW5jZSBmb3Igc2ltcGxpY2l0eSB3ZSBwZXJmb3JtZWQgdGhlc2UgYW5hbHlzZXMgdXNpbmcgYWxsIDE0OCBnZW5vdHlwZXMuDQoNCmBgYHtyfQ0KY29uY2VsZGw8LSBjKCJDb25jZW50cmF0aW9uIG9mIElETCBwYXJ0aWNsZXMiLA0KICAgICAgICAgICAgICJDb25jZW50cmF0aW9uIG9mIExhcmdlIExETCBwYXJ0aWNsZXMiLA0KICAgICAgICAgICAgICJDb25jZW50cmF0aW9uIG9mIE1lZGl1bSBMREwgcGFydGljbGVzIiwgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICJDb25jZW50cmF0aW9uIG9mIFNtYWxsIHBhcnRpY2xlcyIpDQoNCmNvbmNlaGRsPC0gYygiQ29uY2VudHJhdGlvbiBvZiBMYXJnZSBIREwgcGFydGljbGVzIiwNCiAgICAgICAgICAgICAiQ29uY2VudHJhdGlvbiBvZiBNZWRpdW0gSERMIHBhcnRpY2xlcyIsDQogICAgICAgICAgICAgIkNvbmNlbnRyYXRpb24gb2YgU21hbGwgSERMIHBhcnRpY2xlcyIsDQogICAgICAgICAgICAgIkNvbmNlbnRyYXRpb24gb2YgVmVyeSBMYXJnZSBIREwgcGFydGljbGVzIikNCg0KWUcgPC0gYXMubnVtZXJpYyhvdXRfeWJldGFbLDRdKQ0Kc2VZRzwtIGFzLm51bWVyaWMob3V0X3lzZVssNF0pDQpyc2lkPC0gQ2hhbGxlbmdlX2RhdCRyc2lkDQoNCmRhcms8LSBjYmluZCgoYXMubnVtZXJpYyhiZXRhX21hdFssNjZdKSksKGFzLm51bWVyaWMoYmV0YV9tYXRbLDQ1XSkpLChhcy5udW1lcmljKGJldGFfbWF0Wyw2OV0pKSwoYXMubnVtZXJpYyhiZXRhX21hdFssMzJdKSksKGFzLm51bWVyaWMoYmV0YV9tYXRbLDMyXSkpLChhcy5udW1lcmljKG91dF95c2VbLDRdKSksKGFzLm51bWVyaWMob3V0X3lzZVssNF0pKSwoYXMubnVtZXJpYyhvdXRfeXNlWyw0XSkpLFlHLHNlWUcscnNpZCkNCmRhcms8LSBuYS5leGNsdWRlKGRhcmspDQoNCiMjIyBkYXRhDQptdm1yZGF0PC1mb3JtYXRfbXZtcihCWEdzID0gZGFya1ssMTo0XSwgQllHID0gZGFya1ssOV0sIHNlQlhHcyA9IGRhcmtbLDU6OF0sc2VCWUcgPSBkYXJrWywxMF0sIFJTSUQgPSBkYXJrWywxMV0pDQoNCg0KbXZtcm91dCA8LSBtdm1yMihtdm1yZGF0LDAsMSkNCm5ld19kYXQ8LSBjYmluZChtdm1yb3V0JGNvZWYsdChtdm1yb3V0JFFfc3RyZW5ndGgpKQ0Kcm93bmFtZXMobmV3X2RhdCk8LSBjb25jZWxkbA0KDQojIyMjIEhETHMNCmRhcmsyPC0gY2JpbmQoKGFzLm51bWVyaWMoYmV0YV9tYXRbLDM5XSkpLChhcy5udW1lcmljKGJldGFfbWF0Wyw2M10pKSwoYXMubnVtZXJpYyhiZXRhX21hdFssODJdKSksKGFzLm51bWVyaWMoYmV0YV9tYXRbLDEwNl0pKSwoYXMubnVtZXJpYyhiZXRhX21hdFssMzldKSksKGFzLm51bWVyaWMoYmV0YV9tYXRbLDYzXSkpLChhcy5udW1lcmljKGJldGFfbWF0Wyw4Ml0pKSwoYXMubnVtZXJpYyhiZXRhX21hdFssMTA2XSkpLFlHLHNlWUcscnNpZCkNCmRhcmsyPC0gbmEuZXhjbHVkZShkYXJrMikNCg0KbXZtcmRhdDI8LWZvcm1hdF9tdm1yKEJYR3MgPSBkYXJrMlssMTo0XSwgQllHID0gZGFyazJbLDldLCBzZUJYR3MgPSBkYXJrMlssNTo4XSxzZUJZRyA9IGRhcmsyWywxMF0sIFJTSUQgPSBkYXJrMlssMTFdKQ0KbXZtcm91dDI8LSBtdm1yMihtdm1yZGF0MiwwLDEpDQpuZXdfZGF0MjwtIGNiaW5kKG12bXJvdXQyJGNvZWYsdChtdm1yb3V0MiRRX3N0cmVuZ3RoKSkNCnJvd25hbWVzKG5ld19kYXQyKTwtIGNvbmNlaGRsDQpgYGANCg0KIyMjIExETA0KDQpUaGUgcmVzdWx0cyBvZiB0aGUgTVZNUiBhbmFseXNpcyBmb3IgdGhlIGNvbmNlbnRyYXRpb24gb2YgTERMIHBhcnRpY2xlcyBpcyBzaG93biBpbiBUYWJsZSBcQHJlZih0YWI6bGRsbXZpdncpLiBDb25jZW50cmF0aW9uIGZvciBJRExzIGFuZCBtZWRpdW0gTERMIHBhcnRpY2xlcyBoYXZlIG5lZ2F0aXZlIGNhdXNhbCBlc3RpbWF0ZXMsIHdpdGggdGhlIGNvbmNlbnRyYXRpb24gb2YgSURMIHBhcnRpY2xlcyBlc3RpbWF0ZSBnaXZpbmcgYSBzbWFsbCBwLXZhbHVlLg0KDQpUaGUgY29sdW1uIG9mIFEtc3RhdGlzdGljcyAoUSkgc2hvd3MgZXZpZGVuY2Ugb2YgaGV0ZXJvZ2VuZWl0eS4gSW4gdGhlIE1WTVIgY29udGV4dCwgdGhpcyBzdWdnZXN0cyB0aGF0IHRoZXJlIGlzIGVub3VnaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0cnVtZW50cyB0byBwcmVkaWN0IHRoZSBleHBvc3VyZXMuIFRoZSB0ZXN0IGJhc2VkIG9uIHRoZSBhZGp1c3RlZCBRIHN0YXRpc3RpYyAoJHAoUV9BKSA9IDAuOTkkKSBzaG93cyBldmlkZW5jZSBvZiBwbGVpb3Ryb3B5LCB3aGljaCBjYW4gc3VnZ2VzdCB0aGF0IHRoZXJlIGFyZSBpbnN0cnVtZW50cyB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgb3V0Y29tZSB0aHJvdWdoIG90aGVyIHBhdGh3YXlzIChtb3JlIGV4cG9zdXJlcykuDQoNCk5vdGUgdGhhdCBwcmVjaXNlbHkgdGhlIHNhbWUgaXNzdWUgYXMgbm90ZWQgYWJvdmUgYXBwbGllcyBpbiB0aGlzIHNldHRpbmcgd2hlcmUgU05QcyB1c2VkIGluIHRoZSBJVnMgb3ZlcmxhcCBiZXR3ZWVuIGV4cG9zdXJlcywgbWVhbmluZyB0aGF0IHRoZSBlZmZlY3QgZXN0aW1hdGVzIGZyb20gTVZNUiBhcmUgdW5saWtlbHkgdG8gYmUgdmFsaWQuDQoNCmBgYHtyLCBsZGxtdml2dywgaW5jbHVkZT1UUlVFLCBlY2hvPUZBTFNFfQ0Ka2FibGUobmV3X2RhdCwgZGlnaXRzID0gNCwgY2FwdGlvbiA9ICJJVlcgRXN0aW1hdGVzIGZyb20gTXVsdGl2YXJpYXRlIE1SIHVzaW5nIDE0OCBTTlBzIiklPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBUUlVFKQ0KYGBgDQoNCiMjIyBIREwNCg0KVGhlIHJlc3VsdHMgZnJvbSB0aGUgTVZNUiBhbmFseXNpcyBmb3IgY29uY2VudHJhdGlvbnMgb2YgSERMIHBhcnRpY2xlcyBhcmUgc2hvd24gaW4gVGFibGUgXEByZWYodGFiOmhkbG12aXZ3KS4gVGhlc2Ugc2hvdyBwb3NpdGl2ZSBjYXVzYWwgZXN0aW1hdGVzIGZvciBtZWRpdW0gYW5kIHZlcnkgbGFyZ2UgSERMLCBob3dldmVyIHRoZSBlc3RpbWF0ZXMgc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggY2F1dGlvbi4gVGhlIFEtc3RhdGlzdGljIGNvbHVtbiBzdWdnZXN0cyB0aGF0IHRoZXJlIGlzIGVub3VnaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0cnVtZW50cyB0byBwcmVkaWN0IHRoZSBleHBvc3VyZSB2YXJpYWJsZXMuIFRoZSBhZGp1c3RlZCBRLXN0YXRpc3RpYyBmb3IgdGhpcyBtb2RlbCBnYXZlIGEgcC12YWx1ZSBvZiAwLjg4LCB3aGljaCBzdWdnZXN0cyB0aGF0IHRoZXJlIGFyZSBpbnN0cnVtZW50cyB3aGljaCBhZmZlY3QgaXNjaGVtaWMgc3Ryb2tlIHRocm91Z2ggb3RoZXIgZXhwb3N1cmVzLg0KDQpOb3RlIHRoYXQgcHJlY2lzZWx5IHRoZSBzYW1lIGlzc3VlIGFzIG5vdGVkIGFib3ZlIGFwcGxpZXMgaW4gdGhpcyBzZXR0aW5nIHdoZXJlIFNOUHMgdXNlZCBpbiB0aGUgSVZzIG92ZXJsYXAgYmV0d2VlbiBleHBvc3VyZXMsIG1lYW5pbmcgdGhhdCB0aGUgZWZmZWN0IGVzdGltYXRlcyBmcm9tIE1WTVIgYXJlIHVubGlrZWx5IHRvIGJlIHZhbGlkLg0KDQpgYGB7ciwgaGRsbXZpdncsIGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRX0NCmthYmxlKG5ld19kYXQyLCBkaWdpdHMgPSA0LCBjYXB0aW9uID0gIklWVyBFc3RpbWF0ZXMgZnJvbSBNdWx0aXZhcmlhdGUgTVIgZm9yIEhETHMgdXNpbmcgMTQ4IFNOUHMiKSU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IFRSVUUpDQpgYGANCg0KDQojIERpc2N1c3Npb24gYW5kIENvbmNsdXNpb25zDQoNCldlIGhhdmUgcHJlc2VudGVkIGVzdGltYXRlcyBvZiB0aGUgZWZmZWN0IG9mIGRpZmZlcmVudCB0cmFpdHMgcmVsYXRlZCB0byBMREwgYW5kIEhETCBvbiB0aGUgcmlzayBvZiBpc2NoZW1pYyBzdHJva2UgYW5kIGF0dGVtcHRlZCB0byBncm91cCB0cmFpdHMgYmFzZWQgb24gY2hhcmFjdGVyaXN0aWNzIG9mIGxpcGlkIG9yIHNpemUuDQoNClNlbGVjdGluZyBpbnN0cnVtZW50cyBmb3IgZWFjaCB0cmFpdCBiYXNlZCBvbiBTTlBzIHRoYXQgc3VycGFzcyBjb252ZW50aW9uYWwgbGV2ZWxzIG9mIGdlbm9tZS13aWRlIHNpZ25pZmljYW5jZSBsZWQgdG8gbm8gbWVhbmluZ2Z1bCBjb25jbHVzaW9ucyBiZWluZyBkcmF3biBiYXNlZCBvbiBsaW1pdGVkIHN0YXRpc3RpY2FsIHBvd2VyLg0KDQpJbiBjb250cmFzdCwgc2VsZWN0aW5nIGluc3RydW1lbnRzIGJhc2VkIG9uIHRoZWlyIGluZGl2aWR1YWwgY29udHJpYnV0aW9uIHRvIHRoZSBRLXN0YXRpc3RpY3MgbGVkIHRvIGluc3RydW1lbnRzIGNvbnNpc3Rpbmcgb2YgbWFueSBtb3JlIFNOUHMgYW5kIHRoZXJlZm9yZSBncmVhdGVyIHN0YXRpc3RpY2FsIHBvd2VyLiBJbiB0aGlzIHNldHRpbmcsIHdlIGlkZW50aWZpZWQgbWFueSBzdHJvbmcgTVIgYXNzb2NpYXRpb25zLCB3aGljaCBjb3VsZCBiZSBjb25zdHJ1ZWQgYXMgZXZpZGVuY2Ugb2YgY2F1c2F0aW9uLiBIb3dldmVyIHRoaXMgYXBwcm9hY2ggaGFzIGEgbWFqb3IgZmxhdyBpbnNvZmFyIGFzIHRoZSBzYW1lIFNOUHMgd2VyZSB1c2VkIGFzIElWcyBmb3IgbXVsdGlwbGUgZXhwb3N1cmVzLiBJbiB0aGlzIGNvbnRleHQsIGl0IGJlY29tZXMgaW1wb3NzaWJsZSB0byBkaXNlbnRhbmdsZSB3aGljaCBvZiB0aGUgdHJhaXRzIGFyZSBjYXVzYWwgYmVjYXVzZSBpbiBlc3NlbmNlIHRoZSBnZW5vdHlwZS1kaXNlYXNlIGFzc29jaWF0aW9uIGlzIGZpeGVkIGFuZCBhbGwgdGhhdCB2YXJpZXMgaW4gZWFjaCBNUiBtb2RlbCBpcyB0aGUgZ2Vub3R5cGUtZXhwb3N1cmUgYXNzb2NpYXRpb24uIEZ1cnRoZXJtb3JlLCBpbiB0aGUgY29udGV4dCBvZiBNVk1SLCB3ZSBjYW5ub3Qgc2VlIGhvdyB1c2luZyB0aGUgc2FtZSBTTlBzIGZvciBtdWx0aXBsZSBleHBvc3VyZXMgaW4gdGhlIHNhbWUgbW9kZWwgY2FuIGxlYWQgdG8gdmFsaWQgTVIgZXN0aW1hdGVzLiAgDQoNClRodXMsIHRoaXMgTVIgZGF0YSBjaGFsbGVuZ2UgbmljZWx5IGRlbW9uc3RyYXRlcyBhIGtleSBjaGFsbGVuZ2UgaW4gY29uZHVjdGluZyBNUiBvZiBoaWdobHkgY29ycmVsYXRlZCB0cmFpdHMuIFNlbGVjdGluZyBTTlBzIG9uIHRoZSBiYXNpcyBvZiBHV0FTIHNpZ25pZmljYW5jZSBkZXJpdmVkIGZyb20gbW9kZXN0bHktc2l6ZWQgR1dBUyBzdHVkaWVzIGlzIGxpa2VseSB0byBsZWFkIHRvIHBvb3JseSBwZXJmb3JtaW5nIGluc3RydW1lbnRzIG9uIHRoZSBiYXNpcyBvZiBsYWNrIG9mIHN0YXRpc3RpY2FsIHBvd2VyLiBJbmNsdXNpb24gb2YgZ3JlYXRlciBudW1iZXJzIG9mIFNOUHMgYnkgbW9yZSBwZXJtaXNzaXZlIGVudHJ5IGNyaXRlcmlhLCBlc3BlY2lhbGx5IGluIHRoZSBjb250ZXh0IG9mIG9ubHkgMTQ4IFNOUHMgaW4gdG90YWwgYWNyb3NzIHRoZSBsaXBpZCB0cmFpdHMgaW4gdGhpcyBkYXRhIGV4YW1wbGUsIG1lYW5zIHRoYXQgd2UgaW4gZXNzZW5jZSB1c2UgdGhlIHNhbWUgU05QcyBtdWx0aXBsZSB0aW1lcyB3aGljaCBtZWFucyB0aGF0IHdlIGNhbm5vdCB1c2UgTVIgaW4gZWl0aGVyIHRoZSB1bml2YXJpYXRlIG9yIG11bHRpdmFyaWF0ZSBzZXR0aW5nIHRvIGRpc2VudGFuZ2xlIHdoaWNoIHRyYWl0cyBhcmUgZHJpdmluZyB0aGUgY2F1c2FsIHJlbGF0aW9uc2hpcC4gV2UgYXJlIG5vdCB0aGVyZWZvcmUgYWJsZSB0byBtYWtlIGFueSBtZWFuaW5nZnVsIGNvbmNsdXNpb25zIGFib3V0IHRoZSBjYXVzYWwgcm9sZSBvZiB0aGVzZSB0cmFpdHMgaW4gaXNjaGFlbWljIHN0cm9rZS4gT3VyIGFuYWx5c2VzIGhpZ2hsaWdodCBhIHBvdGVudGlhbCBtaXN1c2Ugb2YgZ2VuZXRpYyBpbnN0cnVtZW50cyB3aGVyZSB0aGUgc2FtZSBpbnN0cnVtZW50cyBhcmUgdXNlZCBmb3IgbXVsdGlwbGUgZXhwb3N1cmVzLCB3aGljaCBtaWdodCBsZWFkIHRvIGVycm9uZW91cyBpbnRlcnByZXRhdGlvbnMuDQoNCiMgU29mdHdhcmUNCg0KVGhlIFIgTWFya2Rvd24gY29kZSBpcyBhdmFpbGFibGUgYnkgY2xpY2tpbmcgb24gdGhlIENvZGUgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHRoYW5kIGNvcm5lciBvZiB0aGlzIGRvY3VtZW50LiBbQ2xpY2sgaGVyZV0oI3RvcCkgdG8gbmF2aWdhdGUgdG8gdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQuDQoNCiMgUmVmZXJlbmNlcw0K