Packages

Loading relevant packages:

library(lme4) # Hierarchical models
library(stargazer) # Regression tables
library(dplyr) # Data wrangling and pipes
library(ggplot2) # Graphics
library(ggeffects) # ggpredict

Data

Loading the relevant data:

load('/Users/davidhamad/Documents/Cand.Scient.Pol/2. Semester/Statistical models beyond linear regression - applied statistics for political scientists/4-5) Hierarchical data structures/MEP.rda')

df <- MEP

Exercise 1: Descriptive statistics

Q1: What is the size of the data? How many individual MEPs are there in the data set? How often are they observed?

A1: 7143 observations, 116 variables, 1174 unique MEPs, and 10 periods.

nrow(df) # Observations
[1] 7143
ncol(df) # Variables
[1] 116
n_distinct(df$ID) # Unique MEPs
[1] 1174
n_distinct(df$Period) # Periods
[1] 10
table(table(df$ID)) # Distribution

  1   2   3   4   5   6   7   8   9  10 
 41  27  21  33 711  11  14   8  10 298 

Q2: How is the relevant variation here? How are the variables measured? What is the within-group and between group variation?

A2: The dependent variable (ShareOfLocalAssistants) is continuous (0 to 43). ProxNatElection is how close we are to the next national parlament election (-4 to 0), and the variable is continuous. EPElection is whether it is the period with a European parlament election or not (no/yes = 0/1), which makes the variable binary. OpenList is also binary, 0 is closed list (party-centered), and 1 is open list (candidate-centered). NationalPartyCentered is binary because 0 is more candidate-centered, while 1 is more party-centered in regards to the national parlament election. The electoral calendar variables (ProxNatElection & EPElection) have within-individual variation because they change over time for the same MEP. The electoral system variables (OpenList & NationalPartyCentered) have only between-individual variation because they never change for the same MEP, since no country changes its electoral system during the study period. The dependent variable (ShareOfLocalAssistants) has both within-individual variation and between-individual variation.

summary(df$ShareOfLocalAssistants) # Continuous
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   1.000   2.000   2.493   3.000  43.000 
summary(df$ProxNatElection) # Continuous
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-4.00000 -3.27671 -2.17260 -2.14068 -1.04658 -0.06575 
table(df$EPElection) # Binary

   0    1 
6404  739 
table(df$OpenList) # Binary

   0    1 
3840 3303 
table(df$NationalPartyCentered) # Binary

   0    1 
2952 4191 
# Within-individual variation. How many MEPs experience change?
df %>%
  group_by(ID) %>%
  summarise(
    change_y    = n_distinct(ShareOfLocalAssistants) > 1,
    change_prox = n_distinct(ProxNatElection) > 1,
    change_ep   = n_distinct(EPElection) > 1,
    change_open = n_distinct(OpenList) > 1,
    change_npc  = n_distinct(NationalPartyCentered) > 1
  ) %>%
  summarise(
    y    = paste0(sum(change_y), " / ", n()),
    prox = paste0(sum(change_prox), " / ", n()),
    ep   = paste0(sum(change_ep), " / ", n()),
    open = paste0(sum(change_open), " / ", n()),
    npc  = paste0(sum(change_npc), " / ", n())
  )

Q3: How could I model this? What would be the advantages and drawbacks? I.e. what variation would I leverage?

A3: Pooled OLS treats all 7143 observations as independent. Simple, and can estimate the effect of all variables. But the independence assumption is violated. The same MEP appears up to 10 times. This means standard errors will be too small, making us overconfident in our results. Fixed effects (individual level) adds a dummy for each MEP, leveraging only within-individual variation. The advantage is strong causal identification because it controls for everything that is constant about each MEP. Drawback is that OpenList and NationalPartyCentered would be dropped from the model because they have zero within-individual variation. So we cannot test hypothesis 1 (personal vote) with this model. Random effects/hierarchical model (varying intercepts) pools between- and within-individual variation using shrinkage. The advantage is that it can estimate effects of both electoral calendar (within) and electoral system (between), and corrects standard errors for the clustered data structure. Drawback is that it assumes that the group-level effects are uncorrelated with the predictors, which is a stronger assumption than fixed effects. Since we want to test both hypotheses, the random effects model is the most suitable choice here.


Exercise 2: Choice of covariates

Q1: I want to model the change in staff size as a function of the electoral calendar. How can I do this?

A1: To model the change in staff size, I need to leverage within-individual variation by using a varying-intercept model at the individual level (either fixed effects or random effects). This controls for everything constant about each MEP and isolates how their staff size changes over time as a function of the electoral calendar.


Q2: I’m considering a fixed-effects model at the individual level. Please advise me on the following covariates: electoral calendar, electoral system, labor cost, gender, age, and lag of the dependent variable.

A2: Electoral calendar can be estimated. They vary over time within each MEP. These are the main predictors of interest. Electoral system would be dropped. They have zero within-individual variation because no MEP changes electoral system. The individual fixed effect absorbs them completely. LaborCost survives technically. But it is primarily a between-country variable, and since individual fixed effects already absorb nationality, most of its explanatory power is already controlled away. Gender would be dropped. No MEP changes gender. Zero within-variation. Age survives. But it increases at the exact same rate for everyone, which makes it nearly collinear with period effects. The dependent variable can be estimated. It is the lagged dependent variable, meaning last period’s staff size predicts this period’s. It controls for persistence in staffing decisions.


Q3: Now, I’m considering a fixed-effect on time-period. Would this be a good idea? What would be the effects of my two election variables? (EPElection & ProxNatElection).

A3: Adding period fixed effects would not be a good idea if we want to estimate the effect of EPElection, because it would be perfectly collinear with the period dummies and therefore dropped. ProxNatElection would survive because it varies across countries within the same period (different countries hold national elections at different times). So period fixed effects would prevent us from testing the EP election hypothesis.


Q4: How do you think the random-effects model would perform here?

A4: The random effects model would perform well here because it can estimate all our variables. The within-individual variables (ProxNatElection & EPElection) are estimated using within-variation, while the between-individual variables (OpenList & NationalPartyCentered) are estimated using between-variation. It also corrects the standard errors for the clustered data structure (same MEP observed multiple times).


Exercise 3: Fit and interpret the model

Q1: Fit the following model as a pooled linear regression, fixed-effects model and a random effects model (with varying individual intercepts): ShareOfLocalAssistants ~ ProxNatElection + NationalCandidateCentered + EPElection + OpenList + ShareOfLocal.lag. Present the results in stargazer().

A1: See the models below:

# Pooled OLS
mod.pool <- lm(ShareOfLocalAssistants ~ ProxNatElection + NationalCandidateCentered + EPElection + OpenList + ShareOfLocal.lag, data = df)

# Fixed effects (individual level)
mod.fe <- lm(ShareOfLocalAssistants ~ ProxNatElection + NationalCandidateCentered + EPElection + OpenList + ShareOfLocal.lag + as.factor(ID), data = df)

# Random effects (varying individual intercepts)
mod.re <- lmer(ShareOfLocalAssistants ~ ProxNatElection + NationalCandidateCentered + EPElection + OpenList + ShareOfLocal.lag + (1|ID), data = df)

# Compare
stargazer(mod.pool, mod.fe, mod.re, 
          type = "text", 
          omit = "as.factor",
          column.labels = c("Pooled", "Fixed effects", "Random effects"))

================================================================================================
                                                   Dependent variable:                          
                          ----------------------------------------------------------------------
                                                  ShareOfLocalAssistants                        
                                                    OLS                               linear    
                                                                                  mixed-effects 
                                    Pooled                   Fixed effects        Random effects
                                      (1)                         (2)                  (3)      
------------------------------------------------------------------------------------------------
ProxNatElection                     0.035**                     0.032**              0.034**    
                                    (0.014)                     (0.014)              (0.014)    
                                                                                                
NationalCandidateCentered          0.177***                     -0.083               0.360***   
                                    (0.038)                     (1.330)              (0.066)    
                                                                                                
EPElection                         0.298***                    0.378***              0.355***   
                                    (0.059)                     (0.052)              (0.054)    
                                                                                                
OpenList                           0.213***                      0.795               0.360***   
                                    (0.036)                     (1.793)              (0.063)    
                                                                                                
ShareOfLocal.lag                   0.838***                    0.418***              0.636***   
                                    (0.006)                     (0.009)              (0.008)    
                                                                                                
Constant                           0.400***                      0.282               0.679***   
                                    (0.049)                     (1.268)              (0.070)    
                                                                                                
------------------------------------------------------------------------------------------------
Observations                         7,047                       7,047                7,047     
R2                                   0.727                       0.834                          
Adjusted R2                          0.726                       0.802                          
Log Likelihood                                                                     -12,742.830  
Akaike Inf. Crit.                                                                   25,501.660  
Bayesian Inf. Crit.                                                                 25,556.540  
Residual Std. Error            1.489 (df = 7041)           1.268 (df = 5894)                    
F Statistic               3,741.136*** (df = 5; 7041) 25.709*** (df = 1152; 5894)               
================================================================================================
Note:                                                                *p<0.1; **p<0.05; ***p<0.01

Q2: What do you find? What happened?

A2: The fixed effects model cannot identify NationalCandidateCentered and OpenList because they have no within-individual variation. The random effects model solves this by pooling between- and within-variation, estimating all variables with reasonable precision.


Q3: Discuss my choice of variables.

