1. Introduction
  2. VAR models in reduced form (Estimation)
    • Model Specification
    • Estimation
    • Validation
  3. VAR models in reduced form (Uses)
    • Causality Analysis
    • Forecasting
    • Moving average representation (MVA)
    • Structural analysis
      • Impulse response functions (IRF)
      • Forecast Error Variance Decomposition (FEVD)
      • Historical Decomposition
  4. Structural VAR models
    • Introduction
    • Identification with short-run restrictions (on the effects of shocks)
    • Identification with long-run restrictions (on the effects of shocks)
    • Identification with contemporaneous interactions among the endogenous variables
    • Identifying the SVAR by both types of restrictions (The AB-model)



1. Introduction

  • Most of the questions in empirical macroeconomics are similar to: what is the effect of a policy intervention or shock (interest rate increase, tax cut, … ) on the macroeconomic aggregates of interest?

  • Ideally, we would like to know the dynamic effect of a shock (\(\varepsilon_{t}\)) on { \(Y_{t},Y_{t+1}\), … }
    • In macro, this dynamic causal effect is called the impulse response function (IRF) of \(Y_{t}\) to the shock \(\varepsilon_{t}\)

    • That’s the typical purpose of Vector Autoregressive (VAR) models: to estimate the IRF of a macroeconomic series (\(Y_{t}\)) to a shock (\(\varepsilon_{t}\))

  • During the three decades following Sims’s (1980) paper, VAR models have become a standard instrument in econometrics to analyse multivariate time series and one of the major ways to obtain information about the economy

  • VAR’s have proven their worth in forecasting, but also in uncovering the transmission mechanisms of key macroeconomic shocks. In particular VAR’s:

    • have a central role in investigating the sources of business cycle fluctuations

    • have become a benchmark instrument against which modern dynamic theories (DSGE models) are evaluated

  • After identification, Structural Vector Autoregressive (SVAR) models have been mainly used to address the 2 following type of questions:

    • How does the economy (\(Y_{t}\)) respond to different economic shocks? (IRF)

    • What is the contribution of the different shocks to the movements in \(Y_{t}\)? (FEVD)

  • SVAR’s have been used in an incredibly large number of areas and topics, and have had and continue to have a central role for understanding aggregate fluctuations and disentangling the importance of different economic shocks

As Kilian (2011) says:

Notwithstanding the increased use of estimated dynamic stochastic general equilibrium (DSGE) models over the last decade, structural vector autoregressive (VAR) models continue to be the workhorse of empirical macroeconomics and finance


1.1 Origins & development of VAR models

  • Origins: Sims (1980) in his paper Macroeconomics and Reality

  • A little bit of history: In the mid 70’s, Cowles Commission’s approach to econometric modelling was attacked on several grounds and was eventually abolished. Two major critiques:

    • Lucas critique: expectations are not taken into account explicitly, so identified parameters are a mixture of deep parameters (preference and technology) and expectational parameters that are not stable across policy regimes(parameter invariance). Hence, models are not useful for policy simulations

    • Sims “critique”: “incredible identification restrictions”. Sims raised several objections to the traditional way of identifying macroeconometric models, where exclusion restrictions were routinely imposed and the decision whether a variable should be regarded as exogenous with respect to the system was made rather arbitrarily. In particular, according to Sims, no variable can be deemed as exogenous in a world of rational forward looking agents.

  • Sims (1980) advocates for the use of VAR models as a theory-free method to estimate economic relationships

    • Sims’s basic idea was 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.

    • The estimation of the VAR is usually made by OLS (which we will see is consistent and, under normality of the error terms, efficient)

    • Once the VAR is estimated, different analysis could be done but the most usual are the obtaining of IRF and FEVD, but for this, the structural shocks should be identified

    • Guided by economic theory, the econometrician imposes restrictions (usually on how the structural shocks impact the variables within the model system) transforming the VAR model into a Structural Vector Autoregressive (SVAR) model

    • 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 (Cholesky)

    • Later on, restrictions to obtain the SVAR, came in several forms: general short run restrictions, (zero or linear relationships), long run restrictions, cointegration and sign restrictions, etc.


1.2 A guided tour through VAR methodology:

Similar to Figure 1, p.3, in Lütkepohl(2011)




2. VAR models (in reduced form)

As we will see in short, there are different representations for a VAR: VAR vs. VMA, structural vs. reduced VAR’s. By now we will start with a question:

What is exactly a VAR model?

  • A VAR is an econometric model used to capture the linear interdependencies among multiple time series. In fact, a VAR(p) is a generalization of the AR(p) model to the multivariate case.

  • All variables in a VAR are treated symmetrically: each variable has an equation explaining its evolution based on its own lags and the lags of the other model variables

  • A VAR analysis starts by estimating a (reduced form) VAR model of order p.


An example: a trivariate VAR(p=2) model

  • trivariate: {GDP, Prices, Money}:

    • two lags (p=2)

    • all variables I(0)!!!

\[\left\{ \begin{array}{c} Y_{t}=0.6Y_{t-1}+0.2Y_{t-2}+0.3P_{t-1}-0.2P_{t-2}+0.5M_{t-1}-0.5M_{t-2}+v_{t}^{Y} \\ P_{t}=-0.7_{t-1}+0.1_{t-2}+0.5P_{t-1}+0.4P_{t-2}+0.6M_{t-1}-0.6M_{t-2}+v_{t}^{P} \\ M_{t}=-0.6_{t-1}+0.3_{t-2}+0.5P_{t-1}+0.4P_{t-2}+0.9M_{t-1}-0.2M_{t-2}+v_{t}^{M}% \end{array}% \right\} \]

  • The variables could be arranged in different ways, but the most common way of visualization is:

\[% \begin{array}{c} Y_{t}=0.6Y_{t-1}+0.3P_{t-1}+0.5M_{t-1}+0.2Y_{t-2}-0.2P_{t-2}-0.5M_{t-2}+v_{t}^{Y} \\ P_{t}=-0.7Y_{t-1}+0.5P_{t-1}+0.6M_{t-1}+0.1Y_{t-2}+0.4P_{t-2}-0.6M_{t-2}+v_{t}^{P} \\ M_{t}=-0.6Y_{t-1}+0.5P_{t-1}+0.9M_{t-1}+0.3Y_{t-2}+0.4P_{t-2}+-0.2M_{t-2}+v_{t}^{M}% \end{array}%\]

  • We can simplify the visualization of the VAR by defining the following vectors:

\[y_{t}=\left[ \begin{array}{c} Y_{t} \\ P_{t} \\ M_{t}% \end{array}% \right] \ \ \ \ \ v_{t}=\left[ \begin{array}{c} v_{t}^{Y} \\ v_{t}^{P} \\ v_{t}^{M}% \end{array}% \right] \]

  • Then, the VAR could be written as:

\[y_{t}=\left[ \begin{array}{ccc} 0.6 & 0.3 & 0.5 \\ -0.7 & 0.5 & 0.6 \\ -0.6 & 0.5 & 0.9% \end{array}% \right] y_{t-1}+\left[ \begin{array}{ccc} 0.2 & -0.2 & -0.5 \\ 0.1 & 0.4 & -0.6 \\ 0.3 & 0.4 & -0.2% \end{array}% \right] y_{t-2}+v_{t}\]

  • As well as:

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

  • And, also more compactly, as:

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

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

  • After estimation & validation, a VAR (in reduced form) could be used for testing (for example, Granger causality) and for forecasting

  • The principal instruments (or usages) of VAR modelling are the IRF & FEVD but for these uses it’s necessary to identify the structural disturbances, that is, to estimate a SVAR model



2.1 Model Specification


  • Let \(y_{t~}=~\left[ Y_{1t~},~Y_{2t}~,~....~,~Y_{Kt}\right] ^{^{\prime}}\) denote a (Kx1) vector of random variables, then a VAR(p) model can be written as :

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

where:

\(\boldsymbol{D_{t}}\) is a vector \((M\times 1)\) with the appropriate deterministic regressors (constant, trend, dummies …), \(\boldsymbol{C}\) is the coefficient matrix for \(\boldsymbol{D_{t}}\)

\(\boldsymbol{A_{i}}\) are \((K\times K)\) coefficient matrices,
\(\boldsymbol{v_{t}}\) is a \((K\times 1)\) vector of white noise (\(v_{t}\rightarrow (0,\Sigma _{v})\)).


  • As Lütkepohl (2011) points out:

Using terminology from the simultaneous equations literature, the VAR model [1] is in reduced form because all right-hand side variables are lagged or predetermined.

  • Be aware that, for a VAR (in reduced form):

The instantaneous relations between the variables are summarized in the residual covariance matrix


A compact way to write a VAR(p) model

  • For simplicity in the notation, let’s suppose that the deterministic part of our VAR(p) model is zero; then our VAR(p) 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})\)


Stability of the VAR(p)

  • An important issue in VAR modelling is stability

  • The VAR(p) process is stable if all roots of the determinantal polynomial (\(\det A(z)=\det (I_{K}-A_{1}z^{1}-A_{2}z^{2}-...-A_{p}z^{p})=0\)) are outside the complex unit circle (or equivalently if the eigenvalues of the companion matrix have modulus less than one)

  • Under habitual assumptions, a stable process is covariance stationary. Then, if the VAR is stable, the variables in \(y_{t}\) would be \(I(0)\), and in this case we could estimate the VAR with the variables in levels (VAR in levels).

  • But, if the solution of the above equation, \(\det A(z)=0\), has a root for \(z=1\), that is, if the process has a unit root, then some (or all) variables in the VAR(p) are \(I(1)\). Then the process is nonstationary and before starting the analysis we should transform the variables to reach stationarity; usually by first differences (VAR in first differences)

  • If some of the variables are I(1), then we have to check the possibility that cointegration exits. If that was the case, a VECM should be used.



2.2 Estimation

VAR models can be estimated with standard methods: OLS or ML. VAR models can also be estimated by Bayesian methods

  • 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.

  • If the residuals are normally distributed (Gaussian) like (\(v_{t}\rightarrow N(0,\Sigma _{v})\)) the OLS estimator of our VAR model will have desirable asymptotic properties: it will be asymptotically normally distributed and will have the smallest asymptotic covariance matrix

  • Then, if the VAR is stable, usual inference procedures are asymptotically valid: t-statistics could be used for inference about individual parameters and the F-test could be used for testing hypotheses for sets of parameters.

  • Note also that if \(y_{t}\) is a normally distributed (Gaussian) process, then the OLS estimator is identical to the ML estimator (conditional on the initial pre-sample values).

  • If restrictions are imposed on the parameters, OLS estimation may be inefficient. In that case GLS estimation may be beneficial. The GLS estimator is consistent and asymptotically normally distributed and usual methods for inference are valid asymptotically.

  • Note that if the disturbances in one equation are for example autocorrelated, the theory does not apply. Then IV estimators, including GMM, would be needed.

  • Under-specification of p might result in autocorrelated residuals

How to estimate a VAR model in R?

  • We are going to use the R package vars written by Bernhard Pfaff. A short description of the functionalities of the Pfaff’s package can be found here. For a more detailed exposition, please go here

  • To illustrate the different topics in VAR modelling, we are going to use as an example the analysis and data used in Gali’s (1999) paper : "Technology, Employment, and the Business Cycle: Do Technology Shocks Explain Aggregate Fluctuations?

  • In his paper, Gali estimates a bivariate VAR for productivity and hours to look mainly at the response of hours to a technology shock

  • In fact we are going to “replicate” Gali’s paper but only for his benchmark model:

    • U.S. quarterly data for 1948:1 - 1994:4 from Citibase

    • bivariate VAR model: productivity(\(x_{t}\)) and hours(\(n_{t}\))

    • \(y_{t~}=~\left[ x_{t~},n_{t}\right] ^{^{\prime }}\), both variables in (log) first differences


Let’s open the LAB slides



Model Specification

Imagine that we have already decided wchich variables to include in our VAR model, the sample, if the variables are I(1) vs. I(0) , and the deterministics components . In this case we have almost finished the model specification. Almost, because … we need to decide the order of the VAR.

How to select (p) the order of the VAR?

For a more detailed exposition go to Lütkepohl(2011), pp. 10-11

  • The idea is that we have to select an order(p) sufficiently large to ensure that the residuals shown no autocorrelation but without exhausting the degrees of freedom.

  • The order of the VAR could be selected by:

    1. Sequential testing procedures

    2. Model selection criteria

  • Sequential testing procedures approach:

    • A maximum reasonable lag order(\(p_{\max }\)) is chosen

    • Then, the following sequence of null hypotheses ios tested: \(H_{0}:A_{p_{\max }}=0\) , \(H_{0}:A_{p_{\max -1}}=0\), …

    • For a stationary VAR the usual LR test could be used

    • The procedure stops when the null hypothesis is rejected for the first time

  • Model selection criteria approach:

    • A model selection criteria is chosen (AIC, HQ, SC, FPE). For multivariate expression of these criteria see Lütkepohl(2011)

    • Again, a maximum reasonable lag order(\(p_{\max }\)) is chosen

    • A set of VAR(m) are estimated for \(m=1,...,~p_{\max }\)

    • Choose p as the lags of the VAR(m) which minimize the chosen criteria

    • AIC usually overestimates p

  • The package “vars” has the VARselect() function which allows us to apply the 2nd approach to select p.

  • As we will see in the LAB slides, three criteria (AIC,HQ &FPE) choose p=2; BUT, as our data are quarterly, probably, as Gali does, a more sensible choice would be p=4

Finally, we are now ready to estimate our VAR with p=4. Let’s go the LAB slides!!!




2.3 Validation of the VAR

  • After estimation, and before using or transforming our VAR to a SVAR, we have to check their validity mainly looking at the residuals

  • Again, let’s go to the LAB!!!




3. VAR models in reduced form (Uses)

The two principal uses of VAR models in reduced form are testing (causality testing) and forecasting, BUT the most used instruments in the VAR metholodogy are IRF & FEVD.

IRF & FEVD only have a clear mening if we transform our reduced form VAR model to an structural VAR. We will develop this idea in a while

3.1 Uses of VAR: Causality testing

  • After validation, the VAR could be used for testing, for example, for testing Granger causality.

  • As we said, if the residuals are normally distributed (Gaussian) like (\(v_{t}\rightarrow N(0,\Sigma _{v})\)) the OLS estimator has desirable asymptotic properties. In particular, it will be asymptotically normally distributed, and then, if the VAR is stable, usual inference procedures are asymptotically valid: t-statistics could be used for inference about individual parameters and F-test for testing hypotheses for sets of parameters.

  • Even if t-tests are asymptotically valid, due to collinearity problems, it would not be sensible to interpret or to test only one parameter in isolation.

  • In regression analysis, we label one variable as the dependent variable and the others as explanatory. But most of the time, it is not obvious which variable causes which. As you know, we should always be cautious about interpreting correlation and regression results as reflecting causality.

  • With time series data we can make slightly stronger statements about causality simply by exploiting the fact that time does not run backward. If event A happens before B, then it’s possible that A causes B, but not that B causes A. These ideas can be investigated through regression models using the notion of Granger causality.

  • Granger causality: Granger called a variable X causal for Y if the information in past and present values of X is helpful for improving the forecast of Y. If Granger causality holds, this does not guarantee that X causes Y. But, it suggests that X might be causing Y.

  • Sometimes econometricians use the shorter term causes as shorthand for Granger causes. You should notice, however, that Granger causality is not causality in a deep sense of the word. It just talks about linear prediction, and it only has “teeth” if we only find Granger causality in one direction.

  • The definition of Granger causality did not mention anything about possible instantaneous correlation between variables. If the innovations are correlated we will say that there exists instantaneous causality

  • In the context of VAR models, if we want to test for Granger causality, we need to test zero constraints in some of the coefficients.

  • Suppose that 2 variables ( \(y_{1t}\) and \(y_{2t}\) ) are generated by a bivariate VAR(p) process like:

\[\left[ \begin{array}{c} y_{1t} \\ y_{2t}% \end{array}% \right] =\overset{p}{\underset{i=1}{\sum }}\left[ \begin{array}{cc} \alpha _{11,i} & \alpha _{12,i} \\ \alpha _{21,i} & \alpha _{22,i}% \end{array}% \right] \left[ \begin{array}{c} y_{1t-i} \\ y_{2t-i}% \end{array}% \right] +u_{t}\]

  • Then, \(y_{2t}\) is not Granger-causal for \(y_{1t}\) if and only if :

\[\alpha _{12,i}=0\ \ ,\ \ i=1,2,\cdots ,p\]

  • That is, \(y_{2t}\) does not Granger cause \(y_{1t}\) if \(y_{2t}\) does not appear in the equation for \(y_{1t}\)

  • If there are more than 2 variables in the VAR, testing Granger causality becomes more complicated, because Granger-causality depends on the information set considered, but this is beyond the scope of this course. For a complete treatment of the topic see, as usual, Lütkepohl(2005)

  • It’s possible to test Granger causality through the Wald or F-test. In the vars package, we can use:

    • F-test to test Granger causality

    • Wald test for instantaneous Granger causality (non zero correlation among the \(v_{it}\))



3.2 Uses of VAR: Forecasting



3.3 Moving average representation (MVA) of a VAR(p)

  • You all know that stationary AR process could be transformed (inverted) into an infinite MA(\(\infty\)) process. This result applies also to a stationary (stable) VAR

  • By inverting the autoregressive polynomial A(L) we can obtain the VMA form of a VAR 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_{s}\) matrices could be computed recursively as

\[C_{s}=\underset{j=1}{\overset{s}{\sum }}C_{s-j}A_{j}\ \ \ \ \ \ \ \ \ for\ j=1,\ 2,\cdots \]


  • 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}+\ \ ...)\).

  • Model \([3]\) (or \([4]\)) are also called the Wold VMA representation

  • The two principal instruments of VAR’s, IRF & FEVD, are defined in terms of their VMA representation [3]

  • IRF & FEVD will show the effects of a shock, BUT in order to have a clear meaning, they must be interpreted under the assumption that all the other shocks are held constant; however, in the Wold representation the shocks are not orthogonal; that’s why we will turn, in the next section, to structural VAR models



3.4 Uses of VAR: “Structural” analysis

  • Usually the main interest in VAR modelling is to look at the dynamic effect of a shock on the variables of interest

  • This dynamic effect could be easily obtained through the VMA representation [3] of the VAR, also called Wold VMA representation

  • In particular the response of the variable \(y_{n}\) to an impulse of size one in \(v_{m}\) \(j\)-periods ahead is given by the \((n,m)\)-th element of \(C_{j}\). That is, the \(C_{i}\) matrices contain the responses of the variables to the innovations for different periods (or steps) ahead

  • As the \(u_{i}\) are forecast error’s, those effects are called forecast error impulse responses or in short impulse response functions (IRF’s)

BUT…

  • BUT, usually the VAR disturbances 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 \(v_{m}\) 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.
  • Therefore, Sims proposed assuming recursive contemporaneous interactions among variables, i.e. imposing a certain structural ordering in the variables. In terms of the MVA representation this means that the transformed or “structural” shocks will not affect the preceding variables instantaneously.

    • That means that an innovation in the first equation could contemporaneously affects 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
  • In practice, imposing a recursive contemporaneous order among the variables of the VAR model, is operationalised performing a Cholesky decomposition in \(\Sigma _{v}\). Let’s show that:

    • The Cholesky factor, \(P\), of \(\Sigma _{v}\) is defined as the unique lower triangular matrix such that \(PP^{^{\prime }}=\Sigma _{v}\)
  • With the Cholesky factor(\(P\)) we could transform the VAR in [3] as:

\[A(L)y_{t}=PP^{-1}v_{t}\]

with \(\varepsilon _{t}=P^{-1}v_{t}\), then our transformed VAR becomes

\[A(L)y_{t}=P\varepsilon _{t}\ \ \ \ \ \ \ \ \ \ \ \ [2*]\]

  • That is, we have written our VAR in terms of a new vector of shocks \(\varepsilon _{t}\), with identity covariance matrix (\(\Sigma _{\varepsilon }=I\))

  • Now, as the \(\varepsilon _{t}\) shocks are uncorrelated their IRF would have a clear interpretation


3.4.1 IRF (Impulse- response functions)

  • From [2*] we can obtain the VMA representation in terms of the \(\varepsilon _{t}\) shocks:

\[y_{t}=C(L)P\varepsilon _{t}\ \ \ \ \ \ \ \ \ \ \ \ [5\ast ]\]

\[y_{t}=D(L)\varepsilon _{t}\ \ \ \ \ \ \ \ \ \ \ \ [5]\]

being \(D(L)=C(L)P\) ,

\(D(L)=(D_{0}+D_{1}L^{1}+D_{2}L^{2}+D_{3}L^{3}-\ \ ...)\), with \(D_{i}=C_{i}P\) ,

then \(D_{0}=C_{0}P=I_{N}P=P\)

  • As \(D_{0}=P\), and P is lower triangular, the system is recursive: the first shock (\(\varepsilon _{t}^{1}\)) could have an instantaneous effect on all the variables of the VAR, while the first variable in the VAR could only be contemporaneously affected by \(\varepsilon _{t}^{1}\)

  • The \(D_{i}\) matrices contain the response of the variables to the \(\varepsilon _{t}\)

  • In particular the response of the variable \(y_{n}\) to an impulse of size one in \(\varepsilon_{m}\) \(j\)-periods ahead is given by the \((n,m)\)-th element of \(D_{j}\).

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

  • 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.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}+D_{4}\varepsilon _{t-4}+...\]

  • It would be possible that the element (1,2) of \(D_{0}\) were 0.8?



3.4.2 FEVD (Forecast error variance decomposition)

  • 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 firstly because we will usually do this with R and secondly because we are going to practise the calculations by hand at the Lab, but ….

  • 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}+...\]




3.4.3 Obtaining the IRF & FEVD (with R)

Going to the LAB!!




3.4.4 Historical Decomposition

  • It’s another instrument of the VAR methodology, the third.

  • It’s less commonly used than IRF & FEVD

  • IRFs show the average response of the model variables to a structural shock (of size 1 standard deviation)

  • FEVD quantifies the importance of the different structural shocks in the variability of the data: FEVD gives the percentage of the variance of the error made in forecasting a variable due to a specific shock at a given horizon

  • Historical decomposition quantifies the importance of the different shocks to the evolution of the variables in specific periods of time

  • SVARs also allow the construction of forecast scenarios conditional on hypothetical sequences of future structural shocks




4. Structural VAR’s

The success of VAR models as descriptive tools and to some extent as forecasting tools is well established. The ability of structural representations of VAR models to differentiate between correlation and causation, in contrast, has remained contentious Kilian(2011), p.1

4.1. Introduction

  • A VAR model can be a good forecasting model but, in the end, it is an atheoretical model (as all the reduced form models are). The raw estimation results for a VAR are rarely interesting. Alternatively, one can represent a VAR as responses to impulses; however, the responses to some steps ahead of innovation(\(v_{t}\)) or prediction errors are rarely economically interesting.

  • To interpret the VAR in an economically meaningful way, one needs to disentangle the vector of innovations(\(v_{t}\)) into “structural” shocks (\(\varepsilon _{t}\)), like monetary policy shocks, productivity shocks, etc.,

  • Ideally we would like to have: 1) orthogonal shocks 2) shocks with economic meaning.

  • That is, we would like to have (identify) a structural VAR (SVAR) like:

\[B(L)y_{t}=\varepsilon _{t}\ \ \ \ \ \ \ \ \ \ [6]\]

where \(B(L)=(B_{0}-B_{1}L^{1}-B_{2}L^{2}-...-B_{p}L^{p})\), \(B_{0}\) is a matrix representing the contemporaneous interactions among the endogenous variables and the structural shocks are orthogonal (\(\Sigma _{\varepsilon }=I\)).

  • As any stable VAR, we could invert [6] to obtain the structural VMA representation of our SVAR

\[y_{t}=D(L)\varepsilon _{t}\ \ \ \ \ \ \ \ \ \ \ \ [5]\]

where \(D(L)=(D_{0}-D_{1}L^{1}-D_{2}L^{2}-D_{3}L^{3}-\ \ ...)\), \(D_{0}\) is the matrix representing the contemporaneous effects of the shocks, and remember that \(\Sigma _{\varepsilon }=I\)

  • BUT, how to obtain estimates of the SVAR? We will use our estimation of the VAR model and the relations between the VAR and the SVAR


Four representations of the same DGP

  • Remember that we have two models (the VAR & the SVAR), but four representations:

\[\begin{array}{ccccc} A(L)y_{t} & = & v_{t} & \;\;\;\;\;[3] & VAR\\ y_{t} & = & C(L)v_{t} & \;\;\;\;\;[4] & VMA\\ B(L)y_{t} & = & \varepsilon_{t} & \;\;\;\;\;[6] & SVAR\\ y_{t} & = & D(L)\varepsilon_{t} & \;\;\;\;\;[5] & SVMA \end{array}\]

  • How to estimate the SVAR? In fact we have already seen the first proposal (Sims) to identify the structural form by means of the Cholesky decomposition but …

  • In the previous section we learned that the Cholesky factorization is equivalent to choosing a recursive system of equations. BUT, as you can imagine, the order matters: identification is not unique.

  • 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 P can be justified on economic grounds.

  • The distinguishing feature of “orthogonalization” by Cholesky decomposition is that the resulting structural model is recursive (conditional on lagged variables). This means that we impose a particular causal chain rather than learning about causal relationships from the data

  • 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 highrer the cjhanges 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)



4.2. Identifying the SVAR by short-run restrictions on the effects of shocks

  • If we compare equations [4] and [5], we have that \(v_{t}=D_{0}\varepsilon _{t}\)

  • We obtain a consistent estimation of \(v_{t}\) from the estimation of the VAR model [3]. If we could have \(D_{0}\) we would be able to recover the structural shocks (\(\varepsilon _{t}\))

  • By now, we will recover the structural parameters from the VAR estimates focusing on the impact matrix \(D_{0}\) and using the fact that \(v_{t}=D_{0}\varepsilon _{t}\).

\[E(v_{t}v_{t}^{^{\prime }})=E(D_{0}\varepsilon _{t}\varepsilon _{t}^{^{\prime }}D_{0}^{^{\prime }})\]

\[\Sigma _{v}=D_{0}\Sigma _{\varepsilon }D_{0}^{^{\prime }}\]

\[\Sigma _{v}=D_{0}D_{0}^{^{\prime }}\]

  • The last expression imposes (n*(n+1))/2 restrictions on the elements of \(D_{0}\); that is, we will need n(n-1)/2 additional restrictions to recover estimates of all the elements of \(D_{0}\)

  • Once we have recovered \(D_{0}\) and using the fact that \(v_{t}=D_{0}\varepsilon _{t}\), we can write the VAR as \(A(L)y_{t}=D_{0}\varepsilon _{t}\) and if we invert the VAR we will recover the SVAR VMA form as \(y_{t}=C(L)D_{0}\varepsilon _{t}\) ; that is, we can obtain the structural matrices \(D_{i}=C_{i}D_{0}\)

  • In the terminology of Amisano & Giannini, this way of identification is called a C-model(\(v_{t}=C\varepsilon _{t}\)). The \(C\) matrix is in fact our \(D_{0}\) matrix.

  • A particular case of a C-model is the Cholesky approach. Remember that we obtained the Cholesky factor \(P\) from \(PP^{^{\prime }}=\Sigma _{v}\) and we obtained the \(D_{i}=C_{i}P\) ; that is, \(P\) is equivalent to our \(D_{0}\)

  • Most short-run restrictions are zero restrictions (e.g., that output reacts only with a lag to monetary shocks).

  • The last assumption seems reasonable, but clearly the frequency of the data is of crucial importance: with annual data, a contemporaneous zero restriction is likely to be more debatable than with quarterly or monthly data

