Note: This is the R markdown of the manuscript “Non-verbal intelligence outperforms selective attention in a visual short-term memory test”. Click run to reproduce all analyzes. Data is copyrighted and not for public use.

If you have any questions or queries, please reach me out at

last updated: 30 October, 2021

1 Data processing

1.1 Load data

Due to copyright restrictions, the original data is not available.

1.2 Select only specific vectors

1.3 Clean dataset

1.4 Select specific variables from the original ds

1.5 Fix levels

1.6 Apply scoring (MEMORE)

1.7 Apply scoring (R1)

1.8 Score R1

2 Data Analysis

2.1 Load data

2.2 Psychometric properties

2.2.1 MEMORE


Information about this analysis:

                 Dataframe: ds %>% select(starts_with("code_resp"))
                     Items: all
              Observations: 1448
     Positive correlations: 225 out of 276 (82%)

Estimates assuming interval level:

             Omega (total): 0.59
      Omega (hierarchical): 0.24
   Revelle's omega (total): 0.63
Greatest Lower Bound (GLB): 0.72
             Coefficient H: 0.64
          Cronbach's alpha: 0.6
Confidence intervals:
             Omega (total): [0.55, 0.62]
          Cronbach's alpha: [0.57, 0.63]

Estimates assuming ordinal level:

     Ordinal Omega (total): 0.74
 Ordinal Omega (hierarch.): 0.65
  Ordinal Cronbach's alpha: 0.76
Confidence intervals:
     Ordinal Omega (total): [0.72, 0.76]
  Ordinal Cronbach's alpha: [0.75, 0.78]

Note: the normal point estimate and confidence interval for omega are based on the procedure suggested by Dunn, Baguley & Brunsden (2013) using the MBESS function ci.reliability, whereas the psych package point estimate was suggested in Revelle & Zinbarg (2008). See the help ('?scaleStructure') for more information.

2.2.2 Rotas

       rota_c rota_a rota_d
rota_c   1.00   0.55   0.61
rota_a   0.55   1.00   0.54
rota_d   0.61   0.54   1.00

n= 1031 


P
       rota_c rota_a rota_d
rota_c         0      0    
rota_a  0             0    
rota_d  0      0           

2.3 Table 1 Demographics


--------Summary descriptives table ---------

____________________________________ 
                       [ALL]     N   
                      N=1448         
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ 
idade               26.6 (9.97) 1438 
sexo:                           1448 
    Fem             781 (53.9%)      
    Masc            667 (46.1%)      
escolaridade_grupo:             1448 
    1               60 (4.14%)       
    2               501 (34.6%)      
    3               883 (61.0%)      
    'Missing'        4 (0.28%)       
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ 

    Chi-squared test for given probabilities

data:  table(ds$sexo)
X-squared = 8.9751, df = 1, p-value = 0.002737

    Chi-squared test for given probabilities

data:  table(ds$escolaridade_grupo)
X-squared = 704.8, df = 2, p-value < 2.2e-16

2.4 Table 2 Means and SD

2.4.1 Descriptive Statistics

2.4.1.1 ds

N: 1448

  memore_total rota_a rota_c rota_d total_r1
Mean 10.98 143.78 158.96 107.07 26.67
Std.Dev 6.26 49.77 41.82 34.49 5.32
Min -8.00 -78.33 0.00 -92.33 18.00
Q1 6.00 115.00 130.67 88.33 22.00
Median 12.00 146.67 157.00 106.67 27.00
Q3 16.00 176.00 185.67 123.67 30.00
Max 24.00 250.00 242.67 237.00 37.00
MAD 5.93 45.47 41.02 26.19 5.93
IQR 10.00 61.00 54.67 35.33 7.50
CV 0.57 0.35 0.26 0.32 0.20
Skewness -0.13 -0.52 0.04 -0.12 0.18
SE.Skewness 0.06 0.08 0.08 0.08 0.36
Kurtosis -0.46 0.73 -0.21 4.07 -0.94
N.Valid 1448.00 1031.00 1031.00 1031.00 43.00
Pct.Valid 100.00 71.20 71.20 71.20 2.97

3 Automatic selection for cognitive explorations

Initialization...
TASK: Genetic algorithm in the candidate set.
Initialization...
Algorithm started...

After 10 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1547.67242696268
Change in best IC: -9755.94969330232 / Change in mean IC: -8452.32757303732

After 20 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1511.40803694905

Change in best IC: 0 / Change in mean IC: -36.2643900136377

After 30 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1468.26284646846

Change in best IC: 0 / Change in mean IC: -43.1451904805883

After 40 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1376.64625977115

Change in best IC: 0 / Change in mean IC: -91.6165866973104

After 50 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1341.55645259858

Change in best IC: 0 / Change in mean IC: -35.0898071725715

After 60 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1361.52003540418

Change in best IC: 0 / Change in mean IC: 19.9635828056021

After 70 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1390.81247694185

Change in best IC: 0 / Change in mean IC: 29.2924415376747

After 80 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1379.85566413688

Change in best IC: 0 / Change in mean IC: -10.9568128049725

After 90 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1348.28665193309

Change in best IC: 0 / Change in mean IC: -31.5690122037893

After 100 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1338.10903998518

Change in best IC: 0 / Change in mean IC: -10.1776119479127

After 110 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1318.41221968824

Change in best IC: 0 / Change in mean IC: -19.6968202969438

After 120 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1308.79770429867

Change in best IC: 0 / Change in mean IC: -9.61451538956157

After 130 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1308.79770429867

Change in best IC: 0 / Change in mean IC: 0

After 140 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1299.44645385895

Change in best IC: 0 / Change in mean IC: -9.35125043972835

After 150 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1299.44645385895

Change in best IC: 0 / Change in mean IC: 0

After 160 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1299.44645385895

Change in best IC: 0 / Change in mean IC: 0

After 170 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1299.44645385895

Change in best IC: 0 / Change in mean IC: 0

After 180 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1290.14327146326

Change in best IC: 0 / Change in mean IC: -9.30318239568805

After 190 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1290.14327146326

Change in best IC: 0 / Change in mean IC: 0

After 200 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1290.14327146326

Change in best IC: 0 / Change in mean IC: 0

After 210 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1290.14327146326

