1 A version of Kajal’s R markdown document with some more significant changes

1.1 Libraries

In this version of Kajal’s document, I will repeat each step with some changes to see if I can make things a little easier for future modification.

I will therefore leave Kajal’s work unchanged and follow each block with an alternative.

1.4 Create counts table

## Note: importing `abundance.h5` is typically faster than `abundance.tsv`
## reading in files with read_tsv
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 
## transcripts missing from tx2gene: 14613
## summarizing abundance
## summarizing counts
## summarizing length
## [1] 34431

This is a potentially important difference in how I and Kajal treated the data. This is because I created the expressionset without using ‘lengthScaledTPM’, but let tximport use the raw counts so that the various normalizations are not affected. E.g. using these scaled numbers results in less variance in the data and may lead to some confusion for the downstream tools (edger/limma/deseq/etc). On the other hand, it may lead to cleaner plots, I am not sure.

1.5 Create DESeqDataSet

Not sure what this is actually doing

## Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
## design formula are characters, converting to factors
## using just counts from tximport
## [1] 34431

1.6 My version of the above

## The biomart annotations file already exists, loading from it.
## Reading the sample metadata.
## The sample definitions comprises: 39 rows(samples) and 8 columns(metadata fields).
## Reading count tables.
## Using the transcript to gene mapping.
## Reading kallisto data with tximport.
## Finished reading count data.
## Matched 34431 annotations and counts.
## Bringing together the count matrix and gene information.
## The mapped IDs are not the rownames of your gene information, changing them now.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 34431 rows and 39 columns.
## Using a subset expression.
## Warning in if (class(subset_design[[col]]) == "factor") {: the condition has
## length > 1 and only the first element will be used
## There were 39, now there are 30 samples.

1.8 My Barplot of counts

##    condition      min      1st   median     mean      3rd      max
## 1:        NS 14327794 16797487 17086171 18433743 17427077 25536756
## 2:       LPS 14788518 17005543 18507594 19201561 20567000 26005826
## 3:        LA 16014957 18662352 19800400 21804785 23207183 35215275
## 4:        LP 15864738 17917203 19813259 20710341 22113833 28681140

1.11 Median Pairwise Correlation

## Performing correlation.

## Performing correlation.

1.13 PCA

##   propVar cumPropVar cond.R2 batch.R2
## 1   28.82      28.82   69.66    25.21
## 2   13.93      42.75   41.92    44.39
## 3   10.96      53.71   73.10    18.68
## 4    7.39      61.10    9.06    75.08
## 5    5.80      66.90    5.43    78.47
##   propVar cumPropVar cond.R2 batch.R2
## 1   28.82      28.82   69.66    30.95
## 2   13.93      42.75   41.92    46.07
## 3   10.96      53.71   73.10    20.98
## 4    7.39      61.10    9.06    80.68
## 5    5.80      66.90    5.43    91.16
##   propVar cumPropVar cond.R2 batch.R2
## 1   19.48      19.48   63.12    32.88
## 2   11.01      30.49   26.93    54.19
## 3    6.91      37.40    1.42    70.89
## 4    5.79      43.19    2.32    70.10
## 5    5.08      48.27    4.32    81.90
##   propVar cumPropVar cond.R2 batch.R2
## 1   19.48      19.48   63.12    35.52
## 2   11.01      30.49   26.93    53.86
## 3    6.91      37.40    1.42    88.21
## 4    5.79      43.19    2.32    94.87
## 5    5.08      48.27    4.32    82.44

1.14 Plot PC1 v PC2

## This function will replace the expt$expressionset slot with:
## log2(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 21885 low-count genes (12546 remaining).
## Step 2: normalizing the data with quant.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 841 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Not putting labels on the plot.

## This function will replace the expt$expressionset slot with:
## log2(quant(cbcb(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 22066 low-count genes (12365 remaining).
## Step 2: normalizing the data with quant.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 644 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Not putting labels on the plot.

1.15 Euclidian Distance Heat Map

1.16 Correct for Patient in Limma model

##   propVar cumPropVar cond.R2 batch.R2
## 1   36.04      36.04   95.47     5.38
## 2   17.81      53.85   91.87     6.83
## 3    8.05      61.90   29.00    25.52
## 4    5.39      67.29   78.12    21.01
## 5    3.06      70.35    9.63     8.75
##   propVar cumPropVar cond.R2 batch.R2
## 1   36.04      36.04   95.47        0
## 2   17.81      53.85   91.87        0
## 3    8.05      61.90   29.00        0
## 4    5.39      67.29   78.12        0
## 5    3.06      70.35    9.63        0
## [1] 34431    30
##   propVar cumPropVar cond.R2 batch.R2
## 1   23.26      23.26   95.02    13.72
## 2    8.03      31.29   18.28    26.78
## 3    6.01      37.30   81.15    22.10
## 4    4.60      41.90   13.36     4.61
## 5    4.35      46.25    6.15    28.65
##   propVar cumPropVar cond.R2 batch.R2
## 1   23.26      23.26   95.02        0
## 2    8.03      31.29   18.28        0
## 3    6.01      37.30   81.15        0
## 4    4.60      41.90   13.36        0
## 5    4.35      46.25    6.15        0

1.17 Plot PC1 and PC2 with patient correction

1.20 DE analysis

## An object of class "EList"
## $E
##                 HPGL0912 HPGL0913 HPGL0914 HPGL0915 HPGL0916 HPGL0917 HPGL0918
## ENSG00000000419    5.123    5.127    5.025    4.474   4.7167    5.046   5.2660
## ENSG00000000457    3.299    3.167    3.050    3.025   3.1611    3.545   4.0989
## ENSG00000000460    2.399    2.529    2.602    2.436   2.6406    2.059   1.6421
## ENSG00000000938   10.042    9.248    9.983    9.741   9.3623    9.819   8.8113
## ENSG00000000971   -2.496   -0.779   -1.031   -1.766  -0.1931   -1.383   0.4631
##                 HPGL0919 HPGL0920 HPGL0921 HPGL0922 HPGL0923 HPGL0924 HPGL0925
## ENSG00000000419    5.299   4.6931    4.856   5.1077    5.370   5.2903  4.80840
## ENSG00000000457    3.420   3.6973    4.106   3.6041    3.993   3.3724  3.78760
## ENSG00000000460    2.213   1.9492    1.796   2.6304    2.610   2.2423  2.51606
## ENSG00000000938    9.567   9.2412    9.073   9.4465    8.450   9.6454  8.85937
## ENSG00000000971   -2.027  -0.7621   -1.940  -0.4054    1.069  -0.1318 -0.04098
##                 HPGL0926 HPGL0927 HPGL0928 HPGL0929 HPGL0930 HPGL0931 HPGL0942
## ENSG00000000419   5.3798   5.0693   5.3190    4.968    4.950   4.7623    5.103
## ENSG00000000457   3.9404   3.8097   3.8024    3.783    4.006   4.3877    3.224
## ENSG00000000460   1.9282   2.4928   2.1826    2.361    2.086   2.1600    2.751
## ENSG00000000938   8.4519   9.4225   8.4160    9.486    8.577   8.2824   10.605
## ENSG00000000971  -0.5389  -0.1523   0.6414   -1.202    0.322  -0.5603   -1.047
##                 HPGL0943 HPGL0944 HPGL0945 HPGL0946 HPGL0947 HPGL0948 HPGL0949
## ENSG00000000419    5.085    4.875    4.822   5.2504    5.259   5.0182    5.254
## ENSG00000000457    3.306    3.497    3.745   3.5212    3.317   3.2637    3.173
## ENSG00000000460    2.456    3.031    2.248   2.3073    1.611   2.3986    2.790
## ENSG00000000938   10.368   10.031   10.404  10.3682    9.790  10.3477    9.189
## ENSG00000000971   -2.082    1.534    1.091  -0.2224    1.582  -0.3172    2.536
##                 HPGL0950 HPGL0951 HPGL0952 HPGL0953 HPGL0954 HPGL0955 HPGL0956
## ENSG00000000419    5.071   5.4803    5.276    5.194    5.100    5.218   5.5547
## ENSG00000000457    3.587   3.5583    3.552    3.364    3.632    3.901   3.6442
## ENSG00000000460    2.524   2.6507    2.332    2.304    2.944    2.610   2.1552
## ENSG00000000938    9.698  10.2341    9.430   10.179    9.337    9.248  10.2084
## ENSG00000000971    2.738  -0.1407    2.251   -2.234    1.842    2.606  -0.6589
##                 HPGL0957 HPGL0958 HPGL0959 HPGL0960
## ENSG00000000419    5.242    5.194    5.326    5.216
## ENSG00000000457    3.645    3.364    3.834    3.954
## ENSG00000000460    1.915    2.304    3.125    2.645
## ENSG00000000938    9.380   10.179    9.012    9.083
## ENSG00000000971    2.058   -2.234    2.872    3.217
## 12853 more rows ...
## 
## $weights
##        [,1]   [,2]    [,3]   [,4]   [,5]   [,6]   [,7]    [,8]   [,9]  [,10]
## [1,] 19.106 19.258 18.7306 17.802 18.135 19.731 19.871 19.3575 18.449 18.777
## [2,] 10.069 10.557  9.3680 10.323 11.535 12.997 13.503 12.2388 13.254 14.518
## [3,]  8.020  7.011  7.7570  8.713  7.609  6.088  5.334  5.8931  6.614  5.783
## [4,] 22.325 22.799 22.3503 22.759 22.787 22.528 23.008 22.5562 22.972 22.998
## [5,]  0.963  2.059  0.7704  1.865  1.853  1.010  2.173  0.8063  1.967  1.955
##       [,11]  [,12]  [,13]  [,14]  [,15]  [,16]  [,17]  [,18]  [,19]  [,20]
## [1,] 20.389 20.526 20.045 19.179 19.493 19.647 19.796 19.276 18.364 18.691
## [2,] 12.838 13.342 12.084 13.096 14.354 13.866 14.375 13.107 14.125 15.401
## [3,]  7.523  6.579  7.277  8.183  7.138  7.081  6.198  6.851  7.702  6.720
## [4,] 22.721 23.162 22.749 23.135 23.154 22.799 23.209 22.828 23.189 23.204
## [5,]  1.584  3.684  1.242  3.295  3.271  1.469  3.371  1.156  3.019  2.998
##       [,21]  [,22]  [,23]  [,24]  [,25]  [,26]  [,27]  [,28]  [,29]  [,30]
## [1,] 19.615 19.245 18.332 18.658 20.302 20.446 19.960 19.087 19.400 20.627
## [2,] 11.497 10.760 11.754 13.009 11.125 11.619 10.397 11.379 12.620 12.185
## [3,]  8.183  7.917  8.889  7.764  7.317  6.402  7.078  7.959  6.943  8.198
## [4,] 22.026 22.050 22.420 22.447 22.219 22.679 22.244 22.640 22.668 22.319
## [5,]  1.667  1.305  3.498  3.473  2.776  6.772  2.118  6.093  6.052  2.311
##       [,31]  [,32]  [,33]  [,34]  [,35]  [,36]  [,37]  [,38]  [,39]
## [1,] 20.752 20.306 19.458 19.773 20.818 20.944 20.521 19.697 19.988
## [2,] 12.693 11.438 12.443 13.706 12.591 13.103 11.841 12.859 14.111
## [3,]  7.167  7.931  8.905  7.778  7.678  6.714  7.428  8.348  7.285
## [4,] 22.792 22.345 22.753 22.781 22.379 22.858 22.406 22.819 22.848
## [5,]  5.630  1.782  5.060  5.024  2.515  6.135  1.930  5.523  5.485
## 12853 more rows ...
## 
## $design
##          condGM_LA condGM_LP condGM_LPS condGM_NS condM_LA condM_LP condM_LPS
## HPGL0912         0         0          0         0        0        0         0
## HPGL0913         0         0          0         0        0        0         0
## HPGL0914         0         0          0         0        0        0         0
## HPGL0915         0         0          0         0        0        0         0
## HPGL0916         0         0          0         0        0        0         0
##          condM_NS patientH2 patientH3 patientH4 patientH5
## HPGL0912        1         0         0         0         0
## HPGL0913        1         1         0         0         0
## HPGL0914        1         0         1         0         0
## HPGL0915        1         0         0         1         0
## HPGL0916        1         0         0         0         1
## 34 more rows ...
## 
## $targets
##          lib.size
## HPGL0912 20054310
## HPGL0913 20054287
## HPGL0914 20054287
## HPGL0915 20054311
## HPGL0916 20054294
## 34 more rows ...

1.21 M_LPS v M_NS

eBayes finds an F-statistic from the set of t-statistics for that gene

Limit list to genes with an adjusted p value < 0.05

## [1] 4840

Filter out rows with less than 2-fold change (log2 fold change of > 1)

## [1] 1350

33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M33;33M35;17M35;17M35;17M35;17M35;17M35;17MFilter out rows with less than 4-fold change (log2 fold change of > 2)

## [1] 431

Make an MA plot

Annotate sigGenes list using Biomart

## Error in bmRequest(request = request, verbose = verbose): Internal Server Error (HTTP 500).
## Cache found

1.22 M_LPS v M_LA

## [1] 955
## [1] 256
## [1] 57

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Error in bmRequest(request = request, verbose = verbose): Internal Server Error (HTTP 500).
## Cache found

1.23 M_LPS v M_LP

## [1] 1993
## [1] 489
## [1] 91

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Error in bmRequest(request = request, verbose = verbose): Internal Server Error (HTTP 500).
## Cache found

1.24 M_LP v M_NS

## [1] 4603
## [1] 1422
## [1] 448

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Error in bmRequest(request = request, verbose = verbose): Internal Server Error (HTTP 500).
## Cache found

1.25 M_LA v M_NS

## [1] 4922
## [1] 1493
## [1] 478

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Error in bmRequest(request = request, verbose = verbose): Internal Server Error (HTTP 500).
## Cache found

##GM_LPS v. GM_NS

## [1] 653
## [1] 260
## [1] 99

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Error in bmRequest(request = request, verbose = verbose): Internal Server Error (HTTP 500).
## Cache found

1.26 GM_LPS v GM_LP

## [1] 350
## [1] 126
## [1] 28

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Error in bmRequest(request = request, verbose = verbose): Internal Server Error (HTTP 500).
## Cache found

##GM_LPS v GM_LA

## [1] 12
## [1] 7
## [1] 1

## pdf 
##   3
## png 
##   2
## png 
##   3
## png 
##   2
## Error in bmRequest(request = request, verbose = verbose): Internal Server Error (HTTP 500).
## Cache found

1.29 Rich Factor Graphs

1.30 GO terms shared LA LP

2 Volcano plot M_LPS_4 v M_LP_4

##                ID logFC AveExpr     t   P.Value adj.P.Val     B
## 1 ENSG00000121966 4.167   5.148 13.64 9.189e-15 1.182e-10 23.50
## 2 ENSG00000182568 2.467   3.922 13.00 3.316e-14 2.132e-10 22.23
## 3 ENSG00000176595 4.467   1.729 11.43 9.698e-13 4.157e-09 18.60
## 4 ENSG00000198814 2.443   6.435 11.18 1.695e-12 4.986e-09 18.53
## 5 ENSG00000112394 2.502   5.836 10.96 2.791e-12 5.982e-09 18.04
## 6 ENSG00000109321 4.500   1.516 11.12 1.939e-12 4.986e-09 17.86

## png 
##   3
## png 
##   2

3 Volcano plot M_LPS_4 v M_LA_4

## Warning in file(file, "rt"): cannot open file
## 'topTab_M_LPSvM_LA_CDS_limmabatchcorrection_20171120.txt': No such file or
## directory
## Error in file(file, "rt"): cannot open the connection
##                ID logFC AveExpr     t   P.Value adj.P.Val     B
## 1 ENSG00000121966 4.167   5.148 13.64 9.189e-15 1.182e-10 23.50
## 2 ENSG00000182568 2.467   3.922 13.00 3.316e-14 2.132e-10 22.23
## 3 ENSG00000176595 4.467   1.729 11.43 9.698e-13 4.157e-09 18.60
## 4 ENSG00000198814 2.443   6.435 11.18 1.695e-12 4.986e-09 18.53
## 5 ENSG00000112394 2.502   5.836 10.96 2.791e-12 5.982e-09 18.04
## 6 ENSG00000109321 4.500   1.516 11.12 1.939e-12 4.986e-09 17.86

