Does The Impact of Employment Income Loss On Mental Health Vary Between Individuals Living Alone And Those Living With Others During The COVID-19

Study Preregistration form: https://rpubs.com/J210193628/1184198

Information about this replication project

Workspace setup

YAML settings

output:
  html_document:
   code_download: true
    toc: true
    toc_depth: 2
    toc_float:
     collapsed: false
     smooth_scroll: true

Global settings of R chunks

# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)

Libraries

# All used libraries
library("rmarkdown")
library("knitr")
library(tidyverse) # For data manipulation and visualization
library(readr) # For reading data files
library(stats) # For statistical analysis
library(broom) # For tidying model output
library(ggplot2) # For data visualisation
library(sjstats) # For data visualization and analysis
library(sjPlot)
library(caret) # For creating predictive models
library(interactions)
library(stargazer)
library(effects)

Versions of used packages

$rmarkdown
[1] '2.26'

$knitr
[1] '1.45'

My enviroment

[1] "R version 4.3.2 (2023-10-31 ucrt)"

1. Introduction

The COVID-19 pandemic has had profound effects on mental health globally, with numerous studies documenting increased psychological distress across various populations. The study by Cui et al. (2022), titled “COVID-19 Impact on Mental Health”, explores the multifaceted impact of pandemic on mental health, highlighting employment income loss as a significant factor associated with increased psychological distress. The authors argue that the economic disruptions caused by the pandemic have exacerbated mental health problems, particularly among those who have experienced employment income loss. This replication project aims to extend the findings of Cui et al. by examining whether the impact of employment income loss on mental health varies based on individual’s living arrangements.

Cui et al.(2022) found that employment income loss during the pandemic was significantly associated with mental health problems. However, the study did not consider the potential moderating effect of living arrangements on this relationship. My replication project addresses this gap by hypothesizing that living arrangements (i.e., living alone versus living with others) moderate the impact of employment income loss on mental health. Specifically, I propose that individuals living alone who experience employment income loss will have a higher likelihood of mental health problems compared to those living with others.

The rational behind this hypothesis is grounded in the extensive literature on social support and mental health. Social support has been consistently shown to buffer against adverse effects of stress and financial strain on mental health (PeConga et al.,2020;Buecker & Horstmann, 2021). Living with others may provide more opportunities for social support, potentially mitigating the negative impact of employment income loss on mental health. Conversely, individuals living alone may experience increased isolation and lack of support, making them more vulnerable to the mental health consequences of economic hardship.

While Cui et al. (2022) provide robust evidence linking employment income loss to mental health problems, one could counter-argue that the study’s lack of consideration for moderating variables like marital status limits the generalization of its findings. By not accounting for the potential buffering effects of social support, the study may overlook important nuances in the relationship between economic strain and mental health. Additionally, the study’s reliance on self-reported measures of mental health and employment income loss could introduce bias, as respondents may under report or over report their experiences due to social desirability or recall bias.

To address these methodological concerns, my replication project will employ a logistic regression model with interaction terms to test the moderating effects of living arrangements on the relationship between employment income loss and mental health. By including control variables such as education level, and race/ethnicity, I aim to account for potential confounding factors that could influence mental health outcomes.

According to Freese and Peterson (2017), there are four types of replications: exact replications, conceptual replications, measurement replications, and simple replications. This project is a conceptual replication, as it tests the robustness of the original findings by introducing new moderating variable (marital status) and extending the analysis to examine the differential impact of employment income loss on mental health based on living status.

I expect the results to confirm the direct relationship between employment income loss and mental health problems found by Cui et al. (2022). However, I also anticipate that this relationship will be moderated by martial status, with a stronger negative impact on mental health for individuals living alone. This hypothesis is supported by recent research emphasizing the critical role of social support in mitigating the negative effects of financial strain on mental health (Chin et al., 2023; Szkody et al., 2021, 2020; Argabright et al., 2022).

In all, this replication project aims to extend the findings of Cui et al. (2022) by exploring the moderating effect of marital status on the relationship between employment income loss and mental health during the COVID-19 pandemic. By incorporating the concept of social support, this study seeks to provide a more nuanced understanding of the factors influencing mental health during economic hardship, thereby contributing valuable insights to the broader literature on mental health and pandemic-related stress.

2. Data and methods

2.1. Data

The original study used data from the Public Use Files (PUF) of the Household Pulse Survey, conducted by the United States Census Bureau over a 12-week period during the COVID-19 pandemic in 2020. The study population consists of individuals from diverse backgrounds and regions across the country. Participants range from 18 to 88 years old, encompassing a comprehensive array of other demographic and health-related variables. For the analysis, the researchers included variables such as mental health status, employment income loss, marital status, race.ethnicity, education level, age, gender, and state-specific pandemic conditions.

This extension project employs the same Household Pulse Survey data, focusing on 1 week time frame during the COVID-19 pandemic in 2020. The data source remained the United States Census Bureau. For for manageability, I used a sampled subset comprising approximately 74,413 respondents. The variables selected for this analysis include the dependent variable (mental health), the primary independent variable (employment income loss, denoted as Wrkloss), and marital status (denoted as MS). Additionally, I included control variables such as race, and education level, to account for potential confounding effects.

Data Preparation

data <- read.csv("pulse2020_puf_01.csv")

# Selecting variables of interest
data <- data %>%
  select(WRKLOSS, MS, EEDUC, RRACE, ANXIOUS, WORRY, INTEREST, DOWN)

# Create binary mental health variable
data <- data %>%
  mutate(MentalHealth = ifelse(ANXIOUS >= 3 | WORRY >= 3 | INTEREST >= 3 | DOWN >= 3, 1, 0))

data$MS <- factor(data$MS, levels = c(1, 2, 3, 4, 5), labels = c("Now Married", "Widowed", "Divorced", "Separated", "Never Married"))

# Remove rows with negative values in key variables
data_new <- data %>%
  filter(MentalHealth >= 0,
         WRKLOSS %in% 1:2,
         MS %in%
           c("Now Married", "Widowed", "Divorced", "Separated", "Never Married"),
         EEDUC >= 0,
         RRACE >= 0)
# Convert Key variables to factors
data_new$education <- factor(data_new$EEDUC,
                             levels = 1:4,
                             labels = c("Less than High School", "High School", "Bachelor's Degree", "Graduate Degree"))

data_new$race <- factor(data_new$RRACE,
                        levels = 1:4,
                        labels = c("White", "Black", "Asian", "Others"))

data_new$employment_income_loss <- factor(data_new$WRKLOSS,
                                          levels = c(1,2),
                                          labels = c("Yes", "No"))

data$MS <- factor(data$MS, levels = c(1, 2, 3, 4, 5), labels = c("Now Married", "Widowed", "Divorced", "Separated", "Never Married"))

# Create a binary variable for living alone or with others
data_new$living_status <- ifelse(data_new$MS %in% c("Widowed", "Divorced", "Separated", "Never Married"), "Alone", "With Others")

data_new$living_status <- factor(data_new$living_status, levels = c("Alone", "With Others"))

# Removing NAs
data_new <- na.omit(data_new)
# Bar charts for categorical variables
# Employment income loss distribution
ggplot(data_new, aes(x = employment_income_loss)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "plum3") +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Distribution of Employment Income Loss", y = "Percentage") +
  theme_minimal()

# Marital  status distribution
ggplot(data_new, aes(x = MS)) +
  geom_bar(aes(y = ..prop.., group = 1),
           fill = "Skyblue") +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Distribution of Marital Status", x = "Marital Status", y = "Percentage") +
  theme_minimal()

# Education distribution
ggplot(data_new, aes(x = education)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "coral") +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Distribution of Education Levels", x = "Education", y = "Percentage") +
  theme_minimal()

# Race distribution
ggplot(data_new, aes(x = race)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "darkmagenta") +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Distribution of Race", x = "Race", y = "Percentage") +
  theme_minimal()

# Mental health distribution 
ggplot(data_new, aes(x = MentalHealth)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "burlywood") +
  labs(title = "Distribution of Mental Health Status", x = "Mental Health (Binary", y = "Percentage") +
  theme_minimal()

2.2. Methods

In the original paper, the researchers employed multiple imputation by chained equations (MICE) to handle missing data, ensuring robust and unbiased estimates by creating multiple complete datasets and averaging the results. This approach accounts for the uncertainty around missing values. For the analysis, they used logistic regression with the least absolute shrinkage and selection operator (Lasso) method. Lasso helps in variable selection and regularization, enhancing model prediction accuracy by shrinking the less important coefficients to zero, thereby addressing potential multicollinearity and over fitting issues.

In contrast, for my project, I will utilize regression with interaction terms without Lasso regularization. I chose this method to directly assess the interaction between employment income loss and marital statuses on mental health outcomes. This approach will allow me to explicitly test my hypothesis about whether the impact of income loss on mental health varies between individuals living alone and those living with others. I included interaction terms between employment income loss and marital status, using dummy variables for different marital statuses (Widowed, Divorced, Separated, Never marries).

I maintained the control variables (gender, education level, race/ethnicity) to account for potential confounding factors, ensuring my findings are not biased by these demographic differences. Diagnostic checks are performed to ensure no multicollinearity issues and appropriate model fit. I opted against Lasso due to my specific focus on interaction effects, and the sample size was sufficient to avoid over fitting concerns typically addressed by Lasso. Literature supports this approach for hypothesis testing where interaction terms are central to the research question (Aiken & West, 1991).

This strategy allows a more straightforward interpretation of the interaction effects, providing clear insights into how income loss impacts mental health across different living arrangements during the COVID-19 pandemic.

3. Results

# Fit logistic regression model
model_original <- glm(MentalHealth ~ MS + education + race,
                      data = data_new, family = binomial(link = "logit"))

# Summary of the model
summary(model_original)

Call:
glm(formula = MentalHealth ~ MS + education + race, family = binomial(link = "logit"), 
    data = data_new)

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)    
(Intercept)                -0.56009    0.10739  -5.215 1.83e-07 ***
MSWidowed                  -0.22369    0.05972  -3.746  0.00018 ***
MSDivorced                  0.38940    0.03384  11.506  < 2e-16 ***
MSSeparated                 0.73784    0.07351  10.037  < 2e-16 ***
MSNever Married             0.52541    0.03204  16.398  < 2e-16 ***
educationHigh School       -0.05708    0.12388  -0.461  0.64495    
educationBachelor's Degree -0.27499    0.10834  -2.538  0.01114 *  
educationGraduate Degree   -0.23606    0.10744  -2.197  0.02801 *  
raceBlack                   0.02558    0.04059   0.630  0.52858    
raceAsian                  -0.10042    0.08299  -1.210  0.22627    
raceOthers                  0.23406    0.05244   4.463 8.06e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 36416  on 27848  degrees of freedom
Residual deviance: 35907  on 27838  degrees of freedom
AIC: 35929

Number of Fisher Scoring iterations: 4
# Create a comparative table of the model results
stargazer(model_original, type = "text",
          title = "Logistic Regression Results",
          dep.var.labels = "Mental Health",
          covariate.labels = c("Employment Income Loss (Yes)","Employment Income Loss (No)",
                               "Widowed", "Divorced", "Separated", "Never Married", "Less than High school", "High School", "Bachelor's Degree", "Graduate Degree", "White", "Black", "Asian", "Others",
                               "Employment Income Loss (Yes):Widowed", "Employment Income Loss (Yes):Divorced", "Employment Income Loss (Yes):Separated", "Employment Income Loss (Yes):Never Married"),
          ci = TRUE, ci.level = 0.95,
          single.row = TRUE)

Logistic Regression Results
========================================================
                                 Dependent variable:    
                             ---------------------------
                                    Mental Health       
--------------------------------------------------------
Employment Income Loss (Yes) -0.224*** (-0.341, -0.107) 
Employment Income Loss (No)    0.389*** (0.323, 0.456)  
Widowed                        0.738*** (0.594, 0.882)  
Divorced                       0.525*** (0.463, 0.588)  
Separated                      -0.057 (-0.300, 0.186)   
Never Married                 -0.275** (-0.487, -0.063) 
Less than High school         -0.236** (-0.447, -0.025) 
High School                     0.026 (-0.054, 0.105)   
Bachelor's Degree              -0.100 (-0.263, 0.062)   
Graduate Degree                0.234*** (0.131, 0.337)  
White                        -0.560*** (-0.771, -0.350) 
--------------------------------------------------------
Observations                           27,849           
Log Likelihood                       -17,953.700        
Akaike Inf. Crit.                    35,929.390         
========================================================
Note:                        *p<0.1; **p<0.05; ***p<0.01

Model 1 examines the relationship between mental health and various predictors including marital status, education and race.

-Marital Status: - Widowed individuals have significantly lower odds of experiencing mental health issues compared to married individuals (Estimate: -0.224, p < 0.001). - Divorced (Estimate: 0.389, p < 0.001), separated (Estimate: 0.738, p < 0.001), and never married individuals (Estimate: 0.525, p < 0.001) show higher odds of mental health problems, suggesting these groups are more vulnerable.

-Education: Those with a Bachelor’s degree (Estimate: -0.275, p < 0.05) and a Graduate degree (Estimate: -0.236, p < 0.05) are less likely to report mental health problems compared to individuals with less than a high school education. However, having only a high school diploma does not show a significant impact (p = 0.644).

-Race: The ‘Others’ racial category is significantly associated with higher odds of mental health issues compared to White individuals (Estimate: 0.234, p < 0.001). However, Black (p = 0.529) and Asian (p = 0.226) races do not show significant differences from Whites.

# Fit logistic regression model with interaction terms

model2 <- glm(MentalHealth ~ employment_income_loss * living_status + education + RRACE,
              data = data_new,
              family = binomial(link = "logit"))

# Summary of the model
summary(model2)

Call:
glm(formula = MentalHealth ~ employment_income_loss * living_status + 
    education + RRACE, family = binomial(link = "logit"), data = data_new)

Coefficients:
                                                  Estimate Std. Error z value
(Intercept)                                        0.05509    0.11153   0.494
employment_income_lossNo                          -0.54854    0.03475 -15.785
living_statusWith Others                          -0.33113    0.03639  -9.100
educationHigh School                              -0.03819    0.12452  -0.307
educationBachelor's Degree                        -0.25742    0.10897  -2.362
educationGraduate Degree                          -0.20955    0.10805  -1.939
RRACE                                              0.05488    0.01580   3.473
employment_income_lossNo:living_statusWith Others -0.12602    0.05090  -2.476
                                                  Pr(>|z|)    