A3: ProxNatElection og EPElection are good choices. They directly test hypothesis 2 (electoral calendar). Both have within-individual variation, so they can be estimated in all model types. NationalCandidateCentered og OpenList are good choices for testing hypothesis 1 (personal vote). They capture electoral system incentives at two levels (national and EU). However, they only have between-individual variation, which means they require a random effects model. ShareOfLocal.lag is a useful control variable. It accounts for persistence in staffing decisions, so the model estimates the effect of the other variables on changes in staff size rather than the level. However, including a lagged dependent variable in a random effects model can introduce bias, because the lag is correlated with the random intercept by construction. A MEP with a high intercept will also tend to have a high lagged value. What is missing might be the model does not control for time-varying confounders like Reform2016 (the spending cap) that we know affected local staff size for all MEPs. Including it could improve the estimates of the other variables.


Exercise 4: Interpretation

Context: Interpret the results from the random-effects model. What is the effect of the two measures of the electoral calendar and the electoral system?

Q1: Create two scenarios and interpret either the marginal effect or the first-difference. Justify your choice.

A1: Marginal effect is the change in y for a one-unit increase in x. First-difference is the change in y for a specific, chosen change in x. I use first-differences because the electoral system variables are binary (the only meaningful change is from 0 to 1), and for ProxNatElection a first-difference based on the full range gives a more substantively interpretable result than a one-unit marginal effect. In scenario 1 (electoral calender) When a MEP moves from the furthest point from a national election (ProxNatElection = -4) to immediately before an election (ProxNatElection = 0), the predicted increase in local staff is 0,034 × 4 = 0,135. In other words, roughly 1 in 7 MEPs would hire one additional local assistant as the election approaches. In scenario 2 (electoral system) MEPs in candidate-centered national electoral systems have on average 0.36 more local assistants than MEPs in party-centered systems. In other words, roughly 1 in 3 MEPs from candidate-centered systems hires one additional local assistant compared to their party-centered counterparts.

# Scenario 1: Electoral calendar (ProxNatElection)
# A MEP goes from far from election (-4) to close to election (0)
# Holding all other variables constant
fd_prox <- fixef(mod.re)["ProxNatElection"] * (0 - (-4))
fd_prox
ProxNatElection 
      0.1351446 
# Scenario 2: Electoral system (NationalCandidateCentered)
# Comparing a MEP in a party-centered system (0) vs candidate-centered system (1)
# Holding all other variables constant
fd_ncc <- fixef(mod.re)["NationalCandidateCentered"] * (1 - 0)
fd_ncc
NationalCandidateCentered 
                0.3604779 

Q2: Descriptive statistics from a survey conducted among MEPs shows that 31 % claim that they envision staying in Parliament for 10 or more years (i.e. they will seek reelection). How does this change your understanding of the results?

A2: Our model estimates the average effect across all MEPs. But the theory assumes that MEPs respond to electoral incentives, which only makes sense for MEPs who actually plan to seek reelection. If only 31 % of MEPs intend to stay, then 69 % have no reason to respond to the electoral calendar or invest in personal vote cultivation. These 69 % are likely not changing their staff at all, which dilutes our estimates toward zero. The true effect for the 31 % who actually seek reelection is probably much larger than what we estimate. This means our results are conservative, and the electoral incentives for those who care about reelection are likely stronger than the model suggests.


Q3: Illustrate the effects. What plot would you opt for?

A3: I would opt for effect plots using ggpredict() from the ggeffects package. For ProxNatElection (continuous), an effect plot shows the predicted staff size across the full range of the variable, with a confidence interval. For the binary variables (EPElection, NationalCandidateCentered, OpenList), the same type of plot shows the predicted value at 0 and 1.

# Effect of ProxNatElection (continuous)
ggpredict(mod.re, terms = "ProxNatElection") %>%
  plot() +
  ggtitle("Effect of proximity to national election on local staff size")

# Effect of EPElection (binary)
ggpredict(mod.re, terms = "EPElection") %>%
  plot() +
  ggtitle("Effect of EP election on local staff size")

# Effect of NationalCandidateCentered (binary)
ggpredict(mod.re, terms = "NationalCandidateCentered") %>%
  plot() +
  ggtitle("Effect of candidate-centered system on local staff size")

# Effect of OpenList (binary)
ggpredict(mod.re, terms = "OpenList") %>%
  plot() +
  ggtitle("Effect of open list system on local staff size")


Q4: In your opinion, are the two hypotheses supported? How big are the electoral incentives?

A4: Both hypotheses find some support, but the effects are substantively small. Hypothesis 1 (personal vote) is supported. MEPs in candidate-centered systems (NationalCandidateCentered) have 0,36 more local assistants, and MEPs with open lists (OpenList) also have 0,36 more. Both are statistically significant. But substantively, this means roughly 1 in 3 MEPs hires one additional assistant due to electoral system incentives. Hypothesis 2 (electoral calendar) is supported, but weak. Moving from the furthest point to immediately before a national election increases staff by only 0,135 (roughly 1 in 7 MEPs hiring one extra assistant). EP elections have a larger effect (0,355), comparable to the electoral system variables. Overall the electoral incentives exist, but they are modest. MEPs do appear to use parliamentary resources for electoral purposes, but the magnitude is small. Combined with the fact that only 31 % of MEPs plan to seek reelection, the true effect among those who actually respond to electoral incentives is likely larger than what we estimate here.


Exercise 5: Interaction effect

Context: I have a third hypothesis: I believe MEPs with higher incentives to cultivate a personal vote are more sensitive to the electoral calendar.

Q1 + Q2: How could I model this Can you implement your suggestion using a random-intercept model??

A1 + A2: This hypothesis says that the effect of the electoral calendar depends on the electoral system. That is an interaction effect. I would include an interaction term between ProxNatElection and NationalCandidateCentered.

mod.int <- lmer(ShareOfLocalAssistants ~ ProxNatElection * NationalCandidateCentered + EPElection + OpenList + ShareOfLocal.lag + (1|ID), data = df)
summary(mod.int)
Linear mixed model fit by REML ['lmerMod']
Formula: ShareOfLocalAssistants ~ ProxNatElection * NationalCandidateCentered +  
    EPElection + OpenList + ShareOfLocal.lag + (1 | ID)
   Data: df

REML criterion at convergence: 25482

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-19.0678  -0.3163  -0.1004   0.2481  21.4927 

Random effects:
 Groups   Name        Variance Std.Dev.
 ID       (Intercept) 0.7981   0.8934  
 Residual             1.7579   1.3259  
Number of obs: 7047, groups:  ID, 1150

Fixed effects:
                                           Estimate Std. Error t value
(Intercept)                                0.563795   0.079659   7.078
ProxNatElection                           -0.016548   0.021642  -0.765
NationalCandidateCentered                  0.541118   0.089391   6.053
EPElection                                 0.346492   0.053696   6.453
OpenList                                   0.356806   0.063068   5.657
ShareOfLocal.lag                           0.639107   0.007892  80.979
ProxNatElection:NationalCandidateCentered  0.084216   0.028004   3.007

Correlation of Fixed Effects:
            (Intr) PrxNtE NtnlCC EPElct OpnLst ShrOL.
ProxNtElctn  0.607                                   
NtnlCnddtCn -0.727 -0.544                            
EPElection  -0.026  0.063 -0.036                     
OpenList    -0.410  0.012  0.067 -0.003              
ShrOfLcl.lg -0.151 -0.024 -0.052 -0.013 -0.084       
PrxNtEl:NCC -0.473 -0.774  0.678 -0.051 -0.013  0.046

Q3: Can you interpret the results following the Berry et al.s recommendation? What is the effect of: national electoral calendar when electoral system is candidate-centered, national electoral calendar when electoral system is party-centered, national electoral system when electoins are far away, and national electoral system when electons are tomorrow?

A3: Following Berry et al., I compute the conditional effects at meaningful values rather than interpreting the interaction term alone. Effect of electoral calendar when candidate-centered (NCC = 1): 0,068 per unit. MEPs in candidate-centered systems hire more staff as elections approach. Effect of electoral calendar when party-centered (NCC = 0): -0,017 per unit. Close to zero and not significant. MEPs in party-centered systems do not respond to the electoral calendar. Effect of electoral system when elections are far away (Prox = -4): 0,204. A small difference between the two systems when there is no electoral pressure. Effect of electoral system when elections are tomorrow (Prox = 0): 0,541. A much larger difference. Candidate-centered MEPs have about half an assistant more than party-centered MEPs right before an election. The pattern is clear. The two systems only diverge when elections are near. When elections are far away, it does not matter much whether the system is candidate-centered or party-centered. This supports hypothesis 3.

# Compute conditional effects
b_prox <- fixef(mod.int)["ProxNatElection"]
# Compute conditional effects
b_ncc  <- fixef(mod.int)["NationalCandidateCentered"]
# Compute conditional effects
b_int  <- fixef(mod.int)["ProxNatElection:NationalCandidateCentered"]
# Effect of calendar when candidate-centered
b_prox + b_int * 1
ProxNatElection 
     0.06766755 
# Effect of calendar when party-centered
b_prox + b_int * 0
ProxNatElection 
    -0.01654839 
# Effect of system when elections far away (Prox = -4)
b_ncc + b_int * (-4)
NationalCandidateCentered 
                0.2042542 
# Effect of system when elections tomorrow (Prox = 0)
b_ncc + b_int * 0
NationalCandidateCentered 
                 0.541118 