## png 
##   3
## png 
##   2

4 Volcano plot GM_LPS_4 v GM_LA_4

## Warning in file(file, "rt"): cannot open file 'GM_LPS v GM_LA/
## topTab_GM_LPSvGM_LA_CDS_limmabatchcorrection_20171023.txt': No such file or
## directory
## Error in file(file, "rt"): cannot open the connection
##                ID logFC AveExpr     t   P.Value adj.P.Val     B
## 1 ENSG00000121966 4.167   5.148 13.64 9.189e-15 1.182e-10 23.50
## 2 ENSG00000182568 2.467   3.922 13.00 3.316e-14 2.132e-10 22.23
## 3 ENSG00000176595 4.467   1.729 11.43 9.698e-13 4.157e-09 18.60
## 4 ENSG00000198814 2.443   6.435 11.18 1.695e-12 4.986e-09 18.53
## 5 ENSG00000112394 2.502   5.836 10.96 2.791e-12 5.982e-09 18.04
## 6 ENSG00000109321 4.500   1.516 11.12 1.939e-12 4.986e-09 17.86

## png 
##   3
## png 
##   2

5 Volcano plot GM_LPS_4 v GM_LP_4

## Warning in file(file, "rt"): cannot open file
## 'topTab_GM_LPSvGM_LP_CDS_limmabatchcorrection_20171023.txt': No such file or
## directory
## Error in file(file, "rt"): cannot open the connection
##                ID logFC AveExpr     t   P.Value adj.P.Val     B
## 1 ENSG00000121966 4.167   5.148 13.64 9.189e-15 1.182e-10 23.50
## 2 ENSG00000182568 2.467   3.922 13.00 3.316e-14 2.132e-10 22.23
## 3 ENSG00000176595 4.467   1.729 11.43 9.698e-13 4.157e-09 18.60
## 4 ENSG00000198814 2.443   6.435 11.18 1.695e-12 4.986e-09 18.53
## 5 ENSG00000112394 2.502   5.836 10.96 2.791e-12 5.982e-09 18.04
## 6 ENSG00000109321 4.500   1.516 11.12 1.939e-12 4.986e-09 17.86