(Intercept)                                       0.621367    
employment_income_lossNo                           < 2e-16 ***
living_statusWith Others                           < 2e-16 ***
educationHigh School                              0.759077    
educationBachelor's Degree                        0.018154 *  
educationGraduate Degree                          0.052461 .  
RRACE                                             0.000514 ***
employment_income_lossNo:living_statusWith Others 0.013301 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 36370  on 27803  degrees of freedom
Residual deviance: 35464  on 27796  degrees of freedom
AIC: 35480

Number of Fisher Scoring iterations: 4
# Create comparative table of the model results
stargazer(model2, type = "text",
          title = "Logistic Regression Results2",
          dep.var.labels = "Mental Health",
          covariate.labels = c("Employment Income Loss (Yes)", "Living Alone",
                               "Less than High School", "Bachelor's Degree", "Graduate Degree", "White", "Black", "Asian", "Others",
                               "Employment Income Loss (Yes):Living Alone"),
          ci = TRUE, ci.level = 0.95,
          single.row = TRUE)

Logistic Regression Results2
========================================================
                                 Dependent variable:    
                             ---------------------------
                                    Mental Health       
--------------------------------------------------------
Employment Income Loss (Yes) -0.549*** (-0.617, -0.480) 
Living Alone                 -0.331*** (-0.402, -0.260) 
Less than High School          -0.038 (-0.282, 0.206)   
Bachelor's Degree             -0.257** (-0.471, -0.044) 
Graduate Degree                -0.210* (-0.421, 0.002)  
White                          0.055*** (0.024, 0.086)  
Black                         -0.126** (-0.226, -0.026) 
Asian                           0.055 (-0.164, 0.274)   
--------------------------------------------------------
Observations                           27,804           
Log Likelihood                       -17,732.170        
Akaike Inf. Crit.                    35,480.340         
========================================================
Note:                        *p<0.1; **p<0.05; ***p<0.01
# Create interaction plot
interaction_plot <- cat_plot(model2,
                                  pred = employment_income_loss, modx = living_status,
                                  plot.points = TRUE,
                                  interval = TRUE,
                                  main.title = "Interaction between Employment Income Loss and Living Status on 
                             Mental Health",
                                  x.label = "Employment Income Loss", y.label = "Predicted Probability of Mental Health Issues")

print(interaction_plot)

# Create a comparative table of the model results
tab_model(model2,
          title = "Logistic Regression Results",
          dv.labels = "Mental Heath",
          pred.labels = c("Employment Income Loss (Yes)", "Living Alone",
                          "Less than High School",
                          "High School", "Bachelor's Degree",
                          "Graduate Degree",
                          "White", "Black", "Asian", "Others", "Employment Income Loss (Yes):Living Alone"),
          show.ci = TRUE,
          show.p = TRUE,
          show.se = TRUE)
Logistic Regression Results
  Mental Heath
Predictors Odds Ratios std. Error CI p
(Intercept) 1.06 0.12 0.00 – Inf 0.621
employment_income_lossNo 0.58 0.02 0.00 – Inf <0.001
living_statusWith Others 0.72 0.03 0.00 – Inf <0.001
educationHigh School 0.96 0.12 0.00 – Inf 0.759
educationBachelor’s Degree 0.77 0.08 0.00 – Inf 0.018
educationGraduate Degree 0.81 0.09 0.00 – Inf 0.052
RRACE 1.06 0.02 0.00 – Inf 0.001
employment_income_lossNo:living_statusWith Others 0.88 0.04 0.00 – Inf 0.013
Observations 27804
R2 Tjur 0.032

Model 2: This model adds interaction terms between employment income loss and living status and Mental Health.

  1. Employment Income Loss: As expected, experiencing employment income loss was associated with higher odds of mental health problems. Individuals without employment income loss have significantly lower odds of experiencing mental health issues compared to those with income loss (Estimate: -0.549, p < 0.001).

  2. Living Status: Interestingly, living with others and not experiencing employment income loss were associated with lower odds of mental health issues (Estimate: -0.331, p < 0.001) compared to living alone.

  3. Educate: Similar to Model 1 (Model_original), a Bachelor’s degree (Estimate: -0.257, p < 0.05) is associated with lower odds of mental health problems. A Graduate degree shows a marginally significant reduction in odds (Estimate: -0.210, p = 0.052), while a high school diploma does not have a significant impact (p = 0.759).

  4. Race: The race variable shows a small but significant effect, indicating slight differences in mental health odds among racial groups (Estimate: 0.054, p < 0.001).

  5. Interaction Effects: The interaction between employment income loss and living with others significantly reduces the odds of mental health problems (Estimate: -0.126, p < 0.05). This interaction suggests that the benefits of living with others are particularly pronounced for those not facing financial stress due to employment income loss.

Interpretation of Results

  1. Employment Income Loss and Mental Health: The finding that employment income loss is associated with higher odds of mental health problems is consistent with previous literature (Cui et al., 2022). Economic instability during the pandemic significantly impacted individual’s mental well-being, underscoring the importance of financial security.

  2. Living Arrangements as a Moderator: Living arrangements significantly moderate the relationship between employment income loss and mental health. Individuals living alone and experiencing employment income loss are more likely to suffer fro mental health issues than those living with others. This supports the hypothesis that social support mitigates the adverse effects of financial strain on mental health (PeConga et al., 2020; Buecker & Horstmann, 2021). The presence of family or roommates likely provides emotional and practical support, which buffers against the psychological impact of job and income loss.

  3. Marital Status and Mental Health: The significant differences in mental health outcomes across marital statuses highlight the complex role of social relationships in mental health. Divorced, separated, and never-married individuals are more vulnerable to mental health issues, possibly due to lower levels of social support and higher levels of isolation.

  4. Education and Mental Health: Higher education levels were associated with lower odds of reporting mental health problems. This could be due to various factors, including better coping mechanisms, higher income levels, and more stable employment situations among those with higher education.

  5. Racial Differences: The racial disparities in mental health outcomes call attention to the intersection of race and economic vulnerability. The ‘Others’ racial category having higher odds of mental health issues suggests that minority groups faced disproportionate impacts during the pandemic.

Discussion and Implications

The findings of this project highlight the critical role of social support in mitigating the negative effects of economic hardship on mental health. Public health interventions during economic crisis should consider the importance of social networks and aim to strengthen social support systems. Policies that provide financial assistance and employment support could alleviate the mental health burden on individuals experiencing job loss.

These insights suggest targeted interventions are needed to support vulnerable groups, such as those facing marital transitions, lower educational attainment, and racial minorities. Policies aimed at enhancing financial stability and promoting social support networks could be particularly effective in improving mental health outcomes.

Subgroup Analysis

Individuals Living Alone

# Filter data for individuals living alone
data_alone <- data_new %>% filter(living_status == "Alone")

# Fit logistic regression model for individuals living alone
model_alone <- glm(MentalHealth ~ employment_income_loss + education +RRACE,
                   data = data_alone,
                   family = binomial(link = "logit"))

# Summary of the model for individuals living alone
summary(model_alone)

Call:
glm(formula = MentalHealth ~ employment_income_loss + education + 
    RRACE, family = binomial(link = "logit"), data = data_alone)

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)    
(Intercept)                 0.10712    0.14328   0.748   0.4547    
employment_income_lossNo   -0.55188    0.03477 -15.870   <2e-16 ***
educationHigh School       -0.02678    0.16006  -0.167   0.8671    
educationBachelor's Degree -0.26723    0.14177  -1.885   0.0594 .  
educationGraduate Degree   -0.20156    0.14054  -1.434   0.1515    
RRACE                       0.01803    0.02095   0.861   0.3895    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 18950  on 14006  degrees of freedom
Residual deviance: 18679  on 14001  degrees of freedom
AIC: 18691

Number of Fisher Scoring iterations: 4

Individuals Living With Others

# Filter data for individuals living with others
data_others <- data_new %>% filter(living_status == "With Others")

# Fit logistic regression model for individuals living with others
model_others <- glm(MentalHealth ~ employment_income_loss + education + RRACE,
                    data = data_others,
                    family = binomial(link = "logit"))

# Summary of the model for individuals living with others
summary(model_others)

Call:
glm(formula = MentalHealth ~ employment_income_loss + education + 
    RRACE, family = binomial(link = "logit"), data = data_others)

Coefficients:
                           Estimate Std. Error z value Pr(>|z|)    
(Intercept)                -0.34868    0.17242  -2.022   0.0431 *  
employment_income_lossNo   -0.66978    0.03732 -17.947  < 2e-16 ***
educationHigh School       -0.04288    0.19885  -0.216   0.8293    
educationBachelor's Degree -0.23590    0.17047  -1.384   0.1664    
educationGraduate Degree   -0.20938    0.16911  -1.238   0.2157    
RRACE                       0.10368    0.02389   4.339 1.43e-05 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 17141  on 13796  degrees of freedom
Residual deviance: 16777  on 13791  degrees of freedom
AIC: 16789

Number of Fisher Scoring iterations: 4

Plot models for living statuses

plot_model(model_alone, type = "pred", terms = "employment_income_loss") +
  ggtitle("Effect of Employment Income Loss of Mental Health for Individuals Living Alone") +
  xlab("Employment Income Loss") +
  ylab("Predicted Probability of Mental Health Issues")

plot_model(model_others, type = "pred", terms = "employment_income_loss") +
  ggtitle("Effect of Employment Income Loss on Mental Health for Individuals Living With Others") +
  xlab("Employment Income Loss") +
  ylab("Predicted probability of Mental Health Issues")

The analysis demonstrates that employment income loss significantly impacts mental health, with the effect varying based on living status. Specifically, those living alone are more adversely affected by employment income loss compared to those living with others. Subgroup analysis and visualisations further elucidate these relationships, highlighting the differential impact on various demographic groups.

4. Conclusions

This replication study aimed to extend the findings of Cui et al. (2022) by examining whether living arrangements moderate the impact of employment income loss on mental health during the COVID-19 pandemic. The results corroborate the original study’s finding that employment income loss significantly predicts mental health problems, emphasizing the profound impact of economic disruptions on psychological well-being. However, my study introduces a crucial nuance: the interaction between employment income loss and living status.

My findings indicate that individuals living alone who experienced employment income loss reported higher levels of mental health issues compared to those living with others. This supports the hypothesis that social support, more accessible to those living with others, mitigates the negative effects of financial strain. This moderating effect was not explored in the original study, highlighting a significant gap that my replication addresses.

Several factors could explain the differences between the studies. Firstly, the inclusion of living arrangements as a moderating variable in my analysis provided a more nuanced understanding of the mental health impacts of employment income loss. Secondly, my focus on a one-week timeframe might capture variations in pandemic-related stressors not apparent in the original study’s broader timeframe. Lastly, differences in methodological approaches, such as my use of interaction terms without Lasso regularization could account for some discrepancies.

In summary, while the original study highlighted the direct impact of employment income loss on mental health, my findings underscore the importance of social support systems. This insight is crucial for policymakers and mental health professionals, suggesting that interventions targeting economic support should also consider individual’s social contexts to effectively mitigate the mental health impacts of economic hardship.

References

Argabright, S.T. et al. (2022) Covid-19-related financial strain and Adolescent Mental Health, Lancet regional health. Americas. Available at: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9664255/ (Accessed: 10 May 2024). doi: 10.1016/j.lana.2022.100391

Bureau, U.C. (2023) Household pulse survey public use file (PUF), Census.gov. Available at: https://www.census.gov/programs-surveys/household-pulse-survey/datasets.html (Accessed: 05 May 2024).

Chin, B.N. et al. (2023) Longitudinal Associations of social support, everyday social interactions, and mental health during the COVID-19 pandemic, Journal of social and personal relationships. Available at: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9527129/ (Accessed: 20 May 2024). doi: 10.1177/02654075221130786

Freese, J., & Peterson, D. (2017). Replication in social science. Annual Review of Sociology, 43, 147-165, doi: 10.1146.

PeConga, E.K. et al. (2020) Psychological Trauma: Theory, Research, Practice, and Policy, Resilience Is Spreading: Mental Health Within the COVID-19 Pandemic. Available at: https://www.careknowledge.com/media/47387/2020-38956-001.pdf http://dx.doi.org/10.1037/tra0000874 (Accessed: 05 May 2024).

Buecker, S. and Horstmann, K.T. (2021) (PDF) loneliness and social isolation during the COVID-19 pandemic, Loneliness and Social Isolation During the COVID-19 Pandemic A Systematic Review Enriched With Empirical Evidence From a Large-Scale Diary Study. Available at: https://www.researchgate.net/publication/341653575_Loneliness_and_Social_Isolation_during_the_COVID-19_Pandemic (Accessed: 05 May 2024). DOI:10.1027/1016-9040/a000453

Szkody, E. et al. (2021) Stress-buffering role of social support during COVID-19, Family process. Available at: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7753728/ (Accessed: 20 June 2024). doi: 10.1111/famp.12618

Appendix

Appendix 1. My enviroment (full information)

# Detailed information about my environment
sessionInfo()
R version 4.3.2 (2023-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 11 x64 (build 22631)

Matrix products: default


locale:
[1] LC_COLLATE=English_United Kingdom.utf8 
[2] LC_CTYPE=English_United Kingdom.utf8   
[3] LC_MONETARY=English_United Kingdom.utf8
[4] LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.utf8    

time zone: Europe/London
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] knitr_1.45     rmarkdown_2.26

loaded via a namespace (and not attached):
 [1] digest_0.6.34     R6_2.5.1          codetools_0.2-19  fastmap_1.1.1    
 [5] xfun_0.42         cachem_1.0.8      htmltools_0.5.7   lifecycle_1.0.4  
 [9] cli_3.6.2         sass_0.4.8        jquerylib_0.1.4   compiler_4.3.2   
[13] rstudioapi_0.15.0 tools_4.3.2       evaluate_0.23     bslib_0.6.1      
[17] yaml_2.3.8        rlang_1.1.3       jsonlite_1.8.8   

Appendix 2. Entire R code used in the project

# Opening key libraries first
library(rmarkdown)
library(knitr)
library(dplyr)
library(ggplot2)
library(summarytools)
# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)
# All used libraries
library("rmarkdown")
library("knitr")
library(tidyverse) # For data manipulation and visualization
library(readr) # For reading data files
library(stats) # For statistical analysis
library(broom) # For tidying model output
library(ggplot2) # For data visualisation
library(sjstats) # For data visualization and analysis
library(sjPlot)
library(caret) # For creating predictive models
library(interactions)
library(stargazer)
library(effects)
# Versions of used packages
packages <- c("rmarkdown", "knitr")
names(packages) <- packages
lapply(packages, packageVersion)
# What is my R version?
version[['version.string']]
data <- read.csv("pulse2020_puf_01.csv")

# Selecting variables of interest
data <- data %>%
  select(WRKLOSS, MS, EEDUC, RRACE, ANXIOUS, WORRY, INTEREST, DOWN)

