The primary research question was to examine how time and demographic variables predict depressive symptom severity as measured by the Patient Health Questionnaire‑9 (PHQ‑9). To evaluate the robustness of results to measurement error and outliers, three analytic approaches are compared:

  1. Ordinary Least Squares (OLS) regression using total PHQ‑9 sum score as the outcome.
  2. OLS regression using a latent depression factor score derived from factor analysis (CFA) of PHQ‑9 items.
  3. Robust regression (M‑estimation) using the latent factor score outcome to down‑weight influential observations.

Demographic predictors included:

  • Race (reference level=White vs all other levels)
  • Gender (reference level=Male vs all other levels)
  • Sexual orientation (reference level=Heterosexual vs all other levels)
  • Class year (reference level=First year vs all other levels)
  • Varsity athlete status (reference level=No)
  • Transfer student status (reference level=No )

The comparison of these models allow assessment of (a) whether latent modeling alters inferences relative to summed scores, and (b) whether results are stable when down‑weighting outliers.

The secondary research question was the following: based on the Interpersonal-Psychological Theory of Suicide Behavior (commonly known as Joiner’s theory) and reflecting the established trends of increasing risk of suicide in college aged young adults, we hypothesize increased distress over time in the following variables will relate to corresponding increases in mean PHQ9 scores over time. The same analytical methods mentioned above will be used.

1 Data Preparation

1.1 Missing data handling

For Model 1 for both research questions, missingness in the total PHQ‑9 score followed listwise deletion unless otherwise noted. For Model 2 and Model 3 for both research questions, the CFA estimated using Full Information Maximum Likelihood (FIML) to retain cases with partial item‑level missingness.

1.2 Predictor coding

Categorical predictors (race, gender, sexual orientation, class year, varsity athlete, transfer status) were dummy‑coded. Reference groups are listed above and were selected based on theoretical relevance or sample size. Time was coded as a numeric index, representing semester, starting with Fall 2017.

1.3 Measurement Model: Latent Depression Factor

Before Models 2 and 3, a Confirmatory Factor Analysis (CFA) was fit to the nine PHQ‑9 items using a single‑factor model, consistent with evidence supporting a strong general depression factor in the PHQ‑9.

2 Demographics

Gender n (%)
Woman 1850 (76.7%)
Man 477 (19.8%)
Non-binary 46 (1.9%)
PNA 21 (0.9%)
Trans man 10 (0.4%)
Trans woman 5 (0.2%)
NA 4 (0.2%)
Class n (%)
First year 662 (27.4%)
Junior 578 (24%)
Sophomore 539 (22.3%)
Senior 415 (17.2%)
Senior+ 178 (7.4%)
Post bacc 40 (1.7%)
NA 1 (0%)
Sexual Orientation n (%)
Heterosexual 1634 (67.7%)
Bisexual 293 (12.1%)
PNA 108 (4.5%)
Gay/lesbian 106 (4.4%)
Questioning 85 (3.5%)
Asexual 66 (2.7%)
Queer 46 (1.9%)
Pansexual 37 (1.5%)
DNI 28 (1.2%)
Panromantic 5 (0.2%)
NA 5 (0.2%)
Race n (%)
Native American/Alaskan Native 1807 (74.9%)
African/Afro-Caribbean/Black 224 (9.3%)
Multi-ethnic 118 (4.9%)
White 90 (3.7%)
Asia/PI 90 (3.7%)
PNA 48 (2%)
DNI 15 (0.6%)
Arab/ME 13 (0.5%)
NA 8 (0.3%)
Varsity athlete n (%)
No 2319 (96.1%)
Yes 89 (3.7%)
NA 5 (0.2%)
Transfer n (%)
No 1858 (77%)
Yes 541 (22.4%)
NA 14 (0.6%)

3 Research Question 1

3.1 RQ1 Ordinary Least Squares

A linear regression model was estimated: PHQ9 Total=β0​+β1​Time+β2​Race+…+βk​Transfer+ϵ.

Assumptions of linearity, homoscedasticity, normality of residuals, and influence diagnostics (standardized residuals, leverage, Cook’s distance) were examined. Diagnostics identical to Model 1 were performed to evaluate residual patterns and influential observations. These graphs are suppressed for this report but available.

3.1.1 RQ1 OLS Model 1 results


Call:
lm(formula = Score ~ Period + MClass + MRace + MSorient + MGender + 
    Varsitya2 + Transfer2, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-15.7981  -3.8806  -0.0383   3.8505  13.4061 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)              12.80676    0.40946  31.277  < 2e-16 ***
Period                    0.07407    0.02685   2.758  0.00585 ** 
MClassNot first year      0.03937    0.25881   0.152  0.87910    
MRaceWhite                0.79909    0.57905   1.380  0.16772    
MSorientNot heterosexual  2.11096    0.24074   8.769  < 2e-16 ***
MGenderNot a man/DNI     -0.21507    0.28056  -0.767  0.44340    
Varsitya2Yes             -0.89803    0.60141  -1.493  0.13552    
Transfer2Yes              0.38951    0.27442   1.419  0.15591    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.387 on 2373 degrees of freedom
  (32 observations deleted due to missingness)
Multiple R-squared:  0.04041,   Adjusted R-squared:  0.03758 
F-statistic: 14.27 on 7 and 2373 DF,  p-value: < 2.2e-16

3.1.2 RQ1 OLS Model 1 Assessment

An ordinary least squares (OLS) regression was fitted with the PHQ 9 total score as the dependent variable. Predictors included time and the six demographic variables.

The variables that were found to significantly predict PHQ9 were the time variable Period(B=0.074, p=.00585) and Sexual Orientation (B=2.111, p<2e-16).

3.2 RQ1 Factor analysis (FA) model 2 results

The extracted PHQ‑9 factor score will be used as the dependent variable:

Latent Depression Factor=β0​+β1​Time+β2​Race+…+βk​Transfer+ϵ

This model adjusts for measurement error in PHQ‑9 items by using a more precise estimate of underlying depression severity. Assumptions of linearity, homoscedasticity, normality of residuals, and influence diagnostics (standardized residuals, leverage, Cook’s distance) were examined. Diagnostics were performed to evaluate residual patterns and influential observations. These graphs are suppressed for this report but available.


Call:
lm(formula = Score_factor ~ Period + MClass + MSorient + MRace + 
    MGender + Varsitya2 + Transfer2, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.67221 -0.67273  0.00352  0.66765  2.11393 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)              -0.183584   0.068651  -2.674  0.00754 ** 
Period                    0.012520   0.004502   2.781  0.00546 ** 
MClassNot first year      0.015495   0.043393   0.357  0.72106    
MSorientNot heterosexual  0.347262   0.040363   8.604  < 2e-16 ***
MRaceWhite                0.091624   0.097086   0.944  0.34540    
MGenderNot a man/DNI     -0.071377   0.047039  -1.517  0.12930    
Varsitya2Yes             -0.123856   0.100835  -1.228  0.21945    
Transfer2Yes              0.068724   0.046010   1.494  0.13539    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.9031 on 2373 degrees of freedom
  (32 observations deleted due to missingness)
Multiple R-squared:  0.03911,   Adjusted R-squared:  0.03628 
F-statistic:  13.8 on 7 and 2373 DF,  p-value: < 2.2e-16

3.2.1 FA Model 2 Assessment

A confirmatory factor analysis (CFA) estimated a single latent depression factor from the nine PHQ 9 items. The CFA was estimated using FIML with the latent factor variance fixed to 1. Individual factor scores were extracted using regression based scoring. These latent scores served as the dependent variable in an OLS regression with the same set of demographic and time predictors as Model 1.

The variables that were found to significantly predict PHQ9 were the time variable Period(B=0.013, p=.008) and Sexual Orientation (B=.347, p<2e-16).

3.3 Robust regression model 3

Model 3: Robust regression with latent factor score To evaluate sensitivity to influential observations and distributional assumptions, a robust M‑estimation regression was conducted: Latent Depression Factor=β0​+β1​Time+β2​Race+…+βk​Transfer+ϵrobust​

Implementation: rlm() (MASS). Estimator: Huber. This model down‑weights extreme residuals rather than deleting them. Coefficient estimates and standard errors were compared to OLS results to assess robustness.


Call:
lmrob(formula = Score_factor ~ Period + MClass + MSorient + MRace + MGender + 
    Varsitya2 + Transfer2, data = data, fast.s.large.n = Inf)
 \--> method = "MM"
Residuals:
      Min        1Q    Median        3Q       Max 
-2.699479 -0.677933  0.001548  0.655582  2.117162 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)              -0.178827   0.076756  -2.330  0.01990 *  
Period                    0.012730   0.004738   2.687  0.00727 ** 
MClassNot first year      0.011714   0.047015   0.249  0.80327    
MSorientNot heterosexual  0.380852   0.043962   8.663  < 2e-16 ***
MRaceWhite                0.080930   0.105184   0.769  0.44172    
MGenderNot a man/DNI     -0.080203   0.051775  -1.549  0.12150    
Varsitya2Yes             -0.115778   0.094449  -1.226  0.22038    
Transfer2Yes              0.068361   0.047719   1.433  0.15211    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Robust residual standard error: 0.9718 
  (32 observations deleted due to missingness)