## png 
##   3
## png 
##   2
LS0tCnRpdGxlOiAiSHVtYW4gTWFjcm9waGFnZXM6IE0tQ1NGIHYgR00tQ1NGOiBMUFMsIExQUytBZGVub3NpbmUsIExQUytQR0UyIgphdXRob3I6ICJLYWphbCBIYW1pZHphZGVoIGFuZCBhdGIiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiIgp2ZXIgPC0gIjIwMjAwMzMwIgoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCiMjcm1kX2ZpbGUgPC0gIjAzX2V4cHJlc3Npb25faW5mZWN0aW9uXzIwMTgwODIyLlJtZCIKYGBgCgojIEEgdmVyc2lvbiBvZiBLYWphbCdzIFIgbWFya2Rvd24gZG9jdW1lbnQgd2l0aCBzb21lIG1vcmUgc2lnbmlmaWNhbnQgY2hhbmdlcwoKIyMgTGlicmFyaWVzCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRldnRvb2xzKQpsaWJyYXJ5KHR4aW1wb3J0KQpsaWJyYXJ5KGJpb21hUnQpCmxpYnJhcnkoaHBnbHRvb2xzKQpsaWJyYXJ5KERFU2VxMikKbGlicmFyeShncGxvdHMpCmxpYnJhcnkoY2JjYlNFUSkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoVmVubmVyYWJsZSkKbGlicmFyeShlZGdlUikKbGlicmFyeShjYWxpYnJhdGUpCmxpYnJhcnkoc2NhbGVzKQpgYGAKCkluIHRoaXMgdmVyc2lvbiBvZiBLYWphbCdzIGRvY3VtZW50LCBJIHdpbGwgcmVwZWF0IGVhY2ggc3RlcCB3aXRoIHNvbWUgY2hhbmdlcwp0byBzZWUgaWYgSSBjYW4gbWFrZSB0aGluZ3MgYSBsaXR0bGUgZWFzaWVyIGZvciBmdXR1cmUgbW9kaWZpY2F0aW9uLgoKSSB3aWxsIHRoZXJlZm9yZSBsZWF2ZSBLYWphbCdzIHdvcmsgdW5jaGFuZ2VkIGFuZCBmb2xsb3cgZWFjaCBibG9jayB3aXRoIGFuIGFsdGVybmF0aXZlLgoKIyMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5LCBpbXBvcnQgbWV0YWRhdGEgYW5kIGFidW5kYW5jZSBmaWxlcwoKYGBge3IgcmVhZF9kYXRhfQpkZXNpZ24gPC0gcmVhZC50YWJsZSgnTWV0YURhdGEgb25seSA0IGhvdXIudHh0JywgaGVhZGVyPVQsIHNlcD0nXHQnKQpkZXNpZ25bWyJQYXRpZW50Il1dIDwtIGFzLmZhY3RvcihkZXNpZ25bWyJQYXRpZW50Il1dKQpkZXNpZ25bWyJTdGltdWxhdGlvbiJdXSA8LSBhcy5mYWN0b3IoZGVzaWduW1siU3RpbXVsYXRpb24iXV0pCmRlc2lnbltbIkJhdGNoIl1dIDwtIGFzLmZhY3RvcihkZXNpZ25bWyJCYXRjaCJdXSkKZGVzaWduW1siR3Jvd3RoIl1dIDwtIGFzLmZhY3RvcihkZXNpZ25bWyJHcm93dGgiXV0pCmZpbGVzIDwtIGZpbGUucGF0aCgia2FsbGlzdG8gYWJ1bmRhbmNlIGZpbGVzLyIsIGRlc2lnbiRIUEdMLklkZW50aWZpZXIsICJhYnVuZGFuY2UudHN2IikKbmFtZXMoZmlsZXMpIDwtIHBhc3RlMCgiSFBHTDA5IiwgYygxMjozMSwgNDI6NjApKQpyb3duYW1lcyhkZXNpZ24pIDwtIGRlc2lnbltbMV1dCgpzdGltX2Rlc2lnbl9pZHggPC0gZGVzaWduW1siU3RpbXVsYXRpb24iXV0gIT0gIk5TIgpzdGltX2Rlc2lnbiA8LSBkZXNpZ25bc3RpbV9kZXNpZ25faWR4LCBdCmBgYAoKIyMgQ29udmVydCB0cmFuc2NyaXB0IElEIHRvIGdlbmUgSUQKCmBgYHtyIGVuc2VtYmx9CmVuc2VtYmwgPC0gdXNlTWFydCgiRU5TRU1CTF9NQVJUX0VOU0VNQkwiLCBkYXRhc2V0PSJoc2FwaWVuc19nZW5lX2Vuc2VtYmwiLCBob3N0PSJ3d3cuZW5zZW1ibC5vcmciKQp0eDJnZW5lIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIsICJjaHJvbW9zb21lX25hbWUiKSwgbWFydD1lbnNlbWJsKQpnb29kX2lkeCA8LSBncmVwbCh4PXR4MmdlbmVbWyJjaHJvbW9zb21lX25hbWUiXV0sIHBhdHRlcm49Il5bWzphbG51bTpdXXsxLDJ9JCIpCmdvb2Rfb25lcyA8LSB0eDJnZW5lW2dvb2RfaWR4LCAtM10KYGBgCgojIyBDcmVhdGUgY291bnRzIHRhYmxlCgpgYGB7cn0KdHhpLmthbGxpc3RvLnRzdiA8LSB0eGltcG9ydChmaWxlcywgdHlwZT0ia2FsbGlzdG8iLCB0eDJnZW5lPWdvb2Rfb25lcywgY291bnRzRnJvbUFidW5kYW5jZT0ibGVuZ3RoU2NhbGVkVFBNIikKbnJvdyh0eGkua2FsbGlzdG8udHN2JGNvdW50cykKCndyaXRlLnRhYmxlKHR4aS5rYWxsaXN0by50c3YkY291bnRzLCAiVFBNX012R01fQ0RTXzIwMTgwNzExLnR4dCIsIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KHR4aS5rYWxsaXN0by50c3YkY291bnRzLCAiVFBNX012R01fMjAxODA3MTEuY3N2Iiwgcm93Lm5hbWVzPVQsIHF1b3RlPUYpCgpzdGltX2NvdW50cyA8LSB0eGkua2FsbGlzdG8udHN2JGNvdW50cwpzdGltX2NvdW50c19pZHggPC0gY29sbmFtZXMoc3RpbV9jb3VudHMpICVpbiUgcm93bmFtZXMoc3RpbV9kZXNpZ24pCnN0aW1fY291bnRzIDwtIHN0aW1fY291bnRzWywgc3RpbV9jb3VudHNfaWR4XQpgYGAKClRoaXMgaXMgYSBwb3RlbnRpYWxseSBpbXBvcnRhbnQgZGlmZmVyZW5jZSBpbiBob3cgSSBhbmQgS2FqYWwgdHJlYXRlZCB0aGUgZGF0YS4KVGhpcyBpcyBiZWNhdXNlIEkgY3JlYXRlZCB0aGUgZXhwcmVzc2lvbnNldCB3aXRob3V0IHVzaW5nICdsZW5ndGhTY2FsZWRUUE0nLApidXQgbGV0IHR4aW1wb3J0IHVzZSB0aGUgcmF3IGNvdW50cyBzbyB0aGF0IHRoZSB2YXJpb3VzIG5vcm1hbGl6YXRpb25zIGFyZSBub3QKYWZmZWN0ZWQuICBFLmcuIHVzaW5nIHRoZXNlIHNjYWxlZCBudW1iZXJzIHJlc3VsdHMgaW4gbGVzcyB2YXJpYW5jZSBpbiB0aGUgZGF0YQphbmQgbWF5IGxlYWQgdG8gc29tZSBjb25mdXNpb24gZm9yIHRoZSBkb3duc3RyZWFtIHRvb2xzCihlZGdlci9saW1tYS9kZXNlcS9ldGMpLiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IG1heSBsZWFkIHRvIGNsZWFuZXIgcGxvdHMsIEkgYW0Kbm90IHN1cmUuCgojIyBDcmVhdGUgREVTZXFEYXRhU2V0CgpOb3Qgc3VyZSB3aGF0IHRoaXMgaXMgYWN0dWFsbHkgZG9pbmcKCmBgYHtyIGRlc2VxX2Rkc30KZGYgPC0gZGF0YS5mcmFtZShjb25kaXRpb249cGFzdGUoZGVzaWduJEhQR0wuSWRlbnRpZmllciwgZGVzaWduJEdyb3d0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduJFN0aW11bGF0aW9uLCBkZXNpZ24kUGF0aWVudCwgc2VwPSJfIikpCnJvd25hbWVzKGRmKT1jb2xuYW1lcyh0eGkua2FsbGlzdG8udHN2JGNvdW50cykKZGRzIDwtIERFU2VxRGF0YVNldEZyb21UeGltcG9ydCh0eGkua2FsbGlzdG8udHN2LCBkZiwgfmNvbmRpdGlvbikKbnJvdyhkZHMpCgpkZHNfc3RpbSA8LSBkZHNbLCByb3duYW1lcyhzdGltX2Rlc2lnbildCmBgYAoKIyMgTXkgdmVyc2lvbiBvZiB0aGUgYWJvdmUKCmBgYHtyIGF0Yl9yZWFkX2RhdGF9Cm15X2Rlc2lnbiA8LSBkZXNpZ24Kcm93bmFtZXMobXlfZGVzaWduKSA8LSBkZXNpZ25bWzFdXQpteV9kZXNpZ25bWyJjb25kaXRpb24iXV0gPC0gbXlfZGVzaWduW1siU3RpbXVsYXRpb24iXV0KbXlfZGVzaWduW1siZmlsZSJdXSA8LSBnbHVlOjpnbHVlKCJwcmVwcm9jZXNzaW5nL3tyb3duYW1lcyhteV9kZXNpZ24pfS9hYnVuZGFuY2UudHN2IikKY29sbmFtZXMobXlfZGVzaWduKSA8LSB0b2xvd2VyKGNvbG5hbWVzKG15X2Rlc2lnbikpCmdlbmVfaW5mbyA8LSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoaG9zdD0idXNlYXN0LmVuc2VtYmwub3JnIikkYW5ub3RhdGlvbgpyb3duYW1lcyhnZW5lX2luZm8pIDwtIG1ha2UubmFtZXMoZ2VuZV9pbmZvW1siZW5zZW1ibF9nZW5lX2lkIl1dLCB1bmlxdWU9VFJVRSkKdHhfZ2VuZV9tYXAgPC0gZ2VuZV9pbmZvWywgYygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIpXQpoc19leHB0IDwtIGNyZWF0ZV9leHB0KG1ldGFkYXRhPW15X2Rlc2lnbiwgZ2VuZV9pbmZvPWdlbmVfaW5mbywgdHhfZ2VuZV9tYXA9dHhfZ2VuZV9tYXApCmhzX2V4cHQgPC0gc2V0X2V4cHRfYmF0Y2hlcyhoc19leHB0LCBmYWN0PSJncm93dGgiKQoKc3RpbV9leHB0IDwtIHN1YnNldF9leHB0KGhzX2V4cHQsIHN1YnNldD0ic3RpbXVsYXRpb24hPSdOUyciKQpgYGAKCiMjIEJhciBQbG90IG9mIENvdW50cwoKYGBge3IgYmFycGxvdH0KcGFyKG1hcj1jKDEwLCA0LjUsIDMuNSwgMSkpCnBhcihvbWE9YygwLCAwLCAwLCAwKSkKYmFycGxvdChjb2xTdW1zKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSwgbGFzPTMsIG1haW49J1JhdyBDb3VudHMgQnkgU2FtcGxlJykKCmJhcnBsb3QoY29sU3VtcyhzdGltX2NvdW50cyksIGxhcz0zLCBtYWluPSdSYXcgQ291bnRzIEJ5IFNhbXBsZScpCmBgYAoKIyMgTXkgQmFycGxvdCBvZiBjb3VudHMKCmBgYHtyIG15X2JhcnBsb3R9CmxpYnNpemUgPC0gcGxvdF9saWJzaXplKGhzX2V4cHQpCmxpYnNpemUkcGxvdApsaWJzaXplJHN1bW1hcnkKCnBsb3RfbGlic2l6ZShzdGltX2V4cHQpJHBsb3QKYGBgCgojIyBCb3ggUGxvdCBvZiBDb3VudHMKCmBgYHtyIGNvdW50X2JhcnBsb3R9CmRkcyA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkcykKbmN0cyA8LSBjb3VudHMoZGRzLCBub3JtYWxpemVkPVRSVUUpCnkgPC0gbG9nKG5jdHMgKyAxKQoKcGFyKG1hcj1jKDUsIDUsIDIsIDEpKQpwYXIob21hPWMoMCwgMCwgMCwgMCkpCmJveHBsb3QoeSwgbmFtZXM9Y29sbmFtZXModHhpLmthbGxpc3RvLnRzdiRjb3VudHMpLCBsYXM9MywgbWFpbj0nUGVyIFNhbXBsZSBMb2cgb2YgU2l6ZS1mYWN0b3IgQ291bnRzJykKCmRkc19zdGltIDwtIGVzdGltYXRlU2l6ZUZhY3RvcnMoZGRzX3N0aW0pCnN0aW1fbmN0cyA8LSBjb3VudHMoZGRzX3N0aW0sIG5vcm1hbGl6ZWQ9VFJVRSkKc3RpbV95IDwtIGxvZyhzdGltX25jdHMgKyAxKQoKcGFyKG1hcj1jKDUsIDUsIDIsIDEpKQpwYXIob21hPWMoMCwgMCwgMCwgMCkpCmJveHBsb3Qoc3RpbV95LCBuYW1lcz1jb2xuYW1lcyhzdGltX2NvdW50cyksIGxhcz0zLAogICAgICAgIG1haW49J1BlciBTYW1wbGUgTG9nIG9mIFNpemUtZmFjdG9yIENvdW50cycpCmBgYAoKYGBge3IgbXlfYm94cGxvdH0KYm94cGxvdCA8LSBwbG90X2JveHBsb3QoaHNfZXhwdCkKYm94cGxvdApgYGAKCiMjIEhlYXRtYXAgb2YgUGVhcnNvbiBDb3JyZWxhdGlvbgoKYGBge3IgY29yaGVhdH0KZGF0Q29yIDwtIGNvcih0eGkua2FsbGlzdG8udHN2JGNvdW50cykKaGVhdG1hcC4yKGRhdENvciwgUm93dj1OQSwgQ29sdj1OQSwKICAgICAgICAgIG1hcmdpbnM9YygxMCwgMTApLAogICAgICAgICAgbGFiUm93PWRmJGNvbmRpdGlvbiwKICAgICAgICAgIGxhYkNvbD1kZiRjb25kaXRpb24sCiAgICAgICAgICBkZW5kcm9ncmFtPSJub25lIiwKICAgICAgICAgIHNjYWxlPSJub25lIiwKICAgICAgICAgIHRyYWNlPSJub25lIiwKICAgICAgICAgIHNydENvbD00NSwgbWFpbj0nUGVhcnNvbiBDb3JyZWxhdGlvbicpCgoKc3RpbV9kYXRDb3IgPC0gY29yKHN0aW1fY291bnRzKQpoZWF0bWFwLjIoc3RpbV9kYXRDb3IsIFJvd3Y9TkEsIENvbHY9TkEsCiAgICAgICAgICBtYXJnaW5zPWMoMTAsIDEwKSwKICAgICAgICAgIGxhYlJvdz1kZiRjb25kaXRpb24sCiAgICAgICAgICBsYWJDb2w9ZGYkY29uZGl0aW9uLAogICAgICAgICAgZGVuZHJvZ3JhbT0ibm9uZSIsCiAgICAgICAgICBzY2FsZT0ibm9uZSIsCiAgICAgICAgICB0cmFjZT0ibm9uZSIsCiAgICAgICAgICBzcnRDb2w9NDUsIG1haW49J1BlYXJzb24gQ29ycmVsYXRpb24nKQpgYGAKCmBgYHtyIG15X2NvcmhlYXR9CnBsb3RfY29yaGVhdChoc19leHB0KSRwbG90CgpwbG90X2NvcmhlYXQoc3RpbV9leHB0KSRwbG90CmBgYAoKIyMgTWVkaWFuIFBhaXJ3aXNlIENvcnJlbGF0aW9uCgpgYGB7ciBzbWN9CmNvck0gPC0gbWF0cml4U3RhdHM6OnJvd01lZGlhbnMoY29yKHR4aS5rYWxsaXN0by50c3YkY291bnRzKSkKcXMgPC0gcXVhbnRpbGUoY29yTSwgcD1jKDEsIDMpLzQpCmlxciA8LSBkaWZmKHFzKQpvdXRMaW1pdCA8LSBxc1sxXSAtIDEuNSAqIGlxcgp5bGltIDwtIGMocG1pbihtaW4oY29yTSksIG91dExpbWl0KSwgbWF4KGNvck0pKQpjb25kIDwtIHBhc3RlKGRlc2lnbiRHcm93dGgsIGRlc2lnbiRTdGltdWxhdGlvbiwgc2VwPSJfIikKY29sIDwtIGlmZWxzZShjb25kPT0iTV9OUyIsICJncmF5NjAiLAogICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iTV9MUFMiLCAiZGVlcHBpbmszIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xBIiwgImRhcmtzZWFncmVlbjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJNX0xQIiwgImxhdmVuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX05TIiwgImxpZ2h0cGluazEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX0xQUyIsICJtb2NjYXNpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX0xBIiwgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZD09IkdNX0xQIiwgInNwcmluZ2dyZWVuNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibHVlMiIpKSkpKSkpKQpwYXIobWFyPWMoNSwgNC41LCAyLCAxKSkKcGxvdChjb3JNLCB4YXh0PSJuIiwgeWxpbT15bGltLCB5bGFiPSJNZWRpYW4gUGFpcndpc2UgQ29ycmVsYXRpb24iLCB4bGFiPSIiLCBtYWluPSIiLCBjb2w9Y29sLCBwY2g9MTYsIGNleD0xLjUpCmF4aXMoc2lkZT0xLCBhdD1zZXEoYWxvbmc9Y29yTSksIGxhYmVscz1jb2xuYW1lcyh0eGkua2FsbGlzdG8udHN2JGNvdW50cyksIGxhcz0yKQphYmxpbmUoaD1vdXRMaW1pdCwgbHR5PTIpCmFibGluZSh2PTE6bmNvbCh0eGkua2FsbGlzdG8udHN2JGNvdW50cyksIGx0eT0zLCBjb2w9ImJsYWNrIikKCgpzdGltX2Nvck0gPC0gbWF0cml4U3RhdHM6OnJvd01lZGlhbnMoY29yKHN0aW1fY291bnRzKSkKc3RpbV9xcyA8LSBxdWFudGlsZShzdGltX2Nvck0sIHA9YygxLCAzKS80KQpzdGltX2lxciA8LSBkaWZmKHN0aW1fcXMpCnN0aW1fb3V0TGltaXQgPC0gc3RpbV9xc1sxXSAtICgxLjUgKiBpcXIpCnN0aW1feWxpbSA8LSBjKHBtaW4obWluKHN0aW1fY29yTSksIHN0aW1fb3V0TGltaXQpLCBtYXgoc3RpbV9jb3JNKSkKc3RpbV9jb25kIDwtIHBhc3RlKHN0aW1fZGVzaWduJEdyb3d0aCwgc3RpbV9kZXNpZ24kU3RpbXVsYXRpb24sIHNlcD0iXyIpCmNvbCA8LSBpZmVsc2UoY29uZD09Ik1fTlMiLCAiZ3JheTYwIiwKICAgICAgICAgICAgICBpZmVsc2UoY29uZD09Ik1fTFBTIiwgImRlZXBwaW5rMyIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iTV9MQSIsICJkYXJrc2VhZ3JlZW4yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kPT0iTV9MUCIsICJsYXZlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJHTV9OUyIsICJsaWdodHBpbmsxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJHTV9MUFMiLCAibW9jY2FzaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJHTV9MQSIsICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmQ9PSJHTV9MUCIsICJzcHJpbmdncmVlbjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmx1ZTIiKSkpKSkpKSkKcGFyKG1hcj1jKDUsIDQuNSwgMiwgMSkpCnBsb3Qoc3RpbV9jb3JNLCB4YXh0PSJuIiwgeWxpbT15bGltLCB5bGFiPSJNZWRpYW4gUGFpcndpc2UgQ29ycmVsYXRpb24iLCB4bGFiPSIiLCBtYWluPSIiLCBjb2w9Y29sLCBwY2g9MTYsIGNleD0xLjUpCmF4aXMoc2lkZT0xLCBhdD1zZXEoYWxvbmc9c3RpbV9jb3JNKSwgbGFiZWxzPWNvbG5hbWVzKHN0aW1fY291bnRzKSwgbGFzPTIpCmFibGluZShoPXN0aW1fb3V0TGltaXQsIGx0eT0yKQphYmxpbmUodj0xOm5jb2woc3RpbV9jb3VudHMpLCBsdHk9MywgY29sPSJibGFjayIpCmBgYAoKYGBge3IgbXlfc21jfQpwbG90X3NtKGhzX2V4cHQpJHBsb3QKCnBsb3Rfc20oc3RpbV9leHB0KSRwbG90CmBgYAoKIyMgRmlsdGVyIGFuZCBOb3JtYWxpemUgQ291bnRzCgpgYGB7cn0KZmlsdGVyQ291bnRzID0gZnVuY3Rpb24gKGNvdW50cywgbGliLnNpemUgPSBOVUxMLCB0aHJlc2ggPSAxLCBtaW5TYW1wbGVzID0gMikgewogIGNwbXMgPC0gMl5sb2cyQ1BNKGNvdW50cywgbGliLnNpemUgPSBsaWIuc2l6ZSkkeQogIGtlZXAgPC0gcm93U3VtcyhjcG1zID4gdGhyZXNoKSA+PSBtaW5TYW1wbGVzCiAgY291bnRzIDwtIGNvdW50c1trZWVwLCBdCiAgY291bnRzCn0KeF90YWJsZSA8LSB0YWJsZShkZXNpZ24kU3RpbXVsYXRpb24pCmRpbSh0eGkua2FsbGlzdG8udHN2JGNvdW50cykKCmNvdW50cyA8LSBmaWx0ZXJDb3VudHModHhpLmthbGxpc3RvLnRzdiRjb3VudHMsIHRocmVzaD0xLCBtaW5TYW1wbGVzPW1pbih4X3RhYmxlKSkKZGltKGNvdW50cykKY291bnRzU3ViUSA8LSBxTm9ybShjb3VudHMpCnggPC0gbG9nMkNQTShjb3VudHNTdWJRKQpzIDwtIG1ha2VTVkQoeCR5KQoKc3RpbV90YWJsZSA8LSB0YWJsZShzdGltX2Rlc2lnbiRTdGltdWxhdGlvbikKc3RpbV9jb3VudHMgPC0gZmlsdGVyQ291bnRzKHN0aW1fY291bnRzLCB0aHJlc2g9MSwgbWluU2FtcGxlcz1taW4oc3RpbV90YWJsZSkpCmRpbShzdGltX2NvdW50cykKc3RpbV9jb3VudHNTdWJRIDwtIHFOb3JtKHN0aW1fY291bnRzKQpzdGltX3ggPC0gbG9nMkNQTShzdGltX2NvdW50c1N1YlEpCnN0aW1fcyA8LSBtYWtlU1ZEKHN0aW1feCR5KQpgYGAKCiMjIFBDQQoKYGBge3J9CmNiY2JTRVE6OnBjUmVzKHMkdiwgcyRkLCBjb25kLCBkZXNpZ24kQmF0Y2gpWzE6NSwgXQpjYmNiU0VROjpwY1JlcyhzJHYsIHMkZCwgY29uZCwgZGVzaWduJFBhdGllbnQpWzE6NSwgXQoKY2JjYlNFUTo6cGNSZXMoc3RpbV9zJHYsIHN0aW1fcyRkLCBzdGltX2NvbmQsIHN0aW1fZGVzaWduJEJhdGNoKVsxOjUsIF0KY2JjYlNFUTo6cGNSZXMoc3RpbV9zJHYsIHN0aW1fcyRkLCBzdGltX2NvbmQsIHN0aW1fZGVzaWduJFBhdGllbnQpWzE6NSwgXQpgYGAKCiMjIFBsb3QgUEMxIHYgUEMyCgpgYGB7ciBvcmlnaW5hbF9wY2F9CmNvbmRudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3IoZGVzaWduJFN0aW11bGF0aW9uKSkKY29uZG51bSA8LSBpZmVsc2UoY29uZG51bT09NCwgImdyZWVuIiwKICAgICAgICAgICBpZmVsc2UoY29uZG51bT09MywgImxpZ2h0Ymx1ZSIsCiAgICAgICAgICAgaWZlbHNlKGNvbmRudW09PTIsICJwaW5rIiwKICAgICAgICAgICBpZmVsc2UoY29uZG51bT09MSwgInB1cnBsZSIsICJibGFjayIpKSkpCnBhdG51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkZXNpZ24kUGF0aWVudCkpCnBhdG51bSA8LSBpZmVsc2UocGF0bnVtPT00LCAyMSwKICAgICAgICAgIGlmZWxzZShwYXRudW09PTMsIDIyLAogICAgICAgICAgaWZlbHNlKHBhdG51bT09MiwgMjMsCiAgICAgICAgICBpZmVsc2UocGF0bnVtPT0xLCAyNCwKICAgICAgICAgIGlmZWxzZShwYXRudW09PTUsIDI1LCAxKSkpKSkKY2JjYlNFUTo6cGxvdFBDKHMkdiwgcyRkLCBjb2w9ImJsYWNrIiwgcGNoPXBhdG51bSwgYmc9Y29uZG51bSkKbGVnZW5kKHg9MC4yLCB5PTAuMiwgbGVnZW5kPXVuaXF1ZShkZXNpZ24kU3RpbXVsYXRpb24pLCBwY2g9MjIsIGNvbD0wLAogICAgICAgcHQuYmc9YygiZ3JlZW4iLCJsaWdodGJsdWUiLCJwaW5rIiwicHVycGxlIiksIHB0LmNleD0xLjUsIGNleD0wLjUsIGJ0eT0ibiIpCmxlZ2VuZCh4PTAuMiwgeT0tMC4xLCBsZWdlbmQ9dW5pcXVlKGRlc2lnbiRQYXRpZW50KSwgcGNoPXVuaXF1ZShwYXRudW0pLCBjb2w9MCwKICAgICAgIHB0LmJnPSJncmF5OTAiLCBwdC5jZXg9MS41LCBjZXg9MC41LCBidHk9Im4iKQoKCgpzdGltX2NvbmRudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3Ioc3RpbV9kZXNpZ24kU3RpbXVsYXRpb24pKQpzdGltX2NvbmRudW0gPC0gaWZlbHNlKHN0aW1fY29uZG51bT09NCwgImdyZWVuIiwKICAgICAgICAgICBpZmVsc2Uoc3RpbV9jb25kbnVtPT0zLCAibGlnaHRibHVlIiwKICAgICAgICAgICBpZmVsc2Uoc3RpbV9jb25kbnVtPT0yLCAicGluayIsCiAgICAgICAgICAgaWZlbHNlKHN0aW1fY29uZG51bT09MSwgInB1cnBsZSIsICJibGFjayIpKSkpCnN0aW1fcGF0bnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKHN0aW1fZGVzaWduJFBhdGllbnQpKQpzdGltX3BhdG51bSA8LSBpZmVsc2Uoc3RpbV9wYXRudW09PTQsIDIxLAogICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT0zLCAyMiwKICAgICAgICAgIGlmZWxzZShzdGltX3BhdG51bT09MiwgMjMsCiAgICAgICAgICBpZmVsc2Uoc3RpbV9wYXRudW09PTEsIDI0LAogICAgICAgICAgaWZlbHNlKHN0aW1fcGF0bnVtPT01LCAyNSwgMSkpKSkpCmNiY2JTRVE6OnBsb3RQQyhzdGltX3Mkdiwgc3RpbV9zJGQsIGNvbD0iYmxhY2siLCBwY2g9c3RpbV9wYXRudW0sIGJnPXN0aW1fY29uZG51bSkKbGVnZW5kKHg9MC4yLCB5PTAuMiwgbGVnZW5kPXVuaXF1ZShzdGltX2Rlc2lnbiRTdGltdWxhdGlvbiksIHBjaD0yMiwgY29sPTAsCiAgICAgICBwdC5iZz1jKCJncmVlbiIsImxpZ2h0Ymx1ZSIsInBpbmsiLCJwdXJwbGUiKSwgcHQuY2V4PTEuNSwgY2V4PTAuNSwgYnR5PSJuIikKbGVnZW5kKHg9MC4yLCB5PS0wLjEsIGxlZ2VuZD11bmlxdWUoc3RpbV9kZXNpZ24kUGF0aWVudCksIHBjaD11bmlxdWUoc3RpbV9wYXRudW0pLCBjb2w9MCwKICAgICAgIHB0LmJnPSJncmF5OTAiLCBwdC5jZXg9MS41LCBjZXg9MC41LCBidHk9Im4iKQpgYGAKCmBgYHtyIG15X3BjYX0KaHNfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc19leHB0LCBub3JtPSJxdWFudCIsIGZpbHRlcj0iY2JjYiIsIHRyYW5zZm9ybT0ibG9nMiIpCm15X3BjYSA8LSBwbG90X3BjYShoc19ub3JtLCBwbG90X2xhYmVscz1GQUxTRSwgY2lzPU5VTEwpCm15X3BjYSRwbG90Cgpoc3N0aW1fbm9ybSA8LSBub3JtYWxpemVfZXhwdChzdGltX2V4cHQsIG5vcm09InF1YW50IiwgZmlsdGVyPSJjYmNiIiwgdHJhbnNmb3JtPSJsb2cyIikKc3RpbV9wY2EgPC0gcGxvdF9wY2EoaHNzdGltX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFLCBjaXM9TlVMTCkKc3RpbV9wY2EkcGxvdApgYGAKCiMjIEV1Y2xpZGlhbiBEaXN0YW5jZSBIZWF0IE1hcAoKYGBge3IgZGlzaGVhdH0KZGlzdHMgPC0gZGlzdCh0KGNvdW50cykpCm1hdCA8LSBhcy5tYXRyaXgoZGlzdHMpCnJvd25hbWVzKG1hdCkgPC0gY29sbmFtZXMobWF0KSA8LSBjb25kCmhtY29sIDwtIGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbCg5LCAiR25CdSIpKSgxMDApCnZlYy5wYXRpZW50IDwtIHJhaW5ib3cobmxldmVscyhkZXNpZ24kUGF0aWVudCksIHN0YXJ0PTAsIGVuZD0uOCkKcGF0aWVudC5jb2xvciA8LSByZXAoMCwgbGVuZ3RoKGRlc2lnbiRQYXRpZW50KSkKZm9yIChpIGluIDE6bGVuZ3RoKGRlc2lnbiRQYXRpZW50KSkKICAgIHBhdGllbnQuY29sb3JbaV0gPC0gdmVjLnBhdGllbnRbZGVzaWduJFBhdGllbnRbaV09PWxldmVscyhkZXNpZ24kUGF0aWVudCldCnZlYy5jb25kaXRpb24gPC0gYygiZ3JlZW4iLCAibGlnaHRibHVlIiwgInBpbmsiLCAicHVycGxlIikKY29uZGl0aW9uLmNvbG9yIDwtIHJlcCgwLCBsZW5ndGgoZGVzaWduJFN0aW11bGF0aW9uKSkKZm9yIChpIGluIDE6bGVuZ3RoKGRlc2lnbiRTdGltdWxhdGlvbikpCiAgICBjb25kaXRpb24uY29sb3JbaV0gPC0gdmVjLmNvbmRpdGlvbltkZXNpZ24kU3RpbXVsYXRpb25baV09PWxldmVscyhkZXNpZ24kU3RpbXVsYXRpb24pXQoKaGVhdG1hcCA8LSBoZWF0bWFwLjIobWF0LCB0cmFjZT0ibm9uZSIsIGNvbCA9IHJldihobWNvbCksIG1hcmdpbj1jKDExLCAxMSksIENvbFNpZGVDb2xvcnM9Y29uZGl0aW9uLmNvbG9yLAogICAgICAgICAgICAgICAgICAgICBSb3dTaWRlQ29sb3JzPXBhdGllbnQuY29sb3IsIGtleT0iRkFMU0UiLCBzcnRDb2w9NDUpCgoKc3RpbV9kaXN0cyA8LSBkaXN0KHQoc3RpbV9jb3VudHMpKQpzdGltX21hdCA8LSBhcy5tYXRyaXgoc3RpbV9kaXN0cykKcm93bmFtZXMoc3RpbV9tYXQpIDwtIGNvbG5hbWVzKHN0aW1fbWF0KSA8LSBzdGltX2NvbmQKc3RpbV9obWNvbCA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoOSwgIkduQnUiKSkoMTAwKQpzdGltX3ZlYy5wYXRpZW50IDwtIHJhaW5ib3cobmxldmVscyhzdGltX2Rlc2lnbiRQYXRpZW50KSwgc3RhcnQ9MCwgZW5kPS44KQpzdGltX3BhdGllbnQuY29sb3IgPC0gcmVwKDAsIGxlbmd0aChzdGltX2Rlc2lnbiRQYXRpZW50KSkKZm9yIChpIGluIDE6bGVuZ3RoKHN0aW1fZGVzaWduJFBhdGllbnQpKQogICAgc3RpbV9wYXRpZW50LmNvbG9yW2ldIDwtIHN0aW1fdmVjLnBhdGllbnRbc3RpbV9kZXNpZ24kUGF0aWVudFtpXT09bGV2ZWxzKHN0aW1fZGVzaWduJFBhdGllbnQpXQpzdGltX3ZlYy5jb25kaXRpb24gPC0gYygiZ3JlZW4iLCAibGlnaHRibHVlIiwgInBpbmsiLCAicHVycGxlIikKc3RpbV9jb25kaXRpb24uY29sb3IgPC0gcmVwKDAsIGxlbmd0aChzdGltX2Rlc2lnbiRTdGltdWxhdGlvbikpCmZvciAoaSBpbiAxOmxlbmd0aChzdGltX2Rlc2lnbiRTdGltdWxhdGlvbikpCiAgICBzdGltX2NvbmRpdGlvbi5jb2xvcltpXSA8LSBzdGltX3ZlYy5jb25kaXRpb25bc3RpbV9kZXNpZ24kU3RpbXVsYXRpb25baV09PWxldmVscyhzdGltX2Rlc2lnbiRTdGltdWxhdGlvbildCmhlYXRtYXAgPC0gaGVhdG1hcC4yKHN0aW1fbWF0LCB0cmFjZT0ibm9uZSIsIGNvbCA9IHJldihobWNvbCksIG1hcmdpbj1jKDExLCAxMSksCiAgICAgICAgICAgICAgICAgICAgIENvbFNpZGVDb2xvcnM9c3RpbV9jb25kaXRpb24uY29sb3IsCiAgICAgICAgICAgICAgICAgICAgIFJvd1NpZGVDb2xvcnM9c3RpbV9wYXRpZW50LmNvbG9yLCBrZXk9IkZBTFNFIiwgc3J0Q29sPTQ1KQpgYGAKCmBgYHtyIG15X2Rpc2hlYXR9Cm15X2Rpc2hlYXQgPC0gcGxvdF9kaXNoZWF0KGhzX25vcm0pCgpzdGltX2Rpc2hlYXQgPC0gcGxvdF9kaXNoZWF0KGhzc3RpbV9ub3JtKQpgYGAKCiMjIENvcnJlY3QgZm9yIFBhdGllbnQgaW4gTGltbWEgbW9kZWwKCmBgYHtyfQptb2QgPC0gbW9kZWwubWF0cml4KH5kZXNpZ24kUGF0aWVudCkKdiA8LSB2b29tKGNvdW50c1N1YlEsIG1vZCkKZml0IDwtIGxtRml0KHYpCm5ld0RhdGEgPC0gcmVzaWR1YWxzKGZpdCwgdikKcyA8LSBtYWtlU1ZEKG5ld0RhdGEpCnBjUmVzKHMkdiwgcyRkLCBjb25kLCBkZXNpZ24kQmF0Y2gpWzE6NSwgXQpwY1JlcyhzJHYsIHMkZCwgY29uZCwgZGVzaWduJFBhdGllbnQpWzE6NSwgXQoKc3RpbV90YWJsZSA8LSB0YWJsZShzdGltX2Rlc2lnbiRTdGltdWxhdGlvbikKc3RpbV9jb3VudHMgPC0gZmlsdGVyQ291bnRzKHN0aW1fY291bnRzLCB0aHJlc2g9MiwgbWluU2FtcGxlcz1taW4oc3RpbV90YWJsZSkpCmRpbShzdGltX2NvdW50cykKc3RpbV9jb3VudHNTdWJRIDwtIHFOb3JtKHN0aW1fY291bnRzKQpzdGltX21vZCA8LSBtb2RlbC5tYXRyaXgofnN0aW1fZGVzaWduJFBhdGllbnQpCnN0aW1fdiA8LSB2b29tKHN0aW1fY291bnRzU3ViUSwgc3RpbV9tb2QpCnN0aW1fZml0IDwtIGxtRml0KHN0aW1fdikKc3RpbV9uZXdEYXRhIDwtIHJlc2lkdWFscyhzdGltX2ZpdCwgc3RpbV92KQpzdGltX3MgPC0gbWFrZVNWRChzdGltX25ld0RhdGEpCnBjUmVzKHN0aW1fcyR2LCBzdGltX3MkZCwgc3RpbV9jb25kLCBzdGltX2Rlc2lnbiRCYXRjaClbMTo1LCBdCnBjUmVzKHN0aW1fcyR2LCBzdGltX3MkZCwgc3RpbV9jb25kLCBzdGltX2Rlc2lnbiRQYXRpZW50KVsxOjUsIF0KYGBgCgojIyBQbG90IFBDMSBhbmQgUEMyIHdpdGggcGF0aWVudCBjb3JyZWN0aW9uCgpgYGB7cn0KZ3JvbnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKGRlc2lnbiRHcm93dGgpKQpncm9udW0gPC0gaWZlbHNlKGdyb251bT09MiwgMTksCiAgICAgICAgICAgICAgICAgaWZlbHNlKGdyb251bT09MSwgMTUsIDEpKQpwYXRudW0gPC0gYXMubnVtZXJpYyhhcy5mYWN0b3IoZGVzaWduJFBhdGllbnQpKQpwYXRudW0gPC0gaWZlbHNlKHBhdG51bT09MSwgInBpbmsiLAogICAgICAgICAgICAgICAgaWZlbHNlKHBhdG51bT09MiwgImdyZWVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHBhdG51bT09MywgImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocGF0bnVtPT00LCAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocGF0bnVtPT01LCAiYmxhY2siLCAib3JhbmdlIikpKSkpCnNhbXBsZW51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkZXNpZ24kU3RpbXVsYXRpb24pKQpzYW1wbGVudW0gPC0gaWZlbHNlKHNhbXBsZW51bT09NCwgImdyZWVuIiwKICAgICAgICAgICAgICAgIGlmZWxzZShzYW1wbGVudW09PTMsICJibHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNhbXBsZW51bT09MSwgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNhbXBsZW51bT09MiwgInllbGxvdyIsICJncmV5IikpKSkKcGxvdFBDKHMkdiwgcyRkLCBwY2g9Z3JvbnVtLCBjb2w9c2FtcGxlbnVtLCBjZXg9MikKbGVnZW5kKHg9MC4wNSwgeT0wLjMsIGxlZ2VuZD1jKCJOUyIsICJMUFMiLCAiTFAiLCAiTEEiKSwgcGNoPTIyLCBjb2w9MCwKICAgICAgIHB0LmJnPWMoImdyZWVuIiwgImJsdWUiLCAiYmxhY2siLCAieWVsbG93IiksIHB0LmNleD0xLjUsIGNleD0xLCBidHk9Im4iKQpsZWdlbmQoeD0wLjA1LCB5PTAuMSwgbGVnZW5kPXVuaXF1ZShkZXNpZ24kR3Jvd3RoKSwgcGNoPXVuaXF1ZShncm9udW0pLCBjb2w9ImJsYWNrIiwKICAgICAgIHB0LmJnPSJibGFjayIsIHB0LmNleD0xLjAsIGNleD0xLCBidHk9Im4iKQoKCnN0aW1fZ3JvbnVtIDwtIGFzLm51bWVyaWMoYXMuZmFjdG9yKHN0aW1fZGVzaWduJEdyb3d0aCkpCnN0aW1fZ3JvbnVtIDwtIGlmZWxzZShzdGltX2dyb251bT09MiwgMTksCiAgICAgICAgICAgICAgIGlmZWxzZShzdGltX2dyb251bT09MSwgMTUsIDEpKQpzdGltX3BhdG51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihzdGltX2Rlc2lnbiRQYXRpZW50KSkKc3RpbV9wYXRudW0gPC0gaWZlbHNlKHN0aW1fcGF0bnVtPT0xLCAicGluayIsCiAgICAgICAgICAgICAgICBpZmVsc2Uoc3RpbV9wYXRudW09PTIsICJncmVlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdGltX3BhdG51bT09MywgImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RpbV9wYXRudW09PTQsICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdGltX3BhdG51bT09NSwgImJsYWNrIiwgIm9yYW5nZSIpKSkpKQpzdGltX3NhbXBsZW51bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihzdGltX2Rlc2lnbiRTdGltdWxhdGlvbikpCnN0aW1fc2FtcGxlbnVtIDwtIGlmZWxzZShzdGltX3NhbXBsZW51bT09MywgImdyZWVuIiwKICAgICAgICAgICAgICAgIGlmZWxzZShzdGltX3NhbXBsZW51bT09MiwgImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RpbV9zYW1wbGVudW09PTEsICJibGFjayIsICJncmV5IikpKQpwbG90UEMoc3RpbV9zJHYsIHN0aW1fcyRkLCBwY2g9c3RpbV9ncm9udW0sIGNvbD1zdGltX3NhbXBsZW51bSwgY2V4PTIpCmxlZ2VuZCh4PTAuMDUsIHk9MC4zLCBsZWdlbmQ9YygiTFBTIiwgIkxQIiwgIkxBIiksIHBjaD0yMiwgY29sPTAsCiAgICAgICBwdC5iZz1jKCJncmVlbiIsICJibHVlIiwgImJsYWNrIiwgInllbGxvdyIpLCBwdC5jZXg9MS41LCBjZXg9MSwgYnR5PSJuIikKbGVnZW5kKHg9MC4wNSwgeT0wLjEsIGxlZ2VuZD11bmlxdWUoc3RpbV9kZXNpZ24kR3Jvd3RoKSwgcGNoPXVuaXF1ZShzdGltX2dyb251bSksIGNvbD0iYmxhY2siLAogICAgICAgcHQuYmc9ImJsYWNrIiwgcHQuY2V4PTEuMCwgY2V4PTEsIGJ0eT0ibiIpCmBgYAoKIyMgTXkgRmlndXJlIDNBCgpgYGB7ciBteV9wY2EyfQojI3N0aW1fY291bnRzIDwtIGZpbHRlckNvdW50cyhzdGltX2NvdW50cywgdGhyZXNoPTEsIG1pblNhbXBsZXM9bWluKHgpKQojI2RpbShzdGltX2NvdW50cykKIyNzdGltX2NvdW50c1N1YlEgPC0gcU5vcm0oc3RpbV9jb3VudHMpCiMjc3RpbV94IDwtIGxvZzJDUE0oc3RpbV9jb3VudHNTdWJRKQojI3N0aW1fcyA8LSBtYWtlU1ZEKHN0aW1feCR5KQpoc3MgPC0gc2V0X2V4cHRfYmF0Y2hlcyhzdGltX2V4cHQsIGZhY3Q9InBhdGllbnQiKQpoc3MgPC0gc20obm9ybWFsaXplX2V4cHQoaHNzLCBmaWx0ZXI9VFJVRSkpCmhzcyA8LSBzbShub3JtYWxpemVfZXhwdChoc3MsIG5vcm09InF1YW50IikpCmhzcyA8LSBzbShub3JtYWxpemVfZXhwdChoc3MsIGNvbnZlcnQ9ImNwbSIpKQpoc3MgPC0gc20obm9ybWFsaXplX2V4cHQoaHNzLCB0cmFuc2Zvcm09ImxvZzIiKSkKaHNzIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzcywgYmF0Y2g9ImxpbW1hIikpCmhzcyA8LSBzbShzZXRfZXhwdF9iYXRjaGVzKGhzcywgZmFjdD0iZ3Jvd3RoIikpCnBsb3RfcGNhKGhzcywgcGxvdF9sYWJlbHM9RkFMU0UpJHBsb3QKYGBgCgojIyBIZWF0bWFwIHdpdGggcGF0aWVudCBjb3JyZWN0aW9uPz8KCmBgYHtyfQpkaXN0cyA8LSBkaXN0KHQobmV3RGF0YSkpCm1hdCA8LSBhcy5tYXRyaXgoZGlzdHMpCnJvd25hbWVzKG1hdCkgPC0gY29sbmFtZXMobWF0KSA8LSBjb25kCmhlYXRtYXAgPC0gaGVhdG1hcC4yKG1hdCwgdHJhY2U9Im5vbmUiLCBjb2wgPSByZXYoaG1jb2wpLCBtYXJnaW49YygxMSwgMTEpLAogICAgICAgICAgICAgICAgICAgICBDb2xTaWRlQ29sb3JzPWNvbmRpdGlvbi5jb2xvciwKICAgICAgICAgICAgICAgICAgICAgUm93U2lkZUNvbG9ycz1wYXRpZW50LmNvbG9yLCBrZXk9IkZBTFNFIiwgc3J0Q29sPTQ1KQpgYGAKCiMjIERFIGFuYWx5c2lzCgpgYGB7cn0KY291bnRzU3ViUSA8LSBxTm9ybShjb3VudHMpCnBhdGllbnQgPC0gZGVzaWduJFBhdGllbnQKbW9kIDwtIG1vZGVsLm1hdHJpeCh+MCtjb25kK3BhdGllbnQsIGRhdGE9ZGVzaWduKQp2b29tKGNvdW50c1N1YlEsIG1vZCwgcGxvdD1UUlVFKQoKdiA8LSB2b29tKGNvdW50c1N1YlEsIG1vZCkKZml0IDwtIGxtRml0KHYpCmBgYAoKIyMgTV9MUFMgdiBNX05TCgplQmF5ZXMgZmluZHMgYW4gRi1zdGF0aXN0aWMgZnJvbSB0aGUgc2V0IG9mIHQtc3RhdGlzdGljcyBmb3IgdGhhdCBnZW5lCgpgYGB7cn0KTV9MUFMuTV9OUy5jb250ci5tYXQgPC0gbWFrZUNvbnRyYXN0cyhNX0xQU3ZNX05TPShjb25kTV9MUFMtY29uZE1fTlMpLCBsZXZlbHM9diRkZXNpZ24pCk1fTFBTLk1fTlMuZml0IDwtIGNvbnRyYXN0cy5maXQoZml0LCBNX0xQUy5NX05TLmNvbnRyLm1hdCkKTV9MUFMuTV9OUy5lYiA8LSBlQmF5ZXMoTV9MUFMuTV9OUy5maXQpCk1fTFBTLk1fTlMudG9wVGFiIDwtIHRvcFRhYmxlKE1fTFBTLk1fTlMuZWIsIGNvZWY9Ik1fTFBTdk1fTlMiLCBudW1iZXI9bnJvdyh2JEUpKQpNX0xQUy5NX05TLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xQUy5NX05TLnRvcFRhYiksIE1fTFBTLk1fTlMudG9wVGFiKQpjb2xuYW1lcyhNX0xQUy5NX05TLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xQUy5NX05TLnRvcFRhYikgPC0gYygxOm5yb3coTV9MUFMuTV9OUy50b3BUYWIpKQoKd3JpdGUuY3N2KE1fTFBTLk1fTlMudG9wVGFiLCBmaWxlPSJ0b3BUYWJfTV9MUFN2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2Iiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCmBgYAoKTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1CgpgYGB7cn0KTV9MUFMuTV9OUy5zaWdHZW5lcyA8LSBNX0xQUy5NX05TLnRvcFRhYltNX0xQUy5NX05TLnRvcFRhYiRhZGouUC5WYWwgPDAuMDUsIF0KbGVuZ3RoKE1fTFBTLk1fTlMuc2lnR2VuZXMkSUQpCmBgYAoKRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQoKYGBge3J9Ck1fTFBTLk1fTlMuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoTV9MUFMuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChNX0xQUy5NX05TLnNpZ0dlbmVzRm9sZDEkSUQpCmBgYAoKMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzM7MzNNMzU7MTdNMzU7MTdNMzU7MTdNMzU7MTdNMzU7MTdNMzU7MTdNRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQoKYGBge3J9Ck1fTFBTLk1fTlMuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoTV9MUFMuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChNX0xQUy5NX05TLnNpZ0dlbmVzRm9sZDIkSUQpCmBgYAoKTWFrZSBhbiBNQSBwbG90CgpgYGB7cn0Kc2VsIDwtIE1fTFBTLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8IDAuMDUKdG9wIDwtIE1fTFBTLk1fTlMudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJNX0xQU3ZNX05TIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELCBdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQpgYGAKCkFubm90YXRlIHNpZ0dlbmVzIGxpc3QgdXNpbmcgQmlvbWFydAoKYGBge3J9Ck1fTFBTLk1fTlMuc2lnR2VuZXMgPC0gTV9MUFMuTV9OUy5zaWdHZW5lc1tvcmRlcigtTV9MUFMuTV9OUy5zaWdHZW5lcyRsb2dGQyksIF0KCnNpZ0dlbmVzIDwtIE1fTFBTLk1fTlMuc2lnR2VuZXMKZW5zZW1ibCA8LSB1c2VNYXJ0KCJFTlNFTUJMX01BUlRfRU5TRU1CTCIsIGRhdGFzZXQ9ImhzYXBpZW5zX2dlbmVfZW5zZW1ibCIsIGhvc3Q9Ind3dy5lbnNlbWJsLm9yZyIpCmlkcyA8LSBzaWdHZW5lcyRJRAoKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFR19MUFMgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUdfTFBTIDwtIHN1YnNldChERUdfTFBTLCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksIEZTPSIvdCIpCkRFR19MUFMgPC0gREVHX0xQU1tvcmRlcigtREVHX0xQUyRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFR19MUFMgPC0gc3Vic2V0KERFR19MUFMsIGFicyhERUdfTFBTJGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFR19MUFMsICJERUdfTV9MUFN2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAudHh0IiwgY29sLm5hbWVzPVQsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQp3cml0ZS5jc3YoREVHX0xQUywgIkRFR19NX0xQU3ZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikKYGBgCgojIyBNX0xQUyB2IE1fTEEKCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpNX0xQUy5NX0xBLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKE1fTFBTdk1fTEE9KChjb25kTV9MQS1jb25kTV9OUyktKGNvbmRNX0xQUy1jb25kTV9OUykpLCBsZXZlbHM9diRkZXNpZ24pCk1fTFBTLk1fTEEuZml0IDwtIGNvbnRyYXN0cy5maXQoZml0LCBNX0xQUy5NX0xBLmNvbnRyLm1hdCkKTV9MUFMuTV9MQS5lYiA8LSBlQmF5ZXMoTV9MUFMuTV9MQS5maXQpCk1fTFBTLk1fTEEudG9wVGFiIDwtIHRvcFRhYmxlKE1fTFBTLk1fTEEuZWIsIGNvZWY9Ik1fTFBTdk1fTEEiLCBudW1iZXI9bnJvdyh2JEUpKQpNX0xQUy5NX0xBLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xQUy5NX0xBLnRvcFRhYiksIE1fTFBTLk1fTEEudG9wVGFiKQpjb2xuYW1lcyhNX0xQUy5NX0xBLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xQUy5NX0xBLnRvcFRhYikgPC0gYygxOm5yb3coTV9MUFMuTV9MQS50b3BUYWIpKQoKd3JpdGUuY3N2KE1fTFBTLk1fTEEudG9wVGFiLCBmaWxlPSJ0b3BUYWJfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2Iiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpNX0xQUy5NX0xBLnNpZ0dlbmVzIDwtIE1fTFBTLk1fTEEudG9wVGFiW01fTFBTLk1fTEEudG9wVGFiJGFkai5QLlZhbCA8MC4wNSwgXQpsZW5ndGgoTV9MUFMuTV9MQS5zaWdHZW5lcyRJRCkKIyNbMV0gNjE3CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKTV9MUFMuTV9MQS5zaWdHZW5lc0ZvbGQxIDwtIHN1YnNldChNX0xQUy5NX0xBLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMSkKbGVuZ3RoKE1fTFBTLk1fTEEuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gMjQwCgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiA0LWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMikKTV9MUFMuTV9MQS5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChNX0xQUy5NX0xBLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKE1fTFBTLk1fTEEuc2lnR2VuZXNGb2xkMiRJRCkKIyNbMV0gNjkKCiMjTWFrZSBhbiBNQSBwbG90CnNlbCA8LSBNX0xQUy5NX0xBLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBNX0xQUy5NX0xBLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwgIi8iLCBsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iTV9MUFN2TV9MQSBhZGp1c3RlZCIsCiAgICAgeWxhYj0ibG9nIEZDIiwgeGxhYj0iQXZlcmFnZSBFeHByZXNzaW9uIiwKICAgICBzdWI9c3ViKQpwb2ludHMocm93TWVhbnMoY3BtW3RvcCRJRCwgXSlbc2VsXSwgdG9wJGxvZ0ZDW3NlbF0sIGNvbD0icmVkIiwgY2V4PTAuNSkKYWJsaW5lKGg9YygtMSwgMCwgMSksIGNvbD0icmVkIikKCmRldi5jb3B5KHBkZiwgIk1BcGxvdF9NX0xQU3ZNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5wZGYiLCB3aWR0aD04LCBoZWlnaHQ9OCkKZGV2Lm9mZigpCgpkZXYuY29weShwbmcsICJNQXBsb3RfTV9MUFN2TV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYucG5nIiwgd2lkdGg9NzAwLAogICAgICAgICBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCk1fTFBTLk1fTEEuc2lnR2VuZXMgPC0gTV9MUFMuTV9MQS5zaWdHZW5lc1tvcmRlcigtTV9MUFMuTV9MQS5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIE1fTFBTLk1fTEEuc2lnR2VuZXMKZW5zZW1ibCA8LSB1c2VNYXJ0KCJFTlNFTUJMX01BUlRfRU5TRU1CTCIsIGRhdGFzZXQ9ImhzYXBpZW5zX2dlbmVfZW5zZW1ibCIsIGhvc3Q9Ind3dy5lbnNlbWJsLm9yZyIpCmlkcyA8LSBzaWdHZW5lcyRJRAoKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHIDwtIHN1YnNldChERUcsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHIDwtIERFR1tvcmRlcigtREVHJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHIDwtIHN1YnNldChERUcsIGFicyhERUckbG9nRkMpPjEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHLCAiREVHX01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnR4dCIsIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19NX0xQU3ZNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikKYGBgCgojIyBNX0xQUyB2IE1fTFAKCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpNX0xQUy5NX0xQLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKE1fTFBTdk1fTFA9KChjb25kTV9MUC1jb25kTV9OUyktKGNvbmRNX0xQUy1jb25kTV9OUykpLCBsZXZlbHM9diRkZXNpZ24pCk1fTFBTLk1fTFAuZml0IDwtIGNvbnRyYXN0cy5maXQoZml0LCBNX0xQUy5NX0xQLmNvbnRyLm1hdCkKTV9MUFMuTV9MUC5lYiA8LSBlQmF5ZXMoTV9MUFMuTV9MUC5maXQpCk1fTFBTLk1fTFAudG9wVGFiIDwtIHRvcFRhYmxlKE1fTFBTLk1fTFAuZWIsIGNvZWY9Ik1fTFBTdk1fTFAiLCBudW1iZXI9bnJvdyh2JEUpKQpNX0xQUy5NX0xQLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xQUy5NX0xQLnRvcFRhYiksIE1fTFBTLk1fTFAudG9wVGFiKQpjb2xuYW1lcyhNX0xQUy5NX0xQLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xQUy5NX0xQLnRvcFRhYikgPC0gYygxOm5yb3coTV9MUFMuTV9MUC50b3BUYWIpKQoKd3JpdGUuY3N2KE1fTFBTLk1fTFAudG9wVGFiLCBmaWxlPSJ0b3BUYWJfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2IiwKICAgICAgICAgIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQoKIyNMaW1pdCBsaXN0IHRvIGdlbmVzIHdpdGggYW4gYWRqdXN0ZWQgcCB2YWx1ZSA8IDAuMDUKTV9MUFMuTV9MUC5zaWdHZW5lcyA8LSBNX0xQUy5NX0xQLnRvcFRhYltNX0xQUy5NX0xQLnRvcFRhYiRhZGouUC5WYWwgPDAuMDUsIF0KbGVuZ3RoKE1fTFBTLk1fTFAuc2lnR2VuZXMkSUQpCiMjWzFdIDE0NzMKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQpNX0xQUy5NX0xQLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KE1fTFBTLk1fTFAuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAxKQpsZW5ndGgoTV9MUFMuTV9MUC5zaWdHZW5lc0ZvbGQxJElEKQojI1sxXSA0NjcKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQpNX0xQUy5NX0xQLnNpZ0dlbmVzRm9sZDIgPC0gc3Vic2V0KE1fTFBTLk1fTFAuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoTV9MUFMuTV9MUC5zaWdHZW5lc0ZvbGQyJElEKQojI1sxXSAxMjUKCiMjTWFrZSBhbiBNQSBwbG90CnNlbCA8LSBNX0xQUy5NX0xQLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBNX0xQUy5NX0xQLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwiLyIsbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49Ik1fTFBTdk1fTFAgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsIF0pW3NlbF0sIHRvcCRsb2dGQ1tzZWxdLCBjb2w9InJlZCIsIGNleD0wLjUpCmFibGluZShoPWMoLTEsIDAsIDEpLCBjb2w9InJlZCIpCgpkZXYuY29weShwZGYsICJNQXBsb3RfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQoKZGV2LmNvcHkocG5nLCAiTUFwbG90X01fTFBTdk1fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnBuZyIsIHdpZHRoPTcwMCwKICAgICAgICAgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCgpNX0xQUy5NX0xQLnNpZ0dlbmVzIDwtIE1fTFBTLk1fTFAuc2lnR2VuZXNbb3JkZXIoLU1fTFBTLk1fTFAuc2lnR2VuZXMkbG9nRkMpLCBdCgojI0Fubm90YXRlIHNpZ0dlbmVzIGxpc3QgdXNpbmcgQmlvbWFydApzaWdHZW5lcyA8LSBNX0xQUy5NX0xQLnNpZ0dlbmVzCmVuc2VtYmwgPC0gdXNlTWFydCgiRU5TRU1CTF9NQVJUX0VOU0VNQkwiLCBkYXRhc2V0PSJoc2FwaWVuc19nZW5lX2Vuc2VtYmwiLCBob3N0PSJ3d3cuZW5zZW1ibC5vcmciKQppZHMgPC0gc2lnR2VuZXMkSUQKCiMjVG8gc2VlIHBvc3NpYmlsaXRpZXMgZm9yIGF0dHJpYnV0ZXMsIHVzZSBoZWFkKGxpc3RBdHRyaWJ1dGVzKGVuc2VtYmwpLCBuPTIwTCkKZGVzYyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKSwgZmlsdGVycz0iZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICB2YWx1ZXM9aWRzLCBtYXJ0PWVuc2VtYmwpCmNvbG5hbWVzKGRlc2MpPWMoIklEIiwgIlN5bWJvbCIsICJEZXNjcmlwdGlvbiIsICJUeXBlIikKCiMjUmVtb3ZlIGNvbW1hcyBmcm9tIGRlc2NyaXB0aW9uCmRlc2MkRGVzY3JpcHRpb24gPC0gZ3N1YigiLCIsICIiLCBkZXNjJERlc2NyaXB0aW9uKQoKREVHIDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHIDwtIHN1YnNldChERUcsIHNlbGVjdD1jKElELCBTeW1ib2wsIERlc2NyaXB0aW9uLCBsb2dGQywgYWRqLlAuVmFsLCBBdmVFeHByLCBUeXBlKSwgRlM9Ii90IikKREVHIDwtIERFR1tvcmRlcigtREVHJGxvZ0ZDKSwgXQoKIyNGaWx0ZXIgb3V0IEdlbmVzIC0xPEZDPDEKREVHIDwtIHN1YnNldChERUcsIGFicyhERUckbG9nRkMpPjEpCgojI1NhdmUgREUgZ2VuZXMKd3JpdGUudGFibGUoREVHLCAiREVHX01fTFBTdk1fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwcmV2LnR4dCIsIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19NX0xQU3ZNX0xQX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMHJldi5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikKYGBgCgojIyBNX0xQIHYgTV9OUwoKYGBge3J9CiMjZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpNX0xQLk1fTlMuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoTV9MUHZNX05TPShjb25kTV9MUC1jb25kTV9OUyksIGxldmVscz12JGRlc2lnbikKTV9MUC5NX05TLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgTV9MUC5NX05TLmNvbnRyLm1hdCkKTV9MUC5NX05TLmViIDwtIGVCYXllcyhNX0xQLk1fTlMuZml0KQpNX0xQLk1fTlMudG9wVGFiIDwtIHRvcFRhYmxlKE1fTFAuTV9OUy5lYiwgY29lZj0iTV9MUHZNX05TIiwgbnVtYmVyPW5yb3codiRFKSkKTV9MUC5NX05TLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhNX0xQLk1fTlMudG9wVGFiKSwgTV9MUC5NX05TLnRvcFRhYikKY29sbmFtZXMoTV9MUC5NX05TLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhNX0xQLk1fTlMudG9wVGFiKSA8LSBjKDE6bnJvdyhNX0xQLk1fTlMudG9wVGFiKSkKCndyaXRlLmNzdihNX0xQLk1fTlMudG9wVGFiLCBmaWxlPSJ0b3BUYWJfTV9MUHZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTAxOC5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikKCiMjTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1Ck1fTFAuTV9OUy5zaWdHZW5lcyA8LSBNX0xQLk1fTlMudG9wVGFiW01fTFAuTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwwLjA1LCBdCmxlbmd0aChNX0xQLk1fTlMuc2lnR2VuZXMkSUQpCiMjWzFdIDQzODYKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQpNX0xQLk1fTlMuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoTV9MUC5NX05TLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMSkKbGVuZ3RoKE1fTFAuTV9OUy5zaWdHZW5lc0ZvbGQxJElEKQojI1sxXSAxNDU1CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiA0LWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMikKTV9MUC5NX05TLnNpZ0dlbmVzRm9sZDIgPC0gc3Vic2V0KE1fTFAuTV9OUy5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDIpCmxlbmd0aChNX0xQLk1fTlMuc2lnR2VuZXNGb2xkMiRJRCkKIyNbMV0gNTE5CgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gTV9MUC5NX05TLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBNX0xQLk1fTlMudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCAiLyIsIGxlbmd0aChzZWwpKQpjcG0gPC0gdiRFCgpwbG90KHJvd01lYW5zKGNwbVt0b3AkSUQsXSksIHRvcCRsb2dGQywgcGNoPTE2LCBjZXg9MC41LCBjb2w9ImRhcmtncmV5IiwKICAgICBtYWluPSJNX0xQdk1fTlMgYWRqdXN0ZWQiLAogICAgIHlsYWI9ImxvZyBGQyIsIHhsYWI9IkF2ZXJhZ2UgRXhwcmVzc2lvbiIsCiAgICAgc3ViPXN1YikKcG9pbnRzKHJvd01lYW5zKGNwbVt0b3AkSUQsXSlbc2VsXSwgdG9wJGxvZ0ZDW3NlbF0sIGNvbD0icmVkIiwgY2V4PTAuNSkKYWJsaW5lKGg9YygtMSwgMCwgMSksIGNvbD0icmVkIikKCmRldi5jb3B5KHBkZiwgIk1BcGxvdF9NX0xQdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDE4LnBkZiIsIHdpZHRoPTgsIGhlaWdodD04KQpkZXYub2ZmKCkKCmRldi5jb3B5KHBuZywgIk1BcGxvdF9NX0xQdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDE4LnBuZyIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCgpNX0xQLk1fTlMuc2lnR2VuZXMgPC0gTV9MUC5NX05TLnNpZ0dlbmVzW29yZGVyKC1NX0xQLk1fTlMuc2lnR2VuZXMkbG9nRkMpLCBdCgojI0Fubm90YXRlIHNpZ0dlbmVzIGxpc3QgdXNpbmcgQmlvbWFydApzaWdHZW5lcyA8LSBNX0xQLk1fTlMuc2lnR2VuZXMKZW5zZW1ibCA8LSB1c2VNYXJ0KCJFTlNFTUJMX01BUlRfRU5TRU1CTCIsIGRhdGFzZXQ9ImhzYXBpZW5zX2dlbmVfZW5zZW1ibCIsIGhvc3Q9Ind3dy5lbnNlbWJsLm9yZyIpCmlkcyA8LSBzaWdHZW5lcyRJRAoKIyNUbyBzZWUgcG9zc2liaWxpdGllcyBmb3IgYXR0cmlidXRlcywgdXNlIGhlYWQobGlzdEF0dHJpYnV0ZXMoZW5zZW1ibCksIG49MjBMKQpkZXNjIDwtIGdldEJNKGF0dHJpYnV0ZXM9YygiZW5zZW1ibF9nZW5lX2lkIiwgImhnbmNfc3ltYm9sIiwgImRlc2NyaXB0aW9uIiwgImdlbmVfYmlvdHlwZSIpLCBmaWx0ZXJzPSJlbnNlbWJsX2dlbmVfaWQiLAogICAgICAgICAgICAgIHZhbHVlcz1pZHMsIG1hcnQ9ZW5zZW1ibCkKY29sbmFtZXMoZGVzYyk9YygiSUQiLCAiU3ltYm9sIiwgIkRlc2NyaXB0aW9uIiwgIlR5cGUiKQoKIyNSZW1vdmUgY29tbWFzIGZyb20gZGVzY3JpcHRpb24KZGVzYyREZXNjcmlwdGlvbiA8LSBnc3ViKCIsIiwgIiIsIGRlc2MkRGVzY3JpcHRpb24pCgpERUdfTFA0IDwtIG1lcmdlKHNpZ0dlbmVzLCBkZXNjLCBieT0iSUQiLCBhbGw9VFJVRSkKREVHX0xQNCA8LSBzdWJzZXQoREVHX0xQNCwgc2VsZWN0PWMoSUQsIFN5bWJvbCwgRGVzY3JpcHRpb24sIGxvZ0ZDLCBhZGouUC5WYWwsIEF2ZUV4cHIsIFR5cGUpLCBGUz0iL3QiKQpERUdfTFA0IDwtIERFR19MUDRbb3JkZXIoLURFR19MUDQkbG9nRkMpLCBdCgojI0ZpbHRlciBvdXQgR2VuZXMgLTE8RkM8MQpERUdfTFA0IDwtIHN1YnNldChERUdfTFA0LCBhYnMoREVHX0xQNCRsb2dGQyk+MSkKCiMjU2F2ZSBERSBnZW5lcwp3cml0ZS50YWJsZShERUdfTFA0LCAiREVHX01fTFB2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMTgudHh0IiwgY29sLm5hbWVzPVQsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQp3cml0ZS5jc3YoREVHX0xQNCwgIkRFR19NX0xQdk1fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDE4LmNzdiIsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQpgYGAKCiMjIE1fTEEgdiBNX05TCgpgYGB7cn0KI2VCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKTV9MQS5NX05TLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKE1fTEF2TV9OUz0oY29uZE1fTEEtY29uZE1fTlMpLCBsZXZlbHM9diRkZXNpZ24pCk1fTEEuTV9OUy5maXQgPC0gY29udHJhc3RzLmZpdChmaXQsIE1fTEEuTV9OUy5jb250ci5tYXQpCk1fTEEuTV9OUy5lYiA8LSBlQmF5ZXMoTV9MQS5NX05TLmZpdCkKTV9MQS5NX05TLnRvcFRhYiA8LSB0b3BUYWJsZShNX0xBLk1fTlMuZWIsIGNvZWY9Ik1fTEF2TV9OUyIsIG51bWJlcj1ucm93KHYkRSkpCk1fTEEuTV9OUy50b3BUYWIgPC0gY2JpbmQocm93bmFtZXMoTV9MQS5NX05TLnRvcFRhYiksIE1fTEEuTV9OUy50b3BUYWIpCmNvbG5hbWVzKE1fTEEuTV9OUy50b3BUYWIpIDwtIGMoIklEIiwgImxvZ0ZDIiwgIkF2ZUV4cHIiLCAidCIsICJQLlZhbHVlIiwgImFkai5QLlZhbCIsICJCIikKcm93bmFtZXMoTV9MQS5NX05TLnRvcFRhYikgPC0gYygxOm5yb3coTV9MQS5NX05TLnRvcFRhYikpCgp3cml0ZS5jc3YoTV9MQS5NX05TLnRvcFRhYiwgZmlsZT0idG9wVGFiX01fTEF2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2Iiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpNX0xBLk1fTlMuc2lnR2VuZXMgPC0gTV9MQS5NX05TLnRvcFRhYltNX0xBLk1fTlMudG9wVGFiJGFkai5QLlZhbCA8MC4wNSwgXQpsZW5ndGgoTV9MQS5NX05TLnNpZ0dlbmVzJElEKQojI1sxXSA2MTcKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQpNX0xBLk1fTlMuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoTV9MQS5NX05TLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMSkKbGVuZ3RoKE1fTEEuTV9OUy5zaWdHZW5lc0ZvbGQxJElEKQojI1sxXSAyNDAKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQpNX0xBLk1fTlMuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoTV9MQS5NX05TLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKE1fTEEuTV9OUy5zaWdHZW5lc0ZvbGQyJElEKQojI1sxXSA2OQoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIE1fTEEuTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gTV9MQS5NX05TLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwgIi8iLCBsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iTV9MQXZNX05TIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELCBdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiTUFwbG90X01fTEF2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQoKZGV2LmNvcHkocG5nLCAiTUFwbG90X01fTEF2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucG5nIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCk1fTEEuTV9OUy5zaWdHZW5lcyA8LSBNX0xBLk1fTlMuc2lnR2VuZXNbb3JkZXIoLU1fTEEuTV9OUy5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIE1fTEEuTV9OUy5zaWdHZW5lcwplbnNlbWJsIDwtIHVzZU1hcnQoIkVOU0VNQkxfTUFSVF9FTlNFTUJMIiwgZGF0YXNldD0iaHNhcGllbnNfZ2VuZV9lbnNlbWJsIiwgaG9zdD0id3d3LmVuc2VtYmwub3JnIikKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFR19MQTQgPC0gbWVyZ2Uoc2lnR2VuZXMsIGRlc2MsIGJ5PSJJRCIsIGFsbD1UUlVFKQpERUdfTEE0IDwtIHN1YnNldChERUdfTEE0LCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksIEZTPSIvdCIpCkRFR19MQTQgPC0gREVHX0xBNFtvcmRlcigtREVHX0xBNCRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFR19MQTQgPC0gc3Vic2V0KERFR19MQTQsIGFicyhERUdfTEE0JGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFR19MQTQsICJERUdfTV9MQXZNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC50eHQiLCBjb2wubmFtZXM9VCwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCndyaXRlLmNzdihERUdfTEE0LCAiREVHX01fTEF2TV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAuY3N2Iiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCmBgYAoKIyNHTV9MUFMgdi4gR01fTlMKCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpHTV9MUFMuR01fTlMuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoR01fTFBTdkdNX05TPShjb25kR01fTFBTLWNvbmRHTV9OUyksIGxldmVscz12JGRlc2lnbikKR01fTFBTLkdNX05TLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgR01fTFBTLkdNX05TLmNvbnRyLm1hdCkKR01fTFBTLkdNX05TLmViIDwtIGVCYXllcyhHTV9MUFMuR01fTlMuZml0KQpHTV9MUFMuR01fTlMudG9wVGFiIDwtIHRvcFRhYmxlKEdNX0xQUy5HTV9OUy5lYiwgY29lZj0iR01fTFBTdkdNX05TIiwgbnVtYmVyPW5yb3codiRFKSkKR01fTFBTLkdNX05TLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhHTV9MUFMuR01fTlMudG9wVGFiKSwgR01fTFBTLkdNX05TLnRvcFRhYikKY29sbmFtZXMoR01fTFBTLkdNX05TLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhHTV9MUFMuR01fTlMudG9wVGFiKSA8LSBjKDE6bnJvdyhHTV9MUFMuR01fTlMudG9wVGFiKSkKCndyaXRlLmNzdihHTV9MUFMuR01fTlMudG9wVGFiLCBmaWxlPSJ0b3BUYWJfR01fTFBTdkdNX05TX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTEyMC5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikKCiMjTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1CkdNX0xQUy5HTV9OUy5zaWdHZW5lcyA8LSBHTV9MUFMuR01fTlMudG9wVGFiW0dNX0xQUy5HTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwwLjA1LCBdCmxlbmd0aChHTV9MUFMuR01fTlMuc2lnR2VuZXMkSUQpCiMjWzFdIDMwMgoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMi1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDEpCkdNX0xQUy5HTV9OUy5zaWdHZW5lc0ZvbGQxIDwtIHN1YnNldChHTV9MUFMuR01fTlMuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAxKQpsZW5ndGgoR01fTFBTLkdNX05TLnNpZ0dlbmVzRm9sZDEkSUQpCiMjWzFdIDE5NwoKIyNGaWx0ZXIgb3V0IHJvd3Mgd2l0aCBsZXNzIHRoYW4gNC1mb2xkIGNoYW5nZSAobG9nMiBmb2xkIGNoYW5nZSBvZiA+IDIpCkdNX0xQUy5HTV9OUy5zaWdHZW5lc0ZvbGQyIDwtIHN1YnNldChHTV9MUFMuR01fTlMuc2lnR2VuZXMsIGFicyhsb2dGQykgPiAyKQpsZW5ndGgoR01fTFBTLkdNX05TLnNpZ0dlbmVzRm9sZDIkSUQpCiMjWzFdIDEwMQoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIEdNX0xQUy5HTV9OUy50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gR01fTFBTLkdNX05TLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwgIi8iLCBsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iR01fTFBTdkdNX05TIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELCBdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiTUFwbG90X0dNX0xQU3ZHTV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQoKZGV2LmNvcHkocG5nLCAiTUFwbG90X0dNX0xQU3ZHTV9OU19DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucG5nIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCkdNX0xQUy5HTV9OUy5zaWdHZW5lcyA8LSBHTV9MUFMuR01fTlMuc2lnR2VuZXNbb3JkZXIoLUdNX0xQUy5HTV9OUy5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9OUy5zaWdHZW5lcwplbnNlbWJsIDwtIHVzZU1hcnQoIkVOU0VNQkxfTUFSVF9FTlNFTUJMIiwgZGF0YXNldD0iaHNhcGllbnNfZ2VuZV9lbnNlbWJsIiwgaG9zdD0id3d3LmVuc2VtYmwub3JnIikKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFRyA8LSBtZXJnZShzaWdHZW5lcywgZGVzYywgYnk9IklEIiwgYWxsPVRSVUUpCkRFRyA8LSBzdWJzZXQoREVHLCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksIEZTPSIvdCIpCkRFRyA8LSBERUdbb3JkZXIoLURFRyRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFRyA8LSBzdWJzZXQoREVHLCBhYnMoREVHJGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFRywgIkRFR19HTV9MUFN2R01fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19HTV9MUFN2R01fTlNfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLmNzdiIsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQpgYGAKCiMjIEdNX0xQUyB2IEdNX0xQCgpgYGB7cn0KI2VCYXllcyBmaW5kcyBhbiBGLXN0YXRpc3RpYyBmcm9tIHRoZSBzZXQgb2YgdC1zdGF0aXN0aWNzIGZvciB0aGF0IGdlbmUKR01fTFBTLkdNX0xQLmNvbnRyLm1hdCA8LSBtYWtlQ29udHJhc3RzKEdNX0xQU3ZHTV9MUD0oKGNvbmRHTV9MUFMtY29uZEdNX05TKS0oY29uZEdNX0xQLWNvbmRHTV9OUykpLCBsZXZlbHM9diRkZXNpZ24pCkdNX0xQUy5HTV9MUC5maXQgPC0gY29udHJhc3RzLmZpdChmaXQsIEdNX0xQUy5HTV9MUC5jb250ci5tYXQpCkdNX0xQUy5HTV9MUC5lYiA8LSBlQmF5ZXMoR01fTFBTLkdNX0xQLmZpdCkKR01fTFBTLkdNX0xQLnRvcFRhYiA8LSB0b3BUYWJsZShHTV9MUFMuR01fTFAuZWIsIGNvZWY9IkdNX0xQU3ZHTV9MUCIsIG51bWJlcj1ucm93KHYkRSkpCkdNX0xQUy5HTV9MUC50b3BUYWIgPC0gY2JpbmQocm93bmFtZXMoR01fTFBTLkdNX0xQLnRvcFRhYiksIEdNX0xQUy5HTV9MUC50b3BUYWIpCmNvbG5hbWVzKEdNX0xQUy5HTV9MUC50b3BUYWIpIDwtIGMoIklEIiwgImxvZ0ZDIiwgIkF2ZUV4cHIiLCAidCIsICJQLlZhbHVlIiwgImFkai5QLlZhbCIsICJCIikKcm93bmFtZXMoR01fTFBTLkdNX0xQLnRvcFRhYikgPC0gYygxOm5yb3coR01fTFBTLkdNX0xQLnRvcFRhYikpCgp3cml0ZS5jc3YoR01fTFBTLkdNX0xQLnRvcFRhYiwgZmlsZT0idG9wVGFiX0dNX0xQU3ZHTV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzEwMjMuY3N2Iiwgcm93Lm5hbWVzPUYsIHF1b3RlPUYpCgojI0xpbWl0IGxpc3QgdG8gZ2VuZXMgd2l0aCBhbiBhZGp1c3RlZCBwIHZhbHVlIDwgMC4wNQpHTV9MUFMuR01fTFAuc2lnR2VuZXMgPC0gR01fTFBTLkdNX0xQLnRvcFRhYltHTV9MUFMuR01fTFAudG9wVGFiJGFkai5QLlZhbCA8MC4wNSwgXQpsZW5ndGgoR01fTFBTLkdNX0xQLnNpZ0dlbmVzJElEKQojI1sxXSAxOTQKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDItZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAxKQpHTV9MUFMuR01fTFAuc2lnR2VuZXNGb2xkMSA8LSBzdWJzZXQoR01fTFBTLkdNX0xQLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMSkKbGVuZ3RoKEdNX0xQUy5HTV9MUC5zaWdHZW5lc0ZvbGQxJElEKQojI1sxXSAxMTQKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQpHTV9MUFMuR01fTFAuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoR01fTFBTLkdNX0xQLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKEdNX0xQUy5HTV9MUC5zaWdHZW5lc0ZvbGQyJElEKQojI1sxXSAyNwoKIyNNYWtlIGFuIE1BIHBsb3QKc2VsIDwtIEdNX0xQUy5HTV9MUC50b3BUYWIkYWRqLlAuVmFsIDwgMC4wNQp0b3AgPC0gR01fTFBTLkdNX0xQLnRvcFRhYgpzdWIgPC0gcGFzdGUoIk5vLiBvZiBzaWcuIGdlbmVzOiAiLCBzdW0oc2VsKSwgIi8iLCBsZW5ndGgoc2VsKSkKY3BtIDwtIHYkRQoKcGxvdChyb3dNZWFucyhjcG1bdG9wJElELF0pLCB0b3AkbG9nRkMsIHBjaD0xNiwgY2V4PTAuNSwgY29sPSJkYXJrZ3JleSIsCiAgICAgbWFpbj0iR01fTFBTdkdNX0xQIGFkanVzdGVkIiwKICAgICB5bGFiPSJsb2cgRkMiLCB4bGFiPSJBdmVyYWdlIEV4cHJlc3Npb24iLAogICAgIHN1Yj1zdWIpCnBvaW50cyhyb3dNZWFucyhjcG1bdG9wJElELCBdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiTUFwbG90X0dNX0xQU3ZHTV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQoKZGV2LmNvcHkocG5nLCAiTUFwbG90X0dNX0xQU3ZHTV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucG5nIiwgd2lkdGg9NzAwLAogICAgICAgICBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCkdNX0xQUy5HTV9MUC5zaWdHZW5lcyA8LSBHTV9MUFMuR01fTFAuc2lnR2VuZXNbb3JkZXIoLUdNX0xQUy5HTV9MUC5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9MUC5zaWdHZW5lcwplbnNlbWJsIDwtIHVzZU1hcnQoIkVOU0VNQkxfTUFSVF9FTlNFTUJMIiwgZGF0YXNldD0iaHNhcGllbnNfZ2VuZV9lbnNlbWJsIiwgaG9zdD0id3d3LmVuc2VtYmwub3JnIikKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFRyA8LSBtZXJnZShzaWdHZW5lcywgZGVzYywgYnk9IklEIiwgYWxsPVRSVUUpCkRFRyA8LSBzdWJzZXQoREVHLCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksIEZTPSIvdCIpCkRFRyA8LSBERUdbb3JkZXIoLURFRyRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFRyA8LSBzdWJzZXQoREVHLCBhYnMoREVHJGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFRywgIkRFR19HTV9MUFN2R01fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19HTV9MUFN2R01fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLmNzdiIsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQpgYGAKCiMjR01fTFBTIHYgR01fTEEKCmBgYHtyfQojZUJheWVzIGZpbmRzIGFuIEYtc3RhdGlzdGljIGZyb20gdGhlIHNldCBvZiB0LXN0YXRpc3RpY3MgZm9yIHRoYXQgZ2VuZQpHTV9MUFMuR01fTEEuY29udHIubWF0IDwtIG1ha2VDb250cmFzdHMoR01fTFBTdkdNX0xBPSgoY29uZEdNX0xQUy1jb25kR01fTlMpLShjb25kR01fTEEtY29uZEdNX05TKSksIGxldmVscz12JGRlc2lnbikKR01fTFBTLkdNX0xBLmZpdCA8LSBjb250cmFzdHMuZml0KGZpdCwgR01fTFBTLkdNX0xBLmNvbnRyLm1hdCkKR01fTFBTLkdNX0xBLmViIDwtIGVCYXllcyhHTV9MUFMuR01fTEEuZml0KQpHTV9MUFMuR01fTEEudG9wVGFiIDwtIHRvcFRhYmxlKEdNX0xQUy5HTV9MQS5lYiwgY29lZj0iR01fTFBTdkdNX0xBIiwgbnVtYmVyPW5yb3codiRFKSkKR01fTFBTLkdNX0xBLnRvcFRhYiA8LSBjYmluZChyb3duYW1lcyhHTV9MUFMuR01fTEEudG9wVGFiKSwgR01fTFBTLkdNX0xBLnRvcFRhYikKY29sbmFtZXMoR01fTFBTLkdNX0xBLnRvcFRhYikgPC0gYygiSUQiLCAibG9nRkMiLCAiQXZlRXhwciIsICJ0IiwgIlAuVmFsdWUiLCAiYWRqLlAuVmFsIiwgIkIiKQpyb3duYW1lcyhHTV9MUFMuR01fTEEudG9wVGFiKSA8LSBjKDE6bnJvdyhHTV9MUFMuR01fTEEudG9wVGFiKSkKCndyaXRlLmNzdihHTV9MUFMuR01fTEEudG9wVGFiLCBmaWxlPSJ0b3BUYWJfR01fTFBTdkdNX0xBX0NEU19saW1tYWJhdGNoY29ycmVjdGlvbl8yMDE3MTAyMy5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikKCiMjTGltaXQgbGlzdCB0byBnZW5lcyB3aXRoIGFuIGFkanVzdGVkIHAgdmFsdWUgPCAwLjA1CkdNX0xQUy5HTV9MQS5zaWdHZW5lcyA8LSBHTV9MUFMuR01fTEEudG9wVGFiW0dNX0xQUy5HTV9MQS50b3BUYWIkYWRqLlAuVmFsIDwwLjA1LCBdCmxlbmd0aChHTV9MUFMuR01fTEEuc2lnR2VuZXMkSUQpCiMjWzFdIDE3CgojI0ZpbHRlciBvdXQgcm93cyB3aXRoIGxlc3MgdGhhbiAyLWZvbGQgY2hhbmdlIChsb2cyIGZvbGQgY2hhbmdlIG9mID4gMSkKR01fTFBTLkdNX0xBLnNpZ0dlbmVzRm9sZDEgPC0gc3Vic2V0KEdNX0xQUy5HTV9MQS5zaWdHZW5lcywgYWJzKGxvZ0ZDKSA+IDEpCmxlbmd0aChHTV9MUFMuR01fTEEuc2lnR2VuZXNGb2xkMSRJRCkKIyNbMV0gMTUKCiMjRmlsdGVyIG91dCByb3dzIHdpdGggbGVzcyB0aGFuIDQtZm9sZCBjaGFuZ2UgKGxvZzIgZm9sZCBjaGFuZ2Ugb2YgPiAyKQpHTV9MUFMuR01fTEEuc2lnR2VuZXNGb2xkMiA8LSBzdWJzZXQoR01fTFBTLkdNX0xBLnNpZ0dlbmVzLCBhYnMobG9nRkMpID4gMikKbGVuZ3RoKEdNX0xQUy5HTV9MQS5zaWdHZW5lc0ZvbGQyJElEKQojI1sxXSA3CgojI01ha2UgYW4gTUEgcGxvdApzZWwgPC0gR01fTFBTLkdNX0xBLnRvcFRhYiRhZGouUC5WYWwgPCAwLjA1CnRvcCA8LSBHTV9MUFMuR01fTEEudG9wVGFiCnN1YiA8LSBwYXN0ZSgiTm8uIG9mIHNpZy4gZ2VuZXM6ICIsIHN1bShzZWwpLCIvIiwgbGVuZ3RoKHNlbCkpCmNwbSA8LSB2JEUKCnBsb3Qocm93TWVhbnMoY3BtW3RvcCRJRCxdKSwgdG9wJGxvZ0ZDLCBwY2g9MTYsIGNleD0wLjUsIGNvbD0iZGFya2dyZXkiLAogICAgIG1haW49IkdNX0xQU3ZHTV9MQSBhZGp1c3RlZCIsCiAgICAgeWxhYj0ibG9nIEZDIiwgeGxhYj0iQXZlcmFnZSBFeHByZXNzaW9uIiwKICAgICBzdWI9c3ViKQpwb2ludHMocm93TWVhbnMoY3BtW3RvcCRJRCxdKVtzZWxdLCB0b3AkbG9nRkNbc2VsXSwgY29sPSJyZWQiLCBjZXg9MC41KQphYmxpbmUoaD1jKC0xLCAwLCAxKSwgY29sPSJyZWQiKQoKZGV2LmNvcHkocGRmLCAiTUFwbG90X0dNX0xQU3ZHTV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucGRmIiwgd2lkdGg9OCwgaGVpZ2h0PTgpCmRldi5vZmYoKQoKZGV2LmNvcHkocG5nLCAiTUFwbG90X0dNX0xQU3ZHTV9MQV9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjAucG5nIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKCkdNX0xQUy5HTV9MQS5zaWdHZW5lcyA8LSBHTV9MUFMuR01fTEEuc2lnR2VuZXNbb3JkZXIoLUdNX0xQUy5HTV9MQS5zaWdHZW5lcyRsb2dGQyksIF0KCiMjQW5ub3RhdGUgc2lnR2VuZXMgbGlzdCB1c2luZyBCaW9tYXJ0CnNpZ0dlbmVzIDwtIEdNX0xQUy5HTV9MQS5zaWdHZW5lcwplbnNlbWJsIDwtIHVzZU1hcnQoIkVOU0VNQkxfTUFSVF9FTlNFTUJMIiwgZGF0YXNldD0iaHNhcGllbnNfZ2VuZV9lbnNlbWJsIiwgaG9zdD0id3d3LmVuc2VtYmwub3JnIikKaWRzIDwtIHNpZ0dlbmVzJElECgojI1RvIHNlZSBwb3NzaWJpbGl0aWVzIGZvciBhdHRyaWJ1dGVzLCB1c2UgaGVhZChsaXN0QXR0cmlidXRlcyhlbnNlbWJsKSwgbj0yMEwpCmRlc2MgPC0gZ2V0Qk0oYXR0cmlidXRlcz1jKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIiksIGZpbHRlcnM9ImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgdmFsdWVzPWlkcywgbWFydD1lbnNlbWJsKQpjb2xuYW1lcyhkZXNjKT1jKCJJRCIsICJTeW1ib2wiLCAiRGVzY3JpcHRpb24iLCAiVHlwZSIpCgojI1JlbW92ZSBjb21tYXMgZnJvbSBkZXNjcmlwdGlvbgpkZXNjJERlc2NyaXB0aW9uIDwtIGdzdWIoIiwiLCAiIiwgZGVzYyREZXNjcmlwdGlvbikKCkRFRyA8LSBtZXJnZShzaWdHZW5lcywgZGVzYywgYnk9IklEIiwgYWxsPVRSVUUpCkRFRyA8LSBzdWJzZXQoREVHLCBzZWxlY3Q9YyhJRCwgU3ltYm9sLCBEZXNjcmlwdGlvbiwgbG9nRkMsIGFkai5QLlZhbCwgQXZlRXhwciwgVHlwZSksIEZTPSIvdCIpCkRFRyA8LSBERUdbb3JkZXIoLURFRyRsb2dGQyksIF0KCiMjRmlsdGVyIG91dCBHZW5lcyAtMTxGQzwxCkRFRyA8LSBzdWJzZXQoREVHLCBhYnMoREVHJGxvZ0ZDKT4xKQoKIyNTYXZlIERFIGdlbmVzCndyaXRlLnRhYmxlKERFRywgIkRFR19HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsIGNvbC5uYW1lcz1ULCByb3cubmFtZXM9RiwgcXVvdGU9RikKd3JpdGUuY3N2KERFRywgIkRFR19HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLmNzdiIsIHJvdy5uYW1lcz1GLCBxdW90ZT1GKQpgYGAKCiMjIFZlbm4gRGlhZ3JhbSBvZiBzaGFyZWQgREVHIGJldHdlZW4gTS1DU0YgTFBTIHYgTEEgdiBMUAoKVXByZWd1bGF0ZWQgZ2VuZXMgY29tcGFyZWQgdG8gTlMKCmBgYHtyfQp2X2RhdGEgPC0gbGlzdChERUdfTEE0W0RFR19MQTQkbG9nRkMgPjAsIF0kSUQsIERFR19MUDRbREVHX0xQNCRsb2dGQyA+MCwgXSRJRCwgREVHX0xQU1tERUdfTFBTJGxvZ0ZDID4wLCBdJElEKQp2X2RhdGEgPC0gVmVubih2X2RhdGEsIFNldE5hbWVzPWMoIkxQUytBZG8iLCAiTFBTK1BHRTIiLCAiTFBTIiksIG51bWJlck9mU2V0cz0zKQpwbG90KHZfZGF0YSwgZG9XZWlnaHRzPUYpCiMjZGV2LmNvcHkocG5nLCAiVmVubkRpYWdyYW0gVXByZWd1bGF0ZWQgTFBTIExBIExQIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQojI2Rldi5vZmYoKTsKYGBgCgpEb3ducmVndWxhdGVkIGdlbmVzIGNvbXBhcmVkIHRvIE5TCgpgYGB7cn0Kdl9kYXRhIDwtIGxpc3QoREVHX0xBNFtERUdfTEE0JGxvZ0ZDIDwwLCBdJElELCBERUdfTFA0W0RFR19MUDQkbG9nRkMgPDAsIF0kSUQsIERFR19MUFNbREVHX0xQUyRsb2dGQyA8MCwgXSRJRCkKdl9kYXRhIDwtIFZlbm4odl9kYXRhLCBTZXROYW1lcz1jKCJMUFMrQWRvIiwgIkxQUytQR0UyIiwgIkxQUyIpLCBudW1iZXJPZlNldHM9MykKcGxvdCh2X2RhdGEsIGRvV2VpZ2h0cz1GKQojI2Rldi5jb3B5KHBuZywgIlZlbm5EaWFncmFtIERvd25yZWd1bGF0ZWQgTFBTIExBIExQIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQojI2Rldi5vZmYoKTsKYGBgCgojIyBWb2xjYW5vIFBsb3RzCgpNX0xQUyB2IE1fTEEKCmBgYHtyLCBldmFsPUZBTFNFfQpyZXMgPC0gcmVhZC50YWJsZSgidG9wVGFiX01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsIGhlYWRlcj1UUlVFKQpoZWFkKHJlcykKd2l0aChyZXMsIHBsb3QobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLCBtYWluPSJWb2xjYW5vIHBsb3QgTV9MUFMgdiBNX0xBIiwgeGxpbT1jKC03LCA3KSkpCgojIyBBZGQgY29sb3JlZCBwb2ludHM6IHJlZCBpZiBwYWRqPDAuMDUsIG9yYW5nZSBvZiBsb2cyRkM+MSwgZ3JlZW4gaWYgYm90aCkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0idmlvbGV0cmVkMiIpKQp3aXRoKHN1YnNldChyZXMsIGFicyhsb2dGQyk+MSksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0ib3JhbmdlIikpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSAmIGFicyhsb2dGQyk+MSksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQojI2Rldi5jb3B5KHBuZywgIlZvbGNhbm9QbG90IE1fTFBTIHYgTV9MQSIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKIyNkZXYub2ZmKCk7CmBgYAoKTV9MUFMgdiBNX0xQCgpgYGB7ciwgZXZhbD1GQUxTRX0KcmVzIDwtIHJlYWQuY3N2KCJ0b3BUYWJfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2IiwgaGVhZGVyPVRSVUUpCmhlYWQocmVzKQp3aXRoKHJlcywgcGxvdChsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIG1haW49IlZvbGNhbm8gcGxvdCBNX0xQUyB2IE1fTFAiLCB4bGltPWMoLTcsIDcpKSkKCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJ2aW9sZXRyZWQyIikpCndpdGgoc3Vic2V0KHJlcywgYWJzKGxvZ0ZDKT4xKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJvcmFuZ2UiKSkKd2l0aChzdWJzZXQocmVzLCBhZGouUC5WYWw8LjA1ICYgYWJzKGxvZ0ZDKT4xKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJ0dXJxdW9pc2UzIikpCiMjZGV2LmNvcHkocG5nLCAiVm9sY2Fub1Bsb3QgTV9MUFMgdiBNX0xQIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQojI2Rldi5vZmYoKTsKYGBgCgojIyBSaWNoIEZhY3RvciBHcmFwaHMKCiMjIEdPIHRlcm1zIHNoYXJlZCBMQSBMUAoKYGBge3J9CkdPU2hhcmVkcGF0aHdheXMgPC0gcmVhZC50YWJsZSgiR08gTUYgRkRSIC4wNSBUT1AgNSBvbmx5LTIudHh0IiwgaGVhZGVyPVRSVUUsIHNlcD0nXHQnKQpHT1NoYXJlZHBhdGh3YXlzIDwtIEdPU2hhcmVkcGF0aHdheXNbb3JkZXIoR09TaGFyZWRwYXRod2F5cyRwLlZhbHVlLCBkZWNyZWFzaW5nPVRSVUUpLCBdCgpjb2xvclJhbXAgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJ0dXJxdW9pc2UxIiwgIm1lZGl1bWJsdWUiKSkoNTApCnBhcihtYXI9Yyg1LCAxOCwgMywgOCkpCnBsb3QoR09TaGFyZWRwYXRod2F5cyRSaWNoLkZhY3RvciwgYygxOjUpLCBheGVzPUYsCiAgICAgcGFuZWwuZmlyc3Q9YWJsaW5lKGg9MTo1LCB2PXNlcSgwLjEsIDAuNiwgMC4xKSwgY29sPSJncmV5OTAiKSwKICAgICBjZXg9YXMubnVtZXJpYyhHT1NoYXJlZHBhdGh3YXlzJEdlbmUuTnVtYmVyKS80LAogICAgIGNvbD1jb2xvclJhbXBbY3V0KGFzLm51bWVyaWMoR09TaGFyZWRwYXRod2F5cyRwLlZhbHVlKSwgYnJlYWtzPTUwKV0sCiAgICAgcGNoPTIwLCB5bGFiPSIgIiwgeGxhYj0iUmljaCBGYWN0b3IiLCBtYWluPSJQYXRod2F5cyBFbnJpY2hlZCIsCiAgICAgeGxpbT1jKDAsIDAuMDQpKQpheGlzKHNpZGU9MiwgYXQ9MTo1LCBsYWJlbHM9YXMuY2hhcmFjdGVyKEdPU2hhcmVkcGF0aHdheXMkR2VuZVNldCksIGxhcz0yLCBjZXguYXhpcz0wLjUpCmF4aXMoc2lkZT0xLCB0aWNrPUdPU2hhcmVkcGF0aHdheXNbWyJSaWNoLkZhY3RvciJdXSkKYGBgCgoKIyMjIEtFR0cgTEEKCmBgYHtyLCBldmFsPUZBTFNFfQpMQXBhdGh3YXlzIDwtIHJlYWQudGFibGUoIkN5dG9zY2FwZSBQYXRod2F5cy9MQSB2IExQUy50eHQiLCBoZWFkZXI9VFJVRSwgc2VwPSdcdCcpCkxBcGF0aHdheXMgPC0gTEFwYXRod2F5c1tvcmRlcihMQXBhdGh3YXlzJHAuVmFsdWUsIGRlY3JlYXNpbmc9VFJVRSksIF0KI3Bsb3QgeCB2LiB5LCBjaGFuZ2Ugc2l6ZSwgYXNzaWduIGNvbG9yIHRvIHAtdmFsdWUKY29sb3JSYW1wIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygidHVycXVvaXNlMSIsICJtZWRpdW1ibHVlIikpKDUwKQpwYXIobWFyPWMoNSwgMTgsIDMsIDgpKQpwbG90KExBcGF0aHdheXMkUmljaC5GYWN0b3IsIGMoMToyOCksIGF4ZXM9RiwKICAgICBwYW5lbC5maXJzdD1hYmxpbmUoaD0xOjI4LCB2PXNlcSgwLjEsIDAuNCwgMC4xKSwgY29sPSJncmV5OTAiKSwKICAgICBjZXg9YXMubnVtZXJpYyhMQXBhdGh3YXlzJEdlbmUuTnVtYmVyKS8xMCwKICAgICBjb2w9Y29sb3JSYW1wW2N1dChhcy5udW1lcmljKExBcGF0aHdheXMkcC5WYWx1ZSksIGJyZWFrcz01MCldLAogICAgIHBjaD0yMCwgeWxhYj0iICIsIHhsYWI9IlJpY2ggRmFjdG9yIiwgbWFpbj0iUGF0aHdheXMgRW5yaWNoZWQiLAogICAgIHhsaW09YygwLCAwLjQpKQpheGlzKHNpZGU9MiwgYXQ9MToyOCwgbGFiZWxzPWFzLmNoYXJhY3RlcihMQXBhdGh3YXlzJFBhdGh3YXkpLCBsYXM9MiwgY2V4LmF4aXM9MC44KQpheGlzKHNpZGU9MSwgdGljaz1MQXBhdGh3YXlzJFJpY2guRmFjdG9yLCBwb3M9MC40KQpgYGAKCiMjIyBHTyBMQQoKYGBge3IsIGV2YWw9RkFMU0V9CkdPTEFwYXRod2F5cyA8LSByZWFkLnRhYmxlKCJDeXRvc2NhcGUgUGF0aHdheXMvR08gQlAgTEEgd2hvbGUgbmV0d29yay50eHQiLCBoZWFkZXI9VFJVRSwgc2VwPSdcdCcpCkdPTEFwYXRod2F5cyA8LSBHT0xBcGF0aHdheXNbb3JkZXIoR09MQXBhdGh3YXlzJHAuVmFsdWUsIGRlY3JlYXNpbmc9VFJVRSksIF0KIyNwbG90IHggdi4geSwgY2hhbmdlIHNpemUsIGFzc2lnbiBjb2xvciB0byBwLXZhbHVlCmNvbG9yUmFtcCA8LSBjb2xvclJhbXBQYWxldHRlKGMoInR1cnF1b2lzZTEiLCAibWVkaXVtYmx1ZSIpKSg1MCkKcGFyKG1hcj1jKDUsIDIwLCAzLCA4KSkKcGxvdChHT0xBcGF0aHdheXMkUmljaC5GYWN0b3IsIGMoMTo1NyksIGF4ZXM9RiwKICAgICBwYW5lbC5maXJzdD1hYmxpbmUoaD0xOjU3LCB2PXNlcSgwLjEsIDAuNSwgMC4xKSwgY29sPSJncmV5OTAiKSwKICAgICBjZXg9YXMubnVtZXJpYyhHT0xBcGF0aHdheXMkR2VuZS5OdW1iZXIpLzEwLAogICAgIGNvbD1jb2xvclJhbXBbY3V0KGFzLm51bWVyaWMoR09MQXBhdGh3YXlzJHAuVmFsdWUpLCBicmVha3M9NTApXSwKICAgICBwY2g9MjAsIHlsYWI9IiAiLCB4bGFiPSJSaWNoIEZhY3RvciIsIG1haW49IlBhdGh3YXlzIEVucmljaGVkIiwKICAgICB4bGltPWMoMCwgMC41KSkKYXhpcyhzaWRlPTIsYXQ9MTo1NywgbGFiZWxzPWFzLmNoYXJhY3RlcihHT0xBcGF0aHdheXMkUGF0aHdheSksIGxhcz0yLCBjZXguYXhpcz0wLjgpCmF4aXMoc2lkZT0xLCB0aWNrPUdPTEFwYXRod2F5cyRSaWNoLkZhY3RvciwgcG9zPTAuNCkKYGBgCgojIyMgR08gTFAKCmBgYHtyLCBldmFsPUZBTFNFfQpHT0xQcGF0aHdheXMgPC0gcmVhZC50YWJsZSgiQ3l0b3NjYXBlIFBhdGh3YXlzL0dPX0JQX0xQdkxQUy50eHQiLCBoZWFkZXI9VFJVRSwgc2VwPSdcdCcpCkdPTFBwYXRod2F5cyA8LSBHT0xQcGF0aHdheXNbb3JkZXIoR09MUHBhdGh3YXlzJHAuVmFsdWUsIGRlY3JlYXNpbmc9VFJVRSksIF0KCmNvbG9yUmFtcCA8LSBjb2xvclJhbXBQYWxldHRlKGMoInR1cnF1b2lzZTEiLCAibWVkaXVtYmx1ZSIpKSg1MCkKcGFyKG1hcj1jKDUsIDE4LCAzLCA4KSkKcGxvdChHT0xQcGF0aHdheXMkUmljaC5GYWN0b3IsIGMoMTozNSksIGF4ZXM9RiwKICAgICBwYW5lbC5maXJzdD1hYmxpbmUoaD0xOjM1LCB2PXNlcSgwLjEsIDAuNiwgMC4xKSwgY29sPSJncmV5OTAiKSwKICAgICBjZXg9YXMubnVtZXJpYyhHT0xQcGF0aHdheXMkR2VuZS5OdW1iZXIpLzIwLAogICAgIGNvbD1jb2xvclJhbXBbY3V0KGFzLm51bWVyaWMoR09MUHBhdGh3YXlzJHAuVmFsdWUpLCBicmVha3M9NTApXSwKICAgICBwY2g9MjAsIHlsYWI9IiAiLCB4bGFiPSJSaWNoIEZhY3RvciIsIG1haW49IlBhdGh3YXlzIEVucmljaGVkIiwKICAgICB4bGltPWMoMCwgMC42KSkKYXhpcyhzaWRlPTIsIGF0PTE6MzUsIGxhYmVscz1hcy5jaGFyYWN0ZXIoR09MUHBhdGh3YXlzJFBhdGh3YXkpLCBsYXM9MiwgY2V4LmF4aXM9MC41KQpheGlzKHNpZGU9MSwgdGljaz1HT0xQcGF0aHdheXMkUmljaC5GYWN0b3IsIHBvcz0wLjQpCmBgYAoKIyBWb2xjYW5vIHBsb3QgTV9MUFNfNCB2IE1fTFBfNAoKYGBge3IgZmlyc3Rfdm9sY2Fub30KcmVzIDwtIHJlYWQuY3N2KCJ0b3BUYWJfTV9MUFN2TV9MUF9DRFNfbGltbWFiYXRjaGNvcnJlY3Rpb25fMjAxNzExMjByZXYuY3N2IiwKICAgICAgICAgICAgICAgIGhlYWRlcj1UUlVFKQpoZWFkKHJlcykKd2l0aChyZXMsIHBsb3QobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgcGNoPTIwLCBtYWluPSJWb2xjYW5vIHBsb3QgTV9MUFMgdiBNX0xQIiwgeGxpbT1jKC03LCA3KSkpCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpPjEpLCBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9Im9yYW5nZSIpKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgJiBhYnMobG9nRkMpPjEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLAogICAgICAgICAgICBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQpkZXYuY29weShwbmcsICJWb2xjYW5vUGxvdCBNX0xQUyB2IE1fTFAiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMgVm9sY2FubyBwbG90IE1fTFBTXzQgdiBNX0xBXzQKCmBgYHtyIHNlY29uZF92b2xjYW5vfQpyZXMgPC0gcmVhZC50YWJsZSgidG9wVGFiX01fTFBTdk1fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMTIwLnR4dCIsCiAgICAgICAgICAgICAgICAgIGhlYWRlcj1UUlVFKQpoZWFkKHJlcykKd2l0aChyZXMsIHBsb3QobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLAogICAgICAgICAgICAgICBtYWluPSJWb2xjYW5vIHBsb3QgTV9MUFMgdiBNX0xBIiwgeGxpbT1jKC03LCA3KSkpCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpPjEpLCBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9Im9yYW5nZSIpKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgJiBhYnMobG9nRkMpPjEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLAogICAgICAgICAgICBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQpkZXYuY29weShwbmcsICJWb2xjYW5vUGxvdCBNX0xQUyB2IE1fTEEiLCB3aWR0aD03MDAsIGhlaWdodD03MDApCmRldi5vZmYoKQpgYGAKCiMgVm9sY2FubyBwbG90IEdNX0xQU180IHYgR01fTEFfNAoKYGBge3IgdGhpcmRfdm9sY2Fub30KcmVzIDwtIHJlYWQudGFibGUoIkdNX0xQUyB2IEdNX0xBL3RvcFRhYl9HTV9MUFN2R01fTEFfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDIzLnR4dCIsCiAgICAgICAgICAgICAgICAgIGhlYWRlcj1UUlVFKQpoZWFkKHJlcykKd2l0aChyZXMsIHBsb3QobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLAogICAgICAgICAgICAgICBtYWluPSJWb2xjYW5vIHBsb3QgR01fTFBTXzQgdiBHTV9MQV80IiwgeGxpbT1jKC03LCA3KSkpCiMjIEFkZCBjb2xvcmVkIHBvaW50czogcmVkIGlmIHBhZGo8MC4wNSwgb3JhbmdlIG9mIGxvZzJGQz4xLCBncmVlbiBpZiBib3RoKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgKSwgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9InZpb2xldHJlZDIiKSkKd2l0aChzdWJzZXQocmVzLCBhYnMobG9nRkMpPjEpLCBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNoPTIwLCBjb2w9Im9yYW5nZSIpKQp3aXRoKHN1YnNldChyZXMsIGFkai5QLlZhbDwuMDUgJiBhYnMobG9nRkMpPjEpLAogICAgIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LCBwY2g9MjAsIGNvbD0idHVycXVvaXNlMyIpKQpkZXYuY29weShwbmcsICJWb2xjYW5vUGxvdCBHTV9MUFMgdiBHTV9MQSIsIHdpZHRoPTcwMCwgaGVpZ2h0PTcwMCkKZGV2Lm9mZigpCmBgYAoKIyBWb2xjYW5vIHBsb3QgR01fTFBTXzQgdiBHTV9MUF80CgpgYGB7ciBmb3VydGhfdm9sY2Fub30KcmVzIDwtIHJlYWQudGFibGUoInRvcFRhYl9HTV9MUFN2R01fTFBfQ0RTX2xpbW1hYmF0Y2hjb3JyZWN0aW9uXzIwMTcxMDIzLnR4dCIsCiAgICAgICAgICAgICAgICAgIGhlYWRlcj1UUlVFKQpoZWFkKHJlcykKd2l0aChyZXMsIHBsb3QobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwgcGNoPTIwLAogICAgICAgICAgICAgICBtYWluPSJWb2xjYW5vIHBsb3QgR01fTFBTIHYgR01fTFAiLCB4bGltPWMoLTcsIDcpKSkKIyMgQWRkIGNvbG9yZWQgcG9pbnRzOiByZWQgaWYgcGFkajwwLjA1LCBvcmFuZ2Ugb2YgbG9nMkZDPjEsIGdyZWVuIGlmIGJvdGgpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSApLCBwb2ludHMobG9nRkMsIC1sb2cxMChQLlZhbHVlKSwgY2V4PTAuOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2g9MjAsIGNvbD0idmlvbGV0cmVkMiIpKQp3aXRoKHN1YnNldChyZXMsIGFicyhsb2dGQyk+MSksIHBvaW50cyhsb2dGQywgLWxvZzEwKFAuVmFsdWUpLCBjZXg9MC44LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2g9MjAsIGNvbD0ib3JhbmdlIikpCndpdGgoc3Vic2V0KHJlcywgYWRqLlAuVmFsPC4wNSAmIGFicyhsb2dGQyk+MSksCiAgICAgcG9pbnRzKGxvZ0ZDLCAtbG9nMTAoUC5WYWx1ZSksIGNleD0wLjgsIHBjaD0yMCwgY29sPSJ0dXJxdW9pc2UzIikpCmRldi5jb3B5KHBuZywgIlZvbGNhbm9QbG90IEdNX0xQUyB2IEdNX0xQIiwgd2lkdGg9NzAwLCBoZWlnaHQ9NzAwKQpkZXYub2ZmKCkKYGBgCg==