Change in best IC: 0 / Change in mean IC: 0

After 220 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1290.14327146326

Change in best IC: 0 / Change in mean IC: 0

After 230 generations:
Best model: memore_total~1+total_r1+rota_c
Crit= 244.050306697682
Mean crit= 1290.14327146326

Improvements in best and average IC have bebingo en below the specified goals.
Algorithm is declared to have converged.
Completed.

$name
[1] "glmulti.analysis"

$method
[1] "g"

$fitting
[1] "glm"

$crit
[1] "aicc"

$level
[1] 2

$marginality
[1] TRUE

$confsetsize
[1] 113

$bestic
[1] 244.0503

$icvalues
  [1]  244.0503  244.9526  245.5923  245.6145  245.9842  246.4071  246.6443  247.3656  247.4865  247.7751  247.8108  248.0166  248.1868  248.2331
 [15]  248.3058  248.3298  248.4816  248.4864  248.5104  248.5572  248.6376  248.7036  248.9722  249.0805  249.1046  249.1403  249.1753  249.1770
 [29]  249.1772  249.7029  249.9928  250.5859  250.8952  251.0462  251.0519  251.0777  251.1337  251.1514  251.1516  251.1539  251.2010  251.2511
 [43]  251.2608  251.2717  251.3039  251.3545  251.3771  251.3823  251.5185  251.5593  251.5787  251.6261  251.6308  251.6553  251.8842  251.8937
 [57]  252.0565  252.5920  252.6363  252.9726  252.9798  253.0069  253.7716  254.1128  254.3043  254.3060  254.3167  254.3264  254.3315  254.3342
 [71]  254.3598  254.4058  254.4695  254.4867  254.5061  254.5695  254.8721  254.8733  254.9044  254.9293  254.9797  255.0037  257.0993  257.5889
 [85]  257.6234  257.6862  257.7287  257.8787  257.9126  257.9173  257.9189  258.4583  261.4287  261.4577  266.4486 6603.7656 6604.9943 6605.1350
 [99] 6605.4939 6606.0806 6606.2698 6606.7404 6607.9137 6608.7082 6610.1237 6611.5814 6613.3317 6614.3980 6619.9700 6625.8903 6632.1664 6635.9715
[113] 9425.4489

$bestmodel
[1] "memore_total ~ 1 + total_r1 + rota_c"

$modelweights
  [1] 1.432157e-01 9.121481e-02 6.624434e-02 6.551260e-02 5.445681e-02 4.407850e-02 3.914803e-02 2.729445e-02 2.569348e-02 2.224177e-02
 [11] 2.184773e-02 1.971135e-02 1.810311e-02 1.768931e-02 1.705758e-02 1.685392e-02 1.562210e-02 1.558462e-02 1.539916e-02 1.504265e-02
 [21] 1.445019e-02 1.398111e-02 1.222401e-02 1.157986e-02 1.144124e-02 1.123870e-02 1.104362e-02 1.103418e-02 1.103307e-02 8.482890e-03
 [31] 7.338337e-03 5.455117e-03 4.673563e-03 4.333572e-03 4.321300e-03 4.265812e-03 4.148125e-03 4.111534e-03 4.111236e-03 4.106443e-03
 [41] 4.010835e-03 3.911679e-03 3.892617e-03 3.871523e-03 3.809632e-03 3.714565e-03 3.672863e-03 3.663188e-03 3.422159e-03 3.352946e-03
 [51] 3.320572e-03 3.242852e-03 3.235223e-03 3.195886e-03 2.850299e-03 2.836685e-03 2.614980e-03 2.000744e-03 1.956896e-03 1.654021e-03
 [61] 1.648065e-03 1.625907e-03 1.109261e-03 9.352899e-04 8.498901e-04 8.491697e-04 8.446604e-04 8.405591e-04 8.384237e-04 8.372898e-04
 [71] 8.266249e-04 8.078416e-04 7.825091e-04 7.758022e-04 7.683166e-04 7.443515e-04 6.398247e-04 6.394535e-04 6.295939e-04 6.217887e-04
 [81] 6.063217e-04 5.991017e-04 2.101044e-04 1.644853e-04 1.616716e-04 1.566732e-04 1.533813e-04 1.422958e-04 1.399069e-04 1.395747e-04
 [91] 1.394612e-04 1.064943e-04 2.411714e-05 2.377020e-05 1.960043e-06 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
[101] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
[111] 0.000000e+00 0.000000e+00 0.000000e+00

$generations
[1] 230

$elapsed
[1] 0.03301938

$includeobjects
[1] TRUE

3.1 Table 3 Top Ranked results

3.2 Table 4 Multiple regression model

                        Model Summary                          
--------------------------------------------------------------
R                       0.524       RMSE                4.742 
R-Squared               0.275       Coef. Var          41.777 
Adj. R-Squared          0.236       MSE                22.483 
Pred R-Squared          0.135       MAE                 3.612 
--------------------------------------------------------------
 RMSE: Root Mean Square Error 
 MSE: Mean Square Error 
 MAE: Mean Absolute Error 

                               ANOVA                                
-------------------------------------------------------------------
                Sum of                                             
               Squares        DF    Mean Square      F        Sig. 
-------------------------------------------------------------------
Regression     315.220         2        157.610     7.01    0.0026 
Residual       831.880        37         22.483                    
Total         1147.100        39                                   
-------------------------------------------------------------------

                                  Parameter Estimates                                    
----------------------------------------------------------------------------------------
      model      Beta    Std. Error    Std. Beta      t        Sig       lower    upper 
----------------------------------------------------------------------------------------
(Intercept)    -9.750         5.704                 -1.709    0.096    -21.307    1.806 
     rota_c     0.073         0.028        0.369     2.630    0.012      0.017    0.129 
   total_r1     0.388         0.139        0.390     2.786    0.008      0.106    0.671 
----------------------------------------------------------------------------------------
OK: residuals appear as normally distributed (p = 0.628).
OK: Error variance appears to be homoscedastic (p = 0.158).
# Check for Multicollinearity

Low Correlation

     Term  VIF Increased SE Tolerance
   rota_c 1.00         1.00      1.00
 total_r1 1.00         1.00      1.00
BOOTSTRAP OF LINEAR MODEL  (method = rows)

