As finally, instead of 5 session we are going to have almost 3 sessions, then instead of a mini-course we are going to have a express-mini-course: a quick and dirty introduction to the basics of structural VAR models.

0. Intro.

Imagine you are a researcher, or better, imagine that you are the the Economy Minister of a European country, for instance Spain, and you need to know how your country is influenced by economic external forces. We are going to use an statistical approach to try to solve the problem.That is we are going to use a statistical model. But which one? VAR models of course, this is the subject of the mini-course.

OK, but the original question (“how your country is influenced by economic external forces?”) is too wide to be tractable. Let’s made the question more specific. We have heard that there exists an international cycle and an European cycle, then the question is how Spain reacts to the international and European cycle. What are their influence in the Spanish economy.

Even more precisely, we are going to try to answer two questions:

  1. What will happen to Spanish economy if something positive (a positive shock) happens in the international cycle or in the European business cycle. (IRF)

  2. What is the importance of international and European cycle in the Spanish economic fluctuations? (FEVD)

OK, we are going to use statistical models, then we will need data. But wait, we already have data, last class we have downloaded some variables. We have downloaded from Eurostat a bunch of series. In particular we are going to use 3 series of “GDP volume” for USA, E15 and our country, in that case Spain.


To think: we will use 3 variables. Are they enough to answer the two questions or we are going to need more variables/information?


We are going to use a statistical approach and we have 3 variables. We can think that the 3 variables are a system where each variable influence the others others, they are interdependent. For instance, changes in US (as a proxy of the international cycle) will impact Spain and Europe. Changes in Europe will also impact on the international economy and of course in the Spanish economy. That is, I think we should treat the 3 variables as endogenous.

Then … what type of statistical models we could use? For instance we could use “Simultaneous equations”. But wait, those systems were criticised by Sims in 1980 because they use that he called “incredible identification restrictions”.

OK, let’s follow Sims’s 1980 proposal and use VAR models. First, before to estimate the VAR model, we have to specify, to write it down.

1. Specification & estimation

Well, a VAR model is really “easy” to specify. You only need to select a bunch of variables to answer your questions. We have already done that. We have selected 3 variables, and, following Sims’s proposal, we are going to:

treat all variables as endogenous (and first estimate an unrestricted model in a reduced form). No prior knowledge is used except to decide which variables should enter the system.


To think: in the last sentence there is a tricky part “first estimate an unrestricted model in a reduced form”. Try to understand it. What does mean? It’s not easy if you don’t have the right background. We will try at class.


Our model is described by this set of equations:

\[\left\{ \begin{array}{c} US_{t}= \beta US_{t-1} + \beta US_{t-2} + \beta E15_{t-1} + \beta E15_{t-2} + \beta ES_{t-1} + \beta ES_{t-2} + v_{t}^{US} \\ E15_{t}= \beta US_{t-1} + \beta US_{t-2} + \beta E15_{t-1} + \beta E15_{t-2} + \beta ES_{t-1} + \beta ES_{t-2} + v_{t}^{E15} \\ ES_{t}= \beta US_{t-1} + \beta US_{t-2} + \beta E15_{t-1} + \beta E15_{t-2} + \beta ES_{t-1} + \beta ES_{t-2} + v_{t}^{ES} \end{array}% \right\} \]


But, it’s better to write the model in a more compact form:

\[y_{t}~=A_{1}y_{t-1}+A_{2}y_{t-2}+v_{t}\]

The model has only two lags, but in general the VAR would be:

\[y_{t}~=A_{1}y_{t-1}+A_{2}y_{t-2}+\ \ ...\ \ +A_{p}y_{t-p}+v_{t}\ \ \ \ \ \ \ \ \ \ [2]\]

Model \([2]\) can be written using a polynomial in the lag operator as:

\[A(L)y_{t}=v_{t}\ \ \ \ \ \ \ \ \ \ [3]\]

with \(A(L)=(I_{K}-A_{1}L^{1}-A_{2}L^{2}-...-A_{p}L^{p})\)


OK, but there is something that we have to solve: we have to choose how many lags will have our model, 2, 3 , 4? OK, but this will be in a moment, first we have to talk a little about the estimation method we are going to use to estimate our model.

Well, you should know that, if the system is stationary then, as all the equations in the VAR share the same set of regressors and all of them are lagged variables, the VAR could be estimated efficiently by OLS for each equation separately.

BUT, be aware that, in order to estimate the system by OLS is crucial that the error terms (\(v_{t}\)) should NOT to be autocorrelated.

Remember also that in the context of VAR methodology, usually the error terms (\(v_{t}\)) are called innovations.

Besides that, if the innovations are normally distributed (Gaussian) then we could apply usual inference methods, like t-test.


To think: VAR models assume \(v_{t}\rightarrow N(0,\Sigma _{v})\). Do you think there are contemporaneous correlation among the innovation? Do you think the innovations are autocorrelated? Be aware that they are completely different questions


In plain English: before to use a VAR models we have to check if the system of variables is stationary, then, as all of the regressors are in the past \(y_{t-k}\), they are “like-exogenous” variables and then we could estimate the parameters of the model by OLS, BUT remember that the \(v_{t}\) should shown no autocorrelation; that is we should check, after estimation, that the model residuals \(\widehat{v}_{t}\) shown NO-autocorrelation

Besides that, if the innovations \((v_{t})\) follow a Gaussian distribution then we could use the usual inference methods. Then, we should check also,the normality of the residuals \((\widehat{v}_{t})\).


OK. Let’s practise this in R:

  • First we have to load the packages:
  • Second, we have to load and clean the data
  • “Cleaning” the data


  • third, We start to specify/estimate our VAR

1.b How many lags?

We have to decide how may lags will our VAR have. There are two strategies:

  - 1 Use information criteria methods      

  - 2 LR tests     
    1. Using information criteria methods

To think: If we use the information criteria methods, How many lags we should use in our VAR?


  1. (Selecting the VAR order) With a sequence of LR test

To think: How many lags? five, four? 3?


Well, finally we are going to use ……. 4 lags. Why? Don’t think too much why. One part of the reason is because I like the 4’s. I will explain at class


2. Estimation of the VAR

We could estimate the equations of the model by OLS with the function lm(), but it’s more convenient to use the function VAR() from the vars package

# ESTIMATING the VAR.  Wchich estimation method? -------------------
VAR(variables, p = 4, type = "const") 
#> 
#> VAR Estimation Results:
#> ======================= 
#> 
#> Estimated coefficients for equation dlVol_us: 
#> ============================================= 
#> Call:
#> dlVol_us = dlVol_us.l1 + dlVol_15.l1 + dlVol.l1 + dlVol_us.l2 + dlVol_15.l2 + dlVol.l2 + dlVol_us.l3 + dlVol_15.l3 + dlVol.l3 + dlVol_us.l4 + dlVol_15.l4 + dlVol.l4 + const 
#> 
#>  dlVol_us.l1  dlVol_15.l1     dlVol.l1  dlVol_us.l2  dlVol_15.l2     dlVol.l2 
#>  0.140093381  0.295964967  0.143893073  0.139667150 -0.327344186  0.206879448 
#>  dlVol_us.l3  dlVol_15.l3     dlVol.l3  dlVol_us.l4  dlVol_15.l4     dlVol.l4 
#>  0.163086359 -0.180943519 -0.136893996  0.124946814  0.076233386 -0.132598632 
#>        const 
#>  0.002717087 
#> 
#> 
#> Estimated coefficients for equation dlVol_15: 
#> ============================================= 
#> Call:
#> dlVol_15 = dlVol_us.l1 + dlVol_15.l1 + dlVol.l1 + dlVol_us.l2 + dlVol_15.l2 + dlVol.l2 + dlVol_us.l3 + dlVol_15.l3 + dlVol.l3 + dlVol_us.l4 + dlVol_15.l4 + dlVol.l4 + const 
#> 
#>  dlVol_us.l1  dlVol_15.l1     dlVol.l1  dlVol_us.l2  dlVol_15.l2     dlVol.l2 
#>  0.312546349  0.295221509  0.267150050 -0.043354238  0.192629282 -0.335045789 
#>  dlVol_us.l3  dlVol_15.l3     dlVol.l3  dlVol_us.l4  dlVol_15.l4     dlVol.l4 
#>  0.033803245 -0.158348439  0.201270684  0.044236237 -0.220792252  0.097898876 
#>        const 
#>  0.000303764 
#> 
#> 
#> Estimated coefficients for equation dlVol: 
#> ========================================== 
#> Call:
#> dlVol = dlVol_us.l1 + dlVol_15.l1 + dlVol.l1 + dlVol_us.l2 + dlVol_15.l2 + dlVol.l2 + dlVol_us.l3 + dlVol_15.l3 + dlVol.l3 + dlVol_us.l4 + dlVol_15.l4 + dlVol.l4 + const 
#> 
#>   dlVol_us.l1   dlVol_15.l1      dlVol.l1   dlVol_us.l2   dlVol_15.l2 
#>  0.2186416876  0.1671758970  0.4423969917 -0.0684337381 -0.0911756220 
#>      dlVol.l2   dlVol_us.l3   dlVol_15.l3      dlVol.l3   dlVol_us.l4 
#>  0.0387725148  0.0696371929 -0.3593828587  0.4065999884  0.1854258434 
#>   dlVol_15.l4      dlVol.l4         const 
#> -0.2156336442  0.0908045089 -0.0003369354


Let’s estimate again, but instead of showing the results, we are going to assign them to the our_var object:


To DO: please take a look at the “our_var” object. What it is? What it contains?


In fact, now you can check if our estimated VAR model is stable:

Let’s look at the estimation results in two different ways, using two functions of the varspackage:

# LOOKING at the results of the estimated VAR ----------------
summary(our_var)
#> 
#> VAR Estimation Results:
#> ========================= 
#> Endogenous variables: dlVol_us, dlVol_15, dlVol 
#> Deterministic variables: const 
#> Sample size: 95 
#> Log Likelihood: 1218.92 
#> Roots of the characteristic polynomial:
#> 0.8642 0.8642 0.7348 0.7348 0.7241 0.7241 0.6111 0.6111 0.5043 0.5043 0.3835 0.3835
#> Call:
#> VAR(y = variables, p = 4, type = "const")
#> 
#> 
#> Estimation results for equation dlVol_us: 
#> ========================================= 
#> dlVol_us = dlVol_us.l1 + dlVol_15.l1 + dlVol.l1 + dlVol_us.l2 + dlVol_15.l2 + dlVol.l2 + dlVol_us.l3 + dlVol_15.l3 + dlVol.l3 + dlVol_us.l4 + dlVol_15.l4 + dlVol.l4 + const 
#> 
#>              Estimate Std. Error t value Pr(>|t|)   
#> dlVol_us.l1  0.140093   0.121641   1.152   0.2528   
#> dlVol_15.l1  0.295965   0.220481   1.342   0.1832   
#> dlVol.l1     0.143893   0.222556   0.647   0.5197   
#> dlVol_us.l2  0.139667   0.126960   1.100   0.2745   
#> dlVol_15.l2 -0.327344   0.225351  -1.453   0.1502   
#> dlVol.l2     0.206879   0.224822   0.920   0.3602   
#> dlVol_us.l3  0.163086   0.127043   1.284   0.2029   
#> dlVol_15.l3 -0.180944   0.221553  -0.817   0.4165   
#> dlVol.l3    -0.136894   0.232695  -0.588   0.5579   
#> dlVol_us.l4  0.124947   0.126970   0.984   0.3280   
#> dlVol_15.l4  0.076233   0.210008   0.363   0.7175   
#> dlVol.l4    -0.132599   0.228841  -0.579   0.5639   
#> const        0.002717   0.001020   2.664   0.0093 **
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> 
#> Residual standard error: 0.005333 on 82 degrees of freedom
#> Multiple R-Squared: 0.2971,  Adjusted R-squared: 0.1943 
#> F-statistic: 2.889 on 12 and 82 DF,  p-value: 0.002265 
#> 
#> 
#> Estimation results for equation dlVol_15: 
#> ========================================= 
#> dlVol_15 = dlVol_us.l1 + dlVol_15.l1 + dlVol.l1 + dlVol_us.l2 + dlVol_15.l2 + dlVol.l2 + dlVol_us.l3 + dlVol_15.l3 + dlVol.l3 + dlVol_us.l4 + dlVol_15.l4 + dlVol.l4 + const 
#> 
#>               Estimate Std. Error t value Pr(>|t|)    
#> dlVol_us.l1  0.3125463  0.0876809   3.565 0.000611 ***
#> dlVol_15.l1  0.2952215  0.1589262   1.858 0.066815 .  
#> dlVol.l1     0.2671500  0.1604216   1.665 0.099669 .  
#> dlVol_us.l2 -0.0433542  0.0915145  -0.474 0.636943    
#> dlVol_15.l2  0.1926293  0.1624364   1.186 0.239097    
#> dlVol.l2    -0.3350458  0.1620552  -2.067 0.041842 *  
#> dlVol_us.l3  0.0338032  0.0915744   0.369 0.712979    
#> dlVol_15.l3 -0.1583484  0.1596991  -0.992 0.324338    
#> dlVol.l3     0.2012707  0.1677301   1.200 0.233607    
#> dlVol_us.l4  0.0442362  0.0915217   0.483 0.630141    
#> dlVol_15.l4 -0.2207923  0.1513774  -1.459 0.148507    
#> dlVol.l4     0.0978989  0.1649520   0.593 0.554481    
#> const        0.0003038  0.0007352   0.413 0.680573    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> 
#> Residual standard error: 0.003844 on 82 degrees of freedom
#> Multiple R-Squared: 0.5715,  Adjusted R-squared: 0.5088 
#> F-statistic: 9.114 on 12 and 82 DF,  p-value: 0.00000000007436 
#> 
#> 
#> Estimation results for equation dlVol: 
#> ====================================== 
#> dlVol = dlVol_us.l1 + dlVol_15.l1 + dlVol.l1 + dlVol_us.l2 + dlVol_15.l2 + dlVol.l2 + dlVol_us.l3 + dlVol_15.l3 + dlVol.l3 + dlVol_us.l4 + dlVol_15.l4 + dlVol.l4 + const 
#> 
#>               Estimate Std. Error t value Pr(>|t|)   
#> dlVol_us.l1  0.2186417  0.0842222   2.596  0.01117 * 
#> dlVol_15.l1  0.1671759  0.1526571   1.095  0.27668   
#> dlVol.l1     0.4423970  0.1540936   2.871  0.00521 **
#> dlVol_us.l2 -0.0684337  0.0879046  -0.779  0.43851   
#> dlVol_15.l2 -0.0911756  0.1560289  -0.584  0.56059   
#> dlVol.l2     0.0387725  0.1556627   0.249  0.80392   
#> dlVol_us.l3  0.0696372  0.0879621   0.792  0.43084   
#> dlVol_15.l3 -0.3593829  0.1533996  -2.343  0.02156 * 
#> dlVol.l3     0.4066000  0.1611137   2.524  0.01354 * 
#> dlVol_us.l4  0.1854258  0.0879115   2.109  0.03797 * 
#> dlVol_15.l4 -0.2156336  0.1454061  -1.483  0.14191   
#> dlVol.l4     0.0908045  0.1584452   0.573  0.56815   
#> const       -0.0003369  0.0007062  -0.477  0.63457   
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> 
#> Residual standard error: 0.003693 on 82 degrees of freedom
#> Multiple R-Squared: 0.7331,  Adjusted R-squared: 0.6941 
#> F-statistic: 18.77 on 12 and 82 DF,  p-value: < 0.00000000000000022 
#> 
#> 
#> 
#> Covariance matrix of residuals:
#>             dlVol_us   dlVol_15       dlVol
#> dlVol_us 0.000028443 0.00000884 0.000007696
#> dlVol_15 0.000008840 0.00001478 0.000010160
#> dlVol    0.000007696 0.00001016 0.000013636
#> 
#> Correlation matrix of residuals:
#>          dlVol_us dlVol_15  dlVol
#> dlVol_us   1.0000   0.4312 0.3908
#> dlVol_15   0.4312   1.0000 0.7157
#> dlVol      0.3908   0.7157 1.0000

To DO: Please take a look at the results. Please have another more close look at the Covariance matrix of residuals. The residuals are contemporaneously correlated? They are autocorrelated?



Another look at the results of the VAR estimation, now using the Acoef()function of the vars package:


To Think: What are this results? Are the same results previously seen or are other results? Why we need this matrices?. (the first two questions are obvious, but not the third)


Before to use our estimated VAR we should check if the residuals are correlated (autocorrelation)

We have to check also for Normality of residuals.

OK, more or less, our estimated VAR model is “valid”, then we could now use our estimated VAR to perform some task,for instance to test for Granger causality or for forecasting:

But our objective is not to forecast, it’s in some way related, but in reality is a little bite different.

3. Obtaining the VMA representation

OK. We have estimated a VAR model …. BUT we have not answered the two questions we want to ask:

  1. What is the response of the Spanish economy to a shock in the international cycle or in the European business cycle. (IRF)

  2. What is the importance of international and European cycle in the Spanish economic fluctuations? (FEVD)


In order to answer those questions we need to work a little bite more. First we have to obtain the VMA representation of our VAR model. That is, we have to “invert” our model. How and why? The idea is the same that Mariam explained to you, something like:

every stationary AR process have a MA representation

As we are now with VAR (vectorial-AR) we would obtain a vectorial-MA (VMA), but the idea is the same. Let’s do it (by hand) for a VAR with only 1 lag:

Finally we have that our vector of variables \(y_{t}\) as a function of the innovations in \(t\), in \(t-1\), \(t-2\) …. This is the VMA representation. The variables in function of actual and past values of innovations (\(v_{t}\)).

Usually we rename the matrices to call them \(C_{i}\) and the VMA that you see in papers and books usually is written like:

\[y_{t}~=C_{0}v_{t}+C_{1}v_{t-1}+C_{2}v_{t-2}+\ ...\ [3]\]

being \(C_{0}=I_{K}\), the rest of the \(C_{i}\) are computed recursively from the VAR representation , that is they are function of the \(A_{i}\) matrices.

As with the VAR, model \([3]\) can be written using a polynomial in the lag operator as:

\[y_{t}=C(L)v_{t}\ \ \ \ \ \ \ \ \ \ \ \ [4]\]

being \(C(L)=(I_{K}+C_{1}L^{1}+C_{2}L^{2}+\ \ ...)\).

OK, but why we need this new representation of our system \(y_{t}\). For different reason, but in the context of VAR models, because the VMA representation, that is, the sequence of \(C_{i}\) matrices provide the IRF1, that is, this sequence of \(C_{i}\) provide the answer to our first question.

For instance, in our example, Imagine that:

\[y_{t}=\left[ \begin{array}{c} USA_{t} \\ U15_{t} \\ ESP_{t}% \end{array}% \right] \ \ \ \ v_{t}=\left[ \begin{array}{c} v_{t}^{USA} \\ v_{t}^{E15} \\ v_{t}^{ESP}% \end{array}% \right] \]

\[y_{t}~=C_{0}v_{t}+C_{1}v_{t-1}+C_{2}v_{t-2}+C_{3}v_{t-3}+C_{4}v_{t-4}+...\]