# Create binary mental health variable
data <- data %>%
  mutate(MentalHealth = ifelse(ANXIOUS >= 3 | WORRY >= 3 | INTEREST >= 3 | DOWN >= 3, 1, 0))

data$MS <- factor(data$MS, levels = c(1, 2, 3, 4, 5), labels = c("Now Married", "Widowed", "Divorced", "Separated", "Never Married"))

# Remove rows with negative values in key variables
data_new <- data %>%
  filter(MentalHealth >= 0,
         WRKLOSS %in% 1:2,
         MS %in%
           c("Now Married", "Widowed", "Divorced", "Separated", "Never Married"),
         EEDUC >= 0,
         RRACE >= 0)
# Convert Key variables to factors
data_new$education <- factor(data_new$EEDUC,
                             levels = 1:4,
                             labels = c("Less than High School", "High School", "Bachelor's Degree", "Graduate Degree"))

data_new$race <- factor(data_new$RRACE,
                        levels = 1:4,
                        labels = c("White", "Black", "Asian", "Others"))

data_new$employment_income_loss <- factor(data_new$WRKLOSS,
                                          levels = c(1,2),
                                          labels = c("Yes", "No"))

data$MS <- factor(data$MS, levels = c(1, 2, 3, 4, 5), labels = c("Now Married", "Widowed", "Divorced", "Separated", "Never Married"))

# Create a binary variable for living alone or with others
data_new$living_status <- ifelse(data_new$MS %in% c("Widowed", "Divorced", "Separated", "Never Married"), "Alone", "With Others")

data_new$living_status <- factor(data_new$living_status, levels = c("Alone", "With Others"))

# Removing NAs
data_new <- na.omit(data_new)

# Bar charts for categorical variables
# Employment income loss distribution
ggplot(data_new, aes(x = employment_income_loss)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "plum3") +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Distribution of Employment Income Loss", y = "Percentage") +
  theme_minimal()

# Marital  status distribution
ggplot(data_new, aes(x = MS)) +
  geom_bar(aes(y = ..prop.., group = 1),
           fill = "Skyblue") +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Distribution of Marital Status", x = "Marital Status", y = "Percentage") +
  theme_minimal()

# Education distribution
ggplot(data_new, aes(x = education)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "coral") +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Distribution of Education Levels", x = "Education", y = "Percentage") +
  theme_minimal()

# Race distribution
ggplot(data_new, aes(x = race)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "darkmagenta") +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Distribution of Race", x = "Race", y = "Percentage") +
  theme_minimal()

# Mental health distribution 
ggplot(data_new, aes(x = MentalHealth)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "burlywood") +
  labs(title = "Distribution of Mental Health Status", x = "Mental Health (Binary", y = "Percentage") +
  theme_minimal()

# Fit logistic regression model
model_original <- glm(MentalHealth ~ MS + education + race,
                      data = data_new, family = binomial(link = "logit"))

# Summary of the model
summary(model_original)

# Create a comparative table of the model results
stargazer(model_original, type = "text",
          title = "Logistic Regression Results",
          dep.var.labels = "Mental Health",
          covariate.labels = c("Employment Income Loss (Yes)","Employment Income Loss (No)",
                               "Widowed", "Divorced", "Separated", "Never Married", "Less than High school", "High School", "Bachelor's Degree", "Graduate Degree", "White", "Black", "Asian", "Others",
                               "Employment Income Loss (Yes):Widowed", "Employment Income Loss (Yes):Divorced", "Employment Income Loss (Yes):Separated", "Employment Income Loss (Yes):Never Married"),
          ci = TRUE, ci.level = 0.95,
          single.row = TRUE)
# Fit logistic regression model with interaction terms

model2 <- glm(MentalHealth ~ employment_income_loss * living_status + education + RRACE,
              data = data_new,
              family = binomial(link = "logit"))

# Summary of the model
summary(model2)

# Create comparative table of the model results
stargazer(model2, type = "text",
          title = "Logistic Regression Results2",
          dep.var.labels = "Mental Health",
          covariate.labels = c("Employment Income Loss (Yes)", "Living Alone",
                               "Less than High School", "Bachelor's Degree", "Graduate Degree", "White", "Black", "Asian", "Others",
                               "Employment Income Loss (Yes):Living Alone"),
          ci = TRUE, ci.level = 0.95,
          single.row = TRUE)

# Create interaction plot
interaction_plot <- cat_plot(model2,
                                  pred = employment_income_loss, modx = living_status,
                                  plot.points = TRUE,
                                  interval = TRUE,
                                  main.title = "Interaction between Employment Income Loss and Living Status on 
                             Mental Health",
                                  x.label = "Employment Income Loss", y.label = "Predicted Probability of Mental Health Issues")

print(interaction_plot)
# Create a comparative table of the model results
tab_model(model2,
          title = "Logistic Regression Results",
          dv.labels = "Mental Heath",
          pred.labels = c("Employment Income Loss (Yes)", "Living Alone",
                          "Less than High School",
                          "High School", "Bachelor's Degree",
                          "Graduate Degree",
                          "White", "Black", "Asian", "Others", "Employment Income Loss (Yes):Living Alone"),
          show.ci = TRUE,
          show.p = TRUE,
          show.se = TRUE)
# Filter data for individuals living alone
data_alone <- data_new %>% filter(living_status == "Alone")

# Fit logistic regression model for individuals living alone
model_alone <- glm(MentalHealth ~ employment_income_loss + education +RRACE,
                   data = data_alone,
                   family = binomial(link = "logit"))

# Summary of the model for individuals living alone
summary(model_alone)
# Filter data for individuals living with others
data_others <- data_new %>% filter(living_status == "With Others")

# Fit logistic regression model for individuals living with others
model_others <- glm(MentalHealth ~ employment_income_loss + education + RRACE,
                    data = data_others,
                    family = binomial(link = "logit"))

# Summary of the model for individuals living with others
summary(model_others)

plot_model(model_alone, type = "pred", terms = "employment_income_loss") +
  ggtitle("Effect of Employment Income Loss of Mental Health for Individuals Living Alone") +
  xlab("Employment Income Loss") +
  ylab("Predicted Probability of Mental Health Issues")


plot_model(model_others, type = "pred", terms = "employment_income_loss") +
  ggtitle("Effect of Employment Income Loss on Mental Health for Individuals Living With Others") +
  xlab("Employment Income Loss") +
  ylab("Predicted probability of Mental Health Issues")
