- Introduction
- VAR models in reduced form (Estimation)
- Model Specification
- Estimation
- Validation
- 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
- 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:
After identification, Structural Vector Autoregressive (SVAR) models have been mainly used to address the 2 following type of questions:
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)
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.
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)
- Amisano, G., and Giannini, C. (1997). Topics in Structural VAR Econometrics. Springer.
- Bjørnland, H. C., and Thorsrud, L. (2015). Applied Time Series for Macroeconomics, Gyldendal Akademisk.
- Gali, J. (1999), Technology, Employment, and the Business Cycle: Do Technology Shocks Explain Aggregate Fluctuations?, American Economic Review, 89, 249-271.
- Gottschalk, J. (2001), An Introduction into the SVAR Methodology: Identification, Interpretation and Limitations of SVAR models, Kiel Working Paper nº 1072
- Kilian, L. (2011), Structural Vector Autoregression, CEPR Discussion Paper Series no 8515.
- Sims, C.A. (1980), Macroeconomics and Reality, Econometrica, 48, 1-48
- Lütkepohl, H. (2005), New Introduction to Multiple Time Series Analysis. Springer: New York.
- Lütkepohl, H. (2011), Vector Autoregressive Models, EUI Working Paper ECO2011/30
- Pfaff, B. (2008a), VAR, SVAR and SVEC Models: Implementation Within R Package vars, Journal of Statistical Software, 27(4)
- Pfaff, B. (2008b), Analysis of Integrated and Cointegrated Time Series with R, Springer
- Pfaff, B. (2014), Package ‘vars’, CRAN R package.
- Stock, J. H. (2008), Recent Developments in Structural VAR Modelling, NBER Summer Institute
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=