\[y_{t}~=\left[ \begin{array}{cc} 1.0 & 0.0 & 0.0 \\ 0.0 & 1.0 & 0.0 \\ 0.0 & 0.0 & 1.0% \end{array}% \right] v_{t}+\left[ \begin{array}{cc} 1.1 & 1.2 & 1.3 \\ 1.4 & 1.5 & 1.6 \\ 1.7 & 1.8 & 1.9% \end{array}% \right] v_{t-1}+\left[ \begin{array}{cc} 2.1 & 2.2 & 2.3 \\ 2.4 & 2.5 & 2.6 \\ 2.7 & 2.8 & 2.9% \end{array}% \right] v_{t-2}+\left[ \begin{array}{cc} 3.1 & 3.2 & 3.3 \\ 3.4 & 3.5 & 3.6 \\ 3.7 & 3.8 & 3.9% \end{array}% \right] v_{t-3}+...\]


TO DO: Track what are going to be the effect in 2020, 2021, 2022 & 2023 in the US Vol_GDP if a innovation of size 1 in \(v^{USA}\) happens today(2020). That is I’m asking you to calculate what will be the effect thought time (t, t+1, t+2 …) on USA of an innovation of size 1 in his own equation, that is in \(v_{t}^{USA}\)


The answer is: 1, 1.1, 2.1, 3.1 ….


TO DO: Track what are going to be the effect on Spain in 2020 2021, 2022 & 2023 if today (2020) there is an innovation of size 1 in \(v^{E15}\). That is I’m asking you to calculate what will be the effect thought time on Spain of an innovation of size 1 in \(v^{E15}\). Please, make an effort, it is really important to notice and to understand this.


Then, we have solved already our first question, that is, in order to to estimate what the effects of USA & E15 in the Spanish economy we have first to estimate a VAR and then, to invert the polynomial to obtain the sequence of \(C\) matrices, that is the \(C(L)\) polynomial.

And, that’s all? Do you think things are so easy? Obviously No, it’s only part of the process, we will continue explaining this latter.

Now, let’s obtain the VMA representation of our_var with R.


TO DO: Track what are the estimated effect of an US “shock” in the Spanish economy.


To finish the second class. In fact the first class of the express course we have to understand why the Wold VMA is NOT USEFUL.

Why it’s not useful the \(y_{t}~= C(L)v_{t}= C_{0}v_{t}+C_{1}v_{t-1}+C_{2}v_{t-2}+C_{3}v_{t-3}+C_{4}v_{t-4}+...\)?

The why is in the variance-covariance matrix of the innovations \(\Sigma _{v}\), this matrix it’s usually not diagonal. That it’s the innovations are contemporaneously correlated and we think, we believe, that a true structural shock should be “independent”, orthogonal to other structural shocks.

In a more formal way:

BUT, usually the VAR disturbances (or innovations) are correlated, so the interpretability of the impulse responses to innovation becomes problematic: if the innovations are correlated (off diagonal elements of \(\Sigma _{v}\) different from zero) then, an impulse in for instance, \(v_{USA}\) would be associated with impulses in innovations in the other equations of the VAR model. In other words, as the innovations are not likely to occur in isolation, then tracking the effect of an innovation in isolation does not reflect what actually happens in the system after an innovation hits the system.


4. Structural VARs

OK, we can estimate a VAR and after estimation, we can an invert obtaining something “close”, something that is similar to the IRF’s we want to obtain. In fact they are not the true IRF’s because they are not really structural. Due to the fact that innovations (\(v_{t}\)) are correlated, then they can’t be interpreted as the IRF’s we want, because we would like to have IRF’s to structural shocks.

To interpret the VAR in an economically meaningful way, we need to “transform” the vector of innovations(\(v_{t}\)) into “structural” shocks (\(\varepsilon _{t}\)), like monetary policy shocks, productivity shocks, … and ideally the structural shocks should be: 1) orthogonal shocks 2) shocks with economic meaning.

That’s now our objective to transform our system in a way that our variables, the \(y_{t}\), instead of being function of the innovations (\(v_{t}\)), they were function of structural shocks (\(\varepsilon_{t}\)).

Remember, that inverting the VAR, we can obtain easily the (Wold) VMA representation: \(y_{t} = C(L)v_{t}\) where \(\Sigma _{v}\) is not the identity, then the innovations are correlated. BUT we would like to obtain something like \(y_{t} = D(L)\varepsilon_{t}\) where \(\Sigma _{\varepsilon }=I\)

Transforming the system from one equation to the other is in fact a mathematical problem, and Sims is a mathematician. In fact, their first proposal was:

The structural VAR methodology first estimate an unrestricted model in a reduced form. No prior knowledge is used except to decide which variables should enter the system.

Sims’s original idea to obtain IRF & FEVD was to assume recursive contemporaneous interactions among variables, i.e. by imposing a certain structural ordering of the variables. In terms of the moving average (MA) representation, the structural shocks do not affect preceding variables simultaneously. In fact he proposed to use the Cholesky decomposition.

Let’s try to explain this last cryptic sentence.

To obtain/estimate an structural VAR, the usual procedure is:

  • first a (reduced form) VAR model is estimated

  • we could invert the VAR to obtain the (Wold) VMA but it’s not really useful. We can obtain (1), but we want a structural model (2)

  • from the Wold or reduced form VMA representation we will obtain the structural VAR.


In a diagram:


Equation (2) will be the structural VAR, in fact is, more precisely the structural VMA representation for our system of variables \(y_{t}\) , and we want obtain this structural VAR in order to answer our two questions.


4.1 Sims’s first proposal

The first proposal to “recover” the structural information from the reduced form estimates was made by Sims in 1980.

In particular, Sims(1980) propose to use the Cholesky decomposition to obtain (2) from (1). Let’s develop it a little:

  • Cholesky found that every symmetric definite positive matrix, let’s call it \(M\), admits a unique factorisation like \(M = PP^{^{\prime }}\). Where \(P\) is called the Cholesky factor, being \(P\) a lower triangular matrix.

  • Sims is a mathematician and he obviously knew the Cholesky decomposition, then he proposed in his 1980 paper to use the Cholesky factorisation in order to transform our reduced form VAR to a “structural” one. Structural in the sense that the transformed “innovations” were orthogonal. Let’s explain this a little bite more:

  • The variance-covariance matrix of our VAR, the \(\Sigma _{v}\), as it is a variance-covariance matrix, it admit the Cholesky decomposition: \(\Sigma _{v} = PP^{^{\prime }}\), where \(P\) is the Cholesky factor; that is \(P\) matrix has some properties:

    1. \(P\) is lower triangular, and
    2. \(P^{-1}\Sigma _{v}P^{{-1}^{\prime}}= I\)

Then, Sims proposes to transform the reduced form VMA representation (1), like this:

  • \(y_{t} = C(L)v_{t}\)

  • \(y_{t}= C(L) PP^{-1}v_{t}\)

At first, this transformation seems stupid, because it seems that we are complicating things, but let’s concentrate on a specific part of the last equation: \(P^{-1}v_{t}\).

  • In fact, \(P^{-1}v_{t}\) is a transformation/rotation of the innovations. We are multiplying, we are transforming, the innovations, the \(v_{t}\), and then obtaining a new vector of “innovations”. We can call those new innovations as we want, for instance, we can call them \(\varepsilon_{t}\); that is, \(P^{-1}v_{t} = \varepsilon_{t}\).

Let’s see what are the covariance matrix of these new “innovations” that we have called \(\varepsilon_{t}\). Do you guess?


That is, the “transformed innovations”, the \(\varepsilon_{t}\), are not correlated, they are orthogonal …. then Sims interpreted them as structural shocks. Good, BUT his proposal received some critiques as well, … but we will see the critiques to Sims’s proposal latter.


By now let’s return to:

  • \(y_{t}= C(L) PP^{-1}v_{t}\) as we have call \(P^{-1}v_{t} = \varepsilon_{t}\), in fact we have:

  • \(y_{t}= C(L) P\varepsilon_{t}\)


TO THINK: The last equation \(y_{t}= C(L) P\varepsilon_{t}\) is a structural model? Could it be used to obtain the answers to our two questions (the importance of the European shock into the Spanish economy)? How can we obtain this new representation of \(y_{t}\), the so called structural VAR model claimed by Sims?


In fact we can call \(C(L)P = D(L)\), and then, we will have \(y_{t}= D(L) \varepsilon_{t}\), and the \(D(L)\) will give us the response of the variables of our system (\(y_{t}\)) to a vector of shocks that are orthogonal (\(\varepsilon_{t}\)).


TO THINK: How we can calculate the D(L)?


Think that \(C(L)P = D(L)\); that is,

\[(C_{0} + C_{1}L + C_{2}L^{2}) P = D_{0} + D_{1}L + D_{2}L^{2}\]

That is :

  • \(C_{0} P = D_{0}\)

  • \(C_{1} P = D_{1}\)


That’s was the proposal of Sims to estimate structural IRF’s: it consists on first to estimate a VAR (in reduced form), invert the autoregressive polynomial to obtain the (reduced form) VMA representation for \(y_{t}\), an finally to use the Cholesky factor to transform the reduced form VMA to a “structural” representation. In more technical words:

Sims’s original idea was to obtain IRF&FEVD was to assume recursive contemporaneous interactions among variables, i.e. by imposing a certain structural ordering of the variables. In terms of the moving average (MA) representation, the structural shocks do not affect preceding variables simultaneously (Cholesky)

By now you should start to understand this last sentence. There is still a tricky part there: the “assume recursive contemporaneous interaction” part.

To finally understand the sentence, we should return to the structural VAR representation:

\[y_{t}= C(L) P\varepsilon_{t} = D(L)\varepsilon_{t}\]

and to remember that \(D_{0} = P\) and that \(P\) is lower triangular , then ….. when we transform the reduced VMA to obtain the structural VMA at the end we are doing, we are imposing, that the matrix that gives the contemporaneous or instantaneous effect of the structural shocks \(\varepsilon_{t}\) it’s in some sense recursive. We are imposing a recursive structural among our 3 equations.

\[y_{t}~=D_{0}\varepsilon_{t}+D_{1}\varepsilon_{t-1}+D_{2}\varepsilon_{t-2}+D_{3}\varepsilon_{t-3}+\varepsilon_{4}v_{t-4}+...\]

The matrix \(D_{0}\) contains the contemporaneous/instantaneous response of the variables (\(y_{t}\)) to the structural shocks \(\varepsilon_{t}\). AND, how it is \(D_{0}\)?


TO THINK: How it is \(D_{0}\)? Lower triangular, Why? and, what does implies that \(D_{0}\) is lower triangular?


If \(D_{0}\) is lower triangular, that means that an “innovation” (in fact now, a structural shock , \(\varepsilon{t}\)) in the first equation could contemporaneously affects to ALL the variables in the VAR, while the innovation in the second equation could contemporaneously affect all the variables in the VAR except the first one, … and finally, an innovation in the last equation could contemporaneously affects only the last variable in the VAR


4.2 Critiques to Sims’s proposal

The proposal of Sims’s 1980 implies that the first variable in the system, in our case the GDP of USA could affect all the variables in the system. The second variable, in our case E15 GDP could affect only the second and third variable. And our third variable (Spanish GDP) could only affect his own dynamics contemporaneously. That is, when we transform our VAR using the Cholesky decomposition we are imposing a recursive structure among the variables. The order of variables is important, because only the first variables can affects all the others variables contemporaneously.


TO THINK: Do you think that it is sensible to impose a recursive structure in our system? The answer is maybe yes, maybe not …


Of course the proposal of Sims received some critiques as well. In fact one of the claims of Sims in favour of using VAR is that their use makes unnecessary the use of what Sims called “incredible restrictions” that other approaches, like for instance simultaneous equations models, used.

The first proposal (Sims) to identify the structural form by means of the Cholesky decomposition seems that it’s not imposing none restriction but …

  • Using the Cholesky factorization to identify the structural VAR is equivalent to choosing a recursive system of equations, and in fact this, in reality means that you are imposing restrictions to the system. In our case 3 zero restriction in \(D_{0}\)

  • On top on that, another critique to Sims’s proposal is that the order of the variables in the system matters; that is, identification is not unique.


TO THINK: What does mean identification is not unique? Could yo explain it with an example using our 3 variables? Think what does imply if we put Spain as the first variable in \(y_{t}\).


  • It is important to keep in mind that the “orthogonalization” of the reduced-form residuals by applying a Cholesky decomposition is appropriate only if the recursive structure embodied in the Cholesky factorisations can be justified on economic grounds.

  • Cooley and LeRoy (1985) criticized the VAR methodology because of its “atheoretical” identification scheme. They argued that Sims did not explicitly justify the identification restrictions and claimed that a model identified by this arbitrary procedure cannot be interpreted as a structural model, because a different variable ordering yields different structural parameters.

  • Sims (1986) propose trying different orderings (there are n!) and checking if the results are robust. In general, the higher the elements off-diagonal elements of \(\Sigma _{v}\) are, the higher the changes in the results.

  • But, even if there were no differences across these n! specifications, this would only prove that the results are robust among all recursive orderings, but there is no reason for the model to be recursive in the first place.

  • Since then, several ways to identify VAR models have been proposed (short-run restrictions, long-run restrictions, cointegration restrictions, sign restriction, narrative approaches etc. ).

  • As an alternative to the recursive identification scheme, Bernanke (1986) and Blanchard and Watson (1986) among others introduced non-recursive restrictions on the contemporaneous interactions among variables for identification

  • As economic theory often does not provide enough meaningful contemporaneous restrictions (and the more variables you put into your system, the more restrictions you need), the search for additional identifying restrictions led Blanchard and Quah (1989) and subsequently Shapiro and Watson (1988) and Gali (1992) to introduce restrictions on the system’s long-run properties. These long run restrictions are usually based on neutrality postulates

  • Faust and Leeper (1997) have criticized the use of long run restrictions to identify structural shocks, and show that unless the economy satisfies some types of strong restrictions, the long run restrictions will be unreliable

  • More recently, imposing sign restrictions, allows you to test the implications of all types of restrictions. By dropping one after one of the “dubious restrictions”, one can test whether the responses to shocks are sensitive to the restrictions often imposed

  • For a detailed exposition and examples of different sources of identifying restrictions see Kilian(2011)

Remember: a structural VAR analysis usually start specifying, validating and finally estimating a VAR in reduced form. For the VAR representation we could obtain a reduced form VMA representation, but this reduced VMA has little interest because it’s not structural, their IRF’s have not a clear interpretation because the innovations (\(v_{t}\)) are not orthogonal, they are correlated. Then, in the structural VAR methodology the reduced VMA representation is rarely show, instead a way to recover, to identify the structural VAR is proposed.

Usually this implies the use of some restrictions. The first proposal made by Sims in 1980 implied to impose a recursive system.

  • The most common restrictions are short-run restriction or long-run restrictions (restriction on \(D(1)\)). I will explain this at class but you should try to understand the slides or to read some of the references.

  • In fact in class we estimate a trivariate structural VAR, but we will use (for pedagogical reasons) two ways, two methods, to identify the structural VAR: the first one will use short run restriction, that is restriction in \(D_{0}\), and the second one, will use long-run restrictions, that is, restriction on the \(D(1)\) matrix.

  • We will see this at class in the Lab section.


ATTENTION: We have reached almost the end of the express-mini-course, BUT at least you should know the second most used “instrument” in VAR methodology: the FEVD


4.3 IRF and FEVD

Once we have identified/obtained our structural VAR, we could obtain the IRF’s and FEDV’s, the two principal instruments of the VAR methodology in order to show the results.

The IRF’s is nothing more that a graphical representation of the sequence of \(D_{i}\) matrices. This matrices contains the information we are interested in, the effect thought time of the structural shocks \(\varepsilon_{t}\) into the variables \(y_ {t}\).

As an example to illustrate this, imagine that our system would be:

\[y_{t}=\left[ \begin{array}{c} Y_{t} \\ P_{t}% \end{array}% \right] \ \ \ \varepsilon _{t}=\left[ \begin{array}{c} \varepsilon _{t}^{1} \\ \varepsilon _{t}^{2}% \end{array}% \right] \]


An that we have obtained/identified the structural VAR using the Cholesky decomposition, then imagine that the structural VAR \(y_{t} = D(L) \varepsilon_{t}\) is:

\[y_{t}~=D_{0}\varepsilon _{t}+D_{1}\varepsilon _{t-1}+D_{2}\varepsilon _{t-2}+D_{3}\varepsilon _{t-3}+D_{4}\varepsilon _{t-4}+...\]

\[y_{t}~=\left[ \begin{array}{cc} 0.9 & 0.8 \\ 0.7 & 0.6% \end{array}% \right] \varepsilon _{t}+\left[ \begin{array}{cc} 0.5 & 0.4 \\ 0.3 & 0.2% \end{array}% \right] \varepsilon _{t-1}+\left[ \begin{array}{cc} 0.1 & -0.1 \\ -0.2 & -0.3% \end{array}% \right] \varepsilon _{t-2}+\left[ \begin{array}{cc} -0.4 & -0.5 \\ -0.6 & -0.7% \end{array}% \right] \varepsilon _{t-3} +...\]


TO THINK: It would be possible that the element (1,2) of \(D_{0}\) were 0.8? The answer it’s NO, but WHY? Remember that were are using Cholesky decomposition and this implies that …… lower triangular ….


How we can obtain the IRF’s of our VAR? We will see at the Lab but, with the vars::Psi() function you can obtain the \(D_{i}\) matrices, the structural matrices (using the Cholesky decomposition)

And with the vars::irf() function we obtain the same information but in a more convenient way: we obtain the IRF’s

We can be more specific and only to demand the IRF’s we are interested in:

But usually you don’t show the estimation numbers, but you plot them:


Finally the FEVD’s

  • the first idea is that the FEVD’s comes from the IRF’s

  • Once we have orthogonalised IRF’s (the \(D_{i}\) matrices ), the FEVD can be easily computed. Let’s see how:

  • The h-step ahead forecast error can be represented as:

\[y_{T+h}-y_{T+h\mid T}=D_{0}\varepsilon _{T+h}+D_{1}\varepsilon_{T+h-1}+\cdots +D_{h-1}\varepsilon _{T+1}\]

As \(\Sigma _{\varepsilon }=I\), the forecast error variance of the k-th component of \(y_{T+h}\) is:

\[\sigma _{k}^{2}(h)=\overset{K}{\underset{j=1}{\sum }}(d_{kj,0}^{2}+\cdots +d_{kj,h-1}^{2})\]

where \(d_{nm,j}\) denotes the \((n,m)-th\) element of \(D_{j}\).

  • The quantity \((d_{kj,0}^{2}+\cdots +d_{kj,h-1}^{2})/\sigma _{k}^{2}(h)\) represents the contribution of the \(j\)-th shock to the h-step ahead forecast error variance of variable \(k\).

  • Don’t worry too much now about the last equations, first because we will usually do this with R and secondly because we are going to practise the calculations by hand at the Lab.

  • As an example to illustrate:

\[y_{t}=\left[ \begin{array}{c} Y_{t} \\ P_{t}% \end{array}% \right] \ \ \ \varepsilon _{t}=\left[ \begin{array}{c} \varepsilon _{t}^{1} \\ \varepsilon _{t}^{2}% \end{array}% \right] \]

\[y_{t}~=D_{0}\varepsilon _{t}+D_{1}\varepsilon _{t-1}+D_{2}\varepsilon _{t-2}+D_{3}\varepsilon _{t-3}+D_{4}\varepsilon _{t-4}+...\]