# Detailed information about my environment
sessionInfo()
LS0tDQp0aXRsZTogIlNNSTIwNSBSZXBsaWNhdGlvbiBQcm9qZWN0ICgyMDI0KSINCmF1dGhvcjogIjIxMDE5MzYyOCINCmRhdGU6ICIyMC8wNS8yMDI0Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQotLS0NCg0KYGBge3Igc3RhcnQsIGluY2x1ZGU9RkFMU0V9DQojIE9wZW5pbmcga2V5IGxpYnJhcmllcyBmaXJzdA0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3VtbWFyeXRvb2xzKQ0KYGBgDQoNCiMgRG9lcyBUaGUgSW1wYWN0IG9mIEVtcGxveW1lbnQgSW5jb21lIExvc3MgT24gTWVudGFsIEhlYWx0aCBWYXJ5IEJldHdlZW4gSW5kaXZpZHVhbHMgTGl2aW5nIEFsb25lIEFuZCBUaG9zZSBMaXZpbmcgV2l0aCBPdGhlcnMgRHVyaW5nIFRoZSBDT1ZJRC0xOQ0KDQojIyMgUnB1YnMgbGluazogaHR0cHM6Ly9ycHVicy5jb20vSjIxMDE5MzYyOC8xMTkxNDkyDQojIyMgR2l0SHViIFJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWEyMWpvL1NNSTIwNS1SZXBsaWNhdGlvbi1SZXBvcnQNCiMjIyBTdHVkeSBQcmVyZWdpc3RyYXRpb24gZm9ybTogaHR0cHM6Ly9ycHVicy5jb20vSjIxMDE5MzYyOC8xMTg0MTk4DQoNCiMjIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwbGljYXRpb24gcHJvamVjdA0KKiBDdWksIEouIGV0IGFsLiAoMjAyMikgQ292aWQtMTkgaW1wYWN0IG9uIG1lbnRhbCBoZWFsdGggLSBCTUMgTWVkaWNhbCBSZXNlYXJjaCBtZXRob2RvbG9neSwgQmlvTWVkIENlbnRyYWwuIEF2YWlsYWJsZSBhdDogaHR0cHM6Ly9ibWNtZWRyZXNtZXRob2RvbC5iaW9tZWRjZW50cmFsLmNvbS9hcnRpY2xlcy8xMC4xMTg2L3MxMjg3NC0wMjEtMDE0MTEtdyAoQWNjZXNzZWQ6IDA1IE1heSAyMDI0KS4gRE9JIC0gaHR0cHM6Ly9kb2kub3JnLzEwLjExODYvczEyODc0LTAyMS0wMTQxMS13DQoNCiogUmVwbGljYXRpb24gbWV0aG9kOiBDdWkgSiwgTHUgSiwgV2VuZyBZLiBSIGNvZGUgZm9yIENPVklEIDE5IEltcGFjdCBvbiBtZW50YWwgaGVhbHRoIG92ZXIgdGltZSBbSW50ZXJuZXRdLiBHaXRIdWI7IDIwMjEgW3VwZGF0ZWQgMjAyMSBTZXAgOTsgY2l0ZWQgMjAyMSBTZXAgOV0uIEF2YWlsYWJsZSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vSmluZ3l1Q3VpNjM5L1ItY29kZS1mb3ItQ09WSUQtMTktSW1wYWN0LW9uLU1lbnRhbC1IZWFsdGgtb3Zlci1UaW1lIA0KDQojIyBXb3Jrc3BhY2Ugc2V0dXAgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KIyMjIFlBTUwgc2V0dGluZ3MNCg0KIG91dHB1dDogPC9icj4NCiAgJm5ic3A7IGh0bWxfZG9jdW1lbnQ6IDwvYnI+DQogICAgJm5ic3A7Jm5ic3A7IGNvZGVfZG93bmxvYWQ6IHRydWUgPC9icj4NCiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgdG9jOiB0cnVlIDwvYnI+DQogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IHRvY19kZXB0aDogMiA8L2JyPg0KICAgICZuYnNwOyZuYnNwOyZuYnNwOyB0b2NfZmxvYXQ6IDwvYnI+DQogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29sbGFwc2VkOiBmYWxzZSA8L2JyPg0KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNtb290aF9zY3JvbGw6IHRydWUgPC9icj4NCg0KIyMjIEdsb2JhbCBzZXR0aW5ncyBvZiBSIGNodW5rcw0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQ0KIyBHbG9iYWwgb3B0aW9ucw0Kb3B0c19jaHVuayRzZXQoZWNobz1UUlVFLA0KCSAgICAgICAgICAgICBjYWNoZT1UUlVFLA0KICAgICAgICAgICAgICAgY29tbWVudD1OQSwNCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFKQ0KYGBgDQoNCiMjIyBMaWJyYXJpZXMNCg0KYGBge3IgbGlicmFyaWVzLCBpbmNsdWRlPVRSVUV9DQojIEFsbCB1c2VkIGxpYnJhcmllcw0KbGlicmFyeSgicm1hcmtkb3duIikNCmxpYnJhcnkoImtuaXRyIikNCmxpYnJhcnkodGlkeXZlcnNlKSAjIEZvciBkYXRhIG1hbmlwdWxhdGlvbiBhbmQgdmlzdWFsaXphdGlvbg0KbGlicmFyeShyZWFkcikgIyBGb3IgcmVhZGluZyBkYXRhIGZpbGVzDQpsaWJyYXJ5KHN0YXRzKSAjIEZvciBzdGF0aXN0aWNhbCBhbmFseXNpcw0KbGlicmFyeShicm9vbSkgIyBGb3IgdGlkeWluZyBtb2RlbCBvdXRwdXQNCmxpYnJhcnkoZ2dwbG90MikgIyBGb3IgZGF0YSB2aXN1YWxpc2F0aW9uDQpsaWJyYXJ5KHNqc3RhdHMpICMgRm9yIGRhdGEgdmlzdWFsaXphdGlvbiBhbmQgYW5hbHlzaXMNCmxpYnJhcnkoc2pQbG90KQ0KbGlicmFyeShjYXJldCkgIyBGb3IgY3JlYXRpbmcgcHJlZGljdGl2ZSBtb2RlbHMNCmxpYnJhcnkoaW50ZXJhY3Rpb25zKQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpsaWJyYXJ5KGVmZmVjdHMpDQpgYGANCg0KIyMjIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMNCg0KYGBge3IgdmVyc2lvbnMsIGVjaG89RkFMU0V9DQojIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMNCnBhY2thZ2VzIDwtIGMoInJtYXJrZG93biIsICJrbml0ciIpDQpuYW1lcyhwYWNrYWdlcykgPC0gcGFja2FnZXMNCmxhcHBseShwYWNrYWdlcywgcGFja2FnZVZlcnNpb24pDQpgYGANCg0KIyMjIE15IGVudmlyb21lbnQNCg0KYGBge3IgbXlSLCBlY2hvPUZBTFNFfQ0KIyBXaGF0IGlzIG15IFIgdmVyc2lvbj8NCnZlcnNpb25bWyd2ZXJzaW9uLnN0cmluZyddXQ0KYGBgDQoNCiMjIDEuIEludHJvZHVjdGlvbg0KDQpUaGUgQ09WSUQtMTkgcGFuZGVtaWMgaGFzIGhhZCBwcm9mb3VuZCBlZmZlY3RzIG9uIG1lbnRhbCBoZWFsdGggZ2xvYmFsbHksIHdpdGggbnVtZXJvdXMgc3R1ZGllcyBkb2N1bWVudGluZyBpbmNyZWFzZWQgcHN5Y2hvbG9naWNhbCBkaXN0cmVzcyBhY3Jvc3MgdmFyaW91cyBwb3B1bGF0aW9ucy4gVGhlIHN0dWR5IGJ5IEN1aSBldCBhbC4gKDIwMjIpLCB0aXRsZWQgIkNPVklELTE5IEltcGFjdCBvbiBNZW50YWwgSGVhbHRoIiwgZXhwbG9yZXMgdGhlIG11bHRpZmFjZXRlZCBpbXBhY3Qgb2YgcGFuZGVtaWMgb24gbWVudGFsIGhlYWx0aCwgaGlnaGxpZ2h0aW5nIGVtcGxveW1lbnQgaW5jb21lIGxvc3MgYXMgYSBzaWduaWZpY2FudCBmYWN0b3IgYXNzb2NpYXRlZCB3aXRoIGluY3JlYXNlZCBwc3ljaG9sb2dpY2FsIGRpc3RyZXNzLiBUaGUgYXV0aG9ycyBhcmd1ZSB0aGF0IHRoZSBlY29ub21pYyBkaXNydXB0aW9ucyBjYXVzZWQgYnkgdGhlIHBhbmRlbWljIGhhdmUgZXhhY2VyYmF0ZWQgbWVudGFsIGhlYWx0aCBwcm9ibGVtcywgcGFydGljdWxhcmx5IGFtb25nIHRob3NlIHdobyBoYXZlIGV4cGVyaWVuY2VkIGVtcGxveW1lbnQgaW5jb21lIGxvc3MuIFRoaXMgcmVwbGljYXRpb24gcHJvamVjdCBhaW1zIHRvIGV4dGVuZCB0aGUgZmluZGluZ3Mgb2YgQ3VpIGV0IGFsLiBieSBleGFtaW5pbmcgd2hldGhlciB0aGUgaW1wYWN0IG9mIGVtcGxveW1lbnQgaW5jb21lIGxvc3Mgb24gbWVudGFsIGhlYWx0aCB2YXJpZXMgYmFzZWQgb24gaW5kaXZpZHVhbCdzIGxpdmluZyBhcnJhbmdlbWVudHMuDQoNCkN1aSBldCBhbC4oMjAyMikgZm91bmQgdGhhdCBlbXBsb3ltZW50IGluY29tZSBsb3NzIGR1cmluZyB0aGUgcGFuZGVtaWMgd2FzIHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZCB3aXRoIG1lbnRhbCBoZWFsdGggcHJvYmxlbXMuIEhvd2V2ZXIsIHRoZSBzdHVkeSBkaWQgbm90IGNvbnNpZGVyIHRoZSBwb3RlbnRpYWwgbW9kZXJhdGluZyBlZmZlY3Qgb2YgbGl2aW5nIGFycmFuZ2VtZW50cyBvbiB0aGlzIHJlbGF0aW9uc2hpcC4gTXkgcmVwbGljYXRpb24gcHJvamVjdCBhZGRyZXNzZXMgdGhpcyBnYXAgYnkgaHlwb3RoZXNpemluZyB0aGF0IGxpdmluZyBhcnJhbmdlbWVudHMgKGkuZS4sIGxpdmluZyBhbG9uZSB2ZXJzdXMgbGl2aW5nIHdpdGggb3RoZXJzKSBtb2RlcmF0ZSB0aGUgaW1wYWN0IG9mIGVtcGxveW1lbnQgaW5jb21lIGxvc3Mgb24gbWVudGFsIGhlYWx0aC4gU3BlY2lmaWNhbGx5LCBJIHByb3Bvc2UgdGhhdCBpbmRpdmlkdWFscyBsaXZpbmcgYWxvbmUgd2hvIGV4cGVyaWVuY2UgZW1wbG95bWVudCBpbmNvbWUgbG9zcyB3aWxsIGhhdmUgYSBoaWdoZXIgbGlrZWxpaG9vZCBvZiBtZW50YWwgaGVhbHRoIHByb2JsZW1zIGNvbXBhcmVkIHRvIHRob3NlIGxpdmluZyB3aXRoIG90aGVycy4NCg0KVGhlIHJhdGlvbmFsIGJlaGluZCB0aGlzIGh5cG90aGVzaXMgaXMgZ3JvdW5kZWQgaW4gdGhlIGV4dGVuc2l2ZSBsaXRlcmF0dXJlIG9uIHNvY2lhbCBzdXBwb3J0IGFuZCBtZW50YWwgaGVhbHRoLiBTb2NpYWwgc3VwcG9ydCBoYXMgYmVlbiBjb25zaXN0ZW50bHkgc2hvd24gdG8gYnVmZmVyIGFnYWluc3QgYWR2ZXJzZSBlZmZlY3RzIG9mIHN0cmVzcyBhbmQgZmluYW5jaWFsIHN0cmFpbiBvbiBtZW50YWwgaGVhbHRoIChQZUNvbmdhIGV0IGFsLiwyMDIwO0J1ZWNrZXIgJiBIb3JzdG1hbm4sIDIwMjEpLiBMaXZpbmcgd2l0aCBvdGhlcnMgbWF5IHByb3ZpZGUgbW9yZSBvcHBvcnR1bml0aWVzIGZvciBzb2NpYWwgc3VwcG9ydCwgcG90ZW50aWFsbHkgbWl0aWdhdGluZyB0aGUgbmVnYXRpdmUgaW1wYWN0IG9mIGVtcGxveW1lbnQgaW5jb21lIGxvc3Mgb24gbWVudGFsIGhlYWx0aC4gQ29udmVyc2VseSwgaW5kaXZpZHVhbHMgbGl2aW5nIGFsb25lIG1heSBleHBlcmllbmNlIGluY3JlYXNlZCBpc29sYXRpb24gYW5kIGxhY2sgb2Ygc3VwcG9ydCwgbWFraW5nIHRoZW0gbW9yZSB2dWxuZXJhYmxlIHRvIHRoZSBtZW50YWwgaGVhbHRoIGNvbnNlcXVlbmNlcyBvZiBlY29ub21pYyBoYXJkc2hpcC4gDQoNCldoaWxlIEN1aSBldCBhbC4gKDIwMjIpIHByb3ZpZGUgcm9idXN0IGV2aWRlbmNlIGxpbmtpbmcgZW1wbG95bWVudCBpbmNvbWUgbG9zcyB0byBtZW50YWwgaGVhbHRoIHByb2JsZW1zLCBvbmUgY291bGQgY291bnRlci1hcmd1ZSB0aGF0IHRoZSBzdHVkeSdzIGxhY2sgb2YgY29uc2lkZXJhdGlvbiBmb3IgbW9kZXJhdGluZyB2YXJpYWJsZXMgbGlrZSBtYXJpdGFsIHN0YXR1cyBsaW1pdHMgdGhlIGdlbmVyYWxpemF0aW9uIG9mIGl0cyBmaW5kaW5ncy4gQnkgbm90IGFjY291bnRpbmcgZm9yIHRoZSBwb3RlbnRpYWwgYnVmZmVyaW5nIGVmZmVjdHMgb2Ygc29jaWFsIHN1cHBvcnQsIHRoZSBzdHVkeSBtYXkgb3Zlcmxvb2sgaW1wb3J0YW50IG51YW5jZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVjb25vbWljIHN0cmFpbiBhbmQgbWVudGFsIGhlYWx0aC4gQWRkaXRpb25hbGx5LCB0aGUgc3R1ZHkncyByZWxpYW5jZSBvbiBzZWxmLXJlcG9ydGVkIG1lYXN1cmVzIG9mIG1lbnRhbCBoZWFsdGggYW5kIGVtcGxveW1lbnQgaW5jb21lIGxvc3MgY291bGQgaW50cm9kdWNlIGJpYXMsIGFzIHJlc3BvbmRlbnRzIG1heSB1bmRlciByZXBvcnQgb3Igb3ZlciByZXBvcnQgdGhlaXIgZXhwZXJpZW5jZXMgZHVlIHRvIHNvY2lhbCBkZXNpcmFiaWxpdHkgb3IgcmVjYWxsIGJpYXMuIA0KDQpUbyBhZGRyZXNzIHRoZXNlIG1ldGhvZG9sb2dpY2FsIGNvbmNlcm5zLCBteSByZXBsaWNhdGlvbiBwcm9qZWN0IHdpbGwgZW1wbG95IGEgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCB3aXRoIGludGVyYWN0aW9uIHRlcm1zIHRvIHRlc3QgdGhlIG1vZGVyYXRpbmcgZWZmZWN0cyBvZiBsaXZpbmcgYXJyYW5nZW1lbnRzIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBlbXBsb3ltZW50IGluY29tZSBsb3NzIGFuZCBtZW50YWwgaGVhbHRoLiBCeSBpbmNsdWRpbmcgY29udHJvbCB2YXJpYWJsZXMgc3VjaCBhcyBlZHVjYXRpb24gbGV2ZWwsIGFuZCByYWNlL2V0aG5pY2l0eSwgSSBhaW0gdG8gYWNjb3VudCBmb3IgcG90ZW50aWFsIGNvbmZvdW5kaW5nIGZhY3RvcnMgdGhhdCBjb3VsZCBpbmZsdWVuY2UgbWVudGFsIGhlYWx0aCBvdXRjb21lcy4gDQoNCkFjY29yZGluZyB0byBGcmVlc2UgYW5kIFBldGVyc29uICgyMDE3KSwgdGhlcmUgYXJlIGZvdXIgdHlwZXMgb2YgcmVwbGljYXRpb25zOiBleGFjdCByZXBsaWNhdGlvbnMsIGNvbmNlcHR1YWwgcmVwbGljYXRpb25zLCBtZWFzdXJlbWVudCByZXBsaWNhdGlvbnMsIGFuZCBzaW1wbGUgcmVwbGljYXRpb25zLiBUaGlzIHByb2plY3QgaXMgYSBjb25jZXB0dWFsIHJlcGxpY2F0aW9uLCBhcyBpdCB0ZXN0cyB0aGUgcm9idXN0bmVzcyBvZiB0aGUgb3JpZ2luYWwgZmluZGluZ3MgYnkgaW50cm9kdWNpbmcgbmV3IG1vZGVyYXRpbmcgdmFyaWFibGUgKG1hcml0YWwgc3RhdHVzKSBhbmQgZXh0ZW5kaW5nIHRoZSBhbmFseXNpcyB0byBleGFtaW5lIHRoZSBkaWZmZXJlbnRpYWwgaW1wYWN0IG9mIGVtcGxveW1lbnQgaW5jb21lIGxvc3Mgb24gbWVudGFsIGhlYWx0aCBiYXNlZCBvbiBsaXZpbmcgc3RhdHVzLg0KDQpJIGV4cGVjdCB0aGUgcmVzdWx0cyB0byBjb25maXJtIHRoZSBkaXJlY3QgcmVsYXRpb25zaGlwIGJldHdlZW4gZW1wbG95bWVudCBpbmNvbWUgbG9zcyBhbmQgbWVudGFsIGhlYWx0aCBwcm9ibGVtcyBmb3VuZCBieSBDdWkgZXQgYWwuICgyMDIyKS4gSG93ZXZlciwgSSBhbHNvIGFudGljaXBhdGUgdGhhdCB0aGlzIHJlbGF0aW9uc2hpcCB3aWxsIGJlIG1vZGVyYXRlZCBieSBtYXJ0aWFsIHN0YXR1cywgd2l0aCBhIHN0cm9uZ2VyIG5lZ2F0aXZlIGltcGFjdCBvbiBtZW50YWwgaGVhbHRoIGZvciBpbmRpdmlkdWFscyBsaXZpbmcgYWxvbmUuIFRoaXMgaHlwb3RoZXNpcyBpcyBzdXBwb3J0ZWQgYnkgcmVjZW50IHJlc2VhcmNoIGVtcGhhc2l6aW5nIHRoZSBjcml0aWNhbCByb2xlIG9mIHNvY2lhbCBzdXBwb3J0IGluIG1pdGlnYXRpbmcgdGhlIG5lZ2F0aXZlIGVmZmVjdHMgb2YgZmluYW5jaWFsIHN0cmFpbiBvbiBtZW50YWwgaGVhbHRoIChDaGluIGV0IGFsLiwgMjAyMzsgU3prb2R5IGV0IGFsLiwgMjAyMSwgMjAyMDsgQXJnYWJyaWdodCBldCBhbC4sIDIwMjIpLg0KDQpJbiBhbGwsIHRoaXMgcmVwbGljYXRpb24gcHJvamVjdCBhaW1zIHRvIGV4dGVuZCB0aGUgZmluZGluZ3Mgb2YgQ3VpIGV0IGFsLiAoMjAyMikgYnkgZXhwbG9yaW5nIHRoZSBtb2RlcmF0aW5nIGVmZmVjdCBvZiBtYXJpdGFsIHN0YXR1cyBvbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZW1wbG95bWVudCBpbmNvbWUgbG9zcyBhbmQgbWVudGFsIGhlYWx0aCBkdXJpbmcgdGhlIENPVklELTE5IHBhbmRlbWljLiBCeSBpbmNvcnBvcmF0aW5nIHRoZSBjb25jZXB0IG9mIHNvY2lhbCBzdXBwb3J0LCB0aGlzIHN0dWR5IHNlZWtzIHRvIHByb3ZpZGUgYSBtb3JlIG51YW5jZWQgdW5kZXJzdGFuZGluZyBvZiB0aGUgZmFjdG9ycyBpbmZsdWVuY2luZyBtZW50YWwgaGVhbHRoIGR1cmluZyBlY29ub21pYyBoYXJkc2hpcCwgdGhlcmVieSBjb250cmlidXRpbmcgdmFsdWFibGUgaW5zaWdodHMgdG8gdGhlIGJyb2FkZXIgbGl0ZXJhdHVyZSBvbiBtZW50YWwgaGVhbHRoIGFuZCBwYW5kZW1pYy1yZWxhdGVkIHN0cmVzcy4gDQoNCiMjIDIuIERhdGEgYW5kIG1ldGhvZHMNCg0KIyMjIDIuMS4gRGF0YQ0KDQpUaGUgb3JpZ2luYWwgc3R1ZHkgdXNlZCBkYXRhIGZyb20gdGhlIFB1YmxpYyBVc2UgRmlsZXMgKFBVRikgb2YgdGhlIEhvdXNlaG9sZCBQdWxzZSBTdXJ2ZXksIGNvbmR1Y3RlZCBieSB0aGUgVW5pdGVkIFN0YXRlcyBDZW5zdXMgQnVyZWF1IG92ZXIgYSAxMi13ZWVrIHBlcmlvZCBkdXJpbmcgdGhlIENPVklELTE5IHBhbmRlbWljIGluIDIwMjAuIFRoZSBzdHVkeSBwb3B1bGF0aW9uIGNvbnNpc3RzIG9mIGluZGl2aWR1YWxzIGZyb20gZGl2ZXJzZSBiYWNrZ3JvdW5kcyBhbmQgcmVnaW9ucyBhY3Jvc3MgdGhlIGNvdW50cnkuIFBhcnRpY2lwYW50cyByYW5nZSBmcm9tIDE4IHRvIDg4IHllYXJzIG9sZCwgZW5jb21wYXNzaW5nIGEgY29tcHJlaGVuc2l2ZSBhcnJheSBvZiBvdGhlciBkZW1vZ3JhcGhpYyBhbmQgaGVhbHRoLXJlbGF0ZWQgdmFyaWFibGVzLiBGb3IgdGhlIGFuYWx5c2lzLCB0aGUgcmVzZWFyY2hlcnMgaW5jbHVkZWQgdmFyaWFibGVzIHN1Y2ggYXMgbWVudGFsIGhlYWx0aCBzdGF0dXMsIGVtcGxveW1lbnQgaW5jb21lIGxvc3MsIG1hcml0YWwgc3RhdHVzLCByYWNlLmV0aG5pY2l0eSwgZWR1Y2F0aW9uIGxldmVsLCBhZ2UsIGdlbmRlciwgYW5kIHN0YXRlLXNwZWNpZmljIHBhbmRlbWljIGNvbmRpdGlvbnMuIA0KDQpUaGlzIGV4dGVuc2lvbiBwcm9qZWN0IGVtcGxveXMgdGhlIHNhbWUgSG91c2Vob2xkIFB1bHNlIFN1cnZleSBkYXRhLCBmb2N1c2luZyBvbiAxIHdlZWsgdGltZSBmcmFtZSBkdXJpbmcgdGhlIENPVklELTE5IHBhbmRlbWljIGluIDIwMjAuIFRoZSBkYXRhIHNvdXJjZSByZW1haW5lZCB0aGUgVW5pdGVkIFN0YXRlcyBDZW5zdXMgQnVyZWF1LiBGb3IgZm9yIG1hbmFnZWFiaWxpdHksIEkgdXNlZCBhIHNhbXBsZWQgc3Vic2V0IGNvbXByaXNpbmcgYXBwcm94aW1hdGVseSA3NCw0MTMgcmVzcG9uZGVudHMuIFRoZSB2YXJpYWJsZXMgc2VsZWN0ZWQgZm9yIHRoaXMgYW5hbHlzaXMgaW5jbHVkZSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChtZW50YWwgaGVhbHRoKSwgdGhlIHByaW1hcnkgaW5kZXBlbmRlbnQgdmFyaWFibGUgKGVtcGxveW1lbnQgaW5jb21lIGxvc3MsIGRlbm90ZWQgYXMgV3JrbG9zcyksIGFuZCBtYXJpdGFsIHN0YXR1cyAoZGVub3RlZCBhcyBNUykuIEFkZGl0aW9uYWxseSwgSSBpbmNsdWRlZCBjb250cm9sIHZhcmlhYmxlcyBzdWNoIGFzIHJhY2UsIGFuZCBlZHVjYXRpb24gbGV2ZWwsIHRvIGFjY291bnQgZm9yIHBvdGVudGlhbCBjb25mb3VuZGluZyBlZmZlY3RzLiANCg0KIyMjIERhdGEgUHJlcGFyYXRpb24gDQpgYGB7ciBSZWFkIHRoZSBkYXRhIGZpbGV9DQpkYXRhIDwtIHJlYWQuY3N2KCJwdWxzZTIwMjBfcHVmXzAxLmNzdiIpDQoNCiMgU2VsZWN0aW5nIHZhcmlhYmxlcyBvZiBpbnRlcmVzdA0KZGF0YSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoV1JLTE9TUywgTVMsIEVFRFVDLCBSUkFDRSwgQU5YSU9VUywgV09SUlksIElOVEVSRVNULCBET1dOKQ0KDQojIENyZWF0ZSBiaW5hcnkgbWVudGFsIGhlYWx0aCB2YXJpYWJsZQ0KZGF0YSA8LSBkYXRhICU+JQ0KICBtdXRhdGUoTWVudGFsSGVhbHRoID0gaWZlbHNlKEFOWElPVVMgPj0gMyB8IFdPUlJZID49IDMgfCBJTlRFUkVTVCA+PSAzIHwgRE9XTiA+PSAzLCAxLCAwKSkNCg0KZGF0YSRNUyA8LSBmYWN0b3IoZGF0YSRNUywgbGV2ZWxzID0gYygxLCAyLCAzLCA0LCA1KSwgbGFiZWxzID0gYygiTm93IE1hcnJpZWQiLCAiV2lkb3dlZCIsICJEaXZvcmNlZCIsICJTZXBhcmF0ZWQiLCAiTmV2ZXIgTWFycmllZCIpKQ0KDQojIFJlbW92ZSByb3dzIHdpdGggbmVnYXRpdmUgdmFsdWVzIGluIGtleSB2YXJpYWJsZXMNCmRhdGFfbmV3IDwtIGRhdGEgJT4lDQogIGZpbHRlcihNZW50YWxIZWFsdGggPj0gMCwNCiAgICAgICAgIFdSS0xPU1MgJWluJSAxOjIsDQogICAgICAgICBNUyAlaW4lDQogICAgICAgICAgIGMoIk5vdyBNYXJyaWVkIiwgIldpZG93ZWQiLCAiRGl2b3JjZWQiLCAiU2VwYXJhdGVkIiwgIk5ldmVyIE1hcnJpZWQiKSwNCiAgICAgICAgIEVFRFVDID49IDAsDQogICAgICAgICBSUkFDRSA+PSAwKQ0KIyBDb252ZXJ0IEtleSB2YXJpYWJsZXMgdG8gZmFjdG9ycw0KZGF0YV9uZXckZWR1Y2F0aW9uIDwtIGZhY3RvcihkYXRhX25ldyRFRURVQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gMTo0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMZXNzIHRoYW4gSGlnaCBTY2hvb2wiLCAiSGlnaCBTY2hvb2wiLCAiQmFjaGVsb3IncyBEZWdyZWUiLCAiR3JhZHVhdGUgRGVncmVlIikpDQoNCmRhdGFfbmV3JHJhY2UgPC0gZmFjdG9yKGRhdGFfbmV3JFJSQUNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gMTo0LA0KICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiV2hpdGUiLCAiQmxhY2siLCAiQXNpYW4iLCAiT3RoZXJzIikpDQoNCmRhdGFfbmV3JGVtcGxveW1lbnRfaW5jb21lX2xvc3MgPC0gZmFjdG9yKGRhdGFfbmV3JFdSS0xPU1MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDEsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJZZXMiLCAiTm8iKSkNCg0KZGF0YSRNUyA8LSBmYWN0b3IoZGF0YSRNUywgbGV2ZWxzID0gYygxLCAyLCAzLCA0LCA1KSwgbGFiZWxzID0gYygiTm93IE1hcnJpZWQiLCAiV2lkb3dlZCIsICJEaXZvcmNlZCIsICJTZXBhcmF0ZWQiLCAiTmV2ZXIgTWFycmllZCIpKQ0KDQojIENyZWF0ZSBhIGJpbmFyeSB2YXJpYWJsZSBmb3IgbGl2aW5nIGFsb25lIG9yIHdpdGggb3RoZXJzDQpkYXRhX25ldyRsaXZpbmdfc3RhdHVzIDwtIGlmZWxzZShkYXRhX25ldyRNUyAlaW4lIGMoIldpZG93ZWQiLCAiRGl2b3JjZWQiLCAiU2VwYXJhdGVkIiwgIk5ldmVyIE1hcnJpZWQiKSwgIkFsb25lIiwgIldpdGggT3RoZXJzIikNCg0KZGF0YV9uZXckbGl2aW5nX3N0YXR1cyA8LSBmYWN0b3IoZGF0YV9uZXckbGl2aW5nX3N0YXR1cywgbGV2ZWxzID0gYygiQWxvbmUiLCAiV2l0aCBPdGhlcnMiKSkNCg0KIyBSZW1vdmluZyBOQXMNCmRhdGFfbmV3IDwtIG5hLm9taXQoZGF0YV9uZXcpDQoNCmBgYA0KDQpgYGB7cn0NCiMgQmFyIGNoYXJ0cyBmb3IgY2F0ZWdvcmljYWwgdmFyaWFibGVzDQojIEVtcGxveW1lbnQgaW5jb21lIGxvc3MgZGlzdHJpYnV0aW9uDQpnZ3Bsb3QoZGF0YV9uZXcsIGFlcyh4ID0gZW1wbG95bWVudF9pbmNvbWVfbG9zcykpICsNCiAgZ2VvbV9iYXIoYWVzKHkgPSAuLnByb3AuLiwgZ3JvdXAgPSAxKSwgZmlsbCA9ICJwbHVtMyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBFbXBsb3ltZW50IEluY29tZSBMb3NzIiwgeSA9ICJQZXJjZW50YWdlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBNYXJpdGFsICBzdGF0dXMgZGlzdHJpYnV0aW9uDQpnZ3Bsb3QoZGF0YV9uZXcsIGFlcyh4ID0gTVMpKSArDQogIGdlb21fYmFyKGFlcyh5ID0gLi5wcm9wLi4sIGdyb3VwID0gMSksDQogICAgICAgICAgIGZpbGwgPSAiU2t5Ymx1ZSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBNYXJpdGFsIFN0YXR1cyIsIHggPSAiTWFyaXRhbCBTdGF0dXMiLCB5ID0gIlBlcmNlbnRhZ2UiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIEVkdWNhdGlvbiBkaXN0cmlidXRpb24NCmdncGxvdChkYXRhX25ldywgYWVzKHggPSBlZHVjYXRpb24pKSArDQogIGdlb21fYmFyKGFlcyh5ID0gLi5wcm9wLi4sIGdyb3VwID0gMSksIGZpbGwgPSAiY29yYWwiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgRWR1Y2F0aW9uIExldmVscyIsIHggPSAiRWR1Y2F0aW9uIiwgeSA9ICJQZXJjZW50YWdlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBSYWNlIGRpc3RyaWJ1dGlvbg0KZ2dwbG90KGRhdGFfbmV3LCBhZXMoeCA9IHJhY2UpKSArDQogIGdlb21fYmFyKGFlcyh5ID0gLi5wcm9wLi4sIGdyb3VwID0gMSksIGZpbGwgPSAiZGFya21hZ2VudGEiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgUmFjZSIsIHggPSAiUmFjZSIsIHkgPSAiUGVyY2VudGFnZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgTWVudGFsIGhlYWx0aCBkaXN0cmlidXRpb24gDQpnZ3Bsb3QoZGF0YV9uZXcsIGFlcyh4ID0gTWVudGFsSGVhbHRoKSkgKw0KICBnZW9tX2JhcihhZXMoeSA9IC4ucHJvcC4uLCBncm91cCA9IDEpLCBmaWxsID0gImJ1cmx5d29vZCIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTWVudGFsIEhlYWx0aCBTdGF0dXMiLCB4ID0gIk1lbnRhbCBIZWFsdGggKEJpbmFyeSIsIHkgPSAiUGVyY2VudGFnZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQojIyMgMi4yLiBNZXRob2RzDQoNCkluIHRoZSBvcmlnaW5hbCBwYXBlciwgdGhlIHJlc2VhcmNoZXJzIGVtcGxveWVkIG11bHRpcGxlIGltcHV0YXRpb24gYnkgY2hhaW5lZCBlcXVhdGlvbnMgKE1JQ0UpIHRvIGhhbmRsZSBtaXNzaW5nIGRhdGEsIGVuc3VyaW5nIHJvYnVzdCBhbmQgdW5iaWFzZWQgZXN0aW1hdGVzIGJ5IGNyZWF0aW5nIG11bHRpcGxlIGNvbXBsZXRlIGRhdGFzZXRzIGFuZCBhdmVyYWdpbmcgdGhlIHJlc3VsdHMuIFRoaXMgYXBwcm9hY2ggYWNjb3VudHMgZm9yIHRoZSB1bmNlcnRhaW50eSBhcm91bmQgbWlzc2luZyB2YWx1ZXMuIEZvciB0aGUgYW5hbHlzaXMsIHRoZXkgdXNlZCBsb2dpc3RpYyByZWdyZXNzaW9uIHdpdGggdGhlIGxlYXN0IGFic29sdXRlIHNocmlua2FnZSBhbmQgc2VsZWN0aW9uIG9wZXJhdG9yIChMYXNzbykgbWV0aG9kLiBMYXNzbyBoZWxwcyBpbiB2YXJpYWJsZSBzZWxlY3Rpb24gYW5kIHJlZ3VsYXJpemF0aW9uLCBlbmhhbmNpbmcgbW9kZWwgcHJlZGljdGlvbiBhY2N1cmFjeSBieSBzaHJpbmtpbmcgdGhlIGxlc3MgaW1wb3J0YW50IGNvZWZmaWNpZW50cyB0byB6ZXJvLCB0aGVyZWJ5IGFkZHJlc3NpbmcgcG90ZW50aWFsIG11bHRpY29sbGluZWFyaXR5IGFuZCBvdmVyIGZpdHRpbmcgaXNzdWVzLg0KDQpJbiBjb250cmFzdCwgZm9yIG15IHByb2plY3QsIEkgd2lsbCB1dGlsaXplIHJlZ3Jlc3Npb24gd2l0aCBpbnRlcmFjdGlvbiB0ZXJtcyB3aXRob3V0IExhc3NvIHJlZ3VsYXJpemF0aW9uLiBJIGNob3NlIHRoaXMgbWV0aG9kIHRvIGRpcmVjdGx5IGFzc2VzcyB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBlbXBsb3ltZW50IGluY29tZSBsb3NzIGFuZCBtYXJpdGFsIHN0YXR1c2VzIG9uIG1lbnRhbCBoZWFsdGggb3V0Y29tZXMuIFRoaXMgYXBwcm9hY2ggd2lsbCBhbGxvdyBtZSB0byBleHBsaWNpdGx5IHRlc3QgbXkgaHlwb3RoZXNpcyBhYm91dCB3aGV0aGVyIHRoZSBpbXBhY3Qgb2YgaW5jb21lIGxvc3Mgb24gbWVudGFsIGhlYWx0aCB2YXJpZXMgYmV0d2VlbiBpbmRpdmlkdWFscyBsaXZpbmcgYWxvbmUgYW5kIHRob3NlIGxpdmluZyB3aXRoIG90aGVycy4gSSBpbmNsdWRlZCBpbnRlcmFjdGlvbiB0ZXJtcyBiZXR3ZWVuIGVtcGxveW1lbnQgaW5jb21lIGxvc3MgYW5kIG1hcml0YWwgc3RhdHVzLCB1c2luZyBkdW1teSB2YXJpYWJsZXMgZm9yIGRpZmZlcmVudCBtYXJpdGFsIHN0YXR1c2VzIChXaWRvd2VkLCBEaXZvcmNlZCwgU2VwYXJhdGVkLCBOZXZlciBtYXJyaWVzKS4NCg0KSSBtYWludGFpbmVkIHRoZSBjb250cm9sIHZhcmlhYmxlcyAoZ2VuZGVyLCBlZHVjYXRpb24gbGV2ZWwsIHJhY2UvZXRobmljaXR5KSB0byBhY2NvdW50IGZvciBwb3RlbnRpYWwgY29uZm91bmRpbmcgZmFjdG9ycywgZW5zdXJpbmcgbXkgZmluZGluZ3MgYXJlIG5vdCBiaWFzZWQgYnkgdGhlc2UgZGVtb2dyYXBoaWMgZGlmZmVyZW5jZXMuIERpYWdub3N0aWMgY2hlY2tzIGFyZSBwZXJmb3JtZWQgdG8gZW5zdXJlIG5vIG11bHRpY29sbGluZWFyaXR5IGlzc3VlcyBhbmQgYXBwcm9wcmlhdGUgbW9kZWwgZml0LiBJIG9wdGVkIGFnYWluc3QgTGFzc28gZHVlIHRvIG15IHNwZWNpZmljIGZvY3VzIG9uIGludGVyYWN0aW9uIGVmZmVjdHMsIGFuZCB0aGUgc2FtcGxlIHNpemUgd2FzIHN1ZmZpY2llbnQgdG8gYXZvaWQgb3ZlciBmaXR0aW5nIGNvbmNlcm5zIHR5cGljYWxseSBhZGRyZXNzZWQgYnkgTGFzc28uIExpdGVyYXR1cmUgc3VwcG9ydHMgdGhpcyBhcHByb2FjaCBmb3IgaHlwb3RoZXNpcyB0ZXN0aW5nIHdoZXJlIGludGVyYWN0aW9uIHRlcm1zIGFyZSBjZW50cmFsIHRvIHRoZSByZXNlYXJjaCBxdWVzdGlvbiAoQWlrZW4gJiBXZXN0LCAxOTkxKS4NCg0KVGhpcyBzdHJhdGVneSBhbGxvd3MgYSBtb3JlIHN0cmFpZ2h0Zm9yd2FyZCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgaW50ZXJhY3Rpb24gZWZmZWN0cywgcHJvdmlkaW5nIGNsZWFyIGluc2lnaHRzIGludG8gaG93IGluY29tZSBsb3NzIGltcGFjdHMgbWVudGFsIGhlYWx0aCBhY3Jvc3MgZGlmZmVyZW50IGxpdmluZyBhcnJhbmdlbWVudHMgZHVyaW5nIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYy4gDQoNCiMjIDMuIFJlc3VsdHMNCg0KYGBge3J9DQojIEZpdCBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsDQptb2RlbF9vcmlnaW5hbCA8LSBnbG0oTWVudGFsSGVhbHRoIH4gTVMgKyBlZHVjYXRpb24gKyByYWNlLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhX25ldywgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsX29yaWdpbmFsKQ0KDQojIENyZWF0ZSBhIGNvbXBhcmF0aXZlIHRhYmxlIG9mIHRoZSBtb2RlbCByZXN1bHRzDQpzdGFyZ2F6ZXIobW9kZWxfb3JpZ2luYWwsIHR5cGUgPSAidGV4dCIsDQogICAgICAgICAgdGl0bGUgPSAiTG9naXN0aWMgUmVncmVzc2lvbiBSZXN1bHRzIiwNCiAgICAgICAgICBkZXAudmFyLmxhYmVscyA9ICJNZW50YWwgSGVhbHRoIiwNCiAgICAgICAgICBjb3ZhcmlhdGUubGFiZWxzID0gYygiRW1wbG95bWVudCBJbmNvbWUgTG9zcyAoWWVzKSIsIkVtcGxveW1lbnQgSW5jb21lIExvc3MgKE5vKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpZG93ZWQiLCAiRGl2b3JjZWQiLCAiU2VwYXJhdGVkIiwgIk5ldmVyIE1hcnJpZWQiLCAiTGVzcyB0aGFuIEhpZ2ggc2Nob29sIiwgIkhpZ2ggU2Nob29sIiwgIkJhY2hlbG9yJ3MgRGVncmVlIiwgIkdyYWR1YXRlIERlZ3JlZSIsICJXaGl0ZSIsICJCbGFjayIsICJBc2lhbiIsICJPdGhlcnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbXBsb3ltZW50IEluY29tZSBMb3NzIChZZXMpOldpZG93ZWQiLCAiRW1wbG95bWVudCBJbmNvbWUgTG9zcyAoWWVzKTpEaXZvcmNlZCIsICJFbXBsb3ltZW50IEluY29tZSBMb3NzIChZZXMpOlNlcGFyYXRlZCIsICJFbXBsb3ltZW50IEluY29tZSBMb3NzIChZZXMpOk5ldmVyIE1hcnJpZWQiKSwNCiAgICAgICAgICBjaSA9IFRSVUUsIGNpLmxldmVsID0gMC45NSwNCiAgICAgICAgICBzaW5nbGUucm93ID0gVFJVRSkNCmBgYA0KDQoNCk1vZGVsIDEgZXhhbWluZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1lbnRhbCBoZWFsdGggYW5kIHZhcmlvdXMgcHJlZGljdG9ycyBpbmNsdWRpbmcgbWFyaXRhbCBzdGF0dXMsIGVkdWNhdGlvbiBhbmQgcmFjZS4NCg0KIC0qTWFyaXRhbCBTdGF0dXMqOiANCiAgICAgICAgICAtIFdpZG93ZWQgaW5kaXZpZHVhbHMgaGF2ZSBzaWduaWZpY2FudGx5IGxvd2VyIG9kZHMgb2YgZXhwZXJpZW5jaW5nIG1lbnRhbCBoZWFsdGggaXNzdWVzIGNvbXBhcmVkIHRvIG1hcnJpZWQgaW5kaXZpZHVhbHMgKEVzdGltYXRlOiAtMC4yMjQsIHAgPCAwLjAwMSkuDQogICAgICAgICAgLSBEaXZvcmNlZCAoRXN0aW1hdGU6IDAuMzg5LCBwIDwgMC4wMDEpLCBzZXBhcmF0ZWQgKEVzdGltYXRlOiAwLjczOCwgcCA8IDAuMDAxKSwgYW5kIG5ldmVyIG1hcnJpZWQgaW5kaXZpZHVhbHMgKEVzdGltYXRlOiAwLjUyNSwgcCA8IDAuMDAxKSBzaG93IGhpZ2hlciBvZGRzIG9mIG1lbnRhbCBoZWFsdGggcHJvYmxlbXMsIHN1Z2dlc3RpbmcgdGhlc2UgZ3JvdXBzIGFyZSBtb3JlIHZ1bG5lcmFibGUuDQogDQogLSpFZHVjYXRpb24qOiBUaG9zZSB3aXRoIGEgQmFjaGVsb3IncyBkZWdyZWUgKEVzdGltYXRlOiAtMC4yNzUsIHAgPCAwLjA1KSBhbmQgYSBHcmFkdWF0ZSBkZWdyZWUgKEVzdGltYXRlOiAtMC4yMzYsIHAgPCAwLjA1KSBhcmUgbGVzcyBsaWtlbHkgdG8gcmVwb3J0IG1lbnRhbCBoZWFsdGggcHJvYmxlbXMgY29tcGFyZWQgdG8gaW5kaXZpZHVhbHMgd2l0aCBsZXNzIHRoYW4gYSBoaWdoIHNjaG9vbCBlZHVjYXRpb24uIEhvd2V2ZXIsIGhhdmluZyBvbmx5IGEgaGlnaCBzY2hvb2wgZGlwbG9tYSBkb2VzIG5vdCBzaG93IGEgc2lnbmlmaWNhbnQgaW1wYWN0IChwID0gMC42NDQpLg0KIA0KIC0qUmFjZSo6IFRoZSAnT3RoZXJzJyByYWNpYWwgY2F0ZWdvcnkgaXMgc2lnbmlmaWNhbnRseSBhc3NvY2lhdGVkIHdpdGggaGlnaGVyIG9kZHMgb2YgbWVudGFsIGhlYWx0aCBpc3N1ZXMgY29tcGFyZWQgdG8gV2hpdGUgaW5kaXZpZHVhbHMgKEVzdGltYXRlOiAwLjIzNCwgcCA8IDAuMDAxKS4gSG93ZXZlciwgQmxhY2sgKHAgPSAwLjUyOSkgYW5kIEFzaWFuIChwID0gMC4yMjYpIHJhY2VzIGRvIG5vdCBzaG93IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGZyb20gV2hpdGVzLg0KDQpgYGB7cn0NCiMgRml0IGxvZ2lzdGljIHJlZ3Jlc3Npb24gbW9kZWwgd2l0aCBpbnRlcmFjdGlvbiB0ZXJtcw0KDQptb2RlbDIgPC0gZ2xtKE1lbnRhbEhlYWx0aCB+IGVtcGxveW1lbnRfaW5jb21lX2xvc3MgKiBsaXZpbmdfc3RhdHVzICsgZWR1Y2F0aW9uICsgUlJBQ0UsDQogICAgICAgICAgICAgIGRhdGEgPSBkYXRhX25ldywNCiAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsMikNCg0KIyBDcmVhdGUgY29tcGFyYXRpdmUgdGFibGUgb2YgdGhlIG1vZGVsIHJlc3VsdHMNCnN0YXJnYXplcihtb2RlbDIsIHR5cGUgPSAidGV4dCIsDQogICAgICAgICAgdGl0bGUgPSAiTG9naXN0aWMgUmVncmVzc2lvbiBSZXN1bHRzMiIsDQogICAgICAgICAgZGVwLnZhci5sYWJlbHMgPSAiTWVudGFsIEhlYWx0aCIsDQogICAgICAgICAgY292YXJpYXRlLmxhYmVscyA9IGMoIkVtcGxveW1lbnQgSW5jb21lIExvc3MgKFllcykiLCAiTGl2aW5nIEFsb25lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGVzcyB0aGFuIEhpZ2ggU2Nob29sIiwgIkJhY2hlbG9yJ3MgRGVncmVlIiwgIkdyYWR1YXRlIERlZ3JlZSIsICJXaGl0ZSIsICJCbGFjayIsICJBc2lhbiIsICJPdGhlcnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbXBsb3ltZW50IEluY29tZSBMb3NzIChZZXMpOkxpdmluZyBBbG9uZSIpLA0KICAgICAgICAgIGNpID0gVFJVRSwgY2kubGV2ZWwgPSAwLjk1LA0KICAgICAgICAgIHNpbmdsZS5yb3cgPSBUUlVFKQ0KDQojIENyZWF0ZSBpbnRlcmFjdGlvbiBwbG90DQppbnRlcmFjdGlvbl9wbG90IDwtIGNhdF9wbG90KG1vZGVsMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkID0gZW1wbG95bWVudF9pbmNvbWVfbG9zcywgbW9keCA9IGxpdmluZ19zdGF0dXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5wb2ludHMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluLnRpdGxlID0gIkludGVyYWN0aW9uIGJldHdlZW4gRW1wbG95bWVudCBJbmNvbWUgTG9zcyBhbmQgTGl2aW5nIFN0YXR1cyBvbiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudGFsIEhlYWx0aCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5sYWJlbCA9ICJFbXBsb3ltZW50IEluY29tZSBMb3NzIiwgeS5sYWJlbCA9ICJQcmVkaWN0ZWQgUHJvYmFiaWxpdHkgb2YgTWVudGFsIEhlYWx0aCBJc3N1ZXMiKQ0KDQpwcmludChpbnRlcmFjdGlvbl9wbG90KQ0KYGBgDQoNCmBgYHtyfQ0KIyBDcmVhdGUgYSBjb21wYXJhdGl2ZSB0YWJsZSBvZiB0aGUgbW9kZWwgcmVzdWx0cw0KdGFiX21vZGVsKG1vZGVsMiwNCiAgICAgICAgICB0aXRsZSA9ICJMb2dpc3RpYyBSZWdyZXNzaW9uIFJlc3VsdHMiLA0KICAgICAgICAgIGR2LmxhYmVscyA9ICJNZW50YWwgSGVhdGgiLA0KICAgICAgICAgIHByZWQubGFiZWxzID0gYygiRW1wbG95bWVudCBJbmNvbWUgTG9zcyAoWWVzKSIsICJMaXZpbmcgQWxvbmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiTGVzcyB0aGFuIEhpZ2ggU2Nob29sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkhpZ2ggU2Nob29sIiwgIkJhY2hlbG9yJ3MgRGVncmVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkdyYWR1YXRlIERlZ3JlZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJXaGl0ZSIsICJCbGFjayIsICJBc2lhbiIsICJPdGhlcnMiLCAiRW1wbG95bWVudCBJbmNvbWUgTG9zcyAoWWVzKTpMaXZpbmcgQWxvbmUiKSwNCiAgICAgICAgICBzaG93LmNpID0gVFJVRSwNCiAgICAgICAgICBzaG93LnAgPSBUUlVFLA0KICAgICAgICAgIHNob3cuc2UgPSBUUlVFKQ0KYGBgDQoNCg0KDQoqKk1vZGVsIDI6KiogVGhpcyBtb2RlbCBhZGRzIGludGVyYWN0aW9uIHRlcm1zIGJldHdlZW4gZW1wbG95bWVudCBpbmNvbWUgbG9zcyBhbmQgbGl2aW5nIHN0YXR1cyBhbmQgTWVudGFsIEhlYWx0aC4NCg0KMS4gKipFbXBsb3ltZW50IEluY29tZSBMb3NzOioqIEFzIGV4cGVjdGVkLCBleHBlcmllbmNpbmcgZW1wbG95bWVudCBpbmNvbWUgbG9zcyB3YXMgYXNzb2NpYXRlZCB3aXRoIGhpZ2hlciBvZGRzIG9mIG1lbnRhbCBoZWFsdGggcHJvYmxlbXMuIEluZGl2aWR1YWxzIHdpdGhvdXQgZW1wbG95bWVudCBpbmNvbWUgbG9zcyBoYXZlIHNpZ25pZmljYW50bHkgbG93ZXIgb2RkcyBvZiBleHBlcmllbmNpbmcgbWVudGFsIGhlYWx0aCBpc3N1ZXMgY29tcGFyZWQgdG8gdGhvc2Ugd2l0aCBpbmNvbWUgbG9zcyAoRXN0aW1hdGU6IC0wLjU0OSwgcCA8IDAuMDAxKS4NCg0KMi4gKipMaXZpbmcgU3RhdHVzOioqIEludGVyZXN0aW5nbHksIGxpdmluZyB3aXRoIG90aGVycyBhbmQgbm90IGV4cGVyaWVuY2luZyBlbXBsb3ltZW50IGluY29tZSBsb3NzIHdlcmUgYXNzb2NpYXRlZCB3aXRoIGxvd2VyIG9kZHMgb2YgbWVudGFsIGhlYWx0aCBpc3N1ZXMgKEVzdGltYXRlOiAtMC4zMzEsIHAgPCAwLjAwMSkgY29tcGFyZWQgdG8gbGl2aW5nIGFsb25lLiANCg0KMy4gKipFZHVjYXRlOioqIFNpbWlsYXIgdG8gTW9kZWwgMSAoTW9kZWxfb3JpZ2luYWwpLCBhIEJhY2hlbG9yJ3MgZGVncmVlIChFc3RpbWF0ZTogLTAuMjU3LCBwIDwgMC4wNSkgaXMgYXNzb2NpYXRlZCB3aXRoIGxvd2VyIG9kZHMgb2YgbWVudGFsIGhlYWx0aCBwcm9ibGVtcy4gQSBHcmFkdWF0ZSBkZWdyZWUgc2hvd3MgYSBtYXJnaW5hbGx5IHNpZ25pZmljYW50IHJlZHVjdGlvbiBpbiBvZGRzIChFc3RpbWF0ZTogLTAuMjEwLCBwID0gMC4wNTIpLCB3aGlsZSBhIGhpZ2ggc2Nob29sIGRpcGxvbWEgZG9lcyBub3QgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdCAocCA9IDAuNzU5KS4gDQoNCjQuICoqUmFjZToqKiBUaGUgcmFjZSB2YXJpYWJsZSBzaG93cyBhIHNtYWxsIGJ1dCBzaWduaWZpY2FudCBlZmZlY3QsIGluZGljYXRpbmcgc2xpZ2h0IGRpZmZlcmVuY2VzIGluIG1lbnRhbCBoZWFsdGggb2RkcyBhbW9uZyByYWNpYWwgZ3JvdXBzIChFc3RpbWF0ZTogMC4wNTQsIHAgPCAwLjAwMSkuDQoNCg0KNS4gKipJbnRlcmFjdGlvbiBFZmZlY3RzOioqIFRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGVtcGxveW1lbnQgaW5jb21lIGxvc3MgYW5kIGxpdmluZyB3aXRoIG90aGVycyBzaWduaWZpY2FudGx5IHJlZHVjZXMgdGhlIG9kZHMgb2YgbWVudGFsIGhlYWx0aCBwcm9ibGVtcyAoRXN0aW1hdGU6IC0wLjEyNiwgcCA8IDAuMDUpLiBUaGlzIGludGVyYWN0aW9uIHN1Z2dlc3RzIHRoYXQgdGhlIGJlbmVmaXRzIG9mIGxpdmluZyB3aXRoIG90aGVycyBhcmUgcGFydGljdWxhcmx5IHByb25vdW5jZWQgZm9yIHRob3NlIG5vdCBmYWNpbmcgZmluYW5jaWFsIHN0cmVzcyBkdWUgdG8gZW1wbG95bWVudCBpbmNvbWUgbG9zcy4gDQoNCiMjIyMgSW50ZXJwcmV0YXRpb24gb2YgUmVzdWx0cw0KDQoxLiAqKkVtcGxveW1lbnQgSW5jb21lIExvc3MgYW5kIE1lbnRhbCBIZWFsdGgqKjogVGhlIGZpbmRpbmcgdGhhdCBlbXBsb3ltZW50IGluY29tZSBsb3NzIGlzIGFzc29jaWF0ZWQgd2l0aCBoaWdoZXIgb2RkcyBvZiBtZW50YWwgaGVhbHRoIHByb2JsZW1zIGlzIGNvbnNpc3RlbnQgd2l0aCBwcmV2aW91cyBsaXRlcmF0dXJlIChDdWkgZXQgYWwuLCAyMDIyKS4gRWNvbm9taWMgaW5zdGFiaWxpdHkgZHVyaW5nIHRoZSBwYW5kZW1pYyBzaWduaWZpY2FudGx5IGltcGFjdGVkIGluZGl2aWR1YWwncyBtZW50YWwgd2VsbC1iZWluZywgdW5kZXJzY29yaW5nIHRoZSBpbXBvcnRhbmNlIG9mIGZpbmFuY2lhbCBzZWN1cml0eS4NCg0KMi4gKipMaXZpbmcgQXJyYW5nZW1lbnRzIGFzIGEgTW9kZXJhdG9yKio6IExpdmluZyBhcnJhbmdlbWVudHMgc2lnbmlmaWNhbnRseSBtb2RlcmF0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZW1wbG95bWVudCBpbmNvbWUgbG9zcyBhbmQgbWVudGFsIGhlYWx0aC4gSW5kaXZpZHVhbHMgbGl2aW5nIGFsb25lIGFuZCBleHBlcmllbmNpbmcgZW1wbG95bWVudCBpbmNvbWUgbG9zcyBhcmUgbW9yZSBsaWtlbHkgdG8gc3VmZmVyIGZybyBtZW50YWwgaGVhbHRoIGlzc3VlcyB0aGFuIHRob3NlIGxpdmluZyB3aXRoIG90aGVycy4gVGhpcyBzdXBwb3J0cyB0aGUgaHlwb3RoZXNpcyB0aGF0IHNvY2lhbCBzdXBwb3J0IG1pdGlnYXRlcyB0aGUgYWR2ZXJzZSBlZmZlY3RzIG9mIGZpbmFuY2lhbCBzdHJhaW4gb24gbWVudGFsIGhlYWx0aCAoUGVDb25nYSBldCBhbC4sIDIwMjA7IEJ1ZWNrZXIgJiBIb3JzdG1hbm4sIDIwMjEpLiBUaGUgcHJlc2VuY2Ugb2YgZmFtaWx5IG9yIHJvb21tYXRlcyBsaWtlbHkgcHJvdmlkZXMgZW1vdGlvbmFsIGFuZCBwcmFjdGljYWwgc3VwcG9ydCwgd2hpY2ggYnVmZmVycyBhZ2FpbnN0IHRoZSBwc3ljaG9sb2dpY2FsIGltcGFjdCBvZiBqb2IgYW5kIGluY29tZSBsb3NzLg0KDQozLiAqKk1hcml0YWwgU3RhdHVzIGFuZCBNZW50YWwgSGVhbHRoKio6IFRoZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiBtZW50YWwgaGVhbHRoIG91dGNvbWVzIGFjcm9zcyBtYXJpdGFsIHN0YXR1c2VzIGhpZ2hsaWdodCB0aGUgY29tcGxleCByb2xlIG9mIHNvY2lhbCByZWxhdGlvbnNoaXBzIGluIG1lbnRhbCBoZWFsdGguIERpdm9yY2VkLCBzZXBhcmF0ZWQsIGFuZCBuZXZlci1tYXJyaWVkIGluZGl2aWR1YWxzIGFyZSBtb3JlIHZ1bG5lcmFibGUgdG8gbWVudGFsIGhlYWx0aCBpc3N1ZXMsIHBvc3NpYmx5IGR1ZSB0byBsb3dlciBsZXZlbHMgb2Ygc29jaWFsIHN1cHBvcnQgYW5kIGhpZ2hlciBsZXZlbHMgb2YgaXNvbGF0aW9uLiANCg0KNC4gKipFZHVjYXRpb24gYW5kIE1lbnRhbCBIZWFsdGgqKjogSGlnaGVyIGVkdWNhdGlvbiBsZXZlbHMgd2VyZSBhc3NvY2lhdGVkIHdpdGggbG93ZXIgb2RkcyBvZiByZXBvcnRpbmcgbWVudGFsIGhlYWx0aCBwcm9ibGVtcy4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gdmFyaW91cyBmYWN0b3JzLCBpbmNsdWRpbmcgYmV0dGVyIGNvcGluZyBtZWNoYW5pc21zLCBoaWdoZXIgaW5jb21lIGxldmVscywgYW5kIG1vcmUgc3RhYmxlIGVtcGxveW1lbnQgc2l0dWF0aW9ucyBhbW9uZyB0aG9zZSB3aXRoIGhpZ2hlciBlZHVjYXRpb24uIA0KDQo1LiAqKlJhY2lhbCBEaWZmZXJlbmNlcyoqOiBUaGUgcmFjaWFsIGRpc3Bhcml0aWVzIGluIG1lbnRhbCBoZWFsdGggb3V0Y29tZXMgY2FsbCBhdHRlbnRpb24gdG8gdGhlIGludGVyc2VjdGlvbiBvZiByYWNlIGFuZCBlY29ub21pYyB2dWxuZXJhYmlsaXR5LiBUaGUgJ090aGVycycgcmFjaWFsIGNhdGVnb3J5IGhhdmluZyBoaWdoZXIgb2RkcyBvZiBtZW50YWwgaGVhbHRoIGlzc3VlcyBzdWdnZXN0cyB0aGF0IG1pbm9yaXR5IGdyb3VwcyBmYWNlZCBkaXNwcm9wb3J0aW9uYXRlIGltcGFjdHMgZHVyaW5nIHRoZSBwYW5kZW1pYy4gDQoNCiMjIyMgRGlzY3Vzc2lvbiBhbmQgSW1wbGljYXRpb25zDQoNClRoZSBmaW5kaW5ncyBvZiB0aGlzIHByb2plY3QgaGlnaGxpZ2h0IHRoZSBjcml0aWNhbCByb2xlIG9mIHNvY2lhbCBzdXBwb3J0IGluIG1pdGlnYXRpbmcgdGhlIG5lZ2F0aXZlIGVmZmVjdHMgb2YgZWNvbm9taWMgaGFyZHNoaXAgb24gbWVudGFsIGhlYWx0aC4gUHVibGljIGhlYWx0aCBpbnRlcnZlbnRpb25zIGR1cmluZyBlY29ub21pYyBjcmlzaXMgc2hvdWxkIGNvbnNpZGVyIHRoZSBpbXBvcnRhbmNlIG9mIHNvY2lhbCBuZXR3b3JrcyBhbmQgYWltIHRvIHN0cmVuZ3RoZW4gc29jaWFsIHN1cHBvcnQgc3lzdGVtcy4gUG9saWNpZXMgdGhhdCBwcm92aWRlIGZpbmFuY2lhbCBhc3Npc3RhbmNlIGFuZCBlbXBsb3ltZW50IHN1cHBvcnQgY291bGQgYWxsZXZpYXRlIHRoZSBtZW50YWwgaGVhbHRoIGJ1cmRlbiBvbiBpbmRpdmlkdWFscyBleHBlcmllbmNpbmcgam9iIGxvc3MuDQoNClRoZXNlIGluc2lnaHRzIHN1Z2dlc3QgdGFyZ2V0ZWQgaW50ZXJ2ZW50aW9ucyBhcmUgbmVlZGVkIHRvIHN1cHBvcnQgdnVsbmVyYWJsZSBncm91cHMsIHN1Y2ggYXMgdGhvc2UgZmFjaW5nIG1hcml0YWwgdHJhbnNpdGlvbnMsIGxvd2VyIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQsIGFuZCByYWNpYWwgbWlub3JpdGllcy4gUG9saWNpZXMgYWltZWQgYXQgZW5oYW5jaW5nIGZpbmFuY2lhbCBzdGFiaWxpdHkgYW5kIHByb21vdGluZyBzb2NpYWwgc3VwcG9ydCBuZXR3b3JrcyBjb3VsZCBiZSBwYXJ0aWN1bGFybHkgZWZmZWN0aXZlIGluIGltcHJvdmluZyBtZW50YWwgaGVhbHRoIG91dGNvbWVzLiANCg0KIyMjIFN1Ymdyb3VwIEFuYWx5c2lzDQojIyMgSW5kaXZpZHVhbHMgTGl2aW5nIEFsb25lDQpgYGB7cn0NCiMgRmlsdGVyIGRhdGEgZm9yIGluZGl2aWR1YWxzIGxpdmluZyBhbG9uZQ0KZGF0YV9hbG9uZSA8LSBkYXRhX25ldyAlPiUgZmlsdGVyKGxpdmluZ19zdGF0dXMgPT0gIkFsb25lIikNCg0KIyBGaXQgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCBmb3IgaW5kaXZpZHVhbHMgbGl2aW5nIGFsb25lDQptb2RlbF9hbG9uZSA8LSBnbG0oTWVudGFsSGVhbHRoIH4gZW1wbG95bWVudF9pbmNvbWVfbG9zcyArIGVkdWNhdGlvbiArUlJBQ0UsDQogICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFfYWxvbmUsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsIGZvciBpbmRpdmlkdWFscyBsaXZpbmcgYWxvbmUNCnN1bW1hcnkobW9kZWxfYWxvbmUpDQpgYGANCg0KIyMjIEluZGl2aWR1YWxzIExpdmluZyBXaXRoIE90aGVycw0KYGBge3J9DQojIEZpbHRlciBkYXRhIGZvciBpbmRpdmlkdWFscyBsaXZpbmcgd2l0aCBvdGhlcnMNCmRhdGFfb3RoZXJzIDwtIGRhdGFfbmV3ICU+JSBmaWx0ZXIobGl2aW5nX3N0YXR1cyA9PSAiV2l0aCBPdGhlcnMiKQ0KDQojIEZpdCBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIGZvciBpbmRpdmlkdWFscyBsaXZpbmcgd2l0aCBvdGhlcnMNCm1vZGVsX290aGVycyA8LSBnbG0oTWVudGFsSGVhbHRoIH4gZW1wbG95bWVudF9pbmNvbWVfbG9zcyArIGVkdWNhdGlvbiArIFJSQUNFLA0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV9vdGhlcnMsDQogICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCg0KIyBTdW1tYXJ5IG9mIHRoZSBtb2RlbCBmb3IgaW5kaXZpZHVhbHMgbGl2aW5nIHdpdGggb3RoZXJzDQpzdW1tYXJ5KG1vZGVsX290aGVycykNCg0KYGBgDQoNCiMjIyBQbG90IG1vZGVscyBmb3IgbGl2aW5nIHN0YXR1c2VzDQpgYGB7cn0NCnBsb3RfbW9kZWwobW9kZWxfYWxvbmUsIHR5cGUgPSAicHJlZCIsIHRlcm1zID0gImVtcGxveW1lbnRfaW5jb21lX2xvc3MiKSArDQogIGdndGl0bGUoIkVmZmVjdCBvZiBFbXBsb3ltZW50IEluY29tZSBMb3NzIG9mIE1lbnRhbCBIZWFsdGggZm9yIEluZGl2aWR1YWxzIExpdmluZyBBbG9uZSIpICsNCiAgeGxhYigiRW1wbG95bWVudCBJbmNvbWUgTG9zcyIpICsNCiAgeWxhYigiUHJlZGljdGVkIFByb2JhYmlsaXR5IG9mIE1lbnRhbCBIZWFsdGggSXNzdWVzIikNCg0KDQpwbG90X21vZGVsKG1vZGVsX290aGVycywgdHlwZSA9ICJwcmVkIiwgdGVybXMgPSAiZW1wbG95bWVudF9pbmNvbWVfbG9zcyIpICsNCiAgZ2d0aXRsZSgiRWZmZWN0IG9mIEVtcGxveW1lbnQgSW5jb21lIExvc3Mgb24gTWVudGFsIEhlYWx0aCBmb3IgSW5kaXZpZHVhbHMgTGl2aW5nIFdpdGggT3RoZXJzIikgKw0KICB4bGFiKCJFbXBsb3ltZW50IEluY29tZSBMb3NzIikgKw0KICB5bGFiKCJQcmVkaWN0ZWQgcHJvYmFiaWxpdHkgb2YgTWVudGFsIEhlYWx0aCBJc3N1ZXMiKQ0KYGBgDQoNCg0KVGhlIGFuYWx5c2lzIGRlbW9uc3RyYXRlcyB0aGF0IGVtcGxveW1lbnQgaW5jb21lIGxvc3Mgc2lnbmlmaWNhbnRseSBpbXBhY3RzIG1lbnRhbCBoZWFsdGgsIHdpdGggdGhlIGVmZmVjdCB2YXJ5aW5nIGJhc2VkIG9uIGxpdmluZyBzdGF0dXMuIFNwZWNpZmljYWxseSwgdGhvc2UgbGl2aW5nIGFsb25lIGFyZSBtb3JlIGFkdmVyc2VseSBhZmZlY3RlZCBieSBlbXBsb3ltZW50IGluY29tZSBsb3NzIGNvbXBhcmVkIHRvIHRob3NlIGxpdmluZyB3aXRoIG90aGVycy4gU3ViZ3JvdXAgYW5hbHlzaXMgYW5kIHZpc3VhbGlzYXRpb25zIGZ1cnRoZXIgZWx1Y2lkYXRlIHRoZXNlIHJlbGF0aW9uc2hpcHMsIGhpZ2hsaWdodGluZyB0aGUgZGlmZmVyZW50aWFsIGltcGFjdCBvbiB2YXJpb3VzIGRlbW9ncmFwaGljIGdyb3Vwcy4NCg0KIyMgNC4gQ29uY2x1c2lvbnMNCg0KVGhpcyByZXBsaWNhdGlvbiBzdHVkeSBhaW1lZCB0byBleHRlbmQgdGhlIGZpbmRpbmdzIG9mIEN1aSBldCBhbC4gKDIwMjIpIGJ5IGV4YW1pbmluZyB3aGV0aGVyIGxpdmluZyBhcnJhbmdlbWVudHMgbW9kZXJhdGUgdGhlIGltcGFjdCBvZiBlbXBsb3ltZW50IGluY29tZSBsb3NzIG9uIG1lbnRhbCBoZWFsdGggZHVyaW5nIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYy4gVGhlIHJlc3VsdHMgY29ycm9ib3JhdGUgdGhlIG9yaWdpbmFsIHN0dWR5J3MgZmluZGluZyB0aGF0IGVtcGxveW1lbnQgaW5jb21lIGxvc3Mgc2lnbmlmaWNhbnRseSBwcmVkaWN0cyBtZW50YWwgaGVhbHRoIHByb2JsZW1zLCBlbXBoYXNpemluZyB0aGUgcHJvZm91bmQgaW1wYWN0IG9mIGVjb25vbWljIGRpc3J1cHRpb25zIG9uIHBzeWNob2xvZ2ljYWwgd2VsbC1iZWluZy4gSG93ZXZlciwgbXkgc3R1ZHkgaW50cm9kdWNlcyBhIGNydWNpYWwgbnVhbmNlOiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBlbXBsb3ltZW50IGluY29tZSBsb3NzIGFuZCBsaXZpbmcgc3RhdHVzLiANCg0KTXkgZmluZGluZ3MgaW5kaWNhdGUgdGhhdCBpbmRpdmlkdWFscyBsaXZpbmcgYWxvbmUgd2hvIGV4cGVyaWVuY2VkIGVtcGxveW1lbnQgaW5jb21lIGxvc3MgcmVwb3J0ZWQgaGlnaGVyIGxldmVscyBvZiBtZW50YWwgaGVhbHRoIGlzc3VlcyBjb21wYXJlZCB0byB0aG9zZSBsaXZpbmcgd2l0aCBvdGhlcnMuIFRoaXMgc3VwcG9ydHMgdGhlIGh5cG90aGVzaXMgdGhhdCBzb2NpYWwgc3VwcG9ydCwgbW9yZSBhY2Nlc3NpYmxlIHRvIHRob3NlIGxpdmluZyB3aXRoIG90aGVycywgbWl0aWdhdGVzIHRoZSBuZWdhdGl2ZSBlZmZlY3RzIG9mIGZpbmFuY2lhbCBzdHJhaW4uIFRoaXMgbW9kZXJhdGluZyBlZmZlY3Qgd2FzIG5vdCBleHBsb3JlZCBpbiB0aGUgb3JpZ2luYWwgc3R1ZHksIGhpZ2hsaWdodGluZyBhIHNpZ25pZmljYW50IGdhcCB0aGF0IG15IHJlcGxpY2F0aW9uIGFkZHJlc3Nlcy4gDQoNClNldmVyYWwgZmFjdG9ycyBjb3VsZCBleHBsYWluIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBzdHVkaWVzLiBGaXJzdGx5LCB0aGUgaW5jbHVzaW9uIG9mIGxpdmluZyBhcnJhbmdlbWVudHMgYXMgYSBtb2RlcmF0aW5nIHZhcmlhYmxlIGluIG15IGFuYWx5c2lzIHByb3ZpZGVkIGEgbW9yZSBudWFuY2VkIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG1lbnRhbCBoZWFsdGggaW1wYWN0cyBvZiBlbXBsb3ltZW50IGluY29tZSBsb3NzLiBTZWNvbmRseSwgbXkgZm9jdXMgb24gYSBvbmUtd2VlayB0aW1lZnJhbWUgbWlnaHQgY2FwdHVyZSB2YXJpYXRpb25zIGluIHBhbmRlbWljLXJlbGF0ZWQgc3RyZXNzb3JzIG5vdCBhcHBhcmVudCBpbiB0aGUgb3JpZ2luYWwgc3R1ZHkncyBicm9hZGVyIHRpbWVmcmFtZS4gTGFzdGx5LCBkaWZmZXJlbmNlcyBpbiBtZXRob2RvbG9naWNhbCBhcHByb2FjaGVzLCBzdWNoIGFzIG15IHVzZSBvZiBpbnRlcmFjdGlvbiB0ZXJtcyB3aXRob3V0IExhc3NvIHJlZ3VsYXJpemF0aW9uIGNvdWxkIGFjY291bnQgZm9yIHNvbWUgZGlzY3JlcGFuY2llcy4NCg0KSW4gc3VtbWFyeSwgd2hpbGUgdGhlIG9yaWdpbmFsIHN0dWR5IGhpZ2hsaWdodGVkIHRoZSBkaXJlY3QgaW1wYWN0IG9mIGVtcGxveW1lbnQgaW5jb21lIGxvc3Mgb24gbWVudGFsIGhlYWx0aCwgbXkgZmluZGluZ3MgdW5kZXJzY29yZSB0aGUgaW1wb3J0YW5jZSBvZiBzb2NpYWwgc3VwcG9ydCBzeXN0ZW1zLiBUaGlzIGluc2lnaHQgaXMgY3J1Y2lhbCBmb3IgcG9saWN5bWFrZXJzIGFuZCBtZW50YWwgaGVhbHRoIHByb2Zlc3Npb25hbHMsIHN1Z2dlc3RpbmcgdGhhdCBpbnRlcnZlbnRpb25zIHRhcmdldGluZyBlY29ub21pYyBzdXBwb3J0IHNob3VsZCBhbHNvIGNvbnNpZGVyIGluZGl2aWR1YWwncyBzb2NpYWwgY29udGV4dHMgdG8gZWZmZWN0aXZlbHkgbWl0aWdhdGUgdGhlIG1lbnRhbCBoZWFsdGggaW1wYWN0cyBvZiBlY29ub21pYyBoYXJkc2hpcC4NCg0KIyMgUmVmZXJlbmNlcw0KDQpBcmdhYnJpZ2h0LCBTLlQuIGV0IGFsLiAoMjAyMikgQ292aWQtMTktcmVsYXRlZCBmaW5hbmNpYWwgc3RyYWluIGFuZCBBZG9sZXNjZW50IE1lbnRhbCBIZWFsdGgsIExhbmNldCByZWdpb25hbCBoZWFsdGguIEFtZXJpY2FzLiBBdmFpbGFibGUgYXQ6IGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzk2NjQyNTUvIChBY2Nlc3NlZDogMTAgTWF5IDIwMjQpLiBkb2k6IDEwLjEwMTYvai5sYW5hLjIwMjIuMTAwMzkxDQoNCkJ1cmVhdSwgVS5DLiAoMjAyMykgSG91c2Vob2xkIHB1bHNlIHN1cnZleSBwdWJsaWMgdXNlIGZpbGUgKFBVRiksIENlbnN1cy5nb3YuIEF2YWlsYWJsZSBhdDogaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi9wcm9ncmFtcy1zdXJ2ZXlzL2hvdXNlaG9sZC1wdWxzZS1zdXJ2ZXkvZGF0YXNldHMuaHRtbCAoQWNjZXNzZWQ6IDA1IE1heSAyMDI0KS4NCg0KQ2hpbiwgQi5OLiBldCBhbC4gKDIwMjMpIExvbmdpdHVkaW5hbCBBc3NvY2lhdGlvbnMgb2Ygc29jaWFsIHN1cHBvcnQsIGV2ZXJ5ZGF5IHNvY2lhbCBpbnRlcmFjdGlvbnMsIGFuZCBtZW50YWwgaGVhbHRoIGR1cmluZyB0aGUgQ09WSUQtMTkgcGFuZGVtaWMsIEpvdXJuYWwgb2Ygc29jaWFsIGFuZCBwZXJzb25hbCByZWxhdGlvbnNoaXBzLiBBdmFpbGFibGUgYXQ6IGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzk1MjcxMjkvIChBY2Nlc3NlZDogMjAgTWF5IDIwMjQpLiBkb2k6IDEwLjExNzcvMDI2NTQwNzUyMjExMzA3ODYNCg0KRnJlZXNlLCBKLiwgJiBQZXRlcnNvbiwgRC4gKDIwMTcpLiBSZXBsaWNhdGlvbiBpbiBzb2NpYWwgc2NpZW5jZS4gKkFubnVhbCBSZXZpZXcgb2YgU29jaW9sb2d5KiwgNDMsIDE0Ny0xNjUsIFtkb2k6IDEwLjExNDZdKGh0dHBzOi8vd3d3LmFubnVhbHJldmlld3Mub3JnL2RvaS9hYnMvMTAuMTE0Ni9hbm51cmV2LXNvYy0wNjAxMTYtMDUzNDUwKS4NCg0KUGVDb25nYSwgRS5LLiBldCBhbC4gKDIwMjApIFBzeWNob2xvZ2ljYWwgVHJhdW1hOiBUaGVvcnksIFJlc2VhcmNoLCBQcmFjdGljZSwgYW5kIFBvbGljeSwgUmVzaWxpZW5jZSBJcyBTcHJlYWRpbmc6IE1lbnRhbCBIZWFsdGggV2l0aGluIHRoZSBDT1ZJRC0xOSBQYW5kZW1pYy4gQXZhaWxhYmxlIGF0OiBodHRwczovL3d3dy5jYXJla25vd2xlZGdlLmNvbS9tZWRpYS80NzM4Ny8yMDIwLTM4OTU2LTAwMS5wZGYgaHR0cDovL2R4LmRvaS5vcmcvMTAuMTAzNy90cmEwMDAwODc0IChBY2Nlc3NlZDogMDUgTWF5IDIwMjQpLg0KDQpCdWVja2VyLCBTLiBhbmQgSG9yc3RtYW5uLCBLLlQuICgyMDIxKSAoUERGKSBsb25lbGluZXNzIGFuZCBzb2NpYWwgaXNvbGF0aW9uIGR1cmluZyB0aGUgQ09WSUQtMTkgcGFuZGVtaWMsIExvbmVsaW5lc3MgYW5kIFNvY2lhbCBJc29sYXRpb24gRHVyaW5nIHRoZSBDT1ZJRC0xOSBQYW5kZW1pYyBBIFN5c3RlbWF0aWMgUmV2aWV3IEVucmljaGVkIFdpdGggRW1waXJpY2FsIEV2aWRlbmNlIEZyb20gYSBMYXJnZS1TY2FsZSBEaWFyeSBTdHVkeS4gQXZhaWxhYmxlIGF0OiBodHRwczovL3d3dy5yZXNlYXJjaGdhdGUubmV0L3B1YmxpY2F0aW9uLzM0MTY1MzU3NV9Mb25lbGluZXNzX2FuZF9Tb2NpYWxfSXNvbGF0aW9uX2R1cmluZ190aGVfQ09WSUQtMTlfUGFuZGVtaWMgKEFjY2Vzc2VkOiAwNSBNYXkgMjAyNCkuIERPSToxMC4xMDI3LzEwMTYtOTA0MC9hMDAwNDUzDQoNClN6a29keSwgRS4gZXQgYWwuICgyMDIxKSBTdHJlc3MtYnVmZmVyaW5nIHJvbGUgb2Ygc29jaWFsIHN1cHBvcnQgZHVyaW5nIENPVklELTE5LCBGYW1pbHkgcHJvY2Vzcy4gQXZhaWxhYmxlIGF0OiBodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3BtYy9hcnRpY2xlcy9QTUM3NzUzNzI4LyAoQWNjZXNzZWQ6IDIwIEp1bmUgMjAyNCkuIGRvaTogMTAuMTExMS9mYW1wLjEyNjE4DQoNCiMjIEFwcGVuZGl4DQoNCiMjIyBBcHBlbmRpeCAxLiBNeSBlbnZpcm9tZW50IChmdWxsIGluZm9ybWF0aW9uKSANCg0KYGBge3Igc2Vzc2lvbn0NCiMgRGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgbXkgZW52aXJvbm1lbnQNCnNlc3Npb25JbmZvKCkNCmBgYA0KDQojIyMgQXBwZW5kaXggMi4gRW50aXJlIFIgY29kZSB1c2VkIGluIHRoZSBwcm9qZWN0DQoNCmBgYHtyIHJlZi5sYWJlbD1rbml0cjo6YWxsX2xhYmVscygpLCBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9DQpgYGANCg==