Multiple R-squared:  0.04242,   Adjusted R-squared:  0.03959 
Convergence in 11 IRWLS iterations

Robustness weights: 
 199 weights are ~= 1. The remaining 2182 ones are summarized as
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.4205  0.8778  0.9496  0.9185  0.9844  0.9990 
Algorithmic parameters: 
       tuning.chi                bb        tuning.psi        refine.tol 
        1.548e+00         5.000e-01         4.685e+00         1.000e-07 
          rel.tol         scale.tol         solve.tol          zero.tol 
        1.000e-07         1.000e-10         1.000e-07         1.000e-10 
      eps.outlier             eps.x warn.limit.reject warn.limit.meanrw 
        4.200e-05         2.910e-11         5.000e-01         5.000e-01 
  nResample      max.it    best.r.s    k.fast.s       k.max maxit.scale 
        500          50           2           1         200         200 
  trace.lev         mts  compute.rd 
          0        1000           0 
                  psi           subsampling                   cov 
           "bisquare"         "nonsingular"         ".vcov.avar1" 
compute.outlier.stats 
                 "SM" 
seed : int(0) 

3.3.1 Robust Regression Model 3 Assessment

To assess sensitivity to influential observations, a robust regression model (M‑estimation, Huber or bisquare loss function) was fitted using the same predictors and the same latent factor score outcome as in Model 2. Robust regression down‑weights observations with large residuals rather than removing them. This approach provides coefficient estimates that are more stable in the presence of outliers or heteroskedasticity.

The variables that were found to significantly predict PHQ9 were the time variable Period(B=0.013, p=.008) and Sexual Orientation (B=.381, p<2e-16).

3.4 Model Comparison

The three models performed similarly. The predictor variables Period and Sexual Orientation were significant in all three models, with no other significant predictors.

4 Research Question 2

Based on the Interpersonal-Psychological Theory of Suicide Behavior (commonly known as Joiner’s theory) and reflecting the established trends of increasing risk of suicide in college aged young adults, we hypothesize increased distress over time in the following variables will relate to corresponding increases in mean PHQ9 scores over time-

  1. Loneliness
  2. Hopelessness
  3. Desperate feelings
  4. Out of control feelings
  5. Drinking more
  6. Drinking too much
  7. Drug use
  8. Suicidal thoughts in last two weeks
  9. Suicide plans in the last two weeks
  10. Suicide actions in the last two weeks
  11. Suicide attempts over lifetime

4.1 Research Question 2 All Models results

The models below use a new selection of factors to predict PHQ9. The models are fit in the same three methods as the models above: 1) OLS on the PHQ9 total, 2) OLS on the PHQ9 latentOLS depression factor score derived from factor analysis (CFA), 3) Robust regression (M‑estimation) using the latent factor score outcome to down‑weight influential observations.

Model 1: The variables that were found to significantly predict PHQ9 were the time variable Period(B=0.069, p=.0003), Loneliness (B=1.03 , p<2-16), Hopelessness (B=1.45, p,2-16), Desperate feelings (B=.459, p=7.45e-5), Out of Control Feelings (B=1.04, p<2e-16), Drug Use (B=0.269, p=.0218), Suicidal Thoughts (B=1.14, p=7.25e-10), Suicidal Actions (B=.61, p=.009), and Suicidal Attempts (B=.901, p=.0004).

Model 2: The variables that were found to significantly predict PHQ9 were the time variable Period(B=0.012, p=.0002), Loneliness (B=0.189, p<2-16), Hopelessness (B=0.287, p,2-16), Desperate feelings (B=.076, p=5.55e-5), Out of Control Feelings (B=0.159, p<2e-16), Drug Use (B=0.042, p=.0268), Suicidal Thoughts (B=0.167, p=2.33e-8), and Suicidal Attempts (B=.144, p=.0004).

Suicidal actions (B=0.071, p=.064) did not meet the 5% significance level threshold as it did in model 1.

Model 3: The variables that were found to significantly predict PHQ9 were the time variable Period(B=0.011, p=.0004), Loneliness (B=0.199, p<2-16), Hopelessness (B=0.293, p,2-16), Desperate feelings (B=.076, p=.0001), Out of Control Feelings (B=0.166, p<2e-16), Drug Use (B=0.040, p=.046), Suicidal Thoughts (B=0.166, p=7.93e-8), and Suicidal Attempts (B=.158, p=.0001).

Models 2 and 3 performed nearly identically.