Example: Kilian, L. (2009), “Not All Oil Price Shocks Are Alike: Disentangling Demand and Supply Shocks in the Crude Oil Market”, American Economic Review, vol. 99

  • Kilian analyses the global market for crude oil with a trivariate SVAR: \(y_{t}=\left[ \Delta Ypetrol_{t},WBC_{t},Ppetrol_{t},\right] ^{^{\prime }}\ \ \ \ \ \ \ \ \ \ \ \ \varepsilon _{t}=\left[ \varepsilon _{t}^{supply},\varepsilon _{t}^{demand},\varepsilon _{t}^{o\_demand}\right]\)

    • \(Ypetrol_{t}\), is world crude oil production in logs
    • \(WBC_{t}\) is a measure of world business cycle (detrended GDP)
    • \(Ppetrol_{t}\) is the log of the real price of oil
    • \(\varepsilon _{t}^{supply}\) is a flow oil supply shock
    • \(\varepsilon _{t}^{demand}\) is a flow oil demand shock
    • \(\varepsilon _{t}^{o\_demand}\) are other oil demand shocks
    • Data are monthly
  • The identification restrictions are modelled in the following matrix

\[D_{0}=% \begin{bmatrix} a & 0 & 0 \\ b & c & 0 \\ d & e & f% \end{bmatrix}% \]

  • The two demand shocks are identified by the delay restriction that other oil-demand shocks may raise the price of oil, but without slowing down global real economic activity within the same month

  • Kilian raises the question whether it would be reasonable to impose an over-identifying restriction of the form \(b=0\)

  • Let’s look at the summary of Kilian’s paper:

Shocks to the real price of oil may reflect oil supply shocks, shocks to the global demand for all industrial commodities, or demand shocks that are specific to the crude oil market. Each shock has different effects on the real price of oil and on US macroeconomic aggregates.
Changes in the composition of shocks help explain why regressions of macroeconomic aggregates on oil prices tend to be unstable. Evidence that the recent surge in oil prices was driven primarily by global demand shocks helps explain why this shock so far has failed to cause a major recession in the United States.

Example: Kilian (2011, pp 11), Semi-structural Models of Monetary Policy

  • Often we do not have enough restrictions to fully identify a VAR model.

  • If some cases researchers are only interested in identifying a single (or a group) of shocks; as the shocks are orthogonal, the model could be partially identified.

  • Then we are using a semi-structural VAR. The most common application is to identify the effects of monetary policy shocks

  • For instance we would like to recover the monetary policy shocks from a trivariate VAR: \(y_{t}=\left[ \Delta GDP_{t},\pi _{t},i_{t},\right] ^{^{\prime }}\ \ \ \ \ \\ \ \ \ \ \ \ \ \ \ \varepsilon _{t}=\left[ \varepsilon _{t}^{1},\varepsilon_{t}^{2},\varepsilon _{t}^{M}\right]\)

    • \(GDP_{t}\), is real GDP in logs
    • \(\pi _{t}\) is the inflation rate
    • \(i_{t}\) is the “federal” funds rate (a policy intervention rate)
    • \(\varepsilon _{t}^{1}\) and \(\varepsilon _{t}^{2}\) are two unidentified structural shocks
    • \(\varepsilon _{t}^{M}\) is the monetary policy shock
  • Let’s look at the relations between the innovation and the structural shocks (\(\varepsilon _{t}\))

\[% \begin{bmatrix} u_{t}^{\Delta GDP} \\ u_{t}^{\pi } \\ u_{t}^{i}% \end{bmatrix}% =% \begin{bmatrix} a & 0 & 0 \\ b & c & 0 \\ d & e & f% \end{bmatrix}% \begin{bmatrix} \varepsilon _{t}^{1} \\ \varepsilon _{t}^{2} \\ \varepsilon _{t}^{M}% \end{bmatrix}% \]

  • The last equation of the model is interpreted as a monetary policy reaction function. The monetary authority responds to \(u_{t}^{\Delta GDP}\) and \(u_{t}^{\pi }\), and then the monetary shock (\(\varepsilon _{t}^{M}\)) is identified as …

  • As we are only interested in the monetary shocks, the other two shocks are not identified. We could do that because any alternative decomposition of the first two shocks would leave \(\varepsilon _{t}^{M}\)unaffected. Thus, for simplicity, we impose the recursive structure on the first two equations.

  • It is common to enrich the set of variables ordered above the interest rate relative to this simple benchmark model and estimate larger VAR systems. To be aware of the shortcomings and problems with this way of identifying monetary shocks, see page 12 in Kilian(2011)



4.3. Identifying the SVAR by long-run restrictions on the effects of shocks

  • This approach is really similar to the previous one, but instead of focusing on \(D_{0}\) , we concentrate on \(D(1)\), the matrix of long-run impacts of the shocks

  • Remember that the matrix of long-run effects (\(C(1)=\sum_{i=0}^{\infty}C_{i}\)) could be obtained by inverting the autoregressive polynomial as: \(C(1)=(I_{K}-A_{1}-\cdots -A_{p})^{-1}\)

  • We will recover the structural parameters from the VAR estimates focusing on the long-run impact matrix \(D(1)\) and using the fact that \(C(1)v_{t}=D(1)\varepsilon _{t}\).

  • Then, as previously:

\[E(C(1)v_{t}v_{t}^{^{\prime }}C(1)^{^{\prime }})=E(D(1)\varepsilon _{t}\varepsilon _{t}^{^{\prime }}D(1)^{^{\prime }})\]

\[C(1)\Sigma _{v}C(1)^{\prime }=D(1)D(1)^{^{\prime }}\]

  • Again, the last expression imposes (n+(n+1))/2 restrictions on the elements of \(D(1)\); that is, we will need n(n-1)/2 additional restrictions to recover estimates of all the elements of \(D(1)\)

  • Once we have recovered \(D(1)\) and using the fact that \(C(1)v_{t}=D(1)\varepsilon _{t}\), we can write the VAR as \(A(L)y_{t}=C(1)^{-1}D(1)\varepsilon _{t}\) and inverting the VAR we will recover the SVAR VMA form as \(y_{t}=C(L)C(1)^{-1}D(1)\varepsilon _{t}\) ; that is, we can obtain the structural matrices \(D_{i}=C_{i}\ast C(1)^{-1}D(1)\)

  • This way of identification is also (in the terminology of Amisano & Giannini) a C-model (\(v_{t}=C\varepsilon _{t}\)) where \(C=C(1)^{-1}D(1)\)

Example: Blanchard and Quah (1989), “The Dynamic Effects of Aggregate Demand and Supply Disturbances”, American Economic Review, vol. 79(4), pages 655-73

  • Blanchard and Quah (89) estimate a bivariate VAR with output and unemployment:
    • \(y_{t}=\left[ \Delta GDP_{t},u_{t}\right] ^{^{\prime }}\)
    • \(n=2\) , then \(n(n-1)/2=1\) ; that is, only a restriction is needed to identify the SVAR
    • This additional restriction was that the second shock of the VAR (\(\varepsilon _{t}^{2}\)) has no long-run effect on real GDP
    • B&Q(89) interpret \(\varepsilon _{t}^{2}\) as a demand shock and \(\varepsilon _{t}^{1}\) (which is permitted to have long-run effect on GDP) as a supply shock
  • There is a greater consensus amongst theoretical models in terms of long-run results. It should be unsurprising, therefore, that the most common set of restrictions is to nullify the long-run response of output to monetary or demand shocks

  • Long-run restrictions have been frequently employed, see King et al. (1991), Francis and Ramey (2004), Fisher (2006), among many others.

  • It is also possible to adopt a combination of short and long run restrictions as originally demonstrated by Gali (1992), Gerlach and Smets (1995), Peersman and Smets (2001) and Mamoudou et al. (2009).

  • Unfortunately, long-run schemes are far from critique-free. Faust and Leeper show that with finite data, the long-run effect of shocks is imprecisely estimated, and that this imprecision is exacerbated by long-run restrictions causing serious bias to IRFs even with large samples.



4.4. Identifying the SVAR by restrictions on the contemporaneous interactions among the endogenous variables (K-model in the terminology of Amisano & Giannini)

  • In this approach the SVAR is identified by restrictions on the contemporaneous interactions among the endogenous variables (\(y_{i}\)) instead of restrictions on the effects of the shocks

  • The matrix of contemporaneous effects among the (\(y_{i}\)) is the \(B_{0}\) matrix (called the \(K\)-matrix by Amisano & Giannini)

  • Comparing the VAR [3] and the SVAR [6], we find that if we look at the variables in t,

    • From the VAR: \(y_{t}=v_{t}\)
    • From the SVAR: \(B_{0}y_{t}=\varepsilon _{t}\)
    • then, if we pre-multiply the first equation by \(B_{0}\)
    • we obtain \(B_{0}v_{t}=\varepsilon _{t}\)
    • taking expectations to obtain variance-covariance matrices, \(E\left[B_{0}v_{t}v_{t}^{^{\prime }}B_{0}^{^{\prime }}\right] =E\left[\varepsilon_{t}\varepsilon _{t}^{^{\prime }}\right]\)
    • which leads to: \(B_{0}\Sigma _{v}B_{0}^{^{\prime }}=I\)
  • The last expression imposes (n+(n+1))/2 restrictions on the elements of \(B_{0}\); that is, we will need n(n-1)/2 additional restrictions to recover estimates of all the elements of \(B_{0}\)

  • Once \(B_{0}\) is estimated, we can obtain the SVAR model as: \(B_{i}=B_{0}A_{i}\)

  • We can also obtain the VMA of the SVAR as \(D_{i}=C_{i}B_{0}^{-1}\)



4.5. Identifying the SVAR by both types of restrictions (The AB-model)

  • Amisano & Giannini show how to combine both types of restrictions; that is restrictions on the effects of the shocks and restrictions on the contemporaneous interactions among the \(y_{t}\).

  • They call that approach the AB-model, because there are going to appear two matrices ( A & B); in fact, the A and B matrices are the previous K and C matrices in Amisano & Giannini environment

  • The vars package uses this AB terminology

  • In our environment, [3] to [6], the AB matrices are related to our \(B_{0}\) and \(D_{0}\) respectively

  • These two matrices link the innovations to the structural shocks as \(Av_{t}=B\varepsilon _{t}\)

  • The AB parametrisation nests the C and K models:

    • If \(A=I_{n}\) we are in the C-model approach and we only specify restrictions on the effects of the shocks
    • If \(B=I_{n}\) we are in the K-model approach and we only specify restrictions on the contemporaneous relations among the \(y_{t}\)
  • To identify the \(2n^{2}\) elements of the \(A\) and \(B\) matrices we need, obviously \(2n^{2}\) conditions

  • From \(Av_{t}=B\varepsilon _{t}\), we could obtain \(Av_{t}v_{t}^{^{\prime }}A^{^{\prime }}=B\varepsilon _{t}\varepsilon _{t}^{^{\prime }}B^{^{\prime }}\) and then taking expectations \(A\Sigma _{v}A^{^{\prime }}=BB^{^{\prime }}\) we obtain \(n(n-1)/2\) restrictions.

  • Then, if we specify an AB-model we will need \([2n^{2}-n(n+1)/2]\) extra restrictions to identity our SVAR

  • Amisano & Giannini (assuming a Gaussian distribution) explain how to recover the A & B matrices using full information maximum likelihood (FIML) methods. This is the route followed in the vars package.

  • This approach involves the maximization of the concentrated likelihood with respect to the structural model parameters subject to the identifying restrictions (see, e.g., Lütkepohl 2005).

  • Another alternative is the GMM framework: the identifying restrictions on \(B_{0}\) or on \(D_{0}\) generate moment conditions that can be used to estimate the unknown coefficients.

  • Once we have an estimation of the AB matrices we can recover the SVAR and its VMA representation as:

    • The SVAR matrices: \(B_{i}=B^{-1}AA_{i}\) , obviously \(B_{0}=B^{-1}A\)

    • The matrices for the SVAR VMA representation: \(D_{i}=C_{i}A^{-1}B\), where \(D_{0}=A^{-1}B\)

Example: Blanchard (1989), “A Traditional Interpretation of Macroeconomic Fluctuations”, American Economic Review, 79, 1146-1164.

  • Blanchard (89) uses a “traditional” Keynesian model to analyse the US macroeconomic fluctuations by means of a structural VAR A-B model.

  • Blanchard’s model has 5 equations: an aggregate demand equation, Okun’s law, a price-setting equation, the Phillips curve and a monetary policy rule.

  • The VAR has 5 variables and 5 structural shocks:

\[y_{t}=\left[ Y_{t},U_{t},P_{t},W_{t},M_{t}\right] ^{^{\prime }}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \varepsilon _{t}=\left[ \varepsilon _{t}^{D},\varepsilon _{t}^{S},\varepsilon _{t}^{P},\varepsilon _{t}^{W},\varepsilon _{t}^{M}% \right] ^{^{\prime }}\]

  • The A and B matrices to recover the SVAR are:

\[A=% \begin{bmatrix} 1 & 0 & 0 & 0 & 0 \\ a_{21} & 1 & 0 & 0 & 0 \\ a_{31} & 0 & 1 & a_{34} & 0 \\ 0 & a_{42} & a_{43} & 1 & 0 \\ a_{51} & a_{52} & a_{53} & a_{54} & 1% \end{bmatrix}% \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ B=% \begin{bmatrix} b_{11} & b_{12} & 0 & 0 & 0 \\ 0 & b_{22} & 0 & 0 & 0 \\ 0 & b_{32} & b_{33} & 0 & 0 \\ 0 & b_{42} & 0 & b_{44} & 0 \\ 0 & 0 & 0 & 0 & b_{55}% \end{bmatrix}% \]

  • The restrictions on the A & B matrices come from:
    • \(Y_{t}=b_{11}\varepsilon _{t}^{D}+b_{12}\varepsilon _{t}^{S}\). Aggregate demand equation: real GDP is contemporaneously affected by \(\varepsilon _{t}^{D}\) and \(\varepsilon _{t}^{S}\)
    • \(U_{t}=-a_{21}Y_{t}+b_{22}\varepsilon _{t}^{S}\). Okun’s law: unemployment is simultaneously related to output and instantaneously affected by \(\varepsilon _{t}^{S}\)
    • \(P_{t}=-a_{31}Y_{t}-a_{34}W_{t}+b_{32}\varepsilon _{t}^{S}+b_{33}\varepsilon _{t}^{P}\). Price setting equation: the price level is simultaneously related to output and wages, and instantaneously affected by \(\varepsilon _{t}^{S}\) and \(\varepsilon _{t}^{P}\)
    • \(W_{t}=-a_{42}U_{t}-a_{43}P_{t}+b_{42}\varepsilon _{t}^{S}+b_{44}\varepsilon _{t}^{W}\). Phillips curve: the nominal wage is simultaneously related to unemployment and prices, and instantaneously affected by \(\varepsilon _{t}^{S}\) and \(\varepsilon _{t}^{P}\)
    • \(M_{t}=-a_{51}Y_{t}-a_{52}U_{t}-a_{53}P_{t}-a_{54}W_{t}+b_{55}\varepsilon _{t}^{M}\). Monetary rule equation: nominal money is simultaneously related to all the other 4 variables, but is only and instantaneously affected by monetary structural disturbances(\(\varepsilon _{t}^{M}\))
  • For a complete economic interpretation of these equations, see Blanchard (1989, section II).

  • Together, the 2 matrices (A-B) have 17 free elements, while from \(A\Sigma _{v}A^{^{\prime }}=BB^{^{\prime }}\) we obtain only \(n(n-1)/2 = 15\) restrictions.To satisfy the order condition we need two additional restrictions.

  • For this reason, Blanchard (1989) assigned fixed numerical values to the coefficients \(a_{34}\) and \(b_{12}\). The numerical value given to \(a_{34}\) was derived from previous studies, whereas that assigned to \(b_{12}\) resulted from a sort of calibration reasoning.



Additional topics

  • VECM

  • Bayesian VARs

  • Sign restrictions

  • Identification by Heteroskedasticity

  • Non-fundamentalness

  • Factor-augmented VAR (FAVAR)

  • TVAR & STVAR



To sum up

  • Structural vector autoregressive (SVAR) models have been used extensively for economic analysis since they were advocated by Sims (1980) as alternatives to classical econometric simultaneous equations models.

  • Despite their popularity, a number of authors have questioned their reliability and usefulness on different grounds.

  • For example, Cooley and LeRoy (1985) call VAR analysis atheoretical if no structural assumptions from economic theory are used in structural interpretations.

  • Cooley and Dwyer (1998) question the robustness of the evidence from SVARs with respect to the statistical model specifications.

  • Non-arbitrary orthogonalisation schemes which impose contemporaneous restrictions on the VAR are referred to as short-run identification schemes. Most short-run restrictions are zero restrictions (e.g. that output reacts only with a lag to monetary shocks).

  • Opinions concerning short-run restrictions are mixed. Faust and Leeper (1997) claim there is often simply an insufficient number of tenable contemporary restrictions to achieve identification. However, Christiano et al. (2006) argue that short-run SVARs perform remarkably well.

  • Pioneering work by Shapiro and Watson (1988) and Blanchard and Quah (1989) described how restrictions could be placed on the long-run responses.

  • There is a greater consensus amongst theoretical models in terms of long-run results. It should be unsurprising therefore that the most common set of restrictions is to nullify the long-run response of output to monetary shocks.

  • Ever since their introduction, long-run restrictions have been frequently employed, see King et al. (1991), Francis and Ramey (2004), Fisher (2006) among many others.

  • It is also possible to adopt a combination of short and long run restrictions as originally demonstrated by Gali (1992), Gerlach and Smets (1995), Peersman and Smets (2001) and Mamoudou et al. (2009).

  • VAR methodology is under continuous development (VECM, sign restrictions, Heteroskedasticity restrictions, STVAR, etc.)

  • In their review of the VAR methodology, Stock and Watson (2001) conclude that VARs successfully capture the rich interdependent dynamics of data well, but that their structural implications are only as sound as their identification schemes’.

Bibliography

The slides are based on the following documents:
(and probably some others that I have not remembered at the time of the final making. Thanks to all of them)





