Introduction
The following document shows an analysis of the data associated with the coronavirus pandemic (Covid19).
The analysis is divided into two parts, the first comprises general graphs of the data and then a numerical simulation is performed using the logistic growth model (LGM) in order to forecast the possible total number of cases by country.
The data used for this analysis are updated daily and are stored in Data Repository by Johns Hopkins CSSE
Terms used
Recovery ratio (RR)
The proportion of people recovered from a specified disease among all individuals diagnosed with the disease over a certain period of time.
\[RecoveryRatio (RR) = \frac{Recovered}{Confirmed}\]
Case Fatality ratio (CFR)
Case fatality rate, also called case fatality ratio, in epidemiology, the proportion of people who die from a specified disease among all individuals diagnosed with the disease over a certain period of time.
https://www.britannica.com/science/case-fatality-rate
\[Case Fatality Ratio (CFR) = \frac{Deaths}{Confirmed}\]
Logistic Growth Model (LGM)
Clark (2011) propose a new empirical model based on logistic growth models.
A nonlinear model formula including variables and parameters.
\[ProjectedCases = \frac{(K * t ^ n)}{(a + t ^ n)}\]
Where:
Cases = Projected Case
K = Carrying capacity
n = Hyperbolic exponent
a = Constant
t = Time
The best-fit nonlineal model is obtained by an iterative least-squared method.
The logistic growth model was used to project the progression of the disease in certain countries.
The most relevant result of the model corresponds to the projected cases, this term is associated with the maximum number of cases estimated by the model for each country, where the model is executed.
Projected - Confirmed Cases Ratio
Assuming that the total number of projected cases corresponds to the maximum number of cases that would occur in a given country, the projected - confirmed cases ratio is calculated using the following expression.
\[ProjectedConfirmedCases Ratio = 100 - (100 * \frac{(max(Projected Case) - max(Confirmed))}{
max(Projected Case)}\]
Global Case
Average Cases (Last Three Days)


Global Case Summary

China


The Americas
Confirmed Case

Confirmed Case - Average Last Three Days

Confirmed Case - Cases Last Days

Mexico


United State (US)


Argentina


Brazil


Canada


Colombia


Ecuador


Chile


Panama


Peru


Venezuela


Europe
Confirmed Case

Confirmed Case - Average Last Three Days


Italy


Spain


United Kingdom


France


Germany


Netherlands


Switzerland


Norway


Portugal


Other Countries


Japan


Korea, South


Iran


Russia


Israel


References
Source data: https://github.com/CSSEGISandData/COVID-19.git
Clark, A.J. (2011). “Decline Curve Analysis in Unconventional Resource Plays Using Logistic Growth Models.” M.S. Thesis, The University of Texas at Austin, August 2011.
LS0tCnRpdGxlOiAiQ292aWQxOSBQcm9qZWN0ZWQgQ2FzZXMgYnkgQ291bnRyaWVzIgphdXRob3I6ICJBbmRyZXMgUEVOQSBhbmRyZXNwZW5hQGdtYWlsLmNvbSIKZGF0ZTogIjMwLzMvMjAyMCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMgICAgCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKCWVjaG8gPSBUUlVFLAoJbWVzc2FnZSA9IEZBTFNFLAoJd2FybmluZyA9IEZBTFNFCikKYGBgCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKYm9keXsgLyogTm9ybWFsICAqLwogICAgICBmb250LXNpemU6IDE2cHg7CiAgfQp0ZCB7ICAvKiBUYWJsZSAgKi8KICBmb250LXNpemU6IDE0cHg7Cn0KaDEudGl0bGUgewogIGZvbnQtc2l6ZTogMzhweDsKICBjb2xvcjogRGFya1JlZDsKfQpoMSB7IC8qIEhlYWRlciAxICovCiAgZm9udC1zaXplOiAyOHB4OwogIGNvbG9yOiBCbHVlOwp9CmgyIHsgLyogSGVhZGVyIDIgKi8KICAgIGZvbnQtc2l6ZTogMjRweDsKICBjb2xvcjogRGFya0JsdWU7Cn0KaDMgeyAvKiBIZWFkZXIgMyAqLwogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICBjb2xvcjogRGFya0JsdWU7Cn0KY29kZS5yeyAvKiBDb2RlIGJsb2NrICovCiAgICBmb250LXNpemU6IDEycHg7Cn0KcHJlIHsgLyogQ29kZSBibG9jayAtIGRldGVybWluZXMgY29kZSBzcGFjaW5nIGJldHdlZW4gbGluZXMgKi8KICAgIGZvbnQtc2l6ZTogMTRweDsKfQo8L3N0eWxlPgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kcm0obGlzdCA9IGxzKCkpCmxpYnJhcnkoInRpZHl2ZXJzZSIpCmxpYnJhcnkoImNvd3Bsb3QiKQpsaWJyYXJ5KCJtaW5wYWNrLmxtIikKbGlicmFyeSgiYnJvb20iKQpsaWJyYXJ5KCJzaW9wIikKbGlicmFyeSgia2FibGVFeHRyYSIpCmxpYnJhcnkoInBsb3RseSIpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgdXBkYXRlIGRhdGEgd2l0aCBzb21lIGNoYXJnZWQgY29sdW1uIG5hbWVzCgpjb3ZpZDE5IDwtIHJlYWRfY3N2KCJ+L0RvY3VtZW50cy9DT1ZJRC0xOS1tYXN0ZXIvZGF0YS9DT1ZJRC0xOS1tYXN0ZXIgMjAyMC0wMy0zMC9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV9kYWlseV9yZXBvcnRzLzAzLTI5LTIwMjAuY3N2IikKCnNldHdkKCJ+L0RvY3VtZW50cy9DT1ZJRC0xOS1tYXN0ZXIvZGF0YS9DT1ZJRC0xOS1tYXN0ZXIgMjAyMC0wMy0zMC9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3NlcmllcyIpCgp0c3IgPC0gcmVhZF9jc3YoInRpbWVfc2VyaWVzX2NvdmlkMTlfcmVjb3ZlcmVkX2dsb2JhbC5jc3YiKQoKdHNjIDwtIHJlYWRfY3N2KCJ0aW1lX3Nlcmllc19jb3ZpZDE5X2NvbmZpcm1lZF9nbG9iYWwuY3N2IikKCnRzZCA8LSByZWFkX2NzdigidGltZV9zZXJpZXNfY292aWQxOV9kZWF0aHNfZ2xvYmFsLmNzdiIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIycgQHRpdGxlIEEgd3JhbmdsX2NvdmlkMTkgZnVuY3Rpb24KIycgQHBhcmFtIGNvdmlkMTkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF9jb3ZpZDE5CiMnIEBleHBvcnQgd3JhbmdsX2NvdmlkMTkKIycgQGtleXdvcmRzIHdyYW5nbF9jb3ZpZDE5CiMnCndyYW5nbF9jb3ZpZDE5IDwtIGZ1bmN0aW9uKGNvdmlkMTkpIHsKY292aWQxOSAlPiUgCiAgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlX1N0YXRlIiwgCiAgICAgICAgIGNvdW50cnkgPSAiQ291bnRyeV9SZWdpb24iLAogICAgICAgICBsYXN0X3VwZCA9ICJMYXN0X1VwZGF0ZSIpICU+JQogIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oQ29uZmlybWVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICByZWNvdmVyZWQgPSBzdW0oUmVjb3ZlcmVkLCBuYS5ybSA9IFQpLCAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZGVhdGhzID0gc3VtKERlYXRocywgbmEucm0gPSBUKSwKICAgICAgICAgICAgUlIgPSByb3VuZCgxMDAgKiByZWNvdmVyZWQvY29uZmlybWVkLCAwKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGhzL2NvbmZpcm1lZCwgMCkpICAgIAp9CgojJyBAdGl0bGUgQSB3cmFuZ2xfdHNjIGZ1bmN0aW9uCiMnIEBwYXJhbSB0c2MgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF90c2MKIycgQGV4cG9ydCB3cmFuZ2xfdHNjCiMnIEBrZXl3b3JkcyB3cmFuZ2xfdHNjCiMnCndyYW5nbF90c2MgPC0gZnVuY3Rpb24odHNjKSB7CnRzYyAlPiUgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIkNvdW50cnkvUmVnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IExhdCwgbG9uZyA9IExvbmcpICAKfQoKIycgQHRpdGxlIEEgd3JhbmdsX3RzYyBmdW5jdGlvbgojJyBAcGFyYW0gdHNkIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHJldHVybiB3cmFuZ2xfdHNkCiMnIEBleHBvcnQgd3JhbmdsX3RzZAojJyBAa2V5d29yZHMgd3JhbmdsX3RzZAojJwp3cmFuZ2xfdHNkIDwtIGZ1bmN0aW9uKHRzZCkgewp0c2QgJT4lIHJlbmFtZShzdGF0ZSA9ICJQcm92aW5jZS9TdGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9ICJDb3VudHJ5L1JlZ2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICBsYXQgPSBMYXQsIGxvbmcgPSBMb25nKQp9CgojJyBAdGl0bGUgQSB3cmFuZ2xfdHNyIGZ1bmN0aW9uCiMnIEBwYXJhbSB0c3IgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF90c3IKIycgQGV4cG9ydCB3cmFuZ2xfdHNyCiMnIEBrZXl3b3JkcyB3cmFuZ2xfdHNyCiMnCndyYW5nbF90c3IgPC0gZnVuY3Rpb24odHNyKSB7CnRzciAlPiUgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIkNvdW50cnkvUmVnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IExhdCwgbG9uZyA9IExvbmcpCn0KCiMnIEB0aXRsZSBBIHRpZHlfam9pbl9mdW5fbWF4IGJ5IGNvdW50cnkgZnVuY3Rpb24KIycgQHBhcmFtIHRpZHlfam9pbiAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gdGlkeV9qb2luX2Z1bl9tYXgKIycgQGV4cG9ydCB0aWR5X2pvaW5fZnVuX21heAojJyBAa2V5d29yZHMgdGlkeV9qb2luX2Z1bl9tYXgKIycKdGlkeV9qb2luX2Z1bl9tYXggPC0gZnVuY3Rpb24odGlkeV9qb2luKSB7CnRpZHlfam9pbiAlPiUgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKGNvbmZpcm1lZCA9IG1heChjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IG1heChyZWNvdmVyZWQsIG5hLnJtID0gVCksICAgICAgICAgICAgICAgIAogICAgICAgICAgICBkZWF0aHMgPSBtYXgoZGVhdGgsIG5hLnJtID0gVCksCiAgICAgICAgICAgIFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkL2NvbmZpcm1lZCwgMCksCiAgICAgICAgICAgIENGUiA9IHJvdW5kKDEwMCAqIGRlYXRocy9jb25maXJtZWQsIDApKSAlPiUKICBhcnJhbmdlKC1jb25maXJtZWQpICAKfQoKIycgQHRpdGxlIEEgZ2F0aGVyIGZ1bmN0aW9uCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIHZhciAtICB4IGlucHV0IGRhdGEKIycgQHJldHVybiBnYXRoZXJfZnVuCiMnIEBleHBvcnQgZ2F0aGVyX2Z1bgojJyBAa2V5d29yZHMgZ2F0aGVyX2Z1bgojJyAKZ2F0aGVyX2Z1biA8LSBmdW5jdGlvbihkYXRhLCB2YXIpIHsKICB2YXIgPC0gZW5xdW8odmFyKQogIGRhdGEgJT4lIGdhdGhlcihkYXRlLCAhIXZhciwgLWxhdCwgLWxvbmcsIC1zdGF0ZSwgLWNvdW50cnkpICU+JSAgCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUsICIlbS8lZC8leSIpKQp9CgojJyBAdGl0bGUgdGlkeV9qb2luX2Z1bgojJyBAcmV0dXJuIHRpZHlfam9pbgojJyBAZXhwb3J0IHRpZHlfam9pbgojJyBAa2V5d29yZHMgdGlkeV9qb2luX2Z1bgojJyAKdGlkeV9qb2luX2Z1biA8LSBmdW5jdGlvbigpIHsKICAKIyBSdW4gZ2F0aGVyIGZ1bmN0aW9uCnRzY190aWR5IDwtIGdhdGhlcl9mdW4odHNjLCBjb25maXJtZWQpCnRzZF90aWR5IDwtIGdhdGhlcl9mdW4odHNkLCBkZWF0aCkKdHNyX3RpZHkgPC0gZ2F0aGVyX2Z1bih0c3IsIHJlY292ZXJlZCkKCiMgSm9pbiBkYXRhIGZyYW1lcwp0aWR5X2pvaW4gPC0gZnVsbF9qb2luKHRzY190aWR5LCB0c2RfdGlkeSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJjb3VudHJ5IiwgImxhdCIsICJsb25nIiwgImRhdGUiKSkgCnRpZHlfam9pbiA8LSBmdWxsX2pvaW4odGlkeV9qb2luLCB0c3JfdGlkeSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJjb3VudHJ5IiwgImxhdCIsICJsb25nIiwgImRhdGUiKSkgCgojIENvbnZlcnQgdG8gbnVtZXJpYwp0aWR5X2pvaW4kY29uZmlybWVkIDwtIGFzLm51bWVyaWModGlkeV9qb2luJGNvbmZpcm1lZCkKdGlkeV9qb2luJGRlYXRoIDwtIGFzLm51bWVyaWModGlkeV9qb2luJGRlYXRoKQp0aWR5X2pvaW4kcmVjb3ZlcmVkIDwtIGFzLm51bWVyaWModGlkeV9qb2luJHJlY292ZXJlZCkKCiMgQ2FsY3VsYXRlIGFkZGl0aW9uYWwgdmFyaWFibGVzCnRpZHlfam9pbiA8LSB0aWR5X2pvaW4gJT4lIAojIFJlY292ZXJ5IFJhdGlvICglKSAmIENhc2UgRmF0YWxpdHkgUmF0aW8gKCUpICAgICAgICAgCiAgbXV0YXRlKFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkL2NvbmZpcm1lZCwgMCksCiAgICAgICBDRlIgPSByb3VuZCgxMDAgKiBkZWF0aC9jb25maXJtZWQsIDEpKSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUgCiMgbWVhbiBjb25maXJtZWQgY2FzZSBsYXN0IDMgZGF5cyAgICAgICAgCiAgbXV0YXRlKGMzZCA9IG1lYW4odGFpbChjb25maXJtZWQsIDNMKSksCiAgICAgICAgIGQzZCA9IG1lYW4odGFpbChkZWF0aCwgM0wpKSwKICAgICAgICAgcjNkICA9IG1lYW4odGFpbChyZWNvdmVyZWQsIDNMKSksCiAgICAgICAgIHN0YXRlID0gaWZlbHNlKGlzLm5hKHN0YXRlKSwgImFsbHMiLCBzdGF0ZSksCiAgICAgICAgIENvbmZpcm1lZF9kYXkgPSAoY29uZmlybWVkIC0gbGFnKGNvbmZpcm1lZCwgMUwpKSkgJT4lCiAgdW5ncm91cCgpCn0KCiMnIEB0aXRsZSBwbG90X2VucXVvIGZ1bmN0aW9uCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIHggLSAgeCBpbnB1dCBkYXRhCiMnIEBwYXJhbSB5IC0gIHkgaW5wdXQgZGF0YQojJyBAcGFyYW0gVGl0bGUgLSAgdGl0bGUKIycgQHJldHVybiBwbG90CiMnIEBleHBvcnQgcGxvdCBwbG90IGdyYXBoCiMnIEBrZXl3b3JkcyBwbG90CiMnIApwbG90X2VucXVvIDwtIGZ1bmN0aW9uKC5kYXRhLCB4LCB5LCBUaXRsZSkKewogIHggPC0gZW5xdW8oeCkKICB5IDwtIGVucXVvKHkpCiAgZ2dwbG90KC5kYXRhLCBhZXMoISF4LCAhIXkpKSArCiAgICBnZW9tX3BvaW50KGFlcyhhbHBoYSA9IDAuNiwgY29sb3IgPSAhIXkpKSArIAogICAgZ2VvbV9saW5lKGFlcyhhbHBoYSA9IDAuNiwgY29sb3IgPSAhIXkpKSArCiAgICBsYWJzKHRpdGxlID0gVGl0bGUsIHggPSAiIiwgeSA9ICIiKSAgKwogICAgdGhlbWVfbWluaW1hbF9ncmlkKDEyKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCn0KCiMnIEB0aXRsZSBnbG9iYWxfY2FzZSBmdW5jdGlvbgojJyBAcGFyYW0gZGF0YSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSBjb25maXJtZWQgLSAgY29uZmlybWVkIGlucHV0IGRhdGEKIycgQHBhcmFtIHJlY292ZXJlZCAtICByZWNvdmVyZWQgaW5wdXQgZGF0YQojJyBAcGFyYW0gZGVhdGggLSAgZGVhdGhzIGlucHV0IGRhdGEKIycgQHJldHVybiBnbG9iYWxfY2FzZQojJyBAZXhwb3J0IGdsb2JhbF9jYXNlIHBsb3QgZ3JhcGgKIycgQGtleXdvcmRzIGdsb2JhbF9jYXNlCiMnIApnbG9iYWxfY2FzZSA8LSBmdW5jdGlvbihkYXRhLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpIHsKICBjb25maXJtZWQgPC0gZW5xdW8oY29uZmlybWVkKQogIHJlY292ZXJlZCA8LSBlbnF1byhyZWNvdmVyZWQpCiAgZGVhdGggPC0gZW5xdW8oZGVhdGgpICAgIAogIApkYXRhICU+JSAKICBncm91cF9ieShkYXRlKSAlPiUKICBzdW1tYXJpc2UoY29uZmlybWVkID0gc3VtKCEhY29uZmlybWVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICByZWNvdmVyZWQgPSBzdW0oISFyZWNvdmVyZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIGRlYXRoID0gc3VtKCEhZGVhdGgsIG5hLnJtID0gVCksIAogICAgICAgICAgICBSUiA9IHJvdW5kKDEwMCAqIHJlY292ZXJlZCAvIGNvbmZpcm1lZCwgMSksCiAgICAgICAgICAgIENGUiA9IHJvdW5kKDEwMCAqIGRlYXRoIC8gY29uZmlybWVkLCAxKSkgCn0KCiMnIEB0aXRsZSBwbG90X2dyaWRfZ2xvYmFsCiMnIEBwYXJhbSB0aWR5X2pvaW4gLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHBsb3RfZ3JpZF9nbG9iYWwKIycgQGV4cG9ydCBwbG90X2dyaWRfZ2xvYmFsCiMnIEBrZXl3b3JkcyBwbG90X2dyaWRfZ2xvYmFsCiMnIApwbG90X2dyaWRfZ2xvYmFsIDwtIGZ1bmN0aW9uKHRpZHlfam9pbil7CiAgZGF0YSA8LSBnbG9iYWxfY2FzZSh0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgCiAgcDEgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBjb25maXJtZWQsICJDb25maXJtZWQiKQogIHAyIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgcmVjb3ZlcmVkLCAiUmVjb3ZlcmVkIikKICBwMyA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIGRlYXRoLCAiRGVhdGhzIikKICBwNCA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIFJSLCAiUmVjb3ZlcnkgUmF0aW8gKCUpIikKICBwNSA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIENGUiwgIkNhc2UgRmF0YWxpdHkgUmF0aW8gKCUpIikKICAKdGl0bGVfZ2cgPC0gZ2dwbG90KCkgKyAKICBsYWJzKHRpdGxlID0gIkdsb2JhbCBDYXNlcyIsIAogICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiUmVwb3J0IGRhdGU6IiwgU3lzLkRhdGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgbWluKGRhdGEkZGF0ZVtkYXRhJGNvbmZpcm1lZCA+PSAxXSwgbmEucm0gPSBUKSkpICsKICB0aGVtZV9taW5pbWFsX2dyaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAKCiAgcGxvdF9ncmlkKHRpdGxlX2dnLCBwMSwgcDIsIHAzLCBwNCwgcDUsIG5jb2wgPSAzKSAgIAp9CgojJyBAdGl0bGUgcGxvdF9ncmlkX2NvdW50cnkKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcGFyYW0gdGlkeV9qb2luIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHJldHVybiBwbG90X2dyaWRfY291bnRyeQojJyBAZXhwb3J0IHBsb3RfZ3JpZF9jb3VudHJ5CiMnIEBrZXl3b3JkcyBwbG90X2dyaWRfY291bnRyeQojJyAgIApwbG90X2dyaWRfY291bnRyeSA8LSBmdW5jdGlvbihjb3VudHJ5LCB0aWR5X2pvaW4pewogIGNvdW50cnkgPC0gZW5xdW8oY291bnRyeSkgIAogIGRhdGEgPC0gY291bnRyeV9jYWxjKCEhY291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpIAogIHAxIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgY29uZmlybWVkLCAiQ29uZmlybWVkIikKICBwMiA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIENvbmZpcm1lZF9kYXksICJDb25maXJtZWRfZGF5IikgIAogIHAzIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgZGVhdGgsICJEZWF0aHMiKQogIHA0IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgUlIsICJSZWNvdmVyeSBSYXRpbyAoJSkiKQogIHA1IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgQ0ZSLCAiQ2FzZSBGYXRhbGl0eSBSYXRpbyAoJSkiKQogIAojIEZpcnN0IGNhc2UgZGF0ZQp0aXRsZV9nZyA8LSBnZ3Bsb3QoKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZSgiQ291bnRyeToiLCBDb3VudHJ5KSwKICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlJlcG9ydCBkYXRlOiIsIFN5cy5EYXRlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJcbkZpcnN0IGNhc2UgZGF0ZToiLCAKICAgICAgICAgICAgICAgICAgICAgICAgbWluKGRhdGEkZGF0ZVtkYXRhJGNvbmZpcm1lZCA+PSAxXSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgIlxuQ29uZmlybWVkLmxhc3QuMy5kYXlzOiIsIAogICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtZWFuKGhlYWQoZGF0YSRDb25maXJtZWRfZGF5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCwgMykpLCAwKSksCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIiIsIHkgPSAiIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIAoKICBwbG90X2dyaWQodGl0bGVfZ2csIHAxLCBwMiwgcDMsIHA0LCBwNSwgbmNvbCA9IDMpICAgICAKfQoKIycgQHRpdGxlIENvdW50cnkgQ2FzZSBDYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcGFyYW0gZGF0YSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSBjb25maXJtZWQgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gcmVjb3ZlcmVkIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIGRlYXRoIC0gIGlucHV0IGRhdGEKIycgQHJldHVybiBjb3VudHJ5X2NhbGMKIycgQGV4cG9ydCBjb3VudHJ5X2NhbGMKIycgQGtleXdvcmRzIGNvdW50cnlfY2FsYwojJyAKY291bnRyeV9jYWxjIDwtIGZ1bmN0aW9uKGNvdW50cnksIGRhdGEsIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgewogIGNvdW50cnkgPC0gZW5xdW8oY291bnRyeSkKICBjb25maXJtZWQgPC0gZW5xdW8oY29uZmlybWVkKQogIHJlY292ZXJlZCA8LSBlbnF1byhyZWNvdmVyZWQpCiAgZGVhdGggPC0gZW5xdW8oZGVhdGgpICAgIAogIApkYXRhICU+JSBmaWx0ZXIoY291bnRyeSA9PSAhIWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGRhdGUpICU+JQogIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oISFjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IHN1bSghIXJlY292ZXJlZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgZGVhdGggPSBzdW0oISFkZWF0aCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkIC8gY29uZmlybWVkLCAxKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGggLyBjb25maXJtZWQsIDEpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKENvbmZpcm1lZF9kYXkgPSAoY29uZmlybWVkIC0gbGFnKGNvbmZpcm1lZCwgMUwpKSkgJT4lCiAgYXJyYW5nZShkZXNjKGRhdGUpKSAgCn0gICAgCgojJyBAdGl0bGUgcmVzdW1lIENhbGN1bGF0aW9ucwojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gcmVzdW1lCiMnIEBleHBvcnQgcmVzdW1lCiMnIEBrZXl3b3JkcyByZXN1bWUKIycgCnJlc3VtZSA8LSBmdW5jdGlvbihDb3VudHJ5KSB7CiAgCnRpZHlfam9pbiAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gQ291bnRyeSAmIGRhdGUgPT0gbWF4KGRhdGUpKSAlPiUgCiAgc3VtbWFyaXNlKGRhdGUgPSBtYXgoZGF0ZSksCiAgICAgICAgICAgIENvbmZpcm1lZCA9IHN1bShjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIFJlY292ZXJlZCA9IHN1bShyZWNvdmVyZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIERlYXRoID0gc3VtKGRlYXRoLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgQ0ZSID0gaGVhZChDRlIsIDEpKQp9CgojJyBAdGl0bGUgbG9naXN0aWNfZ3Jvd3RoX2RhdGFfcHJlcCBjYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGxvZ2lzdGljX2dyb3d0aF9kYXRhX3ByZXAKIycgQGV4cG9ydCBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwCiMnIEBrZXl3b3JkcyBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwCiMnIApsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwIDwtIGZ1bmN0aW9uKENvdW50cnksIGN1dG9mZikgewogIAojIFByZXBhcmUgZGF0YSAgCnRpZHlfam9pbiAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gQ291bnRyeSkgJT4lIAogIGdyb3VwX2J5KGNvdW50cnksIGRhdGUpICU+JSAKICBzdW1tYXJpc2UoY29uZmlybWVkID0gc3VtKGNvbmZpcm1lZCwgbmEucm0gPSBUKSkgJT4lCiAgZHBseXI6OmZpbHRlcihjb25maXJtZWQgPiBjdXRvZmYpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6bXV0YXRlKHQgPSAxOm4oKSkKfQoKIycgQHRpdGxlIGxvZ2lzdGljX2dyb3d0aF9tb2RlbCBDYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gZGF0YSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSBjdXRvZmYgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gdHJhY2UgLSAgaW5wdXQgZGF0YSB0cmFjZSBtb2RlbAojJyBAcGFyYW0gdG1heCAtICBpbnB1dCBkYXRhCiMnIEByZXR1cm4gbG9naXN0aWNfZ3Jvd3RoX21vZGVsCiMnIEBleHBvcnQgbG9naXN0aWNfZ3Jvd3RoX21vZGVsCiMnIEBrZXl3b3JkcyBsb2dpc3RpY19ncm93dGhfbW9kZWwKIycgCmxvZ2lzdGljX2dyb3d0aF9tb2RlbCA8LSBmdW5jdGlvbihDb3VudHJ5LCBjdXRvZmYsIHRyYWNlLCB0bWF4KSB7CgojIFByZXBhcmUgZGF0YQpkYXRhIDwtIGxvZ2lzdGljX2dyb3d0aF9kYXRhX3ByZXAoQ291bnRyeSwgY3V0b2ZmKSAgCiAgCiMgU2V0IGlucHV0IG1vZGVsIHBhcmFtZXRlcnMgICAgICAKc2V0LnNlZWQoMTcpCm1heGl0ZXIgPC0gMTAyNApwYXJtcyA8LSBjKEsgPSBtYXgoZGF0YSRjb25maXJtZWQsIG5hLnJtID0gVCksIAogICAgICAgICAgIGEgPSBtYXgoZGF0YSRjb25maXJtZWQsIG5hLnJtID0gVCksIAogICAgICAgICAgIG4gPSAxKQpjb250cm9sIDwtIGMobmxzLmNvbnRyb2wobWF4aXRlciA9IG1heGl0ZXIpKSAgICAKICAgIAojIFJ1biBMb2dpc3RpYyBtb2RlbCAgIAp0cnlDYXRjaCh7Cm1vZGVsIDwtIG1pbnBhY2subG06Om5sc0xNKGNvbmZpcm1lZCB+IChLICogdCBeIG4pIC8gKGEgKyB0IF4gbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHBhcm1zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZSA9IHRyYWNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEpCgojIFN0b3JlIGxvZ2lzdGljIHBhcmFtZXRlciByZXN1bHRzCm1vZGVsX3Bhcm0gPC0gZGF0YS5mcmFtZShjb3VudHJ5ID0gQ291bnRyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBLID0gY29lZihtb2RlbClbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBhID0gY29lZihtb2RlbClbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICBuID0gY29lZihtb2RlbClbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgojIENyZWF0ZSB0aW1lIHZlY3RvciBhIHNsaWdodGx5IGxhcmdlciB0byByZWFsIGRhdGEgCnQgPC0gMTp0bWF4CgojIENhbGN1bGF0ZSBjb25maXJtZWRfTEdNIGZyb20gbW9kZWwKUHJvamVjdGVkX0xHTSA9IChtb2RlbF9wYXJtJEsgKiB0IF4gbW9kZWxfcGFybSRuKSAvIAogICAgICAgICAgICAgICAgICAobW9kZWxfcGFybSRhICsgdCBeIG1vZGVsX3Bhcm0kbikKCiMgQ3JlYXRlIGRhdGEgdG8gc3RvcmUgTEdNIGNhbGN1bGF0aW9uCmZvbyA8LSBkYXRhX2ZyYW1lKHQgPSB0LCAKICAgICAgICAgICAgICAgICAgUHJvamVjdGVkX0xHTSA9IFByb2plY3RlZF9MR00gICAgICAgICAgICAgICAgIAopCgojIEpvaW4gY2FsY3VsYXRlIGRhdGEgd2l0aCByZWFsIGRhdGEKZGF0YSA8LSBsZWZ0X2pvaW4oZm9vLCBkYXRhLCBieSA9ICJ0IikKCiMgQ3JlYXRlIGxhYmVsIGRhdGEgZnJhbWUKYW5ub3RhdGlvbiA8LSBkYXRhLmZyYW1lKAogIHggPSB0bWF4ICsgNSwKICB5ID0gbWF4KGRhdGEkUHJvamVjdGVkX0xHTSwgbmEucm0gPSBUKSwKICBsYWJlbCA9IHBhc3RlKCJQcm9qZWN0ZWQgY2FzZXMgPSIsIAogICAgICAgICAgICAgICAgcm91bmQobW9kZWxfcGFybSRLLCAwKSksCiMgUHJvamVjdGVkIC0gQ29uZmlybWVkIENhc2VzIFJhdGlvIGNhbGN1bGF0aW9uICAKICByYXRpbyA9IHJvdW5kKDEwMCAtICgxMDAgKiAKICAgICAgICAgICAgICAgICAgKG1heChtb2RlbF9wYXJtJEssIG5hLnJtID0gVCkgLSAKICAgICAgICAgICAgICAgICAgbWF4KGRhdGEkY29uZmlybWVkLCBuYS5ybSA9IFQpKSAvIAogICAgICAgICAgICAgICAgICByb3VuZChtb2RlbF9wYXJtJEssIDApKSkpCgojIFByZXBhcmUgb3V0cHV0IGRhdGEgZnJhbWUKb3V0cHV0IDwtIGxpc3QoIm1vZGVsIiA9IG1vZGVsLCAKICAgICAgICAgICAgICAgImRhdGEiID0gZGF0YSwgCiAgICAgICAgICAgICAgICJhbm5vdGF0aW9uIiA9IGFubm90YXRpb24pCiMgT3V0cHV0IHJlc3VsdHMKcmV0dXJuKG91dHB1dCkKfSwgZXJyb3IgPSBmdW5jdGlvbihlKXtjYXQoIkVSUk9SIDoiLGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfQoKIycgQHRpdGxlIGxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90CiMnIEBwYXJhbSBjb3VudHJ5IC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIGRhdGExIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHQgLSAgaW5wdXQgZGF0YSB0aW1lCiMnIEBwYXJhbSB5X3Byb3kgLSAgaW5wdXQgeSBwcm95ZWN0ZWQKIycgQHBhcmFtIHlfcHJvZiAtICBpbnB1dCBkYXRhIAojJyBAcGFyYW0gZGF0YTIgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0geCAtICBpbnB1dCBkYXRhIHgKIycgQHBhcmFtIHkgLSAgaW5wdXQgZGF0YSB5CiMnIEBwYXJhbSBsYWJlbCAtICBpbnB1dCBkYXRhIGxhYmVsCiMnIEByZXR1cm4gbG9naXN0aWNfZ3Jvd3RoX21vZGVsCiMnIEBleHBvcnQgbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QKIycgQGtleXdvcmRzIGxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90CiMnCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90IDwtIGZ1bmN0aW9uKC5kYXRhMSwgdCwgeV9wcm95LCB5X2NvbmYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YTIsIHgsIHksIGxhYmVsKSB7CnQgPC0gZW5xdW8odCkgIAp5X3Byb3kgPC0gZW5xdW8oeV9wcm95KQp5X2NvbmYgPC0gZW5xdW8oeV9jb25mKQp4IDwtIGVucXVvKHgpCnkgPC0gZW5xdW8oeSkKbGFiZWwgPC0gZW5xdW8obGFiZWwpCgpnZ3Bsb3QoZGF0YSA9IC5kYXRhMSkgKwogIGdlb21fbGluZShhZXMoISF0LCAhIXlfcHJveSwgY29sb3VyID0gIlByb2plY3RlZCIpKSArICAKICBnZW9tX3BvaW50KGFlcyghIXQsICEheV9wcm95LCBjb2xvdXIgPSAiUHJvamVjdGVkIikpICsKICBnZW9tX3BvaW50KGRhdGEgPSAuZGF0YTEsIAogICAgICAgICAgICAgYWVzKCEhdCwgISF5X2NvbmYsIGNvbG91ciA9ICJDb25maXJtZWQiKSkgKwogIGdlb21fbGFiZWwoZGF0YSA9IC5kYXRhMiwgCiAgICAgICAgICAgIGFlcyggeCA9ICEheCwgeSA9ICEheSwgbGFiZWwgPSAhIWxhYmVsKSwgCiAgICAgICAgICAgIGZpbGwgPSAibGlnaHRibHVlIiwKICAgICAgICAgICAgbnVkZ2VfeCA9IC0yNSwgICAgICAgICAgICAKICAgICAgICAgICAgc2l6ZSA9IDUuMCwKICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoQ291bnRyeSwgIi0gQ292aWQtMTkgLSBMb2dpc3RpYyBHcm93dGggTW9kZWwgKExHTSkiKSwKICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIkNvbmZpcm1lZCAvIFByb2plY3RlZCBDYXNlcyBSYXRpbyA6IiwKICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEyJHJhdGlvLCAiJSIpLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgCiAgICAgICB5ID0gIk51bWJlciBvZiBDb25maXJtZWQgQ2FzZXMiKSArCiAgdGhlbWVfbWluaW1hbF9ncmlkKDE0KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICAgIAp9IAoKIycgQHRpdGxlIGJhcl9ncmFwaAojJyBAcGFyYW0gdGlkeV9qb2luIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHkgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gdGl0bGUgLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGJhcl9ncmFwaAojJyBAZXhwb3J0IGJhcl9ncmFwaAojJyBAa2V5d29yZHMgYmFyX2dyYXBoCiMnIApiYXJfZ3JhcGggPC0gZnVuY3Rpb24odGlkeV9qb2luLCB5LCB0aXRsZSwgc3VidGl0bGUpIHsKeSA8LSBlbnF1byh5KSAgCnRpZHlfam9pbiAlPiUgZ3JvdXBfYnkoY291bnRyeSkgJT4lIAogIHN1bW1hcmlzZSh5ID0gbWF4KCEheSkpICU+JSAKICB0b3BfbigxMCkgJT4lIGFycmFuZ2UoeSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYXNfZmFjdG9yKGNvdW50cnkpLCB5ID0geSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgCiAgICAgICAgICAgZmlsbCA9ICJsaWdodGJsdWUiLCAKICAgICAgICAgICBhbHBoYSA9IDAuNikgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoeSwgMCkpLCAKICAgICAgICAgICAgaGp1c3QgPSAicmlndGgiLAogICAgICAgICAgICBzaXplID0gNC41LAogICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIiIsIHkgPSAiIikgKwogIGNvb3JkX2ZsaXAoKSArIHRoZW1lX21pbmltYWxfZ3JpZCgxNCkgIAp9CgojJyBAdGl0bGUgcGxvdGx5CiMnIEBwYXJhbSB0aWR5X2pvaW4gLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0geSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSB0aXRsZSAtICBpbnB1dCBkYXRhCiMnIEByZXR1cm4gcGxvdGx5CiMnIEBleHBvcnQgcGxvdGx5CiMnIEBrZXl3b3JkcyBwbG90bHkKIycgCnBsb3RseSA8LSBmdW5jdGlvbihkYXRhLCB0LCBjb25maXJtZWQsIFByb2plY3RlZF9MR00sIHRpdGxlKSB7CmZpZyA8LSBwbG90X2x5KGRhdGEsIHggPSB0KQpmaWcgPC0gZmlnICU+JSBhZGRfdHJhY2UoeSA9IGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ2NvbmZpcm1lZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ2xpbmVzK21hcmtlcnMnKQpmaWcgJT4lIGFkZF90cmFjZSh5ID0gUHJvamVjdGVkX0xHTSwgCiAgICAgICAgICAgICAgICAgIG5hbWUgPSAnUHJvamVjdGVkX0xHTScsIAogICAgICAgICAgICAgICAgICBtb2RlID0gJ2xpbmVzK21hcmtlcnMnKSAlPiUgCiAgbGF5b3V0KHRpdGxlID0gdGl0bGUpCn0KCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBSdW4gdGlkeV9qb2luX2Z1biBmdW5jdGlvbgpjb3ZpZDE5IDwtIHdyYW5nbF9jb3ZpZDE5KGNvdmlkMTkpCnRzYyA8LSB3cmFuZ2xfdHNjKHRzYykKdHNkIDwtIHdyYW5nbF90c2ModHNkKQp0c3IgPC0gd3JhbmdsX3RzYyh0c3IpCnRpZHlfam9pbiA8LSB0aWR5X2pvaW5fZnVuKCkKYGBgCgojIEludHJvZHVjdGlvbiAgCgpUaGUgZm9sbG93aW5nIGRvY3VtZW50IHNob3dzIGFuIGFuYWx5c2lzIG9mIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29yb25hdmlydXMgcGFuZGVtaWMgKENvdmlkMTkpLgoKVGhlIGFuYWx5c2lzIGlzIGRpdmlkZWQgaW50byB0d28gcGFydHMsIHRoZSBmaXJzdCBjb21wcmlzZXMgZ2VuZXJhbCBncmFwaHMgb2YgdGhlIGRhdGEgYW5kIHRoZW4gYSBudW1lcmljYWwgc2ltdWxhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIGxvZ2lzdGljIGdyb3d0aCBtb2RlbCAoTEdNKSBpbiBvcmRlciB0byBmb3JlY2FzdCB0aGUgcG9zc2libGUgdG90YWwgbnVtYmVyIG9mIGNhc2VzIGJ5IGNvdW50cnkuICAKClRoZSBkYXRhIHVzZWQgZm9yIHRoaXMgYW5hbHlzaXMgYXJlIHVwZGF0ZWQgZGFpbHkgYW5kIGFyZSBzdG9yZWQgaW4gKipEYXRhIFJlcG9zaXRvcnkgYnkgSm9obnMgSG9wa2lucyBDU1NFKioKCiMgVGVybXMgdXNlZCAgICAKCiMjIyBSZWNvdmVyeSByYXRpbyAoUlIpICAgICAKClRoZSBwcm9wb3J0aW9uIG9mIHBlb3BsZSByZWNvdmVyZWQgZnJvbSBhIHNwZWNpZmllZCBkaXNlYXNlIGFtb25nIGFsbCBpbmRpdmlkdWFscyBkaWFnbm9zZWQgd2l0aCB0aGUgZGlzZWFzZSBvdmVyIGEgY2VydGFpbiBwZXJpb2Qgb2YgdGltZS4gICAgCgokJFJlY292ZXJ5UmF0aW8gKFJSKSA9IFxmcmFje1JlY292ZXJlZH17Q29uZmlybWVkfSQkICAKCiMjIyBDYXNlIEZhdGFsaXR5IHJhdGlvIChDRlIpICAgIAoKQ2FzZSBmYXRhbGl0eSByYXRlLCBhbHNvIGNhbGxlZCBjYXNlIGZhdGFsaXR5IHJhdGlvLCBpbiBlcGlkZW1pb2xvZ3ksIHRoZSBwcm9wb3J0aW9uIG9mIHBlb3BsZSB3aG8gZGllIGZyb20gYSBzcGVjaWZpZWQgZGlzZWFzZSBhbW9uZyBhbGwgaW5kaXZpZHVhbHMgZGlhZ25vc2VkIHdpdGggdGhlIGRpc2Vhc2Ugb3ZlciBhIGNlcnRhaW4gcGVyaW9kIG9mIHRpbWUuICAKCmh0dHBzOi8vd3d3LmJyaXRhbm5pY2EuY29tL3NjaWVuY2UvY2FzZS1mYXRhbGl0eS1yYXRlCgokJENhc2UgRmF0YWxpdHkgUmF0aW8gKENGUikgPSBcZnJhY3tEZWF0aHN9e0NvbmZpcm1lZH0kJCAgCgojIyMgTG9naXN0aWMgR3Jvd3RoIE1vZGVsIChMR00pICAgICAgCgpDbGFyayAoMjAxMSkgcHJvcG9zZSBhIG5ldyBlbXBpcmljYWwgbW9kZWwgYmFzZWQgb24gbG9naXN0aWMgZ3Jvd3RoIG1vZGVscy4gIAoKQSBub25saW5lYXIgbW9kZWwgZm9ybXVsYSBpbmNsdWRpbmcgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzLiAgCgokJFByb2plY3RlZENhc2VzID0gXGZyYWN7KEsgKiB0IF4gbil9eyhhICsgdCBeIG4pfSQkICAgIAoKV2hlcmU6ICAKCkNhc2VzID0gUHJvamVjdGVkIENhc2UgICAKSyA9IENhcnJ5aW5nIGNhcGFjaXR5ICAKbiA9IEh5cGVyYm9saWMgZXhwb25lbnQgIAphID0gQ29uc3RhbnQgIAp0ICA9IFRpbWUgIAoKVGhlIGJlc3QtZml0IG5vbmxpbmVhbCBtb2RlbCBpcyBvYnRhaW5lZCBieSBhbiBpdGVyYXRpdmUgbGVhc3Qtc3F1YXJlZCBtZXRob2QuCgpUaGUgbG9naXN0aWMgZ3Jvd3RoIG1vZGVsIHdhcyB1c2VkIHRvIHByb2plY3QgdGhlIHByb2dyZXNzaW9uIG9mIHRoZSBkaXNlYXNlIGluIGNlcnRhaW4gY291bnRyaWVzLgoKVGhlIG1vc3QgcmVsZXZhbnQgcmVzdWx0IG9mIHRoZSBtb2RlbCBjb3JyZXNwb25kcyB0byB0aGUgKipwcm9qZWN0ZWQgY2FzZXMqKiwgdGhpcyB0ZXJtIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2FzZXMgZXN0aW1hdGVkIGJ5IHRoZSBtb2RlbCBmb3IgZWFjaCBjb3VudHJ5LCB3aGVyZSB0aGUgbW9kZWwgaXMgZXhlY3V0ZWQuICAKCiMjIyBQcm9qZWN0ZWQgLSBDb25maXJtZWQgQ2FzZXMgUmF0aW8gIAoKQXNzdW1pbmcgdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mICoqcHJvamVjdGVkIGNhc2VzKiogY29ycmVzcG9uZHMgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNhc2VzIHRoYXQgd291bGQgb2NjdXIgaW4gYSBnaXZlbiBjb3VudHJ5LCB0aGUgcHJvamVjdGVkIC0gY29uZmlybWVkIGNhc2VzIHJhdGlvIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBleHByZXNzaW9uLgoKJCRQcm9qZWN0ZWRDb25maXJtZWRDYXNlcyBSYXRpbyA9IDEwMCAtICgxMDAgKiBcZnJhY3sobWF4KFByb2plY3RlZCBDYXNlKSAtIG1heChDb25maXJtZWQpKX17IAogICAgICAgICAgICAgICAgICBtYXgoUHJvamVjdGVkIENhc2UpfSQkCiAgICAgICAgICAgICAgICAgIAojIEdsb2JhbCBDYXNlICAKCiMjIEF2ZXJhZ2UgQ2FzZXMgKExhc3QgVGhyZWUgRGF5cykKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEJhciBncmFwaCBBdmVyYWdlIENvbmZpcm1lZCBDYXNlcyAoTGFzdCB0aHJlZSBkYXlzKQpiYXJfZ3JhcGgodGlkeV9qb2luLCBjM2QsIAogICAgICAgICAgICAgICAgICAiR2xvYmFsIENhc2VzIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgIkF2ZXJhZ2UgTGFzdCBUaHJlZSBEYXlzIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYmFyX2dyYXBoKHRpZHlfam9pbiwgZDNkLCAKICAgICAgICAgICAgICAgICAgIkdsb2JhbCBDYXNlcyAtIERlYXRocyIsIAogICAgICAgICAgICAgICAgICAiQXZlcmFnZSBMYXN0IFRocmVlIERheXMiKQpgYGAKCiMjIEdsb2JhbCBDYXNlIFN1bW1hcnkgIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY292aWQxOQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGxvdF9ncmlkX2dsb2JhbCh0aWR5X2pvaW4pCmBgYAoKIyMgQ291bnRyeSBDYXNlcwoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdGlkeV9qb2luX2Z1bl9tYXgodGlkeV9qb2luKQpgYGAKCiMjIENoaW5hICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNoaW5hIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSA1MDAsIHRyYWNlID0gRiwgdG1heCA9IDYwKQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIFRoZSBBbWVyaWNhcyAgCgojIyBDb25maXJtZWQgQ2FzZQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkVjdWFkb3J8Q2hpbGV8UGVydXxQYW5hbWF8QXJnZW50aW5hfENvbG9tYmlhfEJyYXppbHxNZXhpY298VmVuZXp1ZWxhIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjb25maXJtZWQsICAKICAgICAgICAgICAgICAgICAgIlRoZSBBbWVyaWNhcyAtIENvbmZpcm1lZCBDYXNlcyIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiTnVtYmVyIG9mIENhc2VzIiwgU3lzLkRhdGUoKSkpCmBgYAoKIyMgQ29uZmlybWVkIENhc2UgLSBBdmVyYWdlIExhc3QgVGhyZWUgRGF5cwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkVjdWFkb3J8Q2hpbGV8UGVydXxQYW5hbWF8QXJnZW50aW5hfENvbG9tYmlhfEJyYXppbHxNZXhpY298VmVuZXp1ZWxhIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjM2QsICAKICAgICAgICAgICAgICAgICAgIlRoZSBBbWVyaWNhcyAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgIHBhc3RlKCJBdmVyYWdlIExhc3QgVGhyZWUgRGF5cyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIENvbmZpcm1lZCBDYXNlIC0gQ2FzZXMgTGFzdCBEYXlzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiRWN1YWRvcnxDaGlsZXxQZXJ1fFBhbmFtYXxBcmdlbnRpbmF8Q29sb21iaWF8QnJhemlsfE1leGljb3xWZW5lenVlbGEiKQpmb28gPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGFycmFuZ2UoZGVzYyhkYXRlKSkKYmFyX2dyYXBoKGZvbywgaGVhZChDb25maXJtZWRfZGF5LCAxKSwgIAogICAgICAgICAgICAgICAgICAiVGhlIEFtZXJpY2FzIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIkNhc2VzIExhc3QgRGF5cyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIE1leGljbyAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJNZXhpY28iCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDYsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA1MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCnBsb3RseShtbyRkYXRhLCB+dCwgfmNvbmZpcm1lZCwgflByb2plY3RlZF9MR00sIAogICAgICAgcGFzdGUoQ291bnRyeSwgIi0gTW9kZWwgUmVzdWx0cyAtIiwgbW8kYW5ub3RhdGlvbiRsYWJlbCkpCmBgYAoKIyMgTWV4aWNvICYgT3RoZXIgQ291bnRyaWVzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfEtvcmVhLCBTb3V0aHxQZXJ1fEFyZ2VudGluYXxDaGlsZXxDb2xvbWJpYSIpCnRpdGxlIDwtICJNZXhpY28gYW5kIE90aGVyIENvdW50cmllcyIKc3VidGl0bGUgPC0gIkN1bW11bGF0ZWQgQ29uZmlybWVkIENhc2VzIgojIFNlbGVjdCBkYXRhCmRmIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKSAlPiUKICBmaWx0ZXIoQ29uZmlybWVkX2RheSA+PSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZGF0ZSwgY29uZmlybWVkKSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtZGF0ZSwgLWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShkYXkgPSAxOm4oKSkKCiMgUGxvdApnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF5LCB5ID0gdmFsdWUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGNvdW50cnkpKSArICAgCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKyAgICAKICB0aGVtZV9taW5pbWFsX2dyaWQoMTMpICsgIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gIk51bWJlciBvZiBDYXNlcyIpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkJyYXppbHxNZXhpY298UGVydXxBcmdlbnRpbmF8Q2hpbGV8S29yZWEsIFNvdXRofEVjdWFkb3IiKQp0aXRsZSA8LSAiTWV4aWNvIGFuZCBPdGhlciBDb3VudHJpZXMiCnN1YnRpdGxlIDwtICJDdW11bGF0ZWQgQ29uZmlybWVkIENhc2VzIgojIFNlbGVjdCBkYXRhCmRmIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKSAlPiUKICBmaWx0ZXIoQ29uZmlybWVkX2RheSA+PSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZGF0ZSwgY29uZmlybWVkKSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtZGF0ZSwgLWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShkYXkgPSAxOm4oKSkKCiMgUGxvdAoKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IGxvZyh2YWx1ZSkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEYpICsKICBmYWNldF9ncmlkKC5+Y291bnRyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAibG9nKE51bWJlciBvZiBDYXNlcykiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkJyYXppbHxNZXhpY298UGVydXxBcmdlbnRpbmF8Q2hpbGV8S29yZWEsIFNvdXRofEVjdWFkb3IiKQp0aXRsZSA8LSAiTWV4aWNvIGFuZCBPdGhlciBDb3VudHJpZXMiCnN1YnRpdGxlIDwtICJDb25maXJtZWQgQ2FzZXMgYnkgRGF5cyIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKENvbmZpcm1lZF9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIENvbmZpcm1lZF9kYXkpICU+JQogIGdhdGhlcihrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIsIC1kYXRlLCAtY291bnRyeSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKGRheSA9IDE6bigpKQoKIyBQbG90CmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSBsb2codmFsdWUpKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImF1dG8iLCBzZSA9IEYpICsKICBmYWNldF9ncmlkKC5+Y291bnRyeSwgc2NhbGVzID0gImZyZWUiKSArICAKICB0aGVtZV9taW5pbWFsX2dyaWQoMTMpICsgIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gImxvZyhOdW1iZXIgb2YgQ2FzZXMpIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ29uZmlybWVkIENhc2VzIGJ5IERheXMiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihDb25maXJtZWRfZGF5ID49IDEpICU+JQogIHNlbGVjdChjb3VudHJ5LCBkYXRlLCBDb25maXJtZWRfZGF5KSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtZGF0ZSwgLWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShkYXkgPSAxOm4oKSkKCiMgUGxvdApnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF5LCB5ID0gdmFsdWUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSwgYWxwaGEgPSAwLjE1KSkgKyAKICBnZW9tX3Ntb290aChhZXMoY29sID0gY291bnRyeSksIG1ldGhvZCA9ICJhdXRvIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKyAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpgYGAKCiMjIFVuaXRlZCBTdGF0ZSAoVVMpCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJVUyIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gNTAwLCB0cmFjZSA9IEYsIHRtYXggPSAyNSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgQXJnZW50aW5hICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkFyZ2VudGluYSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMTAsIHRyYWNlID0gRiwgdG1heCA9IDI1KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBCcmF6aWwgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQnJhemlsIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxMiwgdHJhY2UgPSBGLCB0bWF4ID0gNDApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIENhbmFkYQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQ2FuYWRhIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAzMCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDUwKQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBDb2xvbWJpYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDb2xvbWJpYSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDYwKQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBFY3VhZG9yICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkVjdWFkb3IiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDMwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNDApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIENoaWxlICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNoaWxlIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSA0LCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNDApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIFBhbmFtYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJQYW5hbWEiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA0MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgUGVydSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJQZXJ1IgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSA0LCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNDApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIFZlbmV6dWVsYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJWZW5lenVlbGEiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDEsIHRyYWNlID0gRkFMU0UsIHRtYXggPSAyNSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyBFdXJvcGUgIAoKIyMgQ29uZmlybWVkIENhc2UgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkl0YWx5fFNwYWlufEZyYW5jZXxHZXJtYW55fE5vcndheXxVbml0ZWQgS2luZ2RvbXxOZXRoZXJsYW5kc3xTd2l0emVybGFuZHxQb3J0dWdhbCIpCmZvbyA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikKYmFyX2dyYXBoKGZvbywgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgIkV1cm9wZSAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgIHBhc3RlKCJOdW1iZXIgb2YgQ2FzZXMiLCBTeXMuRGF0ZSgpKSkKYGBgCgojIyBDb25maXJtZWQgQ2FzZSAtIEF2ZXJhZ2UgTGFzdCBUaHJlZSBEYXlzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSXRhbHl8U3BhaW58RnJhbmNlfEdlcm1hbnl8Tm9yd2F5fFVuaXRlZCBLaW5nZG9tfE5ldGhlcmxhbmRzfFN3aXR6ZXJsYW5kfFBvcnR1Z2FsIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjM2QsICAKICAgICAgICAgICAgICAgICAgIkV1cm9wZSAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgIHBhc3RlKCJBdmVyYWdlIExhc3QgVGhyZWUgRGF5cyIsIFN5cy5EYXRlKCkpKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJJdGFseXxTcGFpbnxLb3JlYSwgU291dGh8R2VybWFueXxVbml0ZWQgS2luZ2RvbXxGcmFuY2UiKQp0aXRsZSA8LSAiRXVyb3BhIgpzdWJ0aXRsZSA8LSAiQ3VtbXVsYXRlZCBDb25maXJtZWQgQ2FzZXMiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihDb25maXJtZWRfZGF5ID49IDEpICU+JQogIHNlbGVjdChjb3VudHJ5LCBkYXRlLCBjb25maXJtZWQpICU+JQogIGdhdGhlcihrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIsIC1kYXRlLCAtY291bnRyeSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKGRheSA9IDE6bigpKQoKIyBQbG90CmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSB2YWx1ZSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gY291bnRyeSkpICsgICAKICBnZW9tX3Ntb290aChhZXMoY29sID0gY291bnRyeSksIG1ldGhvZCA9ICJhdXRvIiwgc2UgPSBUKSArICAKICBmYWNldF9ncmlkKC5+Y291bnRyeSwgc2NhbGVzID0gImZyZWUiKSArICAgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAiTnVtYmVyIG9mIENhc2VzIikKYGBgCgojIyBJdGFseSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJdGFseSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMTAwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNDApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIFNwYWluICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlNwYWluIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA0MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgVW5pdGVkIEtpbmdkb20gIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiVW5pdGVkIEtpbmdkb20iCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDIwMCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDM1KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBGcmFuY2UgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiRnJhbmNlIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSAzNSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgR2VybWFueSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJHZXJtYW55IgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSAzNSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgTmV0aGVybGFuZHMKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIk5ldGhlcmxhbmRzIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCAyMCwgdHJhY2UgPSBGLCB0bWF4ID0gMzUpCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIFN3aXR6ZXJsYW5kICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlN3aXR6ZXJsYW5kIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCA1MCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDM1KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBOb3J3YXkgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiTm9yd2F5IgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCAxMCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDM1KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBQb3J0dWdhbCAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJQb3J0dWdhbCIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgMzUsIHRyYWNlID0gRkFMU0UsIHRtYXggPSAzNSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyBPdGhlciBDb3VudHJpZXMKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkphcGFufEtvcmVhLCBTb3V0aHxJcmFufFJ1c3NpYXxJc3JhZWx8SW5kaWF8VHVya2V5fFNhdWRpIEFyYWJpYXxQYWtpc3RhbiIpCmZvbyA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikKYmFyX2dyYXBoKGZvbywgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgIk90aGVyIENvdW50cmllcyAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgIHBhc3RlKCJOdW1iZXIgb2YgQ2FzZXMiLCBTeXMuRGF0ZSgpKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIklyYW58VHVya2V5fEtvcmVhLCBTb3V0aHxJc3JhZWx8SmFwYW58UnVzc2lhfFNhdWRpIEFyYWJpYSIpCnRpdGxlIDwtICJPdGhlciBDb3VudHJpZXMiCnN1YnRpdGxlIDwtICJDdW1tdWxhdGVkIENvbmZpcm1lZCBDYXNlcyIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKENvbmZpcm1lZF9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fbGluZShhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAgIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImF1dG8iLCBzZSA9IFQpICsgIAogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgICAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpgYGAKCiMjIEphcGFuICAgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiSmFwYW4iCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDI1LCB0cmFjZSA9IEYsIHRtYXggPSA2MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgS29yZWEsIFNvdXRoICAgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiS29yZWEsIFNvdXRoIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSA1MCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDQ1KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKcGxvdGx5KG1vJGRhdGEsIH50LCB+Y29uZmlybWVkLCB+UHJvamVjdGVkX0xHTSwgCiAgICAgICBwYXN0ZShDb3VudHJ5LCAiLSBNb2RlbCBSZXN1bHRzIC0iLCBtbyRhbm5vdGF0aW9uJGxhYmVsKSkKYGBgCgojIyBJcmFuICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIklyYW4iCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA0NSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgUnVzc2lhICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlJ1c3NpYSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMTAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSAzNSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgSXNyYWVsICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIklzcmFlbCIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMTUsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA0MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyBSZWZlcmVuY2VzICAKClNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0ICAKCkNsYXJrLCBBLkouICgyMDExKS4gIkRlY2xpbmUgQ3VydmUgQW5hbHlzaXMgaW4gVW5jb252ZW50aW9uYWwgUmVzb3VyY2UgUGxheXMKICAgIFVzaW5nIExvZ2lzdGljIEdyb3d0aCBNb2RlbHMuIiBNLlMuIAogICAgVGhlc2lzLCBUaGUgVW5pdmVyc2l0eSBvZiBUZXhhcyBhdCBBdXN0aW4sIEF1Z3VzdCAyMDExLiAKCgo=