LS0tCnRpdGxlOiAiSGllcmFyY2hpY2FsIG1vZGVsaW5nIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7Y3NzLCBlY2hvPUZBTFNFfQpib2R5e3RleHQtYWxpZ246IEp1c3RpZnk7fQpoMS50aXRsZSB7Ym9yZGVyLWJvdHRvbTogM3B4IHNvbGlkIGJsYWNrOyBwYWRkaW5nLWJvdHRvbTogMTBweDt9CmBgYAoKYGBge3IsIGVjaG89RkFMU0V9CnNldHdkKCcvVXNlcnMvZGF2aWRoYW1hZC9Eb2N1bWVudHMvQ2FuZC5TY2llbnQuUG9sLzIuIFNlbWVzdGVyL1N0YXRpc3RpY2FsIG1vZGVscyBiZXlvbmQgbGluZWFyIHJlZ3Jlc3Npb24gLSBhcHBsaWVkIHN0YXRpc3RpY3MgZm9yIHBvbGl0aWNhbCBzY2llbnRpc3RzLzQtNSkgSGllcmFyY2hpY2FsIGRhdGEgc3RydWN0dXJlcycpCmBgYAoKCiMjIyBQYWNrYWdlcwpMb2FkaW5nIHJlbGV2YW50IHBhY2thZ2VzOgoKYGBge3J9CmxpYnJhcnkobG1lNCkgIyBIaWVyYXJjaGljYWwgbW9kZWxzCmxpYnJhcnkoc3RhcmdhemVyKSAjIFJlZ3Jlc3Npb24gdGFibGVzCmxpYnJhcnkoZHBseXIpICMgRGF0YSB3cmFuZ2xpbmcgYW5kIHBpcGVzCmxpYnJhcnkoZ2dwbG90MikgIyBHcmFwaGljcwpsaWJyYXJ5KGdnZWZmZWN0cykgIyBnZ3ByZWRpY3QKYGBgCgotLS0KCiMjIyBEYXRhCkxvYWRpbmcgdGhlIHJlbGV2YW50IGRhdGE6CgpgYGB7cn0KbG9hZCgnL1VzZXJzL2RhdmlkaGFtYWQvRG9jdW1lbnRzL0NhbmQuU2NpZW50LlBvbC8yLiBTZW1lc3Rlci9TdGF0aXN0aWNhbCBtb2RlbHMgYmV5b25kIGxpbmVhciByZWdyZXNzaW9uIC0gYXBwbGllZCBzdGF0aXN0aWNzIGZvciBwb2xpdGljYWwgc2NpZW50aXN0cy80LTUpIEhpZXJhcmNoaWNhbCBkYXRhIHN0cnVjdHVyZXMvTUVQLnJkYScpCgpkZiA8LSBNRVAKYGBgCgotLS0KCiMjIyBFeGVyY2lzZSAxOiBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzCioqUTE6KiogV2hhdCBpcyB0aGUgc2l6ZSBvZiB0aGUgZGF0YT8gSG93IG1hbnkgaW5kaXZpZHVhbCBNRVBzIGFyZSB0aGVyZSBpbiB0aGUgZGF0YSBzZXQ/IEhvdyBvZnRlbiBhcmUgdGhleSBvYnNlcnZlZD8KCioqQTE6KiogNzE0MyBvYnNlcnZhdGlvbnMsIDExNiB2YXJpYWJsZXMsIDExNzQgdW5pcXVlIE1FUHMsIGFuZCAxMCBwZXJpb2RzLgoKYGBge3J9Cm5yb3coZGYpICMgT2JzZXJ2YXRpb25zCm5jb2woZGYpICMgVmFyaWFibGVzCm5fZGlzdGluY3QoZGYkSUQpICMgVW5pcXVlIE1FUHMKbl9kaXN0aW5jdChkZiRQZXJpb2QpICMgUGVyaW9kcwp0YWJsZSh0YWJsZShkZiRJRCkpICMgRGlzdHJpYnV0aW9uCmBgYAoKLS0tCgoqKlEyOioqIEhvdyBpcyB0aGUgcmVsZXZhbnQgdmFyaWF0aW9uIGhlcmU/IEhvdyBhcmUgdGhlIHZhcmlhYmxlcyBtZWFzdXJlZD8gV2hhdCBpcyB0aGUgd2l0aGluLWdyb3VwIGFuZCBiZXR3ZWVuIGdyb3VwIHZhcmlhdGlvbj8KCioqQTI6KiogVGhlIGRlcGVuZGVudCB2YXJpYWJsZSAoU2hhcmVPZkxvY2FsQXNzaXN0YW50cykgaXMgY29udGludW91cyAoMCB0byA0MykuIFByb3hOYXRFbGVjdGlvbiBpcyBob3cgY2xvc2Ugd2UgYXJlIHRvIHRoZSBuZXh0IG5hdGlvbmFsIHBhcmxhbWVudCBlbGVjdGlvbiAoLTQgdG8gMCksIGFuZCB0aGUgdmFyaWFibGUgaXMgY29udGludW91cy4gRVBFbGVjdGlvbiBpcyB3aGV0aGVyIGl0IGlzIHRoZSBwZXJpb2Qgd2l0aCBhIEV1cm9wZWFuIHBhcmxhbWVudCBlbGVjdGlvbiBvciBub3QgKG5vL3llcyA9IDAvMSksIHdoaWNoIG1ha2VzIHRoZSB2YXJpYWJsZSBiaW5hcnkuIE9wZW5MaXN0IGlzIGFsc28gYmluYXJ5LCAwIGlzIGNsb3NlZCBsaXN0IChwYXJ0eS1jZW50ZXJlZCksIGFuZCAxIGlzIG9wZW4gbGlzdCAoY2FuZGlkYXRlLWNlbnRlcmVkKS4gTmF0aW9uYWxQYXJ0eUNlbnRlcmVkIGlzIGJpbmFyeSBiZWNhdXNlIDAgaXMgbW9yZSBjYW5kaWRhdGUtY2VudGVyZWQsIHdoaWxlIDEgaXMgbW9yZSBwYXJ0eS1jZW50ZXJlZCBpbiByZWdhcmRzIHRvIHRoZSBuYXRpb25hbCBwYXJsYW1lbnQgZWxlY3Rpb24uIFRoZSBlbGVjdG9yYWwgY2FsZW5kYXIgdmFyaWFibGVzIChQcm94TmF0RWxlY3Rpb24gJiBFUEVsZWN0aW9uKSBoYXZlIHdpdGhpbi1pbmRpdmlkdWFsIHZhcmlhdGlvbiBiZWNhdXNlIHRoZXkgY2hhbmdlIG92ZXIgdGltZSBmb3IgdGhlIHNhbWUgTUVQLiBUaGUgZWxlY3RvcmFsIHN5c3RlbSB2YXJpYWJsZXMgKE9wZW5MaXN0ICYgTmF0aW9uYWxQYXJ0eUNlbnRlcmVkKSBoYXZlIG9ubHkgYmV0d2Vlbi1pbmRpdmlkdWFsIHZhcmlhdGlvbiBiZWNhdXNlIHRoZXkgbmV2ZXIgY2hhbmdlIGZvciB0aGUgc2FtZSBNRVAsIHNpbmNlIG5vIGNvdW50cnkgY2hhbmdlcyBpdHMgZWxlY3RvcmFsIHN5c3RlbSBkdXJpbmcgdGhlIHN0dWR5IHBlcmlvZC4gVGhlIGRlcGVuZGVudCB2YXJpYWJsZSAoU2hhcmVPZkxvY2FsQXNzaXN0YW50cykgaGFzIGJvdGggd2l0aGluLWluZGl2aWR1YWwgdmFyaWF0aW9uIGFuZCBiZXR3ZWVuLWluZGl2aWR1YWwgdmFyaWF0aW9uLgoKCmBgYHtyfQpzdW1tYXJ5KGRmJFNoYXJlT2ZMb2NhbEFzc2lzdGFudHMpICMgQ29udGludW91cwpzdW1tYXJ5KGRmJFByb3hOYXRFbGVjdGlvbikgIyBDb250aW51b3VzCnRhYmxlKGRmJEVQRWxlY3Rpb24pICMgQmluYXJ5CnRhYmxlKGRmJE9wZW5MaXN0KSAjIEJpbmFyeQp0YWJsZShkZiROYXRpb25hbFBhcnR5Q2VudGVyZWQpICMgQmluYXJ5CmBgYAoKYGBge3J9CiMgV2l0aGluLWluZGl2aWR1YWwgdmFyaWF0aW9uLiBIb3cgbWFueSBNRVBzIGV4cGVyaWVuY2UgY2hhbmdlPwpkZiAlPiUKICBncm91cF9ieShJRCkgJT4lCiAgc3VtbWFyaXNlKAogICAgY2hhbmdlX3kgICAgPSBuX2Rpc3RpbmN0KFNoYXJlT2ZMb2NhbEFzc2lzdGFudHMpID4gMSwKICAgIGNoYW5nZV9wcm94ID0gbl9kaXN0aW5jdChQcm94TmF0RWxlY3Rpb24pID4gMSwKICAgIGNoYW5nZV9lcCAgID0gbl9kaXN0aW5jdChFUEVsZWN0aW9uKSA+IDEsCiAgICBjaGFuZ2Vfb3BlbiA9IG5fZGlzdGluY3QoT3Blbkxpc3QpID4gMSwKICAgIGNoYW5nZV9ucGMgID0gbl9kaXN0aW5jdChOYXRpb25hbFBhcnR5Q2VudGVyZWQpID4gMQogICkgJT4lCiAgc3VtbWFyaXNlKAogICAgeSAgICA9IHBhc3RlMChzdW0oY2hhbmdlX3kpLCAiIC8gIiwgbigpKSwKICAgIHByb3ggPSBwYXN0ZTAoc3VtKGNoYW5nZV9wcm94KSwgIiAvICIsIG4oKSksCiAgICBlcCAgID0gcGFzdGUwKHN1bShjaGFuZ2VfZXApLCAiIC8gIiwgbigpKSwKICAgIG9wZW4gPSBwYXN0ZTAoc3VtKGNoYW5nZV9vcGVuKSwgIiAvICIsIG4oKSksCiAgICBucGMgID0gcGFzdGUwKHN1bShjaGFuZ2VfbnBjKSwgIiAvICIsIG4oKSkKICApCmBgYAoKLS0tCgoqKlEzOioqIEhvdyBjb3VsZCBJIG1vZGVsIHRoaXM/IFdoYXQgd291bGQgYmUgdGhlIGFkdmFudGFnZXMgYW5kIGRyYXdiYWNrcz8gSS5lLiB3aGF0IHZhcmlhdGlvbiB3b3VsZCBJIGxldmVyYWdlPwoKKipBMzoqKiBQb29sZWQgT0xTIHRyZWF0cyBhbGwgNzE0MyBvYnNlcnZhdGlvbnMgYXMgaW5kZXBlbmRlbnQuIFNpbXBsZSwgYW5kIGNhbiBlc3RpbWF0ZSB0aGUgZWZmZWN0IG9mIGFsbCB2YXJpYWJsZXMuIEJ1dCB0aGUgaW5kZXBlbmRlbmNlIGFzc3VtcHRpb24gaXMgdmlvbGF0ZWQuIFRoZSBzYW1lIE1FUCBhcHBlYXJzIHVwIHRvIDEwIHRpbWVzLiBUaGlzIG1lYW5zIHN0YW5kYXJkIGVycm9ycyB3aWxsIGJlIHRvbyBzbWFsbCwgbWFraW5nIHVzIG92ZXJjb25maWRlbnQgaW4gb3VyIHJlc3VsdHMuIEZpeGVkIGVmZmVjdHMgKGluZGl2aWR1YWwgbGV2ZWwpIGFkZHMgYSBkdW1teSBmb3IgZWFjaCBNRVAsIGxldmVyYWdpbmcgb25seSB3aXRoaW4taW5kaXZpZHVhbCB2YXJpYXRpb24uIFRoZSBhZHZhbnRhZ2UgaXMgc3Ryb25nIGNhdXNhbCBpZGVudGlmaWNhdGlvbiBiZWNhdXNlIGl0IGNvbnRyb2xzIGZvciBldmVyeXRoaW5nIHRoYXQgaXMgY29uc3RhbnQgYWJvdXQgZWFjaCBNRVAuIERyYXdiYWNrIGlzIHRoYXQgT3Blbkxpc3QgYW5kIE5hdGlvbmFsUGFydHlDZW50ZXJlZCB3b3VsZCBiZSBkcm9wcGVkIGZyb20gdGhlIG1vZGVsIGJlY2F1c2UgdGhleSBoYXZlIHplcm8gd2l0aGluLWluZGl2aWR1YWwgdmFyaWF0aW9uLiBTbyB3ZSBjYW5ub3QgdGVzdCBoeXBvdGhlc2lzIDEgKHBlcnNvbmFsIHZvdGUpIHdpdGggdGhpcyBtb2RlbC4gUmFuZG9tIGVmZmVjdHMvaGllcmFyY2hpY2FsIG1vZGVsICh2YXJ5aW5nIGludGVyY2VwdHMpIHBvb2xzIGJldHdlZW4tIGFuZCB3aXRoaW4taW5kaXZpZHVhbCB2YXJpYXRpb24gdXNpbmcgc2hyaW5rYWdlLiBUaGUgYWR2YW50YWdlIGlzIHRoYXQgaXQgY2FuIGVzdGltYXRlIGVmZmVjdHMgb2YgYm90aCBlbGVjdG9yYWwgY2FsZW5kYXIgKHdpdGhpbikgYW5kIGVsZWN0b3JhbCBzeXN0ZW0gKGJldHdlZW4pLCBhbmQgY29ycmVjdHMgc3RhbmRhcmQgZXJyb3JzIGZvciB0aGUgY2x1c3RlcmVkIGRhdGEgc3RydWN0dXJlLiBEcmF3YmFjayBpcyB0aGF0IGl0IGFzc3VtZXMgdGhhdCB0aGUgZ3JvdXAtbGV2ZWwgZWZmZWN0cyBhcmUgdW5jb3JyZWxhdGVkIHdpdGggdGhlIHByZWRpY3RvcnMsIHdoaWNoIGlzIGEgc3Ryb25nZXIgYXNzdW1wdGlvbiB0aGFuIGZpeGVkIGVmZmVjdHMuIFNpbmNlIHdlIHdhbnQgdG8gdGVzdCBib3RoIGh5cG90aGVzZXMsIHRoZSByYW5kb20gZWZmZWN0cyBtb2RlbCBpcyB0aGUgbW9zdCBzdWl0YWJsZSBjaG9pY2UgaGVyZS4KCi0tLQoKIyMjIEV4ZXJjaXNlIDI6IENob2ljZSBvZiBjb3ZhcmlhdGVzCgoqKlExOioqIEkgd2FudCB0byBtb2RlbCB0aGUgY2hhbmdlIGluIHN0Ye+sgCBzaXplIGFzIGEgZnVuY3Rpb24gb2YgdGhlIGVsZWN0b3JhbCBjYWxlbmRhci4gSG93IGNhbiBJIGRvIHRoaXM/CgoqKkExOioqIFRvIG1vZGVsIHRoZSBjaGFuZ2UgaW4gc3RhZmYgc2l6ZSwgSSBuZWVkIHRvIGxldmVyYWdlIHdpdGhpbi1pbmRpdmlkdWFsIHZhcmlhdGlvbiBieSB1c2luZyBhIHZhcnlpbmctaW50ZXJjZXB0IG1vZGVsIGF0IHRoZSBpbmRpdmlkdWFsIGxldmVsIChlaXRoZXIgZml4ZWQgZWZmZWN0cyBvciByYW5kb20gZWZmZWN0cykuIFRoaXMgY29udHJvbHMgZm9yIGV2ZXJ5dGhpbmcgY29uc3RhbnQgYWJvdXQgZWFjaCBNRVAgYW5kIGlzb2xhdGVzIGhvdyB0aGVpciBzdGFmZiBzaXplIGNoYW5nZXMgb3ZlciB0aW1lIGFzIGEgZnVuY3Rpb24gb2YgdGhlIGVsZWN0b3JhbCBjYWxlbmRhci4KCi0tLQoKKipRMjoqKiBJJ20gY29uc2lkZXJpbmcgYSBmaXhlZC1l76yAZWN0cyBtb2RlbCBhdCB0aGUgaW5kaXZpZHVhbCBsZXZlbC4gUGxlYXNlIGFkdmlzZSBtZSBvbiB0aGUgZm9sbG93aW5nIGNvdmFyaWF0ZXM6IGVsZWN0b3JhbCBjYWxlbmRhciwgZWxlY3RvcmFsIHN5c3RlbSwgbGFib3IgY29zdCwgZ2VuZGVyLCBhZ2UsIGFuZCBsYWcgb2YgdGhlIGRlcGVuZGVudCB2YXJpYWJsZS4KCioqQTI6KiogRWxlY3RvcmFsIGNhbGVuZGFyIGNhbiBiZSBlc3RpbWF0ZWQuIFRoZXkgdmFyeSBvdmVyIHRpbWUgd2l0aGluIGVhY2ggTUVQLiBUaGVzZSBhcmUgdGhlIG1haW4gcHJlZGljdG9ycyBvZiBpbnRlcmVzdC4gRWxlY3RvcmFsIHN5c3RlbSB3b3VsZCBiZSBkcm9wcGVkLiBUaGV5IGhhdmUgemVybyB3aXRoaW4taW5kaXZpZHVhbCB2YXJpYXRpb24gYmVjYXVzZSBubyBNRVAgY2hhbmdlcyBlbGVjdG9yYWwgc3lzdGVtLiBUaGUgaW5kaXZpZHVhbCBmaXhlZCBlZmZlY3QgYWJzb3JicyB0aGVtIGNvbXBsZXRlbHkuIExhYm9yQ29zdCBzdXJ2aXZlcyB0ZWNobmljYWxseS4gQnV0IGl0IGlzIHByaW1hcmlseSBhIGJldHdlZW4tY291bnRyeSB2YXJpYWJsZSwgYW5kIHNpbmNlIGluZGl2aWR1YWwgZml4ZWQgZWZmZWN0cyBhbHJlYWR5IGFic29yYiBuYXRpb25hbGl0eSwgbW9zdCBvZiBpdHMgZXhwbGFuYXRvcnkgcG93ZXIgaXMgYWxyZWFkeSBjb250cm9sbGVkIGF3YXkuIEdlbmRlciB3b3VsZCBiZSBkcm9wcGVkLiBObyBNRVAgY2hhbmdlcyBnZW5kZXIuIFplcm8gd2l0aGluLXZhcmlhdGlvbi4gQWdlIHN1cnZpdmVzLiBCdXQgaXQgaW5jcmVhc2VzIGF0IHRoZSBleGFjdCBzYW1lIHJhdGUgZm9yIGV2ZXJ5b25lLCB3aGljaCBtYWtlcyBpdCBuZWFybHkgY29sbGluZWFyIHdpdGggcGVyaW9kIGVmZmVjdHMuIFRoZSBkZXBlbmRlbnQgdmFyaWFibGUgY2FuIGJlIGVzdGltYXRlZC4gSXQgaXMgdGhlIGxhZ2dlZCBkZXBlbmRlbnQgdmFyaWFibGUsIG1lYW5pbmcgbGFzdCBwZXJpb2QncyBzdGFmZiBzaXplIHByZWRpY3RzIHRoaXMgcGVyaW9kJ3MuIEl0IGNvbnRyb2xzIGZvciBwZXJzaXN0ZW5jZSBpbiBzdGFmZmluZyBkZWNpc2lvbnMuCgotLS0KCioqUTM6KiogTm93LCBJ4oCZbSBjb25zaWRlcmluZyBhIGZpeGVkLWXvrIBlY3Qgb24gdGltZS1wZXJpb2QuIFdvdWxkIHRoaXMgYmUgYSBnb29kIGlkZWE/IFdoYXQgd291bGQgYmUgdGhlIGXvrIBlY3RzIG9mIG15IHR3byBlbGVjdGlvbiB2YXJpYWJsZXM/IChFUEVsZWN0aW9uICYgUHJveE5hdEVsZWN0aW9uKS4KCioqQTM6KiogQWRkaW5nIHBlcmlvZCBmaXhlZCBlZmZlY3RzIHdvdWxkIG5vdCBiZSBhIGdvb2QgaWRlYSBpZiB3ZSB3YW50IHRvIGVzdGltYXRlIHRoZSBlZmZlY3Qgb2YgRVBFbGVjdGlvbiwgYmVjYXVzZSBpdCB3b3VsZCBiZSBwZXJmZWN0bHkgY29sbGluZWFyIHdpdGggdGhlIHBlcmlvZCBkdW1taWVzIGFuZCB0aGVyZWZvcmUgZHJvcHBlZC4gUHJveE5hdEVsZWN0aW9uIHdvdWxkIHN1cnZpdmUgYmVjYXVzZSBpdCB2YXJpZXMgYWNyb3NzIGNvdW50cmllcyB3aXRoaW4gdGhlIHNhbWUgcGVyaW9kIChkaWZmZXJlbnQgY291bnRyaWVzIGhvbGQgbmF0aW9uYWwgZWxlY3Rpb25zIGF0IGRpZmZlcmVudCB0aW1lcykuIFNvIHBlcmlvZCBmaXhlZCBlZmZlY3RzIHdvdWxkIHByZXZlbnQgdXMgZnJvbSB0ZXN0aW5nIHRoZSBFUCBlbGVjdGlvbiBoeXBvdGhlc2lzLgoKLS0tCgoqKlE0OioqIEhvdyBkbyB5b3UgdGhpbmsgdGhlIHJhbmRvbS1l76yAZWN0cyBtb2RlbCB3b3VsZCBwZXJmb3JtIGhlcmU/CgoqKkE0OioqIFRoZSByYW5kb20gZWZmZWN0cyBtb2RlbCB3b3VsZCBwZXJmb3JtIHdlbGwgaGVyZSBiZWNhdXNlIGl0IGNhbiBlc3RpbWF0ZSBhbGwgb3VyIHZhcmlhYmxlcy4gVGhlIHdpdGhpbi1pbmRpdmlkdWFsIHZhcmlhYmxlcyAoUHJveE5hdEVsZWN0aW9uICYgRVBFbGVjdGlvbikgYXJlIGVzdGltYXRlZCB1c2luZyB3aXRoaW4tdmFyaWF0aW9uLCB3aGlsZSB0aGUgYmV0d2Vlbi1pbmRpdmlkdWFsIHZhcmlhYmxlcyAoT3Blbkxpc3QgJiBOYXRpb25hbFBhcnR5Q2VudGVyZWQpIGFyZSBlc3RpbWF0ZWQgdXNpbmcgYmV0d2Vlbi12YXJpYXRpb24uIEl0IGFsc28gY29ycmVjdHMgdGhlIHN0YW5kYXJkIGVycm9ycyBmb3IgdGhlIGNsdXN0ZXJlZCBkYXRhIHN0cnVjdHVyZSAoc2FtZSBNRVAgb2JzZXJ2ZWQgbXVsdGlwbGUgdGltZXMpLgoKLS0tCgojIyMgRXhlcmNpc2UgMzogRml0IGFuZCBpbnRlcnByZXQgdGhlIG1vZGVsCgoqKlExOioqIEZpdCB0aGUgZm9sbG93aW5nIG1vZGVsIGFzIGEgcG9vbGVkIGxpbmVhciByZWdyZXNzaW9uLCBmaXhlZC1l76yAZWN0cyBtb2RlbCBhbmQgYSByYW5kb20gZe+sgGVjdHMgbW9kZWwgKHdpdGggdmFyeWluZyBpbmRpdmlkdWFsIGludGVyY2VwdHMpOiBTaGFyZU9mTG9jYWxBc3Npc3RhbnRzIH4gUHJveE5hdEVsZWN0aW9uICsgTmF0aW9uYWxDYW5kaWRhdGVDZW50ZXJlZCArIEVQRWxlY3Rpb24gKyBPcGVuTGlzdCArIFNoYXJlT2ZMb2NhbC5sYWcuIFByZXNlbnQgdGhlIHJlc3VsdHMgaW4gc3RhcmdhemVyKCkuCgoqKkExOioqIFNlZSB0aGUgbW9kZWxzIGJlbG93OgoKYGBge3J9CiMgUG9vbGVkIE9MUwptb2QucG9vbCA8LSBsbShTaGFyZU9mTG9jYWxBc3Npc3RhbnRzIH4gUHJveE5hdEVsZWN0aW9uICsgTmF0aW9uYWxDYW5kaWRhdGVDZW50ZXJlZCArIEVQRWxlY3Rpb24gKyBPcGVuTGlzdCArIFNoYXJlT2ZMb2NhbC5sYWcsIGRhdGEgPSBkZikKCiMgRml4ZWQgZWZmZWN0cyAoaW5kaXZpZHVhbCBsZXZlbCkKbW9kLmZlIDwtIGxtKFNoYXJlT2ZMb2NhbEFzc2lzdGFudHMgfiBQcm94TmF0RWxlY3Rpb24gKyBOYXRpb25hbENhbmRpZGF0ZUNlbnRlcmVkICsgRVBFbGVjdGlvbiArIE9wZW5MaXN0ICsgU2hhcmVPZkxvY2FsLmxhZyArIGFzLmZhY3RvcihJRCksIGRhdGEgPSBkZikKCiMgUmFuZG9tIGVmZmVjdHMgKHZhcnlpbmcgaW5kaXZpZHVhbCBpbnRlcmNlcHRzKQptb2QucmUgPC0gbG1lcihTaGFyZU9mTG9jYWxBc3Npc3RhbnRzIH4gUHJveE5hdEVsZWN0aW9uICsgTmF0aW9uYWxDYW5kaWRhdGVDZW50ZXJlZCArIEVQRWxlY3Rpb24gKyBPcGVuTGlzdCArIFNoYXJlT2ZMb2NhbC5sYWcgKyAoMXxJRCksIGRhdGEgPSBkZikKCiMgQ29tcGFyZQpzdGFyZ2F6ZXIobW9kLnBvb2wsIG1vZC5mZSwgbW9kLnJlLCAKICAgICAgICAgIHR5cGUgPSAidGV4dCIsIAogICAgICAgICAgb21pdCA9ICJhcy5mYWN0b3IiLAogICAgICAgICAgY29sdW1uLmxhYmVscyA9IGMoIlBvb2xlZCIsICJGaXhlZCBlZmZlY3RzIiwgIlJhbmRvbSBlZmZlY3RzIikpCmBgYAoKLS0tCgoqKlEyOioqIFdoYXQgZG8geW91IGZpbmQ/IFdoYXQgaGFwcGVuZWQ/CgoqKkEyOioqIFRoZSBmaXhlZCBlZmZlY3RzIG1vZGVsIGNhbm5vdCBpZGVudGlmeSBOYXRpb25hbENhbmRpZGF0ZUNlbnRlcmVkIGFuZCBPcGVuTGlzdCBiZWNhdXNlIHRoZXkgaGF2ZSBubyB3aXRoaW4taW5kaXZpZHVhbCB2YXJpYXRpb24uIFRoZSByYW5kb20gZWZmZWN0cyBtb2RlbCBzb2x2ZXMgdGhpcyBieSBwb29saW5nIGJldHdlZW4tIGFuZCB3aXRoaW4tdmFyaWF0aW9uLCBlc3RpbWF0aW5nIGFsbCB2YXJpYWJsZXMgd2l0aCByZWFzb25hYmxlIHByZWNpc2lvbi4KCi0tLQoKKipRMzoqKiBEaXNjdXNzIG15IGNob2ljZSBvZiB2YXJpYWJsZXMuCgoqKkEzOioqIFByb3hOYXRFbGVjdGlvbiBvZyBFUEVsZWN0aW9uIGFyZSBnb29kIGNob2ljZXMuIFRoZXkgZGlyZWN0bHkgdGVzdCBoeXBvdGhlc2lzIDIgKGVsZWN0b3JhbCBjYWxlbmRhcikuIEJvdGggaGF2ZSB3aXRoaW4taW5kaXZpZHVhbCB2YXJpYXRpb24sIHNvIHRoZXkgY2FuIGJlIGVzdGltYXRlZCBpbiBhbGwgbW9kZWwgdHlwZXMuIE5hdGlvbmFsQ2FuZGlkYXRlQ2VudGVyZWQgb2cgT3Blbkxpc3QgYXJlIGdvb2QgY2hvaWNlcyBmb3IgdGVzdGluZyBoeXBvdGhlc2lzIDEgKHBlcnNvbmFsIHZvdGUpLiBUaGV5IGNhcHR1cmUgZWxlY3RvcmFsIHN5c3RlbSBpbmNlbnRpdmVzIGF0IHR3byBsZXZlbHMgKG5hdGlvbmFsIGFuZCBFVSkuIEhvd2V2ZXIsIHRoZXkgb25seSBoYXZlIGJldHdlZW4taW5kaXZpZHVhbCB2YXJpYXRpb24sIHdoaWNoIG1lYW5zIHRoZXkgcmVxdWlyZSBhIHJhbmRvbSBlZmZlY3RzIG1vZGVsLiBTaGFyZU9mTG9jYWwubGFnIGlzIGEgdXNlZnVsIGNvbnRyb2wgdmFyaWFibGUuIEl0IGFjY291bnRzIGZvciBwZXJzaXN0ZW5jZSBpbiBzdGFmZmluZyBkZWNpc2lvbnMsIHNvIHRoZSBtb2RlbCBlc3RpbWF0ZXMgdGhlIGVmZmVjdCBvZiB0aGUgb3RoZXIgdmFyaWFibGVzIG9uIGNoYW5nZXMgaW4gc3RhZmYgc2l6ZSByYXRoZXIgdGhhbiB0aGUgbGV2ZWwuIEhvd2V2ZXIsIGluY2x1ZGluZyBhIGxhZ2dlZCBkZXBlbmRlbnQgdmFyaWFibGUgaW4gYSByYW5kb20gZWZmZWN0cyBtb2RlbCBjYW4gaW50cm9kdWNlIGJpYXMsIGJlY2F1c2UgdGhlIGxhZyBpcyBjb3JyZWxhdGVkIHdpdGggdGhlIHJhbmRvbSBpbnRlcmNlcHQgYnkgY29uc3RydWN0aW9uLiBBIE1FUCB3aXRoIGEgaGlnaCBpbnRlcmNlcHQgd2lsbCBhbHNvIHRlbmQgdG8gaGF2ZSBhIGhpZ2ggbGFnZ2VkIHZhbHVlLiBXaGF0IGlzIG1pc3NpbmcgbWlnaHQgYmUgdGhlIG1vZGVsIGRvZXMgbm90IGNvbnRyb2wgZm9yIHRpbWUtdmFyeWluZyBjb25mb3VuZGVycyBsaWtlIFJlZm9ybTIwMTYgKHRoZSBzcGVuZGluZyBjYXApIHRoYXQgd2Uga25vdyBhZmZlY3RlZCBsb2NhbCBzdGFmZiBzaXplIGZvciBhbGwgTUVQcy4gSW5jbHVkaW5nIGl0IGNvdWxkIGltcHJvdmUgdGhlIGVzdGltYXRlcyBvZiB0aGUgb3RoZXIgdmFyaWFibGVzLgoKLS0tCgojIyMgRXhlcmNpc2UgNDogSW50ZXJwcmV0YXRpb24KCioqQ29udGV4dDoqKiBJbnRlcnByZXQgdGhlIHJlc3VsdHMgZnJvbSB0aGUgcmFuZG9tLWXvrIBlY3RzIG1vZGVsLiBXaGF0IGlzIHRoZSBl76yAZWN0IG9mIHRoZSB0d28gbWVhc3VyZXMgb2YgdGhlIGVsZWN0b3JhbCBjYWxlbmRhciBhbmQgdGhlIGVsZWN0b3JhbCBzeXN0ZW0/CgoqKlExOioqIENyZWF0ZSB0d28gc2NlbmFyaW9zIGFuZCBpbnRlcnByZXQgZWl0aGVyIHRoZSBtYXJnaW5hbCBl76yAZWN0IG9yIHRoZSBmaXJzdC1kae+sgGVyZW5jZS4gSnVzdGlmeSB5b3VyIGNob2ljZS4KCioqQTE6KiogTWFyZ2luYWwgZWZmZWN0IGlzIHRoZSBjaGFuZ2UgaW4geSBmb3IgYSBvbmUtdW5pdCBpbmNyZWFzZSBpbiB4LiBGaXJzdC1kaWZmZXJlbmNlIGlzIHRoZSBjaGFuZ2UgaW4geSBmb3IgYSBzcGVjaWZpYywgY2hvc2VuIGNoYW5nZSBpbiB4LiBJIHVzZSBmaXJzdC1kaWZmZXJlbmNlcyBiZWNhdXNlIHRoZSBlbGVjdG9yYWwgc3lzdGVtIHZhcmlhYmxlcyBhcmUgYmluYXJ5ICh0aGUgb25seSBtZWFuaW5nZnVsIGNoYW5nZSBpcyBmcm9tIDAgdG8gMSksIGFuZCBmb3IgUHJveE5hdEVsZWN0aW9uIGEgZmlyc3QtZGlmZmVyZW5jZSBiYXNlZCBvbiB0aGUgZnVsbCByYW5nZSBnaXZlcyBhIG1vcmUgc3Vic3RhbnRpdmVseSBpbnRlcnByZXRhYmxlIHJlc3VsdCB0aGFuIGEgb25lLXVuaXQgbWFyZ2luYWwgZWZmZWN0LiBJbiBzY2VuYXJpbyAxIChlbGVjdG9yYWwgY2FsZW5kZXIpIFdoZW4gYSBNRVAgbW92ZXMgZnJvbSB0aGUgZnVydGhlc3QgcG9pbnQgZnJvbSBhIG5hdGlvbmFsIGVsZWN0aW9uIChQcm94TmF0RWxlY3Rpb24gPSAtNCkgdG8gaW1tZWRpYXRlbHkgYmVmb3JlIGFuIGVsZWN0aW9uIChQcm94TmF0RWxlY3Rpb24gPSAwKSwgdGhlIHByZWRpY3RlZCBpbmNyZWFzZSBpbiBsb2NhbCBzdGFmZiBpcyAwLDAzNCDDlyA0ID0gMCwxMzUuIEluIG90aGVyIHdvcmRzLCByb3VnaGx5IDEgaW4gNyBNRVBzIHdvdWxkIGhpcmUgb25lIGFkZGl0aW9uYWwgbG9jYWwgYXNzaXN0YW50IGFzIHRoZSBlbGVjdGlvbiBhcHByb2FjaGVzLiBJbiBzY2VuYXJpbyAyIChlbGVjdG9yYWwgc3lzdGVtKSBNRVBzIGluIGNhbmRpZGF0ZS1jZW50ZXJlZCBuYXRpb25hbCBlbGVjdG9yYWwgc3lzdGVtcyBoYXZlIG9uIGF2ZXJhZ2UgMC4zNiBtb3JlIGxvY2FsIGFzc2lzdGFudHMgdGhhbiBNRVBzIGluIHBhcnR5LWNlbnRlcmVkIHN5c3RlbXMuIEluIG90aGVyIHdvcmRzLCByb3VnaGx5IDEgaW4gMyBNRVBzIGZyb20gY2FuZGlkYXRlLWNlbnRlcmVkIHN5c3RlbXMgaGlyZXMgb25lIGFkZGl0aW9uYWwgbG9jYWwgYXNzaXN0YW50IGNvbXBhcmVkIHRvIHRoZWlyIHBhcnR5LWNlbnRlcmVkIGNvdW50ZXJwYXJ0cy4KCmBgYHtyfQojIFNjZW5hcmlvIDE6IEVsZWN0b3JhbCBjYWxlbmRhciAoUHJveE5hdEVsZWN0aW9uKQojIEEgTUVQIGdvZXMgZnJvbSBmYXIgZnJvbSBlbGVjdGlvbiAoLTQpIHRvIGNsb3NlIHRvIGVsZWN0aW9uICgwKQojIEhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudApmZF9wcm94IDwtIGZpeGVmKG1vZC5yZSlbIlByb3hOYXRFbGVjdGlvbiJdICogKDAgLSAoLTQpKQpmZF9wcm94CmBgYAoKYGBge3J9CiMgU2NlbmFyaW8gMjogRWxlY3RvcmFsIHN5c3RlbSAoTmF0aW9uYWxDYW5kaWRhdGVDZW50ZXJlZCkKIyBDb21wYXJpbmcgYSBNRVAgaW4gYSBwYXJ0eS1jZW50ZXJlZCBzeXN0ZW0gKDApIHZzIGNhbmRpZGF0ZS1jZW50ZXJlZCBzeXN0ZW0gKDEpCiMgSG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50CmZkX25jYyA8LSBmaXhlZihtb2QucmUpWyJOYXRpb25hbENhbmRpZGF0ZUNlbnRlcmVkIl0gKiAoMSAtIDApCmZkX25jYwpgYGAKCi0tLQoKKipRMjoqKiBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZyb20gYSBzdXJ2ZXkgY29uZHVjdGVkIGFtb25nIE1FUHMgc2hvd3MgdGhhdCAzMSAlIGNsYWltIHRoYXQgdGhleSBlbnZpc2lvbiBzdGF5aW5nIGluIFBhcmxpYW1lbnQgZm9yIDEwIG9yIG1vcmUgeWVhcnMgKGkuZS4gdGhleSB3aWxsIHNlZWsgcmVlbGVjdGlvbikuIEhvdyBkb2VzIHRoaXMgY2hhbmdlIHlvdXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgcmVzdWx0cz8KCioqQTI6KiogT3VyIG1vZGVsIGVzdGltYXRlcyB0aGUgYXZlcmFnZSBlZmZlY3QgYWNyb3NzIGFsbCBNRVBzLiBCdXQgdGhlIHRoZW9yeSBhc3N1bWVzIHRoYXQgTUVQcyByZXNwb25kIHRvIGVsZWN0b3JhbCBpbmNlbnRpdmVzLCB3aGljaCBvbmx5IG1ha2VzIHNlbnNlIGZvciBNRVBzIHdobyBhY3R1YWxseSBwbGFuIHRvIHNlZWsgcmVlbGVjdGlvbi4gSWYgb25seSAzMSAlIG9mIE1FUHMgaW50ZW5kIHRvIHN0YXksIHRoZW4gNjkgJSBoYXZlIG5vIHJlYXNvbiB0byByZXNwb25kIHRvIHRoZSBlbGVjdG9yYWwgY2FsZW5kYXIgb3IgaW52ZXN0IGluIHBlcnNvbmFsIHZvdGUgY3VsdGl2YXRpb24uIFRoZXNlIDY5ICUgYXJlIGxpa2VseSBub3QgY2hhbmdpbmcgdGhlaXIgc3RhZmYgYXQgYWxsLCB3aGljaCBkaWx1dGVzIG91ciBlc3RpbWF0ZXMgdG93YXJkIHplcm8uIFRoZSB0cnVlIGVmZmVjdCBmb3IgdGhlIDMxICUgd2hvIGFjdHVhbGx5IHNlZWsgcmVlbGVjdGlvbiBpcyBwcm9iYWJseSBtdWNoIGxhcmdlciB0aGFuIHdoYXQgd2UgZXN0aW1hdGUuIFRoaXMgbWVhbnMgb3VyIHJlc3VsdHMgYXJlIGNvbnNlcnZhdGl2ZSwgYW5kIHRoZSBlbGVjdG9yYWwgaW5jZW50aXZlcyBmb3IgdGhvc2Ugd2hvIGNhcmUgYWJvdXQgcmVlbGVjdGlvbiBhcmUgbGlrZWx5IHN0cm9uZ2VyIHRoYW4gdGhlIG1vZGVsIHN1Z2dlc3RzLgoKLS0tCgoqKlEzOioqIElsbHVzdHJhdGUgdGhlIGXvrIBlY3RzLiBXaGF0IHBsb3Qgd291bGQgeW91IG9wdCBmb3I/CgoqKkEzOioqIEkgd291bGQgb3B0IGZvciBlZmZlY3QgcGxvdHMgdXNpbmcgZ2dwcmVkaWN0KCkgZnJvbSB0aGUgZ2dlZmZlY3RzIHBhY2thZ2UuIEZvciBQcm94TmF0RWxlY3Rpb24gKGNvbnRpbnVvdXMpLCBhbiBlZmZlY3QgcGxvdCBzaG93cyB0aGUgcHJlZGljdGVkIHN0YWZmIHNpemUgYWNyb3NzIHRoZSBmdWxsIHJhbmdlIG9mIHRoZSB2YXJpYWJsZSwgd2l0aCBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwuIEZvciB0aGUgYmluYXJ5IHZhcmlhYmxlcyAoRVBFbGVjdGlvbiwgTmF0aW9uYWxDYW5kaWRhdGVDZW50ZXJlZCwgT3Blbkxpc3QpLCB0aGUgc2FtZSB0eXBlIG9mIHBsb3Qgc2hvd3MgdGhlIHByZWRpY3RlZCB2YWx1ZSBhdCAwIGFuZCAxLgoKYGBge3J9CiMgRWZmZWN0IG9mIFByb3hOYXRFbGVjdGlvbiAoY29udGludW91cykKZ2dwcmVkaWN0KG1vZC5yZSwgdGVybXMgPSAiUHJveE5hdEVsZWN0aW9uIikgJT4lCiAgcGxvdCgpICsKICBnZ3RpdGxlKCJFZmZlY3Qgb2YgcHJveGltaXR5IHRvIG5hdGlvbmFsIGVsZWN0aW9uIG9uIGxvY2FsIHN0YWZmIHNpemUiKQpgYGAKCmBgYHtyfQojIEVmZmVjdCBvZiBFUEVsZWN0aW9uIChiaW5hcnkpCmdncHJlZGljdChtb2QucmUsIHRlcm1zID0gIkVQRWxlY3Rpb24iKSAlPiUKICBwbG90KCkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBFUCBlbGVjdGlvbiBvbiBsb2NhbCBzdGFmZiBzaXplIikKYGBgCgpgYGB7cn0KIyBFZmZlY3Qgb2YgTmF0aW9uYWxDYW5kaWRhdGVDZW50ZXJlZCAoYmluYXJ5KQpnZ3ByZWRpY3QobW9kLnJlLCB0ZXJtcyA9ICJOYXRpb25hbENhbmRpZGF0ZUNlbnRlcmVkIikgJT4lCiAgcGxvdCgpICsKICBnZ3RpdGxlKCJFZmZlY3Qgb2YgY2FuZGlkYXRlLWNlbnRlcmVkIHN5c3RlbSBvbiBsb2NhbCBzdGFmZiBzaXplIikKYGBgCgpgYGB7cn0KIyBFZmZlY3Qgb2YgT3Blbkxpc3QgKGJpbmFyeSkKZ2dwcmVkaWN0KG1vZC5yZSwgdGVybXMgPSAiT3Blbkxpc3QiKSAlPiUKICBwbG90KCkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBvcGVuIGxpc3Qgc3lzdGVtIG9uIGxvY2FsIHN0YWZmIHNpemUiKQpgYGAKCi0tLQoKKipRNDoqKiBJbiB5b3VyIG9waW5pb24sIGFyZSB0aGUgdHdvIGh5cG90aGVzZXMgc3VwcG9ydGVkPyBIb3cgYmlnIGFyZSB0aGUgZWxlY3RvcmFsIGluY2VudGl2ZXM/CgoqKkE0OioqIEJvdGggaHlwb3RoZXNlcyBmaW5kIHNvbWUgc3VwcG9ydCwgYnV0IHRoZSBlZmZlY3RzIGFyZSBzdWJzdGFudGl2ZWx5IHNtYWxsLiBIeXBvdGhlc2lzIDEgKHBlcnNvbmFsIHZvdGUpIGlzIHN1cHBvcnRlZC4gTUVQcyBpbiBjYW5kaWRhdGUtY2VudGVyZWQgc3lzdGVtcyAoTmF0aW9uYWxDYW5kaWRhdGVDZW50ZXJlZCkgaGF2ZSAwLDM2IG1vcmUgbG9jYWwgYXNzaXN0YW50cywgYW5kIE1FUHMgd2l0aCBvcGVuIGxpc3RzIChPcGVuTGlzdCkgYWxzbyBoYXZlIDAsMzYgbW9yZS4gQm90aCBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gQnV0IHN1YnN0YW50aXZlbHksIHRoaXMgbWVhbnMgcm91Z2hseSAxIGluIDMgTUVQcyBoaXJlcyBvbmUgYWRkaXRpb25hbCBhc3Npc3RhbnQgZHVlIHRvIGVsZWN0b3JhbCBzeXN0ZW0gaW5jZW50aXZlcy4gSHlwb3RoZXNpcyAyIChlbGVjdG9yYWwgY2FsZW5kYXIpIGlzIHN1cHBvcnRlZCwgYnV0IHdlYWsuIE1vdmluZyBmcm9tIHRoZSBmdXJ0aGVzdCBwb2ludCB0byBpbW1lZGlhdGVseSBiZWZvcmUgYSBuYXRpb25hbCBlbGVjdGlvbiBpbmNyZWFzZXMgc3RhZmYgYnkgb25seSAwLDEzNSAocm91Z2hseSAxIGluIDcgTUVQcyBoaXJpbmcgb25lIGV4dHJhIGFzc2lzdGFudCkuIEVQIGVsZWN0aW9ucyBoYXZlIGEgbGFyZ2VyIGVmZmVjdCAoMCwzNTUpLCBjb21wYXJhYmxlIHRvIHRoZSBlbGVjdG9yYWwgc3lzdGVtIHZhcmlhYmxlcy4gT3ZlcmFsbCB0aGUgZWxlY3RvcmFsIGluY2VudGl2ZXMgZXhpc3QsIGJ1dCB0aGV5IGFyZSBtb2Rlc3QuIE1FUHMgZG8gYXBwZWFyIHRvIHVzZSBwYXJsaWFtZW50YXJ5IHJlc291cmNlcyBmb3IgZWxlY3RvcmFsIHB1cnBvc2VzLCBidXQgdGhlIG1hZ25pdHVkZSBpcyBzbWFsbC4gQ29tYmluZWQgd2l0aCB0aGUgZmFjdCB0aGF0IG9ubHkgMzEgJSBvZiBNRVBzIHBsYW4gdG8gc2VlayByZWVsZWN0aW9uLCB0aGUgdHJ1ZSBlZmZlY3QgYW1vbmcgdGhvc2Ugd2hvIGFjdHVhbGx5IHJlc3BvbmQgdG8gZWxlY3RvcmFsIGluY2VudGl2ZXMgaXMgbGlrZWx5IGxhcmdlciB0aGFuIHdoYXQgd2UgZXN0aW1hdGUgaGVyZS4KCi0tLQoKIyMjIEV4ZXJjaXNlIDU6IEludGVyYWN0aW9uIGVmZmVjdAoqKkNvbnRleHQ6KiogSSBoYXZlIGEgdGhpcmQgaHlwb3RoZXNpczogSSBiZWxpZXZlIE1FUHMgd2l0aCBoaWdoZXIgaW5jZW50aXZlcyB0byBjdWx0aXZhdGUgYSBwZXJzb25hbCB2b3RlIGFyZSBtb3JlIHNlbnNpdGl2ZSB0byB0aGUgZWxlY3RvcmFsIGNhbGVuZGFyLgoKKipRMSArIFEyOioqIEhvdyBjb3VsZCBJIG1vZGVsIHRoaXMgQ2FuIHlvdSBpbXBsZW1lbnQgeW91ciBzdWdnZXN0aW9uIHVzaW5nIGEgcmFuZG9tLWludGVyY2VwdCBtb2RlbD8/CgoqKkExICsgQTI6KiogVGhpcyBoeXBvdGhlc2lzIHNheXMgdGhhdCB0aGUgZWZmZWN0IG9mIHRoZSBlbGVjdG9yYWwgY2FsZW5kYXIgZGVwZW5kcyBvbiB0aGUgZWxlY3RvcmFsIHN5c3RlbS4gVGhhdCBpcyBhbiBpbnRlcmFjdGlvbiBlZmZlY3QuIEkgd291bGQgaW5jbHVkZSBhbiBpbnRlcmFjdGlvbiB0ZXJtIGJldHdlZW4gUHJveE5hdEVsZWN0aW9uIGFuZCBOYXRpb25hbENhbmRpZGF0ZUNlbnRlcmVkLgoKYGBge3J9Cm1vZC5pbnQgPC0gbG1lcihTaGFyZU9mTG9jYWxBc3Npc3RhbnRzIH4gUHJveE5hdEVsZWN0aW9uICogTmF0aW9uYWxDYW5kaWRhdGVDZW50ZXJlZCArIEVQRWxlY3Rpb24gKyBPcGVuTGlzdCArIFNoYXJlT2ZMb2NhbC5sYWcgKyAoMXxJRCksIGRhdGEgPSBkZikKYGBgCgpgYGB7cn0Kc3VtbWFyeShtb2QuaW50KQpgYGAKCi0tLQoKKipRMzoqKiBDYW4geW91IGludGVycHJldCB0aGUgcmVzdWx0cyBmb2xsb3dpbmcgdGhlIEJlcnJ5IGV0IGFsLnMgcmVjb21tZW5kYXRpb24/IFdoYXQgaXMgdGhlIGXvrIBlY3Qgb2Y6IG5hdGlvbmFsIGVsZWN0b3JhbCBjYWxlbmRhciB3aGVuIGVsZWN0b3JhbCBzeXN0ZW0gaXMgY2FuZGlkYXRlLWNlbnRlcmVkLCBuYXRpb25hbCBlbGVjdG9yYWwgY2FsZW5kYXIgd2hlbiBlbGVjdG9yYWwgc3lzdGVtIGlzIHBhcnR5LWNlbnRlcmVkLCBuYXRpb25hbCBlbGVjdG9yYWwgc3lzdGVtIHdoZW4gZWxlY3RvaW5zIGFyZSBmYXIgYXdheSwgYW5kIG5hdGlvbmFsIGVsZWN0b3JhbCBzeXN0ZW0gd2hlbiBlbGVjdG9ucyBhcmUgdG9tb3Jyb3c/CgoqKkEzOioqIEZvbGxvd2luZyBCZXJyeSBldCBhbC4sIEkgY29tcHV0ZSB0aGUgY29uZGl0aW9uYWwgZWZmZWN0cyBhdCBtZWFuaW5nZnVsIHZhbHVlcyByYXRoZXIgdGhhbiBpbnRlcnByZXRpbmcgdGhlIGludGVyYWN0aW9uIHRlcm0gYWxvbmUuIEVmZmVjdCBvZiBlbGVjdG9yYWwgY2FsZW5kYXIgd2hlbiBjYW5kaWRhdGUtY2VudGVyZWQgKE5DQyA9IDEpOiAwLDA2OCBwZXIgdW5pdC4gTUVQcyBpbiBjYW5kaWRhdGUtY2VudGVyZWQgc3lzdGVtcyBoaXJlIG1vcmUgc3RhZmYgYXMgZWxlY3Rpb25zIGFwcHJvYWNoLiBFZmZlY3Qgb2YgZWxlY3RvcmFsIGNhbGVuZGFyIHdoZW4gcGFydHktY2VudGVyZWQgKE5DQyA9IDApOiAtMCwwMTcgcGVyIHVuaXQuIENsb3NlIHRvIHplcm8gYW5kIG5vdCBzaWduaWZpY2FudC4gTUVQcyBpbiBwYXJ0eS1jZW50ZXJlZCBzeXN0ZW1zIGRvIG5vdCByZXNwb25kIHRvIHRoZSBlbGVjdG9yYWwgY2FsZW5kYXIuIEVmZmVjdCBvZiBlbGVjdG9yYWwgc3lzdGVtIHdoZW4gZWxlY3Rpb25zIGFyZSBmYXIgYXdheSAoUHJveCA9IC00KTogMCwyMDQuIEEgc21hbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gc3lzdGVtcyB3aGVuIHRoZXJlIGlzIG5vIGVsZWN0b3JhbCBwcmVzc3VyZS4gRWZmZWN0IG9mIGVsZWN0b3JhbCBzeXN0ZW0gd2hlbiBlbGVjdGlvbnMgYXJlIHRvbW9ycm93IChQcm94ID0gMCk6IDAsNTQxLiBBIG11Y2ggbGFyZ2VyIGRpZmZlcmVuY2UuIENhbmRpZGF0ZS1jZW50ZXJlZCBNRVBzIGhhdmUgYWJvdXQgaGFsZiBhbiBhc3Npc3RhbnQgbW9yZSB0aGFuIHBhcnR5LWNlbnRlcmVkIE1FUHMgcmlnaHQgYmVmb3JlIGFuIGVsZWN0aW9uLiBUaGUgcGF0dGVybiBpcyBjbGVhci4gVGhlIHR3byBzeXN0ZW1zIG9ubHkgZGl2ZXJnZSB3aGVuIGVsZWN0aW9ucyBhcmUgbmVhci4gV2hlbiBlbGVjdGlvbnMgYXJlIGZhciBhd2F5LCBpdCBkb2VzIG5vdCBtYXR0ZXIgbXVjaCB3aGV0aGVyIHRoZSBzeXN0ZW0gaXMgY2FuZGlkYXRlLWNlbnRlcmVkIG9yIHBhcnR5LWNlbnRlcmVkLiBUaGlzIHN1cHBvcnRzIGh5cG90aGVzaXMgMy4KCmBgYHtyfQojIENvbXB1dGUgY29uZGl0aW9uYWwgZWZmZWN0cwpiX3Byb3ggPC0gZml4ZWYobW9kLmludClbIlByb3hOYXRFbGVjdGlvbiJdCmBgYAoKYGBge3J9CiMgQ29tcHV0ZSBjb25kaXRpb25hbCBlZmZlY3RzCmJfbmNjICA8LSBmaXhlZihtb2QuaW50KVsiTmF0aW9uYWxDYW5kaWRhdGVDZW50ZXJlZCJdCmBgYAoKYGBge3J9CiMgQ29tcHV0ZSBjb25kaXRpb25hbCBlZmZlY3RzCmJfaW50ICA8LSBmaXhlZihtb2QuaW50KVsiUHJveE5hdEVsZWN0aW9uOk5hdGlvbmFsQ2FuZGlkYXRlQ2VudGVyZWQiXQpgYGAKCmBgYHtyfQojIEVmZmVjdCBvZiBjYWxlbmRhciB3aGVuIGNhbmRpZGF0ZS1jZW50ZXJlZApiX3Byb3ggKyBiX2ludCAqIDEKYGBgCgpgYGB7cn0KIyBFZmZlY3Qgb2YgY2FsZW5kYXIgd2hlbiBwYXJ0eS1jZW50ZXJlZApiX3Byb3ggKyBiX2ludCAqIDAKYGBgCgpgYGB7cn0KIyBFZmZlY3Qgb2Ygc3lzdGVtIHdoZW4gZWxlY3Rpb25zIGZhciBhd2F5IChQcm94ID0gLTQpCmJfbmNjICsgYl9pbnQgKiAoLTQpCmBgYAoKYGBge3J9CiMgRWZmZWN0IG9mIHN5c3RlbSB3aGVuIGVsZWN0aW9ucyB0b21vcnJvdyAoUHJveCA9IDApCmJfbmNjICsgYl9pbnQgKiAwCmBgYA==