LS0tCnRpdGxlOiAiTm90ZXMgb24gQXBwbGllZCBWQVIgTW9kZWxsaW5nIgphdXRob3I6ICJQZWRybyBKLiBQw6lyZXoiCmRhdGU6ICIyMDIwLCBBcHJpbCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgaGlnaGxpZ2h0OiBweWdtZW50cyAKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgICN0aGVtZTogdW5pdGVkCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgI2NvZGVfZm9sZGluZzogc2hvdwogICAgc2VsZl9jb250YWluZWQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgo8IS0tLSBkZWZpbmllbmRvIGVzdGlsb3MgQ1NTIG8gSFRNTCAtLT4KPHN0eWxlPgogIHAge21hcmdpbjogNDBweCAwIDQwcHggMDt9ICAjLSB0b3AsIGl6cXVpZXJkYSwgYWJham8sIGxlZnQKPC9zdHlsZT4gCjxzdHlsZT4KICBib2R5IHsgbGluZS1oZWlnaHQ6MS42O30gICAjLSBhbmNodXJhIGRlIGxhcyBsaW5lYXMgMS4wIGlzIHRoZSBkZWZhdWx0IGluIEZpcmVmb3guIDIuMCBwcm92aWRlcyBhIGxhcmdlIHNwYWNlCjwvc3R5bGU+CiAgCjxzdHlsZT4KICBoMSwgaDIsIGgzLCBoNCwgaDUgIHtjb2xvcjpkYXJrYmx1ZTt9ICAjLSBlc3RvIG1lIGhhY2UgbG9zIGgyIGVuIGJsdWUKPC9zdHlsZT4gIAoKPCEtLS0gZGVmaW5pZW5kbyBvcGNpb25lcyBnbG9iYWxlcyBwYXJhIGxvcyBjaHVua3MgLS0+CmBgYHtyIGtuaXRyX2luaXQsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHJtZGZvcm1hdHMpCgojIyBHbG9iYWwgb3B0aW9ucwpvcHRpb25zKG1heC5wcmludD0iNzUiKQpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsCgkgICAgICAgICAgICAgY2FjaGU9RkFMU0UsCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwKICAgICAgICAgICAgICAgdGlkeT1UUlVFLAogICAgICAgICAgICAgICBjb21tZW50PU5BLAogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLAogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFKQoKb3B0c19rbml0JHNldCh3aWR0aD03NSkKYGBgCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAoKCjEuIEludHJvZHVjdGlvbgoyLiBWQVIgbW9kZWxzIGluIHJlZHVjZWQgZm9ybSAoRXN0aW1hdGlvbikKICAgICArIE1vZGVsIFNwZWNpZmljYXRpb24KICAgICArIEVzdGltYXRpb24KICAgICArIFZhbGlkYXRpb24KMy4gVkFSIG1vZGVscyBpbiByZWR1Y2VkIGZvcm0gKFVzZXMpICAgICAKICAgICArIENhdXNhbGl0eSBBbmFseXNpcwogICAgICsgRm9yZWNhc3RpbmcKICAgICArIE1vdmluZyBhdmVyYWdlIHJlcHJlc2VudGF0aW9uIChNVkEpCiAgICAgKyBTdHJ1Y3R1cmFsIGFuYWx5c2lzCiAgICAgICAgKyBJbXB1bHNlIHJlc3BvbnNlIGZ1bmN0aW9ucyAoSVJGKQogICAgICAgICsgRm9yZWNhc3QgRXJyb3IgVmFyaWFuY2UgRGVjb21wb3NpdGlvbiAoRkVWRCkKICAgICAgICArIEhpc3RvcmljYWwgRGVjb21wb3NpdGlvbgo0LiBTdHJ1Y3R1cmFsIFZBUiBtb2RlbHMKICAgICAgKyBJbnRyb2R1Y3Rpb24KICAgICAgKyBJZGVudGlmaWNhdGlvbiB3aXRoIHNob3J0LXJ1biByZXN0cmljdGlvbnMgKG9uIHRoZSBlZmZlY3RzIG9mIHNob2NrcykKICAgICAgKyBJZGVudGlmaWNhdGlvbiB3aXRoIGxvbmctcnVuIHJlc3RyaWN0aW9ucyAob24gdGhlIGVmZmVjdHMgb2Ygc2hvY2tzKQogICAgICArIElkZW50aWZpY2F0aW9uIHdpdGggY29udGVtcG9yYW5lb3VzIGludGVyYWN0aW9ucyBhbW9uZyB0aGUgZW5kb2dlbm91cyB2YXJpYWJsZXMKICAgICAgKyBJZGVudGlmeWluZyB0aGUgU1ZBUiBieSBib3RoIHR5cGVzIG9mIHJlc3RyaWN0aW9ucyAoVGhlIEFCLW1vZGVsKQoKCjxicj4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiMgMS4gSW50cm9kdWN0aW9uCgoKKiBNb3N0IG9mIHRoZSBxdWVzdGlvbnMgaW4gZW1waXJpY2FsIG1hY3JvZWNvbm9taWNzIGFyZSBzaW1pbGFyIHRvOiAgd2hhdCBpcyB0aGUgZWZmZWN0IG9mIGEgcG9saWN5IGludGVydmVudGlvbiBvciBzaG9jayAoaW50ZXJlc3QgcmF0ZSBpbmNyZWFzZSwgdGF4IGN1dCwgLi4uICkgb24gdGhlIG1hY3JvZWNvbm9taWMgYWdncmVnYXRlcyBvZiBpbnRlcmVzdD8gIAoKCiogSWRlYWxseSwgd2Ugd291bGQgbGlrZSB0byBrbm93IHRoZSBkeW5hbWljIGVmZmVjdCBvZiBhIHNob2NrICgkXHZhcmVwc2lsb25fe3R9JCkgb24geyAkWV97dH0sWV97dCsxfSQsIC4uLiB9ICAgCiAgICArIEluIG1hY3JvLCB0aGlzIGR5bmFtaWMgY2F1c2FsIGVmZmVjdCBpcyBjYWxsZWQgdGhlIGltcHVsc2UgcmVzcG9uc2UgZnVuY3Rpb24gKElSRikgb2YgJFlfe3R9JCB0byB0aGUgc2hvY2sgJFx2YXJlcHNpbG9uX3t0fSQKICAgIAogICAgKyBUaGF0J3MgdGhlIHR5cGljYWwgcHVycG9zZSBvZiAqKlZlY3RvciBBdXRvcmVncmVzc2l2ZSAoVkFSKSBtb2RlbHMqKjogdG8gZXN0aW1hdGUgdGhlIElSRiBvZiBhIG1hY3JvZWNvbm9taWMgc2VyaWVzICgkWV97dH0kKSB0byBhIHNob2NrICgkXHZhcmVwc2lsb25fe3R9JCkKCgoKKiBEdXJpbmcgdGhlIHRocmVlIGRlY2FkZXMgZm9sbG93aW5nIFtTaW1zJ3MgKDE5ODApIHBhcGVyXShodHRwczovL2lkZWFzLnJlcGVjLm9yZy9hL2VjbS9lbWV0cnAvdjQ4eTE5ODBpMXAxLTQ4Lmh0bWwpLCBWQVIgbW9kZWxzIGhhdmUgYmVjb21lIGEgc3RhbmRhcmQgaW5zdHJ1bWVudCBpbiBlY29ub21ldHJpY3MgdG8gYW5hbHlzZSBtdWx0aXZhcmlhdGUgdGltZSBzZXJpZXMgYW5kIG9uZSBvZiB0aGUgbWFqb3Igd2F5cyB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVjb25vbXkKCgoKKiBWQVIncyBoYXZlIHByb3ZlbiB0aGVpciB3b3J0aCBpbiBmb3JlY2FzdGluZywgYnV0IGFsc28gaW4gdW5jb3ZlcmluZyB0aGUgdHJhbnNtaXNzaW9uIG1lY2hhbmlzbXMgb2Yga2V5IG1hY3JvZWNvbm9taWMgc2hvY2tzLiBJbiBwYXJ0aWN1bGFyIFZBUidzOgoKICAgICsgaGF2ZSBhIGNlbnRyYWwgcm9sZSBpbiBpbnZlc3RpZ2F0aW5nIHRoZSBzb3VyY2VzIG9mIGJ1c2luZXNzIGN5Y2xlIGZsdWN0dWF0aW9ucwogICAgCiAgICArIGhhdmUgYmVjb21lIGEgYmVuY2htYXJrIGluc3RydW1lbnQgYWdhaW5zdCB3aGljaCBtb2Rlcm4gZHluYW1pYyB0aGVvcmllcyAoRFNHRSBtb2RlbHMpIGFyZSBldmFsdWF0ZWQKCgoqIEFmdGVyIGlkZW50aWZpY2F0aW9uLCAqKlN0cnVjdHVyYWwgVmVjdG9yIEF1dG9yZWdyZXNzaXZlIChTVkFSKSBtb2RlbHMqKiBoYXZlIGJlZW4gbWFpbmx5IHVzZWQgdG8gYWRkcmVzcyB0aGUgMiBmb2xsb3dpbmcgdHlwZSBvZiBxdWVzdGlvbnM6IAoKICAgICsgSG93IGRvZXMgdGhlIGVjb25vbXkgKCRZX3t0fSQpIHJlc3BvbmQgdG8gZGlmZmVyZW50IGVjb25vbWljIHNob2Nrcz8gKCoqSVJGKiopCiAgICAKICAgICsgV2hhdCBpcyB0aGUgY29udHJpYnV0aW9uIG9mIHRoZSBkaWZmZXJlbnQgc2hvY2tzIHRvIHRoZSBtb3ZlbWVudHMgaW4gJFlfe3R9JD8gKCoqRkVWRCoqKQoKCiogU1ZBUidzIGhhdmUgYmVlbiB1c2VkIGluIGFuIGluY3JlZGlibHkgbGFyZ2UgbnVtYmVyIG9mIGFyZWFzIGFuZCB0b3BpY3MsIGFuZCBoYXZlIGhhZCBhbmQgY29udGludWUgdG8gaGF2ZSBhIGNlbnRyYWwgcm9sZSBmb3IgdW5kZXJzdGFuZGluZyBhZ2dyZWdhdGUgZmx1Y3R1YXRpb25zIGFuZCBkaXNlbnRhbmdsaW5nIHRoZSBpbXBvcnRhbmNlIG9mIGRpZmZlcmVudCBlY29ub21pYyBzaG9ja3MgIAoKCkFzIFtLaWxpYW4gKDIwMTEpXShodHRwczovL2lkZWFzLnJlcGVjLm9yZy9wL2Nwci9jZXByZHAvODUxNS5odG1sKSBzYXlzOiAgCgo+IE5vdHdpdGhzdGFuZGluZyB0aGUgaW5jcmVhc2VkIHVzZSBvZiBlc3RpbWF0ZWQgZHluYW1pYyBzdG9jaGFzdGljIGdlbmVyYWwgZXF1aWxpYnJpdW0gKERTR0UpIG1vZGVscyBvdmVyIHRoZSBsYXN0IGRlY2FkZSwgKipzdHJ1Y3R1cmFsIHZlY3RvciBhdXRvcmVncmVzc2l2ZSAoVkFSKSBtb2RlbHMgY29udGludWUgdG8gYmUgdGhlIHdvcmtob3JzZSBvZiBlbXBpcmljYWwgbWFjcm9lY29ub21pY3MgYW5kIGZpbmFuY2UqKgoKPGJyPgoKIyMgMS4xIE9yaWdpbnMgJiBkZXZlbG9wbWVudCBvZiBWQVIgbW9kZWxzIAoKCiogT3JpZ2luczogW1NpbXMgKDE5ODApXShodHRwczovL2lkZWFzLnJlcGVjLm9yZy9hL2VjbS9lbWV0cnAvdjQ4eTE5ODBpMXAxLTQ4Lmh0bWwpIGluIGhpcyBwYXBlciBNYWNyb2Vjb25vbWljcyBhbmQgUmVhbGl0eSAgICAKCgoqIEEgbGl0dGxlIGJpdCBvZiBoaXN0b3J5OiBJbiB0aGUgbWlkIDcwJ3MsIENvd2xlcyBDb21taXNzaW9uJ3MgYXBwcm9hY2ggdG8gZWNvbm9tZXRyaWMgbW9kZWxsaW5nIHdhcyBhdHRhY2tlZCBvbiBzZXZlcmFsIGdyb3VuZHMgYW5kIHdhcyBldmVudHVhbGx5IGFib2xpc2hlZC4gVHdvIG1ham9yIGNyaXRpcXVlczogIAoKICAgICsgICAgKipMdWNhcyBjcml0aXF1ZSoqOiBleHBlY3RhdGlvbnMgYXJlIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgZXhwbGljaXRseSwgc28gaWRlbnRpZmllZCBwYXJhbWV0ZXJzIGFyZSBhIG1peHR1cmUgb2YgZGVlcCBwYXJhbWV0ZXJzIChwcmVmZXJlbmNlIGFuZCB0ZWNobm9sb2d5KSBhbmQgZXhwZWN0YXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBzdGFibGUgYWNyb3NzIHBvbGljeSByZWdpbWVzKHBhcmFtZXRlciBpbnZhcmlhbmNlKS4gSGVuY2UsIG1vZGVscyBhcmUgbm90IHVzZWZ1bCBmb3IgcG9saWN5IHNpbXVsYXRpb25zICAgCiAgICAKICAgICsgICAgKipTaW1zICJjcml0aXF1ZSIqKjogImluY3JlZGlibGUgaWRlbnRpZmljYXRpb24gcmVzdHJpY3Rpb25zIi4gU2ltcyByYWlzZWQgc2V2ZXJhbCBvYmplY3Rpb25zIHRvIHRoZSB0cmFkaXRpb25hbCB3YXkgb2YgaWRlbnRpZnlpbmcgbWFjcm9lY29ub21ldHJpYyBtb2RlbHMsIHdoZXJlIGV4Y2x1c2lvbiByZXN0cmljdGlvbnMgd2VyZSByb3V0aW5lbHkgaW1wb3NlZCBhbmQgdGhlIGRlY2lzaW9uIHdoZXRoZXIgYSB2YXJpYWJsZSBzaG91bGQgYmUgcmVnYXJkZWQgYXMgZXhvZ2Vub3VzIHdpdGggcmVzcGVjdCB0byB0aGUgc3lzdGVtIHdhcyBtYWRlIHJhdGhlciBhcmJpdHJhcmlseS4gSW4gcGFydGljdWxhciwgYWNjb3JkaW5nIHRvIFNpbXMsIG5vIHZhcmlhYmxlIGNhbiBiZSBkZWVtZWQgYXMgZXhvZ2Vub3VzIGluIGEgd29ybGQgb2YgcmF0aW9uYWwgZm9yd2FyZCBsb29raW5nIGFnZW50cy4gIAogICAgCiAgICAKCiogU2ltcyAoMTk4MCkgYWR2b2NhdGVzIGZvciB0aGUgdXNlIG9mIFZBUiBtb2RlbHMgYXMgYSB0aGVvcnktZnJlZSBtZXRob2QgdG8gZXN0aW1hdGUgZWNvbm9taWMgcmVsYXRpb25zaGlwcyAgIAoKICAgICsgICAgU2ltcydzIGJhc2ljIGlkZWEgd2FzIHRvIHRyZWF0IGFsbCB2YXJpYWJsZXMgYXMgZW5kb2dlbm91cyBhbmQgZmlyc3QgZXN0aW1hdGUgYW4gdW5yZXN0cmljdGVkIG1vZGVsIGluIGEgcmVkdWNlZCBmb3JtLiBObyBwcmlvciBrbm93bGVkZ2UgaXMgdXNlZCBleGNlcHQgdG8gZGVjaWRlIHdoaWNoIHZhcmlhYmxlcyBzaG91bGQgZW50ZXIgdGhlIHN5c3RlbS4gCiAgICAKICAgICsgICAgVGhlIGVzdGltYXRpb24gb2YgdGhlIFZBUiBpcyB1c3VhbGx5IG1hZGUgYnkgT0xTICh3aGljaCB3ZSB3aWxsIHNlZSBpcyBjb25zaXN0ZW50IGFuZCwgdW5kZXIgbm9ybWFsaXR5IG9mIHRoZSBlcnJvciB0ZXJtcywgZWZmaWNpZW50KSAgCiAgICAKICAgICsgICAgT25jZSB0aGUgVkFSIGlzIGVzdGltYXRlZCwgZGlmZmVyZW50IGFuYWx5c2lzIGNvdWxkIGJlIGRvbmUgYnV0IHRoZSBtb3N0IHVzdWFsIGFyZSB0aGUgb2J0YWluaW5nIG9mIElSRiBhbmQgRkVWRCwgYnV0IGZvciB0aGlzLCB0aGUgc3RydWN0dXJhbCBzaG9ja3Mgc2hvdWxkIGJlIGlkZW50aWZpZWQgIAogICAgCiAgICArICAgIEd1aWRlZCBieSBlY29ub21pYyB0aGVvcnksIHRoZSBlY29ub21ldHJpY2lhbiBpbXBvc2VzIHJlc3RyaWN0aW9ucyAodXN1YWxseSBvbiBob3cgdGhlIHN0cnVjdHVyYWwgc2hvY2tzIGltcGFjdCB0aGUgdmFyaWFibGVzIHdpdGhpbiB0aGUgbW9kZWwgc3lzdGVtKSB0cmFuc2Zvcm1pbmcgdGhlIFZBUiBtb2RlbCBpbnRvIGEgU3RydWN0dXJhbCBWZWN0b3IgQXV0b3JlZ3Jlc3NpdmUgKCoqU1ZBUioqKSBtb2RlbCAgCiAgICAKICAgICsgICAgU2ltcydzIG9yaWdpbmFsIGlkZWEgdG8gb2J0YWluIElSRiZGRVZEIHdhcyB0byBhc3N1bWUgcmVjdXJzaXZlIGNvbnRlbXBvcmFuZW91cyBpbnRlcmFjdGlvbnMgYW1vbmcgdmFyaWFibGVzLCBpLmUuIGJ5IGltcG9zaW5nIGEgY2VydGFpbiBzdHJ1Y3R1cmFsIG9yZGVyaW5nIG9mIHRoZSB2YXJpYWJsZXMuIEluIHRlcm1zIG9mIHRoZSBtb3ZpbmcgYXZlcmFnZSAoTUEpIHJlcHJlc2VudGF0aW9uLCB0aGUgc3RydWN0dXJhbCBzaG9ja3MgZG8gbm90IGFmZmVjdCBwcmVjZWRpbmcgdmFyaWFibGVzIHNpbXVsdGFuZW91c2x5IChDaG9sZXNreSkgIAogICAgCiAgICArICAgIExhdGVyIG9uLCByZXN0cmljdGlvbnMgdG8gb2J0YWluIHRoZSBTVkFSLCBjYW1lIGluIHNldmVyYWwgZm9ybXM6IGdlbmVyYWwgc2hvcnQgcnVuIHJlc3RyaWN0aW9ucywgKHplcm8gb3IgbGluZWFyIHJlbGF0aW9uc2hpcHMpLCBsb25nIHJ1biByZXN0cmljdGlvbnMsIGNvaW50ZWdyYXRpb24gYW5kIHNpZ24gcmVzdHJpY3Rpb25zLCBldGMuICAgCiAgICAKCjxicj4KCiMjICAxLjIgQSBndWlkZWQgdG91ciB0aHJvdWdoIFZBUiBtZXRob2RvbG9neTogIAoKICAKYGBge3IgIHV1dXV1LCBlY2hvPUYsIHJlc3VsdHM9J2FzaXMnLCBjYWNoZT1GfQpsaWJyYXJ5KCJEaWFncmFtbWVSIikgICAjLSBjYXJnbyBsaWJyZXJpYSAoZ2l0aHViLmNvbS9yaWNoLWlhbm5vbmUvRGlhZ3JhbW1lUikgYW5kICgvL3JjYXBzdWxlcy5jb20vdGFnL2RpYWdyYW1tZXIvKQojLSAqIERlZmlubyBlbCBmbG93Y2hhcnQuIFBhcmVjZSBjb21wbGljYWRvIHBlcm8gbm8KVkFSX2Zsb3c9IgpkaWdyYXBoIG9yZ3sKbGF5b3V0ID0gZG90Cm5vZGUgW3NoYXBlPSdib3gnXQoxW2xhYmVsPSdTcGVjaWZpY2F0aW9uICYgRXN0aW1hdGlvbiBvZiBWQVIgKGluIHJlZHVjZWQgZm9ybSknXQoyW2xhYmVsPSdNb2RlbCBDaGVraW5nJywgZm9udGNvbG9yPSdyZWQnXSAKMSAtPiAyCmVkZ2UgW2NvbG9yPSdicm93bicscGVud2lkdGg9Ml0KMiAtPiAxCm5vZGUgW3NoYXBlPSdib3gnXQphW2xhYmVsPSdGb3JlY2FzdGluZyddCmJbbGFiZWw9J0NhdXNhbGl0eSddCmNbbGFiZWw9J1N0cnVjdHVyYWwgQW5hbHlzaXMnXQplZGdlIFtjb2xvcj0nYmxhY2snLHBlbndpZHRoPTFdCjIgLT4gIHthIGIgY30Kbm9kZSBbc2hhcGU9J2JveCcsIGZpeGVkc2l6ZWQgPSBmYWxzZV0Kd1tsYWJlbD0nRm9yZWNhc3Qgc2NlbmFyaW9zJ10KeFtsYWJlbD0nSGlzdG9yaWNhbCBkZWNvbXBvc2l0aW9ucyddCnlbbGFiZWw9J0lSRnMnXQp6W2xhYmVsPSdGRVZEJ10KYyAtPiAge3cgeCB5IHogfQp9IAoiCkRpYWdyYW1tZVI6OmdyVml6KFZBUl9mbG93KSAgIy0gVW5hIHZleiBkZWZpbmlkbywgbG8gZ3LDoWZpY28KYGBgCgoKU2ltaWxhciB0byBGaWd1cmUgMSwgcC4zLCBpbiBbTMO8dGtlcG9obCgyMDExKV0oaHR0cDovL2NhZG11cy5ldWkuZXUvYml0c3RyZWFtL2hhbmRsZS8xODE0LzE5MzU0L0VDT18yMDExXzMwLnBkZikgICAgCgo8YnI+CgotLS0tLS0KCjxicj4KCgojIDIuIFZBUiBtb2RlbHMgKGluIHJlZHVjZWQgZm9ybSkgIAoKCkFzIHdlIHdpbGwgc2VlIGluIHNob3J0LCB0aGVyZSBhcmUgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucyBmb3IgYSBWQVI6IFZBUiB2cy4gVk1BLCBzdHJ1Y3R1cmFsIHZzLiByZWR1Y2VkIFZBUidzLiBCeSBub3cgd2Ugd2lsbCBzdGFydCB3aXRoIGEgcXVlc3Rpb246IAoKCiMjIyMgV2hhdCBpcyBleGFjdGx5IGEgVkFSIG1vZGVsPyAKCgoqIEEgVkFSIGlzIGFuIGVjb25vbWV0cmljIG1vZGVsIHVzZWQgdG8gY2FwdHVyZSB0aGUgbGluZWFyIGludGVyZGVwZW5kZW5jaWVzIGFtb25nIG11bHRpcGxlIHRpbWUgc2VyaWVzLiBJbiBmYWN0LCBhIFZBUihwKSBpcyBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSBBUihwKSBtb2RlbCB0byB0aGUgbXVsdGl2YXJpYXRlIGNhc2UuICAKCgoqIEFsbCB2YXJpYWJsZXMgaW4gYSBWQVIgYXJlIHRyZWF0ZWQgc3ltbWV0cmljYWxseTogZWFjaCB2YXJpYWJsZSBoYXMgYW4gZXF1YXRpb24gZXhwbGFpbmluZyBpdHMgZXZvbHV0aW9uIGJhc2VkIG9uIGl0cyBvd24gbGFncyBhbmQgdGhlIGxhZ3Mgb2YgdGhlIG90aGVyIG1vZGVsIHZhcmlhYmxlcyAgICAKCgoqIEEgVkFSIGFuYWx5c2lzIHN0YXJ0cyBieSBlc3RpbWF0aW5nIGEgKHJlZHVjZWQgZm9ybSkgVkFSIG1vZGVsIG9mIG9yZGVyIHAuIAoKPGJyPgoKIyMjIyBBbiBleGFtcGxlOiBhIHRyaXZhcmlhdGUgVkFSKHA9MikgbW9kZWwKCgoqIHRyaXZhcmlhdGU6ICB7R0RQLCBQcmljZXMsIE1vbmV5fTogIAoKICAtIHR3byBsYWdzIChwPTIpICAKICAKICAtIGFsbCB2YXJpYWJsZXMgSSgwKSEhISAgCgoKCiQkXGxlZnRceyAKXGJlZ2lue2FycmF5fXtjfQpZX3t0fT0wLjZZX3t0LTF9KzAuMllfe3QtMn0rMC4zUF97dC0xfS0wLjJQX3t0LTJ9KzAuNU1fe3QtMX0tMC41TV97dC0yfSt2X3t0fV57WX0KXFwgClBfe3R9PS0wLjdfe3QtMX0rMC4xX3t0LTJ9KzAuNVBfe3QtMX0rMC40UF97dC0yfSswLjZNX3t0LTF9LTAuNk1fe3QtMn0rdl97dH1ee1B9ClxcIApNX3t0fT0tMC42X3t0LTF9KzAuM197dC0yfSswLjVQX3t0LTF9KzAuNFBfe3QtMn0rMC45TV97dC0xfS0wLjJNX3t0LTJ9K3Zfe3R9XntNfSUKXGVuZHthcnJheX0lClxyaWdodFx9ICQkCgoKKiBUaGUgdmFyaWFibGVzIGNvdWxkIGJlIGFycmFuZ2VkIGluIGRpZmZlcmVudCB3YXlzLCBidXQgdGhlIG1vc3QgY29tbW9uIHdheSBvZiB2aXN1YWxpemF0aW9uIGlzOiAgIAoKCiQkJQpcYmVnaW57YXJyYXl9e2N9Cllfe3R9PTAuNllfe3QtMX0rMC4zUF97dC0xfSswLjVNX3t0LTF9KzAuMllfe3QtMn0tMC4yUF97dC0yfS0wLjVNX3t0LTJ9K3Zfe3R9XntZfQpcXCAKUF97dH09LTAuN1lfe3QtMX0rMC41UF97dC0xfSswLjZNX3t0LTF9KzAuMVlfe3QtMn0rMC40UF97dC0yfS0wLjZNX3t0LTJ9K3Zfe3R9XntQfQpcXCAKTV97dH09LTAuNllfe3QtMX0rMC41UF97dC0xfSswLjlNX3t0LTF9KzAuM1lfe3QtMn0rMC40UF97dC0yfSstMC4yTV97dC0yfSt2X3t0fV57TX0lClxlbmR7YXJyYXl9JSQkCgoKKiBXZSBjYW4gc2ltcGxpZnkgdGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIFZBUiBieSBkZWZpbmluZyB0aGUgZm9sbG93aW5nIHZlY3RvcnM6ICAgCgoKJCR5X3t0fT1cbGVmdFsgClxiZWdpbnthcnJheX17Y30KWV97dH0gXFwgClBfe3R9IFxcIApNX3t0fSUKXGVuZHthcnJheX0lClxyaWdodF0gXCBcIFwgXCBcIHZfe3R9PVxsZWZ0WyAKXGJlZ2lue2FycmF5fXtjfQp2X3t0fV57WX0gXFwgCnZfe3R9XntQfSBcXCAKdl97dH1ee019JQpcZW5ke2FycmF5fSUKXHJpZ2h0XSAkJAoKCgoqIFRoZW4sIHRoZSBWQVIgY291bGQgYmUgd3JpdHRlbiBhczoKCiQkeV97dH09XGxlZnRbIApcYmVnaW57YXJyYXl9e2NjY30KMC42ICYgMC4zICYgMC41IFxcIAotMC43ICYgMC41ICYgMC42IFxcIAotMC42ICYgMC41ICYgMC45JQpcZW5ke2FycmF5fSUKXHJpZ2h0XSB5X3t0LTF9K1xsZWZ0WyAKXGJlZ2lue2FycmF5fXtjY2N9CjAuMiAmIC0wLjIgJiAtMC41IFxcIAowLjEgJiAwLjQgJiAtMC42IFxcIAowLjMgJiAwLjQgJiAtMC4yJQpcZW5ke2FycmF5fSUKXHJpZ2h0XSB5X3t0LTJ9K3Zfe3R9JCQKCgoKKiBBcyB3ZWxsIGFzOgoKJCR5X3t0fT1BX3sxfXlfe3QtMX0rQV97Mn15X3t0LTJ9K3Zfe3R9JCQKCiogQW5kLCBhbHNvIG1vcmUgY29tcGFjdGx5LCBhczogCgokJEEoTCl5X3t0fT12X3t0fSQkCgp3aXRoICAgICAgICRBKEwpPShJX3tLfS1BX3sxfUxeezF9LUFfezJ9TF57Mn0pJAoKCgoqIEFmdGVyIGVzdGltYXRpb24gJiB2YWxpZGF0aW9uLCBhIFZBUiAoaW4gcmVkdWNlZCBmb3JtKSBjb3VsZCBiZSB1c2VkIGZvciB0ZXN0aW5nIChmb3IgZXhhbXBsZSwgR3JhbmdlciBjYXVzYWxpdHkpIGFuZCBmb3IgZm9yZWNhc3RpbmcKCgoqIFRoZSBwcmluY2lwYWwgaW5zdHJ1bWVudHMgKG9yIHVzYWdlcykgb2YgVkFSIG1vZGVsbGluZyBhcmUgdGhlIElSRiAmIEZFVkQgYnV0IGZvciB0aGVzZSB1c2VzIGl0J3MgbmVjZXNzYXJ5IHRvIGlkZW50aWZ5IHRoZSBzdHJ1Y3R1cmFsIGRpc3R1cmJhbmNlcywgdGhhdCBpcywgdG8gZXN0aW1hdGUgYSBTVkFSIG1vZGVsIAogIAoKPGJyPiAKCi0tLS0tLQoKIyMgMi4xIE1vZGVsIFNwZWNpZmljYXRpb24gIAoKPGJyPiAKCgoqIExldCAgJHlfe3R+fT1+XGxlZnRbIFlfezF0fn0sfllfezJ0fX4sfi4uLi5+LH5ZX3tLdH1ccmlnaHRdIF57XntccHJpbWV9fSQgZGVub3RlIGEgKEt4MSkgdmVjdG9yIG9mIHJhbmRvbSB2YXJpYWJsZXMsIHRoZW4gYSBWQVIocCkgbW9kZWwgY2FuIGJlIHdyaXR0ZW4gYXMgOiAgCgoKCgokJHlfe3R9fj1BX3sxfXlfe3QtMX0rQV97Mn15X3t0LTJ9K1wgXCAuLi5cIFwKK0Ffe3B9eV97dC1wfStDRF97dH0rdl97dH1cIFwgXCBcIFwgXCBcIFwgWzFdJCQKCgoKd2hlcmU6ICAKCgogJFxib2xkc3ltYm9se0Rfe3R9fSQgaXMgYSB2ZWN0b3IgJChNXHRpbWVzIDEpJCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkZXRlcm1pbmlzdGljIHJlZ3Jlc3NvcnMgKGNvbnN0YW50LCB0cmVuZCwgZHVtbWllcyAuLi4pLCAkXGJvbGRzeW1ib2x7Q30kIGlzIHRoZSBjb2VmZmljaWVudCBtYXRyaXggZm9yICRcYm9sZHN5bWJvbHtEX3t0fX0kIAoKCiAkXGJvbGRzeW1ib2x7QV97aX19JCBhcmUgJChLXHRpbWVzIEspJCBjb2VmZmljaWVudCBtYXRyaWNlcywgIAogJFxib2xkc3ltYm9se3Zfe3R9fSQgIGlzIGEgJChLXHRpbWVzIDEpJCB2ZWN0b3Igb2Ygd2hpdGUgbm9pc2UgKCR2X3t0fVxyaWdodGFycm93ICgwLFxTaWdtYSBfe3Z9KSQpLgoKCjxicj4KCiogQXMgTMO8dGtlcG9obCAoMjAxMSkgcG9pbnRzIG91dDogIAoKPiBVc2luZyB0ZXJtaW5vbG9neSBmcm9tIHRoZSBzaW11bHRhbmVvdXMgZXF1YXRpb25zIGxpdGVyYXR1cmUsIHRoZSBWQVIgbW9kZWwgWzFdIGlzIGluIHJlZHVjZWQKPiBmb3JtIGJlY2F1c2UgYWxsIHJpZ2h0LWhhbmQgc2lkZSB2YXJpYWJsZXMgYXJlIGxhZ2dlZCBvciBwcmVkZXRlcm1pbmVkLiAgCgoqIEJlIGF3YXJlIHRoYXQsIGZvciBhIFZBUiAoaW4gcmVkdWNlZCBmb3JtKTogIAoKPiBUaGUgaW5zdGFudGFuZW91cyByZWxhdGlvbnMgYmV0d2VlbiB0aGUgdmFyaWFibGVzIGFyZSBzdW1tYXJpemVkIGluIHRoZSByZXNpZHVhbCBjb3ZhcmlhbmNlIG1hdHJpeAoKPGJyPgoKIyMjIEEgY29tcGFjdCB3YXkgdG8gd3JpdGUgYSBWQVIocCkgbW9kZWwgIAoKCiogRm9yIHNpbXBsaWNpdHkgaW4gdGhlIG5vdGF0aW9uLCBsZXQncyBzdXBwb3NlIHRoYXQgdGhlIGRldGVybWluaXN0aWMgcGFydCBvZiBvdXIgVkFSKHApIG1vZGVsIGlzIHplcm87ICB0aGVuIG91ciBWQVIocCkgd291bGQgYmUgOiAgCgoKJCR5X3t0fX49QV97MX15X3t0LTF9K0FfezJ9eV97dC0yfStcIFwgLi4uXCBcCitBX3twfXlfe3QtcH0rdl97dH1cIFwgXCBcIFwgXCBcIFwgXCBcIFsyXSQkIAoKCk1vZGVsICRbMl0kIGNhbiBiZSB3cml0dGVuIHVzaW5nIGEgcG9seW5vbWlhbCBpbiB0aGUgbGFnIG9wZXJhdG9yIGFzOiAKCiQkQShMKXlfe3R9PXZfe3R9XCBcIFwgXCBcIFwgXCBcIFwgXCBbM10kJCAgCgp3aXRoICRBKEwpPShJX3tLfS1BX3sxfUxeezF9LUFfezJ9TF57Mn0tLi4uLUFfe3B9TF57cH0pJAoKCjxicj4KCiMjIyBTdGFiaWxpdHkgb2YgdGhlIFZBUihwKQoKCiogQW4gaW1wb3J0YW50IGlzc3VlIGluIFZBUiBtb2RlbGxpbmcgaXMgKipzdGFiaWxpdHkqKiAgCgoKKiBUaGUgVkFSKHApIHByb2Nlc3MgaXMgc3RhYmxlIGlmIGFsbCByb290cyBvZiB0aGUgZGV0ZXJtaW5hbnRhbCBwb2x5bm9taWFsICgkXGRldCBBKHopPVxkZXQgKElfe0t9LUFfezF9el57MX0tQV97Mn16XnsyfS0uLi4tQV97cH16XntwfSk9MCQpIGFyZSBvdXRzaWRlIHRoZSBjb21wbGV4IHVuaXQgY2lyY2xlIChvciBlcXVpdmFsZW50bHkgaWYgdGhlIGVpZ2VudmFsdWVzIG9mIHRoZSBjb21wYW5pb24gbWF0cml4IGhhdmUgbW9kdWx1cyBsZXNzIHRoYW4gb25lKSAgCgoKKiBVbmRlciBoYWJpdHVhbCBhc3N1bXB0aW9ucywgYSBzdGFibGUgcHJvY2VzcyBpcyBjb3ZhcmlhbmNlIHN0YXRpb25hcnkuIFRoZW4sIGlmIHRoZSBWQVIgaXMgc3RhYmxlLCB0aGUgdmFyaWFibGVzIGluICR5X3t0fSQgd291bGQgYmUgJEkoMCkkLCBhbmQgaW4gdGhpcyBjYXNlIHdlIGNvdWxkIGVzdGltYXRlIHRoZSBWQVIgd2l0aCB0aGUgdmFyaWFibGVzIGluIGxldmVscyAoVkFSIGluIGxldmVscykuICAKCgoqIEJ1dCwgaWYgdGhlIHNvbHV0aW9uIG9mIHRoZSBhYm92ZSBlcXVhdGlvbiwgJFxkZXQgQSh6KT0wJCwgaGFzIGEgcm9vdCBmb3IgJHo9MSQsIHRoYXQgaXMsIGlmIHRoZSBwcm9jZXNzIGhhcyBhIHVuaXQgcm9vdCwgdGhlbiBzb21lIChvciBhbGwpIHZhcmlhYmxlcyBpbiB0aGUgVkFSKHApIGFyZSAkSSgxKSQuIFRoZW4gdGhlIHByb2Nlc3MgaXMgbm9uc3RhdGlvbmFyeSBhbmQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBhbmFseXNpcyB3ZSBzaG91bGQgdHJhbnNmb3JtIHRoZSB2YXJpYWJsZXMgdG8gcmVhY2ggc3RhdGlvbmFyaXR5OyB1c3VhbGx5IGJ5IGZpcnN0IGRpZmZlcmVuY2VzIChWQVIgaW4gZmlyc3QgZGlmZmVyZW5jZXMpICAKCgoqIElmIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBhcmUgSSgxKSwgdGhlbiB3ZSBoYXZlIHRvIGNoZWNrIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGNvaW50ZWdyYXRpb24gZXhpdHMuIElmIHRoYXQgd2FzIHRoZSBjYXNlLCBhIFZFQ00gc2hvdWxkIGJlIHVzZWQuICAKCjxicj4KCi0tLS0tLQoKIyMgMi4yIEVzdGltYXRpb24KCgpWQVIgbW9kZWxzIGNhbiBiZSBlc3RpbWF0ZWQgd2l0aCBzdGFuZGFyZCBtZXRob2RzOiBPTFMgb3IgTUwuIFZBUiBtb2RlbHMgY2FuIGFsc28gYmUgZXN0aW1hdGVkIGJ5IEJheWVzaWFuIG1ldGhvZHMgIAoKCiogQXMgYWxsIHRoZSBlcXVhdGlvbnMgaW4gdGhlIFZBUiBzaGFyZSB0aGUgc2FtZSBzZXQgb2YgcmVncmVzc29ycyBhbmQgYWxsIG9mIHRoZW0gYXJlIGxhZ2dlZCB2YXJpYWJsZXMsIHRoZSBWQVIgY291bGQgYmUgZXN0aW1hdGVkIGVmZmljaWVudGx5IGJ5IE9MUyBmb3IgZWFjaCBlcXVhdGlvbiBzZXBhcmF0ZWx5LiAgCgoKCiogSWYgdGhlIHJlc2lkdWFscyBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKEdhdXNzaWFuKSBsaWtlICgkdl97dH1ccmlnaHRhcnJvdyBOKDAsXFNpZ21hIF97dn0pJCkgdGhlICoqT0xTIGVzdGltYXRvciBvZiBvdXIgVkFSIG1vZGVsIHdpbGwgaGF2ZSBkZXNpcmFibGUgYXN5bXB0b3RpYyBwcm9wZXJ0aWVzKio6IGl0IHdpbGwgYmUgYXN5bXB0b3RpY2FsbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYW5kIHdpbGwgaGF2ZSB0aGUgc21hbGxlc3QgYXN5bXB0b3RpYyBjb3ZhcmlhbmNlIG1hdHJpeCAgIAoKCiogVGhlbiwgaWYgdGhlIFZBUiBpcyBzdGFibGUsIHVzdWFsIGluZmVyZW5jZSBwcm9jZWR1cmVzIGFyZSBhc3ltcHRvdGljYWxseSB2YWxpZDogdC1zdGF0aXN0aWNzIGNvdWxkIGJlIHVzZWQgZm9yIGluZmVyZW5jZSBhYm91dCBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgYW5kIHRoZSBGLXRlc3QgY291bGQgYmUgdXNlZCBmb3IgdGVzdGluZyBoeXBvdGhlc2VzIGZvciBzZXRzIG9mIHBhcmFtZXRlcnMuCgoKKiBOb3RlIGFsc28gdGhhdCBpZiAkeV97dH0kIGlzIGEgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKEdhdXNzaWFuKSBwcm9jZXNzLCB0aGVuIHRoZSBPTFMgZXN0aW1hdG9yIGlzIGlkZW50aWNhbCB0byB0aGUgTUwgZXN0aW1hdG9yIChjb25kaXRpb25hbCBvbiB0aGUgaW5pdGlhbCBwcmUtc2FtcGxlIHZhbHVlcykuCgoKKiBJZiByZXN0cmljdGlvbnMgYXJlIGltcG9zZWQgb24gdGhlIHBhcmFtZXRlcnMsIE9MUyBlc3RpbWF0aW9uIG1heSBiZSBpbmVmZmljaWVudC4gSW4gdGhhdCBjYXNlIEdMUyBlc3RpbWF0aW9uIG1heSBiZSBiZW5lZmljaWFsLiBUaGUgR0xTIGVzdGltYXRvciBpcyBjb25zaXN0ZW50IGFuZCBhc3ltcHRvdGljYWxseSBub3JtYWxseSBkaXN0cmlidXRlZCBhbmQgdXN1YWwgbWV0aG9kcyBmb3IgaW5mZXJlbmNlIGFyZQp2YWxpZCBhc3ltcHRvdGljYWxseS4KCgoqIE5vdGUgdGhhdCBpZiB0aGUgZGlzdHVyYmFuY2VzIGluIG9uZSBlcXVhdGlvbiBhcmUgZm9yIGV4YW1wbGUgYXV0b2NvcnJlbGF0ZWQsIHRoZSB0aGVvcnkgZG9lcyBub3QgYXBwbHkuIFRoZW4gSVYgZXN0aW1hdG9ycywgaW5jbHVkaW5nIEdNTSwgd291bGQgYmUgbmVlZGVkLiAKCgoqIFVuZGVyLXNwZWNpZmljYXRpb24gb2YgcCBtaWdodCByZXN1bHQgaW4gYXV0b2NvcnJlbGF0ZWQgcmVzaWR1YWxzCgoKIAojIyMgSG93IHRvIGVzdGltYXRlIGEgVkFSIG1vZGVsIGluIFI/ICAKCgoqIFdlIGFyZSBnb2luZyB0byB1c2UgdGhlIFIgcGFja2FnZSBgdmFyc2Agd3JpdHRlbiBieSBCZXJuaGFyZCBQZmFmZi4gQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBQZmFmZidzIHBhY2thZ2UgY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwOi8vd3d3LmpzdGF0c29mdC5vcmcvdjI3L2kwNC9wYXBlcikuICBGb3IgYSBtb3JlIGRldGFpbGVkIGV4cG9zaXRpb24sIHBsZWFzZSBnbyBbaGVyZV0oaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvdmFycy92YXJzLnBkZikgIAoKCiogVG8gaWxsdXN0cmF0ZSB0aGUgZGlmZmVyZW50IHRvcGljcyBpbiBWQVIgbW9kZWxsaW5nLCB3ZSBhcmUgZ29pbmcgdG8gdXNlIGFzIGFuIGV4YW1wbGUgdGhlIGFuYWx5c2lzIGFuZCBkYXRhIHVzZWQgaW4gW0dhbGkncyAoMTk5OSldKGh0dHA6Ly9jcmVpLmNhdC9wZW9wbGUvZ2FsaS9qZ2Flcjk5LnBkZikgcGFwZXIgOiAiVGVjaG5vbG9neSwgRW1wbG95bWVudCwgYW5kIHRoZSBCdXNpbmVzcyBDeWNsZTogRG8gVGVjaG5vbG9neSBTaG9ja3MgRXhwbGFpbiBBZ2dyZWdhdGUgRmx1Y3R1YXRpb25zPyAgIAoKCiogSW4gaGlzIHBhcGVyLCBHYWxpIGVzdGltYXRlcyBhIGJpdmFyaWF0ZSBWQVIgZm9yIHByb2R1Y3Rpdml0eSBhbmQgaG91cnMgdG8gbG9vayBtYWlubHkgYXQgdGhlIHJlc3BvbnNlIG9mIGhvdXJzIHRvIGEgdGVjaG5vbG9neSBzaG9jayAgCgoKKiBJbiBmYWN0IHdlIGFyZSBnb2luZyB0byAicmVwbGljYXRlIiBHYWxpJ3MgcGFwZXIgYnV0IG9ubHkgZm9yIGhpcyBiZW5jaG1hcmsgbW9kZWw6CgoKICAgIC0gVS5TLiBxdWFydGVybHkgIGRhdGEgZm9yICAqKjE5NDg6MSAtIDE5OTQ6NCoqIGZyb20gQ2l0aWJhc2UgICAgCiAgCiAgICAtIGJpdmFyaWF0ZSBWQVIgbW9kZWw6IHByb2R1Y3Rpdml0eSgkeF97dH0kKSBhbmQgaG91cnMoJG5fe3R9JCkgIAogICAgCiAgICAtICR5X3t0fn09flxsZWZ0WyB4X3t0fn0sbl97dH1ccmlnaHRdIF57XntccHJpbWUgfX0kLCBib3RoIHZhcmlhYmxlcyBpbiAobG9nKSAqKmZpcnN0IGRpZmZlcmVuY2VzKiogICAgCiAgCgoKPGJyPgoKIyMjIyBMZXQncyBvcGVuIHRoZSBMQUIgc2xpZGVzCjxicj4KCgotLS0tLS0KCiMjIyAgTW9kZWwgU3BlY2lmaWNhdGlvbiAKCkltYWdpbmUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgZGVjaWRlZCB3Y2hpY2ggdmFyaWFibGVzIHRvIGluY2x1ZGUgaW4gb3VyIFZBUiBtb2RlbCwgdGhlIHNhbXBsZSwgaWYgdGhlIHZhcmlhYmxlcyBhcmUgSSgxKSB2cy4gSSgwKSAsIGFuZCB0aGUgZGV0ZXJtaW5pc3RpY3MgY29tcG9uZW50cyAuIEluIHRoaXMgY2FzZSB3ZSBoYXZlIGFsbW9zdCBmaW5pc2hlZCB0aGUgbW9kZWwgc3BlY2lmaWNhdGlvbi4gQWxtb3N0LCBiZWNhdXNlIC4uLiB3ZSBuZWVkIHRvIGRlY2lkZSB0aGUgb3JkZXIgb2YgdGhlIFZBUi4gIAoKCiMjIyMgSG93IHRvIHNlbGVjdCAocCkgdGhlIG9yZGVyIG9mIHRoZSBWQVI/CgpGb3IgYSBtb3JlIGRldGFpbGVkIGV4cG9zaXRpb24gZ28gdG8gW0zDvHRrZXBvaGwoMjAxMSldKGh0dHA6Ly9jYWRtdXMuZXVpLmV1L2JpdHN0cmVhbS9oYW5kbGUvMTgxNC8xOTM1NC9FQ09fMjAxMV8zMC5wZGYpLCBwcC4gMTAtMTEKCi0gVGhlIGlkZWEgaXMgdGhhdCB3ZSBoYXZlIHRvIHNlbGVjdCBhbiBvcmRlcihwKSBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gZW5zdXJlIHRoYXQgdGhlIHJlc2lkdWFscyBzaG93biBubyBhdXRvY29ycmVsYXRpb24gYnV0IHdpdGhvdXQgZXhoYXVzdGluZyB0aGUgZGVncmVlcyBvZiBmcmVlZG9tLiAgCgoKCi0gVGhlIG9yZGVyIG9mIHRoZSBWQVIgY291bGQgYmUgc2VsZWN0ZWQgYnk6ICAgCgogICAgIDEpIFNlcXVlbnRpYWwgdGVzdGluZyBwcm9jZWR1cmVzICAKICAgICAKICAgICAyKSBNb2RlbCBzZWxlY3Rpb24gY3JpdGVyaWEKCgogICAgCi0gKipTZXF1ZW50aWFsIHRlc3RpbmcgcHJvY2VkdXJlcyoqIGFwcHJvYWNoOiAgIAoKICAgIC0gQSBtYXhpbXVtICpyZWFzb25hYmxlKiBsYWcgb3JkZXIoJHBfe1xtYXggfSQpIGlzIGNob3NlbiAgCiAgICAKICAgIC0gVGhlbiwgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZiBudWxsIGh5cG90aGVzZXMgaW9zIHRlc3RlZDogJEhfezB9OkFfe3Bfe1xtYXggfX09MCQgLCAKJEhfezB9OkFfe3Bfe1xtYXggLTF9fT0wJCwgLi4uICAgCgogICAgLSBGb3IgYSBzdGF0aW9uYXJ5IFZBUiB0aGUgdXN1YWwgTFIgdGVzdCBjb3VsZCBiZSB1c2VkICAgCgogICAgLSBUaGUgcHJvY2VkdXJlIHN0b3BzIHdoZW4gdGhlIG51bGwgaHlwb3RoZXNpcyBpcyByZWplY3RlZCBmb3IgdGhlIGZpcnN0IHRpbWUgICAKICAgCgoKLSAqKk1vZGVsIHNlbGVjdGlvbiBjcml0ZXJpYSoqIGFwcHJvYWNoOiAKCiAgICAtIEEgbW9kZWwgc2VsZWN0aW9uIGNyaXRlcmlhIGlzIGNob3NlbiAoQUlDLCBIUSwgU0MsIEZQRSkuIEZvciBtdWx0aXZhcmlhdGUgZXhwcmVzc2lvbiBvZiB0aGVzZSBjcml0ZXJpYSBzZWUgW0zDvHRrZXBvaGwoMjAxMSldKGh0dHA6Ly9jYWRtdXMuZXVpLmV1L2JpdHN0cmVhbS9oYW5kbGUvMTgxNC8xOTM1NC9FQ09fMjAxMV8zMC5wZGYpCiAgIAogICAgLSBBZ2FpbiwgYSBtYXhpbXVtICpyZWFzb25hYmxlKiBsYWcgb3JkZXIoJHBfe1xtYXggfSQpIGlzIGNob3NlbgogICAKICAgIC0gQSBzZXQgb2YgVkFSKG0pIGFyZSBlc3RpbWF0ZWQgZm9yICRtPTEsLi4uLH5wX3tcbWF4IH0kCiAgIAogICAgLSBDaG9vc2UgcCBhcyB0aGUgbGFncyBvZiB0aGUgVkFSKG0pIHdoaWNoIG1pbmltaXplIHRoZSBjaG9zZW4gY3JpdGVyaWEKICAgCiAgICAtIEFJQyB1c3VhbGx5IG92ZXJlc3RpbWF0ZXMgcAoKCgotIFRoZSBwYWNrYWdlICJ2YXJzIiBoYXMgdGhlICoqVkFSc2VsZWN0KCkqKiBmdW5jdGlvbiB3aGljaCBhbGxvd3MgdXMgdG8gYXBwbHkgdGhlIDJebmReIGFwcHJvYWNoIHRvIHNlbGVjdCBwLgoKCi0gQXMgd2Ugd2lsbCBzZWUgaW4gdGhlIExBQiBzbGlkZXMsIHRocmVlIGNyaXRlcmlhIChBSUMsSFEgJkZQRSkgY2hvb3NlIHA9MjsgIEJVVCwgYXMgb3VyIGRhdGEgYXJlIHF1YXJ0ZXJseSwgcHJvYmFibHksIGFzIEdhbGkgZG9lcywgYSBtb3JlIHNlbnNpYmxlIGNob2ljZSB3b3VsZCBiZSBwPTQgICAKCgoKCiMjIyMgRmluYWxseSwgd2UgYXJlIG5vdyByZWFkeSB0byBlc3RpbWF0ZSBvdXIgVkFSIHdpdGggcD00LiBMZXQncyBnbyB0aGUgTEFCIHNsaWRlcyEhISAgICAKCgo8YnI+PGJyPgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIAoKIyMgMi4zIFZhbGlkYXRpb24gb2YgdGhlIFZBUgoKCgotIEFmdGVyIGVzdGltYXRpb24sIGFuZCBiZWZvcmUgdXNpbmcgb3IgdHJhbnNmb3JtaW5nIG91ciBWQVIgdG8gYSBTVkFSLCB3ZSBoYXZlIHRvIGNoZWNrIHRoZWlyIHZhbGlkaXR5IG1haW5seSBsb29raW5nIGF0IHRoZSByZXNpZHVhbHMKCi0gQWdhaW4sIGxldCdzIGdvIHRvIHRoZSBMQUIhISEgIAoKCiA8YnI+IAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKCjxicj4KCiMgMy4gVkFSIG1vZGVscyBpbiByZWR1Y2VkIGZvcm0gKFVzZXMpICAgCgpUaGUgdHdvIHByaW5jaXBhbCB1c2VzIG9mIFZBUiBtb2RlbHMgaW4gcmVkdWNlZCBmb3JtIGFyZSB0ZXN0aW5nIChjYXVzYWxpdHkgdGVzdGluZykgYW5kIGZvcmVjYXN0aW5nLCBCVVQgdGhlIG1vc3QgdXNlZCBpbnN0cnVtZW50cyBpbiB0aGUgVkFSIG1ldGhvbG9kb2d5IGFyZSBJUkYgJiBGRVZELiAgCgpJUkYgJiBGRVZEIG9ubHkgaGF2ZSBhIGNsZWFyIG1lbmluZyBpZiB3ZSB0cmFuc2Zvcm0gb3VyIHJlZHVjZWQgZm9ybSBWQVIgbW9kZWwgdG8gYW4gc3RydWN0dXJhbCBWQVIuIFdlIHdpbGwgZGV2ZWxvcCB0aGlzIGlkZWEgaW4gYSB3aGlsZSAgCgoKIyMgMy4xIFVzZXMgb2YgVkFSOiBDYXVzYWxpdHkgdGVzdGluZyAKCgotIEFmdGVyIHZhbGlkYXRpb24sIHRoZSBWQVIgY291bGQgYmUgdXNlZCBmb3IgdGVzdGluZywgZm9yIGV4YW1wbGUsIGZvciB0ZXN0aW5nIEdyYW5nZXIgY2F1c2FsaXR5LiAgCgoKLSBBcyB3ZSBzYWlkLCBpZiB0aGUgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCAoR2F1c3NpYW4pIGxpa2UgKCR2X3t0fVxyaWdodGFycm93IE4oMCxcU2lnbWEgX3t2fSkkKSB0aGUgKipPTFMgZXN0aW1hdG9yIGhhcyBkZXNpcmFibGUgYXN5bXB0b3RpYyBwcm9wZXJ0aWVzKiouIEluIHBhcnRpY3VsYXIsIGl0IHdpbGwgYmUgYXN5bXB0b3RpY2FsbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIGFuZCB0aGVuLCBpZiB0aGUgVkFSIGlzIHN0YWJsZSwgdXN1YWwgaW5mZXJlbmNlIHByb2NlZHVyZXMgYXJlIGFzeW1wdG90aWNhbGx5IHZhbGlkOiB0LXN0YXRpc3RpY3MgY291bGQgYmUgdXNlZCBmb3IgaW5mZXJlbmNlIGFib3V0IGluZGl2aWR1YWwgcGFyYW1ldGVycyBhbmQgRi10ZXN0IGZvciB0ZXN0aW5nIGh5cG90aGVzZXMgZm9yIHNldHMgb2YgcGFyYW1ldGVycy4gIAoKCi0gRXZlbiBpZiB0LXRlc3RzIGFyZSBhc3ltcHRvdGljYWxseSB2YWxpZCwgZHVlIHRvIGNvbGxpbmVhcml0eSBwcm9ibGVtcywgaXQgd291bGQgbm90IGJlIHNlbnNpYmxlIHRvIGludGVycHJldCBvciB0byB0ZXN0IG9ubHkgb25lIHBhcmFtZXRlciBpbiBpc29sYXRpb24uICAKCgotIEluIHJlZ3Jlc3Npb24gYW5hbHlzaXMsIHdlIGxhYmVsIG9uZSB2YXJpYWJsZSBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCB0aGUgb3RoZXJzIGFzIGV4cGxhbmF0b3J5LiBCdXQgbW9zdCBvZiB0aGUgdGltZSwgaXQgaXMgbm90IG9idmlvdXMgd2hpY2ggdmFyaWFibGUgY2F1c2VzIHdoaWNoLiBBcyB5b3Uga25vdywgd2Ugc2hvdWxkIGFsd2F5cyBiZSBjYXV0aW91cyBhYm91dCBpbnRlcnByZXRpbmcgY29ycmVsYXRpb24gYW5kIHJlZ3Jlc3Npb24gcmVzdWx0cyBhcyByZWZsZWN0aW5nIGNhdXNhbGl0eS4gIAoKCi0gV2l0aCB0aW1lIHNlcmllcyBkYXRhIHdlIGNhbiBtYWtlIHNsaWdodGx5IHN0cm9uZ2VyIHN0YXRlbWVudHMgYWJvdXQgY2F1c2FsaXR5IHNpbXBseSBieSBleHBsb2l0aW5nIHRoZSBmYWN0IHRoYXQgdGltZSBkb2VzIG5vdCBydW4gYmFja3dhcmQuIElmIGV2ZW50IEEgaGFwcGVucyBiZWZvcmUgQiwgdGhlbiBpdCdzIHBvc3NpYmxlIHRoYXQgQSBjYXVzZXMgQiwgYnV0IG5vdCB0aGF0IEIgY2F1c2VzIEEuIFRoZXNlIGlkZWFzIGNhbiBiZSBpbnZlc3RpZ2F0ZWQgdGhyb3VnaCByZWdyZXNzaW9uIG1vZGVscyB1c2luZyB0aGUgbm90aW9uIG9mIEdyYW5nZXIgY2F1c2FsaXR5LiAgCgogIAotICoqR3JhbmdlciBjYXVzYWxpdHkqKjogR3JhbmdlciBjYWxsZWQgYSB2YXJpYWJsZSBYIGNhdXNhbCBmb3IgWSBpZiB0aGUgaW5mb3JtYXRpb24gaW4gcGFzdCBhbmQgcHJlc2VudCB2YWx1ZXMgb2YgWCBpcyBoZWxwZnVsIGZvciBpbXByb3ZpbmcgdGhlIGZvcmVjYXN0IG9mIFkuIElmIEdyYW5nZXIgY2F1c2FsaXR5IGhvbGRzLCB0aGlzIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IFggY2F1c2VzIFkuIEJ1dCwgaXQgc3VnZ2VzdHMgdGhhdCBYIG1pZ2h0IGJlIGNhdXNpbmcgWS4KCi0gU29tZXRpbWVzIGVjb25vbWV0cmljaWFucyB1c2UgdGhlIHNob3J0ZXIgdGVybSAqY2F1c2VzKiBhcyBzaG9ydGhhbmQgZm9yICpHcmFuZ2VyIGNhdXNlcyouIFlvdSBzaG91bGQgbm90aWNlLCBob3dldmVyLCB0aGF0IEdyYW5nZXIgY2F1c2FsaXR5IGlzIG5vdCBjYXVzYWxpdHkgaW4gYSBkZWVwIHNlbnNlIG9mIHRoZSB3b3JkLiBJdCBqdXN0IHRhbGtzIGFib3V0IGxpbmVhciBwcmVkaWN0aW9uLCBhbmQgaXQgb25seSBoYXMgInRlZXRoIiBpZiB3ZSBvbmx5IGZpbmQgR3JhbmdlciBjYXVzYWxpdHkgaW4gb25lIGRpcmVjdGlvbi4gIAoKLSBUaGUgZGVmaW5pdGlvbiBvZiBHcmFuZ2VyIGNhdXNhbGl0eSBkaWQgbm90IG1lbnRpb24gYW55dGhpbmcgYWJvdXQgcG9zc2libGUgaW5zdGFudGFuZW91cyBjb3JyZWxhdGlvbiBiZXR3ZWVuIHZhcmlhYmxlcy4gSWYgdGhlIGlubm92YXRpb25zIGFyZSBjb3JyZWxhdGVkIHdlIHdpbGwgc2F5IHRoYXQgdGhlcmUgZXhpc3RzIGluc3RhbnRhbmVvdXMgY2F1c2FsaXR5ICAKCgotIEluIHRoZSBjb250ZXh0IG9mIFZBUiBtb2RlbHMsIGlmIHdlIHdhbnQgdG8gdGVzdCBmb3IgR3JhbmdlciBjYXVzYWxpdHksIHdlIG5lZWQgdG8gdGVzdCB6ZXJvIGNvbnN0cmFpbnRzIGluIHNvbWUgb2YgdGhlIGNvZWZmaWNpZW50cy4gIAoKIAoqIFN1cHBvc2UgdGhhdCAyIHZhcmlhYmxlcyAoICR5X3sxdH0kIGFuZCAkeV97MnR9JCApIGFyZSBnZW5lcmF0ZWQgYnkgYSBiaXZhcmlhdGUgVkFSKHApIHByb2Nlc3MgbGlrZToKCgoKCiQkXGxlZnRbIApcYmVnaW57YXJyYXl9e2N9CnlfezF0fSBcXCAKeV97MnR9JQpcZW5ke2FycmF5fSUKXHJpZ2h0XSA9XG92ZXJzZXR7cH17XHVuZGVyc2V0e2k9MX17XHN1bSB9fVxsZWZ0WyAKXGJlZ2lue2FycmF5fXtjY30KXGFscGhhIF97MTEsaX0gJiBcYWxwaGEgX3sxMixpfSBcXCAKXGFscGhhIF97MjEsaX0gJiBcYWxwaGEgX3syMixpfSUKXGVuZHthcnJheX0lClxyaWdodF0gXGxlZnRbIApcYmVnaW57YXJyYXl9e2N9CnlfezF0LWl9IFxcIAp5X3sydC1pfSUKXGVuZHthcnJheX0lClxyaWdodF0gK3Vfe3R9JCQgIAoKCgogIC0gVGhlbiwgJHlfezJ0fSQgaXMgbm90IEdyYW5nZXItY2F1c2FsIGZvciAkeV97MXR9JCBpZiBhbmQgb25seSBpZiA6ICAgIAogIAokJFxhbHBoYSBfezEyLGl9PTBcIFwgLFwgXCBpPTEsMixcY2RvdHMgLHAkJCAgCgogCiAgCiAgLSBUaGF0IGlzLCAkeV97MnR9JCBkb2VzIG5vdCBHcmFuZ2VyIGNhdXNlICR5X3sxdH0kIGlmICR5X3sydH0kIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgZXF1YXRpb24gZm9yICR5X3sxdH0kCiAKCiAKIAoqIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMiB2YXJpYWJsZXMgaW4gdGhlIFZBUiwgdGVzdGluZyBHcmFuZ2VyIGNhdXNhbGl0eSBiZWNvbWVzIG1vcmUgY29tcGxpY2F0ZWQsIGJlY2F1c2UgR3Jhbmdlci1jYXVzYWxpdHkgZGVwZW5kcyBvbiB0aGUgaW5mb3JtYXRpb24gc2V0IGNvbnNpZGVyZWQsIGJ1dCB0aGlzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBjb3Vyc2UuIEZvciBhIGNvbXBsZXRlIHRyZWF0bWVudCBvZiB0aGUgdG9waWMgc2VlLCBhcyB1c3VhbCwgW0zDvHRrZXBvaGwoMjAwNSldKGh0dHA6Ly93d3cuc3ByaW5nZXIuY29tL2Vjb25vbWljcy9lY29ub21ldHJpY3MvYm9vay85NzgtMy01NDAtNDAxNzItOCkgIAoKCiogSXQncyBwb3NzaWJsZSB0byB0ZXN0IEdyYW5nZXIgY2F1c2FsaXR5IHRocm91Z2ggdGhlIFdhbGQgb3IgRi10ZXN0LiBJbiB0aGUgKnZhcnMqIHBhY2thZ2UsIHdlIGNhbiB1c2U6CgogICAgLSBGLXRlc3QgdG8gdGVzdCBHcmFuZ2VyIGNhdXNhbGl0eQogICAKICAgIC0gV2FsZCB0ZXN0IGZvciBpbnN0YW50YW5lb3VzIEdyYW5nZXIgY2F1c2FsaXR5IChub24gemVybyBjb3JyZWxhdGlvbiBhbW9uZyB0aGUgJHZfe2l0fSQpCgoKYGBge3IsIGV2YWwgPSBGfQojLS0gV2UgY2FuIHRlc3QgR3JhbmdlciBjYXVzYWxpdHkKY2F1c2FsaXR5KG91cl92YXIsIGNhdXNlID0gYygiZHgiKSkgICAgIy0tIGR4IEdyYW5nZXItY2F1c2UgdGhlIG90aGVyKHMpIHZhcmlhYmxlcz8KY2F1c2FsaXR5KG91cl92YXIsIGNhdXNlID0gYygiZG4iKSkgICAgIy0tIGRuIEdyYW5nZXItY2F1c2UgdGhlIG90aGVyKHMpIHZhcmlhYmxlcz8KYGBgYAoKPGJyPgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCgoKCiMjIDMuMiBVc2VzIG9mIFZBUjogRm9yZWNhc3RpbmcKCgotIFdlIGFyZSBub3QgZ29pbmcgdG8gZGV2ZWxvcCB0aGlzIHRvcGljLCBidXQgLi4uIGZvciBpbnN0YW5jZTogW1JlYWwgdGltZSBmb3JlY2FzdGluZyB3aXRoIGEgTUlEQVMgVkFSXShodHRwczovL2hlbGRhLmhlbHNpbmtpLmZpL2JvZi9iaXRzdHJlYW0vaGFuZGxlLzEyMzQ1Njc4OS8xMzY2MC9kcDEzMTVbMV0ucGRmP3NlcXVlbmNlPTEpCgoKCi0gQWZ0ZXIgdmFsaWRhdGlvbiwgYSBWQVIgY291bGQgYWxzbyBiZSB1c2VkICBmb3IgZm9yZWNhc3RpbmcKICAKYGBge3IsIGV2YWwgPSBGfQojLS0gV2UgY2FuIHVzZSB0aGUgVkFSIGZvciBmb3JlY2FzdGluZwpwcmVkaWN0KG91cl92YXIsIG4uYWhlYWQgPSAzKSAgCmZhbmNoYXJ0KHByZWRpY3Qob3VyX3ZhcikpCmBgYGAKCjxicj4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAoKCgojIyAzLjMgTW92aW5nIGF2ZXJhZ2UgcmVwcmVzZW50YXRpb24gKE1WQSkgb2YgYSBWQVIocCkKIAoKIAoqIFlvdSBhbGwga25vdyB0aGF0IHN0YXRpb25hcnkgQVIgcHJvY2VzcyBjb3VsZCBiZSB0cmFuc2Zvcm1lZCAoaW52ZXJ0ZWQpIGludG8gYW4gaW5maW5pdGUgTUEoJFxpbmZ0eSQpIHByb2Nlc3MuIFRoaXMgcmVzdWx0IGFwcGxpZXMgYWxzbyB0byBhIHN0YXRpb25hcnkgKHN0YWJsZSkgVkFSCgogCgoqIEJ5IGludmVydGluZyB0aGUgYXV0b3JlZ3Jlc3NpdmUgcG9seW5vbWlhbCBBKEwpIHdlIGNhbiBvYnRhaW4gdGhlIFZNQSBmb3JtIG9mIGEgVkFSIGxpa2U6CgogCgoKJCR5X3t0fX49Q197MH12X3t0fStDX3sxfXZfe3QtMX0rQ197Mn12X3t0LTJ9K1wgLi4uXCAgWzNdJCQKCmJlaW5nICRDX3swfT1JX3tLfSQsIHRoZSByZXN0IG9mIHRoZSAkQ197c30kIG1hdHJpY2VzIGNvdWxkIGJlIGNvbXB1dGVkIHJlY3Vyc2l2ZWx5IGFzIAoKICQkQ197c309XHVuZGVyc2V0e2o9MX17XG92ZXJzZXR7c317XHN1bSB9fUNfe3Mtan1BX3tqfVwgXCBcClwgXCBcIFwgXCBcIGZvclwgaj0xLFwKMixcY2RvdHMgJCQKCiAKIDxicj4KCiogQXMgd2l0aCB0aGUgVkFSLCBtb2RlbCAkWzNdJCBjYW4gYmUgd3JpdHRlbiB1c2luZyBhIHBvbHlub21pYWwgaW4gdGhlIGxhZyBvcGVyYXRvciBhczoKIAoKJCR5X3t0fT1DKEwpdl97dH1cIFwgXCBcIFwgXCBcIFwgXCBcIFwgXCBbNF0kJAoKYmVpbmcgJEMoTCk9KElfe0t9K0NfezF9TF57MX0rQ197Mn1MXnsyfStcIFwgLi4uKSQuCgoKCiogTW9kZWwgJFszXSQgKG9yICRbNF0kKSBhcmUgYWxzbyBjYWxsZWQgdGhlIFdvbGQgVk1BIHJlcHJlc2VudGF0aW9uICAKCgoKKiBUaGUgdHdvIHByaW5jaXBhbCBpbnN0cnVtZW50cyBvZiBWQVIncywgSVJGICYgRkVWRCwgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgdGhlaXIgVk1BIHJlcHJlc2VudGF0aW9uIFszXSAgIAoKCiogSVJGICYgRkVWRCB3aWxsIHNob3cgdGhlIGVmZmVjdHMgb2YgYSBzaG9jaywgKipCVVQqKiBpbiBvcmRlciB0byBoYXZlIGEgY2xlYXIgbWVhbmluZywgdGhleSBtdXN0IGJlIGludGVycHJldGVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIHRoZSBvdGhlciBzaG9ja3MgYXJlIGhlbGQgY29uc3RhbnQ7ICBob3dldmVyLCBpbiB0aGUgV29sZCByZXByZXNlbnRhdGlvbiB0aGUgc2hvY2tzIGFyZSBub3Qgb3J0aG9nb25hbDsgdGhhdCdzIHdoeSB3ZSB3aWxsIHR1cm4sICBpbiB0aGUgbmV4dCBzZWN0aW9uLCB0byAqKnN0cnVjdHVyYWwgVkFSIG1vZGVscyoqICAgCgo8YnI+CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKCgoKIyMgMy40IFVzZXMgb2YgVkFSOiAiU3RydWN0dXJhbCIgYW5hbHlzaXMKCgoKCiogVXN1YWxseSB0aGUgbWFpbiBpbnRlcmVzdCBpbiBWQVIgbW9kZWxsaW5nIGlzIHRvIGxvb2sgYXQgdGhlIGR5bmFtaWMgZWZmZWN0IG9mIGEgc2hvY2sgb24gdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdAoKCgoKKiBUaGlzIGR5bmFtaWMgZWZmZWN0IGNvdWxkIGJlIGVhc2lseSBvYnRhaW5lZCB0aHJvdWdoIHRoZSBWTUEgcmVwcmVzZW50YXRpb24gWzNdIG9mIHRoZSBWQVIsIGFsc28gY2FsbGVkIFdvbGQgVk1BIHJlcHJlc2VudGF0aW9uICAgCgoKCiogSW4gcGFydGljdWxhciB0aGUgcmVzcG9uc2Ugb2YgdGhlIHZhcmlhYmxlICR5X3tufSQgdG8gYW4gaW1wdWxzZSBvZiBzaXplIG9uZSBpbiAkdl97bX0kICRqJC1wZXJpb2RzIGFoZWFkIGlzIGdpdmVuIGJ5IHRoZSAkKG4sbSkkKi10aCogZWxlbWVudCBvZiAkQ197an0kLiBUaGF0IGlzLCB0aGUgJENfe2l9JCBtYXRyaWNlcyBjb250YWluIHRoZSByZXNwb25zZXMgb2YgdGhlIHZhcmlhYmxlcyB0byB0aGUgaW5ub3ZhdGlvbnMgZm9yIGRpZmZlcmVudCBwZXJpb2RzIChvciBzdGVwcykgYWhlYWQgICAKCgoKKiBBcyB0aGUgJHVfe2l9JCBhcmUgZm9yZWNhc3QgZXJyb3IncywgdGhvc2UgZWZmZWN0cyBhcmUgY2FsbGVkIGZvcmVjYXN0IGVycm9yIGltcHVsc2UgcmVzcG9uc2VzIG9yIGluIHNob3J0IGltcHVsc2UgcmVzcG9uc2UgZnVuY3Rpb25zIChJUkYncykgICAKCgojIyMjIEJVVC4uLgoKCgoqIEJVVCwgdXN1YWxseSB0aGUgVkFSIGRpc3R1cmJhbmNlcyBhcmUgY29ycmVsYXRlZCwgc28gdGhlIGludGVycHJldGFiaWxpdHkgb2YgdGhlIGltcHVsc2UgcmVzcG9uc2VzIHRvIGlubm92YXRpb24gYmVjb21lcyBwcm9ibGVtYXRpYzogaWYgdGhlIGlubm92YXRpb25zIGFyZSBjb3JyZWxhdGVkIChvZmYgZGlhZ29uYWwgZWxlbWVudHMgb2YgJFxTaWdtYSBfe3Z9JCBkaWZmZXJlbnQgZnJvbSB6ZXJvKSB0aGVuLCBhbiBpbXB1bHNlIGluICR2X3ttfSQgd291bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGltcHVsc2VzIGluIGlubm92YXRpb25zIGluIHRoZSBvdGhlciBlcXVhdGlvbnMgb2YgdGhlIFZBUiBtb2RlbC4gIAoKCiAgICAtIEluIG90aGVyIHdvcmRzLCBhcyB0aGUgaW5ub3ZhdGlvbnMgYXJlIG5vdCBsaWtlbHkgdG8gb2NjdXIgaW4gaXNvbGF0aW9uLCB0aGVuIHRyYWNraW5nIHRoZSBlZmZlY3Qgb2YgYW4gaW5ub3ZhdGlvbiBpbiBpc29sYXRpb24gZG9lcyBub3QgcmVmbGVjdCB3aGF0IGFjdHVhbGx5IGhhcHBlbnMgaW4gdGhlIHN5c3RlbSBhZnRlciBhbiBpbm5vdmF0aW9uIGhpdHMgdGhlIHN5c3RlbS4gIAogCiAgIAoKKiBUaGVyZWZvcmUsIFNpbXMgcHJvcG9zZWQgYXNzdW1pbmcgcmVjdXJzaXZlIGNvbnRlbXBvcmFuZW91cyBpbnRlcmFjdGlvbnMgYW1vbmcgdmFyaWFibGVzLCBpLmUuIGltcG9zaW5nIGEgY2VydGFpbiBzdHJ1Y3R1cmFsIG9yZGVyaW5nIGluIHRoZSB2YXJpYWJsZXMuIEluIHRlcm1zIG9mIHRoZSBNVkEgcmVwcmVzZW50YXRpb24gdGhpcyBtZWFucyB0aGF0IHRoZSB0cmFuc2Zvcm1lZCBvciAic3RydWN0dXJhbCIgc2hvY2tzIHdpbGwgbm90IGFmZmVjdCB0aGUgcHJlY2VkaW5nIHZhcmlhYmxlcyBpbnN0YW50YW5lb3VzbHkuICAgIAoKCiAgICAtIFRoYXQgbWVhbnMgdGhhdCBhbiBpbm5vdmF0aW9uIGluIHRoZSBmaXJzdCBlcXVhdGlvbiBjb3VsZCBjb250ZW1wb3JhbmVvdXNseSBhZmZlY3RzICBhbGwgdGhlIHZhcmlhYmxlcyBpbiB0aGUgVkFSLCB3aGlsZSB0aGUgaW5ub3ZhdGlvbiBpbiB0aGUgc2Vjb25kIGVxdWF0aW9uIGNvdWxkIGNvbnRlbXBvcmFuZW91c2x5IGFmZmVjdCAgYWxsIHRoZSB2YXJpYWJsZXMgaW4gdGhlIFZBUiBleGNlcHQgdGhlIGZpcnN0IG9uZSwgLi4uIGFuZCBmaW5hbGx5LCBhbiBpbm5vdmF0aW9uIGluIHRoZSBsYXN0IGVxdWF0aW9uIGNvdWxkIGNvbnRlbXBvcmFuZW91c2x5IGFmZmVjdHMgIG9ubHkgdGhlIGxhc3QgdmFyaWFibGUgaW4gdGhlIFZBUiAgCiAKICAgCgoqIEluIHByYWN0aWNlLCBpbXBvc2luZyBhIHJlY3Vyc2l2ZSBjb250ZW1wb3JhbmVvdXMgb3JkZXIgYW1vbmcgdGhlIHZhcmlhYmxlcyBvZiB0aGUgVkFSIG1vZGVsLCBpcyBvcGVyYXRpb25hbGlzZWQgcGVyZm9ybWluZyBhIENob2xlc2t5IGRlY29tcG9zaXRpb24gaW4gJFxTaWdtYSBfe3Z9JC4gTGV0J3Mgc2hvdyB0aGF0OiAgCiAKCiAgICAtIFRoZSBDaG9sZXNreSBmYWN0b3IsICRQJCwgb2YgJFxTaWdtYSBfe3Z9JCBpcyBkZWZpbmVkIGFzIHRoZSB1bmlxdWUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXggc3VjaCB0aGF0ICRQUF57XntccHJpbWUgfX09XFNpZ21hIF97dn0kCiAgICAKCgoqIFdpdGggdGhlIENob2xlc2t5IGZhY3RvcigkUCQpIHdlIGNvdWxkIHRyYW5zZm9ybSB0aGUgVkFSIGluIFszXSBhczoKCgokJEEoTCl5X3t0fT1QUF57LTF9dl97dH0kJAoKd2l0aCAkXHZhcmVwc2lsb24gX3t0fT1QXnstMX12X3t0fSQsIHRoZW4gb3VyIHRyYW5zZm9ybWVkICBWQVIgYmVjb21lcyAKCiQkQShMKXlfe3R9PVBcdmFyZXBzaWxvbiBfe3R9XCBcIFwgXCBcIFwgXCBcIFwgXCBcIFwgWzIqXSQkICAgCgoKCgoKLSBUaGF0IGlzLCB3ZSBoYXZlIHdyaXR0ZW4gb3VyIFZBUiBpbiB0ZXJtcyBvZiBhIG5ldyB2ZWN0b3Igb2Ygc2hvY2tzICRcdmFyZXBzaWxvbiBfe3R9JCwgd2l0aCBpZGVudGl0eSBjb3ZhcmlhbmNlIG1hdHJpeCAoJFxTaWdtYSBfe1x2YXJlcHNpbG9uIH09SSQpICAgCgoKCiogTm93LCBhcyB0aGUgJFx2YXJlcHNpbG9uIF97dH0kIHNob2NrcyBhcmUgdW5jb3JyZWxhdGVkIHRoZWlyIElSRiB3b3VsZCBoYXZlIGEgY2xlYXIgaW50ZXJwcmV0YXRpb24gICAKCjxicj4KLS0tLS0tLS0tLS0tLS0gIAoKCiMjIyAzLjQuMSBJUkYgKEltcHVsc2UtIHJlc3BvbnNlIGZ1bmN0aW9ucykgICAKCgoKKiBGcm9tIFsyKl0gd2UgY2FuIG9idGFpbiB0aGUgVk1BIHJlcHJlc2VudGF0aW9uIGluIHRlcm1zIG9mIHRoZSAkXHZhcmVwc2lsb24gX3t0fSQgc2hvY2tzOgoKJCR5X3t0fT1DKEwpUFx2YXJlcHNpbG9uIF97dH1cIFwgXCBcIFwgXCBcIFwgXCBcIFwgXCBbNVxhc3QgXSQkCgoKJCR5X3t0fT1EKEwpXHZhcmVwc2lsb24gX3t0fVwgXCBcIFwgXCBcIFwgXCBcIFwgXCBcIFs1XSQkCgpiZWluZyAkRChMKT1DKEwpUCQgLCAKCgoKJEQoTCk9KERfezB9K0RfezF9TF57MX0rRF97Mn1MXnsyfStEX3szfUxeezN9LVwgXCAuLi4pJCwgICAgICAgICAgd2l0aCAgICAkRF97aX09Q197aX1QJCAsIAoKCgp0aGVuICREX3swfT1DX3swfVA9SV97Tn1QPVAkCgoKCiogQXMgJERfezB9PVAkLCBhbmQgUCBpcyBsb3dlciB0cmlhbmd1bGFyLCB0aGUgc3lzdGVtIGlzIHJlY3Vyc2l2ZTogdGhlIGZpcnN0IHNob2NrICgkXHZhcmVwc2lsb24gX3t0fV57MX0kKSBjb3VsZCBoYXZlIGFuIGluc3RhbnRhbmVvdXMgZWZmZWN0IG9uIGFsbCB0aGUgdmFyaWFibGVzIG9mIHRoZSBWQVIsIHdoaWxlIHRoZSBmaXJzdCB2YXJpYWJsZSBpbiB0aGUgVkFSIGNvdWxkIG9ubHkgYmUgY29udGVtcG9yYW5lb3VzbHkgYWZmZWN0ZWQgYnkgJFx2YXJlcHNpbG9uIF97dH1eezF9JAoKKiBUaGUgJERfe2l9JCBtYXRyaWNlcyBjb250YWluIHRoZSByZXNwb25zZSBvZiB0aGUgdmFyaWFibGVzIHRvIHRoZSAkXHZhcmVwc2lsb24gX3t0fSQKCiogSW4gcGFydGljdWxhciB0aGUgcmVzcG9uc2Ugb2YgdGhlIHZhcmlhYmxlICR5X3tufSQgdG8gYW4gaW1wdWxzZSBvZiBzaXplIG9uZSBpbiAkXHZhcmVwc2lsb25fe219JCAkaiQtcGVyaW9kcyBhaGVhZCBpcyBnaXZlbiBieSB0aGUgJChuLG0pJCotdGgqIGVsZW1lbnQgb2YgJERfe2p9JC4gCgogCgoKKiBEb24ndCB3b3JyeSB0b28gbXVjaCBub3cgZmlyc3RseSBiZWNhdXNlIHdlIHdpbGwgdXN1YWxseSBkbyB0aGlzIHdpdGggUiBhbmQgc2Vjb25kbHkgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcHJhY3Rpc2UgdGhlIGNhbGN1bGF0aW9ucyBieSBoYW5kIGF0IHRoZSBMYWIsIGJ1dCAuLi4uCgoKCiogQXMgYW4gZXhhbXBsZSB0byBpbGx1c3RyYXRlOgoKJCR5X3t0fT1cbGVmdFsgClxiZWdpbnthcnJheX17Y30KWV97dH0gXFwgClBfe3R9JQpcZW5ke2FycmF5fSUKXHJpZ2h0XSBcIFwgXCBcdmFyZXBzaWxvbiBfe3R9PVxsZWZ0WyAKXGJlZ2lue2FycmF5fXtjfQpcdmFyZXBzaWxvbiBfe3R9XnsxfSBcXCAKXHZhcmVwc2lsb24gX3t0fV57Mn0lClxlbmR7YXJyYXl9JQpccmlnaHRdICQkCgoKCiQkeV97dH1+PURfezB9XHZhcmVwc2lsb24gX3t0fStEX3sxfVx2YXJlcHNpbG9uCl97dC0xfStEX3syfVx2YXJlcHNpbG9uIF97dC0yfStEX3szfVx2YXJlcHNpbG9uIF97dC0zfStEX3s0fVx2YXJlcHNpbG9uCl97dC00fSsuLi4kJAoKCgokJHlfe3R9fj1cbGVmdFsgClxiZWdpbnthcnJheX17Y2N9CjAuOSAmIDAuOCBcXCAKMC43ICYgMC42JQpcZW5ke2FycmF5fSUKXHJpZ2h0XSBcdmFyZXBzaWxvbiBfe3R9K1xsZWZ0WyAKXGJlZ2lue2FycmF5fXtjY30KMC41ICYgMC40IFxcIAowLjMgJiAwLjIlClxlbmR7YXJyYXl9JQpccmlnaHRdIFx2YXJlcHNpbG9uIF97dC0xfStcbGVmdFsgClxiZWdpbnthcnJheX17Y2N9CjAuMSAmIC0wLjEgXFwgCi0wLjIgJiAtMC4zJQpcZW5ke2FycmF5fSUKXHJpZ2h0XSBcdmFyZXBzaWxvbiBfe3QtMn0rLi4uJCQKCgoKJCQuLi4rXGxlZnRbIApcYmVnaW57YXJyYXl9e2NjfQotMC40ICYgLTAuNSBcXCAKLTAuNiAmIC0wLjclClxlbmR7YXJyYXl9JQpccmlnaHRdIFx2YXJlcHNpbG9uIF97dC0zfStEX3s0fVx2YXJlcHNpbG9uIF97dC00fSsuLi4kJAoKLSBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0aGF0IHRoZSBlbGVtZW50ICgxLDIpIG9mICREX3swfSQgd2VyZSAwLjg/ICAgCgo8YnI+CgotLS0tLS0tLS0tLS0tLSAgCgoKIyMjIDMuNC4yIEZFVkQgKEZvcmVjYXN0IGVycm9yIHZhcmlhbmNlIGRlY29tcG9zaXRpb24pCgoKKiBPbmNlIHdlIGhhdmUgb3J0aG9nb25hbGlzZWQgSVJGJ3MgKHRoZSAkRF97aX0kICBtYXRyaWNlcyApLCB0aGUgRkVWRCBjYW4gYmUgZWFzaWx5IGNvbXB1dGVkLiBMZXQncyBzZWUgaG93OiAgCgoKKiBUaGUgaC1zdGVwIGFoZWFkIGZvcmVjYXN0IGVycm9yIGNhbiBiZSByZXByZXNlbnRlZCBhczogICAgIAoKCiQkeV97VCtofS15X3tUK2hcbWlkIFR9PURfezB9XHZhcmVwc2lsb24gX3tUK2h9K0RfezF9XHZhcmVwc2lsb25fe1QraC0xfStcY2RvdHMgK0Rfe2gtMX1cdmFyZXBzaWxvbiBfe1QrMX0kJAoKQXMgJFxTaWdtYSBfe1x2YXJlcHNpbG9uIH09SSQsIHRoZSBmb3JlY2FzdCBlcnJvciB2YXJpYW5jZSBvZiB0aGUgay10aCBjb21wb25lbnQgb2YgJHlfe1QraH0kIGlzOgoKCiQkXHNpZ21hIF97a31eezJ9KGgpPVxvdmVyc2V0e0t9e1x1bmRlcnNldHtqPTF9e1xzdW0gfX0oZF97a2osMH1eezJ9K1xjZG90cworZF97a2osaC0xfV57Mn0pJCQKCgp3aGVyZSAkZF97bm0san0kIGRlbm90ZXMgdGhlICQobixtKS10aCQgZWxlbWVudCBvZiAkRF97an0kLgoKCgoqIFRoZSBxdWFudGl0eSAkKGRfe2tqLDB9XnsyfStcY2RvdHMgK2Rfe2tqLGgtMX1eezJ9KS9cc2lnbWEgX3trfV57Mn0oaCkkIHJlcHJlc2VudHMgdGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgJGokLXRoIHNob2NrIHRvIHRoZSBoLXN0ZXAgYWhlYWQgZm9yZWNhc3QgZXJyb3IgdmFyaWFuY2UgIG9mIHZhcmlhYmxlICRrJC4gIAoKCiogRG9uJ3Qgd29ycnkgdG9vIG11Y2ggbm93IGZpcnN0bHkgYmVjYXVzZSB3ZSB3aWxsIHVzdWFsbHkgZG8gdGhpcyB3aXRoIFIgYW5kIHNlY29uZGx5IGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIHByYWN0aXNlIHRoZSBjYWxjdWxhdGlvbnMgYnkgaGFuZCBhdCB0aGUgTGFiLCBidXQgLi4uLgoKCgoqIEFzIGFuIGV4YW1wbGUgdG8gaWxsdXN0cmF0ZToKCgokJHlfe3R9PVxsZWZ0WyAKXGJlZ2lue2FycmF5fXtjfQpZX3t0fSBcXCAKUF97dH0lClxlbmR7YXJyYXl9JQpccmlnaHRdIFwgXCBcIFx2YXJlcHNpbG9uIF97dH09XGxlZnRbIApcYmVnaW57YXJyYXl9e2N9Clx2YXJlcHNpbG9uIF97dH1eezF9IFxcIApcdmFyZXBzaWxvbiBfe3R9XnsyfSUKXGVuZHthcnJheX0lClxyaWdodF0gJCQKCgoKJCR5X3t0fX49RF97MH1cdmFyZXBzaWxvbiBfe3R9K0RfezF9XHZhcmVwc2lsb24KX3t0LTF9K0RfezJ9XHZhcmVwc2lsb24gX3t0LTJ9K0RfezN9XHZhcmVwc2lsb24gX3t0LTN9K0RfezR9XHZhcmVwc2lsb24KX3t0LTR9Ky4uLiQkCgoKCiQkeV97dH1+PVxsZWZ0WyAKXGJlZ2lue2FycmF5fXtjY30KMC45ICYgMC4wIFxcIAowLjcgJiAwLjYlClxlbmR7YXJyYXl9JQpccmlnaHRdIFx2YXJlcHNpbG9uIF97dH0rXGxlZnRbIApcYmVnaW57YXJyYXl9e2NjfQowLjUgJiAwLjQgXFwgCjAuMyAmIDAuMiUKXGVuZHthcnJheX0lClxyaWdodF0gXHZhcmVwc2lsb24gX3t0LTF9K1xsZWZ0WyAKXGJlZ2lue2FycmF5fXtjY30KMC4xICYgLTAuMSBcXCAKLTAuMiAmIC0wLjMlClxlbmR7YXJyYXl9JQpccmlnaHRdIFx2YXJlcHNpbG9uIF97dC0yfSsuLi4kJAoKCgokJC4uLitcbGVmdFsgClxiZWdpbnthcnJheX17Y2N9Ci0wLjQgJiAtMC41IFxcIAotMC42ICYgLTAuNyUKXGVuZHthcnJheX0lClxyaWdodF0gXHZhcmVwc2lsb24gX3t0LTN9K0RfezR9XHZhcmVwc2lsb24gX3t0LTR9Ky4uLiQkCgoKCgo8YnI+Cjxicj4KCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKCgojIyMgMy40LjMgIE9idGFpbmluZyB0aGUgSVJGICYgRkVWRCAod2l0aCBSKSAKCgpHb2luZyB0byB0aGUgTEFCISEKCjxicj4KPGJyPgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoKCgojIyMgMy40LjQgSGlzdG9yaWNhbCBEZWNvbXBvc2l0aW9uCgoqIEl0J3MgYW5vdGhlciBpbnN0cnVtZW50IG9mIHRoZSBWQVIgbWV0aG9kb2xvZ3ksIHRoZSB0aGlyZC4KCgoKKiBJdCdzIGxlc3MgY29tbW9ubHkgdXNlZCB0aGFuIElSRiAmIEZFVkQKCgoKKiBJUkZzIHNob3cgdGhlIGF2ZXJhZ2UgcmVzcG9uc2Ugb2YgdGhlIG1vZGVsIHZhcmlhYmxlcyB0byBhIHN0cnVjdHVyYWwgc2hvY2sgKG9mIHNpemUgMSBzdGFuZGFyZCBkZXZpYXRpb24pCgoKCiogRkVWRCBxdWFudGlmaWVzIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBkaWZmZXJlbnQgc3RydWN0dXJhbCBzaG9ja3MgaW4gdGhlIHZhcmlhYmlsaXR5IG9mIHRoZSBkYXRhOiBGRVZEIGdpdmVzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB2YXJpYW5jZSBvZiB0aGUgZXJyb3IgbWFkZSBpbiBmb3JlY2FzdGluZyBhIHZhcmlhYmxlIGR1ZSB0byBhIHNwZWNpZmljIHNob2NrIGF0IGEgZ2l2ZW4gaG9yaXpvbiAgIAoKCgoqIEhpc3RvcmljYWwgZGVjb21wb3NpdGlvbiBxdWFudGlmaWVzIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBkaWZmZXJlbnQgc2hvY2tzIHRvIHRoZSBldm9sdXRpb24gb2YgdGhlIHZhcmlhYmxlcyBpbiBzcGVjaWZpYyBwZXJpb2RzIG9mIHRpbWUKCgoKKiBTVkFScyBhbHNvIGFsbG93IHRoZSBjb25zdHJ1Y3Rpb24gb2YgZm9yZWNhc3Qgc2NlbmFyaW9zIGNvbmRpdGlvbmFsIG9uIGh5cG90aGV0aWNhbCAgc2VxdWVuY2VzIG9mIGZ1dHVyZSBzdHJ1Y3R1cmFsIHNob2NrcwoKPGJyPgo8YnI+CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIAoKCgoKCgojIDQuIFN0cnVjdHVyYWwgVkFSJ3MKCgogCj4gVGhlIHN1Y2Nlc3Mgb2YgVkFSIG1vZGVscyBhcyBkZXNjcmlwdGl2ZSB0b29scyBhbmQgdG8gc29tZSBleHRlbnQgYXMgZm9yZWNhc3RpbmcgCj4gdG9vbHMgaXMgd2VsbCBlc3RhYmxpc2hlZC4gVGhlIGFiaWxpdHkgb2Ygc3RydWN0dXJhbCByZXByZXNlbnRhdGlvbnMgb2YgVkFSIAo+IG1vZGVscyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gY29ycmVsYXRpb24gYW5kIGNhdXNhdGlvbiwgaW4gY29udHJhc3QsIGhhcyAKPiByZW1haW5lZCBjb250ZW50aW91cyBbS2lsaWFuKDIwMTEpLCBwLjFdKGh0dHBzOi8vaWRlYXMucmVwZWMub3JnL3AvY3ByL2NlcHJkcC84NTE1Lmh0bWwpCgoKIyMgNC4xLiBJbnRyb2R1Y3Rpb24KCiogQSBWQVIgbW9kZWwgY2FuIGJlIGEgZ29vZCBmb3JlY2FzdGluZyBtb2RlbCBidXQsIGluIHRoZSBlbmQsIGl0IGlzIGFuIGF0aGVvcmV0aWNhbCBtb2RlbCAoYXMgYWxsIHRoZSByZWR1Y2VkIGZvcm0gbW9kZWxzIGFyZSkuIFRoZSByYXcgZXN0aW1hdGlvbiByZXN1bHRzIGZvciBhIFZBUiBhcmUgcmFyZWx5IGludGVyZXN0aW5nLiBBbHRlcm5hdGl2ZWx5LCBvbmUgY2FuIHJlcHJlc2VudCBhIFZBUiBhcyByZXNwb25zZXMgdG8gaW1wdWxzZXM7IGhvd2V2ZXIsIHRoZSByZXNwb25zZXMgdG8gc29tZSBzdGVwcyBhaGVhZCBvZiBpbm5vdmF0aW9uKCR2X3t0fSQpIG9yIHByZWRpY3Rpb24gZXJyb3JzIGFyZSByYXJlbHkgZWNvbm9taWNhbGx5IGludGVyZXN0aW5nLgoKCgoqIFRvIGludGVycHJldCB0aGUgVkFSIGluIGFuIGVjb25vbWljYWxseSBtZWFuaW5nZnVsIHdheSwgb25lIG5lZWRzIHRvIGRpc2VudGFuZ2xlIHRoZSB2ZWN0b3Igb2YgaW5ub3ZhdGlvbnMoJHZfe3R9JCkgaW50byAic3RydWN0dXJhbCIgc2hvY2tzICgkXHZhcmVwc2lsb24gX3t0fSQpLCBsaWtlIG1vbmV0YXJ5IHBvbGljeSBzaG9ja3MsIHByb2R1Y3Rpdml0eSBzaG9ja3MsIGV0Yy4sCgoKKiBJZGVhbGx5IHdlIHdvdWxkIGxpa2UgdG8gaGF2ZTogIDEpIG9ydGhvZ29uYWwgc2hvY2tzICAyKSBzaG9ja3Mgd2l0aCBlY29ub21pYyBtZWFuaW5nLiAKCgoKKiBUaGF0IGlzLCB3ZSB3b3VsZCBsaWtlIHRvIGhhdmUgKGlkZW50aWZ5KSBhIHN0cnVjdHVyYWwgVkFSIChTVkFSKSBsaWtlOgoKCgoKCiQkQihMKXlfe3R9PVx2YXJlcHNpbG9uIF97dH1cIFwgXCBcIFwgXCBcIFwgXCBcIFs2XSQkICAKCndoZXJlICRCKEwpPShCX3swfS1CX3sxfUxeezF9LUJfezJ9TF57Mn0tLi4uLUJfe3B9TF57cH0pJCwgJEJfezB9JCBpcyBhIG1hdHJpeCByZXByZXNlbnRpbmcgdGhlIGNvbnRlbXBvcmFuZW91cyBpbnRlcmFjdGlvbnMgYW1vbmcgdGhlIGVuZG9nZW5vdXMgdmFyaWFibGVzIGFuZCB0aGUgc3RydWN0dXJhbCBzaG9ja3MgYXJlIG9ydGhvZ29uYWwgKCRcU2lnbWEgX3tcdmFyZXBzaWxvbiB9PUkkKS4gCgoKCiogQXMgYW55IHN0YWJsZSBWQVIsIHdlIGNvdWxkIGludmVydCBbNl0gdG8gb2J0YWluIHRoZSBzdHJ1Y3R1cmFsIFZNQSByZXByZXNlbnRhdGlvbiBvZiBvdXIgU1ZBUgoKJCR5X3t0fT1EKEwpXHZhcmVwc2lsb24gX3t0fVwgXCBcIFwgXCBcIFwgXCBcIFwgXCBcIFs1XSQkCgp3aGVyZSAgJEQoTCk9KERfezB9LURfezF9TF57MX0tRF97Mn1MXnsyfS1EX3szfUxeezN9LVwgXCAuLi4pJCwgJERfezB9JCBpcyB0aGUgbWF0cml4IHJlcHJlc2VudGluZyB0aGUgY29udGVtcG9yYW5lb3VzIGVmZmVjdHMgb2YgdGhlIHNob2NrcywgYW5kIHJlbWVtYmVyIHRoYXQgJFxTaWdtYSBfe1x2YXJlcHNpbG9uIH09SSQKCgoKKiBCVVQsIGhvdyB0byBvYnRhaW4gZXN0aW1hdGVzIG9mIHRoZSBTVkFSPyBXZSB3aWxsIHVzZSBvdXIgZXN0aW1hdGlvbiBvZiB0aGUgVkFSIG1vZGVsIGFuZCB0aGUgcmVsYXRpb25zIGJldHdlZW4gdGhlIFZBUiBhbmQgdGhlIFNWQVIKCgo8YnI+CgojIyMjIEZvdXIgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBzYW1lIERHUAoKCiogUmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHR3byBtb2RlbHMgKHRoZSBWQVIgJiB0aGUgU1ZBUiksIGJ1dCBmb3VyIHJlcHJlc2VudGF0aW9uczogICAKIAokJFxiZWdpbnthcnJheX17Y2NjY2N9CkEoTCl5X3t0fSAmID0gJiB2X3t0fSAmIFw7XDtcO1w7XDtbM10gJiBWQVJcXAp5X3t0fSAmID0gJiBDKEwpdl97dH0gJiBcO1w7XDtcO1w7WzRdICYgVk1BXFwKQihMKXlfe3R9ICYgPSAmIFx2YXJlcHNpbG9uX3t0fSAmIFw7XDtcO1w7XDtbNl0gJiBTVkFSXFwKeV97dH0gJiA9ICYgRChMKVx2YXJlcHNpbG9uX3t0fSAmIFw7XDtcO1w7XDtbNV0gJiBTVk1BClxlbmR7YXJyYXl9JCQKCiogSG93IHRvIGVzdGltYXRlIHRoZSBTVkFSPyBJbiBmYWN0IHdlIGhhdmUgYWxyZWFkeSBzZWVuIHRoZSBmaXJzdCBwcm9wb3NhbCAoU2ltcykgdG8gaWRlbnRpZnkgdGhlIHN0cnVjdHVyYWwgZm9ybSBieSBtZWFucyBvZiB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBidXQgLi4uCgogICAgIAoqIEluIHRoZSBwcmV2aW91cyBzZWN0aW9uIHdlIGxlYXJuZWQgdGhhdCB0aGUgQ2hvbGVza3kgZmFjdG9yaXphdGlvbiBpcyBlcXVpdmFsZW50IHRvIGNob29zaW5nIGEgcmVjdXJzaXZlIHN5c3RlbSBvZiBlcXVhdGlvbnMuICoqQlVUKiosIGFzIHlvdSBjYW4gaW1hZ2luZSwgdGhlIG9yZGVyIG1hdHRlcnM6IGlkZW50aWZpY2F0aW9uIGlzIG5vdCB1bmlxdWUuCgoqIEl0IGlzIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgdGhhdCB0aGUgIm9ydGhvZ29uYWxpemF0aW9uIiBvZiB0aGUgcmVkdWNlZC1mb3JtIHJlc2lkdWFscyBieSBhcHBseWluZyBhIENob2xlc2t5IGRlY29tcG9zaXRpb24gaXMgYXBwcm9wcmlhdGUgb25seSBpZiB0aGUgcmVjdXJzaXZlIHN0cnVjdHVyZSBlbWJvZGllZCBpbiBQIGNhbiBiZSBqdXN0aWZpZWQgb24gZWNvbm9taWMgZ3JvdW5kcy4KCiogVGhlIGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmUgb2YgIm9ydGhvZ29uYWxpemF0aW9uIiBieSBDaG9sZXNreSBkZWNvbXBvc2l0aW9uIGlzIHRoYXQgdGhlIHJlc3VsdGluZyBzdHJ1Y3R1cmFsIG1vZGVsIGlzIHJlY3Vyc2l2ZSAoY29uZGl0aW9uYWwgb24gbGFnZ2VkIHZhcmlhYmxlcykuIFRoaXMgbWVhbnMgdGhhdCB3ZSBpbXBvc2UgYSBwYXJ0aWN1bGFyIGNhdXNhbCBjaGFpbiByYXRoZXIgdGhhbiBsZWFybmluZyBhYm91dCBjYXVzYWwgcmVsYXRpb25zaGlwcyBmcm9tIHRoZSBkYXRhCgoKKiBDb29sZXkgYW5kIExlUm95ICgxOTg1KSBjcml0aWNpemVkIHRoZSBWQVIgbWV0aG9kb2xvZ3kgYmVjYXVzZSBvZiBpdHMgImF0aGVvcmV0aWNhbCIgaWRlbnRpZmljYXRpb24gc2NoZW1lLiBUaGV5IGFyZ3VlZCB0aGF0IFNpbXMgZGlkIG5vdCBleHBsaWNpdGx5IGp1c3RpZnkgdGhlIGlkZW50aWZpY2F0aW9uIHJlc3RyaWN0aW9ucyBhbmQgY2xhaW1lZCB0aGF0IGEgbW9kZWwgaWRlbnRpZmllZCBieSB0aGlzIGFyYml0cmFyeSBwcm9jZWR1cmUgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGEgc3RydWN0dXJhbCBtb2RlbCwgYmVjYXVzZSBhIGRpZmZlcmVudCB2YXJpYWJsZSBvcmRlcmluZyB5aWVsZHMgZGlmZmVyZW50IHN0cnVjdHVyYWwgcGFyYW1ldGVycy4gCgoqIFNpbXMgKDE5ODYpIHByb3Bvc2UgdHJ5aW5nIGRpZmZlcmVudCBvcmRlcmluZ3MgKHRoZXJlIGFyZSBuISkgYW5kIGNoZWNraW5nIGlmIHRoZSByZXN1bHRzIGFyZSByb2J1c3QuIEluIGdlbmVyYWwsIHRoZSBoaWdoZXIgdGhlIGVsZW1lbnRzIG9mZi1kaWFnb25hbCBlbGVtZW50cyBvZiAkXFNpZ21hIF97dn0kIGFyZSwgdGhlIGhpZ2hyZXIgdGhlIGNqaGFuZ2VzIGluIHRoZSByZXN1bHRzLgoKKiBCdXQsIGV2ZW4gaWYgdGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlcyBhY3Jvc3MgdGhlc2UgbiEgc3BlY2lmaWNhdGlvbnMsIHRoaXMgd291bGQgb25seSBwcm92ZSB0aGF0IHRoZSByZXN1bHRzIGFyZSByb2J1c3QgYW1vbmcgYWxsIHJlY3Vyc2l2ZSBvcmRlcmluZ3MsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gZm9yIHRoZSBtb2RlbCB0byBiZSByZWN1cnNpdmUgaW4gdGhlIGZpcnN0IHBsYWNlLgoKKiBTaW5jZSB0aGVuLCBzZXZlcmFsIHdheXMgdG8gaWRlbnRpZnkgVkFSIG1vZGVscyBoYXZlIGJlZW4gcHJvcG9zZWQgKHNob3J0LXJ1biByZXN0cmljdGlvbnMsIGxvbmctcnVuIHJlc3RyaWN0aW9ucywgY29pbnRlZ3JhdGlvbiByZXN0cmljdGlvbnMsIHNpZ24gcmVzdHJpY3Rpb24sIG5hcnJhdGl2ZSBhcHByb2FjaGVzIGV0Yy4gKS4KCiogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHJlY3Vyc2l2ZSBpZGVudGlmaWNhdGlvbiBzY2hlbWUsIEJlcm5hbmtlICgxOTg2KSBhbmQgQmxhbmNoYXJkIGFuZCBXYXRzb24gKDE5ODYpIGFtb25nIG90aGVycyBpbnRyb2R1Y2VkIG5vbi1yZWN1cnNpdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBjb250ZW1wb3JhbmVvdXMgaW50ZXJhY3Rpb25zIGFtb25nIHZhcmlhYmxlcyBmb3IgaWRlbnRpZmljYXRpb24KCiogQXMgZWNvbm9taWMgdGhlb3J5IG9mdGVuIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIG1lYW5pbmdmdWwgY29udGVtcG9yYW5lb3VzIHJlc3RyaWN0aW9ucyAoYW5kIHRoZSBtb3JlIHZhcmlhYmxlcyB5b3UgcHV0IGludG8geW91ciBzeXN0ZW0sIHRoZSBtb3JlIHJlc3RyaWN0aW9ucyB5b3UgbmVlZCksIHRoZSBzZWFyY2ggZm9yIGFkZGl0aW9uYWwgaWRlbnRpZnlpbmcgcmVzdHJpY3Rpb25zIGxlZCBCbGFuY2hhcmQgYW5kIFF1YWggKDE5ODkpIGFuZCBzdWJzZXF1ZW50bHkgU2hhcGlybyBhbmQgV2F0c29uICgxOTg4KSBhbmQgR2FsaSAoMTk5MikgdG8gaW50cm9kdWNlIHJlc3RyaWN0aW9ucyBvbiB0aGUgc3lzdGVtJ3MgbG9uZy1ydW4gcHJvcGVydGllcy4gVGhlc2UgbG9uZyBydW4gcmVzdHJpY3Rpb25zIGFyZSB1c3VhbGx5IGJhc2VkIG9uIG5ldXRyYWxpdHkgcG9zdHVsYXRlcwoKKiBGYXVzdCBhbmQgTGVlcGVyICgxOTk3KSBoYXZlIGNyaXRpY2l6ZWQgdGhlIHVzZSBvZiBsb25nIHJ1biByZXN0cmljdGlvbnMgdG8gaWRlbnRpZnkgc3RydWN0dXJhbCBzaG9ja3MsIGFuZCBzaG93IHRoYXQgdW5sZXNzIHRoZSBlY29ub215IHNhdGlzZmllcyBzb21lIHR5cGVzIG9mIHN0cm9uZyByZXN0cmljdGlvbnMsIHRoZSBsb25nIHJ1biByZXN0cmljdGlvbnMgd2lsbCBiZSB1bnJlbGlhYmxlCgoqIE1vcmUgcmVjZW50bHksIGltcG9zaW5nIHNpZ24gcmVzdHJpY3Rpb25zLCBhbGxvd3MgeW91IHRvIHRlc3QgdGhlIGltcGxpY2F0aW9ucyBvZiBhbGwgdHlwZXMgb2YgcmVzdHJpY3Rpb25zLiBCeSBkcm9wcGluZyBvbmUgYWZ0ZXIgb25lIG9mIHRoZSAiZHViaW91cyByZXN0cmljdGlvbnMiLCBvbmUgY2FuIHRlc3Qgd2hldGhlciB0aGUgcmVzcG9uc2VzIHRvIHNob2NrcyBhcmUgc2Vuc2l0aXZlIHRvIHRoZSByZXN0cmljdGlvbnMgb2Z0ZW4gaW1wb3NlZAoKKiBGb3IgYSBkZXRhaWxlZCBleHBvc2l0aW9uIGFuZCBleGFtcGxlcyBvZiBkaWZmZXJlbnQgc291cmNlcyBvZiBpZGVudGlmeWluZyByZXN0cmljdGlvbnMgc2VlIFtLaWxpYW4oMjAxMSldKGh0dHBzOi8vaWRlYXMucmVwZWMub3JnL3AvY3ByL2NlcHJkcC84NTE1Lmh0bWwpCgo8YnI+CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKIyMgIDQuMi4gSWRlbnRpZnlpbmcgdGhlIFNWQVIgYnkgc2hvcnQtcnVuIHJlc3RyaWN0aW9ucyBvbiB0aGUgZWZmZWN0cyBvZiBzaG9ja3MKCiogSWYgd2UgY29tcGFyZSBlcXVhdGlvbnMgWzRdIGFuZCBbNV0sIHdlIGhhdmUgdGhhdCAkdl97dH09RF97MH1cdmFyZXBzaWxvbiBfe3R9JCAKCiogV2Ugb2J0YWluIGEgY29uc2lzdGVudCBlc3RpbWF0aW9uIG9mICR2X3t0fSQgZnJvbSB0aGUgZXN0aW1hdGlvbiBvZiB0aGUgVkFSIG1vZGVsIFszXS4gSWYgd2UgY291bGQgaGF2ZSAkRF97MH0kIHdlIHdvdWxkIGJlIGFibGUgdG8gcmVjb3ZlciB0aGUgc3RydWN0dXJhbCBzaG9ja3MgKCRcdmFyZXBzaWxvbiBfe3R9JCkgCgoqIEJ5IG5vdywgd2Ugd2lsbCByZWNvdmVyIHRoZSBzdHJ1Y3R1cmFsIHBhcmFtZXRlcnMgZnJvbSB0aGUgVkFSIGVzdGltYXRlcyBmb2N1c2luZyBvbiB0aGUgaW1wYWN0IG1hdHJpeCAgJERfezB9JCBhbmQgdXNpbmcgdGhlIGZhY3QgdGhhdCAkdl97dH09RF97MH1cdmFyZXBzaWxvbiBfe3R9JC4KCiQkRSh2X3t0fXZfe3R9Xntee1xwcmltZSB9fSk9RShEX3swfVx2YXJlcHNpbG9uIF97dH1cdmFyZXBzaWxvbgpfe3R9Xntee1xwcmltZSB9fURfezB9Xntee1xwcmltZSB9fSkkJAoKJCRcU2lnbWEgX3t2fT1EX3swfVxTaWdtYSBfe1x2YXJlcHNpbG9uIH1EX3swfV57XntccHJpbWUgfX0kJAoKJCRcU2lnbWEgX3t2fT1EX3swfURfezB9Xntee1xwcmltZSB9fSQkCgoKKiBUaGUgbGFzdCBleHByZXNzaW9uIGltcG9zZXMgKG4qKG4rMSkpLzIgcmVzdHJpY3Rpb25zIG9uIHRoZSBlbGVtZW50cyBvZiAkRF97MH0kOyB0aGF0IGlzLCB3ZSB3aWxsIG5lZWQgbihuLTEpLzIgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgdG8gIHJlY292ZXIgZXN0aW1hdGVzIG9mIGFsbCB0aGUgZWxlbWVudHMgb2YgJERfezB9JAoKKiBPbmNlIHdlIGhhdmUgcmVjb3ZlcmVkICREX3swfSQgYW5kIHVzaW5nIHRoZSBmYWN0IHRoYXQgJHZfe3R9PURfezB9XHZhcmVwc2lsb24gX3t0fSQsIHdlIGNhbiB3cml0ZSB0aGUgVkFSIGFzICAkQShMKXlfe3R9PURfezB9XHZhcmVwc2lsb24gX3t0fSQgYW5kIGlmIHdlIGludmVydCB0aGUgVkFSIHdlIHdpbGwgcmVjb3ZlciB0aGUgU1ZBUiBWTUEgZm9ybSBhcyAkeV97dH09QyhMKURfezB9XHZhcmVwc2lsb24gX3t0fSQgOyB0aGF0IGlzLCB3ZSBjYW4gb2J0YWluIHRoZSBzdHJ1Y3R1cmFsIG1hdHJpY2VzICREX3tpfT1DX3tpfURfezB9JCAgCgoqIEluIHRoZSB0ZXJtaW5vbG9neSBvZiBBbWlzYW5vICYgR2lhbm5pbmksIHRoaXMgd2F5IG9mIGlkZW50aWZpY2F0aW9uIGlzIGNhbGxlZCBhIEMtbW9kZWwoJHZfe3R9PUNcdmFyZXBzaWxvbiBfe3R9JCkuIFRoZSAkQyQgbWF0cml4IGlzIGluIGZhY3Qgb3VyICREX3swfSQgbWF0cml4LgoKKiBBIHBhcnRpY3VsYXIgY2FzZSBvZiBhIEMtbW9kZWwgaXMgdGhlIENob2xlc2t5IGFwcHJvYWNoLiBSZW1lbWJlciB0aGF0IHdlIG9idGFpbmVkIHRoZSBDaG9sZXNreSBmYWN0b3IgJFAkIGZyb20gJFBQXntee1xwcmltZSB9fT1cU2lnbWEgX3t2fSQgYW5kIHdlIG9idGFpbmVkIHRoZSAkRF97aX09Q197aX1QJCA7IHRoYXQgaXMsICAkUCQgaXMgZXF1aXZhbGVudCB0byBvdXIgJERfezB9JAoKCiogTW9zdCBzaG9ydC1ydW4gcmVzdHJpY3Rpb25zIGFyZSB6ZXJvIHJlc3RyaWN0aW9ucyAoZS5nLiwgdGhhdCBvdXRwdXQgcmVhY3RzIG9ubHkgd2l0aCBhIGxhZyB0byBtb25ldGFyeSBzaG9ja3MpLiAKCiogVGhlIGxhc3QgYXNzdW1wdGlvbiBzZWVtcyByZWFzb25hYmxlLCBidXQgY2xlYXJseSB0aGUgZnJlcXVlbmN5IG9mIHRoZSBkYXRhIGlzIG9mIGNydWNpYWwgaW1wb3J0YW5jZTogd2l0aCBhbm51YWwgZGF0YSwgYSBjb250ZW1wb3JhbmVvdXMgemVybyByZXN0cmljdGlvbiBpcyBsaWtlbHkgdG8gYmUgbW9yZSBkZWJhdGFibGUgdGhhbiB3aXRoIHF1YXJ0ZXJseSBvciBtb250aGx5IGRhdGEKCgoKIyMjIyBFeGFtcGxlOiBLaWxpYW4sIEwuICgyMDA5KSwgIk5vdCBBbGwgT2lsIFByaWNlIFNob2NrcyBBcmUgQWxpa2U6IERpc2VudGFuZ2xpbmcgRGVtYW5kIGFuZCBTdXBwbHkgU2hvY2tzIGluIHRoZSBDcnVkZSBPaWwgTWFya2V0IiwgQW1lcmljYW4gRWNvbm9taWMgUmV2aWV3LCB2b2wuIDk5CgoqIEtpbGlhbiBhbmFseXNlcyB0aGUgZ2xvYmFsIG1hcmtldCBmb3IgY3J1ZGUgb2lsIHdpdGggYSB0cml2YXJpYXRlIFNWQVI6CiR5X3t0fT1cbGVmdFsgXERlbHRhIFlwZXRyb2xfe3R9LFdCQ197dH0sUHBldHJvbF97dH0sXHJpZ2h0XSBee157XHByaW1lIH19XApcIFwgXCBcIFwgXCBcIFwgXCBcIFwgXHZhcmVwc2lsb24gX3t0fT1cbGVmdFsgXHZhcmVwc2lsb24gX3t0fV57c3VwcGx5fSxcdmFyZXBzaWxvbiBfe3R9XntkZW1hbmR9LFx2YXJlcHNpbG9uIF97dH1ee29cX2RlbWFuZH1ccmlnaHRdJAoKICAgIC0gJFlwZXRyb2xfe3R9JCwgaXMgd29ybGQgY3J1ZGUgb2lsIHByb2R1Y3Rpb24gaW4gbG9ncwogICAgLSAkV0JDX3t0fSQgaXMgYSBtZWFzdXJlIG9mIHdvcmxkIGJ1c2luZXNzIGN5Y2xlIChkZXRyZW5kZWQgR0RQKSAgCiAgICAtICRQcGV0cm9sX3t0fSQgaXMgdGhlIGxvZyBvZiB0aGUgcmVhbCBwcmljZSBvZiBvaWwgIAogICAgLSAkXHZhcmVwc2lsb24gX3t0fV57c3VwcGx5fSQgaXMgYSBmbG93IG9pbCBzdXBwbHkgc2hvY2sKICAgIC0gJFx2YXJlcHNpbG9uIF97dH1ee2RlbWFuZH0kIGlzIGEgZmxvdyBvaWwgZGVtYW5kIHNob2NrCiAgICAtICRcdmFyZXBzaWxvbiBfe3R9XntvXF9kZW1hbmR9JCBhcmUgb3RoZXIgb2lsIGRlbWFuZCBzaG9ja3MKICAgIC0gRGF0YSBhcmUgbW9udGhseQoKKiBUaGUgaWRlbnRpZmljYXRpb24gcmVzdHJpY3Rpb25zIGFyZSBtb2RlbGxlZCBpbiB0aGUgZm9sbG93aW5nIG1hdHJpeAoKJCREX3swfT0lClxiZWdpbntibWF0cml4fQphICYgMCAmIDAgXFwgCmIgJiBjICYgMCBcXCAKZCAmIGUgJiBmJQpcZW5ke2JtYXRyaXh9JQokJAoKCiogVGhlIHR3byBkZW1hbmQgc2hvY2tzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBkZWxheSByZXN0cmljdGlvbiB0aGF0IG90aGVyIG9pbC1kZW1hbmQgc2hvY2tzIG1heSByYWlzZSB0aGUgcHJpY2Ugb2Ygb2lsLCBidXQgd2l0aG91dCBzbG93aW5nIGRvd24gZ2xvYmFsIHJlYWwgZWNvbm9taWMgYWN0aXZpdHkgd2l0aGluIHRoZSBzYW1lIG1vbnRoIAoKKiBLaWxpYW4gcmFpc2VzIHRoZSBxdWVzdGlvbiB3aGV0aGVyIGl0IHdvdWxkIGJlIHJlYXNvbmFibGUgdG8gaW1wb3NlIGFuIG92ZXItaWRlbnRpZnlpbmcgcmVzdHJpY3Rpb24gb2YgdGhlIGZvcm0gJGI9MCQKICAgIAogICAgCiogIExldCdzIGxvb2sgYXQgdGhlIHN1bW1hcnkgb2YgS2lsaWFuJ3MgcGFwZXI6IAoKPiBTaG9ja3MgdG8gdGhlIHJlYWwgcHJpY2Ugb2Ygb2lsIG1heSByZWZsZWN0IG9pbCBzdXBwbHkgc2hvY2tzLCBzaG9ja3MgdG8gdGhlIGdsb2JhbAo+IGRlbWFuZCBmb3IgYWxsIGluZHVzdHJpYWwgY29tbW9kaXRpZXMsIG9yIGRlbWFuZCBzaG9ja3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlCj4gY3J1ZGUgb2lsIG1hcmtldC4gRWFjaCBzaG9jayBoYXMgZGlmZmVyZW50IGVmZmVjdHMgb24gdGhlIHJlYWwgcHJpY2Ugb2Ygb2lsIGFuZCBvbiBVUyAKPiBtYWNyb2Vjb25vbWljIGFnZ3JlZ2F0ZXMuICAgCj4gQ2hhbmdlcyBpbiB0aGUgY29tcG9zaXRpb24gb2Ygc2hvY2tzIGhlbHAgZXhwbGFpbiB3aHkgCj4gcmVncmVzc2lvbnMgb2YgbWFjcm9lY29ub21pYyBhZ2dyZWdhdGVzIG9uIG9pbCBwcmljZXMgdGVuZCB0byBiZSB1bnN0YWJsZS4gRXZpZGVuY2UgCj4gdGhhdCB0aGUgcmVjZW50IHN1cmdlIGluIG9pbCBwcmljZXMgd2FzIGRyaXZlbiBwcmltYXJpbHkgYnkgZ2xvYmFsIGRlbWFuZCBzaG9ja3MgCj4gaGVscHMgZXhwbGFpbiB3aHkgdGhpcyBzaG9jayBzbyBmYXIgaGFzIGZhaWxlZCB0byBjYXVzZSBhIG1ham9yIHJlY2Vzc2lvbiBpbiB0aGUgCj4gVW5pdGVkIFN0YXRlcy4gICAKCgoKIyMjIyBFeGFtcGxlOiBLaWxpYW4gKDIwMTEsIHBwIDExKSwgU2VtaS1zdHJ1Y3R1cmFsIE1vZGVscyBvZiBNb25ldGFyeSBQb2xpY3kgCgoqIE9mdGVuIHdlIGRvIG5vdCBoYXZlIGVub3VnaCByZXN0cmljdGlvbnMgdG8gZnVsbHkgaWRlbnRpZnkgYSBWQVIgbW9kZWwuCgoqIElmIHNvbWUgY2FzZXMgcmVzZWFyY2hlcnMgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBpZGVudGlmeWluZyBhIHNpbmdsZSAob3IgYSBncm91cCkgb2Ygc2hvY2tzOyBhcyB0aGUgc2hvY2tzIGFyZSBvcnRob2dvbmFsLCB0aGUgbW9kZWwgY291bGQgYmUgcGFydGlhbGx5IGlkZW50aWZpZWQuIAoKCiogVGhlbiB3ZSBhcmUgdXNpbmcgYSBzZW1pLXN0cnVjdHVyYWwgVkFSLiBUaGUgbW9zdCBjb21tb24gYXBwbGljYXRpb24gaXMgdG8gaWRlbnRpZnkgdGhlIGVmZmVjdHMgb2YgbW9uZXRhcnkgcG9saWN5IHNob2NrcwoKKiBGb3IgaW5zdGFuY2Ugd2Ugd291bGQgbGlrZSB0byByZWNvdmVyIHRoZSBtb25ldGFyeSBwb2xpY3kgc2hvY2tzIGZyb20gYSB0cml2YXJpYXRlIFZBUjogJHlfe3R9PVxsZWZ0WyBcRGVsdGEgR0RQX3t0fSxccGkgX3t0fSxpX3t0fSxccmlnaHRdIF57XntccHJpbWUgfX1cIFwgXCBcIFwgXFwgXCBcIFwgXCBcIFwgXCBcIFwgXHZhcmVwc2lsb24gX3t0fT1cbGVmdFsgXHZhcmVwc2lsb24gX3t0fV57MX0sXHZhcmVwc2lsb25fe3R9XnsyfSxcdmFyZXBzaWxvbiBfe3R9XntNfVxyaWdodF0kICAKCgogICAgLSAkR0RQX3t0fSQsIGlzIHJlYWwgR0RQIGluIGxvZ3MgIAogICAgLSAkXHBpIF97dH0kIGlzIHRoZSBpbmZsYXRpb24gcmF0ZSAgICAKICAgIC0gJGlfe3R9JCBpcyB0aGUgImZlZGVyYWwiIGZ1bmRzIHJhdGUgKGEgcG9saWN5IGludGVydmVudGlvbiByYXRlKSAgCiAgICAtICRcdmFyZXBzaWxvbiBfe3R9XnsxfSQgYW5kICRcdmFyZXBzaWxvbiBfe3R9XnsyfSQgYXJlIHR3byB1bmlkZW50aWZpZWQgc3RydWN0dXJhbCBzaG9ja3MgICAgCiAgICAtICRcdmFyZXBzaWxvbiBfe3R9XntNfSQgaXMgdGhlIG1vbmV0YXJ5IHBvbGljeSBzaG9jayAgCgoKKiBMZXQncyBsb29rIGF0IHRoZSByZWxhdGlvbnMgYmV0d2VlbiB0aGUgaW5ub3ZhdGlvbiBhbmQgdGhlIHN0cnVjdHVyYWwgc2hvY2tzICgkXHZhcmVwc2lsb24gX3t0fSQpCgoKJCQlClxiZWdpbntibWF0cml4fQp1X3t0fV57XERlbHRhIEdEUH0gXFwgCnVfe3R9XntccGkgfSBcXCAKdV97dH1ee2l9JQpcZW5ke2JtYXRyaXh9JQo9JQpcYmVnaW57Ym1hdHJpeH0KYSAmIDAgJiAwIFxcIApiICYgYyAmIDAgXFwgCmQgJiBlICYgZiUKXGVuZHtibWF0cml4fSUKXGJlZ2lue2JtYXRyaXh9Clx2YXJlcHNpbG9uIF97dH1eezF9IFxcIApcdmFyZXBzaWxvbiBfe3R9XnsyfSBcXCAKXHZhcmVwc2lsb24gX3t0fV57TX0lClxlbmR7Ym1hdHJpeH0lCiQkCgoKKiBUaGUgbGFzdCBlcXVhdGlvbiBvZiB0aGUgbW9kZWwgaXMgaW50ZXJwcmV0ZWQgYXMgYSBtb25ldGFyeSBwb2xpY3kgcmVhY3Rpb24gZnVuY3Rpb24uIFRoZSBtb25ldGFyeSBhdXRob3JpdHkgcmVzcG9uZHMgdG8gJHVfe3R9XntcRGVsdGEgR0RQfSQgYW5kICR1X3t0fV57XHBpIH0kLCBhbmQgdGhlbiB0aGUgbW9uZXRhcnkgc2hvY2sgKCRcdmFyZXBzaWxvbiBfe3R9XntNfSQpIGlzIGlkZW50aWZpZWQgYXMgLi4uCgoKCiogQXMgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgbW9uZXRhcnkgc2hvY2tzLCB0aGUgb3RoZXIgdHdvIHNob2NrcyBhcmUgbm90IGlkZW50aWZpZWQuIFdlIGNvdWxkIGRvIHRoYXQgYmVjYXVzZSBhbnkgYWx0ZXJuYXRpdmUgZGVjb21wb3NpdGlvbiBvZiB0aGUgZmlyc3QgdHdvIHNob2NrcyB3b3VsZCBsZWF2ZSAkXHZhcmVwc2lsb24gX3t0fV57TX0kdW5hZmZlY3RlZC4gVGh1cywgZm9yIHNpbXBsaWNpdHksIHdlIGltcG9zZSB0aGUgcmVjdXJzaXZlIHN0cnVjdHVyZSBvbiB0aGUgZmlyc3QgdHdvIGVxdWF0aW9ucy4gCgoKKiBJdCBpcyBjb21tb24gdG8gZW5yaWNoIHRoZSBzZXQgb2YgdmFyaWFibGVzIG9yZGVyZWQgYWJvdmUgdGhlIGludGVyZXN0IHJhdGUgcmVsYXRpdmUgdG8gdGhpcyBzaW1wbGUgYmVuY2htYXJrIG1vZGVsIGFuZCBlc3RpbWF0ZSBsYXJnZXIgVkFSIHN5c3RlbXMuIFRvIGJlIGF3YXJlIG9mIHRoZSBzaG9ydGNvbWluZ3MgYW5kIHByb2JsZW1zIHdpdGggdGhpcyB3YXkgb2YgaWRlbnRpZnlpbmcgbW9uZXRhcnkgc2hvY2tzLCBzZWUgcGFnZSAxMiBpbiBLaWxpYW4oMjAxMSkKCjxicj4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCgoKIyMgNC4zLiBJZGVudGlmeWluZyB0aGUgU1ZBUiBieSBsb25nLXJ1biByZXN0cmljdGlvbnMgb24gdGhlIGVmZmVjdHMgb2Ygc2hvY2tzCgoqIFRoaXMgYXBwcm9hY2ggaXMgcmVhbGx5IHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIG9uZSwgYnV0IGluc3RlYWQgb2YgZm9jdXNpbmcgb24gJERfezB9JCAsIHdlIGNvbmNlbnRyYXRlIG9uICREKDEpJCwgdGhlIG1hdHJpeCBvZiBsb25nLXJ1biBpbXBhY3RzIG9mIHRoZSBzaG9ja3MKCiogUmVtZW1iZXIgdGhhdCB0aGUgbWF0cml4IG9mIGxvbmctcnVuIGVmZmVjdHMgKCRDKDEpPVxzdW1fe2k9MH1ee1xpbmZ0eX1DX3tpfSQpIGNvdWxkIGJlIG9idGFpbmVkIGJ5IGludmVydGluZyB0aGUgYXV0b3JlZ3Jlc3NpdmUgcG9seW5vbWlhbCBhczogJEMoMSk9KElfe0t9LUFfezF9LVxjZG90cyAtQV97cH0pXnstMX0kCiAKCiogV2Ugd2lsbCByZWNvdmVyIHRoZSBzdHJ1Y3R1cmFsIHBhcmFtZXRlcnMgZnJvbSB0aGUgVkFSIGVzdGltYXRlcyBmb2N1c2luZyBvbiB0aGUgbG9uZy1ydW4gaW1wYWN0IG1hdHJpeCAgJEQoMSkkIGFuZCB1c2luZyB0aGUgZmFjdCB0aGF0ICRDKDEpdl97dH09RCgxKVx2YXJlcHNpbG9uIF97dH0kLgoKKiBUaGVuLCBhcyBwcmV2aW91c2x5OgoKJCRFKEMoMSl2X3t0fXZfe3R9Xntee1xwcmltZSB9fUMoMSlee157XHByaW1lIH19KT1FKEQoMSlcdmFyZXBzaWxvbiBfe3R9XHZhcmVwc2lsb24KX3t0fV57XntccHJpbWUgfX1EKDEpXntee1xwcmltZSB9fSkkJAoKCiQkQygxKVxTaWdtYSBfe3Z9QygxKV57XHByaW1lIH09RCgxKUQoMSlee157XHByaW1lIH19JCQKCiogQWdhaW4sIHRoZSBsYXN0IGV4cHJlc3Npb24gaW1wb3NlcyAobisobisxKSkvMiByZXN0cmljdGlvbnMgb24gdGhlIGVsZW1lbnRzIG9mICREKDEpJDsgdGhhdCBpcywgd2Ugd2lsbCBuZWVkIG4obi0xKS8yIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIHRvICByZWNvdmVyIGVzdGltYXRlcyBvZiBhbGwgdGhlIGVsZW1lbnRzIG9mICREKDEpJAoKKiBPbmNlIHdlIGhhdmUgcmVjb3ZlcmVkICREKDEpJCBhbmQgdXNpbmcgdGhlIGZhY3QgdGhhdCAkQygxKXZfe3R9PUQoMSlcdmFyZXBzaWxvbiBfe3R9JCwgd2UgY2FuIHdyaXRlIHRoZSBWQVIgYXMgICRBKEwpeV97dH09QygxKV57LTF9RCgxKVx2YXJlcHNpbG9uIF97dH0kIGFuZCBpbnZlcnRpbmcgdGhlIFZBUiB3ZSB3aWxsIHJlY292ZXIgdGhlIFNWQVIgVk1BIGZvcm0gYXMgJHlfe3R9PUMoTClDKDEpXnstMX1EKDEpXHZhcmVwc2lsb24gX3t0fSQgOyB0aGF0IGlzLCB3ZSBjYW4gb2J0YWluIHRoZSBzdHJ1Y3R1cmFsIG1hdHJpY2VzICREX3tpfT1DX3tpfVxhc3QgQygxKV57LTF9RCgxKSQgIAoKKiBUaGlzIHdheSBvZiBpZGVudGlmaWNhdGlvbiBpcyBhbHNvIChpbiB0aGUgdGVybWlub2xvZ3kgb2YgQW1pc2FubyAmIEdpYW5uaW5pKSBhIEMtbW9kZWwgKCR2X3t0fT1DXHZhcmVwc2lsb24gX3t0fSQpIHdoZXJlICAkQz1DKDEpXnstMX1EKDEpJCAgIAoKCgoKIyMjIyBFeGFtcGxlOiBCbGFuY2hhcmQgYW5kIFF1YWggKDE5ODkpLCAiVGhlIER5bmFtaWMgRWZmZWN0cyBvZiBBZ2dyZWdhdGUgRGVtYW5kIGFuZCBTdXBwbHkgRGlzdHVyYmFuY2VzIiwgQW1lcmljYW4gRWNvbm9taWMgUmV2aWV3LCAgdm9sLiA3OSg0KSwgcGFnZXMgNjU1LTczCgoqIEJsYW5jaGFyZCBhbmQgUXVhaCAoODkpIGVzdGltYXRlIGEgYml2YXJpYXRlIFZBUiB3aXRoIG91dHB1dCBhbmQgdW5lbXBsb3ltZW50OiAKICAgIC0gJHlfe3R9PVxsZWZ0WyBcRGVsdGEgR0RQX3t0fSx1X3t0fVxyaWdodF0gXntee1xwcmltZSB9fSQKICAgIC0gJG49MiQgLCB0aGVuICRuKG4tMSkvMj0xJCA7IHRoYXQgaXMsIG9ubHkgYSByZXN0cmljdGlvbiBpcyBuZWVkZWQgdG8gaWRlbnRpZnkgdGhlIFNWQVIKICAgIC0gVGhpcyBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHdhcyB0aGF0IHRoZSBzZWNvbmQgc2hvY2sgb2YgdGhlIFZBUiAoJFx2YXJlcHNpbG9uIF97dH1eezJ9JCkgaGFzIG5vIGxvbmctcnVuIGVmZmVjdCBvbiByZWFsIEdEUAogICAgLSBCJlEoODkpIGludGVycHJldCAkXHZhcmVwc2lsb24gX3t0fV57Mn0kIGFzIGEgZGVtYW5kIHNob2NrIGFuZCAkXHZhcmVwc2lsb24gX3t0fV57MX0kICh3aGljaCBpcyBwZXJtaXR0ZWQgdG8gaGF2ZSBsb25nLXJ1biBlZmZlY3Qgb24gR0RQKSBhcyBhIHN1cHBseSBzaG9jawogICAgCgoKCiogVGhlcmUgaXMgYSBncmVhdGVyIGNvbnNlbnN1cyBhbW9uZ3N0IHRoZW9yZXRpY2FsIG1vZGVscyBpbiB0ZXJtcyBvZiBsb25nLXJ1biByZXN1bHRzLiBJdCBzaG91bGQgYmUgdW5zdXJwcmlzaW5nLCB0aGVyZWZvcmUsIHRoYXQgdGhlIG1vc3QgY29tbW9uIHNldCBvZiByZXN0cmljdGlvbnMgaXMgdG8gbnVsbGlmeSB0aGUgbG9uZy1ydW4gcmVzcG9uc2Ugb2Ygb3V0cHV0IHRvIG1vbmV0YXJ5IG9yIGRlbWFuZCBzaG9ja3MKCiogTG9uZy1ydW4gcmVzdHJpY3Rpb25zIGhhdmUgYmVlbiBmcmVxdWVudGx5IGVtcGxveWVkLCBzZWUgS2luZyBldCBhbC4gKDE5OTEpLCBGcmFuY2lzIGFuZCBSYW1leSAoMjAwNCksIEZpc2hlciAoMjAwNiksIGFtb25nIG1hbnkgb3RoZXJzLgoKKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGFkb3B0IGEgY29tYmluYXRpb24gb2Ygc2hvcnQgYW5kIGxvbmcgcnVuIHJlc3RyaWN0aW9ucyBhcyBvcmlnaW5hbGx5IGRlbW9uc3RyYXRlZCBieSBHYWxpICgxOTkyKSwgR2VybGFjaCBhbmQgU21ldHMgKDE5OTUpLCBQZWVyc21hbiBhbmQgU21ldHMgKDIwMDEpIGFuZCBNYW1vdWRvdSBldCBhbC4gKDIwMDkpLgoKKiBVbmZvcnR1bmF0ZWx5LCBsb25nLXJ1biBzY2hlbWVzIGFyZSBmYXIgZnJvbSBjcml0aXF1ZS1mcmVlLiBGYXVzdCBhbmQgTGVlcGVyIHNob3cgdGhhdCB3aXRoIGZpbml0ZSBkYXRhLCB0aGUgbG9uZy1ydW4gZWZmZWN0IG9mIHNob2NrcyBpcyBpbXByZWNpc2VseSBlc3RpbWF0ZWQsIGFuZCB0aGF0IHRoaXMgaW1wcmVjaXNpb24gaXMgIGV4YWNlcmJhdGVkIGJ5IGxvbmctcnVuIHJlc3RyaWN0aW9ucyBjYXVzaW5nIHNlcmlvdXMgYmlhcyB0byBJUkZzIGV2ZW4gd2l0aCBsYXJnZSBzYW1wbGVzLiAKCjxicj4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiMjIDQuNC4gSWRlbnRpZnlpbmcgdGhlIFNWQVIgYnkgcmVzdHJpY3Rpb25zIG9uIHRoZSBjb250ZW1wb3JhbmVvdXMgaW50ZXJhY3Rpb25zIGFtb25nIHRoZSBlbmRvZ2Vub3VzIHZhcmlhYmxlcyAoSy1tb2RlbCBpbiB0aGUgdGVybWlub2xvZ3kgb2YgQW1pc2FubyAmIEdpYW5uaW5pKQoKKiBJbiB0aGlzIGFwcHJvYWNoIHRoZSBTVkFSIGlzIGlkZW50aWZpZWQgYnkgcmVzdHJpY3Rpb25zIG9uIHRoZSBjb250ZW1wb3JhbmVvdXMgaW50ZXJhY3Rpb25zIGFtb25nIHRoZSBlbmRvZ2Vub3VzIHZhcmlhYmxlcyAoJHlfe2l9JCkgaW5zdGVhZCBvZiByZXN0cmljdGlvbnMgb24gdGhlIGVmZmVjdHMgb2YgdGhlIHNob2NrcwoKKiBUaGUgbWF0cml4IG9mIGNvbnRlbXBvcmFuZW91cyBlZmZlY3RzIGFtb25nIHRoZSAoJHlfe2l9JCkgaXMgdGhlICRCX3swfSQgbWF0cml4IChjYWxsZWQgdGhlICRLJC1tYXRyaXggYnkgQW1pc2FubyAmIEdpYW5uaW5pKQoKKiBDb21wYXJpbmcgdGhlIFZBUiBbM10gYW5kIHRoZSBTVkFSIFs2XSwgd2UgZmluZCB0aGF0IGlmIHdlIGxvb2sgYXQgdGhlIHZhcmlhYmxlcyBpbiB0LCAKCiAgICAgLSBGcm9tIHRoZSBWQVI6ICR5X3t0fT12X3t0fSQKICAgICAtIEZyb20gdGhlIFNWQVI6ICAkQl97MH15X3t0fT1cdmFyZXBzaWxvbiBfe3R9JAogICAgIC0gdGhlbiwgaWYgd2UgcHJlLW11bHRpcGx5IHRoZSBmaXJzdCBlcXVhdGlvbiBieSAkQl97MH0kCiAgICAgLSB3ZSBvYnRhaW4gJEJfezB9dl97dH09XHZhcmVwc2lsb24gX3t0fSQKICAgICAtIHRha2luZyBleHBlY3RhdGlvbnMgdG8gb2J0YWluIHZhcmlhbmNlLWNvdmFyaWFuY2UgbWF0cmljZXMsICAkRVxsZWZ0W0JfezB9dl97dH12X3t0fV57XntccHJpbWUgfX1CX3swfV57XntccHJpbWUgfX1ccmlnaHRdID1FXGxlZnRbXHZhcmVwc2lsb25fe3R9XHZhcmVwc2lsb24gX3t0fV57XntccHJpbWUgfX1ccmlnaHRdJAogICAgIC0gd2hpY2ggbGVhZHMgdG86ICRCX3swfVxTaWdtYSBfe3Z9Ql97MH1ee157XHByaW1lIH19PUkkCgoqIFRoZSBsYXN0IGV4cHJlc3Npb24gaW1wb3NlcyAobisobisxKSkvMiByZXN0cmljdGlvbnMgb24gdGhlIGVsZW1lbnRzIG9mICRCX3swfSQ7IHRoYXQgaXMsIHdlIHdpbGwgbmVlZCBuKG4tMSkvMiBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucyB0byAgcmVjb3ZlciBlc3RpbWF0ZXMgb2YgYWxsIHRoZSBlbGVtZW50cyBvZiAkQl97MH0kCgoqIE9uY2UgJEJfezB9JCBpcyBlc3RpbWF0ZWQsIHdlIGNhbiBvYnRhaW4gdGhlIFNWQVIgbW9kZWwgYXM6ICRCX3tpfT1CX3swfUFfe2l9JAoKKiBXZSBjYW4gYWxzbyBvYnRhaW4gdGhlIFZNQSBvZiB0aGUgU1ZBUiBhcyAkRF97aX09Q197aX1CX3swfV57LTF9JAoKPGJyPgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCgojIyA0LjUuIElkZW50aWZ5aW5nIHRoZSBTVkFSIGJ5IGJvdGggdHlwZXMgb2YgcmVzdHJpY3Rpb25zIChUaGUgQUItbW9kZWwpCgoqIEFtaXNhbm8gJiBHaWFubmluaSBzaG93IGhvdyB0byBjb21iaW5lIGJvdGggdHlwZXMgb2YgcmVzdHJpY3Rpb25zOyB0aGF0IGlzIHJlc3RyaWN0aW9ucyBvbiB0aGUgZWZmZWN0cyBvZiB0aGUgc2hvY2tzIGFuZCByZXN0cmljdGlvbnMgb24gdGhlIGNvbnRlbXBvcmFuZW91cyBpbnRlcmFjdGlvbnMgYW1vbmcgdGhlICR5X3t0fSQuCgoqIFRoZXkgY2FsbCB0aGF0IGFwcHJvYWNoIHRoZSBBQi1tb2RlbCwgYmVjYXVzZSB0aGVyZSBhcmUgZ29pbmcgdG8gYXBwZWFyIHR3byBtYXRyaWNlcyAoIEEgJiBCKTsgaW4gZmFjdCwgdGhlIEEgYW5kIEIgbWF0cmljZXMgYXJlIHRoZSBwcmV2aW91cyBLIGFuZCBDIG1hdHJpY2VzIGluIEFtaXNhbm8gJiBHaWFubmluaSBlbnZpcm9ubWVudCAKCiogVGhlIGB2YXJzYCBwYWNrYWdlIHVzZXMgdGhpcyBBQiB0ZXJtaW5vbG9neQoKKiBJbiBvdXIgZW52aXJvbm1lbnQsIFszXSB0byBbNl0sIHRoZSBBQiBtYXRyaWNlcyBhcmUgcmVsYXRlZCB0byBvdXIgJEJfezB9JCBhbmQgJERfezB9JCByZXNwZWN0aXZlbHkKCiogVGhlc2UgdHdvIG1hdHJpY2VzIGxpbmsgdGhlIGlubm92YXRpb25zIHRvIHRoZSBzdHJ1Y3R1cmFsIHNob2NrcyBhcyAkQXZfe3R9PUJcdmFyZXBzaWxvbiBfe3R9JAoKKiBUaGUgQUIgcGFyYW1ldHJpc2F0aW9uIG5lc3RzIHRoZSBDIGFuZCBLIG1vZGVsczoKCiAgICAgLSBJZiAkQT1JX3tufSQgd2UgYXJlIGluIHRoZSBDLW1vZGVsIGFwcHJvYWNoIGFuZCB3ZSBvbmx5IHNwZWNpZnkgcmVzdHJpY3Rpb25zIG9uIHRoZSBlZmZlY3RzIG9mIHRoZSBzaG9ja3MKICAgICAtIElmICRCPUlfe259JCB3ZSBhcmUgaW4gdGhlIEstbW9kZWwgYXBwcm9hY2ggYW5kIHdlIG9ubHkgc3BlY2lmeSByZXN0cmljdGlvbnMgb24gdGhlIGNvbnRlbXBvcmFuZW91cyByZWxhdGlvbnMgYW1vbmcgdGhlICR5X3t0fSQKCiogVG8gaWRlbnRpZnkgdGhlICQybl57Mn0kIGVsZW1lbnRzIG9mIHRoZSAkQSQgYW5kICRCJCBtYXRyaWNlcyB3ZSBuZWVkLCBvYnZpb3VzbHkgJDJuXnsyfSQgY29uZGl0aW9ucwoKKiBGcm9tICRBdl97dH09Qlx2YXJlcHNpbG9uIF97dH0kLCB3ZSBjb3VsZCBvYnRhaW4gICRBdl97dH12X3t0fV57XntccHJpbWUgfX1BXntee1xwcmltZSB9fT1CXHZhcmVwc2lsb24gX3t0fVx2YXJlcHNpbG9uIF97dH1ee157XHByaW1lIH19Ql57XntccHJpbWUgfX0kIGFuZCB0aGVuIHRha2luZyBleHBlY3RhdGlvbnMgJEFcU2lnbWEgX3t2fUFee157XHByaW1lIH19PUJCXntee1xwcmltZSB9fSQgd2Ugb2J0YWluICRuKG4tMSkvMiQgcmVzdHJpY3Rpb25zLgoKCiogVGhlbiwgaWYgd2Ugc3BlY2lmeSBhbiBBQi1tb2RlbCB3ZSB3aWxsIG5lZWQgJFsybl57Mn0tbihuKzEpLzJdJCBleHRyYSByZXN0cmljdGlvbnMgdG8gaWRlbnRpdHkgb3VyIFNWQVIKCgoqIEFtaXNhbm8gJiBHaWFubmluaSAoYXNzdW1pbmcgYSBHYXVzc2lhbiBkaXN0cmlidXRpb24pIGV4cGxhaW4gaG93IHRvIHJlY292ZXIgdGhlIEEgJiBCIG1hdHJpY2VzIHVzaW5nIGZ1bGwgaW5mb3JtYXRpb24gbWF4aW11bSBsaWtlbGlob29kIChGSU1MKSBtZXRob2RzLiBUaGlzIGlzIHRoZSByb3V0ZSBmb2xsb3dlZCBpbiB0aGUgdmFycyBwYWNrYWdlLgoKKiBUaGlzIGFwcHJvYWNoIGludm9sdmVzIHRoZSBtYXhpbWl6YXRpb24gb2YgdGhlIGNvbmNlbnRyYXRlZCBsaWtlbGlob29kIHdpdGggcmVzcGVjdCB0byB0aGUgc3RydWN0dXJhbCBtb2RlbCBwYXJhbWV0ZXJzIHN1YmplY3QgdG8gdGhlIGlkZW50aWZ5aW5nIHJlc3RyaWN0aW9ucyAoc2VlLCBlLmcuLCBMw7x0a2Vwb2hsIDIwMDUpLgoKCgoqIEFub3RoZXIgYWx0ZXJuYXRpdmUgaXMgdGhlIEdNTSBmcmFtZXdvcms6IHRoZSBpZGVudGlmeWluZyByZXN0cmljdGlvbnMgb24gJEJfezB9JCBvciBvbiAkRF97MH0kIGdlbmVyYXRlIG1vbWVudCBjb25kaXRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXN0aW1hdGUgdGhlIHVua25vd24gY29lZmZpY2llbnRzLgoKCgoqIE9uY2Ugd2UgaGF2ZSBhbiBlc3RpbWF0aW9uIG9mIHRoZSBBQiBtYXRyaWNlcyB3ZSBjYW4gcmVjb3ZlciB0aGUgU1ZBUiBhbmQgaXRzIFZNQSByZXByZXNlbnRhdGlvbiBhczogIAoKICAtIFRoZSBTVkFSIG1hdHJpY2VzOiAgJEJfe2l9PUJeey0xfUFBX3tpfSQgLCBvYnZpb3VzbHkgJEJfezB9PUJeey0xfUEkICAgCiAgICAgICAgICAgICAgICAKICAtIFRoZSBtYXRyaWNlcyBmb3IgdGhlIFNWQVIgVk1BIHJlcHJlc2VudGF0aW9uOiAkRF97aX09Q197aX1BXnstMX1CJCwgIHdoZXJlICREX3swfT1BXnstMX1CJCAgIAoKCgojIyMjIEV4YW1wbGU6IEJsYW5jaGFyZCAoMTk4OSksICJBIFRyYWRpdGlvbmFsIEludGVycHJldGF0aW9uIG9mIE1hY3JvZWNvbm9taWMgRmx1Y3R1YXRpb25zIiwgQW1lcmljYW4gRWNvbm9taWMgUmV2aWV3LCA3OSwgMTE0Ni0xMTY0LgoKKiBCbGFuY2hhcmQgKDg5KSB1c2VzIGEgInRyYWRpdGlvbmFsIiBLZXluZXNpYW4gbW9kZWwgdG8gYW5hbHlzZSB0aGUgVVMgbWFjcm9lY29ub21pYyBmbHVjdHVhdGlvbnMgYnkgbWVhbnMgb2YgYSBzdHJ1Y3R1cmFsIFZBUiBBLUIgbW9kZWwuICAKCiogQmxhbmNoYXJkJ3MgbW9kZWwgaGFzIDUgZXF1YXRpb25zOiBhbiBhZ2dyZWdhdGUgZGVtYW5kIGVxdWF0aW9uLCBPa3VuJ3MgbGF3LCBhIHByaWNlLXNldHRpbmcgZXF1YXRpb24sIHRoZSBQaGlsbGlwcyBjdXJ2ZSBhbmQgYSBtb25ldGFyeSBwb2xpY3kgcnVsZS4KCiogVGhlIFZBUiBoYXMgNSB2YXJpYWJsZXMgYW5kIDUgc3RydWN0dXJhbCBzaG9ja3M6CgokJHlfe3R9PVxsZWZ0WyBZX3t0fSxVX3t0fSxQX3t0fSxXX3t0fSxNX3t0fVxyaWdodF0gXntee1xwcmltZSB9fVwgXCBcIFwgXCBcClwgXCBcIFwgXCBcIFwgXCBcIFwgXHZhcmVwc2lsb24gX3t0fT1cbGVmdFsgXHZhcmVwc2lsb24gX3t0fV57RH0sXHZhcmVwc2lsb24KX3t0fV57U30sXHZhcmVwc2lsb24gX3t0fV57UH0sXHZhcmVwc2lsb24gX3t0fV57V30sXHZhcmVwc2lsb24gX3t0fV57TX0lClxyaWdodF0gXntee1xwcmltZSB9fSQkCgoKKiBUaGUgQSBhbmQgQiBtYXRyaWNlcyB0byByZWNvdmVyIHRoZSBTVkFSIGFyZToKCiQkQT0lClxiZWdpbntibWF0cml4fQoxICYgMCAmIDAgJiAwICYgMCBcXCAKYV97MjF9ICYgMSAmIDAgJiAwICYgMCBcXCAKYV97MzF9ICYgMCAmIDEgJiBhX3szNH0gJiAwIFxcIAowICYgYV97NDJ9ICYgYV97NDN9ICYgMSAmIDAgXFwgCmFfezUxfSAmIGFfezUyfSAmIGFfezUzfSAmIGFfezU0fSAmIDElClxlbmR7Ym1hdHJpeH0lClwgXCBcIFwgXCBcIFwgXCBcIFwgXCBcIFwgXCBcIFwgIFwgXCBcIFwgXCBcIFwgQj0lClxiZWdpbntibWF0cml4fQpiX3sxMX0gJiBiX3sxMn0gJiAwICYgMCAmIDAgXFwgCjAgJiBiX3syMn0gJiAwICYgMCAmIDAgXFwgCjAgJiBiX3szMn0gJiBiX3szM30gJiAwICYgMCBcXCAKMCAmIGJfezQyfSAmIDAgJiBiX3s0NH0gJiAwIFxcIAowICYgMCAmIDAgJiAwICYgYl97NTV9JQpcZW5ke2JtYXRyaXh9JQokJAoKKiBUaGUgcmVzdHJpY3Rpb25zIG9uIHRoZSBBICYgQiBtYXRyaWNlcyBjb21lIGZyb206CiAgICAtICRZX3t0fT1iX3sxMX1cdmFyZXBzaWxvbiBfe3R9XntEfStiX3sxMn1cdmFyZXBzaWxvbiBfe3R9XntTfSQuIEFnZ3JlZ2F0ZSBkZW1hbmQgZXF1YXRpb246IHJlYWwgR0RQIGlzIGNvbnRlbXBvcmFuZW91c2x5IGFmZmVjdGVkICBieSAkXHZhcmVwc2lsb24gX3t0fV57RH0kIGFuZCAkXHZhcmVwc2lsb24gX3t0fV57U30kCiAgICAtICRVX3t0fT0tYV97MjF9WV97dH0rYl97MjJ9XHZhcmVwc2lsb24gX3t0fV57U30kLiBPa3VuJ3MgbGF3OiB1bmVtcGxveW1lbnQgaXMgc2ltdWx0YW5lb3VzbHkgcmVsYXRlZCB0byBvdXRwdXQgYW5kIGluc3RhbnRhbmVvdXNseSBhZmZlY3RlZCBieSAkXHZhcmVwc2lsb24gX3t0fV57U30kCiAgICAtICRQX3t0fT0tYV97MzF9WV97dH0tYV97MzR9V197dH0rYl97MzJ9XHZhcmVwc2lsb24gX3t0fV57U30rYl97MzN9XHZhcmVwc2lsb24KX3t0fV57UH0kLiBQcmljZSBzZXR0aW5nIGVxdWF0aW9uOiB0aGUgcHJpY2UgbGV2ZWwgaXMgc2ltdWx0YW5lb3VzbHkgcmVsYXRlZCB0byBvdXRwdXQgYW5kIHdhZ2VzLCBhbmQgaW5zdGFudGFuZW91c2x5IGFmZmVjdGVkIGJ5ICRcdmFyZXBzaWxvbiBfe3R9XntTfSQgYW5kICRcdmFyZXBzaWxvbiBfe3R9XntQfSQKICAgIC0gJFdfe3R9PS1hX3s0Mn1VX3t0fS1hX3s0M31QX3t0fStiX3s0Mn1cdmFyZXBzaWxvbiBfe3R9XntTfStiX3s0NH1cdmFyZXBzaWxvbgpfe3R9XntXfSQuIFBoaWxsaXBzIGN1cnZlOiB0aGUgbm9taW5hbCB3YWdlIGlzIHNpbXVsdGFuZW91c2x5IHJlbGF0ZWQgdG8gdW5lbXBsb3ltZW50IGFuZCBwcmljZXMsIGFuZCBpbnN0YW50YW5lb3VzbHkgYWZmZWN0ZWQgYnkgJFx2YXJlcHNpbG9uIF97dH1ee1N9JCBhbmQgJFx2YXJlcHNpbG9uIF97dH1ee1B9JAogICAgLSAkTV97dH09LWFfezUxfVlfe3R9LWFfezUyfVVfe3R9LWFfezUzfVBfe3R9LWFfezU0fVdfe3R9K2JfezU1fVx2YXJlcHNpbG9uCl97dH1ee019JC4gTW9uZXRhcnkgcnVsZSBlcXVhdGlvbjogbm9taW5hbCBtb25leSBpcyBzaW11bHRhbmVvdXNseSByZWxhdGVkIHRvIGFsbCB0aGUgb3RoZXIgNCB2YXJpYWJsZXMsIGJ1dCBpcyBvbmx5IGFuZCBpbnN0YW50YW5lb3VzbHkgYWZmZWN0ZWQgYnkgbW9uZXRhcnkgc3RydWN0dXJhbCBkaXN0dXJiYW5jZXMoJFx2YXJlcHNpbG9uIF97dH1ee019JCkKCi0gRm9yIGEgY29tcGxldGUgZWNvbm9taWMgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UgZXF1YXRpb25zLCBzZWUgQmxhbmNoYXJkICgxOTg5LCBzZWN0aW9uIElJKS4KCgoqIFRvZ2V0aGVyLCB0aGUgMiBtYXRyaWNlcyAoQS1CKSBoYXZlIDE3IGZyZWUgZWxlbWVudHMsIHdoaWxlIGZyb20gJEFcU2lnbWEgX3t2fUFee157XHByaW1lIH19PUJCXntee1xwcmltZSB9fSQgd2Ugb2J0YWluIG9ubHkgJG4obi0xKS8yID0gMTUkIHJlc3RyaWN0aW9ucy5UbyBzYXRpc2Z5IHRoZSBvcmRlciBjb25kaXRpb24gd2UgbmVlZCB0d28gYWRkaXRpb25hbCByZXN0cmljdGlvbnMuCgoqIEZvciB0aGlzIHJlYXNvbiwgQmxhbmNoYXJkICgxOTg5KSBhc3NpZ25lZCBmaXhlZCBudW1lcmljYWwgdmFsdWVzIHRvIHRoZSBjb2VmZmljaWVudHMgJGFfezM0fSQgYW5kICRiX3sxMn0kLiBUaGUgbnVtZXJpY2FsIHZhbHVlIGdpdmVuIHRvICRhX3szNH0kIHdhcyBkZXJpdmVkIGZyb20gcHJldmlvdXMgc3R1ZGllcywgd2hlcmVhcyB0aGF0IGFzc2lnbmVkIHRvICRiX3sxMn0kIHJlc3VsdGVkIGZyb20gYSBzb3J0IG9mIGNhbGlicmF0aW9uIHJlYXNvbmluZy4KCjxicj4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgojIEFkZGl0aW9uYWwgdG9waWNzCgotIFZFQ00gIAoKLSBCYXllc2lhbiBWQVJzICAKCi0gU2lnbiByZXN0cmljdGlvbnMKCi0gSWRlbnRpZmljYXRpb24gYnkgSGV0ZXJvc2tlZGFzdGljaXR5ICAgIAoKLSBOb24tZnVuZGFtZW50YWxuZXNzICAKCi0gRmFjdG9yLWF1Z21lbnRlZCBWQVIgKEZBVkFSKSAgIAoKLSAgVFZBUiAmIFNUVkFSICAKCgo8YnI+CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAoKCgojIFRvIHN1bSB1cAoKKiBTdHJ1Y3R1cmFsIHZlY3RvciBhdXRvcmVncmVzc2l2ZSAoU1ZBUikgbW9kZWxzIGhhdmUgYmVlbiB1c2VkIGV4dGVuc2l2ZWx5IGZvciBlY29ub21pYyBhbmFseXNpcyBzaW5jZSB0aGV5IHdlcmUgYWR2b2NhdGVkIGJ5IFNpbXMgKDE5ODApIGFzIGFsdGVybmF0aXZlcyB0byBjbGFzc2ljYWwgZWNvbm9tZXRyaWMgc2ltdWx0YW5lb3VzIGVxdWF0aW9ucyBtb2RlbHMuICAKCgoKLSBEZXNwaXRlIHRoZWlyIHBvcHVsYXJpdHksIGEgbnVtYmVyIG9mIGF1dGhvcnMgaGF2ZSBxdWVzdGlvbmVkIHRoZWlyIHJlbGlhYmlsaXR5IGFuZCB1c2VmdWxuZXNzIG9uIGRpZmZlcmVudCBncm91bmRzLiAKCi0gRm9yIGV4YW1wbGUsIENvb2xleSBhbmQgTGVSb3kgKDE5ODUpIGNhbGwgVkFSIGFuYWx5c2lzIGF0aGVvcmV0aWNhbCBpZiBubyBzdHJ1Y3R1cmFsIGFzc3VtcHRpb25zIGZyb20gZWNvbm9taWMgdGhlb3J5IGFyZSB1c2VkIGluIHN0cnVjdHVyYWwgaW50ZXJwcmV0YXRpb25zLiAgCgotICBDb29sZXkgYW5kIER3eWVyICgxOTk4KSBxdWVzdGlvbiB0aGUgcm9idXN0bmVzcyBvZiB0aGUgZXZpZGVuY2UgZnJvbSBTVkFScyB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXRpc3RpY2FsIG1vZGVsIHNwZWNpZmljYXRpb25zLiAKCgoqIE5vbi1hcmJpdHJhcnkgb3J0aG9nb25hbGlzYXRpb24gc2NoZW1lcyB3aGljaCBpbXBvc2UgY29udGVtcG9yYW5lb3VzIHJlc3RyaWN0aW9ucyBvbiB0aGUgVkFSIGFyZSByZWZlcnJlZCB0byBhcyBzaG9ydC1ydW4gaWRlbnRpZmljYXRpb24gc2NoZW1lcy4gTW9zdCBzaG9ydC1ydW4gcmVzdHJpY3Rpb25zIGFyZSB6ZXJvIHJlc3RyaWN0aW9ucyAoZS5nLiB0aGF0IG91dHB1dCByZWFjdHMgb25seSB3aXRoIGEgbGFnIHRvIG1vbmV0YXJ5IHNob2NrcykuIAoKKiBPcGluaW9ucyBjb25jZXJuaW5nIHNob3J0LXJ1biByZXN0cmljdGlvbnMgYXJlIG1peGVkLiBGYXVzdCBhbmQgTGVlcGVyICgxOTk3KSBjbGFpbSB0aGVyZSBpcyBvZnRlbiBzaW1wbHkgYW4gaW5zdWZmaWNpZW50IG51bWJlciBvZiB0ZW5hYmxlIGNvbnRlbXBvcmFyeSByZXN0cmljdGlvbnMgdG8gYWNoaWV2ZSBpZGVudGlmaWNhdGlvbi4gSG93ZXZlciwgQ2hyaXN0aWFubyBldCBhbC4gKDIwMDYpIGFyZ3VlIHRoYXQgc2hvcnQtcnVuIFNWQVJzIHBlcmZvcm0gcmVtYXJrYWJseSB3ZWxsLiAgCgoKKiBQaW9uZWVyaW5nIHdvcmsgYnkgU2hhcGlybyBhbmQgV2F0c29uICgxOTg4KSBhbmQgQmxhbmNoYXJkIGFuZCBRdWFoICgxOTg5KSBkZXNjcmliZWQgaG93IHJlc3RyaWN0aW9ucyBjb3VsZCBiZSBwbGFjZWQgb24gdGhlIGxvbmctcnVuIHJlc3BvbnNlcy4gCgoqIFRoZXJlIGlzIGEgZ3JlYXRlciBjb25zZW5zdXMgYW1vbmdzdCB0aGVvcmV0aWNhbCBtb2RlbHMgaW4gdGVybXMgb2YgbG9uZy1ydW4gcmVzdWx0cy4gSXQgc2hvdWxkIGJlIHVuc3VycHJpc2luZyB0aGVyZWZvcmUgdGhhdCB0aGUgbW9zdCBjb21tb24gc2V0IG9mIHJlc3RyaWN0aW9ucyBpcyB0byBudWxsaWZ5IHRoZSBsb25nLXJ1biByZXNwb25zZSBvZiBvdXRwdXQgdG8gbW9uZXRhcnkgc2hvY2tzLgoKKiBFdmVyIHNpbmNlIHRoZWlyIGludHJvZHVjdGlvbiwgbG9uZy1ydW4gcmVzdHJpY3Rpb25zIGhhdmUgYmVlbiBmcmVxdWVudGx5IGVtcGxveWVkLCBzZWUgS2luZyBldCBhbC4gKDE5OTEpLCBGcmFuY2lzIGFuZCBSYW1leSAoMjAwNCksIEZpc2hlciAoMjAwNikgYW1vbmcgbWFueSBvdGhlcnMuCgoqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYWRvcHQgYSBjb21iaW5hdGlvbiBvZiBzaG9ydCBhbmQgbG9uZyBydW4gcmVzdHJpY3Rpb25zIGFzIG9yaWdpbmFsbHkgZGVtb25zdHJhdGVkIGJ5IEdhbGkgKDE5OTIpLCBHZXJsYWNoIGFuZCBTbWV0cyAoMTk5NSksIFBlZXJzbWFuIGFuZCBTbWV0cyAoMjAwMSkgYW5kIE1hbW91ZG91IGV0IGFsLiAoMjAwOSkuCgoqIFZBUiBtZXRob2RvbG9neSBpcyB1bmRlciBjb250aW51b3VzIGRldmVsb3BtZW50IChWRUNNLCBzaWduIHJlc3RyaWN0aW9ucywgSGV0ZXJvc2tlZGFzdGljaXR5IHJlc3RyaWN0aW9ucywgU1RWQVIsIGV0Yy4pICAKCi0gSW4gdGhlaXIgcmV2aWV3IG9mIHRoZSBWQVIgbWV0aG9kb2xvZ3ksIFtTdG9jayBhbmQgV2F0c29uICgyMDAxKV0oaHR0cDovL3d3dy5qc3Rvci5vcmcvZGlzY292ZXIvMTAuMjMwNy8yNjk2NTE5P3VpZD0zNzM3OTUyJnVpZD0yJnVpZD00JnNpZD0yMTEwNjA3OTg5NzA3MSkgY29uY2x1ZGUgdGhhdCBWQVJzIHN1Y2Nlc3NmdWxseSBjYXB0dXJlIHRoZSByaWNoIGludGVyZGVwZW5kZW50IGR5bmFtaWNzIG9mIGRhdGEgd2VsbCwgYnV0IHRoYXQgdGhlaXIgc3RydWN0dXJhbCBpbXBsaWNhdGlvbnMgYXJlIG9ubHkgYXMgc291bmQgYXMgdGhlaXIgaWRlbnRpZmljYXRpb24gc2NoZW1lcycuIAoKCgoKCgoKCiMgQmlibGlvZ3JhcGh5CgoqKlRoZSBzbGlkZXMgYXJlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzOioqICAKKGFuZCBwcm9iYWJseSBzb21lIG90aGVycyB0aGF0IEkgaGF2ZSBub3QgcmVtZW1iZXJlZCBhdCB0aGUgdGltZSBvZiB0aGUgZmluYWwgbWFraW5nLiBUaGFua3MgdG8gYWxsIG9mIHRoZW0pCgoKLSBBbWlzYW5vLCBHLiwgYW5kIEdpYW5uaW5pLCBDLiAoMTk5NykuIFtUb3BpY3MgaW4gU3RydWN0dXJhbCBWQVIgRWNvbm9tZXRyaWNzXShodHRwOi8vd3d3LnNwcmluZ2VyLmNvbS9ncC9ib29rLzk3ODM2NjIwMjc1NzgpLiBTcHJpbmdlci4gCi0gQmrDuHJubGFuZCwgSC4gQy4sIGFuZCBUaG9yc3J1ZCwgTC4gKDIwMTUpLiBbQXBwbGllZCBUaW1lIFNlcmllcyBmb3IgTWFjcm9lY29ub21pY3NdKGh0dHA6Ly93d3cuZ3lsZGVuZGFsLm5vL0ZhZ2xpdHRlcmF0dXIvT0Vrb25vbWktb2ctYWRtaW5pc3RyYXNqb24vU2FtZnVubnNvZWtvbm9taS9BcHBsaWVkLXRpbWUtc2VyaWVzLWZvci1tYWNyb2Vjb25vbWljcy0yLi11dGcpLCAgR3lsZGVuZGFsIEFrYWRlbWlzay4gCi0gR2FsaSwgSi4gKDE5OTkpLCBbVGVjaG5vbG9neSwgRW1wbG95bWVudCwgYW5kIHRoZSBCdXNpbmVzcyBDeWNsZTogRG8gVGVjaG5vbG9neSBTaG9ja3MKRXhwbGFpbiBBZ2dyZWdhdGUgRmx1Y3R1YXRpb25zP10oaHR0cDovL3d3dy5jcmVpLmNhdC93cC1jb250ZW50L3VwbG9hZHMvdXNlcnMvcGFnZXMvamdhZXI5OS5wZGYpLCBBbWVyaWNhbiBFY29ub21pYyBSZXZpZXcsIDg5LCAyNDktMjcxLgotIEdvdHRzY2hhbGssIEouICgyMDAxKSwgW0FuIEludHJvZHVjdGlvbiBpbnRvIHRoZSBTVkFSIE1ldGhvZG9sb2d5OiBJZGVudGlmaWNhdGlvbiwgSW50ZXJwcmV0YXRpb24gYW5kIExpbWl0YXRpb25zIG9mIFNWQVIgbW9kZWxzXShodHRwczovL3d3dy5pZnctbWVtYmVycy5pZncta2llbC5kZS9wdWJsaWNhdGlvbnMvYW4taW50cm9kdWN0aW9uLWludG8tdGhlLXN2YXItbWV0aG9kb2xvZ3ktaWRlbnRpZmljYXRpb24taW50ZXJwcmV0YXRpb24tYW5kLWxpbWl0YXRpb25zLW9mLXN2YXItbW9kZWxzL2thcDEwNzIucGRmKSwgS2llbCBXb3JraW5nIFBhcGVyIG7CuiAxMDcyCi0gS2lsaWFuLCBMLiAoMjAxMSksICBbU3RydWN0dXJhbCBWZWN0b3IgQXV0b3JlZ3Jlc3Npb25dKGh0dHBzOi8vaWRlYXMucmVwZWMub3JnL3AvY3ByL2NlcHJkcC84NTE1Lmh0bWwpLCBDRVBSIERpc2N1c3Npb24gUGFwZXIgU2VyaWVzIG5eb14gODUxNS4KLSBTaW1zLCBDLkEuICgxOTgwKSwgW01hY3JvZWNvbm9taWNzIGFuZCBSZWFsaXR5XShodHRwczovL2lkZWFzLnJlcGVjLm9yZy9hL2VjbS9lbWV0cnAvdjQ4eTE5ODBpMXAxLTQ4Lmh0bWwpLCBFY29ub21ldHJpY2EsIDQ4LCAxLTQ4Ci0gTMO8dGtlcG9obCwgSC4gKDIwMDUpLCBbTmV3IEludHJvZHVjdGlvbiB0byBNdWx0aXBsZSBUaW1lIFNlcmllcyBBbmFseXNpc10oaHR0cDovL3d3dy5zcHJpbmdlci5jb20vZ3AvYm9vay85NzgzNTQwNDAxNzI4KS4gU3ByaW5nZXI6IE5ldyBZb3JrLgotIEzDvHRrZXBvaGwsIEguICgyMDExKSwgW1ZlY3RvciBBdXRvcmVncmVzc2l2ZSBNb2RlbHNdKGh0dHA6Ly9jYWRtdXMuZXVpLmV1L2JpdHN0cmVhbS9oYW5kbGUvMTgxNC8xOTM1NC9FQ09fMjAxMV8zMC5wZGYpLCBFVUkgV29ya2luZyBQYXBlciBFQ08yMDExLzMwCi0gUGZhZmYsIEIuICgyMDA4YSksIFtWQVIsIFNWQVIgYW5kIFNWRUMgTW9kZWxzOiBJbXBsZW1lbnRhdGlvbiBXaXRoaW4gUiBQYWNrYWdlIHZhcnNdKGh0dHA6Ly93d3cuanN0YXRzb2Z0Lm9yZy92MjcvaTA0L3BhcGVyKSwgSm91cm5hbCBvZiBTdGF0aXN0aWNhbCBTb2Z0d2FyZSwgMjcoNCkKLSBQZmFmZiwgQi4gKDIwMDhiKSwgW0FuYWx5c2lzIG9mIEludGVncmF0ZWQgYW5kIENvaW50ZWdyYXRlZCBUaW1lIFNlcmllcyB3aXRoIFJdKGh0dHA6Ly93d3cuc3ByaW5nZXIuY29tL2dwL2Jvb2svOTc4MDM4Nzc1OTY2MSksIFNwcmluZ2VyCi0gUGZhZmYsIEIuICgyMDE0KSwgW1BhY2thZ2UgJ3ZhcnMnXShodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy92YXJzL3ZhcnMucGRmKSwgQ1JBTiBSIHBhY2thZ2UuCi0gU3RvY2ssIEouIEguICgyMDA4KSwgW1JlY2VudCBEZXZlbG9wbWVudHMgaW4gU3RydWN0dXJhbCBWQVIgTW9kZWxsaW5nXShodHRwOi8vd3d3Lm5iZXIub3JnL1dORS9zbGlkZXM3LTE0LTA4L0xlY3R1cmU3LnBkZiksIE5CRVIgU3VtbWVyIEluc3RpdHV0ZQoKCjxicj48YnI+PGJyPjxicj4KCgo=