Original Model Fit
------------------
Call:
lm(formula = memore_total ~ rota_c + total_r1, data = ds)

Coefficients:
(Intercept)       rota_c     total_r1  
   -9.75019      0.07263      0.38827  

Bootstrap SD's:
(Intercept)       rota_c     total_r1  
 7.19846070   0.03125937   0.14016524  

4 PAST: Trying to have an automatic selection (Discarted due to theoretical inconsistency)

4.1 glmulti achieve a solution.

Despite this achievement, this solution is not duable. Is theoretically meaninless.

I’ll try to simulate with the data computing the SD for R1.

Than checking its effects

And plotting

6 Luis Anunciação, PhD - (PUC-Rio)

LS0tDQp0aXRsZTogIk1FTU9SRSAtIEV4Y2VycHRzIGZyb20gbWFpbiBhbmFseXNpcyINCmF1dGhvcjogIkx1aXMgQW51bmNpYcOnw6NvIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj4NCioqTm90ZSoqOiBUaGlzIGlzIHRoZSBSIG1hcmtkb3duIG9mIHRoZSBtYW51c2NyaXB0ICJOb24tdmVyYmFsIGludGVsbGlnZW5jZSBvdXRwZXJmb3JtcyBzZWxlY3RpdmUgYXR0ZW50aW9uIGluIGEgdmlzdWFsIHNob3J0LXRlcm0gbWVtb3J5IHRlc3QgIi4gQ2xpY2sgcnVuIHRvIHJlcHJvZHVjZSBhbGwgYW5hbHl6ZXMuIERhdGEgaXMgY29weXJpZ2h0ZWQgYW5kIG5vdCBmb3IgcHVibGljIHVzZS4NCg0KSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBvciBxdWVyaWVzLCBwbGVhc2UgcmVhY2ggbWUgb3V0IGF0IA0KbHVpc2ZjYUBwdWMtcmlvLmJyDQoNCmxhc3QgdXBkYXRlZDogYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWANCjwvZGl2Pg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSB9DQojR2xvYmFsIG9wdGlvbnMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFKQ0KIyBhdXRvIGZvcm1hdCAoa2FibGUpDQpvcHRpb25zKGthYmxlRXh0cmEuYXV0b19mb3JtYXQgPSBGQUxTRSkNCmBgYA0KDQoNCmBgYHtyIHBhY2thZ2VzIH0NCnBhY21hbjo6cF9sb2FkKHRpZHl2ZXJzZSwNCiAgICAgICAgICAgICAgIGphbml0b3IsDQogICAgICAgICAgICAgICBEYXRhRXhwbG9yZXIsDQogICAgICAgICAgICAgICBzdW1tYXJ5dG9vbHMsDQogICAgICAgICAgICAgICBrbml0ciwNCiAgICAgICAgICAgICAgIGthYmxlRXh0cmEsDQogICAgICAgICAgICAgICBnbG11bHRpLCAjcnVuIHNldmVyYWwgbGluZWFyIG1vZGVscw0KICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UsICNjaGVjayBvbHMgYXNzdW1wdGlvbnMNCiAgICAgICAgICAgICAgIGdnaXJhcGhFeHRyYSkgI3Bsb3QgcHJlZGljdGlvbnMNCg0KYGBgDQoNCiMgRGF0YSBwcm9jZXNzaW5nDQoNCiMjIExvYWQgZGF0YSANCg0KPkR1ZSB0byBjb3B5cmlnaHQgcmVzdHJpY3Rpb25zLCB0aGUgb3JpZ2luYWwgZGF0YSBpcyBub3QgYXZhaWxhYmxlLg0KDQojIyBTZWxlY3Qgb25seSBzcGVjaWZpYyB2ZWN0b3JzDQoNCmBgYHtyLCAsIGV2YWwgPSBGQUxTRSB9DQpybShsaXN0PWxzKClbISBscygpICVpbiUgYygiZGFkb3NfZ2VyYWwiLCAiYmFja3VwIildKQ0KYGBgDQoNCiMjIENsZWFuIGRhdGFzZXQNCg0KYGBge3IsIGV2YWwgPSBGQUxTRSB9DQpkYWRvc19nZXJhbCA8LSBjbGVhbl9uYW1lcyhkYWRvc19nZXJhbCkNCmBgYA0KDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0KdmlldyhkZlN1bW1hcnkoZGFkb3NfZ2VyYWwpKQ0KYGBgDQoNCg0KIyMgU2VsZWN0IHNwZWNpZmljIHZhcmlhYmxlcyBmcm9tIHRoZSBvcmlnaW5hbCBkcw0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFIH0NCmRzIDwtIGRhZG9zX2dlcmFsICU+JSANCiAgc2VsZWN0KGlkLCBpZGFkZSwgdV9mbmFzYywgc2V4bywgIGVzY29sYXJpZGFkZV9ncnVwbywgZmFpeGFfZXRhcmlhLA0KICAgICAgICAgIHJvdGFfYywgcm90YV9hLCByb3RhX2QsDQogICAgICAgICAgc3RhcnRzX3dpdGgoIm1lbW9fcmUiKSwNCiAgICAgICAgICBzdGFydHNfd2l0aCgicjFfIikpDQpgYGANCg0KIyMgRml4IGxldmVscw0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFfQ0KZHMgPC0gZHMgJT4lIG11dGF0ZShlc2NvbGFyaWRhZGVfZ3J1cG8gPSBhcy5mYWN0b3IoZXNjb2xhcmlkYWRlX2dydXBvKSkNCmRzIDwtIGRzICU+JSBtdXRhdGUoc2V4byA9IGFzLmZhY3RvcihzZXhvKSkNCmBgYA0KDQoNCiMjIEFwcGx5IHNjb3JpbmcgKE1FTU9SRSkNCg0KYGBge3IsIGV2YWw9IEZBTFNFIH0NCiNDcmVhdGUgc3RyaW5ncw0KZHMgPC0gZHMgJT4lIA0KICAgIG11dGF0ZShyZXNwXzEgPSBpZl9lbHNlKG1lbW9fcmUwMSA9PSAwLCJWTiIsIkZQIikpICU+JSANCiAgICBtdXRhdGUocmVzcF8yID0gaWZfZWxzZShtZW1vX3JlMDIgPT0gMSwiVlAiLCJGTiIpKSAlPiUgDQogICAgbXV0YXRlKHJlc3BfMyA9IGlmX2Vsc2UobWVtb19yZTAzID09IDEsIlZQIiwiRk4iKSkgJT4lIA0KICAgIG11dGF0ZShyZXNwXzQgPSBpZl9lbHNlKG1lbW9fcmUwNCA9PSAxLCJWUCIsIkZOIikpICU+JSANCiAgICBtdXRhdGUocmVzcF81ID0gaWZfZWxzZShtZW1vX3JlMDUgPT0gMCwiVk4iLCJGUCIpKSAlPiUgDQogICAgbXV0YXRlKHJlc3BfNiA9IGlmX2Vsc2UobWVtb19yZTA2ID09IDEsIlZQIiwiRk4iKSkgJT4lIA0KICAgIG11dGF0ZShyZXNwXzcgPSBpZl9lbHNlKG1lbW9fcmUwNyA9PSAwLCJWTiIsIkZQIikpICU+JSANCiAgICBtdXRhdGUocmVzcF84ID0gaWZfZWxzZShtZW1vX3JlMDggPT0gMSwiVlAiLCJGTiIpKSAlPiUgDQogICAgbXV0YXRlKHJlc3BfOSA9IGlmX2Vsc2UobWVtb19yZTA5ID09IDAsIlZOIiwiRlAiKSkgJT4lIA0KICAgIG11dGF0ZShyZXNwXzEwID0gaWZfZWxzZShtZW1vX3JlMTAgPT0gMSwiVlAiLCJGTiIpKSAlPiUgDQogICAgbXV0YXRlKHJlc3BfMTEgPSBpZl9lbHNlKG1lbW9fcmUxMSA9PSAwLCJWTiIsIkZQIikpICU+JSANCiAgICBtdXRhdGUocmVzcF8xMiA9IGlmX2Vsc2UobWVtb19yZTEyID09IDEsIlZQIiwiRk4iKSkgJT4lIA0KICAgIG11dGF0ZShyZXNwXzEzID0gaWZfZWxzZShtZW1vX3JlMTMgPT0gMCwiVk4iLCJGUCIpKSAlPiUgDQogICAgbXV0YXRlKHJlc3BfMTQgPSBpZl9lbHNlKG1lbW9fcmUxNCA9PSAxLCJWUCIsIkZOIikpICU+JSANCiAgICBtdXRhdGUocmVzcF8xNSA9IGlmX2Vsc2UobWVtb19yZTE1ID09IDEsIlZQIiwiRk4iKSkgJT4lIA0KICAgIG11dGF0ZShyZXNwXzE2ID0gaWZfZWxzZShtZW1vX3JlMTYgPT0gMCwiVk4iLCJGUCIpKSAlPiUgDQogICAgbXV0YXRlKHJlc3BfMTcgPSBpZl9lbHNlKG1lbW9fcmUxNyA9PSAwLCJWTiIsIkZQIikpICU+JSANCiAgICBtdXRhdGUocmVzcF8xOCA9IGlmX2Vsc2UobWVtb19yZTE4ID09IDEsIlZQIiwiRk4iKSkgJT4lIA0KICAgIG11dGF0ZShyZXNwXzE5ID0gaWZfZWxzZShtZW1vX3JlMTkgPT0gMCwiVk4iLCJGUCIpKSAlPiUgDQogICAgbXV0YXRlKHJlc3BfMjAgPSBpZl9lbHNlKG1lbW9fcmUyMCA9PSAxLCJWUCIsIkZOIikpICU+JSANCiAgICBtdXRhdGUocmVzcF8yMSA9IGlmX2Vsc2UobWVtb19yZTIxID09IDAsIlZOIiwiRlAiKSkgJT4lIA0KICAgIG11dGF0ZShyZXNwXzIyID0gaWZfZWxzZShtZW1vX3JlMjIgPT0gMSwiVlAiLCJGTiIpKSAlPiUgDQogICAgbXV0YXRlKHJlc3BfMjMgPSBpZl9lbHNlKG1lbW9fcmUyMyA9PSAwLCJWTiIsIkZQIikpICU+JSANCiAgICBtdXRhdGUocmVzcF8yNCA9IGlmX2Vsc2UobWVtb19yZTI0ID09IDAsIlZOIiwiRlAiKSkgJT4lIA0KICAgICNwYXJhIGFuYWxpc2UgZmF0b3JpYWwNCiAgICBtdXRhdGUoY29kZV9yZXNwXzEgPSBpZl9lbHNlKG1lbW9fcmUwMSA9PSAwLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzIgPSBpZl9lbHNlKG1lbW9fcmUwMiA9PSAxLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzMgPSBpZl9lbHNlKG1lbW9fcmUwMyA9PSAxLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzQgPSBpZl9lbHNlKG1lbW9fcmUwNCA9PSAxLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzUgPSBpZl9lbHNlKG1lbW9fcmUwNSA9PSAwLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzYgPSBpZl9lbHNlKG1lbW9fcmUwNiA9PSAxLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzcgPSBpZl9lbHNlKG1lbW9fcmUwNyA9PSAwLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzggPSBpZl9lbHNlKG1lbW9fcmUwOCA9PSAxLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzkgPSBpZl9lbHNlKG1lbW9fcmUwOSA9PSAwLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzEwID0gaWZfZWxzZShtZW1vX3JlMTAgPT0gMSwxLDApKSAlPiUgDQogICAgbXV0YXRlKGNvZGVfcmVzcF8xMSA9IGlmX2Vsc2UobWVtb19yZTExID09IDAsMSwwKSkgJT4lIA0KICAgIG11dGF0ZShjb2RlX3Jlc3BfMTIgPSBpZl9lbHNlKG1lbW9fcmUxMiA9PSAxLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzEzID0gaWZfZWxzZShtZW1vX3JlMTMgPT0gMCwxLDApKSAlPiUgDQogICAgbXV0YXRlKGNvZGVfcmVzcF8xNCA9IGlmX2Vsc2UobWVtb19yZTE0ID09IDEsMSwwKSkgJT4lIA0KICAgIG11dGF0ZShjb2RlX3Jlc3BfMTUgPSBpZl9lbHNlKG1lbW9fcmUxNSA9PSAxLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzE2ID0gaWZfZWxzZShtZW1vX3JlMTYgPT0gMCwxLDApKSAlPiUgDQogICAgbXV0YXRlKGNvZGVfcmVzcF8xNyA9IGlmX2Vsc2UobWVtb19yZTE3ID09IDAsMSwwKSkgJT4lIA0KICAgIG11dGF0ZShjb2RlX3Jlc3BfMTggPSBpZl9lbHNlKG1lbW9fcmUxOCA9PSAxLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzE5ID0gaWZfZWxzZShtZW1vX3JlMTkgPT0gMCwxLDApKSAlPiUgDQogICAgbXV0YXRlKGNvZGVfcmVzcF8yMCA9IGlmX2Vsc2UobWVtb19yZTIwID09IDEsMSwwKSkgJT4lIA0KICAgIG11dGF0ZShjb2RlX3Jlc3BfMjEgPSBpZl9lbHNlKG1lbW9fcmUyMSA9PSAwLDEsMCkpICU+JSANCiAgICBtdXRhdGUoY29kZV9yZXNwXzIyID0gaWZfZWxzZShtZW1vX3JlMjIgPT0gMSwxLDApKSAlPiUgDQogICAgbXV0YXRlKGNvZGVfcmVzcF8yMyA9IGlmX2Vsc2UobWVtb19yZTIzID09IDAsMSwwKSkgJT4lIA0KICAgIG11dGF0ZShjb2RlX3Jlc3BfMjQgPSBpZl9lbHNlKG1lbW9fcmUyNCA9PSAwLDEsMCkpIA0KDQojQ29tcHV0ZSBzdHJpbmdzDQpkcyA8LSBkcyAlPiUNCiAgbXV0YXRlKHZwX3RvdGFsID0gcm93U3VtcyhzZWxlY3QoLiwgcmVzcF8xOnJlc3BfMjQpID09ICJWUCIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKGZuX3RvdGFsID0gcm93U3VtcyhzZWxlY3QoLiwgcmVzcF8xOnJlc3BfMjQpID09ICJGTiIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKGZwX3RvdGFsID0gcm93U3VtcyhzZWxlY3QoLiwgcmVzcF8xOnJlc3BfMjQpID09ICJGUCIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKHZuX3RvdGFsID0gcm93U3VtcyhzZWxlY3QoLiwgcmVzcF8xOnJlc3BfMjQpID09ICJWTiIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKHRvdF9hY2VydG8gPSByb3dTdW1zKC4gPT0gIlZQIiwgbmEucm0gPSBUUlVFKSArIHJvd1N1bXMoLiA9PSAgIlZOIiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodG90X2Vycm8gPSByb3dTdW1zKC4gPT0gIkZQIiwgbmEucm0gPSBUUlVFKSArIHJvd1N1bXMoLiA9PSAgIkZOIiwgbmEucm0gPSBUUlVFKSkgJT4lDQogIG11dGF0ZShtZW1vcmVfdG90YWwgPSB0b3RfYWNlcnRvIC0gdG90X2Vycm8pIA0KYGBgDQoNCg0KIyMgQXBwbHkgc2NvcmluZyAoUjEpDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0KZHMgPC0gZHMgJT4lIA0KICBtdXRhdGUocjFfMSA9IGlmX2Vsc2UocjFfMSA9PSAiYyIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMiA9IGlmX2Vsc2UocjFfMiA9PSAiZiIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMyA9IGlmX2Vsc2UocjFfMyA9PSAiZSIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfNCA9IGlmX2Vsc2UocjFfNCA9PSAiZCIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfNSA9IGlmX2Vsc2UocjFfNSA9PSAiZiIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfNiA9IGlmX2Vsc2UocjFfNiA9PSAiYiIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfNyA9IGlmX2Vsc2UocjFfNyA9PSAiYSIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfOCA9IGlmX2Vsc2UocjFfOCA9PSAiZCIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfOSA9IGlmX2Vsc2UocjFfOSA9PSAiZSIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMTAgPSBpZl9lbHNlKHIxXzEwID09ICJlIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8xMSA9IGlmX2Vsc2UocjFfMTEgPT0gImMiLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzEyID0gaWZfZWxzZShyMV8xMiA9PSAiZiIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMTMgPSBpZl9lbHNlKHIxXzEzID09ICJkIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8xNCA9IGlmX2Vsc2UocjFfMTQgPT0gImIiLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzE1ID0gaWZfZWxzZShyMV8xNSA9PSAiZSIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMTYgPSBpZl9lbHNlKHIxXzE2ID09ICJmIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8xNyA9IGlmX2Vsc2UocjFfMTcgPT0gImEiLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzE4ID0gaWZfZWxzZShyMV8xOCA9PSAiYyIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMTkgPSBpZl9lbHNlKHIxXzE5ID09ICJkIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8yMCA9IGlmX2Vsc2UocjFfMjAgPT0gImIiLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzIxID0gaWZfZWxzZShyMV8yMSA9PSAiZCIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMjIgPSBpZl9lbHNlKHIxXzIyID09ICJmIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8yMyA9IGlmX2Vsc2UocjFfMjMgPT0gImciLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzI0ID0gaWZfZWxzZShyMV8yNCA9PSAiYiIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMjUgPSBpZl9lbHNlKHIxXzI1ID09ICJoIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8yNiA9IGlmX2Vsc2UocjFfMjYgPT0gImQiLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzI3ID0gaWZfZWxzZShyMV8yNyA9PSAiYSIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMjggPSBpZl9lbHNlKHIxXzI4ID09ICJoIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8yOSA9IGlmX2Vsc2UocjFfMjkgPT0gImciLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzMwID0gaWZfZWxzZShyMV8zMCA9PSAiYyIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMzEgPSBpZl9lbHNlKHIxXzMxID09ICJiIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8zMiA9IGlmX2Vsc2UocjFfMzIgPT0gImciLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzMzID0gaWZfZWxzZShyMV8zMyA9PSAiaCIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMzQgPSBpZl9lbHNlKHIxXzM0ID09ICJhIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8zNSA9IGlmX2Vsc2UocjFfMzUgPT0gImMiLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzM2ID0gaWZfZWxzZShyMV8zNiA9PSAiZyIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfMzcgPSBpZl9lbHNlKHIxXzM3ID09ICJhIiwxLDApKSAlPiUgDQogIG11dGF0ZShyMV8zOCA9IGlmX2Vsc2UocjFfMzggPT0gImMiLDEsMCkpICU+JSANCiAgbXV0YXRlKHIxXzM5ID0gaWZfZWxzZShyMV8zOSA9PSAiaCIsMSwwKSkgJT4lIA0KICBtdXRhdGUocjFfNDAgPSBpZl9lbHNlKHIxXzQwID09ICJnIiwxLDApKQ0KDQpgYGANCg0KIyMgU2NvcmUgUjENCg0KYGBge3IsIGV2YWwgPSBGQUxTRSB9DQpkcyA8LSBkcyAlPiUgI2dldCBkcw0KICBzZWxlY3QoaWQsIHIxXzE6cjFfNDApICU+JSAjc2VsZWN0IGlkIGFuZCBSMSBpdGVtcyANCiAgZmlsdGVyX2F0KHZhcnMoLWlkKSwgYW55X3ZhcnMoIWlzLm5hKC4pKSkgJT4lICAjZmlsdGVyIGlmIGFsbCBSMSBpcyBlbXB0eQ0KICBtdXRhdGUodG90YWxfcjEgPSByb3dTdW1zKHNlbGVjdCguLCByMV8xOnIxXzQwKSwgbmEucm09VCkpICU+JSAgI2NyZWF0ZSBhIHN1bW1hdGl2ZSBzY29yZQ0KICBzZWxlY3QoaWQsIHRvdGFsX3IxKSAlPiUgICNzZWxlY3QgdG8gbWVyZ2UNCiAgbGVmdF9qb2luKGRzLC4sIGJ5ID0gImlkIikgI2pvaW4NCmBgYA0KDQoNCiMgRGF0YSBBbmFseXNpcw0KDQojIyBMb2FkIGRhdGENCg0KYGBge3IsIGV2YWwgPSBUUlVFIH0NCmxvYWQoIkM6L1VzZXJzL2x1aXNmL0Ryb3Bib3gvUHVjLVJpby9Db25zdWx0b3JpYSAtIEl2YW4gUmFiZWxvLzIwMjEgLSBBcnRpZ28gLS0gUFNSQy9CYXNlIC0gTUVNT1JFIDIwMjAgQXV0b21hdGVkIG1vZGVsIHNlbGVjdGlvbi5SRGF0YSIpDQpgYGANCg0KDQojIyBQc3ljaG9tZXRyaWMgcHJvcGVydGllcw0KDQojIyMgTUVNT1JFIA0KDQpgYGB7cn0NCnVzZXJmcmllbmRseXNjaWVuY2U6OnNjYWxlUmVsaWFiaWxpdHkoZGF0PWRzICU+JSBzZWxlY3Qoc3RhcnRzX3dpdGgoImNvZGVfcmVzcCIpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gJ2FsbCcsIGRpZ2l0cyA9IDIsIGNpID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgaW50ZXJ2YWwudHlwZT0ibm9ybWFsLXRoZW9yeSIsIGNvbmYubGV2ZWw9Ljk1LA0KICAgICAgICAgICAgICAgICBzaWxlbnQ9RkFMU0UsIHNhbXBsZXM9MTAwMCwgYm9vdHN0cmFwU2VlZCA9IE5VTEwsDQogICAgICAgICAgICAgICAgIG9tZWdhLnBzeWNoID0gVFJVRSwgcG9seSA9IFRSVUUpDQpgYGANCiMjIyBSb3Rhcw0KDQpgYGB7cn0NCmRzICU+JSANCiAgc2VsZWN0KHJvdGFfYywgcm90YV9hLCByb3RhX2QpICU+JSBhcy5tYXRyaXgoKSAlPiUgSG1pc2M6OnJjb3JyKCkgDQpgYGANCg0KDQojIyBUYWJsZSAxIERlbW9ncmFwaGljcw0KDQpgYGB7cn0NCmRzICU+JSANCiAgc2VsZWN0KGlkYWRlLCBzZXhvLCBlc2NvbGFyaWRhZGVfZ3J1cG8sIHVfZm5hc2MpICU+JQ0KICAjYXJzZW5hbDo6dGFibGVieSh+LiwgZGF0YSA9IC4pICU+JSBzdW1tYXJ5KCkNCiAgY29tcGFyZUdyb3Vwczo6Y29tcGFyZUdyb3Vwcyggfi4sIGluY2x1ZGUubWlzcyA9IFQpICU+JSANCiAgY29tcGFyZUdyb3Vwczo6Y3JlYXRlVGFibGUoKSANCmBgYA0KDQoNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKGRzJHNleG8pKQ0KYGBgDQoNCmBgYHtyfQ0KY2hpc3EudGVzdCh0YWJsZShkcyRlc2NvbGFyaWRhZGVfZ3J1cG8pKQ0KYGBgDQoNCiMjIFRhYmxlIDIgTWVhbnMgYW5kIFNEIA0KDQpgYGB7ciByZXN1bHRzID0gJ2FzaXMnIH0NCmRzICU+JSANCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJyb3RhIiksIHRvdGFsX3IxLCBtZW1vcmVfdG90YWwpICU+JSANCiAgZGVzY3IoIHBsYWluLmFzY2lpID0gRkFMU0UsIHN0eWxlID0gJ3JtYXJrZG93bicpDQpgYGANCg0KDQoNCiMgQXV0b21hdGljIHNlbGVjdGlvbiBmb3IgY29nbml0aXZlIGV4cGxvcmF0aW9ucw0KDQpgYGB7ciBjcmVhdGluZyBhIGF1dG9tYXRpYyBtb2RlbCB9DQpmaXQgPC0gZ2xtdWx0aShtZW1vcmVfdG90YWwgfiB0b3RhbF9yMSArIHJvdGFfYyArIHJvdGFfYSArIHJvdGFfZCwgDQogICAgICAgICAgZGF0YSA9IGRzLCANCiAgICAgICAgICBjcml0ID0gImFpY2MiLA0KICAgICAgICAgIGxldmVsID0gMiwgI2FsbG93IGludGVyYWN0aW9uDQogICAgICAgICAgbWV0aG9kID0gImciLA0KICAgICAgICAgIGNvbmZzZXRzaXplID0gMTEzLA0KICAgICAgICAgIG1hcmdpbmFsaXR5ID0gVCkgIzwtLSBEb24ndCBsZWF2ZSBvdXQgdGhlIG1haW4gZWZmZWN0DQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGZpdCkNCmBgYA0KIyMgVGFibGUgMyBUb3AgUmFua2VkIHJlc3VsdHMNCg0KYGBge3IgY2hlY2sgbW9kbHMgfQ0KI3N1bW1hcnkoZml0KSRiZXN0bW9kZWwNCiNDaGVjayBtb2RlbHMNCnRvcCA8LSB3ZWlnaHRhYmxlKGZpdCkNCnRvcCA8LSB0b3BbdG9wJGFpY2MgPD0gbWluKHRvcCRhaWNjKSArIDIsXQ0KdG9wDQojaHR0cDovL3d3dy5tZXRhZm9yLXByb2plY3Qub3JnL2Rva3UucGhwL3RpcHM6bW9kZWxfc2VsZWN0aW9uX3dpdGhfZ2xtdWx0aV9hbmRfbXVtaW4NCmBgYA0KDQoNCmBgYHtyIHBsb3QgdGhlIHJlc3VsdHMgfQ0KI1IgYmFzZSBwbG90cw0KcGxvdChmaXQsIHR5cGUgPSAicyIpICM8LS0gcmVsYXRpdmUgaW1wb3J0YW5jZQ0KcGxvdChmaXQsIHR5cGUgPSAidyIpICM8LSBtb2RlbCB3ZWlnaHRzDQpgYGANCg0KYGBge3J9DQojIFBsb3QgSW1wb3J0YW5jaWEgbWVkaWEgZG9zIHRlcm1vcw0KY29lZihmaXQpICU+JSANCiAgZGF0YS5mcmFtZSgpICU+JSANCiAgcm93bmFtZXNfdG9fY29sdW1uKCJQcmVkaWN0b3IiKSAlPiUgDQogIGZpbHRlcihQcmVkaWN0b3IgIT0gIihJbnRlcmNlcHQpIikgJT4lIA0KICBqYW5pdG9yOjpjbGVhbl9uYW1lcygpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMocHJlZGljdG9yKSwgDQogICAgICAgICAgICBsaXN0KH5zdHJfcmVwbGFjZSguLCAicm90YV9hIiwgIkFsdGVybmF0aW5nICBhdHRlbnRpb24iKSAlPiUgDQogICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoLiwgInJvdGFfZCIsICJEaXZpZGVkIGF0dGVudGlvbiIpICU+JSANCiAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSguLCAicm90YV9jIiwgIlNlbGVjdGl2ZSBhdHRlbnRpb24iKSAlPiUgDQogICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoLiwgInRvdGFsX3IxIiwgIkludGVsbGlnZW5jZSIpKSkgJT4lIA0KICBnZ3Bsb3QoLiwgYWVzKHg9IGZjdF9pbm9yZGVyKHByZWRpY3RvciwgaW1wb3J0YW5jZSksIHkgPSBpbXBvcnRhbmNlKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGNvbG9yPSJibGFjayIsIA0KICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjgsICBsaW5ldHlwZT0iZG90dGVkIikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICJJbXBvcnRhbmNlIikgKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkgKw0KICB0aGVtZV9idygpDQpgYGANCg0KIyMgVGFibGUgNCBNdWx0aXBsZSByZWdyZXNzaW9uIG1vZGVsDQoNCmBgYHtyIGNyZWF0ZSB0aGUgcmlnaHQgbW9kZWwgfQ0KbW9kX2ZpbmFsIDwtIGxtKG1lbW9yZV90b3RhbCB+IHJvdGFfYyArIHRvdGFsX3IxLCBkcykNCmBgYA0KDQoNCg0KYGBge3J9DQpvbHNycjo6b2xzX3JlZ3Jlc3MobW9kX2ZpbmFsKQ0KYGBgDQoNCg0KYGBge3J9DQpjaGVja19ub3JtYWxpdHkobW9kX2ZpbmFsKQ0KYGBgDQoNCmBgYHtyfQ0KY2hlY2tfaGV0ZXJvc2NlZGFzdGljaXR5KG1vZF9maW5hbCkNCmBgYA0KDQpgYGB7cn0NCiNvbHNycjo6b2xzX3Rlc3RfYnJldXNjaF9wYWdhbihtb2RfZmluYWwpDQpjaGVja19jb2xsaW5lYXJpdHkobW9kX2ZpbmFsKQ0KYGBgDQoNCmBgYHtyfQ0Kb2xzcnI6Om9sc192aWZfdG9sKG1vZF9maW5hbCkNCmBgYA0KDQoNCmBgYHtyIGJvb3RzdHJhcCB0aGUgcmVncmVzc2lvbiBtb2RlbCB9DQptb2RfZmluYWxfYm9vdCA8LSBzaW1wbGVib290OjpsbS5ib290KG1vZF9maW5hbCwgUiA9IDEwMDApDQpzdW1tYXJ5KG1vZF9maW5hbF9ib290KQ0KYGBgDQoNCg0KDQpgYGB7ciBwbG90IGl0IHRvZ2V0aGVyIH0NCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKA0KZ2dwbG90KGRzLCBhZXMoeD1yb3RhX2MsIHkgPSBtZW1vcmVfdG90YWwpKSArDQogIGdlb21faml0dGVyKCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIGxhYnMoeCA9ICJTZWxlY3RpdmUgYXR0ZW50aW9uIiwgeSA9ICJWaXN1YWwgc2hvcnQtdGVybSBtZW1vcnkiKSArIHRoZW1lX2J3KCksDQoNCmdncGxvdChkcywgYWVzKHg9dG90YWxfcjEsIHkgPSBtZW1vcmVfdG90YWwpKSArDQogIGdlb21faml0dGVyKCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIGxhYnMoeCA9ICJHZW5lcmFsIG5vbi12ZXJiYWwgaW50ZWxsaWdlbmNlICIsIHkgPSAiVmlzdWFsIHNob3J0LXRlcm0gbWVtb3J5IikgKyB0aGVtZV9idygpKQ0KDQpgYGANCg0KDQpgYGB7ciBwbG90IHByZWRpY3Rpb25zIH0NCmdnUHJlZGljdChtb2RfZmluYWwsIHNlPVRSVUUsaW50ZXJhY3RpdmU9VFJVRSkNCiNodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZ2dpcmFwaEV4dHJhL3ZpZ25ldHRlcy9nZ1ByZWRpY3QuaHRtbA0KI2h0dHBzOi8vcnB1YnMuY29tL2NhcmRpb21vb24vNDc0NzA3DQpgYGANCg0KDQojIFBBU1Q6IFRyeWluZyB0byBoYXZlIGFuIGF1dG9tYXRpYyBzZWxlY3Rpb24gKERpc2NhcnRlZCBkdWUgdG8gdGhlb3JldGljYWwgaW5jb25zaXN0ZW5jeSkNCg0KDQojIyBnbG11bHRpIGFjaGlldmUgYSBzb2x1dGlvbi4NCg0KYGBge3IsIGV2YWwgPSBGQUxTRSB9DQpmaXQyIDwtIGdsbXVsdGk6OmdsbXVsdGkobWVtb3JlX3RvdGFsIH4gdG90YWxfcjEgKyByb3RhX2MgKyByb3RhX2EgKyByb3RhX2QsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gZHMsIGNyaXQgPSAiYmljIikNCnN1bW1hcnkoZml0MikNCg0KYGBgDQoNCg0KRGVzcGl0ZSB0aGlzIGFjaGlldmVtZW50LCB0aGlzIHNvbHV0aW9uIGlzIG5vdCBkdWFibGUuIElzIHRoZW9yZXRpY2FsbHkgbWVhbmlubGVzcy4gDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0KZml0MiA8LSBsbShtZW1vcmVfdG90YWwgfiAxICsgcm90YV9jOnRvdGFsX3IxLCBkcykNCmludGVyYWN0aW9uczo6aW50ZXJhY3RfcGxvdChtb2RlbCA9IGZpdDIsIHByZWQgPSByb3RhX2MsIG1vZHggPSB0b3RhbF9yMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IFRSVUUsIHJvYnVzdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LnR5cGUgPSAiY29uZmlkZW5jZSIsIGludC53aWR0aCA9IC44KQ0KDQpzdW1tYXJ5KGZpdDIpDQoNCmBgYA0KDQoNCkknbGwgdHJ5IHRvIHNpbXVsYXRlIHdpdGggdGhlIGRhdGEgY29tcHV0aW5nIHRoZSBTRCBmb3IgUjEuDQoNCmBgYHtyLCBldmFsPUZBTFNFIH0NCmRzICU+JSANCiAgbXV0YXRlKGNhdF9yMSA9IGNhc2Vfd2hlbigNCiAgICB0b3RhbF9yMSA+PSByb3VuZChtZWFuKHRvdGFsX3IxLCBuYS5ybT1UKSwwKStyb3VuZChzZCh0b3RhbF9yMSwgbmEucm09VCksMCkgfiAiQWNpbWEiLA0KICAgIHRvdGFsX3IxIDw9IHJvdW5kKG1lYW4odG90YWxfcjEsIG5hLnJtPVQpLDApLXJvdW5kKHNkKHRvdGFsX3IxLCBuYS5ybT1UKSwwKSB+ICJBYmFpeG8iLA0KICAgIHRvdGFsX3IxID4gcm91bmQobWVhbih0b3RhbF9yMSwgbmEucm09VCksMCktcm91bmQoc2QodG90YWxfcjEsIG5hLnJtPVQpLDApIA0KICAgICYgdG90YWxfcjEgPCByb3VuZChtZWFuKHRvdGFsX3IxLCBuYS5ybT1UKSwwKStyb3VuZChzZCh0b3RhbF9yMSwgbmEucm09VCksMCl+ICJNw6lkaWEiKSkgLT4gZHMNCg0KDQpgYGANCg0KVGhhbiBjaGVja2luZyBpdHMgZWZmZWN0cw0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFIH0NCmxtKG1lbW9yZV90b3RhbCB+IHJvdGFfYyAqIGZhY3RvcihjYXRfcjEpLCBkcykgJT4lIA0KICBhcGFUYWJsZXM6OmFwYS5hb3YudGFibGUoLiwgdHlwZSA9IDMpDQoNCmBgYA0KQW5kIHBsb3R0aW5nDQoNCmBgYHtyLCBldmFsID0gRkFMU0UgfQ0KZHMgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGNhdF9yMSkpICU+JSANCiAgZ2dwbG90KC4sIGFlcyh4PXJvdGFfYywgeSA9IG1lbW9yZV90b3RhbCwgY29sb3IgPSBjYXRfcjEpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKQ0KYGBgDQoNCg0KYGBge3IsIGV2YWwgPSBGQUxTRSB9DQpkcyAlPiUgDQogIGZpbHRlcighaXMubmEoY2F0X3IxKSkgJT4lIA0KICBzZWxlY3QoY2F0X3IxLCB0b3RhbF9yMSkgJT4lIA0KICBwcmludChuPW5yb3coLikpDQpgYGANCg0KYGBge3IsIGV2YWwgPSBGQUxTRSB9DQpkcyAlPiUgDQogIGdyb3VwX2J5KGNhdF9yMSkgJT4lIA0KICBzdW1tYXJpc2UobWVhbih0b3RhbF9yMSkpDQpgYGANCg0KDQpgYGB7ciwgZXZhbD1GQUxTRSB9DQp3cml0ZS50YWJsZShkcywgZmlsZT0ibWVtb3JlX3NlbS5jc3YiLCByb3cubmFtZXM9RkFMU0UsIGNvbC5uYW1lcz1UUlVFLCBzZXAgPSAiLCIsIHFtZXRob2QgPSAiZG91YmxlIikgDQpgYGANCg0KDQoNCiMgQ29weXJpZ2h0LCAyMDIxDQojIEx1aXMgQW51bmNpYcOnw6NvLCBQaEQgLSBsdWlzZmNhQHB1Yy1yaW8uYnIgKFBVQy1SaW8pDQo=