Call:
lm(formula = Score ~ Period + Lonely + Hopeless + Desperat + 
    Control + Drink + TooMuch + Drugs + Thoughts + Plans + Actions + 
    Attempt, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-13.4455  -2.6818   0.0053   2.7105  13.6749 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  5.76309    0.35739  16.126  < 2e-16 ***
Period       0.06964    0.01932   3.604 0.000320 ***
Lonely       1.02545    0.09479  10.818  < 2e-16 ***
Hopeless     1.45184    0.12255  11.847  < 2e-16 ***
Desperat     0.45893    0.11566   3.968 7.46e-05 ***
Control      1.03982    0.09617  10.812  < 2e-16 ***
Drink        0.25312    0.18219   1.389 0.164859    
TooMuch      0.14293    0.18994   0.752 0.451834    
Drugs        0.26873    0.11709   2.295 0.021821 *  
Thoughts     1.13672    0.18374   6.187 7.25e-10 ***
Plans        0.42179    0.26973   1.564 0.118008    
Actions      0.60894    0.23278   2.616 0.008958 ** 
Attempt      0.90122    0.25207   3.575 0.000357 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.885 on 2318 degrees of freedom
  (82 observations deleted due to missingness)
Multiple R-squared:  0.5022,    Adjusted R-squared:  0.4996 
F-statistic: 194.8 on 12 and 2318 DF,  p-value: < 2.2e-16

Call:
lm(formula = Score_factor ~ Period + Lonely + Hopeless + Desperat + 
    Control + Drink + TooMuch + Drugs + Thoughts + Plans + Actions + 
    Attempt, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.21545 -0.42733  0.00515  0.43480  2.35759 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.428759   0.058041 -24.617  < 2e-16 ***
Period       0.011602   0.003138   3.697 0.000223 ***
Lonely       0.189447   0.015395  12.306  < 2e-16 ***
Hopeless     0.287089   0.019903  14.425  < 2e-16 ***
Desperat     0.075859   0.018783   4.039 5.55e-05 ***
Control      0.158954   0.015618  10.177  < 2e-16 ***
Drink        0.020831   0.029588   0.704 0.481466    
TooMuch      0.035200   0.030846   1.141 0.253924    
Drugs        0.042126   0.019016   2.215 0.026837 *  
Thoughts     0.167249   0.029840   5.605 2.33e-08 ***
Plans        0.047635   0.043804   1.087 0.276947    
Actions      0.070107   0.037805   1.854 0.063801 .  
Attempt      0.143878   0.040936   3.515 0.000449 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.6309 on 2318 degrees of freedom
  (82 observations deleted due to missingness)
Multiple R-squared:  0.5315,    Adjusted R-squared:  0.5291 
F-statistic: 219.2 on 12 and 2318 DF,  p-value: < 2.2e-16

Call:
lmrob(formula = Score_factor ~ Period + Lonely + Hopeless + Desperat + Control + 
    Drink + TooMuch + Drugs + Thoughts + Plans + Actions + Attempt, data = data, 
    fast.s.large.n = Inf)
 \--> method = "MM"
Residuals:
      Min        1Q    Median        3Q       Max 
-2.237177 -0.420806  0.002442  0.437523  2.387504 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.479074   0.059819 -24.726  < 2e-16 ***
Period       0.011496   0.003212   3.578 0.000353 ***
Lonely       0.199107   0.015975  12.464  < 2e-16 ***
Hopeless     0.293227   0.020784  14.108  < 2e-16 ***
Desperat     0.075725   0.019500   3.883 0.000106 ***
Control      0.166486   0.016549  10.060  < 2e-16 ***
Drink        0.023790   0.030019   0.792 0.428151    
TooMuch      0.032039   0.030407   1.054 0.292143    
Drugs        0.039985   0.019988   2.000 0.045571 *  
Thoughts     0.165659   0.030757   5.386 7.93e-08 ***
Plans        0.051581   0.039575   1.303 0.192579    
Actions      0.064476   0.034198   1.885 0.059502 .  
Attempt      0.158464   0.041434   3.824 0.000135 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Robust residual standard error: 0.6348 
  (82 observations deleted due to missingness)
Multiple R-squared:  0.5455,    Adjusted R-squared:  0.5431 
Convergence in 10 IRWLS iterations

Robustness weights: 
 202 weights are ~= 1. The remaining 2129 ones are summarized as
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.1264  0.8747  0.9492  0.9086  0.9847  0.9990 
Algorithmic parameters: 
       tuning.chi                bb        tuning.psi        refine.tol 
        1.548e+00         5.000e-01         4.685e+00         1.000e-07 
          rel.tol         scale.tol         solve.tol          zero.tol 
        1.000e-07         1.000e-10         1.000e-07         1.000e-10 
      eps.outlier             eps.x warn.limit.reject warn.limit.meanrw 
        4.290e-05         2.910e-11         5.000e-01         5.000e-01 
  nResample      max.it    best.r.s    k.fast.s       k.max maxit.scale 
        500          50           2           1         200         200 
  trace.lev         mts  compute.rd 
          0        1000           0 
                  psi           subsampling                   cov 
           "bisquare"         "nonsingular"         ".vcov.avar1" 
compute.outlier.stats 
                 "SM" 
seed : int(0) 
LS0tDQp0aXRsZTogIklTUCBTdGF0aXN0aWNhbCBBbmFseXNpcyBSZXBvcnQiDQphdXRob3I6ICIiDQpkYXRlOiAiIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEYsIGNvbW1lbnQ9TkEsIHdhcm5pbmc9RiwgcmVzdWx0cz1ULCBtZXNzYWdlPUYpDQoNCnNldHdkKCJDOi9Vc2Vycy83NUxQWU9UVC9PbmVEcml2ZSAtIFdlc3QgQ2hlc3RlciBVbml2ZXJzaXR5IG9mIFBBL1JJU1IvUEhROSIpDQoNCmRhdGE9cmVhZC5jc3YoIkZ1bGxEYXRhUmVwb3J0RGVpZGVudGlmaWVkLmNzdiIsIGhlYWRlcj1UKQ0KDQojIFBhY2thZ2VzDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkob2xzcnIpDQpsaWJyYXJ5KGdwbG90cykNCmxpYnJhcnkoc2FuZHdpY2gpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KGxhdmFhbikNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkobW9kZXJuZGl2ZSkNCmxpYnJhcnkocm9idXN0YmFzZSkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KZGF0YSA9IGRhdGEgJT4lDQogIGZpbHRlcihBZ2U+PTE4KQ0KYGBgDQoNCg0KYGBgIHtyIGRhdGFtZ3QsIGluY2x1ZGU9Rn0NCiNjcmVhdGUgdGltZSB2YXJpYWJsZXMNCmRhdGEkQXNzZXNzID0gIGFzLkRhdGUoZGF0YSRBc3Nlc3MsIGZvcm1hdD0iJW0vJWQvJVkiKQ0KZGF0YSRtb250aCA9IGFzLm51bWVyaWMoZm9ybWF0KGRhdGEkQXNzZXNzLCAiJW0iKSkNCmRhdGEkeWVhciA9IGFzLm51bWVyaWMoZm9ybWF0KGRhdGEkQXNzZXNzLCAiJVkiKSkNCg0KI2NyZWF0ZSBzZW1lc3RlciB2YXJpYWJsZQ0KZGF0YSA9IGRhdGEgJT4lDQogIG11dGF0ZSh0ZXJtPWNhc2Vfd2hlbihtb250aDw2fiJmYWxsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoPjZ+InNwcmluZyIpKQ0KDQoNCiNDcmVhdGUgdGltZSB2YXJpYWJsZSBieSBzZW1lc3RlciBhbmQgeWVzcg0KZGF0YSA9IGRhdGEgJT4lDQogIG11dGF0ZSh0aW1lPWNhc2Vfd2hlbihtb250aDw2ICYgeWVhcj09MjAxN34iUzE3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoPDYgJiB5ZWFyPT0yMDE4fiJTMTgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgbW9udGg8NiAmIHllYXI9PTIwMTl+IlMxOSIsDQogICAgICAgICAgICAgICAgICAgICAgICBtb250aDw2ICYgeWVhcj09MjAyMH4iUzIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoPDYgJiB5ZWFyPT0yMDIxfiJTMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgbW9udGg8NiAmIHllYXI9PTIwMjJ+IlMyMiIsDQogICAgICAgICAgICAgICAgICAgICAgICBtb250aDw2ICYgeWVhcj09MjAyM34iUzIzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoPDYgJiB5ZWFyPT0yMDI0fiJTMjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgbW9udGg8NiAmIHllYXI9PTIwMjV+IlMyNSIsDQogICAgICAgICAgICAgICAgICAgICAgICBtb250aD42ICYgeWVhcj09MjAxN34iRjE3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoPjYgJiB5ZWFyPT0yMDE4fiJGMTgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgbW9udGg+NiAmIHllYXI9PTIwMTl+IkYxOSIsDQogICAgICAgICAgICAgICAgICAgICAgICBtb250aD42ICYgeWVhcj09MjAyMH4iRjIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoPjYgJiB5ZWFyPT0yMDIxfiJGMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgbW9udGg+NiAmIHllYXI9PTIwMjJ+IkYyMiIsDQogICAgICAgICAgICAgICAgICAgICAgICBtb250aD42ICYgeWVhcj09MjAyM34iRjIzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoPjYgJiB5ZWFyPT0yMDI0fiJGMjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgbW9udGg+NiAmIHllYXI9PTIwMjV+IkYyNSIsIFRSVUV+TkEpKQ0KDQojY3JlYXRlIG9yZGVyZWQgZmFjdG9yIGZvciB0aW1lDQpkYXRhJHRpbWUyPWZhY3RvcihkYXRhJHRpbWUsIGxldmVscz1jKCJGMTciLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTMTgiLCAiRjE4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMxOSIsICJGMTkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUzIwIiwgIkYyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTMjEiLCAiRjIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlMyMiIsICJGMjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUzIzIiwgIkYyMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTMjQiLCAiRjI0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTMjUiLCAiRjI1Iiwgb3JkZXJlZD1UKSkNCg0KDQojQ3JlYXRlIGRlbW9ncmFwaGljIGZhY3RvcnMNCmRhdGEgPSBkYXRhICU+JQ0KICBtdXRhdGUoUmFjZTI9Y2FzZV93aGVuKFJhY2U9PTF+IkFmcmljYW4vQWZyby1DYXJpYmJlYW4vQmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFJhY2U9PTR+Ik5hdGl2ZSBBbWVyaWNhbi9BbGFza2FuIE5hdGl2ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgUmFjZT09NX4iV2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFJhY2U9PTd+Ik11bHRpLWV0aG5pYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgUmFjZT09OH4iUE5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBSYWNlPT05fiJETkkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFJhY2U9PTEwfiJBc2lhL1BJIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBSYWNlPT0xMX4iQXJhYi9NRSIsIFRSVUV+TkEpKSAlPiUNCiAgbXV0YXRlKENsYXNzMj1jYXNlX3doZW4oQ2xhc3M9PTF+IkZpcnN0IHllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcz09Mn4iU29waG9tb3JlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M9PTN+Ikp1bmlvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPT00fiJTZW5pb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcz09Nn4iU2VuaW9yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPT0zM34iUG9zdCBiYWNjIiwgVFJVRX5OQSkpICU+JQ0KICBtdXRhdGUoQ2xhc3MzPWNhc2Vfd2hlbihDbGFzcz09MX4iRmlyc3QgeWVhciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPT0yfiJORlkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcz09M34iTkZZIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M9PTR+Ik5GWSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPT02fiJORlkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcz09MzN+Ik5GWSIsIFRSVUV+TkEpKSAlPiUNCiAgbXV0YXRlKFNvcmllbnQyPWNhc2Vfd2hlbihTb3JpZW50PT0xfiJIZXRlcm9zZXh1YWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcmllbnQ9PTR+IkJpc2V4dWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3JpZW50PT01fiJRdWVzdGlvbmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU29yaWVudD09Nn4iUE5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3JpZW50PT03fiJHYXkvbGVzYmlhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU29yaWVudD09OH4iQXNleHVhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU29yaWVudD09OX4iUGFucm9tYW50aWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcmllbnQ9PTEwfiJQYW5zZXh1YWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcmllbnQ9PTExfiJRdWVlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU29yaWVudD09MTJ+IkROSSIsIFRSVUV+TkEpKSAlPiUNCiAgbXV0YXRlKEdlbmRlcjI9Y2FzZV93aGVuKEdlbmRlcj09MX4iV29tYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZGVyPT0yfiJNYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZGVyPT00fiJUcmFucyB3b21hbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5kZXI9PTV+IlRyYW5zIG1hbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5kZXI9PTZ+Ik5vbi1iaW5hcnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZGVyPT03fiJQTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZGVyPT04fiJETkkiLFRSVUV+TkEpKSAlPiUNCiAgbXV0YXRlKFZhcnNpdHlhMj1jYXNlX3doZW4oVmFyc2l0eWE9PTF+Ik5vIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyc2l0eWE9PTJ+IlllcyIsVFJVRX5OQSkpICU+JQ0KICBtdXRhdGUoVHJhbnNmZXIyPWNhc2Vfd2hlbihUcmFuc2Zlcj09MX4iTm8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zlcj09Mn4iWWVzIiwgVFJVRX5OQSkpICU+JQ0KICBtdXRhdGUoVGllcjI9Y2FzZV93aGVuKFRpZXI9PTF+IjFBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBUaWVyPT0yfiIxQiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIFRpZXI9PTN+IjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFRpZXI9PTR+IjMiLCBUUlVFfk5BKSkgDQoNCmRhdGE9ZGF0YSAlPiUNCiAgbXV0YXRlKFBlcmlvZD1jYXNlX3doZW4odGltZTI9PSJGMTcifjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUyPT0iUzE4In4yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09IkYxOCJ+MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTI9PSJTMTkifjQsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUyPT0gIkYxOSJ+NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTI9PSJTMjAifjYsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUyPT0iRjIwIn43LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09IlMyMSJ+OCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTI9PSAiRjIxIn45LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09ICJTMjIifjEwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09ICJGMjIifjExLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09ICJTMjMifjEyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09ICJGMjMifjEzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09ICJTMjQifjE0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09ICJGMjQifjE1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09ICJTMjUifjE2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMj09ICJGMjUifjE3LCBUUlVFfk5BKSkNCg0KDQpkYXRhPWRhdGEgJT4lDQogIG11dGF0ZShHZW5kZXIyPWZjdF9yZWxldmVsKEdlbmRlcjIsICJNYW4iKSkgJT4lDQogIG11dGF0ZShUcmFuc2ZlcjI9ZmN0X3JlbGV2ZWwoVHJhbnNmZXIyLCAiTm8iKSkgJT4lICANCiAgbXV0YXRlKFZhcnNpdHlhMj1mY3RfcmVsZXZlbChWYXJzaXR5YTIsICJObyIpKSAlPiUNCiAgbXV0YXRlKFNvcmllbnQyPWZjdF9yZWxldmVsKFNvcmllbnQyLCAiSGV0ZXJvc2V4dWFsIikpICU+JQ0KICBtdXRhdGUoQ2xhc3MzPWZjdF9yZWxldmVsKENsYXNzMywgIkZpcnN0IHllYXIiKSkgJT4lDQogIG11dGF0ZShSYWNlMj1mY3RfcmVsZXZlbChSYWNlMiwgIldoaXRlIikpDQoNCmRhdGEgPSBkYXRhICU+JQ0KICBtdXRhdGUoTVJhY2U9Y2FzZV93aGVuKFJhY2U9PTV+IldoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBSYWNlPDUgfCBSYWNlPjV+Ik5vbi13aGl0ZSIsIFRSVUV+TkEpKSAlPiUNCiAgbXV0YXRlKE1DbGFzcz1jYXNlX3doZW4oQ2xhc3M9PTF+IkZpcnN0IHllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcz4xfiJOb3QgZmlyc3QgeWVhciIsIFRSVUV+TkEpKSAlPiUNCiAgbXV0YXRlKE1Tb3JpZW50PWNhc2Vfd2hlbihTb3JpZW50PT0xfiJIZXRlcm9zZXh1YWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcmllbnQ+MX4iTm90IGhldGVyb3NleHVhbCIsIFRSVUV+TkEpKSAlPiUNCiAgbXV0YXRlKE1HZW5kZXI9Y2FzZV93aGVuKEdlbmRlcj09Mn4iTWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmRlcjwyIHwgR2VuZGVyPjJ+Ik5vdCBhIG1hbi9ETkkiLFRSVUV+TkEpKQ0KDQoNCmBgYA0KDQoNClRoZSBwcmltYXJ5IHJlc2VhcmNoIHF1ZXN0aW9uIHdhcyB0byBleGFtaW5lIGhvdyB0aW1lIGFuZCBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMgcHJlZGljdCBkZXByZXNzaXZlIHN5bXB0b20gc2V2ZXJpdHkgYXMgbWVhc3VyZWQgYnkgdGhlIFBhdGllbnQgSGVhbHRoIFF1ZXN0aW9ubmFpcmXigJE5IChQSFHigJE5KS4gVG8gZXZhbHVhdGUgdGhlIHJvYnVzdG5lc3Mgb2YgcmVzdWx0cyB0byBtZWFzdXJlbWVudCBlcnJvciBhbmQgb3V0bGllcnMsIHRocmVlIGFuYWx5dGljIGFwcHJvYWNoZXMgYXJlIGNvbXBhcmVkOg0KDQoxLiBPcmRpbmFyeSBMZWFzdCBTcXVhcmVzIChPTFMpIHJlZ3Jlc3Npb24gdXNpbmcgdG90YWwgUEhR4oCROSBzdW0gc2NvcmUgYXMgdGhlIG91dGNvbWUuDQoyLiBPTFMgcmVncmVzc2lvbiB1c2luZyBhIGxhdGVudCBkZXByZXNzaW9uIGZhY3RvciBzY29yZSBkZXJpdmVkIGZyb20gZmFjdG9yIGFuYWx5c2lzIChDRkEpIG9mIFBIUeKAkTkgaXRlbXMuDQozLiBSb2J1c3QgcmVncmVzc2lvbiAoTeKAkWVzdGltYXRpb24pIHVzaW5nIHRoZSBsYXRlbnQgZmFjdG9yIHNjb3JlIG91dGNvbWUgdG8gZG93buKAkXdlaWdodCBpbmZsdWVudGlhbCBvYnNlcnZhdGlvbnMuDQoNCkRlbW9ncmFwaGljIHByZWRpY3RvcnMgaW5jbHVkZWQ6DQoNCi0gUmFjZSAocmVmZXJlbmNlIGxldmVsPVdoaXRlIHZzIGFsbCBvdGhlciBsZXZlbHMpDQotIEdlbmRlciAocmVmZXJlbmNlIGxldmVsPU1hbGUgdnMgYWxsIG90aGVyIGxldmVscykNCi0gU2V4dWFsIG9yaWVudGF0aW9uIChyZWZlcmVuY2UgbGV2ZWw9SGV0ZXJvc2V4dWFsIHZzIGFsbCBvdGhlciBsZXZlbHMpDQotIENsYXNzIHllYXIgKHJlZmVyZW5jZSBsZXZlbD1GaXJzdCB5ZWFyIHZzIGFsbCBvdGhlciBsZXZlbHMpDQotIFZhcnNpdHkgYXRobGV0ZSBzdGF0dXMgKHJlZmVyZW5jZSBsZXZlbD1ObykNCi0gVHJhbnNmZXIgc3R1ZGVudCBzdGF0dXMgKHJlZmVyZW5jZSBsZXZlbD1ObyApDQoNClRoZSBjb21wYXJpc29uIG9mIHRoZXNlIG1vZGVscyBhbGxvdyBhc3Nlc3NtZW50IG9mIChhKSB3aGV0aGVyIGxhdGVudCBtb2RlbGluZyBhbHRlcnMgaW5mZXJlbmNlcyByZWxhdGl2ZSB0byBzdW1tZWQgc2NvcmVzLCBhbmQgKGIpIHdoZXRoZXIgcmVzdWx0cyBhcmUgc3RhYmxlIHdoZW4gZG93buKAkXdlaWdodGluZyBvdXRsaWVycy4NCg0KVGhlIHNlY29uZGFyeSByZXNlYXJjaCBxdWVzdGlvbiB3YXMgdGhlIGZvbGxvd2luZzogYmFzZWQgb24gdGhlIEludGVycGVyc29uYWwtUHN5Y2hvbG9naWNhbCBUaGVvcnkgb2YgU3VpY2lkZSBCZWhhdmlvciAoY29tbW9ubHkga25vd24gYXMgSm9pbmVy4oCZcyB0aGVvcnkpIGFuZCByZWZsZWN0aW5nIHRoZSBlc3RhYmxpc2hlZCB0cmVuZHMgb2YgaW5jcmVhc2luZyByaXNrIG9mIHN1aWNpZGUgaW4gY29sbGVnZSBhZ2VkIHlvdW5nIGFkdWx0cywgd2UgaHlwb3RoZXNpemUgaW5jcmVhc2VkIGRpc3RyZXNzIG92ZXIgdGltZSBpbiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyB3aWxsIHJlbGF0ZSB0byBjb3JyZXNwb25kaW5nIGluY3JlYXNlcyBpbiBtZWFuIFBIUTkgc2NvcmVzIG92ZXIgdGltZS4gVGhlIHNhbWUgYW5hbHl0aWNhbCBtZXRob2RzIG1lbnRpb25lZCBhYm92ZSB3aWxsIGJlIHVzZWQuDQoNCg0KIyBEYXRhIFByZXBhcmF0aW9uDQojIyBNaXNzaW5nIGRhdGEgaGFuZGxpbmcNCg0KRm9yIE1vZGVsIDEgZm9yIGJvdGggcmVzZWFyY2ggcXVlc3Rpb25zLCBtaXNzaW5nbmVzcyBpbiB0aGUgdG90YWwgUEhR4oCROSBzY29yZSBmb2xsb3dlZCBsaXN0d2lzZSBkZWxldGlvbiB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLg0KRm9yIE1vZGVsIDIgYW5kIE1vZGVsIDMgZm9yIGJvdGggcmVzZWFyY2ggcXVlc3Rpb25zLCB0aGUgQ0ZBIGVzdGltYXRlZCB1c2luZyBGdWxsIEluZm9ybWF0aW9uIE1heGltdW0gTGlrZWxpaG9vZCAoRklNTCkgdG8gcmV0YWluIGNhc2VzIHdpdGggcGFydGlhbCBpdGVt4oCRbGV2ZWwgbWlzc2luZ25lc3MuDQoNCiMjIFByZWRpY3RvciBjb2RpbmcNCkNhdGVnb3JpY2FsIHByZWRpY3RvcnMgKHJhY2UsIGdlbmRlciwgc2V4dWFsIG9yaWVudGF0aW9uLCBjbGFzcyB5ZWFyLCB2YXJzaXR5IGF0aGxldGUsIHRyYW5zZmVyIHN0YXR1cykgd2VyZSBkdW1teeKAkWNvZGVkLiBSZWZlcmVuY2UgZ3JvdXBzIGFyZSBsaXN0ZWQgYWJvdmUgYW5kIHdlcmUgc2VsZWN0ZWQgYmFzZWQgb24gdGhlb3JldGljYWwgcmVsZXZhbmNlIG9yIHNhbXBsZSBzaXplLiBUaW1lIHdhcyBjb2RlZCBhcyBhIG51bWVyaWMgaW5kZXgsIHJlcHJlc2VudGluZyBzZW1lc3Rlciwgc3RhcnRpbmcgd2l0aCBGYWxsIDIwMTcuIA0KDQojIyBNZWFzdXJlbWVudCBNb2RlbDogTGF0ZW50IERlcHJlc3Npb24gRmFjdG9yDQpCZWZvcmUgTW9kZWxzIDIgYW5kIDMsIGEgQ29uZmlybWF0b3J5IEZhY3RvciBBbmFseXNpcyAoQ0ZBKSB3YXMgZml0IHRvIHRoZSBuaW5lIFBIUeKAkTkgaXRlbXMgdXNpbmcgYSBzaW5nbGXigJFmYWN0b3IgbW9kZWwsIGNvbnNpc3RlbnQgd2l0aCBldmlkZW5jZSBzdXBwb3J0aW5nIGEgc3Ryb25nIGdlbmVyYWwgZGVwcmVzc2lvbiBmYWN0b3IgaW4gdGhlIFBIUeKAkTkuDQoNCiMgRGVtb2dyYXBoaWNzDQoNCmBgYCB7cn0NCg0KRz10YWJsZShkYXRhJEdlbmRlcjIpDQprYWJsZShkYXRhICU+JSBjb3VudChHZW5kZXIyLCBzb3J0ID0gVFJVRSkgJT4lIG11dGF0ZShgbiAoJSlgID0gcGFzdGUwKG4sICIgKCIsIHJvdW5kKG4gLyBzdW0obikgKiAxMDAsIDEpLCAiJSkiKSkgJT4lIGRwbHlyOjpzZWxlY3QoLW4pICU+JSByZW5hbWUoIkdlbmRlciIgPSBHZW5kZXIyKSwNCiAgICAgIGZvcm1hdD0iaHRtbCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRikNCg0KDQprYWJsZShkYXRhICU+JSBjb3VudChDbGFzczIsIHNvcnQgPSBUUlVFKSAlPiUgbXV0YXRlKGBuICglKWAgPSBwYXN0ZTAobiwgIiAoIiwgcm91bmQobiAvIHN1bShuKSAqIDEwMCwgMSksICIlKSIpKSAlPiUgZHBseXI6OnNlbGVjdCgtbikgJT4lIHJlbmFtZSgiQ2xhc3MiID0gQ2xhc3MyKSwNCiAgICAgIGZvcm1hdD0iaHRtbCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRikNCg0Ka2FibGUoZGF0YSAlPiUgY291bnQoU29yaWVudDIsIHNvcnQgPSBUUlVFKSAlPiUgbXV0YXRlKGBuICglKWAgPSBwYXN0ZTAobiwgIiAoIiwgcm91bmQobiAvIHN1bShuKSAqIDEwMCwgMSksICIlKSIpKSAlPiUgZHBseXI6OnNlbGVjdCgtbikgJT4lIHJlbmFtZSgiU2V4dWFsIE9yaWVudGF0aW9uIiA9IFNvcmllbnQyKSwNCiAgICAgIGZvcm1hdD0iaHRtbCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRikNCg0Ka2FibGUoZGF0YSAlPiUgY291bnQoUmFjZTIsIHNvcnQgPSBUUlVFKSAlPiUgbXV0YXRlKGBuICglKWAgPSBwYXN0ZTAobiwgIiAoIiwgcm91bmQobiAvIHN1bShuKSAqIDEwMCwgMSksICIlKSIpKSAlPiUgZHBseXI6OnNlbGVjdCgtbikgJT4lIHJlbmFtZSgiUmFjZSIgPSBSYWNlMiksDQogICAgICBmb3JtYXQ9Imh0bWwiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IEYpDQoNCmthYmxlKGRhdGEgJT4lIGNvdW50KFZhcnNpdHlhMiwgc29ydCA9IFRSVUUpICU+JSBtdXRhdGUoYG4gKCUpYCA9IHBhc3RlMChuLCAiICgiLCByb3VuZChuIC8gc3VtKG4pICogMTAwLCAxKSwgIiUpIikpICU+JSBkcGx5cjo6c2VsZWN0KC1uKSAlPiUgcmVuYW1lKCJWYXJzaXR5IGF0aGxldGUiID0gVmFyc2l0eWEyKSwNCiAgICAgIGZvcm1hdD0iaHRtbCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRikNCg0Ka2FibGUoZGF0YSAlPiUgY291bnQoVHJhbnNmZXIyLCBzb3J0ID0gVFJVRSkgJT4lIG11dGF0ZShgbiAoJSlgID0gcGFzdGUwKG4sICIgKCIsIHJvdW5kKG4gLyBzdW0obikgKiAxMDAsIDEpLCAiJSkiKSkgJT4lIGRwbHlyOjpzZWxlY3QoLW4pICU+JSByZW5hbWUoIlRyYW5zZmVyIiA9IFRyYW5zZmVyMiksDQogICAgICBmb3JtYXQ9Imh0bWwiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KIyBSZXNlYXJjaCBRdWVzdGlvbiAxDQojIyBSUTEgT3JkaW5hcnkgTGVhc3QgU3F1YXJlcw0KDQpBIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHdhcyBlc3RpbWF0ZWQ6DQpQSFE5wqBUb3RhbD3OsjDigIsrzrIx4oCLVGltZSvOsjLigItSYWNlK+KApivOsmvigItUcmFuc2ZlcivPtS4gDQoNCkFzc3VtcHRpb25zIG9mIGxpbmVhcml0eSwgaG9tb3NjZWRhc3RpY2l0eSwgbm9ybWFsaXR5IG9mIHJlc2lkdWFscywgYW5kIGluZmx1ZW5jZSBkaWFnbm9zdGljcyAoc3RhbmRhcmRpemVkIHJlc2lkdWFscywgbGV2ZXJhZ2UsIENvb2vigJlzIGRpc3RhbmNlKSB3ZXJlIGV4YW1pbmVkLiBEaWFnbm9zdGljcyBpZGVudGljYWwgdG8gTW9kZWwgMSB3ZXJlIHBlcmZvcm1lZCB0byBldmFsdWF0ZSByZXNpZHVhbCBwYXR0ZXJucyBhbmQgaW5mbHVlbnRpYWwgb2JzZXJ2YXRpb25zLiBUaGVzZSBncmFwaHMgYXJlIHN1cHByZXNzZWQgZm9yIHRoaXMgcmVwb3J0IGJ1dCBhdmFpbGFibGUuDQoNCg0KIyMjIFJRMSBPTFMgTW9kZWwgMSByZXN1bHRzDQpgYGAge3Igb2xzfQ0KI09yZGluYXJ5IGxlYXN0IHNxdWFyZXMNCm1vZGVsPWxtKFNjb3JlflBlcmlvZCtNQ2xhc3MrTVJhY2UrTVNvcmllbnQrTUdlbmRlcitWYXJzaXR5YTIrVHJhbnNmZXIyLCBkYXRhPWRhdGEpDQpzdW1tYXJ5KG1vZGVsKQ0KYGBgDQoNCmBgYCB7ciByZXMxLCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD0zLCBpbmNsdWRlPUZ9DQpvbHNfcGxvdF9yZXNpZF9sZXYobW9kZWwpDQpvbHNfcGxvdF9yZXNpZF9oaXN0KG1vZGVsKQ0Kb2xzX3Bsb3RfcmVzaWRfZml0KG1vZGVsKQ0Kb2xzX3Bsb3RfY29va3NkX2NoYXJ0KG1vZGVsKQ0KDQpgYGANCg0KIyMjIFJRMSBPTFMgTW9kZWwgMSBBc3Nlc3NtZW50DQpBbiBvcmRpbmFyeSBsZWFzdCBzcXVhcmVzIChPTFMpIHJlZ3Jlc3Npb24gd2FzIGZpdHRlZCB3aXRoIHRoZSBQSFEgOSB0b3RhbCBzY29yZSBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLiBQcmVkaWN0b3JzIGluY2x1ZGVkIHRpbWUgYW5kIHRoZSBzaXggZGVtb2dyYXBoaWMgdmFyaWFibGVzLiANCg0KVGhlIHZhcmlhYmxlcyB0aGF0IHdlcmUgZm91bmQgdG8gc2lnbmlmaWNhbnRseSBwcmVkaWN0IFBIUTkgd2VyZSB0aGUgdGltZSB2YXJpYWJsZSBQZXJpb2QoQj0wLjA3NCwgcD0uMDA1ODUpIGFuZCBTZXh1YWwgT3JpZW50YXRpb24gKEI9Mi4xMTEsIHA8MmUtMTYpLg0KDQojIyBSUTEgRmFjdG9yIGFuYWx5c2lzIChGQSkgbW9kZWwgMiByZXN1bHRzDQoNClRoZSBleHRyYWN0ZWQgUEhR4oCROSBmYWN0b3Igc2NvcmUgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGU6DQoNCkxhdGVudMKgRGVwcmVzc2lvbsKgRmFjdG9yPc6yMOKAiyvOsjHigItUaW1lK86yMuKAi1JhY2Ur4oCmK86ya+KAi1RyYW5zZmVyK8+1DQoNClRoaXMgbW9kZWwgYWRqdXN0cyBmb3IgbWVhc3VyZW1lbnQgZXJyb3IgaW4gUEhR4oCROSBpdGVtcyBieSB1c2luZyBhIG1vcmUgcHJlY2lzZSBlc3RpbWF0ZSBvZiB1bmRlcmx5aW5nIGRlcHJlc3Npb24gc2V2ZXJpdHkuIEFzc3VtcHRpb25zIG9mIGxpbmVhcml0eSwgaG9tb3NjZWRhc3RpY2l0eSwgbm9ybWFsaXR5IG9mIHJlc2lkdWFscywgYW5kIGluZmx1ZW5jZSBkaWFnbm9zdGljcyAoc3RhbmRhcmRpemVkIHJlc2lkdWFscywgbGV2ZXJhZ2UsIENvb2vigJlzIGRpc3RhbmNlKSB3ZXJlIGV4YW1pbmVkLiBEaWFnbm9zdGljcyB3ZXJlIHBlcmZvcm1lZCB0byBldmFsdWF0ZSByZXNpZHVhbCBwYXR0ZXJucyBhbmQgaW5mbHVlbnRpYWwgb2JzZXJ2YXRpb25zLiBUaGVzZSBncmFwaHMgYXJlIHN1cHByZXNzZWQgZm9yIHRoaXMgcmVwb3J0IGJ1dCBhdmFpbGFibGUuDQoNCmBgYCB7ciBGQX0NCiNGYWN0b3IgYW5hbHlzaXMgdG8gZ2V0IHdlaWdodGVkIGF2ZXJhZ2UgZm9yIHJlc3BvbnNlDQojIC0tLSAxKSBDb25maXJtIHlvdXIgaXRlbSBjb2x1bW5zIC0tLQ0KcGhxX2l0ZW1zIDwtIGMoIlRpcmVkIiwiU2xlZXAiLCJBcHBldGl0ZSIsIkNvbmNlbnRyIiwiRmFpbHVyZSIsDQogICAgICAgICAgICAgICAiTW92aW5nIiwiSW50ZXJlc3QiLCJEb3duIiwiSGFybXNlbGYiKQ0KDQojIC0tLSAyKSBPbmUtZmFjdG9yIENGQSBtb2RlbCAtLS0NCnBocV9tb2RlbCA8LSAnDQpTY29yZSA9fiBUaXJlZCArIFNsZWVwK0FwcGV0aXRlK0NvbmNlbnRyK0ZhaWx1cmUrTW92aW5nK0ludGVyZXN0K0Rvd24rSGFybXNlbGYNCicNCg0KZml0X2NmYSA9IGNmYShwaHFfbW9kZWwsIGRhdGEgPSBkYXRhLCBzdGQubHYgPSBUUlVFLCBtaXNzaW5nID0gImZpbWwiKSAgIyBGSU1MIGhhbmRsZXMgbWlzc2luZyBhdCBpdGVtIGxldmVsDQojc3VtbWFyeShmaXRfY2ZhLCBmaXQubWVhc3VyZXMgPSBUUlVFLCBzdGFuZGFyZGl6ZWQgPSBUUlVFKQ0KDQojIC0tLSAzKSBFeHRyYWN0IGZhY3RvciBzY29yZXMgKHdlaWdodGVkIFBIUS05KSAtLS0NCmRhdGEkU2NvcmVfZmFjdG9yID0gYXMubnVtZXJpYyhsYXZQcmVkaWN0KGZpdF9jZmEpKSAgIyBvbmUgc2NvcmUgcGVyIHBlcnNvbg0KDQptX2ZhY3RvciA8LSBsbShTY29yZV9mYWN0b3IgfiBQZXJpb2QgKyBNQ2xhc3MgKyBNU29yaWVudCArIE1SYWNlICsNCiAgICAgICAgICAgICAgICAgTUdlbmRlciArIFZhcnNpdHlhMiArIFRyYW5zZmVyMiwgZGF0YSA9IGRhdGEpDQoNCnN1bW1hcnkobV9mYWN0b3IpDQoNCg0KYGBgDQoNCmBgYCB7ciByZXMyLCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD0zLCBpbmNsdWRlPUZ9DQpvbHNfcGxvdF9yZXNpZF9sZXYobV9mYWN0b3IpDQpvbHNfcGxvdF9yZXNpZF9oaXN0KG1fZmFjdG9yKQ0Kb2xzX3Bsb3RfcmVzaWRfZml0KG1fZmFjdG9yKQ0Kb2xzX3Bsb3RfY29va3NkX2NoYXJ0KG1fZmFjdG9yKQ0KDQpgYGANCg0KIyMjIEZBIE1vZGVsIDIgQXNzZXNzbWVudA0KDQpBIGNvbmZpcm1hdG9yeSBmYWN0b3IgYW5hbHlzaXMgKENGQSkgZXN0aW1hdGVkIGEgc2luZ2xlIGxhdGVudCBkZXByZXNzaW9uIGZhY3RvciBmcm9tIHRoZSBuaW5lIFBIUSA5IGl0ZW1zLiBUaGUgQ0ZBIHdhcyBlc3RpbWF0ZWQgdXNpbmcgRklNTCB3aXRoIHRoZSBsYXRlbnQgZmFjdG9yIHZhcmlhbmNlIGZpeGVkIHRvIDEuIEluZGl2aWR1YWwgZmFjdG9yIHNjb3JlcyB3ZXJlIGV4dHJhY3RlZCB1c2luZyByZWdyZXNzaW9uIGJhc2VkIHNjb3JpbmcuIFRoZXNlIGxhdGVudCBzY29yZXMgc2VydmVkIGFzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgaW4gYW4gT0xTIHJlZ3Jlc3Npb24gd2l0aCB0aGUgc2FtZSBzZXQgb2YgZGVtb2dyYXBoaWMgYW5kIHRpbWUgcHJlZGljdG9ycyBhcyBNb2RlbCAxLiANCg0KVGhlIHZhcmlhYmxlcyB0aGF0IHdlcmUgZm91bmQgdG8gc2lnbmlmaWNhbnRseSBwcmVkaWN0IFBIUTkgd2VyZSB0aGUgdGltZSB2YXJpYWJsZSBQZXJpb2QoQj0wLjAxMywgcD0uMDA4KSBhbmQgU2V4dWFsIE9yaWVudGF0aW9uIChCPS4zNDcsIHA8MmUtMTYpLg0KDQojIyBSb2J1c3QgcmVncmVzc2lvbiBtb2RlbCAzDQoNCk1vZGVsIDM6IFJvYnVzdCByZWdyZXNzaW9uIHdpdGggbGF0ZW50IGZhY3RvciBzY29yZQ0KVG8gZXZhbHVhdGUgc2Vuc2l0aXZpdHkgdG8gaW5mbHVlbnRpYWwgb2JzZXJ2YXRpb25zIGFuZCBkaXN0cmlidXRpb25hbCBhc3N1bXB0aW9ucywgYSByb2J1c3QgTeKAkWVzdGltYXRpb24gcmVncmVzc2lvbiB3YXMgY29uZHVjdGVkOg0KTGF0ZW50wqBEZXByZXNzaW9uwqBGYWN0b3I9zrIw4oCLK86yMeKAi1RpbWUrzrIy4oCLUmFjZSvigKYrzrJr4oCLVHJhbnNmZXIrz7Vyb2J1c3TigIsNCg0KSW1wbGVtZW50YXRpb246IHJsbSgpIChNQVNTKS4gRXN0aW1hdG9yOiBIdWJlci4NClRoaXMgbW9kZWwgZG93buKAkXdlaWdodHMgZXh0cmVtZSByZXNpZHVhbHMgcmF0aGVyIHRoYW4gZGVsZXRpbmcgdGhlbS4NCkNvZWZmaWNpZW50IGVzdGltYXRlcyBhbmQgc3RhbmRhcmQgZXJyb3JzIHdlcmUgY29tcGFyZWQgdG8gT0xTIHJlc3VsdHMgdG8gYXNzZXNzIHJvYnVzdG5lc3MuDQoNCmBgYCB7ciByb2J1c3R9DQoNCmZpdF9sbXJvYiA8LSBsbXJvYihTY29yZV9mYWN0b3IgfiBQZXJpb2QgKyBNQ2xhc3MgKyBNU29yaWVudCArIE1SYWNlICsNCiAgICAgICAgICAgICAgICAgICAgIE1HZW5kZXIgKyBWYXJzaXR5YTIgKyBUcmFuc2ZlcjIsIGRhdGEgPSBkYXRhLA0KICAgICAgICAgICAgICAgICAgICBmYXN0LnMubGFyZ2UubiA9IEluZikgICMgTU0tZXN0aW1hdG9yDQpzdW1tYXJ5KGZpdF9sbXJvYikNCmBgYA0KIyMjIFJvYnVzdCBSZWdyZXNzaW9uIE1vZGVsIDMgQXNzZXNzbWVudA0KDQpUbyBhc3Nlc3Mgc2Vuc2l0aXZpdHkgdG8gaW5mbHVlbnRpYWwgb2JzZXJ2YXRpb25zLCBhIHJvYnVzdCByZWdyZXNzaW9uIG1vZGVsIChN4oCRZXN0aW1hdGlvbiwgSHViZXIgb3IgYmlzcXVhcmUgbG9zcyBmdW5jdGlvbikgd2FzIGZpdHRlZCB1c2luZyB0aGUgc2FtZSBwcmVkaWN0b3JzIGFuZCB0aGUgc2FtZSBsYXRlbnQgZmFjdG9yIHNjb3JlIG91dGNvbWUgYXMgaW4gTW9kZWwgMi4gUm9idXN0IHJlZ3Jlc3Npb24gZG93buKAkXdlaWdodHMgb2JzZXJ2YXRpb25zIHdpdGggbGFyZ2UgcmVzaWR1YWxzIHJhdGhlciB0aGFuIHJlbW92aW5nIHRoZW0uIFRoaXMgYXBwcm9hY2ggcHJvdmlkZXMgY29lZmZpY2llbnQgZXN0aW1hdGVzIHRoYXQgYXJlIG1vcmUgc3RhYmxlIGluIHRoZSBwcmVzZW5jZSBvZiBvdXRsaWVycyBvciBoZXRlcm9za2VkYXN0aWNpdHkuDQoNClRoZSB2YXJpYWJsZXMgdGhhdCB3ZXJlIGZvdW5kIHRvIHNpZ25pZmljYW50bHkgcHJlZGljdCBQSFE5IHdlcmUgdGhlIHRpbWUgdmFyaWFibGUgUGVyaW9kKEI9MC4wMTMsIHA9LjAwOCkgYW5kIFNleHVhbCBPcmllbnRhdGlvbiAoQj0uMzgxLCBwPDJlLTE2KS4NCg0KIyMgTW9kZWwgQ29tcGFyaXNvbg0KDQpUaGUgdGhyZWUgbW9kZWxzIHBlcmZvcm1lZCBzaW1pbGFybHkuIFRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIFBlcmlvZCBhbmQgU2V4dWFsIE9yaWVudGF0aW9uIHdlcmUgc2lnbmlmaWNhbnQgaW4gYWxsIHRocmVlIG1vZGVscywgd2l0aCBubyBvdGhlciBzaWduaWZpY2FudCBwcmVkaWN0b3JzLg0KDQoNCmBgYCB7ciByZXMzLCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD0zLCBpbmNsdWRlPUZ9DQoNCnJlcyA8LSByZXNpZHVhbHMoZml0X2xtcm9iLCB0eXBlID0gInJlc3BvbnNlIikNCmZpdCA8LSBmaXR0ZWQoZml0X2xtcm9iKQ0KdyAgIDwtIGZpdF9sbXJvYiR3ICAjIHJvYnVzdCB3ZWlnaHRzIGluIFswLCAxXTsgc21hbGwgdmFsdWVzIHdlcmUgZG93bi13ZWlnaHRlZA0KDQojIFJlc2lkdWFscyB2cyBGaXR0ZWQNCnBsb3QoZml0LCByZXMsDQogICAgIHhsYWIgPSAiRml0dGVkIHZhbHVlcyIsIHlsYWIgPSAiUmVzaWR1YWxzIiwNCiAgICAgbWFpbiA9ICJybG06IFJlc2lkdWFscyB2cyBGaXR0ZWQiKQ0KYWJsaW5lKGggPSAwLCBjb2wgPSAicmVkIikNCg0KIyBOb3JtYWwgUeKAk1Egb2YgcmVzaWR1YWxzIChqdXN0IHRvIHNlZSBoZWF2aW5lc3Mgb2YgdGFpbHM7IHJvYnVzdCBtb2RlbHMgZG9u4oCZdCBhc3N1bWUgbm9ybWFsaXR5KQ0KcXFub3JtKHJlcyk7IHFxbGluZShyZXMsIGNvbCA9ICJyZWQiKQ0KDQojIFNjYWxl4oCTTG9jYXRpb24gKHNxcnQofHJlc3wpIHZzIEZpdHRlZCkNCnBsb3QoZml0LCBzcXJ0KGFicyhyZXMpKSwNCiAgICAgeGxhYiA9ICJGaXR0ZWQgdmFsdWVzIiwgeWxhYiA9ICJTcXJ0KHxSZXNpZHVhbHN8KSIsDQogICAgIG1haW4gPSAicmxtOiBTY2FsZeKAk0xvY2F0aW9uIikNCg0KIyBSZXNpZHVhbHMgb3ZlciBvYnNlcnZhdGlvbiBvcmRlciAob3Igb3ZlciB0aW1lIGlmIHlvdSBoYXZlIGEgdGltZSB2YXJpYWJsZSkNCnBsb3QocmVzLCB0eXBlID0gImgiLCB4bGFiID0gIkluZGV4IChvciB0aW1lIG9yZGVyKSIsIHlsYWIgPSAiUmVzaWR1YWwiLA0KICAgICBtYWluID0gInJsbTogUmVzaWR1YWxzIGJ5IEluZGV4IikNCmFibGluZShoID0gMCwgY29sID0gInJlZCIpDQoNCmBgYA0KDQoNCiMgUmVzZWFyY2ggUXVlc3Rpb24gMg0KDQpCYXNlZCBvbiB0aGUgSW50ZXJwZXJzb25hbC1Qc3ljaG9sb2dpY2FsIFRoZW9yeSBvZiBTdWljaWRlIEJlaGF2aW9yIChjb21tb25seSBrbm93biBhcyBKb2luZXLigJlzIHRoZW9yeSkgYW5kIHJlZmxlY3RpbmcgdGhlIGVzdGFibGlzaGVkIHRyZW5kcyBvZiBpbmNyZWFzaW5nIHJpc2sgb2Ygc3VpY2lkZSBpbiBjb2xsZWdlIGFnZWQgeW91bmcgYWR1bHRzLCB3ZSBoeXBvdGhlc2l6ZSBpbmNyZWFzZWQgZGlzdHJlc3Mgb3ZlciB0aW1lIGluIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHdpbGwgcmVsYXRlIHRvIGNvcnJlc3BvbmRpbmcgaW5jcmVhc2VzIGluIG1lYW4gUEhROSBzY29yZXMgb3ZlciB0aW1lLSAgDQoNCjEuCUxvbmVsaW5lc3MgDQoyLglIb3BlbGVzc25lc3MgDQozLglEZXNwZXJhdGUgZmVlbGluZ3MgDQo0LglPdXQgb2YgY29udHJvbCBmZWVsaW5ncyANCjUuCURyaW5raW5nIG1vcmUgIA0KNi4JRHJpbmtpbmcgdG9vIG11Y2ggDQo3LglEcnVnIHVzZSANCjguCVN1aWNpZGFsIHRob3VnaHRzIGluIGxhc3QgdHdvIHdlZWtzIA0KOS4JU3VpY2lkZSBwbGFucyBpbiB0aGUgbGFzdCB0d28gd2Vla3MgDQoxMC4JU3VpY2lkZSBhY3Rpb25zIGluIHRoZSBsYXN0IHR3byB3ZWVrcyANCjExLglTdWljaWRlIGF0dGVtcHRzIG92ZXIgbGlmZXRpbWUgDQoNCiMjIFJlc2VhcmNoIFF1ZXN0aW9uIDIgQWxsIE1vZGVscyByZXN1bHRzDQoNClRoZSBtb2RlbHMgYmVsb3cgdXNlIGEgbmV3IHNlbGVjdGlvbiBvZiBmYWN0b3JzIHRvIHByZWRpY3QgUEhROS4gVGhlIG1vZGVscyBhcmUgZml0IGluIHRoZSBzYW1lIHRocmVlIG1ldGhvZHMgYXMgdGhlIG1vZGVscyBhYm92ZTogMSkgT0xTIG9uIHRoZSBQSFE5IHRvdGFsLCAyKSBPTFMgb24gdGhlIFBIUTkgbGF0ZW50T0xTIGRlcHJlc3Npb24gZmFjdG9yIHNjb3JlIGRlcml2ZWQgZnJvbSBmYWN0b3IgYW5hbHlzaXMgKENGQSksIDMpIFJvYnVzdCByZWdyZXNzaW9uIChN4oCRZXN0aW1hdGlvbikgdXNpbmcgdGhlIGxhdGVudCBmYWN0b3Igc2NvcmUgb3V0Y29tZSB0byBkb3du4oCRd2VpZ2h0IGluZmx1ZW50aWFsIG9ic2VydmF0aW9ucy4NCg0KKipNb2RlbCAxOioqDQpUaGUgdmFyaWFibGVzIHRoYXQgd2VyZSBmb3VuZCB0byBzaWduaWZpY2FudGx5IHByZWRpY3QgUEhROSB3ZXJlIHRoZSB0aW1lIHZhcmlhYmxlIFBlcmlvZChCPTAuMDY5LCBwPS4wMDAzKSwgTG9uZWxpbmVzcyAoQj0xLjAzICwgcDwyLTE2KSwgSG9wZWxlc3NuZXNzIChCPTEuNDUsIHAsMi0xNiksIERlc3BlcmF0ZSBmZWVsaW5ncyAoQj0uNDU5LCBwPTcuNDVlLTUpLCBPdXQgb2YgQ29udHJvbCBGZWVsaW5ncyAoQj0xLjA0LCBwPDJlLTE2KSwgRHJ1ZyBVc2UgKEI9MC4yNjksIHA9LjAyMTgpLCBTdWljaWRhbCBUaG91Z2h0cyAoQj0xLjE0LCBwPTcuMjVlLTEwKSwgU3VpY2lkYWwgQWN0aW9ucyAoQj0uNjEsIHA9LjAwOSksIGFuZCBTdWljaWRhbCBBdHRlbXB0cyAoQj0uOTAxLCBwPS4wMDA0KS4NCg0KKipNb2RlbCAyOioqDQpUaGUgdmFyaWFibGVzIHRoYXQgd2VyZSBmb3VuZCB0byBzaWduaWZpY2FudGx5IHByZWRpY3QgUEhROSB3ZXJlIHRoZSB0aW1lIHZhcmlhYmxlIFBlcmlvZChCPTAuMDEyLCBwPS4wMDAyKSwgTG9uZWxpbmVzcyAoQj0wLjE4OSwgcDwyLTE2KSwgSG9wZWxlc3NuZXNzIChCPTAuMjg3LCBwLDItMTYpLCBEZXNwZXJhdGUgZmVlbGluZ3MgKEI9LjA3NiwgcD01LjU1ZS01KSwgT3V0IG9mIENvbnRyb2wgRmVlbGluZ3MgKEI9MC4xNTksIHA8MmUtMTYpLCBEcnVnIFVzZSAoQj0wLjA0MiwgcD0uMDI2OCksIFN1aWNpZGFsIFRob3VnaHRzIChCPTAuMTY3LCBwPTIuMzNlLTgpLCBhbmQgU3VpY2lkYWwgQXR0ZW1wdHMgKEI9LjE0NCwgcD0uMDAwNCkuDQoNClN1aWNpZGFsIGFjdGlvbnMgKEI9MC4wNzEsIHA9LjA2NCkgZGlkIG5vdCBtZWV0IHRoZSA1JSBzaWduaWZpY2FuY2UgbGV2ZWwgdGhyZXNob2xkIGFzIGl0IGRpZCBpbiBtb2RlbCAxLg0KDQoqKk1vZGVsIDM6KioNClRoZSB2YXJpYWJsZXMgdGhhdCB3ZXJlIGZvdW5kIHRvIHNpZ25pZmljYW50bHkgcHJlZGljdCBQSFE5IHdlcmUgdGhlIHRpbWUgdmFyaWFibGUgUGVyaW9kKEI9MC4wMTEsIHA9LjAwMDQpLCBMb25lbGluZXNzIChCPTAuMTk5LCBwPDItMTYpLCBIb3BlbGVzc25lc3MgKEI9MC4yOTMsIHAsMi0xNiksIERlc3BlcmF0ZSBmZWVsaW5ncyAoQj0uMDc2LCBwPS4wMDAxKSwgT3V0IG9mIENvbnRyb2wgRmVlbGluZ3MgKEI9MC4xNjYsIHA8MmUtMTYpLCBEcnVnIFVzZSAoQj0wLjA0MCwgcD0uMDQ2KSwgU3VpY2lkYWwgVGhvdWdodHMgKEI9MC4xNjYsIHA9Ny45M2UtOCksIGFuZCBTdWljaWRhbCBBdHRlbXB0cyAoQj0uMTU4LCBwPS4wMDAxKS4NCg0KTW9kZWxzIDIgYW5kIDMgcGVyZm9ybWVkIG5lYXJseSBpZGVudGljYWxseS4NCg0KDQpgYGAge3Igb2xzMn0NCiNPcmRpbmFyeSBsZWFzdCBzcXVhcmVzDQoNCm1vZGVsPWxtKFNjb3JlflBlcmlvZCtMb25lbHkrSG9wZWxlc3MrRGVzcGVyYXQrQ29udHJvbCtEcmluaysNCiAgICAgICAgICAgVG9vTXVjaCtEcnVncytUaG91Z2h0cytQbGFucytBY3Rpb25zK0F0dGVtcHQsIGRhdGE9ZGF0YSkNCnN1bW1hcnkobW9kZWwpDQojb2xzX3Bsb3RfZGlhZ25vc3RpY3MobW9kZWwpDQpgYGANCg0KYGBgIHtyfQ0KDQojIE9MUyB3aXRoIEZhY3RvciBhbmFseXNpcyByZXNwb25zZQ0KDQptX2ZhY3RvciA8LSBsbShTY29yZV9mYWN0b3IgfiBQZXJpb2QrTG9uZWx5K0hvcGVsZXNzK0Rlc3BlcmF0K0NvbnRyb2wrRHJpbmsrDQogICAgICAgICAgIFRvb011Y2grRHJ1Z3MrVGhvdWdodHMrUGxhbnMrQWN0aW9ucytBdHRlbXB0LCBkYXRhID0gZGF0YSkNCg0KIyBSb2J1c3QgU0VzIGFuZCBzdW1tYXJ5DQojY29lZnRlc3QobV9mYWN0b3IsIHZjb3YgPSB2Y292SEMobV9mYWN0b3IsIHR5cGUgPSAiSEMzIikpDQpzdW1tYXJ5KG1fZmFjdG9yKQ0KI2dsYW5jZShtX2ZhY3RvcilbLCBjKCJyLnNxdWFyZWQiLCJhZGouci5zcXVhcmVkIiwic2lnbWEiLCJBSUMiLCJCSUMiKV0NCg0KDQpgYGANCg0KYGBgIHtyfQ0KI1JvYnVzdCByZWdyZXNzaW9uIG1vZGVsDQpmaXRfbG1yb2IgPC0gbG1yb2IoU2NvcmVfZmFjdG9yflBlcmlvZCtMb25lbHkrSG9wZWxlc3MrRGVzcGVyYXQrQ29udHJvbCtEcmluaysNCiAgICAgICAgICAgVG9vTXVjaCtEcnVncytUaG91Z2h0cytQbGFucytBY3Rpb25zK0F0dGVtcHQsIGRhdGEgPSBkYXRhLA0KICAgICAgICAgICAgICAgICAgICBmYXN0LnMubGFyZ2UubiA9IEluZikgICMgTU0tZXN0aW1hdG9yDQoNCnN1bW1hcnkoZml0X2xtcm9iKQ0KDQoNCnJlcyA8LSByZXNpZHVhbHMoZml0X2xtcm9iLCB0eXBlID0gInJlc3BvbnNlIikNCmZpdCA8LSBmaXR0ZWQoZml0X2xtcm9iKQ0KdyAgIDwtIGZpdF9sbXJvYiR3ICAjIHJvYnVzdCB3ZWlnaHRzIGluIFswLCAxXTsgc21hbGwgdmFsdWVzIHdlcmUgZG93bi13ZWlnaHRlZA0KYGBgDQoNCg0KDQoNCg0KYGBgIHtyLCBpbmNsdWRlPUZ9DQojIFJlc2lkdWFscyB2cyBGaXR0ZWQNCnBsb3QoZml0LCByZXMsDQogICAgIHhsYWIgPSAiRml0dGVkIHZhbHVlcyIsIHlsYWIgPSAiUmVzaWR1YWxzIiwNCiAgICAgbWFpbiA9ICJybG06IFJlc2lkdWFscyB2cyBGaXR0ZWQiKQ0KYWJsaW5lKGggPSAwLCBjb2wgPSAicmVkIikNCg0KIyBOb3JtYWwgUeKAk1Egb2YgcmVzaWR1YWxzIChqdXN0IHRvIHNlZSBoZWF2aW5lc3Mgb2YgdGFpbHM7IHJvYnVzdCBtb2RlbHMgZG9u4oCZdCBhc3N1bWUgbm9ybWFsaXR5KQ0KcXFub3JtKHJlcyk7IHFxbGluZShyZXMsIGNvbCA9ICJyZWQiKQ0KDQojIFNjYWxl4oCTTG9jYXRpb24gKHNxcnQofHJlc3wpIHZzIEZpdHRlZCkNCnBsb3QoZml0LCBzcXJ0KGFicyhyZXMpKSwNCiAgICAgeGxhYiA9ICJGaXR0ZWQgdmFsdWVzIiwgeWxhYiA9ICJTcXJ0KHxSZXNpZHVhbHN8KSIsDQogICAgIG1haW4gPSAicmxtOiBTY2FsZeKAk0xvY2F0aW9uIikNCg0KIyBSZXNpZHVhbHMgb3ZlciBvYnNlcnZhdGlvbiBvcmRlciAob3Igb3ZlciB0aW1lIGlmIHlvdSBoYXZlIGEgdGltZSB2YXJpYWJsZSkNCnBsb3QocmVzLCB0eXBlID0gImgiLCB4bGFiID0gIkluZGV4IChvciB0aW1lIG9yZGVyKSIsIHlsYWIgPSAiUmVzaWR1YWwiLA0KICAgICBtYWluID0gInJsbTogUmVzaWR1YWxzIGJ5IEluZGV4IikNCmFibGluZShoID0gMCwgY29sID0gInJlZCIpDQpgYGANCg0KDQo=