\[y_{t}~=\left[ \begin{array}{cc} 0.9 & 0.0 \\ 0.7 & 0.6% \end{array}% \right] \varepsilon _{t}+\left[ \begin{array}{cc} 0.5 & 0.4 \\ 0.3 & 0.2% \end{array}% \right] \varepsilon _{t-1}+\left[ \begin{array}{cc} 0.1 & -0.1 \\ -0.2 & -0.3% \end{array}% \right] \varepsilon _{t-2}+...\]

\[...+\left[ \begin{array}{cc} -0.4 & -0.5 \\ -0.6 & -0.7% \end{array}% \right] \varepsilon _{t-3}+D_{4}\varepsilon _{t-4}+...\]


  • we will practice and try to understand them at the Lab, but we can calculate them with the vars::fevd() function:

Usually the FEVD’s are also shown in a graphical fashion:


  1. We will see in short that this is not really true because ….

LS0tCiN0aXRsZTogIkV4cHJlc3MgbWluaS1jb3Vyc2Ugb24gU3RydWN0dXJhbCBWQVIgbW9kZWxzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZSAKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAjY29kZV9mb2xkaW5nOiBzaG93CiAgICAjc2VsZl9jb250YWluZWQ6IFRSVUUKLS0tCgoKCmBgYHtyIGNodW5rX3NldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgZmlnLmhlaWdodD0gNywgICAKICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywKICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCgo8c3R5bGU+CmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojZTZmMGZmOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDEzcHg7fQpkaXYuc3RlZWwgeyBiYWNrZ3JvdW5kLWNvbG9yOiNkZWNlM2M7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMTNweDt9CjJjNjdiZgo8L3N0eWxlPgoKCgpgYGB7ciBvcHRpb25zX3NldHVwLCBlY2hvID0gRn0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjaW9uIGNpZW50aWZpY2EKYGBgCgo8YnI+PGJyPjxicj4KCkFzIGZpbmFsbHksIGluc3RlYWQgb2YgNSBzZXNzaW9uIHdlIGFyZSBnb2luZyB0byBoYXZlIGFsbW9zdCAzIHNlc3Npb25zLCB0aGVuIGluc3RlYWQgb2YgYSBtaW5pLWNvdXJzZSB3ZSBhcmUgZ29pbmcgdG8gaGF2ZSBhIGV4cHJlc3MtbWluaS1jb3Vyc2U6IGEgcXVpY2sgYW5kICoqZGlydHkqKiBpbnRyb2R1Y3Rpb24gdG8gdGhlIGJhc2ljcyBvZiBzdHJ1Y3R1cmFsIFZBUiBtb2RlbHMuCgojIDAuIEludHJvLiAKCkltYWdpbmUgeW91IGFyZSBhIHJlc2VhcmNoZXIsIG9yIGJldHRlciwgaW1hZ2luZSB0aGF0IHlvdSBhcmUgdGhlIHRoZSBFY29ub215IE1pbmlzdGVyIG9mIGEgRXVyb3BlYW4gY291bnRyeSwgZm9yIGluc3RhbmNlIFNwYWluLCBhbmQgeW91IG5lZWQgdG8ga25vdyBob3cgeW91ciBjb3VudHJ5IGlzIGluZmx1ZW5jZWQgYnkgZWNvbm9taWMgZXh0ZXJuYWwgZm9yY2VzLiBXZSBhcmUgZ29pbmcgdG8gdXNlIGFuIHN0YXRpc3RpY2FsIGFwcHJvYWNoIHRvIHRyeSB0byBzb2x2ZSB0aGUgcHJvYmxlbS5UaGF0IGlzIHdlIGFyZSBnb2luZyB0byB1c2UgYSBzdGF0aXN0aWNhbCBtb2RlbC4gQnV0IHdoaWNoIG9uZT8gVkFSIG1vZGVscyBvZiBjb3Vyc2UsIHRoaXMgaXMgdGhlIHN1YmplY3Qgb2YgdGhlIG1pbmktY291cnNlLiAKCk9LLCBidXQgdGhlIG9yaWdpbmFsIHF1ZXN0aW9uICgiaG93IHlvdXIgY291bnRyeSBpcyBpbmZsdWVuY2VkIGJ5IGVjb25vbWljIGV4dGVybmFsIGZvcmNlcz8iKSBpcyB0b28gd2lkZSB0byBiZSB0cmFjdGFibGUuIExldCdzIG1hZGUgdGhlIHF1ZXN0aW9uIG1vcmUgc3BlY2lmaWMuIFdlIGhhdmUgaGVhcmQgdGhhdCB0aGVyZSBleGlzdHMgYW4gaW50ZXJuYXRpb25hbCBjeWNsZSBhbmQgYW4gRXVyb3BlYW4gY3ljbGUsIHRoZW4gdGhlIHF1ZXN0aW9uIGlzIGhvdyBTcGFpbiByZWFjdHMgdG8gdGhlIGludGVybmF0aW9uYWwgYW5kIEV1cm9wZWFuIGN5Y2xlLiBXaGF0IGFyZSB0aGVpciBpbmZsdWVuY2UgaW4gdGhlIFNwYW5pc2ggZWNvbm9teS4KCkV2ZW4gbW9yZSBwcmVjaXNlbHksIHdlIGFyZSBnb2luZyB0byB0cnkgdG8gYW5zd2VyIHR3byBxdWVzdGlvbnM6CgogIDEuIFdoYXQgd2lsbCBoYXBwZW4gdG8gU3BhbmlzaCBlY29ub215IGlmIHNvbWV0aGluZyBwb3NpdGl2ZSAoYSBwb3NpdGl2ZSBzaG9jaykgaGFwcGVucyBpbiB0aGUgaW50ZXJuYXRpb25hbCBjeWNsZSBvciBpbiB0aGUgRXVyb3BlYW4gYnVzaW5lc3MgY3ljbGUuIChJUkYpCgogIDIuIFdoYXQgaXMgdGhlIGltcG9ydGFuY2Ugb2YgaW50ZXJuYXRpb25hbCBhbmQgRXVyb3BlYW4gY3ljbGUgaW4gdGhlIFNwYW5pc2ggZWNvbm9taWMgZmx1Y3R1YXRpb25zPyAoRkVWRCkKCgpPSywgd2UgYXJlIGdvaW5nIHRvIHVzZSBzdGF0aXN0aWNhbCBtb2RlbHMsIHRoZW4gd2Ugd2lsbCBuZWVkIGRhdGEuIEJ1dCB3YWl0LCB3ZSBhbHJlYWR5IGhhdmUgZGF0YSwgbGFzdCBjbGFzcyB3ZSBoYXZlIGRvd25sb2FkZWQgc29tZSB2YXJpYWJsZXMuIFdlIGhhdmUgZG93bmxvYWRlZCBmcm9tIEV1cm9zdGF0IGEgYnVuY2ggb2Ygc2VyaWVzLiBJbiBwYXJ0aWN1bGFyIHdlIGFyZSBnb2luZyB0byB1c2UgMyBzZXJpZXMgb2YgIkdEUCB2b2x1bWUiIGZvciBVU0EsIEUxNSBhbmQgb3VyIGNvdW50cnksIGluIHRoYXQgY2FzZSBTcGFpbi4KCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUbyB0aGluazoqKiB3ZSB3aWxsIHVzZSAzIHZhcmlhYmxlcy4gQXJlIHRoZXkgZW5vdWdoIHRvIGFuc3dlciB0aGUgdHdvIHF1ZXN0aW9ucyBvciB3ZSBhcmUgZ29pbmcgdG8gbmVlZCBtb3JlICB2YXJpYWJsZXMvaW5mb3JtYXRpb24/CjwvZGl2Pgo8YnI+CgpXZSBhcmUgZ29pbmcgdG8gdXNlIGEgc3RhdGlzdGljYWwgYXBwcm9hY2ggYW5kIHdlIGhhdmUgMyB2YXJpYWJsZXMuIFdlIGNhbiB0aGluayB0aGF0IHRoZSAzIHZhcmlhYmxlcyBhcmUgYSBzeXN0ZW0gd2hlcmUgZWFjaCB2YXJpYWJsZSBpbmZsdWVuY2UgdGhlIG90aGVycyBvdGhlcnMsIHRoZXkgYXJlIGludGVyZGVwZW5kZW50LiBGb3IgaW5zdGFuY2UsIGNoYW5nZXMgaW4gVVMgKGFzIGEgcHJveHkgb2YgdGhlIGludGVybmF0aW9uYWwgY3ljbGUpIHdpbGwgaW1wYWN0IFNwYWluIGFuZCBFdXJvcGUuIENoYW5nZXMgaW4gRXVyb3BlIHdpbGwgYWxzbyBpbXBhY3Qgb24gdGhlIGludGVybmF0aW9uYWwgZWNvbm9teSBhbmQgb2YgY291cnNlIGluIHRoZSBTcGFuaXNoIGVjb25vbXkuIFRoYXQgaXMsIEkgdGhpbmsgd2Ugc2hvdWxkIHRyZWF0IHRoZSAzIHZhcmlhYmxlcyBhcyBlbmRvZ2Vub3VzLiAKCgpUaGVuIC4uLiB3aGF0IHR5cGUgb2Ygc3RhdGlzdGljYWwgbW9kZWxzIHdlIGNvdWxkIHVzZT8gRm9yIGluc3RhbmNlIHdlIGNvdWxkIHVzZSAiU2ltdWx0YW5lb3VzIGVxdWF0aW9ucyIuIEJ1dCB3YWl0LCB0aG9zZSBzeXN0ZW1zIHdlcmUgY3JpdGljaXNlZCBieSBTaW1zIGluIDE5ODAgYmVjYXVzZSB0aGV5IHVzZSB0aGF0IGhlIGNhbGxlZCAgImluY3JlZGlibGUgaWRlbnRpZmljYXRpb24gcmVzdHJpY3Rpb25zIi4KCk9LLCBsZXQncyBmb2xsb3cgU2ltcydzIDE5ODAgcHJvcG9zYWwgYW5kIHVzZSBWQVIgbW9kZWxzLiBGaXJzdCwgYmVmb3JlIHRvIGVzdGltYXRlIHRoZSBWQVIgbW9kZWwsIHdlIGhhdmUgdG8gc3BlY2lmeSwgdG8gd3JpdGUgaXQgZG93bi4KCgoKCiMgMS4gU3BlY2lmaWNhdGlvbiAmIGVzdGltYXRpb24KCldlbGwsIGEgVkFSIG1vZGVsIGlzIHJlYWxseSAiZWFzeSIgdG8gc3BlY2lmeS4gWW91IG9ubHkgbmVlZCB0byBzZWxlY3QgYSBidW5jaCBvZiB2YXJpYWJsZXMgdG8gYW5zd2VyIHlvdXIgcXVlc3Rpb25zLiBXZSBoYXZlIGFscmVhZHkgZG9uZSB0aGF0LiBXZSBoYXZlIHNlbGVjdGVkIDMgdmFyaWFibGVzLCBhbmQsIGZvbGxvd2luZyBTaW1zJ3MgcHJvcG9zYWwsIHdlIGFyZSBnb2luZyB0bzoKCj4gIHRyZWF0IGFsbCB2YXJpYWJsZXMgYXMgZW5kb2dlbm91cyAoYW5kIGZpcnN0IGVzdGltYXRlIGFuIHVucmVzdHJpY3RlZCBtb2RlbCBpbiBhIHJlZHVjZWQgZm9ybSkuIE5vIHByaW9yIGtub3dsZWRnZSBpcyB1c2VkIGV4Y2VwdCB0byBkZWNpZGUgd2hpY2ggdmFyaWFibGVzIHNob3VsZCBlbnRlciB0aGUgc3lzdGVtLgoKPGJyPgo8ZGl2IGNsYXNzID0gImJsdWUiPgoqKlRvIHRoaW5rOioqIGluIHRoZSBsYXN0IHNlbnRlbmNlIHRoZXJlIGlzIGEgdHJpY2t5IHBhcnQgImZpcnN0IGVzdGltYXRlIGFuIHVucmVzdHJpY3RlZCBtb2RlbCBpbiBhIHJlZHVjZWQgZm9ybSIuIFRyeSB0byB1bmRlcnN0YW5kIGl0LiBXaGF0IGRvZXMgbWVhbj8gSXQncyBub3QgZWFzeSBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgcmlnaHQgYmFja2dyb3VuZC4gV2Ugd2lsbCB0cnkgYXQgY2xhc3MuCjwvZGl2Pgo8YnI+CgoKCk91ciBtb2RlbCBpcyBkZXNjcmliZWQgYnkgdGhpcyBzZXQgb2YgZXF1YXRpb25zOiAKCgoKJCRcbGVmdFx7IApcYmVnaW57YXJyYXl9e2N9ClVTX3t0fT0gXGJldGEgVVNfe3QtMX0gKyBcYmV0YSBVU197dC0yfSArICBcYmV0YSBFMTVfe3QtMX0gKyAgXGJldGEgRTE1X3t0LTJ9ICsgIFxiZXRhIEVTX3t0LTF9ICsgXGJldGEgRVNfe3QtMn0gKyB2X3t0fV57VVN9ClxcIApFMTVfe3R9PSBcYmV0YSBVU197dC0xfSArIFxiZXRhIFVTX3t0LTJ9ICsgIFxiZXRhIEUxNV97dC0xfSArICBcYmV0YSBFMTVfe3QtMn0gKyAgXGJldGEgRVNfe3QtMX0gKyBcYmV0YSBFU197dC0yfSArIHZfe3R9XntFMTV9ClxcIApFU197dH09IFxiZXRhIFVTX3t0LTF9ICsgXGJldGEgVVNfe3QtMn0gKyAgXGJldGEgRTE1X3t0LTF9ICsgIFxiZXRhIEUxNV97dC0yfSArICBcYmV0YSBFU197dC0xfSArIFxiZXRhIEVTX3t0LTJ9ICsgdl97dH1ee0VTfQpcZW5ke2FycmF5fSUKXHJpZ2h0XH0gJCQKCjxicj4KCkJ1dCwgaXQncyBiZXR0ZXIgdG8gd3JpdGUgdGhlIG1vZGVsIGluIGEgbW9yZSBjb21wYWN0IGZvcm06CgokJHlfe3R9fj1BX3sxfXlfe3QtMX0rQV97Mn15X3t0LTJ9K3Zfe3R9JCQgCgpUaGUgbW9kZWwgaGFzIG9ubHkgdHdvIGxhZ3MsIGJ1dCBpbiBnZW5lcmFsIHRoZSBWQVIgd291bGQgYmU6CgoKJCR5X3t0fX49QV97MX15X3t0LTF9K0FfezJ9eV97dC0yfStcIFwgLi4uXCBcCitBX3twfXlfe3QtcH0rdl97dH1cIFwgXCBcIFwgXCBcIFwgXCBcIFsyXSQkIAoKCk1vZGVsICRbMl0kIGNhbiBiZSB3cml0dGVuIHVzaW5nIGEgcG9seW5vbWlhbCBpbiB0aGUgbGFnIG9wZXJhdG9yIGFzOiAKCiQkQShMKXlfe3R9PXZfe3R9XCBcIFwgXCBcIFwgXCBcIFwgXCBbM10kJCAgCgp3aXRoICRBKEwpPShJX3tLfS1BX3sxfUxeezF9LUFfezJ9TF57Mn0tLi4uLUFfe3B9TF57cH0pJAoKPGJyPgoKT0ssIGJ1dCB0aGVyZSBpcyBzb21ldGhpbmcgdGhhdCB3ZSBoYXZlIHRvIHNvbHZlOiB3ZSBoYXZlIHRvIGNob29zZSAqKmhvdyBtYW55IGxhZ3MqKiB3aWxsIGhhdmUgb3VyIG1vZGVsLCAyLCAzICwgND8gT0ssICBidXQgdGhpcyB3aWxsIGJlIGluIGEgbW9tZW50LCBmaXJzdCB3ZSBoYXZlIHRvIHRhbGsgYSBsaXR0bGUgYWJvdXQgdGhlIGVzdGltYXRpb24gbWV0aG9kIHdlIGFyZSBnb2luZyB0byB1c2UgdG8gZXN0aW1hdGUgb3VyIG1vZGVsLgoKCldlbGwsIHlvdSBzaG91bGQga25vdyB0aGF0LCAqKmlmIHRoZSBzeXN0ZW0gaXMgc3RhdGlvbmFyeSoqIHRoZW4sIGFzIGFsbCB0aGUgZXF1YXRpb25zIGluIHRoZSBWQVIgc2hhcmUgdGhlIHNhbWUgc2V0IG9mIHJlZ3Jlc3NvcnMgYW5kIGFsbCBvZiB0aGVtIGFyZSBsYWdnZWQgdmFyaWFibGVzLCB0aGUgVkFSIGNvdWxkIGJlIGVzdGltYXRlZCBlZmZpY2llbnRseSBieSBPTFMgZm9yIGVhY2ggZXF1YXRpb24gc2VwYXJhdGVseS4gCgpCVVQsIGJlIGF3YXJlIHRoYXQsIGluIG9yZGVyIHRvIGVzdGltYXRlIHRoZSBzeXN0ZW0gYnkgT0xTIGlzIGNydWNpYWwgdGhhdCB0aGUgZXJyb3IgdGVybXMgKCR2X3t0fSQpIHNob3VsZCAqKk5PVCB0byBiZSBhdXRvY29ycmVsYXRlZCoqLgoKUmVtZW1iZXIgYWxzbyB0aGF0IGluIHRoZSBjb250ZXh0IG9mIFZBUiBtZXRob2RvbG9neSwgdXN1YWxseSB0aGUgZXJyb3IgdGVybXMgKCR2X3t0fSQpIGFyZSBjYWxsZWQgKippbm5vdmF0aW9ucyoqLgoKCgpCZXNpZGVzIHRoYXQsIGlmIHRoZSBpbm5vdmF0aW9ucyBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKEdhdXNzaWFuKSB0aGVuIHdlIGNvdWxkIGFwcGx5IHVzdWFsIGluZmVyZW5jZSBtZXRob2RzLCBsaWtlIHQtdGVzdC4KCgoKPGJyPgo8ZGl2IGNsYXNzID0gImJsdWUiPgoqKlRvIHRoaW5rOioqIFZBUiBtb2RlbHMgYXNzdW1lICR2X3t0fVxyaWdodGFycm93IE4oMCxcU2lnbWEgX3t2fSkkLiBEbyB5b3UgdGhpbmsgdGhlcmUgYXJlIGNvbnRlbXBvcmFuZW91cyBjb3JyZWxhdGlvbiBhbW9uZyB0aGUgaW5ub3ZhdGlvbj8gRG8geW91IHRoaW5rIHRoZSBpbm5vdmF0aW9ucyBhcmUgYXV0b2NvcnJlbGF0ZWQ/IEJlIGF3YXJlIHRoYXQgdGhleSBhcmUgY29tcGxldGVseSBkaWZmZXJlbnQgcXVlc3Rpb25zCjwvZGl2Pgo8YnI+CgoKCkluIHBsYWluIEVuZ2xpc2g6IGJlZm9yZSB0byB1c2UgYSBWQVIgbW9kZWxzIHdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIHN5c3RlbSBvZiB2YXJpYWJsZXMgaXMgc3RhdGlvbmFyeSwgdGhlbiwgYXMgYWxsIG9mIHRoZSByZWdyZXNzb3JzIGFyZSBpbiB0aGUgcGFzdCAkeV97dC1rfSQsIHRoZXkgYXJlICJsaWtlLWV4b2dlbm91cyIgdmFyaWFibGVzIGFuZCB0aGVuIHdlIGNvdWxkIGVzdGltYXRlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtb2RlbCBieSBPTFMsICoqQlVUKiogcmVtZW1iZXIgdGhhdCB0aGUgJHZfe3R9JCBzaG91bGQgc2hvd24gKipubyBhdXRvY29ycmVsYXRpb24qKjsgdGhhdCBpcyB3ZSBzaG91bGQgY2hlY2ssIGFmdGVyIGVzdGltYXRpb24sIHRoYXQgdGhlIG1vZGVsIHJlc2lkdWFscyAkXHdpZGVoYXR7dn1fe3R9JCBzaG93biBOTy1hdXRvY29ycmVsYXRpb24KCkJlc2lkZXMgdGhhdCwgaWYgdGhlIGlubm92YXRpb25zICAkKHZfe3R9KSQgIGZvbGxvdyBhIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbiB0aGVuIHdlIGNvdWxkIHVzZSB0aGUgdXN1YWwgaW5mZXJlbmNlIG1ldGhvZHMuIFRoZW4sIHdlIHNob3VsZCBjaGVjayBhbHNvLHRoZSBub3JtYWxpdHkgb2YgdGhlIHJlc2lkdWFscyAkKFx3aWRlaGF0e3Z9X3t0fSkkLgoKCjxicj4KCk9LLiAqKkxldCdzIHByYWN0aXNlIHRoaXMgaW4gUioqOgoKLSBGaXJzdCB3ZSBoYXZlIHRvIGxvYWQgdGhlIHBhY2thZ2VzOgoKCmBgYHtyfQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQpsaWJyYXJ5KCJmb3JlY2FzdCIpCiNsaWJyYXJ5KCJkeWdyYXBocyIpCmxpYnJhcnkoInZhcnMiKSAgICAgICAgICMtIHRoZSBwYWNrYWdlIHVzZWQgdG8gZXN0aW1hdGUgVkFSIG1vZGVscwpgYGAKCgotIFNlY29uZCwgd2UgaGF2ZSB0byBsb2FkIGFuZCBjbGVhbiB0aGUgZGF0YQoKYGBge3J9CiMgbG9hZCB0aGUgZGF0YSBmb3IgU3BhaW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRmIDwtIHJlYWRfY3N2KGhlcmU6OmhlcmUoImRhdG9zIiwgIm15X2RhdGFfRVMuY3N2IikpICAjLSBZb3Ugc2hvdWxkIGxvYWQgWU9VUiBEQVRBCgojLSB3ZSBhcmUgZ29pbmcgdG8gdXNlIG9ubHkgMy80IHRoZSB2YXJpYWJsZXM6IFZvbCwgVm9sXzE1LCBWb2xfdXMgJiB0aW1lCmRhdGEgPC0gZGYgJT4lIGRwbHlyOjpzZWxlY3QodGltZSwgVm9sX3VzLCBWb2xfMTUsIFZvbCkKYGBgCgoKLSAiQ2xlYW5pbmciIHRoZSBkYXRhCgpgYGB7cn0KIy0gc29tZSBkYXRhIG11bmdpbmcgdG8gb2J0YWluaW5nIHRoZSBjb21tb24gc2FtcGxlIG9mIHRoZSAzIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMtIGZpcnN0IGdldHRpbmcgcmlwIG9mZiB0aGUgTkFzCmRhdGEgPC0gZGF0YSAlPiUgZHJvcF9uYSgpIAoKIy0gc2Vjb25kLCBjYWxjdWxhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgY29tbW9uIHNhbXBsZSBvZiBteSBkYXRhOgpkYXRhX3R0IDwtIGRhdGEgJT4lIG11dGF0ZSh0aW1lID0gYXMuY2hhcmFjdGVyKHRpbWUpKSAlPiUgdGlkeXI6OnNlcGFyYXRlKHRpbWUsIGMoInllYXIiLCAicXVhcnRlciIsICJkYXkiKSwiLSIpCmRhdGFfdHQgPC0gZGF0YV90dCAlPiUgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKSAKZGF0YV90dCA8LSBkYXRhX3R0ICU+JSBtdXRhdGUocXVhcnRlcj0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFydGVyICA9PSAiMDEiICB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YXJ0ZXIgID09ICIwNCIgIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhcnRlciAgPT0gIjA3IiAgfiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFydGVyICA9PSAiMTAiICB+IDQpKQpzdGFydF95ZWFyICAgIDwtIGRhdGFfdHQkeWVhclsxXSAKc3RhcnRfcXVhcnRlciA8LSBkYXRhX3R0JHF1YXJ0ZXJbMV0gCmVuZF95ZWFyICAgICAgPC0gZGF0YV90dCR5ZWFyW25yb3coZGF0YV90dCldIAplbmRfcXVhcnRlciAgIDwtIGRhdGFfdHQkcXVhcnRlcltucm93KGRhdGFfdHQpXSAKICAKIy0gd2UgZG9uJ3QgbmVlZCAiZGF0YV90dCIgYW55bW9yZQpybShkYXRhX3R0KQpgYGAKCgoKYGBge3J9CiMgIGNyZWF0aW5nIHRoZSB0aW1lIHNlcmllcyB3aXRoIHRzKCk6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVm9sICAgIDwtIHRzKGRhdGEkVm9sLCAgICBzdGFydCA9IGMoc3RhcnRfeWVhciwgc3RhcnRfcXVhcnRlcikgLCBlbmQgPSBjKGVuZF95ZWFyLCBlbmRfcXVhcnRlcikgLCBmcmVxdWVuY3kgPSA0KSAgIApWb2xfMTUgPC0gdHMoZGF0YSRWb2xfMTUsIHN0YXJ0ID0gYyhzdGFydF95ZWFyLCBzdGFydF9xdWFydGVyKSAsIGVuZCA9IGMoZW5kX3llYXIsIGVuZF9xdWFydGVyKSAsIGZyZXF1ZW5jeSA9IDQpICAgClZvbF91cyA8LSB0cyhkYXRhJFZvbF91cywgc3RhcnQgPSBjKHN0YXJ0X3llYXIsIHN0YXJ0X3F1YXJ0ZXIpICwgZW5kID0gYyhlbmRfeWVhciwgZW5kX3F1YXJ0ZXIpICwgZnJlcXVlbmN5ID0gNCkgICAKcm0oc3RhcnRfeWVhciwgc3RhcnRfcXVhcnRlciwgZW5kX3llYXIsIGVuZF9xdWFydGVyKQoKIyB0YWtpbmcgbG9ncyBvZiB0aGUgc2VyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpsVm9sICAgIDwtIGxvZyhWb2wpCmxWb2xfMTUgPC0gbG9nKFZvbF8xNSkKbFZvbF91cyA8LSBsb2coVm9sX3VzKQoKIyB0YWtpbmcgZmlyc3QgbG9nIGRpZmZlcmVuY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRsVm9sICAgICA8LSBkaWZmKGxWb2wsICAgICAgbGFnID0gMSwgZGlmZmVyZW5jZSA9IDEpCmRsVm9sXzE1ICA8LSBkaWZmKGxWb2xfMTUsICAgbGFnID0gMSwgZGlmZmVyZW5jZSA9IDEpCmRsVm9sX3VzICA8LSBkaWZmKGxWb2xfdXMsICAgbGFnID0gMSwgZGlmZmVyZW5jZSA9IDEpCgoKIyBwdXR0aW5nIG91ciAzIHZhcmlhYmxlcyBpbiBhIHZlY3Rvcgp2YXJpYWJsZXMgPC0gY2JpbmQoZGxWb2xfdXMsIGRsVm9sXzE1LCBkbFZvbCkgICAgICAgICMtIENyZWF0aW5nIGEgbWF0cml4IHdpdGggdGhlIDMgc2VyaWVzLiBUaGUgT3JkZXJpbmcgd2lsbCBiZSBpbXBvcnRhbnQKYGBgCgoKCjxicj4KCgotIHRoaXJkLCBXZSBzdGFydCB0byBzcGVjaWZ5L2VzdGltYXRlIG91ciBWQVIKCmBgYHtyLCBldmFsID0gRkFMU0V9CiMgVG8gZXN0aW1hdGUgdGhlIFZBUiB3ZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSAidmFycyIgcGFja2FnZQoKIyBJbnRlcm5hbCBoZWxwIGZyb20gdGhlIHZhcnMgcGFja2FnZQpoZWxwKHBhY2thZ2UgPSB2YXJzKSAgICAgICAgICAgIy0gY2FsbGluZyB0byB0aGUgcGtnIGhlbHAKbHMoInBhY2thZ2U6dmFycyIsIGFsbCA9IFRSVUUpICMtIGFsbCB0aGUgb2JqZWN0cywgdXN1YWxseSBmdW5jdGlvbnMgJiBkYXRhIGluIHRoZSAidmFycyIgcGFja2FnZQpgYGAKCgojIyMgMS5hIENoZWNraW5nIHRoZSBzdGF0aW9uYXJpdHkgb2YgdGhlIHZhcmlhYmxlcwoKCi0gV2h5IHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXRpb25hcml0eT8KCmBgYHtyfQpsaWJyYXJ5KGZvcmVjYXN0KQpuZGlmZnMoZGxWb2wsIGFscGhhID0gMC4wNSwgdGVzdCA9IGMoImtwc3MiLCAiYWRmIiwgInBwIiksIG1heC5kID0gMiApCm5kaWZmcyhkbFZvbF8xNSwgYWxwaGEgPSAwLjA1LCB0ZXN0ID0gYygiYWRmIiksIG1heC5kID0gMiApCm5kaWZmcyhkbFZvbF91cywgYWxwaGEgPSAwLjA1LCB0ZXN0ID0gYygiYWRmIiksIG1heC5kID0gMiApCgpybShsaXN0ID0gbHMoKVshbHMoKSAlaW4lIGMoImRhdGEiLCAidmFyaWFibGVzIildKSAgICMtIHJlbW92aW5nIGFsbCBleGNlcHQgd2hhdCB3ZSBuZWVkICgiZGF0YSIgYW5kICJ2YXJpYWJsZXMiKQpgYGAKCgpBcmUgdGhlIHZhcmlhYmxlcyBzdGF0aW9uYXJ5PyBXZWxsIC4uLi4KCgojIyMgMS5iIEhvdyBtYW55IGxhZ3M/CgpXZSBoYXZlIHRvIGRlY2lkZSBob3cgbWF5IGxhZ3Mgd2lsbCBvdXIgVkFSIGhhdmUuIFRoZXJlIGFyZSB0d28gc3RyYXRlZ2llczogICAKCiAgICAgIC0gMSBVc2UgaW5mb3JtYXRpb24gY3JpdGVyaWEgbWV0aG9kcyAgICAgIAogICAgCiAgICAgIC0gMiBMUiB0ZXN0cyAgICAgCiAgCgoKLSAxLiBVc2luZyBpbmZvcm1hdGlvbiBjcml0ZXJpYSBtZXRob2RzIAoKYGBge3J9CiMgSE9XIE1BTlkgTEFHUyBpbiB0aGUgVkFSPyBXaGF0IGFib3V0IHRoZSBkZXRlcm1pbmlzdGljIGNvbXBvbmVudHMgb2YgdGhlIFZBUj8gLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyAxLiB3aXRoIG1vZGVsIHNlbGVjdGlvbiBjcml0ZXJpYSAoQUlDKQpWQVJzZWxlY3QodmFyaWFibGVzLCBsYWcubWF4ID0gOCwgdHlwZSA9ICJjb25zdCIpCmBgYAoKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUbyB0aGluazoqKiBJZiB3ZSB1c2UgdGhlIGluZm9ybWF0aW9uIGNyaXRlcmlhIG1ldGhvZHMsIEhvdyBtYW55IGxhZ3Mgd2Ugc2hvdWxkIHVzZSBpbiBvdXIgVkFSPwo8L2Rpdj4KPGJyPgoKCjIuIChTZWxlY3RpbmcgdGhlIFZBUiBvcmRlcikgV2l0aCBhIHNlcXVlbmNlIG9mIExSIHRlc3QKCmBgYHtyLCBldmFsID0gRkFMU0V9CiMgMi4gd2l0aCBMUiB0ZXN0IAp2YXIubTQgPC0gVkFSKHZhcmlhYmxlcywgcCA9IDQsIHR5cGUgPSAiY29uc3QiKSAKdmFyLm0zIDwtIFZBUih2YXJpYWJsZXMsIHAgPSAzLCB0eXBlID0gImNvbnN0IikgICAKbHJ0ZXN0KHZhci5tMywgdmFyLm00KSAgIy0gd2h5IGRvZXNuJ3Qgd29yayB0aGlzIHRlc3Q/IFdoeSBkb2Vzbid0IHJ1biB0aGlzIGNodW5rCmBgYAoKCmBgYHtyfQp2YXIubTUgPC0gVkFSKHZhcmlhYmxlcywgcCA9IDUsIHR5cGUgPSAiY29uc3QiKSAKdmFyaWFibGVzMiA8LSB2YXJpYWJsZXNbLTEsXQp2YXIubTQgPC0gVkFSKHZhcmlhYmxlczIsIHAgPSA0LCB0eXBlID0gImNvbnN0IikgICAKbHJ0ZXN0KHZhci5tNCwgdmFyLm01KSAgICMtIHdoYXQgd2Ugc2VsZWN0IDQgb3IgNSBsYWdzPwoKcm0odmFyLm00LCB2YXIubTUsIHZhcmlhYmxlczIpIApgYGAKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUbyB0aGluazoqKiBIb3cgbWFueSBsYWdzPyBmaXZlLCBmb3VyPyAzPwo8L2Rpdj4KPGJyPgoKV2VsbCwgZmluYWxseSB3ZSBhcmUgZ29pbmcgdG8gdXNlIC4uLi4uLi4gKio0KiogbGFncy4gV2h5PyBEb24ndCB0aGluayB0b28gbXVjaCB3aHkuIE9uZSBwYXJ0IG9mIHRoZSByZWFzb24gaXMgYmVjYXVzZSBJIGxpa2UgdGhlIDQncy4gSSB3aWxsIGV4cGxhaW4gYXQgY2xhc3MKCjxicj4KCiMgMi4gRXN0aW1hdGlvbiBvZiB0aGUgVkFSCgpXZSBjb3VsZCBlc3RpbWF0ZSB0aGUgZXF1YXRpb25zIG9mIHRoZSBtb2RlbCBieSBPTFMgd2l0aCB0aGUgZnVuY3Rpb24gYGxtKClgLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gdXNlIHRoZSBmdW5jdGlvbiBgVkFSKClgIGZyb20gdGhlIHZhcnMgcGFja2FnZQoKYGBge3J9CiMgRVNUSU1BVElORyB0aGUgVkFSLiAgV2NoaWNoIGVzdGltYXRpb24gbWV0aG9kPyAtLS0tLS0tLS0tLS0tLS0tLS0tClZBUih2YXJpYWJsZXMsIHAgPSA0LCB0eXBlID0gImNvbnN0IikgCmBgYAoKPGJyPgoKCkxldCdzIGVzdGltYXRlIGFnYWluLCBidXQgaW5zdGVhZCBvZiBzaG93aW5nIHRoZSByZXN1bHRzLCB3ZSBhcmUgZ29pbmcgdG8gYXNzaWduIHRoZW0gdG8gdGhlIGBvdXJfdmFyYCBvYmplY3Q6CgpgYGB7cn0Kb3VyX3ZhciA8LSBWQVIodmFyaWFibGVzLCBwID0gNCwgdHlwZSA9ICJjb25zdCIpICAgIy0gc2F2aW5nIHRoZSBlc3RpbWF0aW9uIHJlc3VsdHMgaW4gdGhlIG9iamVjdCAib3VyX3ZhciIKYGBgCgoKPGJyPgo8ZGl2IGNsYXNzID0gImJsdWUiPgoqKlRvIERPOioqIHBsZWFzZSB0YWtlIGEgbG9vayBhdCB0aGUgIm91cl92YXIiIG9iamVjdC4gV2hhdCBpdCBpcz8gV2hhdCBpdCBjb250YWlucz8KPC9kaXY+Cjxicj4KCgoKSW4gZmFjdCwgbm93IHlvdSBjYW4gY2hlY2sgaWYgb3VyIGVzdGltYXRlZCBWQVIgbW9kZWwgaXMgc3RhYmxlOgoKYGBge3J9CiMtLS0tLS0gQ2hlY2tpbmcgc3RhYmlsaXR5KGVpZ2VudmFsdWVzIG9mIHRoZSBjb21wYW5pb24gY29lZmZpY2llbnQgbWF0cml4IG11c3QgaGF2ZSBtb2R1bHVzIGxlc3MgdGhhbiAxKQpyb290cyhvdXJfdmFyLCBtb2R1bHVzPVRSVUUpICMtIFJldHVybnMgYSB2ZWN0b3Igd2l0aCB0aGUgZWlnZW52YWx1ZXMKYGBgCgoKCkxldCdzIGxvb2sgYXQgdGhlIGVzdGltYXRpb24gcmVzdWx0cyBpbiB0d28gZGlmZmVyZW50IHdheXMsIHVzaW5nIHR3byBmdW5jdGlvbnMgb2YgdGhlIGB2YXJzYHBhY2thZ2U6CgoKYGBge3J9CiMgTE9PS0lORyBhdCB0aGUgcmVzdWx0cyBvZiB0aGUgZXN0aW1hdGVkIFZBUiAtLS0tLS0tLS0tLS0tLS0tCnN1bW1hcnkob3VyX3ZhcikKYGBgCgoKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUbyBETzoqKiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgdGhlIHJlc3VsdHMuICBQbGVhc2UgaGF2ZSBhbm90aGVyIG1vcmUgY2xvc2UgbG9vayBhdCB0aGUgQ292YXJpYW5jZSBtYXRyaXggb2YgcmVzaWR1YWxzLiAqKlRoZSByZXNpZHVhbHMgYXJlIGNvbnRlbXBvcmFuZW91c2x5IGNvcnJlbGF0ZWQ/KiogVGhleSBhcmUgYXV0b2NvcnJlbGF0ZWQ/CjwvZGl2Pgo8YnI+Cgo8YnI+CgpBbm90aGVyIGxvb2sgYXQgdGhlIHJlc3VsdHMgb2YgdGhlIFZBUiBlc3RpbWF0aW9uLCBub3cgdXNpbmcgdGhlIGBBY29lZigpYGZ1bmN0aW9uIG9mIHRoZSBgdmFyc2AgcGFja2FnZToKCmBgYHtyfQojLS0tLS0tIHNob3dzIHRoZSBBIGVzdGltYXRlZCBtYXRyaWNlcy4gQmUgYXdhcmUgdGhhdCB0aGV5IGFyZSB0aGUgc2FtZSByZXN1bHRzCkFjb2VmKG91cl92YXIpICAgCmBgYAoKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUbyBUaGluazoqKiBXaGF0IGFyZSB0aGlzIHJlc3VsdHM/IEFyZSB0aGUgc2FtZSByZXN1bHRzIHByZXZpb3VzbHkgc2VlbiBvciBhcmUgb3RoZXIgcmVzdWx0cz8gV2h5IHdlIG5lZWQgdGhpcyBtYXRyaWNlcz8uICh0aGUgZmlyc3QgdHdvIHF1ZXN0aW9ucyBhcmUgb2J2aW91cywgYnV0IG5vdCB0aGUgdGhpcmQpCjwvZGl2Pgo8YnI+CgoKCkJlZm9yZSB0byB1c2Ugb3VyIGVzdGltYXRlZCBWQVIgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSByZXNpZHVhbHMgYXJlIGNvcnJlbGF0ZWQgKGF1dG9jb3JyZWxhdGlvbikgCgoKYGBge3J9CnNlcmlhbC50ZXN0KG91cl92YXIsIGxhZ3MucHQgPSA4ICkgICMtLSA4IGxhZ3MgZm9yIGF1dG9jb3JyZWxhdGlvbiBwb3J0bWFudGVhdSB0ZXN0CmBgYAoKCldlIGhhdmUgdG8gY2hlY2sgYWxzbyBmb3IgTm9ybWFsaXR5IG9mIHJlc2lkdWFscy4KCgoKYGBge3J9Cm5vcm1hbGl0eS50ZXN0KG91cl92YXIsIG11bHRpdmFyaWF0ZS5vbmx5PUZBTFNFKSAgICMtLSBOb3JtYWxpdHkgdGVzdApgYGAKCk9LLCBtb3JlIG9yIGxlc3MsIG91ciBlc3RpbWF0ZWQgVkFSIG1vZGVsIGlzICJ2YWxpZCIsIHRoZW4gd2UgY291bGQgbm93IHVzZSBvdXIgZXN0aW1hdGVkIFZBUiB0byBwZXJmb3JtIHNvbWUgdGFzayxmb3IgaW5zdGFuY2UgdG8gdGVzdCBmb3IgR3JhbmdlciBjYXVzYWxpdHkgb3IgZm9yIGZvcmVjYXN0aW5nOgoKCmBgYHtyLCBldmFsID0gRkFMU0V9CiMtLS0tLS0gV2UgY2FuIHRlc3QgR3JhbmdlciBjYXVzYWxpdHkKY2F1c2FsaXR5KG91cl92YXIsIGNhdXNlID0gYygiZGxWb2wiKSkgICAgICAjLSBkbFZvbCBHcmFuZ2VyLWNhdXNlIHRoZSBvdGhlcihzKSB2YXJpYWJsZXM/CmNhdXNhbGl0eShvdXJfdmFyLCBjYXVzZSA9IGMoImRsVm9sXzE1IikpICAgIy0gZGxWb2xfMTUgR3Jhbmdlci1jYXVzZSB0aGUgb3RoZXIocykgdmFyaWFibGVzPwpjYXVzYWxpdHkob3VyX3ZhciwgY2F1c2UgPSBjKCJkbFZvbF91cyIpKSAgICMtIGRsVm9sXzE1IEdyYW5nZXItY2F1c2UgdGhlIG90aGVyKHMpIHZhcmlhYmxlcz8KCiMtLS0tLS0gV2UgY2FuIHVzZSB0aGUgVkFSIGZvciBmb3JlY2FzdGluZwpwcmVkaWN0KG91cl92YXIsIG4uYWhlYWQgPSAzKSAgCmZhbmNoYXJ0KHByZWRpY3Qob3VyX3ZhcikpCmBgYAoKQnV0IG91ciBvYmplY3RpdmUgaXMgbm90IHRvIGZvcmVjYXN0LCBpdCdzIGluIHNvbWUgd2F5IHJlbGF0ZWQsIGJ1dCBpbiByZWFsaXR5IGlzIGEgbGl0dGxlIGJpdGUgZGlmZmVyZW50LgoKCiMgMy4gT2J0YWluaW5nIHRoZSBWTUEgcmVwcmVzZW50YXRpb24KCk9LLiBXZSBoYXZlIGVzdGltYXRlZCBhIFZBUiBtb2RlbCAuLi4uIEJVVCB3ZSBoYXZlIG5vdCBhbnN3ZXJlZCB0aGUgdHdvIHF1ZXN0aW9ucyB3ZSB3YW50IHRvIGFzazogCgogIDEuIFdoYXQgaXMgdGhlIHJlc3BvbnNlIG9mIHRoZSBTcGFuaXNoIGVjb25vbXkgdG8gYSBzaG9jayBpbiB0aGUgaW50ZXJuYXRpb25hbCBjeWNsZSBvciBpbiB0aGUgRXVyb3BlYW4gYnVzaW5lc3MgY3ljbGUuIChJUkYpCgogIDIuIFdoYXQgaXMgdGhlIGltcG9ydGFuY2Ugb2YgaW50ZXJuYXRpb25hbCBhbmQgRXVyb3BlYW4gY3ljbGUgaW4gdGhlIFNwYW5pc2ggZWNvbm9taWMgZmx1Y3R1YXRpb25zPyAoRkVWRCkKICAKPGJyPgoKSW4gb3JkZXIgdG8gYW5zd2VyIHRob3NlIHF1ZXN0aW9ucyB3ZSBuZWVkIHRvIHdvcmsgYSBsaXR0bGUgYml0ZSBtb3JlLiBGaXJzdCB3ZSBoYXZlIHRvIG9idGFpbiB0aGUgVk1BIHJlcHJlc2VudGF0aW9uIG9mIG91ciBWQVIgbW9kZWwuIFRoYXQgaXMsIHdlIGhhdmUgdG8gImludmVydCIgb3VyIG1vZGVsLiBIb3cgYW5kIHdoeT8gVGhlIGlkZWEgaXMgdGhlIHNhbWUgdGhhdCBNYXJpYW0gZXhwbGFpbmVkIHRvIHlvdSwgc29tZXRoaW5nIGxpa2U6Cgo+IGV2ZXJ5IHN0YXRpb25hcnkgQVIgcHJvY2VzcyBoYXZlIGEgTUEgcmVwcmVzZW50YXRpb24KCgpBcyB3ZSBhcmUgbm93IHdpdGggVkFSICh2ZWN0b3JpYWwtQVIpIHdlIHdvdWxkIG9idGFpbiBhIHZlY3RvcmlhbC1NQSAoVk1BKSwgYnV0IHRoZSBpZGVhIGlzIHRoZSBzYW1lLiBMZXQncyBkbyBpdCAoYnkgaGFuZCkgZm9yIGEgVkFSIHdpdGggb25seSAxIGxhZzoKCgoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI4MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICIwMS1ob3Jpem9udGFsLWEuanBnIikgKSAKYGBgCgpGaW5hbGx5IHdlIGhhdmUgdGhhdCBvdXIgdmVjdG9yIG9mIHZhcmlhYmxlcyAkeV97dH0kIGFzIGEgZnVuY3Rpb24gb2YgdGhlIGlubm92YXRpb25zIGluICR0JCwgaW4gJHQtMSQsICR0LTIkIC4uLi4gICBUaGlzIGlzIHRoZSBWTUEgcmVwcmVzZW50YXRpb24uIFRoZSB2YXJpYWJsZXMgaW4gZnVuY3Rpb24gb2YgYWN0dWFsIGFuZCBwYXN0IHZhbHVlcyBvZiBpbm5vdmF0aW9ucyAoJHZfe3R9JCkuCgpVc3VhbGx5IHdlIHJlbmFtZSB0aGUgbWF0cmljZXMgdG8gY2FsbCB0aGVtICRDX3tpfSQgYW5kIHRoZSBWTUEgdGhhdCB5b3Ugc2VlIGluIHBhcGVycyBhbmQgYm9va3MgdXN1YWxseSBpcyB3cml0dGVuIGxpa2U6CgokJHlfe3R9fj1DX3swfXZfe3R9K0NfezF9dl97dC0xfStDX3syfXZfe3QtMn0rXCAuLi5cICBbM10kJAoKCgpiZWluZyAkQ197MH09SV97S30kLCB0aGUgcmVzdCBvZiB0aGUgJENfe2l9JCBhcmUgY29tcHV0ZWQgcmVjdXJzaXZlbHkgZnJvbSB0aGUgVkFSIHJlcHJlc2VudGF0aW9uICwgdGhhdCBpcyB0aGV5IGFyZSBmdW5jdGlvbiBvZiB0aGUgJEFfe2l9JCBtYXRyaWNlcy4KCgpBcyB3aXRoIHRoZSBWQVIsIG1vZGVsICRbM10kIGNhbiBiZSB3cml0dGVuIHVzaW5nIGEgcG9seW5vbWlhbCBpbiB0aGUgbGFnIG9wZXJhdG9yIGFzOgogCgokJHlfe3R9PUMoTCl2X3t0fVwgXCBcIFwgXCBcIFwgXCBcIFwgXCBcIFs0XSQkCgpiZWluZyAkQyhMKT0oSV97S30rQ197MX1MXnsxfStDX3syfUxeezJ9K1wgXCAuLi4pJC4KCgpPSywgYnV0IHdoeSB3ZSBuZWVkIHRoaXMgbmV3IHJlcHJlc2VudGF0aW9uIG9mIG91ciBzeXN0ZW0gJHlfe3R9JC4gRm9yIGRpZmZlcmVudCByZWFzb24sIGJ1dCBpbiB0aGUgY29udGV4dCBvZiBWQVIgbW9kZWxzLCBiZWNhdXNlIHRoZSBWTUEgcmVwcmVzZW50YXRpb24sIHRoYXQgaXMsIHRoZSBzZXF1ZW5jZSBvZiAkQ197aX0kIG1hdHJpY2VzIHByb3ZpZGUgdGhlIElSRl5bV2Ugd2lsbCBzZWUgaW4gc2hvcnQgdGhhdCB0aGlzIGlzIG5vdCByZWFsbHkgdHJ1ZSBiZWNhdXNlIC4uLi5dLCB0aGF0IGlzLCB0aGlzIHNlcXVlbmNlIG9mICRDX3tpfSQgcHJvdmlkZSB0aGUgYW5zd2VyIHRvIG91ciBmaXJzdCBxdWVzdGlvbi4gCgoKRm9yIGluc3RhbmNlLCBpbiBvdXIgZXhhbXBsZSwgSW1hZ2luZSB0aGF0OgoKCiQkeV97dH09XGxlZnRbIApcYmVnaW57YXJyYXl9e2N9ClVTQV97dH0gXFwgClUxNV97dH0gXFwgCkVTUF97dH0lClxlbmR7YXJyYXl9JQpccmlnaHRdIFwgXCBcIFwgdl97dH09XGxlZnRbIApcYmVnaW57YXJyYXl9e2N9CnZfe3R9XntVU0F9IFxcIAp2X3t0fV57RTE1fSBcXCAKdl97dH1ee0VTUH0lClxlbmR7YXJyYXl9JQpccmlnaHRdICQkCgoKCiQkeV97dH1+PUNfezB9dl97dH0rQ197MX12X3t0LTF9K0NfezJ9dl97dC0yfStDX3szfXZfe3QtM30rQ197NH12X3t0LTR9Ky4uLiQkCgokJHlfe3R9fj1cbGVmdFsgClxiZWdpbnthcnJheX17Y2N9CjEuMCAmIDAuMCAmIDAuMCBcXAowLjAgJiAxLjAgJiAwLjAgXFwKMC4wICYgMC4wICYgMS4wJQpcZW5ke2FycmF5fSUKXHJpZ2h0XSB2X3t0fStcbGVmdFsKXGJlZ2lue2FycmF5fXtjY30KMS4xICYgMS4yICYgMS4zIFxcIAoxLjQgJiAxLjUgJiAxLjYgXFwKMS43ICYgMS44ICYgMS45JQpcZW5ke2FycmF5fSUKXHJpZ2h0XSB2X3t0LTF9K1xsZWZ0WwpcYmVnaW57YXJyYXl9e2NjfQoyLjEgJiAyLjIgJiAyLjMgXFwgCjIuNCAmIDIuNSAmIDIuNiBcXAoyLjcgJiAyLjggJiAyLjklClxlbmR7YXJyYXl9JQpccmlnaHRdIHZfe3QtMn0rXGxlZnRbClxiZWdpbnthcnJheX17Y2N9CjMuMSAmIDMuMiAmIDMuMyBcXCAKMy40ICYgMy41ICYgMy42IFxcCjMuNyAmIDMuOCAmIDMuOSUKXGVuZHthcnJheX0lClxyaWdodF0gdl97dC0zfSsuLi4kJAoKCgoKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUTyBETzoqKiBUcmFjayB3aGF0IGFyZSBnb2luZyB0byBiZSB0aGUgZWZmZWN0IGluIDIwMjAsIDIwMjEsIDIwMjIgJiAyMDIzIGluIHRoZSBVUyBWb2xfR0RQIGlmIGEgaW5ub3ZhdGlvbiBvZiBzaXplIDEgaW4gJHZee1VTQX0kIGhhcHBlbnMgdG9kYXkoMjAyMCkuIFRoYXQgaXMgSSdtIGFza2luZyB5b3UgdG8gY2FsY3VsYXRlIHdoYXQgd2lsbCBiZSB0aGUgZWZmZWN0IHRob3VnaHQgdGltZSAodCwgdCsxLCB0KzIgLi4uKSBvbiBVU0Egb2YgYW4gaW5ub3ZhdGlvbiBvZiBzaXplIDEgaW4gaGlzIG93biBlcXVhdGlvbiwgdGhhdCBpcyBpbiAkdl97dH1ee1VTQX0kIAo8L2Rpdj4KPGJyPgoKVGhlIGFuc3dlciBpczogMSwgMS4xLCAyLjEsIDMuMSAuLi4uCgo8YnI+CjxkaXYgY2xhc3MgPSAiYmx1ZSI+CioqVE8gRE86KiogVHJhY2sgd2hhdCBhcmUgZ29pbmcgdG8gYmUgdGhlIGVmZmVjdCAqKm9uIFNwYWluKiogaW4gMjAyMCAyMDIxLCAyMDIyICYgMjAyMyBpZiB0b2RheSAoMjAyMCkgdGhlcmUgaXMgYW4gaW5ub3ZhdGlvbiBvZiBzaXplIDEgaW4gICR2XntFMTV9JC4gVGhhdCBpcyBJJ20gYXNraW5nIHlvdSB0byBjYWxjdWxhdGUgd2hhdCB3aWxsIGJlIHRoZSBlZmZlY3QgdGhvdWdodCB0aW1lIG9uIFNwYWluIG9mIGFuIGlubm92YXRpb24gb2Ygc2l6ZSAxIGluICR2XntFMTV9JC4gUGxlYXNlLCBtYWtlIGFuIGVmZm9ydCwgaXQgaXMgcmVhbGx5IGltcG9ydGFudCB0byBub3RpY2UgYW5kIHRvIHVuZGVyc3RhbmQgdGhpcy4KPC9kaXY+Cjxicj4KCgpUaGVuLCB3ZSBoYXZlIHNvbHZlZCBhbHJlYWR5IG91ciBmaXJzdCBxdWVzdGlvbiwgdGhhdCBpcywgaW4gb3JkZXIgdG8gdG8gZXN0aW1hdGUgd2hhdCB0aGUgZWZmZWN0cyBvZiBVU0EgJiBFMTUgaW4gdGhlIFNwYW5pc2ggZWNvbm9teSB3ZSBoYXZlIGZpcnN0IHRvIGVzdGltYXRlIGEgVkFSIGFuZCB0aGVuLCB0byBpbnZlcnQgdGhlIHBvbHlub21pYWwgdG8gb2J0YWluIHRoZSBzZXF1ZW5jZSBvZiAkQyQgbWF0cmljZXMsIHRoYXQgaXMgdGhlICRDKEwpJCBwb2x5bm9taWFsLiAKCkFuZCwgdGhhdCdzIGFsbD8gRG8geW91IHRoaW5rIHRoaW5ncyBhcmUgc28gZWFzeT8gT2J2aW91c2x5IE5vLCBpdCdzIG9ubHkgcGFydCBvZiB0aGUgcHJvY2Vzcywgd2Ugd2lsbCBjb250aW51ZSBleHBsYWluaW5nIHRoaXMgbGF0dGVyLgoKCk5vdywgbGV0J3Mgb2J0YWluIHRoZSBWTUEgcmVwcmVzZW50YXRpb24gb2Ygb3VyX3ZhciB3aXRoIFIuCgpgYGB7cn0KIy0tLS0tLSBPYnRhaW5pbmcgdGhlIFdvbGQgVk1BIHJlcHJlc2VudGF0aW9uIG9mIG91cl92YXIgd2l0aCB0aGUgdmFycyBwYWNrYWdlClBoaShvdXJfdmFyLCBuc3RlcCA9IDMpICAjLSBzaG93cyB0aGUgV09MRCBWTUEgIGVzdGltYXRlZCBtYXRyaWNlcy4gKGJ5IGludmVydGluZyB0aGUgQSdzIG1hdHJpY2VzKQpgYGAKCgoKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUTyBETzoqKiBUcmFjayB3aGF0IGFyZSB0aGUgKiplc3RpbWF0ZWQqKiBlZmZlY3Qgb2YgYW4gVVMgInNob2NrIiBpbiB0aGUgU3BhbmlzaCBlY29ub215Lgo8L2Rpdj4KPGJyPgoKClRvIGZpbmlzaCB0aGUgc2Vjb25kIGNsYXNzLiBJbiBmYWN0IHRoZSBmaXJzdCBjbGFzcyBvZiB0aGUgZXhwcmVzcyBjb3Vyc2Ugd2UgaGF2ZSB0byB1bmRlcnN0YW5kIHdoeSB0aGUgV29sZCBWTUEgaXMgKipOT1QgVVNFRlVMKiouCgoKV2h5IGl0J3Mgbm90IHVzZWZ1bCB0aGUgJHlfe3R9fj0gQyhMKXZfe3R9PSBDX3swfXZfe3R9K0NfezF9dl97dC0xfStDX3syfXZfe3QtMn0rQ197M312X3t0LTN9K0NfezR9dl97dC00fSsuLi4kPwoKClRoZSB3aHkgaXMgaW4gdGhlIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cml4IG9mIHRoZSBpbm5vdmF0aW9ucyAkXFNpZ21hIF97dn0kLCB0aGlzIG1hdHJpeCBpdCdzIHVzdWFsbHkgbm90IGRpYWdvbmFsLiBUaGF0IGl0J3MgdGhlIGlubm92YXRpb25zIGFyZSBjb250ZW1wb3JhbmVvdXNseSBjb3JyZWxhdGVkIGFuZCB3ZSB0aGluaywgd2UgYmVsaWV2ZSwgdGhhdCBhIHRydWUgc3RydWN0dXJhbCBzaG9jayBzaG91bGQgYmUgImluZGVwZW5kZW50Iiwgb3J0aG9nb25hbCB0byBvdGhlciBzdHJ1Y3R1cmFsIHNob2Nrcy4KCkluIGEgbW9yZSBmb3JtYWwgd2F5OgoKPiBCVVQsIHVzdWFsbHkgdGhlIFZBUiBkaXN0dXJiYW5jZXMgKG9yIGlubm92YXRpb25zKSBhcmUgY29ycmVsYXRlZCwgc28gdGhlIGludGVycHJldGFiaWxpdHkgb2YgdGhlIGltcHVsc2UgcmVzcG9uc2VzIHRvIGlubm92YXRpb24gYmVjb21lcyBwcm9ibGVtYXRpYzogaWYgdGhlIGlubm92YXRpb25zIGFyZSBjb3JyZWxhdGVkIChvZmYgZGlhZ29uYWwgZWxlbWVudHMgb2YgJFxTaWdtYSBfe3Z9JCBkaWZmZXJlbnQgZnJvbSB6ZXJvKSB0aGVuLCBhbiBpbXB1bHNlIGluIGZvciBpbnN0YW5jZSwgJHZfe1VTQX0kIHdvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBpbXB1bHNlcyBpbiBpbm5vdmF0aW9ucyBpbiB0aGUgb3RoZXIgZXF1YXRpb25zIG9mIHRoZSBWQVIgbW9kZWwuIEluIG90aGVyIHdvcmRzLCBhcyB0aGUgaW5ub3ZhdGlvbnMgYXJlIG5vdCBsaWtlbHkgdG8gb2NjdXIgaW4gaXNvbGF0aW9uLCB0aGVuIHRyYWNraW5nIHRoZSBlZmZlY3Qgb2YgYW4gaW5ub3ZhdGlvbiBpbiBpc29sYXRpb24gZG9lcyBub3QgcmVmbGVjdCB3aGF0IGFjdHVhbGx5IGhhcHBlbnMgaW4gdGhlIHN5c3RlbSBhZnRlciBhbiBpbm5vdmF0aW9uIGhpdHMgdGhlIHN5c3RlbS4KCjxicj4KCiMgNC4gU3RydWN0dXJhbCBWQVJzCgpPSywgd2UgY2FuIGVzdGltYXRlIGEgVkFSIGFuZCBhZnRlciBlc3RpbWF0aW9uLCB3ZSBjYW4gYW4gaW52ZXJ0IG9idGFpbmluZyBzb21ldGhpbmcgImNsb3NlIiwgc29tZXRoaW5nIHRoYXQgaXMgc2ltaWxhciB0byB0aGUgSVJGJ3Mgd2Ugd2FudCB0byBvYnRhaW4uIEluIGZhY3QgdGhleSBhcmUgbm90IHRoZSB0cnVlIElSRidzIGJlY2F1c2UgdGhleSBhcmUgbm90IHJlYWxseSBzdHJ1Y3R1cmFsLiBEdWUgdG8gdGhlIGZhY3QgdGhhdCBpbm5vdmF0aW9ucyAoJHZfe3R9JCkgYXJlIGNvcnJlbGF0ZWQsIHRoZW4gdGhleSBjYW4ndCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgSVJGJ3Mgd2Ugd2FudCwgYmVjYXVzZSB3ZSB3b3VsZCBsaWtlIHRvIGhhdmUgSVJGJ3MgdG8gc3RydWN0dXJhbCBzaG9ja3MuCgpUbyBpbnRlcnByZXQgdGhlIFZBUiBpbiBhbiBlY29ub21pY2FsbHkgbWVhbmluZ2Z1bCB3YXksIHdlIG5lZWQgdG8gInRyYW5zZm9ybSIgdGhlIHZlY3RvciBvZiBpbm5vdmF0aW9ucygkdl97dH0kKSBpbnRvICJzdHJ1Y3R1cmFsIiBzaG9ja3MgKCRcdmFyZXBzaWxvbiBfe3R9JCksIGxpa2UgbW9uZXRhcnkgcG9saWN5IHNob2NrcywgcHJvZHVjdGl2aXR5IHNob2NrcywgLi4uIGFuZCBpZGVhbGx5IHRoZSBzdHJ1Y3R1cmFsIHNob2NrcyBzaG91bGQgYmU6ICAxKSBvcnRob2dvbmFsIHNob2NrcyAgMikgc2hvY2tzIHdpdGggZWNvbm9taWMgbWVhbmluZy4gCgpUaGF0J3Mgbm93IG91ciBvYmplY3RpdmUgdG8gdHJhbnNmb3JtIG91ciBzeXN0ZW0gaW4gYSB3YXkgdGhhdCBvdXIgdmFyaWFibGVzLCB0aGUgJHlfe3R9JCwgaW5zdGVhZCBvZiBiZWluZyBmdW5jdGlvbiBvZiB0aGUgaW5ub3ZhdGlvbnMgKCR2X3t0fSQpLCB0aGV5IHdlcmUgZnVuY3Rpb24gb2Ygc3RydWN0dXJhbCBzaG9ja3MgKCRcdmFyZXBzaWxvbl97dH0kKS4KCgpSZW1lbWJlciwgdGhhdCBpbnZlcnRpbmcgdGhlIFZBUiwgd2UgY2FuIG9idGFpbiBlYXNpbHkgdGhlIChXb2xkKSBWTUEgcmVwcmVzZW50YXRpb246ICAkeV97dH0gPSAgQyhMKXZfe3R9JCB3aGVyZSAkXFNpZ21hIF97dn0kICAgaXMgbm90IHRoZSBpZGVudGl0eSwgdGhlbiB0aGUgaW5ub3ZhdGlvbnMgYXJlIGNvcnJlbGF0ZWQuIEJVVCB3ZSB3b3VsZCBsaWtlIHRvIG9idGFpbiAgc29tZXRoaW5nIGxpa2UgJHlfe3R9ID0gRChMKVx2YXJlcHNpbG9uX3t0fSQgd2hlcmUgICRcU2lnbWEgX3tcdmFyZXBzaWxvbiB9PUkkCgoKVHJhbnNmb3JtaW5nIHRoZSBzeXN0ZW0gZnJvbSBvbmUgZXF1YXRpb24gdG8gdGhlIG90aGVyIGlzIGluIGZhY3QgYSBtYXRoZW1hdGljYWwgcHJvYmxlbSwgYW5kIFNpbXMgaXMgYSBtYXRoZW1hdGljaWFuLiBJbiBmYWN0LCB0aGVpciBmaXJzdCBwcm9wb3NhbCB3YXM6IAoKCj4gIFRoZSBzdHJ1Y3R1cmFsIFZBUiBtZXRob2RvbG9neSBmaXJzdCBlc3RpbWF0ZSBhbiB1bnJlc3RyaWN0ZWQgbW9kZWwgaW4gYSByZWR1Y2VkIGZvcm0uIE5vIHByaW9yIGtub3dsZWRnZSBpcyB1c2VkIGV4Y2VwdCB0byBkZWNpZGUgd2hpY2ggdmFyaWFibGVzIHNob3VsZCBlbnRlciB0aGUgc3lzdGVtLgoKPiBTaW1z4oCZcyBvcmlnaW5hbCBpZGVhIHRvIG9idGFpbiBJUkYgJiBGRVZEIHdhcyB0byBhc3N1bWUgcmVjdXJzaXZlIGNvbnRlbXBvcmFuZW91cyBpbnRlcmFjdGlvbnMgYW1vbmcgdmFyaWFibGVzLCBpLmUuIGJ5IGltcG9zaW5nIGEgY2VydGFpbiBzdHJ1Y3R1cmFsIG9yZGVyaW5nIG9mIHRoZSB2YXJpYWJsZXMuIEluIHRlcm1zIG9mIHRoZSBtb3ZpbmcgYXZlcmFnZSAoTUEpIHJlcHJlc2VudGF0aW9uLCB0aGUgc3RydWN0dXJhbCBzaG9ja3MgZG8gbm90IGFmZmVjdCBwcmVjZWRpbmcgdmFyaWFibGVzIHNpbXVsdGFuZW91c2x5LiBJbiBmYWN0IGhlIHByb3Bvc2VkIHRvIHVzZSB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbi4KCkxldCdzIHRyeSB0byBleHBsYWluIHRoaXMgbGFzdCBjcnlwdGljIHNlbnRlbmNlLiAKClRvIG9idGFpbi9lc3RpbWF0ZSBhbiBzdHJ1Y3R1cmFsIFZBUiwgdGhlIHVzdWFsIHByb2NlZHVyZSBpczoKCi0gZmlyc3QgYSAocmVkdWNlZCBmb3JtKSBWQVIgbW9kZWwgaXMgZXN0aW1hdGVkCgotIHdlIGNvdWxkIGludmVydCB0aGUgVkFSIHRvIG9idGFpbiB0aGUgKFdvbGQpIFZNQSBidXQgaXQncyBub3QgcmVhbGx5IHVzZWZ1bC4gV2UgY2FuIG9idGFpbiAoMSksIGJ1dCB3ZSB3YW50IGEgc3RydWN0dXJhbCBtb2RlbCAoMikKCi0gZnJvbSB0aGUgV29sZCBvciByZWR1Y2VkIGZvcm0gVk1BIHJlcHJlc2VudGF0aW9uIHdlIHdpbGwgb2J0YWluIHRoZSBzdHJ1Y3R1cmFsIFZBUi4gCgoKPGJyPgoKSW4gYSBkaWFncmFtOiAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiOTAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAiMDItVk1BLmpwZyIpICkgCmBgYAoKPGJyPgoKRXF1YXRpb24gKDIpIHdpbGwgYmUgdGhlIHN0cnVjdHVyYWwgVkFSLCBpbiBmYWN0IGlzLCBtb3JlIHByZWNpc2VseSB0aGUgc3RydWN0dXJhbCBWTUEgcmVwcmVzZW50YXRpb24gZm9yIG91ciBzeXN0ZW0gb2YgdmFyaWFibGVzICR5X3t0fSQgLCBhbmQgd2Ugd2FudCBvYnRhaW4gdGhpcyBzdHJ1Y3R1cmFsIFZBUiBpbiBvcmRlciB0byBhbnN3ZXIgb3VyIHR3byBxdWVzdGlvbnMuCgo8YnI+CgojIyA0LjEgU2ltcydzIGZpcnN0IHByb3Bvc2FsCgpUaGUgZmlyc3QgcHJvcG9zYWwgdG8gInJlY292ZXIiIHRoZSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGZyb20gdGhlIHJlZHVjZWQgZm9ybSBlc3RpbWF0ZXMgd2FzIG1hZGUgYnkgU2ltcyBpbiAxOTgwLgoKSW4gcGFydGljdWxhciwgU2ltcygxOTgwKSBwcm9wb3NlIHRvIHVzZSB0aGUgW0Nob2xlc2t5IGRlY29tcG9zaXRpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Nob2xlc2t5X2RlY29tcG9zaXRpb24pIHRvIG9idGFpbiAoMikgZnJvbSAoMSkuIExldCdzIGRldmVsb3AgaXQgYSBsaXR0bGU6CgotIENob2xlc2t5IGZvdW5kIHRoYXQgZXZlcnkgc3ltbWV0cmljIGRlZmluaXRlIHBvc2l0aXZlIG1hdHJpeCwgbGV0J3MgY2FsbCBpdCAkTSQsIGFkbWl0cyBhICoqdW5pcXVlKiogZmFjdG9yaXNhdGlvbiBsaWtlICRNID0gUFBee157XHByaW1lIH19JC4gV2hlcmUgICRQJCBpcyBjYWxsZWQgdGhlIENob2xlc2t5IGZhY3RvciwgYmVpbmcgJFAkIGEgICoqbG93ZXIgdHJpYW5ndWxhcioqIG1hdHJpeC4gCgotIFNpbXMgaXMgYSBtYXRoZW1hdGljaWFuIGFuZCBoZSBvYnZpb3VzbHkga25ldyB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiwgdGhlbiBoZSBwcm9wb3NlZCBpbiBoaXMgMTk4MCBwYXBlciB0byB1c2UgdGhlIENob2xlc2t5IGZhY3RvcmlzYXRpb24gaW4gb3JkZXIgdG8gdHJhbnNmb3JtIG91ciByZWR1Y2VkIGZvcm0gVkFSIHRvIGEgInN0cnVjdHVyYWwiIG9uZS4gU3RydWN0dXJhbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGUgdHJhbnNmb3JtZWQgImlubm92YXRpb25zIiB3ZXJlIG9ydGhvZ29uYWwuIExldCdzIGV4cGxhaW4gdGhpcyBhIGxpdHRsZSBiaXRlIG1vcmU6CgotIFRoZSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCBvZiBvdXIgVkFSLCB0aGUgJFxTaWdtYSBfe3Z9JCwgYXMgaXQgaXMgYSB2YXJpYW5jZS1jb3ZhcmlhbmNlIG1hdHJpeCwgaXQgYWRtaXQgdGhlIENob2xlc2t5IGRlY29tcG9zaXRpb246ICRcU2lnbWEgX3t2fSA9IFBQXntee1xwcmltZSB9fSQsIHdoZXJlICRQJCBpcyB0aGUgQ2hvbGVza3kgZmFjdG9yOyB0aGF0IGlzICRQJCBtYXRyaXggaGFzIHNvbWUgcHJvcGVydGllczogIAoKICAxKSAgJFAkIGlzIGxvd2VyIHRyaWFuZ3VsYXIsIGFuZCAgIAogIDIpICAkUF57LTF9XFNpZ21hIF97dn1QXnt7LTF9XntccHJpbWV9fT0gSSQgIAoKVGhlbiwgU2ltcyBwcm9wb3NlcyB0byB0cmFuc2Zvcm0gdGhlIHJlZHVjZWQgZm9ybSBWTUEgcmVwcmVzZW50YXRpb24gKDEpLCBsaWtlIHRoaXM6CgotICR5X3t0fSA9ICBDKEwpdl97dH0kCgoKLSAkeV97dH09IEMoTCkgUFBeey0xfXZfe3R9JAoKQXQgZmlyc3QsIHRoaXMgdHJhbnNmb3JtYXRpb24gc2VlbXMgc3R1cGlkLCBiZWNhdXNlIGl0IHNlZW1zIHRoYXQgd2UgYXJlIGNvbXBsaWNhdGluZyB0aGluZ3MsIGJ1dCBsZXQncyBjb25jZW50cmF0ZSBvbiBhIHNwZWNpZmljIHBhcnQgb2YgdGhlIGxhc3QgZXF1YXRpb246ICRQXnstMX12X3t0fSQuIAoKLSBJbiBmYWN0LCAkUF57LTF9dl97dH0kIGlzIGEgdHJhbnNmb3JtYXRpb24vcm90YXRpb24gb2YgdGhlIGlubm92YXRpb25zLiBXZSBhcmUgbXVsdGlwbHlpbmcsIHdlIGFyZSB0cmFuc2Zvcm1pbmcsIHRoZSBpbm5vdmF0aW9ucywgdGhlICR2X3t0fSQsIGFuZCB0aGVuIG9idGFpbmluZyBhIG5ldyB2ZWN0b3Igb2YgImlubm92YXRpb25zIi4gV2UgY2FuIGNhbGwgdGhvc2UgbmV3IGlubm92YXRpb25zIGFzIHdlIHdhbnQsIGZvciBpbnN0YW5jZSwgd2UgY2FuIGNhbGwgdGhlbSAkXHZhcmVwc2lsb25fe3R9JDsgdGhhdCBpcywgICRQXnstMX12X3t0fSA9IFx2YXJlcHNpbG9uX3t0fSQuCgoKTGV0J3Mgc2VlIHdoYXQgYXJlIHRoZSBjb3ZhcmlhbmNlIG1hdHJpeCBvZiB0aGVzZSBuZXcgImlubm92YXRpb25zIiB0aGF0IHdlIGhhdmUgY2FsbGVkICRcdmFyZXBzaWxvbl97dH0kLiBEbyB5b3UgZ3Vlc3M/CgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gIjkwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltYWdlbmVzIiwgIjAzLVZNQS5qcGciKSApIApgYGAKCjxicj4KClRoYXQgaXMsIHRoZSAidHJhbnNmb3JtZWQgaW5ub3ZhdGlvbnMiLCB0aGUgJFx2YXJlcHNpbG9uX3t0fSQsIGFyZSBub3QgY29ycmVsYXRlZCwgdGhleSBhcmUgb3J0aG9nb25hbCAuLi4uIHRoZW4gU2ltcyBpbnRlcnByZXRlZCB0aGVtIGFzICoqc3RydWN0dXJhbCBzaG9ja3MqKi4gR29vZCwgQlVUIGhpcyBwcm9wb3NhbCByZWNlaXZlZCBzb21lIGNyaXRpcXVlcyBhcyB3ZWxsLCAuLi4gYnV0IHdlIHdpbGwgc2VlIHRoZSBjcml0aXF1ZXMgdG8gU2ltcydzIHByb3Bvc2FsIGxhdHRlci4KCjxicj4gCgpCeSBub3cgbGV0J3MgcmV0dXJuIHRvOiAKCi0gJHlfe3R9PSBDKEwpIFBQXnstMX12X3t0fSQgICAgYXMgd2UgaGF2ZSBjYWxsICRQXnstMX12X3t0fSA9IFx2YXJlcHNpbG9uX3t0fSQsIGluIGZhY3Qgd2UgaGF2ZToKCgotICR5X3t0fT0gQyhMKSBQXHZhcmVwc2lsb25fe3R9JCAgIAoKCgo8YnI+CjxkaXYgY2xhc3MgPSAiYmx1ZSI+CioqVE8gVEhJTks6KiogVGhlIGxhc3QgZXF1YXRpb24gJHlfe3R9PSBDKEwpIFBcdmFyZXBzaWxvbl97dH0kICAgaXMgYSBzdHJ1Y3R1cmFsIG1vZGVsPyBDb3VsZCBpdCBiZSB1c2VkIHRvIG9idGFpbiB0aGUgYW5zd2VycyB0byBvdXIgdHdvIHF1ZXN0aW9ucyAodGhlIGltcG9ydGFuY2Ugb2YgdGhlIEV1cm9wZWFuIHNob2NrIGludG8gdGhlIFNwYW5pc2ggZWNvbm9teSk/IEhvdyBjYW4gd2Ugb2J0YWluIHRoaXMgbmV3IHJlcHJlc2VudGF0aW9uIG9mICR5X3t0fSQsIHRoZSBzbyBjYWxsZWQgc3RydWN0dXJhbCBWQVIgbW9kZWwgY2xhaW1lZCBieSBTaW1zPwo8L2Rpdj4KPGJyPgoKCkluIGZhY3Qgd2UgY2FuIGNhbGwgJEMoTClQID0gRChMKSQsIGFuZCB0aGVuLCB3ZSB3aWxsIGhhdmUgJHlfe3R9PSBEKEwpIFx2YXJlcHNpbG9uX3t0fSQsIGFuZCB0aGUgJEQoTCkkIHdpbGwgZ2l2ZSB1cyB0aGUgcmVzcG9uc2Ugb2YgdGhlIHZhcmlhYmxlcyBvZiBvdXIgc3lzdGVtICgkeV97dH0kKSB0byBhIHZlY3RvciBvZiBzaG9ja3MgdGhhdCBhcmUgb3J0aG9nb25hbCAoJFx2YXJlcHNpbG9uX3t0fSQpLgoKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUTyBUSElOSzoqKiBIb3cgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgRChMKT8KPC9kaXY+Cjxicj4KCgpUaGluayB0aGF0ICRDKEwpUCA9IEQoTCkkOyB0aGF0IGlzLCAKCiQkKENfezB9ICsgQ197MX1MICsgQ197Mn1MXnsyfSkgUCA9IERfezB9ICsgRF97MX1MICsgRF97Mn1MXnsyfSQkCgpUaGF0IGlzIDogCgotICRDX3swfSBQID0gRF97MH0kCgotICRDX3sxfSBQID0gRF97MX0kIC4uLgoKCjxicj4KClRoYXQncyB3YXMgdGhlIHByb3Bvc2FsIG9mIFNpbXMgdG8gZXN0aW1hdGUgc3RydWN0dXJhbCBJUkYnczogaXQgY29uc2lzdHMgb24gZmlyc3QgdG8gZXN0aW1hdGUgYSBWQVIgKGluIHJlZHVjZWQgZm9ybSksIGludmVydCB0aGUgYXV0b3JlZ3Jlc3NpdmUgcG9seW5vbWlhbCB0byBvYnRhaW4gdGhlIChyZWR1Y2VkIGZvcm0pIFZNQSByZXByZXNlbnRhdGlvbiBmb3IgJHlfe3R9JCwgYW4gZmluYWxseSB0byB1c2UgdGhlIENob2xlc2t5IGZhY3RvciB0byB0cmFuc2Zvcm0gdGhlIHJlZHVjZWQgZm9ybSBWTUEgdG8gYSAic3RydWN0dXJhbCIgcmVwcmVzZW50YXRpb24uICBJbiBtb3JlIHRlY2huaWNhbCB3b3JkczoKCj4gU2ltc+KAmXMgb3JpZ2luYWwgaWRlYSB3YXMgdG8gb2J0YWluIElSRiZGRVZEIHdhcyB0byBhc3N1bWUgcmVjdXJzaXZlIGNvbnRlbXBvcmFuZW91cyBpbnRlcmFjdGlvbnMgYW1vbmcgdmFyaWFibGVzLCBpLmUuIGJ5IGltcG9zaW5nIGEgY2VydGFpbiBzdHJ1Y3R1cmFsIG9yZGVyaW5nIG9mIHRoZSB2YXJpYWJsZXMuIEluIHRlcm1zIG9mIHRoZSBtb3ZpbmcgYXZlcmFnZSAoTUEpIHJlcHJlc2VudGF0aW9uLCB0aGUgc3RydWN0dXJhbCBzaG9ja3MgZG8gbm90IGFmZmVjdCBwcmVjZWRpbmcgdmFyaWFibGVzIHNpbXVsdGFuZW91c2x5IChDaG9sZXNreSkKCkJ5IG5vdyB5b3Ugc2hvdWxkIHN0YXJ0IHRvIHVuZGVyc3RhbmQgdGhpcyBsYXN0IHNlbnRlbmNlLiBUaGVyZSBpcyBzdGlsbCBhIHRyaWNreSBwYXJ0IHRoZXJlOiB0aGUgImFzc3VtZSByZWN1cnNpdmUgY29udGVtcG9yYW5lb3VzIGludGVyYWN0aW9uIiBwYXJ0LgoKVG8gZmluYWxseSB1bmRlcnN0YW5kIHRoZSBzZW50ZW5jZSwgd2Ugc2hvdWxkIHJldHVybiB0byB0aGUgc3RydWN0dXJhbCBWQVIgcmVwcmVzZW50YXRpb246IAoKCiQkeV97dH09IEMoTCkgUFx2YXJlcHNpbG9uX3t0fSA9IEQoTClcdmFyZXBzaWxvbl97dH0kJAoKYW5kIHRvIHJlbWVtYmVyIHRoYXQgJERfezB9ID0gUCQgYW5kIHRoYXQgJFAkIGlzIGxvd2VyIHRyaWFuZ3VsYXIgLCB0aGVuIC4uLi4uIHdoZW4gd2UgdHJhbnNmb3JtIHRoZSByZWR1Y2VkIFZNQSB0byBvYnRhaW4gdGhlIHN0cnVjdHVyYWwgVk1BIGF0IHRoZSBlbmQgd2UgYXJlIGRvaW5nLCB3ZSBhcmUgaW1wb3NpbmcsIHRoYXQgdGhlIG1hdHJpeCB0aGF0IGdpdmVzIHRoZSBjb250ZW1wb3JhbmVvdXMgb3IgaW5zdGFudGFuZW91cyBlZmZlY3Qgb2YgdGhlIHN0cnVjdHVyYWwgc2hvY2tzICRcdmFyZXBzaWxvbl97dH0kIGl0J3MgIGluIHNvbWUgc2Vuc2UgcmVjdXJzaXZlLiBXZSBhcmUgaW1wb3NpbmcgYSByZWN1cnNpdmUgc3RydWN0dXJhbCBhbW9uZyBvdXIgMyBlcXVhdGlvbnMuCgokJHlfe3R9fj1EX3swfVx2YXJlcHNpbG9uX3t0fStEX3sxfVx2YXJlcHNpbG9uX3t0LTF9K0RfezJ9XHZhcmVwc2lsb25fe3QtMn0rRF97M31cdmFyZXBzaWxvbl97dC0zfStcdmFyZXBzaWxvbl97NH12X3t0LTR9Ky4uLiQkCgpUaGUgbWF0cml4ICREX3swfSQgY29udGFpbnMgdGhlIGNvbnRlbXBvcmFuZW91cy9pbnN0YW50YW5lb3VzIHJlc3BvbnNlIG9mIHRoZSB2YXJpYWJsZXMgKCR5X3t0fSQpIHRvIHRoZSBzdHJ1Y3R1cmFsIHNob2NrcyAkXHZhcmVwc2lsb25fe3R9JC4gKipBTkQqKiwgaG93IGl0IGlzICREX3swfSQ/CgoKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUTyBUSElOSzoqKiBIb3cgaXQgaXMgJERfezB9JD8gTG93ZXIgdHJpYW5ndWxhciwgIFdoeT8gYW5kLCB3aGF0IGRvZXMgaW1wbGllcyB0aGF0ICREX3swfSQgaXMgbG93ZXIgdHJpYW5ndWxhcj8KPC9kaXY+Cjxicj4KCgpJZiAkRF97MH0kIGlzIGxvd2VyIHRyaWFuZ3VsYXIsIHRoYXQgbWVhbnMgdGhhdCBhbiAiaW5ub3ZhdGlvbiIgKGluIGZhY3Qgbm93LCBhIHN0cnVjdHVyYWwgc2hvY2sgLCAkXHZhcmVwc2lsb257dH0kKSBpbiB0aGUgZmlyc3QgZXF1YXRpb24gY291bGQgKipjb250ZW1wb3JhbmVvdXNseSoqIGFmZmVjdHMgdG8gKipBTEwqKiB0aGUgdmFyaWFibGVzIGluIHRoZSBWQVIsIHdoaWxlIHRoZSBpbm5vdmF0aW9uIGluIHRoZSBzZWNvbmQgZXF1YXRpb24gY291bGQgY29udGVtcG9yYW5lb3VzbHkgYWZmZWN0IGFsbCB0aGUgdmFyaWFibGVzIGluIHRoZSBWQVIgKipleGNlcHQqKiB0aGUgZmlyc3Qgb25lLCDigKYgYW5kIGZpbmFsbHksIGFuIGlubm92YXRpb24gaW4gdGhlIGxhc3QgZXF1YXRpb24gY291bGQgY29udGVtcG9yYW5lb3VzbHkgYWZmZWN0cyBvbmx5IHRoZSBsYXN0IHZhcmlhYmxlIGluIHRoZSBWQVIKCjxicj4KCiMjIDQuMiBDcml0aXF1ZXMgdG8gU2ltcydzIHByb3Bvc2FsCgpUaGUgcHJvcG9zYWwgb2YgU2ltcydzIDE5ODAgaW1wbGllcyB0aGF0IHRoZSBmaXJzdCB2YXJpYWJsZSBpbiB0aGUgc3lzdGVtLCBpbiBvdXIgY2FzZSB0aGUgR0RQIG9mIFVTQSBjb3VsZCBhZmZlY3QgYWxsIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHN5c3RlbS4gVGhlIHNlY29uZCB2YXJpYWJsZSwgaW4gb3VyIGNhc2UgRTE1IEdEUCBjb3VsZCBhZmZlY3Qgb25seSB0aGUgc2Vjb25kIGFuZCB0aGlyZCB2YXJpYWJsZS4gQW5kIG91ciB0aGlyZCB2YXJpYWJsZSAoU3BhbmlzaCBHRFApIGNvdWxkIG9ubHkgYWZmZWN0IGhpcyBvd24gZHluYW1pY3MgY29udGVtcG9yYW5lb3VzbHkuIFRoYXQgaXMsIHdoZW4gd2UgdHJhbnNmb3JtIG91ciBWQVIgdXNpbmcgdGhlIENob2xlc2t5IGRlY29tcG9zaXRpb24gd2UgYXJlIGltcG9zaW5nIGEgcmVjdXJzaXZlIHN0cnVjdHVyZSBhbW9uZyB0aGUgdmFyaWFibGVzLiBUaGUgb3JkZXIgb2YgdmFyaWFibGVzIGlzIGltcG9ydGFudCwgYmVjYXVzZSBvbmx5IHRoZSBmaXJzdCB2YXJpYWJsZXMgY2FuIGFmZmVjdHMgYWxsIHRoZSBvdGhlcnMgdmFyaWFibGVzIGNvbnRlbXBvcmFuZW91c2x5LgoKCgo8YnI+CjxkaXYgY2xhc3MgPSAiYmx1ZSI+CioqVE8gVEhJTks6KiogRG8geW91IHRoaW5rIHRoYXQgaXQgaXMgc2Vuc2libGUgdG8gaW1wb3NlIGEgcmVjdXJzaXZlIHN0cnVjdHVyZSBpbiBvdXIgc3lzdGVtPyBUaGUgYW5zd2VyIGlzIG1heWJlIHllcywgbWF5YmUgbm90IC4uLgo8L2Rpdj4KPGJyPgoKCgpPZiBjb3Vyc2UgdGhlIHByb3Bvc2FsIG9mIFNpbXMgcmVjZWl2ZWQgc29tZSBjcml0aXF1ZXMgYXMgd2VsbC4gSW4gZmFjdCBvbmUgb2YgdGhlIGNsYWltcyBvZiBTaW1zIGluIGZhdm91ciBvZiB1c2luZyBWQVIgaXMgdGhhdCB0aGVpciB1c2UgbWFrZXMgdW5uZWNlc3NhcnkgdGhlIHVzZSBvZiB3aGF0IFNpbXMgY2FsbGVkICJpbmNyZWRpYmxlIHJlc3RyaWN0aW9ucyIgdGhhdCBvdGhlciBhcHByb2FjaGVzLCBsaWtlIGZvciBpbnN0YW5jZSBzaW11bHRhbmVvdXMgZXF1YXRpb25zIG1vZGVscywgdXNlZC4KClRoZSBmaXJzdCBwcm9wb3NhbCAoU2ltcykgdG8gaWRlbnRpZnkgdGhlIHN0cnVjdHVyYWwgZm9ybSBieSBtZWFucyBvZiB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBzZWVtcyB0aGF0IGl0J3Mgbm90IGltcG9zaW5nIG5vbmUgcmVzdHJpY3Rpb24gYnV0IC4uLgoKICAgICAKKiBVc2luZyB0aGUgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiB0byBpZGVudGlmeSB0aGUgc3RydWN0dXJhbCBWQVIgaXMgZXF1aXZhbGVudCB0byBjaG9vc2luZyBhIHJlY3Vyc2l2ZSBzeXN0ZW0gb2YgZXF1YXRpb25zLCBhbmQgaW4gZmFjdCB0aGlzLCBpbiByZWFsaXR5IG1lYW5zIHRoYXQgeW91IGFyZSBpbXBvc2luZyByZXN0cmljdGlvbnMgdG8gdGhlIHN5c3RlbS4gSW4gb3VyIGNhc2UgMyB6ZXJvIHJlc3RyaWN0aW9uIGluICREX3swfSQgCgoKKiBPbiB0b3Agb24gdGhhdCwgYW5vdGhlciBjcml0aXF1ZSB0byBTaW1zJ3MgcHJvcG9zYWwgaXMgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgc3lzdGVtIG1hdHRlcnM7IHRoYXQgaXMsICoqaWRlbnRpZmljYXRpb24gaXMgbm90IHVuaXF1ZSoqLgoKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUTyBUSElOSzoqKiBXaGF0IGRvZXMgbWVhbiAqKmlkZW50aWZpY2F0aW9uIGlzIG5vdCB1bmlxdWUqKj8gQ291bGQgeW8gZXhwbGFpbiBpdCB3aXRoIGFuIGV4YW1wbGUgdXNpbmcgb3VyIDMgdmFyaWFibGVzPyBUaGluayB3aGF0IGRvZXMgaW1wbHkgaWYgd2UgcHV0IFNwYWluIGFzIHRoZSBmaXJzdCB2YXJpYWJsZSBpbiAkeV97dH0kLgo8L2Rpdj4KPGJyPgoKCiogSXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCB0aGF0IHRoZSAib3J0aG9nb25hbGl6YXRpb24iIG9mIHRoZSByZWR1Y2VkLWZvcm0gcmVzaWR1YWxzIGJ5IGFwcGx5aW5nIGEgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBpcyBhcHByb3ByaWF0ZSBvbmx5IGlmIHRoZSByZWN1cnNpdmUgc3RydWN0dXJlIGVtYm9kaWVkIGluIHRoZSBDaG9sZXNreSBmYWN0b3Jpc2F0aW9ucyBjYW4gYmUganVzdGlmaWVkIG9uIGVjb25vbWljIGdyb3VuZHMuCgoqIENvb2xleSBhbmQgTGVSb3kgKDE5ODUpIGNyaXRpY2l6ZWQgdGhlIFZBUiBtZXRob2RvbG9neSBiZWNhdXNlIG9mIGl0cyAiYXRoZW9yZXRpY2FsIiBpZGVudGlmaWNhdGlvbiBzY2hlbWUuIFRoZXkgYXJndWVkIHRoYXQgU2ltcyBkaWQgbm90IGV4cGxpY2l0bHkganVzdGlmeSB0aGUgaWRlbnRpZmljYXRpb24gcmVzdHJpY3Rpb25zIGFuZCBjbGFpbWVkIHRoYXQgYSBtb2RlbCBpZGVudGlmaWVkIGJ5IHRoaXMgYXJiaXRyYXJ5IHByb2NlZHVyZSBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzdHJ1Y3R1cmFsIG1vZGVsLCBiZWNhdXNlIGEgZGlmZmVyZW50IHZhcmlhYmxlIG9yZGVyaW5nIHlpZWxkcyBkaWZmZXJlbnQgc3RydWN0dXJhbCBwYXJhbWV0ZXJzLiAKCiogU2ltcyAoMTk4NikgcHJvcG9zZSB0cnlpbmcgZGlmZmVyZW50IG9yZGVyaW5ncyAodGhlcmUgYXJlIG4hKSBhbmQgY2hlY2tpbmcgaWYgdGhlIHJlc3VsdHMgYXJlIHJvYnVzdC4gSW4gZ2VuZXJhbCwgdGhlIGhpZ2hlciB0aGUgZWxlbWVudHMgb2ZmLWRpYWdvbmFsIGVsZW1lbnRzIG9mICRcU2lnbWEgX3t2fSQgYXJlLCB0aGUgaGlnaGVyIHRoZSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzLgoKKiBCdXQsIGV2ZW4gaWYgdGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlcyBhY3Jvc3MgdGhlc2UgbiEgc3BlY2lmaWNhdGlvbnMsIHRoaXMgd291bGQgb25seSBwcm92ZSB0aGF0IHRoZSByZXN1bHRzIGFyZSByb2J1c3QgYW1vbmcgYWxsIHJlY3Vyc2l2ZSBvcmRlcmluZ3MsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHRoZSBtb2RlbCB0byBiZSByZWN1cnNpdmUgaW4gdGhlIGZpcnN0IHBsYWNlLgoKKiBTaW5jZSB0aGVuLCBzZXZlcmFsIHdheXMgdG8gaWRlbnRpZnkgVkFSIG1vZGVscyBoYXZlIGJlZW4gcHJvcG9zZWQgKHNob3J0LXJ1biByZXN0cmljdGlvbnMsIGxvbmctcnVuIHJlc3RyaWN0aW9ucywgY29pbnRlZ3JhdGlvbiByZXN0cmljdGlvbnMsIHNpZ24gcmVzdHJpY3Rpb24sIG5hcnJhdGl2ZSBhcHByb2FjaGVzIGV0Yy4gKS4KCiogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHJlY3Vyc2l2ZSBpZGVudGlmaWNhdGlvbiBzY2hlbWUsIEJlcm5hbmtlICgxOTg2KSBhbmQgQmxhbmNoYXJkIGFuZCBXYXRzb24gKDE5ODYpIGFtb25nIG90aGVycyBpbnRyb2R1Y2VkIG5vbi1yZWN1cnNpdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBjb250ZW1wb3JhbmVvdXMgaW50ZXJhY3Rpb25zIGFtb25nIHZhcmlhYmxlcyBmb3IgaWRlbnRpZmljYXRpb24KCiogQXMgZWNvbm9taWMgdGhlb3J5IG9mdGVuIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIG1lYW5pbmdmdWwgY29udGVtcG9yYW5lb3VzIHJlc3RyaWN0aW9ucyAoYW5kIHRoZSBtb3JlIHZhcmlhYmxlcyB5b3UgcHV0IGludG8geW91ciBzeXN0ZW0sIHRoZSBtb3JlIHJlc3RyaWN0aW9ucyB5b3UgbmVlZCksIHRoZSBzZWFyY2ggZm9yIGFkZGl0aW9uYWwgaWRlbnRpZnlpbmcgcmVzdHJpY3Rpb25zIGxlZCBCbGFuY2hhcmQgYW5kIFF1YWggKDE5ODkpIGFuZCBzdWJzZXF1ZW50bHkgU2hhcGlybyBhbmQgV2F0c29uICgxOTg4KSBhbmQgR2FsaSAoMTk5MikgdG8gaW50cm9kdWNlIHJlc3RyaWN0aW9ucyBvbiB0aGUgc3lzdGVtJ3MgbG9uZy1ydW4gcHJvcGVydGllcy4gVGhlc2UgbG9uZyBydW4gcmVzdHJpY3Rpb25zIGFyZSB1c3VhbGx5IGJhc2VkIG9uIG5ldXRyYWxpdHkgcG9zdHVsYXRlcwoKKiBGYXVzdCBhbmQgTGVlcGVyICgxOTk3KSBoYXZlIGNyaXRpY2l6ZWQgdGhlIHVzZSBvZiBsb25nIHJ1biByZXN0cmljdGlvbnMgdG8gaWRlbnRpZnkgc3RydWN0dXJhbCBzaG9ja3MsIGFuZCBzaG93IHRoYXQgdW5sZXNzIHRoZSBlY29ub215IHNhdGlzZmllcyBzb21lIHR5cGVzIG9mIHN0cm9uZyByZXN0cmljdGlvbnMsIHRoZSBsb25nIHJ1biByZXN0cmljdGlvbnMgd2lsbCBiZSB1bnJlbGlhYmxlCgoqIE1vcmUgcmVjZW50bHksIGltcG9zaW5nIHNpZ24gcmVzdHJpY3Rpb25zLCBhbGxvd3MgeW91IHRvIHRlc3QgdGhlIGltcGxpY2F0aW9ucyBvZiBhbGwgdHlwZXMgb2YgcmVzdHJpY3Rpb25zLiBCeSBkcm9wcGluZyBvbmUgYWZ0ZXIgb25lIG9mIHRoZSAiZHViaW91cyByZXN0cmljdGlvbnMiLCBvbmUgY2FuIHRlc3Qgd2hldGhlciB0aGUgcmVzcG9uc2VzIHRvIHNob2NrcyBhcmUgc2Vuc2l0aXZlIHRvIHRoZSByZXN0cmljdGlvbnMgb2Z0ZW4gaW1wb3NlZAoKKiBGb3IgYSBkZXRhaWxlZCBleHBvc2l0aW9uIGFuZCBleGFtcGxlcyBvZiBkaWZmZXJlbnQgc291cmNlcyBvZiBpZGVudGlmeWluZyByZXN0cmljdGlvbnMgc2VlIFtLaWxpYW4oMjAxMSldKGh0dHBzOi8vaWRlYXMucmVwZWMub3JnL3AvY3ByL2NlcHJkcC84NTE1Lmh0bWwpCgoKClJlbWVtYmVyOiBhIHN0cnVjdHVyYWwgVkFSIGFuYWx5c2lzIHVzdWFsbHkgc3RhcnQgc3BlY2lmeWluZywgdmFsaWRhdGluZyBhbmQgZmluYWxseSBlc3RpbWF0aW5nIGEgVkFSIGluIHJlZHVjZWQgZm9ybS4gRm9yIHRoZSBWQVIgcmVwcmVzZW50YXRpb24gd2UgY291bGQgb2J0YWluIGEgcmVkdWNlZCBmb3JtIFZNQSByZXByZXNlbnRhdGlvbiwgYnV0IHRoaXMgcmVkdWNlZCBWTUEgaGFzIGxpdHRsZSBpbnRlcmVzdCBiZWNhdXNlIGl0J3Mgbm90IHN0cnVjdHVyYWwsIHRoZWlyIElSRidzIGhhdmUgbm90IGEgY2xlYXIgaW50ZXJwcmV0YXRpb24gYmVjYXVzZSB0aGUgaW5ub3ZhdGlvbnMgKCR2X3t0fSQpIGFyZSBub3Qgb3J0aG9nb25hbCwgdGhleSBhcmUgY29ycmVsYXRlZC4gVGhlbiwgaW4gdGhlIHN0cnVjdHVyYWwgVkFSIG1ldGhvZG9sb2d5IHRoZSByZWR1Y2VkIFZNQSByZXByZXNlbnRhdGlvbiBpcyByYXJlbHkgc2hvdywgaW5zdGVhZCBhIHdheSB0byByZWNvdmVyLCB0byBpZGVudGlmeSB0aGUgc3RydWN0dXJhbCBWQVIgaXMgcHJvcG9zZWQuCgoKVXN1YWxseSB0aGlzIGltcGxpZXMgdGhlIHVzZSBvZiBzb21lIHJlc3RyaWN0aW9ucy4gVGhlIGZpcnN0IHByb3Bvc2FsIG1hZGUgYnkgU2ltcyBpbiAxOTgwIGltcGxpZWQgdG8gaW1wb3NlIGEgcmVjdXJzaXZlIHN5c3RlbS4gCgotIFRoZSAgbW9zdCBjb21tb24gcmVzdHJpY3Rpb25zIGFyZSBzaG9ydC1ydW4gcmVzdHJpY3Rpb24gb3IgbG9uZy1ydW4gcmVzdHJpY3Rpb25zIChyZXN0cmljdGlvbiBvbiAkRCgxKSQpLiBJIHdpbGwgZXhwbGFpbiB0aGlzIGF0IGNsYXNzIGJ1dCB5b3Ugc2hvdWxkIHRyeSB0byB1bmRlcnN0YW5kIHRoZSBzbGlkZXMgb3IgdG8gcmVhZCBzb21lIG9mIHRoZSByZWZlcmVuY2VzLgoKCi0gSW4gZmFjdCBpbiBjbGFzcyB3ZSBlc3RpbWF0ZSBhIHRyaXZhcmlhdGUgc3RydWN0dXJhbCBWQVIsIGJ1dCB3ZSB3aWxsIHVzZSAoZm9yIHBlZGFnb2dpY2FsIHJlYXNvbnMpIHR3byB3YXlzLCB0d28gbWV0aG9kcywgdG8gaWRlbnRpZnkgdGhlIHN0cnVjdHVyYWwgVkFSOiB0aGUgZmlyc3Qgb25lIHdpbGwgdXNlIHNob3J0IHJ1biByZXN0cmljdGlvbiwgdGhhdCBpcyByZXN0cmljdGlvbiBpbiAkRF97MH0kLCBhbmQgdGhlIHNlY29uZCBvbmUsIHdpbGwgdXNlIGxvbmctcnVuIHJlc3RyaWN0aW9ucywgdGhhdCBpcywgcmVzdHJpY3Rpb24gb24gdGhlICREKDEpJCBtYXRyaXguCgotIFdlIHdpbGwgc2VlIHRoaXMgYXQgY2xhc3MgaW4gdGhlIExhYiBzZWN0aW9uLgoKCgo8YnI+CjxkaXYgY2xhc3MgPSAic3RlZWwiPgoqKkFUVEVOVElPTjoqKiBXZSBoYXZlIHJlYWNoZWQgYWxtb3N0IHRoZSBlbmQgb2YgdGhlICoqZXhwcmVzcyoqLW1pbmktY291cnNlLCBCVVQgYXQgbGVhc3QgeW91IHNob3VsZCBrbm93IHRoZSBzZWNvbmQgbW9zdCB1c2VkICJpbnN0cnVtZW50IiBpbiBWQVIgbWV0aG9kb2xvZ3k6IHRoZSBGRVZECjwvZGl2Pgo8YnI+CgoKCiMjIDQuMyBJUkYgYW5kIEZFVkQKCk9uY2Ugd2UgaGF2ZSBpZGVudGlmaWVkL29idGFpbmVkIG91ciBzdHJ1Y3R1cmFsIFZBUiwgd2UgY291bGQgb2J0YWluIHRoZSBJUkYncyBhbmQgRkVEVidzLCB0aGUgdHdvIHByaW5jaXBhbCBpbnN0cnVtZW50cyBvZiB0aGUgVkFSIG1ldGhvZG9sb2d5IGluIG9yZGVyIHRvIHNob3cgdGhlIHJlc3VsdHMuCgpUaGUgSVJGJ3MgaXMgbm90aGluZyBtb3JlIHRoYXQgYSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlcXVlbmNlIG9mICREX3tpfSQgbWF0cmljZXMuIFRoaXMgbWF0cmljZXMgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluLCB0aGUgZWZmZWN0IHRob3VnaHQgdGltZSBvZiB0aGUgc3RydWN0dXJhbCBzaG9ja3MgJFx2YXJlcHNpbG9uX3t0fSQgaW50byB0aGUgdmFyaWFibGVzICR5XyB7dH0kLgoKCkFzIGFuIGV4YW1wbGUgdG8gaWxsdXN0cmF0ZSB0aGlzLCBpbWFnaW5lIHRoYXQgb3VyIHN5c3RlbSB3b3VsZCBiZToKCgokJHlfe3R9PVxsZWZ0WyAKXGJlZ2lue2FycmF5fXtjfQpZX3t0fSBcXCAKUF97dH0lClxlbmR7YXJyYXl9JQpccmlnaHRdIFwgXCBcIFx2YXJlcHNpbG9uIF97dH09XGxlZnRbIApcYmVnaW57YXJyYXl9e2N9Clx2YXJlcHNpbG9uIF97dH1eezF9IFxcIApcdmFyZXBzaWxvbiBfe3R9XnsyfSUKXGVuZHthcnJheX0lClxyaWdodF0gJCQKCjxicj4KCkFuIHRoYXQgd2UgaGF2ZSBvYnRhaW5lZC9pZGVudGlmaWVkIHRoZSBzdHJ1Y3R1cmFsIFZBUiB1c2luZyB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiwgdGhlbiBpbWFnaW5lIHRoYXQgdGhlIHN0cnVjdHVyYWwgVkFSICR5X3t0fSA9IEQoTCkgXHZhcmVwc2lsb25fe3R9JCBpczoKCgokJHlfe3R9fj1EX3swfVx2YXJlcHNpbG9uIF97dH0rRF97MX1cdmFyZXBzaWxvbgpfe3QtMX0rRF97Mn1cdmFyZXBzaWxvbiBfe3QtMn0rRF97M31cdmFyZXBzaWxvbiBfe3QtM30rRF97NH1cdmFyZXBzaWxvbgpfe3QtNH0rLi4uJCQKCgoKJCR5X3t0fX49XGxlZnRbIApcYmVnaW57YXJyYXl9e2NjfQowLjkgJiAwLjggXFwgCjAuNyAmIDAuNiUKXGVuZHthcnJheX0lClxyaWdodF0gXHZhcmVwc2lsb24gX3t0fStcbGVmdFsgClxiZWdpbnthcnJheX17Y2N9CjAuNSAmIDAuNCBcXCAKMC4zICYgMC4yJQpcZW5ke2FycmF5fSUKXHJpZ2h0XSBcdmFyZXBzaWxvbiBfe3QtMX0rXGxlZnRbIApcYmVnaW57YXJyYXl9e2NjfQowLjEgJiAtMC4xIFxcIAotMC4yICYgLTAuMyUKXGVuZHthcnJheX0lClxyaWdodF0gXHZhcmVwc2lsb24gX3t0LTJ9K1xsZWZ0WyAKXGJlZ2lue2FycmF5fXtjY30KLTAuNCAmIC0wLjUgXFwgCi0wLjYgJiAtMC43JQpcZW5ke2FycmF5fSUKXHJpZ2h0XSBcdmFyZXBzaWxvbiBfe3QtM30gKy4uLiQkCgoKCjxicj4KPGRpdiBjbGFzcyA9ICJibHVlIj4KKipUTyBUSElOSzoqKiBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0aGF0IHRoZSBlbGVtZW50ICgxLDIpIG9mICREX3swfSQgd2VyZSAwLjg/IFRoZSBhbnN3ZXIgaXQncyBOTywgYnV0ICoqV0hZPyoqICBSZW1lbWJlciB0aGF0IHdlcmUgYXJlIHVzaW5nIENob2xlc2t5IGRlY29tcG9zaXRpb24gYW5kIHRoaXMgaW1wbGllcyB0aGF0IC4uLi4uLiAqbG93ZXIgdHJpYW5ndWxhciogLi4uLgo8L2Rpdj4KPGJyPgoKCkhvdyB3ZSBjYW4gb2J0YWluIHRoZSBJUkYncyBvZiBvdXIgVkFSPyBXZSB3aWxsIHNlZSBhdCB0aGUgTGFiIGJ1dCwgd2l0aCB0aGUgYHZhcnM6OlBzaSgpYCBmdW5jdGlvbiB5b3UgY2FuIG9idGFpbiB0aGUgJERfe2l9JCBtYXRyaWNlcywgdGhlIHN0cnVjdHVyYWwgbWF0cmljZXMgKHVzaW5nIHRoZSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uKQoKCmBgYHtyfQpQc2kob3VyX3ZhciwgbnN0ZXAgPSAyKSAgIy0gUmV0dXJucyB0aGUgZXN0aW1hdGVkIG9ydGhvZ29uYWxpc2VkKENob2xlc2t5KSBjb2VmZmljaWVudCBtYXRyaWNlcwpgYGAKCgpBbmQgd2l0aCB0aGUgYHZhcnM6OmlyZigpYCBmdW5jdGlvbiB3ZSBvYnRhaW4gdGhlIHNhbWUgaW5mb3JtYXRpb24gYnV0IGluIGEgbW9yZSBjb252ZW5pZW50IHdheTogd2Ugb2J0YWluIHRoZSBJUkYncwoKCmBgYHtyfQppcmYob3VyX3Zhciwgbi5haGVhZCA9IDQsIGJvb3QgPSBGQUxTRSkKYGBgCgoKV2UgY2FuIGJlIG1vcmUgc3BlY2lmaWMgYW5kIG9ubHkgdG8gZGVtYW5kIHRoZSBJUkYncyB3ZSBhcmUgaW50ZXJlc3RlZCBpbjoKCmBgYHtyfQppcmYob3VyX3Zhciwgbi5haGVhZCA9IDUsCiAgICAgICAgICAgICBpbXB1bHNlID0gImRsVm9sX3VzIiwgCiAgICAgICAgICAgICByZXNwb25zZSA9IGMoImRsVm9sIiwgImRsVm9sXzE1IiksIAogICAgICAgICAgICAgYm9vdCA9IEZBTFNFLAogICAgICAgICAgICAgY3VtdWxhdGl2ZSA9IEZBTFNFKQpgYGAKCgpCdXQgdXN1YWxseSB5b3UgZG9uJ3Qgc2hvdyB0aGUgZXN0aW1hdGlvbiBudW1iZXJzLCBidXQgeW91IHBsb3QgdGhlbToKCmBgYHtyfQpteV9pcmYgPC0gaXJmKG91cl92YXIsIG4uYWhlYWQgPSAyNSwKICAgICAgICAgICAgICAgICAgICAgICBpbXB1bHNlID0gImRsVm9sX3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjKCJkbFZvbCIsICJkbFZvbF8xNSIpLCAKICAgICAgICAgICAgICAgICAgICAgICBib290ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxhdGl2ZSA9IEZBTFNFKQoKcGxvdChteV9pcmYpCmBgYAoKCjxicj4KCiMjIyBGaW5hbGx5IHRoZSBGRVZEJ3MKCgotIHRoZSBmaXJzdCBpZGVhIGlzIHRoYXQgdGhlIEZFVkQncyBjb21lcyBmcm9tIHRoZSBJUkYncwoKCiogT25jZSB3ZSBoYXZlIG9ydGhvZ29uYWxpc2VkIElSRidzICh0aGUgJERfe2l9JCAgbWF0cmljZXMgKSwgdGhlIEZFVkQgY2FuIGJlIGVhc2lseSBjb21wdXRlZC4gTGV0J3Mgc2VlIGhvdzogIAoKCiogVGhlIGgtc3RlcCBhaGVhZCBmb3JlY2FzdCBlcnJvciBjYW4gYmUgcmVwcmVzZW50ZWQgYXM6ICAgICAKCgokJHlfe1QraH0teV97VCtoXG1pZCBUfT1EX3swfVx2YXJlcHNpbG9uIF97VCtofStEX3sxfVx2YXJlcHNpbG9uX3tUK2gtMX0rXGNkb3RzICtEX3toLTF9XHZhcmVwc2lsb24gX3tUKzF9JCQKCkFzICRcU2lnbWEgX3tcdmFyZXBzaWxvbiB9PUkkLCB0aGUgZm9yZWNhc3QgZXJyb3IgdmFyaWFuY2Ugb2YgdGhlIGstdGggY29tcG9uZW50IG9mICR5X3tUK2h9JCBpczoKCgokJFxzaWdtYSBfe2t9XnsyfShoKT1cb3ZlcnNldHtLfXtcdW5kZXJzZXR7aj0xfXtcc3VtIH19KGRfe2tqLDB9XnsyfStcY2RvdHMKK2Rfe2tqLGgtMX1eezJ9KSQkCgoKd2hlcmUgJGRfe25tLGp9JCBkZW5vdGVzIHRoZSAkKG4sbSktdGgkIGVsZW1lbnQgb2YgJERfe2p9JC4KCgoKKiBUaGUgcXVhbnRpdHkgJChkX3traiwwfV57Mn0rXGNkb3RzICtkX3traixoLTF9XnsyfSkvXHNpZ21hIF97a31eezJ9KGgpJCByZXByZXNlbnRzIHRoZSBjb250cmlidXRpb24gb2YgdGhlICRqJC10aCBzaG9jayB0byB0aGUgaC1zdGVwIGFoZWFkIGZvcmVjYXN0IGVycm9yIHZhcmlhbmNlICBvZiB2YXJpYWJsZSAkayQuICAKCgoqIERvbid0IHdvcnJ5IHRvbyBtdWNoIG5vdyBhYm91dCB0aGUgbGFzdCBlcXVhdGlvbnMsIGZpcnN0IGJlY2F1c2Ugd2Ugd2lsbCB1c3VhbGx5IGRvIHRoaXMgd2l0aCBSIGFuZCBzZWNvbmRseSBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBwcmFjdGlzZSB0aGUgY2FsY3VsYXRpb25zIGJ5IGhhbmQgYXQgdGhlIExhYi4KCgoKKiBBcyBhbiBleGFtcGxlIHRvIGlsbHVzdHJhdGU6CgoKJCR5X3t0fT1cbGVmdFsgClxiZWdpbnthcnJheX17Y30KWV97dH0gXFwgClBfe3R9JQpcZW5ke2FycmF5fSUKXHJpZ2h0XSBcIFwgXCBcdmFyZXBzaWxvbiBfe3R9PVxsZWZ0WyAKXGJlZ2lue2FycmF5fXtjfQpcdmFyZXBzaWxvbiBfe3R9XnsxfSBcXCAKXHZhcmVwc2lsb24gX3t0fV57Mn0lClxlbmR7YXJyYXl9JQpccmlnaHRdICQkCgoKCiQkeV97dH1+PURfezB9XHZhcmVwc2lsb24gX3t0fStEX3sxfVx2YXJlcHNpbG9uCl97dC0xfStEX3syfVx2YXJlcHNpbG9uIF97dC0yfStEX3szfVx2YXJlcHNpbG9uIF97dC0zfStEX3s0fVx2YXJlcHNpbG9uCl97dC00fSsuLi4kJAoKCgokJHlfe3R9fj1cbGVmdFsgClxiZWdpbnthcnJheX17Y2N9CjAuOSAmIDAuMCBcXCAKMC43ICYgMC42JQpcZW5ke2FycmF5fSUKXHJpZ2h0XSBcdmFyZXBzaWxvbiBfe3R9K1xsZWZ0WyAKXGJlZ2lue2FycmF5fXtjY30KMC41ICYgMC40IFxcIAowLjMgJiAwLjIlClxlbmR7YXJyYXl9JQpccmlnaHRdIFx2YXJlcHNpbG9uIF97dC0xfStcbGVmdFsgClxiZWdpbnthcnJheX17Y2N9CjAuMSAmIC0wLjEgXFwgCi0wLjIgJiAtMC4zJQpcZW5ke2FycmF5fSUKXHJpZ2h0XSBcdmFyZXBzaWxvbiBfe3QtMn0rLi4uJCQKCgoKJCQuLi4rXGxlZnRbIApcYmVnaW57YXJyYXl9e2NjfQotMC40ICYgLTAuNSBcXCAKLTAuNiAmIC0wLjclClxlbmR7YXJyYXl9JQpccmlnaHRdIFx2YXJlcHNpbG9uIF97dC0zfStEX3s0fVx2YXJlcHNpbG9uIF97dC00fSsuLi4kJAoKCjxicj4KCi0gd2Ugd2lsbCBwcmFjdGljZSBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQgdGhlbSBhdCB0aGUgTGFiLCBidXQgd2UgY2FuIGNhbGN1bGF0ZSB0aGVtIHdpdGggdGhlIGB2YXJzOjpmZXZkKClgIGZ1bmN0aW9uOgoKYGBge3J9CmZldmQob3VyX3Zhciwgbi5haGVhZCA9IDUpICMtIHdpdGggdGhlIHZhcnMgcGtnCmBgYAoKVXN1YWxseSB0aGUgRkVWRCdzIGFyZSBhbHNvIHNob3duIGluICBhIGdyYXBoaWNhbCBmYXNoaW9uOgoKCmBgYHtyfQpwbG90KGZldmQob3VyX3ZhcikpCmBgYAoKCgo=