Stablecoins mktcap data

On choisit les stablecoins suivant : USDT, USDC, DAI, PYUSD, FDUSD, EURC. Ces tokens structurent l’essentiel des volumes/market cap USD sur les classements “stablecoins” et catégories stablecoins, et parce qu’elles ont suffisamment d’observations pour cette étude.

On récolte ensuite la market capitalization de ces stablecoins sur Artemis.xyz, une plateforme d’analyse des données de crypto.

Pourquoi la market cap ?

  • La market capitalization est définit par : Supply x Price

  • un choc (speech positif envers CBDC) va impacter la demande de stablecoin pour différentes raisons,

  • demande < offre -> pression à la baisse sur les prix,

  • donc baisse des prix des cryptos -> baisse market cap qui ne serait pas captée par la supply uniquement,

  • si pressions trop fortes, l’émetteur intervient en réduisant la supply (burn);

  • donc baisse de la supply -> baisse market cap;

  • En utilisant la supply, on ne capte qu’une partie des effets. A la rigueur, la supply peut être représentative dans le cas des algorithmic stablecoins car l’ajustement de l’offre est fait de manière automatique.

Data import

We also collect price and supply for those stablecoins from Artemis. We fill NAs with linear interpolation.

In this article https://www.artemisanalytics.com/resources/outstanding-supply by Artemis.xyz, they suggest to use the Outstanding Supply of stablecoin to be closer to stock supply (Outstanding Shares in stocks) and have a good representation of the true circulating supply. We gather data on Outstanding Supply from TokenTerminal (https://tokenterminal.com/explorer/metrics/outstanding-supply) : (The data are available on this link : https://tokenterminal.com/explorer/studio/charts/new?v=ZGRlNjhlMWJkNDYzZDM0ZDdjNGMxZmUy).

Final Database

We drop dates of stablecoins supply after July 2025 because the last observation is 2025-06-16 for speeches about CBDC, and adding too much after this dates will just add zeros.

#write.csv(data_artemis, "C:/users/fkraus/Desktop/Articles/effect of CB speeches on stablecoins/2025/DATA_ARTEMIS.csv" )
#write.dta(data_artemis, "C:/users/fkraus/Desktop/Articles/effect of CB speeches on stablecoins/2025/DATA_ARTEMIS.dta" )

Note : je n’ai pas les données de prix et de circulating supply avant 2020 parce que j’ai épuisé mon quotas d’extraction de données, je pourrai en récupérer plus à partir du 1er février.

Models

We estimate the following local projection model :

\[ Y_{i,t+h}-Y_{i,t-1}= \alpha_i + \beta^h X_t + \gamma Z_t + \mu_{i,t} \] Where \(Y\) is the log-difference of stablecoin supply, \(\alpha_i\) is an individual FE, and \(X_t\) is our index of speech CBDC-related sentiment/stance. \(Z_t\) are control variables representing the VIX and the GPRD and their lags, and dummies representing Terra-Luna and FTX crashes. We include individual (\(\alpha_i\)) fixed-effects.
Note : we take the 90% interval confidences for all estimations. Standard errors are heteroskedasticity robusts (clusterized by stablecoin).

Daily

Sentiment / Stance

Sentiment, as measured by Auer & al. (2021) tend not to capture the effect of CBDC’s related communications on stablecoin supplies. However, the Machine Learning framework does capture the negative effect of an increasing sentiment/stance from Central Banks, suggesting a substitution between stablecoins and CBDC. This effect is relatively small yet significant, and may be due to the fact that an important number of speeches are not particularly focused on CBDC, but may treat several subjects that Central Banks take care of and mention marginally CBDC eventually just to talk about it without really using a forward guidance design. We thus focus on important speeches, i.e. communications that explicitly focus on CBDC in their title (Note : another approach could be to weight the speeches by the number of sentences related to CBDC, or the share of these sentences in the total number of sentences).

Immediate effect following important CBDC-related speeches, i.e. speeches that explicitly mention CBDC or related keywords in their title. The effect is almost immediate, and the communications tend to decrease stablecoins supply by 0.3% after about a month.

In addition, we can decompose the market capitalization effect on two effects : the price effect, and the supply effect. We retrieve both price and supply from Artemis.xyz.

Overall, we can see that an increase in sentiment/stance of CB towards CBDC tend to decrease the market capitalization of stablecoins, mainly through a decrease in supply to defend the parity. Indeed, the price do not tend to move while the supply does, implying a decrease in demand for stablecoins to ensure that demand = supply so that price is at par.

We can also test with the Outstanding Supply :

Decomposition by type

Une hausse du sentiment/stance à propos des MNBC general ou non-spécifié ne tend pas à créer une baisse de la demande pour les stablecoins

Decomposition by Process

Decomposition by type and process

Features

Process

Risk-Benefits

Decomposition by Markets/Central Banks

DevEme

ECB vs other

What we observe overall : - An increase in sentiment/stance tend to decrease the demand for stablecoins - This results hides heterogeneity - An increase in sentiment/stance for retail and wholesale CBDC decrease the demand for stablecoins, while an increase in sentiment/stance for General/Unspecified CBDC tend to increase the demand or have no effect depending on the discourse associated. - An interpretation is that when Central Bank talk about General/Unspecified CBDC, it contains information about the project of other central banks “central banks of major countries are carrying out in-depth research recently on digital currencies” or be interpreted - in some cases - as a sign that central banks will adopt an already-existing stablecoin. - However, when the speech clearly states that it aims to issue a retail/wholesale stablecoins, it is perceived as a substitute for existing stablecoins. - Notably, when central banks announce progress on Wholesale (Features particularly) or Retail (Process particularly) CBDC, it dampens the demand for stablecoins. - The effect is particularly visible when Central Banks from Developed Markets communicate about CBDC - and especially ECB.

Important speeches only

Decomposition by type

Decomposition by Discourse in important speeches

Decomposition by type and process in important speeches

Features

Process

Risk-Benefit

Note : Je pense qu’on peut utiliser uniquement les speeches importants, ils donnent des résultats plus clairs et c’est assez facile de justifier leur utilisation + les résultats sont robustes mais moins marquants quand on utilise tous les speeches.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2s6IEFydGVtaXMgTUtUQ0FQIC0gTkFzIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQoNCiMgU3RhYmxlY29pbnMgbWt0Y2FwIGRhdGENCg0KT24gY2hvaXNpdCBsZXMgc3RhYmxlY29pbnMgc3VpdmFudCA6IFVTRFQsIFVTREMsIERBSSwgUFlVU0QsIEZEVVNELCBFVVJDLiBDZXMgdG9rZW5zIHN0cnVjdHVyZW50IGzigJllc3NlbnRpZWwgZGVzIHZvbHVtZXMvbWFya2V0IGNhcCBVU0Qgc3VyIGxlcyBjbGFzc2VtZW50cyDigJxzdGFibGVjb2luc+KAnSBldCBjYXTDqWdvcmllcyBzdGFibGVjb2lucywgZXQgcGFyY2UgcXUnZWxsZXMgb250IHN1ZmZpc2FtbWVudCBkJ29ic2VydmF0aW9ucyBwb3VyIGNldHRlIMOpdHVkZS4NCg0KT24gcsOpY29sdGUgZW5zdWl0ZSBsYSBtYXJrZXQgY2FwaXRhbGl6YXRpb24gZGUgY2VzIHN0YWJsZWNvaW5zIHN1ciBBcnRlbWlzLnh5eiwgdW5lIHBsYXRlZm9ybWUgZCdhbmFseXNlIGRlcyBkb25uw6llcyBkZSBjcnlwdG8uIA0KDQpQb3VycXVvaSBsYSBtYXJrZXQgY2FwID8gDQoNCiAgLSBMYSBtYXJrZXQgY2FwaXRhbGl6YXRpb24gZXN0IGTDqWZpbml0IHBhciA6IFN1cHBseSB4IFByaWNlDQogIA0KICAtIHVuIGNob2MgKHNwZWVjaCBwb3NpdGlmIGVudmVycyBDQkRDKSB2YSBpbXBhY3RlciBsYSBkZW1hbmRlIGRlIHN0YWJsZWNvaW4gcG91ciBkaWZmw6lyZW50ZXMgcmFpc29ucywNCiAgDQogIC0gZGVtYW5kZSA8IG9mZnJlIC0+IHByZXNzaW9uIMOgIGxhIGJhaXNzZSBzdXIgbGVzIHByaXgsDQogIA0KICAtIGRvbmMgYmFpc3NlIGRlcyBwcml4IGRlcyBjcnlwdG9zIC0+IGJhaXNzZSBtYXJrZXQgY2FwIHF1aSBuZSBzZXJhaXQgcGFzIGNhcHTDqWUgcGFyIGxhIHN1cHBseSB1bmlxdWVtZW50LA0KICANCiAgLSBzaSBwcmVzc2lvbnMgdHJvcCBmb3J0ZXMsIGwnw6ltZXR0ZXVyIGludGVydmllbnQgZW4gcsOpZHVpc2FudCBsYSBzdXBwbHkgKGJ1cm4pOw0KICANCiAgLSBkb25jIGJhaXNzZSBkZSBsYSBzdXBwbHkgLT4gYmFpc3NlIG1hcmtldCBjYXA7DQogIA0KICAtIEVuIHV0aWxpc2FudCBsYSBzdXBwbHksIG9uIG5lIGNhcHRlIHF1J3VuZSBwYXJ0aWUgZGVzIGVmZmV0cy4gQSBsYSByaWd1ZXVyLCBsYSBzdXBwbHkgcGV1dCDDqnRyZSByZXByw6lzZW50YXRpdmUgZGFucyBsZSBjYXMgZGVzIGFsZ29yaXRobWljIHN0YWJsZWNvaW5zIGNhciBsJ2FqdXN0ZW1lbnQgZGUgbCdvZmZyZSBlc3QgZmFpdCBkZSBtYW5pw6hyZSBhdXRvbWF0aXF1ZS4gDQogIA0KICANCiMjIERhdGEgaW1wb3J0DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KYXJ0ZW1pcyA8LSByZWFkcjo6cmVhZF9jc3YyKA0KICAiQzovVXNlcnMvZmtyYXVzL0Rlc2t0b3AvQXJ0aWNsZXMvZWZmZWN0cyBvZiBDQiBzcGVlY2hlcyBvbiBzdGFibGVjb2lucy9BcnRlbWlzIGRhdGEvU3RhYmxlY29pbiBTdXBwbHkgYnkgU3RhYmxlY29pbi5jc3YiLA0KICBzaG93X2NvbF90eXBlcyA9IEZBTFNFDQopDQpuYW1lcyhhcnRlbWlzKSA8LSBjKCJEYXRlIiwiQVVTRCIsIkJVU0QiLCJEQUkiLCJFVVJDIiwiRkRVU0QiLCJQWVVTRCIsIlVTRDAiLCJVU0RDIiwgICAgICAgICAgICAgICAgIlVTREdMTyIsIlVTRFAiLCJVU0RTIiwiVVNEVCIsIlVTRFkiLCJVU0RlIiwiY0VVUiIsImNLRVMiLCJjUkVBTCIsImNVU0QiKQ0KDQoNCmFydGVtaXNfcmF3IDwtIGFydGVtaXMgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gZG15X2htKERhdGUsIHR6ID0gIlVUQyIpICANCiAgKQ0KYGBgDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KcGFuZWxfYXJ0ZW1pcyA8LSBhcnRlbWlzX3JhdyAlPiUNCiAgbXV0YXRlKERhdGUgPSBhcy5EYXRlKERhdGUsIGZvcm1hdD0iJWQvJW0vJXkiKSkgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gLURhdGUsDQogICAgbmFtZXNfdG8gPSAic3RhYmxlY29pbiIsDQogICAgdmFsdWVzX3RvID0gInN1cHBseSIsDQogICAgdmFsdWVzX3RyYW5zZm9ybSA9IGxpc3Qoc3VwcGx5ID0gYXMubnVtZXJpYykgIA0KICApICU+JQ0KICAgbXV0YXRlKHN0YWJsZWNvaW4gPSBpZl9lbHNlKHN0YWJsZWNvaW4gPT0gIlVTRFMiLCAiREFJIiwgc3RhYmxlY29pbikpICU+JQ0KICBncm91cF9ieShEYXRlLCBzdGFibGVjb2luKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIHN1cHBseSA9IG1heChzdXBwbHksIG5hLnJtID0gVFJVRSksICAgIyBzaSBsZXMgMiBleGlzdGVudCBtw6ptZSBqb3VyLCBvbiBnYXJkZSBsYSB2YWxldXIgbm9uLU5BIChvdSBsYSBwbHVzIGdyYW5kZSkNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIGFycmFuZ2Uoc3RhYmxlY29pbiwgRGF0ZSkgICU+JSANCg0KICBncm91cF9ieShzdGFibGVjb2luKSU+JQ0KICBtdXRhdGUobG9nX3N1cHBseSA9IGxvZygxK3N1cHBseSksIGRsb2dfc3VwcGx5ID0gbG9nX3N1cHBseSAtIGRwbHlyOjpsYWcobG9nX3N1cHBseSkpICU+JQ0KICAjbXV0YXRlKA0KICAjICBxMDEgPSBxdWFudGlsZShkbG9nX3N1cHBseSwgMC4wNSwgbmEucm0gPSBUUlVFKSwNCiAgIyAgcTk5ID0gcXVhbnRpbGUoZGxvZ19zdXBwbHksIDAuOTUsIG5hLnJtID0gVFJVRSkNCiAgIykgJT4lDQogICNmaWx0ZXIoaXMuZmluaXRlKGRsb2dfc3VwcGx5KSwNCiAgIyAgICAgICAhaXMubmEocTAxKSwgIWlzLm5hKHE5OSksDQogICMgICAgICAgZGxvZ19zdXBwbHkgPj0gcTAxLA0KICAjICAgICAgIGRsb2dfc3VwcGx5IDw9IHE5OSklPiUNCiAgI3NlbGVjdCgtYyhxMDEsIHE5OSwgZGxvZ19zdXBwbHkpKSU+JQ0KICB1bmdyb3VwKCklPiUNCiAgZmlsdGVyKHN0YWJsZWNvaW4gJWluJSBjKCJVU0RUIiwgIlVTREMiLCAiREFJIiwgIlBZVVNEIiwgIlVTRGUiLCAiRVVSQyIpKQ0KDQoNCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmdncGxvdChwYW5lbF9hcnRlbWlzLCBhZXMoeD1EYXRlLCB5PWxvZ19zdXBwbHkpKSsNCiAgZ2VvbV9saW5lKGx3ZD0xKSsNCiAgbGFicyh4PSJEYXRlIiwgeT0ibG9nKHN1cHBseSkiKSsNCiAgZmFjZXRfd3JhcCh+c3RhYmxlY29pbiwgc2NhbGVzPSJmcmVlIikNCmBgYA0KDQpXZSBhbHNvIGNvbGxlY3QgcHJpY2UgYW5kIHN1cHBseSBmb3IgdGhvc2Ugc3RhYmxlY29pbnMgZnJvbSBBcnRlbWlzLiBXZSBmaWxsIE5BcyB3aXRoIGxpbmVhciBpbnRlcnBvbGF0aW9uLiANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpwcmljZSA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIkM6L3VzZXJzL2ZrcmF1cy9EZXNrdG9wL2FydGVtaXNzLnhsc3giLCBzaGVldCA9ICJwcmljZTIiKQ0Kc3VwcGx5PC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJDOi91c2Vycy9ma3JhdXMvRGVza3RvcC9hcnRlbWlzcy54bHN4Iiwgc2hlZXQgPSAic3VwcGx5MiIpDQoNCnByaWNlX2xvbmcgPC0gcHJpY2UgJT4lDQogIHBpdm90X2xvbmdlcigtRGF0ZSwgbmFtZXNfdG8gPSAic3RhYmxlY29pbiIsIHZhbHVlc190byA9ICJwcmljZSIpDQoNCnN1cHBseV9sb25nIDwtIHN1cHBseSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC1EYXRlLCBuYW1lc190byA9ICJzdGFibGVjb2luIiwgdmFsdWVzX3RvID0gInN1cHBseSIpDQpwYW5lbF9wcmljZXMgPC0gcHJpY2VfbG9uZyAlPiUNCiAgZnVsbF9qb2luKHN1cHBseV9sb25nLCBieSA9IGMoIkRhdGUiLCAic3RhYmxlY29pbiIpKSAlPiUNCiAgYXJyYW5nZShEYXRlLCBzdGFibGVjb2luKSU+JQ0KICBmaWx0ZXIoc3RhYmxlY29pbiAlaW4lIGMoInVzZHQiLCAidXNkYyIsICJkYWkiLCAicHl1c2QiLCAiZXVyYyIsICJ1c2RlIikpJT4lDQogIG11dGF0ZShzdGFibGVjb2luID1jYXNlX3doZW4oDQogICAgc3RhYmxlY29pbiA9PSAiZGFpIiB+ICJEQUkiLCANCiAgICBzdGFibGVjb2luPT0idXNkYyJ+IlVTREMiLA0KICAgIHN0YWJsZWNvaW49PSJ1c2R0In4iVVNEVCIsIA0KICAgIHN0YWJsZWNvaW49PSJldXJjIn4iRVVSQyIsIA0KICAgIHN0YWJsZWNvaW49PSJ1c2RlIn4iVVNEZSIsDQogICAgc3RhYmxlY29pbj09InB5dXNkIn4iUFlVU0QiKSkNCmBgYA0KDQoNCg0KDQpJbiB0aGlzIGFydGljbGUgaHR0cHM6Ly93d3cuYXJ0ZW1pc2FuYWx5dGljcy5jb20vcmVzb3VyY2VzL291dHN0YW5kaW5nLXN1cHBseSBieSBBcnRlbWlzLnh5eiwgdGhleSBzdWdnZXN0IHRvIHVzZSB0aGUgT3V0c3RhbmRpbmcgU3VwcGx5IG9mIHN0YWJsZWNvaW4gdG8gYmUgY2xvc2VyIHRvIHN0b2NrIHN1cHBseSAoT3V0c3RhbmRpbmcgU2hhcmVzIGluIHN0b2NrcykgYW5kIGhhdmUgYSBnb29kIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cnVlIGNpcmN1bGF0aW5nIHN1cHBseS4gV2UgZ2F0aGVyIGRhdGEgb24gT3V0c3RhbmRpbmcgU3VwcGx5IGZyb20gVG9rZW5UZXJtaW5hbCAoaHR0cHM6Ly90b2tlbnRlcm1pbmFsLmNvbS9leHBsb3Jlci9tZXRyaWNzL291dHN0YW5kaW5nLXN1cHBseSkgOiAoVGhlIGRhdGEgYXJlIGF2YWlsYWJsZSBvbiB0aGlzIGxpbmsgOiBodHRwczovL3Rva2VudGVybWluYWwuY29tL2V4cGxvcmVyL3N0dWRpby9jaGFydHMvbmV3P3Y9WkdSbE5qaGxNV0prTkRZelpETTBaRGRqTkdNeFptVXkpLiAgDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnRva2VudGVybWluYWxfc3VwcGx5IDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL2ZrcmF1cy9EZXNrdG9wL3Rva2VudGVybWluYWxfc3VwcGx5Lnhsc3giLCANCiAgICBjb2xfdHlwZXMgPSBjKCJkYXRlIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiKSkNCg0KDQp0b2tlbnRlcm1pbmFsX2xvbmcgPC0gdG9rZW50ZXJtaW5hbF9zdXBwbHkgICU+JQ0KICBwaXZvdF9sb25nZXIoLURhdGUsIG5hbWVzX3RvID0gInN0YWJsZWNvaW4iLCB2YWx1ZXNfdG8gPSAic3VwcGx5IiklPiUNCiAgbXV0YXRlKGxvZ19zdXBwbHkgPSBsb2coc3VwcGx5KSklPiUNCiAgbmEub21pdCgpJT4lDQogIGZpbHRlcihEYXRlIDwgYXMuRGF0ZSgiMjAyNS0wNy0wMSIpKQ0KDQp0b2tlbnRlcm1pbmFsX2xvbmcyIDwtIHRva2VudGVybWluYWxfbG9uZyAlPiUgICAjIDwtLSByZXBsYWNlIGRmIHdpdGggeW91ciBvYmplY3QgbmFtZQ0KICBtdXRhdGUoDQogICAgc3RhYmxlY29pbl9yYXcgPSBzdHJfcmVtb3ZlKHN0YWJsZWNvaW4sICJcXHMqLVxccypPdXRzdGFuZGluZyBzdXBwbHkgXFwoXFwkXFwpXFxzKiQiKSwNCiAgICBzeW1ib2wgICA9IHN0cl90cmltKHN0cl9yZW1vdmUoc3RhYmxlY29pbl9yYXcsICJcXHMqXFwoW14pXSpcXClcXHMqJCIpKSwNCiAgICBuYW1lID0gc3RyX21hdGNoKHN0YWJsZWNvaW5fcmF3LCAiXFwoKFteKV0qKVxcKSIpWywyXQ0KICApICU+JQ0KICBzZWxlY3QoLWMoIHN0YWJsZWNvaW4pKQ0KDQpkYXRhX3Rva2VudGVybWluYWwgPC10b2tlbnRlcm1pbmFsX2xvbmcyJT4lDQogIG11dGF0ZShzeW1ib2w9aWZlbHNlKHN5bWJvbD09IlVTRFMiLCAiREFJIiwgc3ltYm9sKSklPiUNCiAgbXV0YXRlKHN5bWJvbD1pZmVsc2Uoc3ltYm9sPT0iVVNERSIsICJVU0RlIiwgc3ltYm9sKSklPiUNCg0KICBmaWx0ZXIoc3ltYm9sJWluJSBjKCJVU0RUIiwgIlVTREMiLCAiREFJIiwgIlBZVVNEIiwgIkVVUkMiLCAiVVNEZSIpKSU+JQ0KICByZW5hbWUoIm91dHN0YW5kaW5nX3N1cHBseSI9InN1cHBseSIsIA0KICAgICAgICAgImxvZ19vdXRzdGFuZGluZ19zdXBwbHkiPSJsb2dfc3VwcGx5IiklPiUNCiAgc2VsZWN0KC1jKHN0YWJsZWNvaW5fcmF3LCBuYW1lKSkNCg0KYGBgDQoNCg0KIyBGaW5hbCBEYXRhYmFzZQ0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KR1BSIDwtIHJlYWR4bDo6cmVhZF9leGNlbCgiQzovdXNlcnMvZmtyYXVzL0Rlc2t0b3AvQXJ0aWNsZXMvZWZmZWN0cyBvZiBDQiBzcGVlY2hlcyBvbiBzdGFibGVjb2lucy8yMDI1L0dQUi54bHN4IiklPiUNCiAgbXV0YXRlKGRhdGU9YXMuRGF0ZShkYXRlKSklPiUNCiAgc2VsZWN0KC1jKERBWSkpDQpyZXF1aXJlKHF1YW50bW9kKQ0KVklYIDwtIGdldFN5bWJvbHMoIl5WSVgiLCBzcmM9InlhaG9vIiwgYXV0by5hc3NpZ24gPSBGQUxTRSkgDQp2aXhfZGF0YSA8LSBkYXRhLmZyYW1lKGRhdGUgPSBpbmRleChWSVgpLCBjb3JlZGF0YShWSVgpKSU+JQ0KICBkcGx5cjo6cmVuYW1lKCJWSVhfY2xvc2UiID0gYFZJWC5DbG9zZWApJT4lDQogIHNlbGVjdChkYXRlLCBWSVhfY2xvc2UpDQp2aXhfZGF0YV93ZWVrbHkgPC0gZGF0YS5mcmFtZShkYXRlID0gaW5kZXgoVklYKSwgY29yZWRhdGEoVklYKSklPiUNCiAgZHBseXI6OnJlbmFtZSgiVklYX2Nsb3NlIiA9IGBWSVguQ2xvc2VgKSU+JQ0KICBzZWxlY3QoZGF0ZSwgVklYX2Nsb3NlKSU+JQ0KICBtdXRhdGUod2VlayA9IGZsb29yX2RhdGUoZGF0ZSwgIndlZWsiLCB3ZWVrX3N0YXJ0PTEpKSU+JQ0KICBncm91cF9ieSh3ZWVrKSU+JQ0KICBzdW1tYXJpemUoVklYX2Nsb3NlID0gbWVhbihWSVhfY2xvc2UsIG5hLnJtPVQpKQ0KDQpHUFJfZGF0YV93ZWVrbHkgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJDOi9Vc2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3RzIG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvR1BSLnhsc3giKSU+JQ0KICBtdXRhdGUoZGF0ZT1hcy5EYXRlKGRhdGUpKSU+JQ0KICBzZWxlY3QoLWMoREFZKSApJT4lDQogIG11dGF0ZSh3ZWVrPWZsb29yX2RhdGUoZGF0ZSwgIndlZWsiLCB3ZWVrX3N0YXJ0ID0gMSkpJT4lDQogIGdyb3VwX2J5KHdlZWspJT4lDQogIHN1bW1hcml6ZShOMTBEID0gbWVhbihOMTBEKSwgR1BSRCA9IG1lYW4oR1BSRCksIA0KICAgICAgICAgICAgR1BSRF9BQ1QgPSBtZWFuKEdQUkRfQUNUKSwgR1BSRF9USFJFQVQ9bWVhbihHUFJEX1RIUkVBVCkpJT4lDQogIGZpbHRlcih3ZWVrID4gYXMuRGF0ZSgiMjAxNy0wMS0wMSIpKQ0KDQpkYXRhX2FydGVtaXMgPC1wYW5lbF9hcnRlbWlzJT4lDQogIG5hLm9taXQoKSU+JQ0KICBsZWZ0X2pvaW4oZGF0YWJhc2VfZGFpbHksIGJ5PWMoIkRhdGUiPSJkYXRlIikpJT4lDQogIG11dGF0ZShxdWFydGVyeWVhciA9IHBhc3RlMChxdWFydGVyKERhdGUpLCB5ZWFyKERhdGUpKSklPiUNCiAgbGVmdF9qb2luKEdQUiwgYnk9YygiRGF0ZSI9ImRhdGUiKSklPiUNCiAgbGVmdF9qb2luKHZpeF9kYXRhLCBieT1jKCJEYXRlIj0iZGF0ZSIpKSU+JQ0KICBhcnJhbmdlKHN0YWJsZWNvaW4sIERhdGUpJT4lDQogIG11dGF0ZShGVFggPSBpZmVsc2UoRGF0ZSA+IGFzLkRhdGUoIjIwMjItMTEtMDEiKSAmIERhdGUgPCBhcy5EYXRlKCIyMDIzLTAxLTAxIiksMSwwICkpJT4lDQogIG11dGF0ZShMdW5hID0gaWZlbHNlKERhdGUgPiBhcy5EYXRlKCIyMDIyLTA1LTAxIikgJiBEYXRlIDwgYXMuRGF0ZSgiMjAyMi0wNy0wMSIpLDEsMCApKSU+JQ0KICANCiAgI211dGF0ZShhY3Jvc3MoLURhdGUsIH4gdGlkeXI6OnJlcGxhY2VfbmEoLngsIDApKSkgJT4lICMgcmVtb3ZlIHRoaXMgdG8gcmVwbGFjZSAwIHdpdGggTkEgd2hlbiB0aGVyZSdzIG5vIHNwZWVjaA0KICBtdXRhdGUocGVnVHlwZSA9IGNhc2Vfd2hlbigNCiAgICBzdGFibGVjb2luID09ICJVU0RUIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEQyJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkRBSSJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkVVUkMifiAiRVVSIiwNCiAgICBzdGFibGVjb2luID09ICJGRFVTRCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlBZVVNEIn4gIlVTRCINCiAgICApKSU+JQ0KICBtdXRhdGUocGVnTWVjaGFuaXNtID0gY2FzZV93aGVuKA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFQifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEQyJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJEQUkifiAiY3J5cHRvIiwNCiAgICBzdGFibGVjb2luID09ICJFVVJDIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkZEVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlBZVVNEIn4gImZpYXQiDQoNCiAgKSklPiUNCiAgbGVmdF9qb2luKHBhbmVsX3ByaWNlcywgYnk9Yygic3RhYmxlY29pbiIsIkRhdGUiICksIHN1ZmZpeD1jKCIiLCAiX3N1cCIpKSU+JQ0KICBsZWZ0X2pvaW4oZGF0YV90b2tlbnRlcm1pbmFsLCBieT1jKCJzdGFibGVjb2luIj0ic3ltYm9sIiwgIkRhdGUiKSklPiUNCiAgZ3JvdXBfYnkoc3RhYmxlY29pbiklPiUNCiAgbXV0YXRlKHByaWNlID0gbmEuYXBwcm94KHByaWNlLCBuYS5ybT1GKSklPiUNCiAgICBtdXRhdGUoc3VwcGx5X3N1cCA9IG5hLmFwcHJveChzdXBwbHlfc3VwLCBuYS5ybT1GKSklPiUNCiAgbXV0YXRlKGxvZ19zdXBwbHlfc3VwID0gbG9nKHN1cHBseV9zdXApKSU+JQ0KDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCklPiUNCiAgZmlsdGVyKGRhdGUgPD1hcy5EYXRlKCIyMDI1LTA3LTAxIikpDQogIA0KYGBgDQoNCldlIGRyb3AgZGF0ZXMgb2Ygc3RhYmxlY29pbnMgc3VwcGx5IGFmdGVyIEp1bHkgMjAyNSBiZWNhdXNlIHRoZSBsYXN0IG9ic2VydmF0aW9uIGlzIDIwMjUtMDYtMTYgZm9yIHNwZWVjaGVzIGFib3V0IENCREMsIGFuZCBhZGRpbmcgdG9vIG11Y2ggYWZ0ZXIgdGhpcyBkYXRlcyB3aWxsIGp1c3QgYWRkIHplcm9zLiANCg0KDQpgYGB7cn0NCiN3cml0ZS5jc3YoZGF0YV9hcnRlbWlzLCAiQzovdXNlcnMvZmtyYXVzL0Rlc2t0b3AvQXJ0aWNsZXMvZWZmZWN0IG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvREFUQV9BUlRFTUlTLmNzdiIgKQ0KI3dyaXRlLmR0YShkYXRhX2FydGVtaXMsICJDOi91c2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3Qgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvMjAyNS9EQVRBX0FSVEVNSVMuZHRhIiApDQoNCmBgYA0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCmdncGxvdChkYXRhX2FydGVtaXMsIGFlcyh4ID0gZGF0ZSwgeSA9IHN1cHBseSwgZmlsbCA9IHN0YWJsZWNvaW4pKSArDQogIGdlb21fYXJlYSgpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiQ3VtdWxhdGVkIE1hcmtldCBDYXBpdGFsaXphdGlvbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQoNCg0KZ2dwbG90KGRhdGFfYXJ0ZW1pcywgYWVzKHggPSBkYXRlLCB5ID0gc3VwcGx5X3N1cCwgZmlsbCA9IHN0YWJsZWNvaW4pKSArDQogIGdlb21fYXJlYSgpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiQ3VtdWxhdGVkIFN1cHBseSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQpgYGANCk5vdGUgOiBqZSBuJ2FpIHBhcyBsZXMgZG9ubsOpZXMgZGUgcHJpeCBldCBkZSBjaXJjdWxhdGluZyBzdXBwbHkgYXZhbnQgMjAyMCBwYXJjZSBxdWUgaidhaSDDqXB1aXPDqSBtb24gcXVvdGFzIGQnZXh0cmFjdGlvbiBkZSBkb25uw6llcywgamUgcG91cnJhaSBlbiByw6ljdXDDqXJlciBwbHVzIMOgIHBhcnRpciBkdSAxZXIgZsOpdnJpZXIuDQoNCg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCm1ha2VfaXJmX3Bsb3RfMiA8LSBmdW5jdGlvbihkYXRhLCB0aXRsZSA9IE5VTEwpIHsNCiAgZ2dwbG90KA0KICAgIGRhdGEsDQogICAgYWVzKA0KICAgICAgeCA9IGgsIHkgPSBpcmYsDQogICAgICB5bWluID0gbG93LCB5bWF4ID0gdXAsDQogICAgICBjb2xvciA9IHR5cGUsIGZpbGwgPSB0eXBlDQogICAgKQ0KICApICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogICAgZ2VvbV9yaWJib24oYWxwaGEgPSAwLjMsIGNvbG9yID0gTkEpICsNCiAgICBnZW9tX2xpbmUobGluZXdpZHRoID0gMC43KSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbHNfdHlwZSkgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbHNfdHlwZSkgKw0KICAgIGxhYnMoDQogICAgICB4ID0gIkhvcml6b24gKHdlZWtzKSIsDQogICAgICB5ID0gIlJlc3BvbnNlIG9mIFN1cHBseSAobG9nKSIsDQogICAgICBjb2xvciA9IE5VTEwsIGZpbGwgPSBOVUxMLA0KICAgICAgdGl0bGUgPSB0aXRsZQ0KICAgICkgKw0KICAgIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgICB0aGVtZSgNCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkNCiAgICApDQp9DQoNCmNvbHNfdHlwZSA8LSBjKA0KICAiU2VudGltZW50IiA9ICIjMWY3N2I0IiwgICMgYmxldQ0KICAiU3RhbmNlIiAgICA9ICIjZDYyNzI4IiwgICMgcm91Z2UNCiAgIlNlbnRpbWVudCAoQXVlcikiICAgICA9ICIjZDk1ZjAyIiAgICMgYXUgY2FzIG/DuSAoQXVlciBzZW50aW1lbnQgc2V1bCwgZXRjLikNCikNCg0Kc2hvY2tfdmFyIDwtIGMoInN0YW5jZV9hdWVyIiwgImluZGV4X3N0YW5jZSIsICJpbmRleF9zZW50IiwgImluZGV4X3NlbnRfdHlwZV93aG9sZXNhbGVfY2JkYyIsICJpbmRleF9zdGFuY2VfdHlwZV93aG9sZXNhbGVfY2JkYyIsICJpbmRleF9zZW50X3R5cGVfcmV0YWlsX2NiZGMiLCAiaW5kZXhfc2VudF90eXBlX2dlbmVyYWxfdW5zcGVjaWZpZWQiLCAiaW5kZXhfc3RhbmNlX3R5cGVfZ2VuZXJhbF91bnNwZWNpZmllZCIsICJpbmRleF9zdGFuY2VfdHlwZV9yZXRhaWxfY2JkYyIsICJpbmRleF9zZW50X2Rpc2NfZmVhdHVyZSIsICJpbmRleF9zdGFuY2VfZGlzY19mZWF0dXJlIiwgImluZGV4X3NlbnRfZGlzY19wcm9jZXNzIiwgImluZGV4X3N0YW5jZV9kaXNjX3Byb2Nlc3MiLCAiaW5kZXhfc2VudF9kaXNjX3Jpc2tfYmVuZWZpdCIsICJpbmRleF9zdGFuY2VfZGlzY19yaXNrX2JlbmVmaXQiLCAiaW5kZXhfc2VudF90eXBlX2Rpc2NfZ2VuZXJhbF91bnNwZWNpZmllZF9mZWF0dXJlIiwgICAgICJpbmRleF9zZW50X3R5cGVfZGlzY19nZW5lcmFsX3Vuc3BlY2lmaWVkX3Byb2Nlc3MiLCAiaW5kZXhfc2VudF90eXBlX2Rpc2NfZ2VuZXJhbF91bnNwZWNpZmllZF9yaXNrX2JlbmVmaXQiLCJpbmRleF9zZW50X3R5cGVfZGlzY19yZXRhaWxfY2JkY19mZWF0dXJlIiwgICAgICAgICAgICAgDQogImluZGV4X3NlbnRfdHlwZV9kaXNjX3JldGFpbF9jYmRjX3Jpc2tfYmVuZWZpdCIsICAiaW5kZXhfc2VudF90eXBlX2Rpc2Nfd2hvbGVzYWxlX2NiZGNfZmVhdHVyZSIsICAgICAgICANCiAiaW5kZXhfc2VudF90eXBlX2Rpc2NfcmV0YWlsX2NiZGNfcHJvY2VzcyIsICAiaW5kZXhfc2VudF90eXBlX2Rpc2Nfd2hvbGVzYWxlX2NiZGNfcmlza19iZW5lZml0IiwgICAgIA0KICJpbmRleF9zZW50X3R5cGVfZGlzY193aG9sZXNhbGVfY2JkY19wcm9jZXNzIiwgImluZGV4X3N0YW5jZV90eXBlX2Rpc2NfZ2VuZXJhbF91bnNwZWNpZmllZF9mZWF0dXJlIiAsICANCiJpbmRleF9zdGFuY2VfdHlwZV9kaXNjX2dlbmVyYWxfdW5zcGVjaWZpZWRfcHJvY2VzcyIsICJpbmRleF9zdGFuY2VfdHlwZV9kaXNjX2dlbmVyYWxfdW5zcGVjaWZpZWRfcmlza19iZW5lZml0IiwgImluZGV4X3N0YW5jZV90eXBlX2Rpc2NfcmV0YWlsX2NiZGNfZmVhdHVyZSIsICJpbmRleF9zdGFuY2VfdHlwZV9kaXNjX3JldGFpbF9jYmRjX3Jpc2tfYmVuZWZpdCIsICAgICAgDQogImluZGV4X3N0YW5jZV90eXBlX2Rpc2Nfd2hvbGVzYWxlX2NiZGNfZmVhdHVyZSIgLCAiaW5kZXhfc3RhbmNlX3R5cGVfZGlzY19yZXRhaWxfY2JkY19wcm9jZXNzIiwgICAgICAgICAgDQogImluZGV4X3N0YW5jZV90eXBlX2Rpc2Nfd2hvbGVzYWxlX2NiZGNfcmlza19iZW5lZml0IiwgImluZGV4X3N0YW5jZV90eXBlX2Rpc2Nfd2hvbGVzYWxlX2NiZGNfcHJvY2VzcyIsICAgICAgICAgDQogImluZGV4X3NlbnRfZGV2ZW1lX2RldmVsb3BlZCIgLCAiaW5kZXhfc2VudF9kZXZlbWVfZW1lcmdpbmciLCAiaW5kZXhfc3RhbmNlX2RldmVtZV9kZXZlbG9wZWQiLCAiaW5kZXhfc3RhbmNlX2RldmVtZV9lbWVyZ2luZyIgLCAiaW5kZXhfc2VudF9jYl9vdGhlcnMiLCAiaW5kZXhfc2VudF9jYl9lY2JfZmVkX2JvaiIsImluZGV4X3N0YW5jZV9jYl9vdGhlcnMiLCAiaW5kZXhfc3RhbmNlX2NiX2VjYl9mZWRfYm9qIiAsICAgICAgICAiaW5kZXhfc2VudF9jYl9vdGhlciIgLCAiaW5kZXhfc2VudF9jYl9lY2IiICwgICJpbmRleF9zdGFuY2VfY2Jfb3RoZXIiICwgICJpbmRleF9zdGFuY2VfY2JfZWNiIiAsICJpbmRleF9zZW50X2NiZGN0aXRsZSIgLCAiaW5kZXhfc3RhbmNlX2NiZGN0aXRsZSIpDQoNCnBsb3RfbHAgPC0gZnVuY3Rpb24obHBfbW9kZWwsDQogICAgICAgICAgICAgICAgICAgIC4uLiwNCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICIiLA0KICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLA0KICAgICAgICAgICAgICAgICAgICBjb25mLmxldmVsID0gMC45LA0KICAgICAgICAgICAgICAgICAgICB2Y292ID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgIGtlZXBfdGVybSA9IE5VTEwpIHsNCg0KICAjIEFjY2VwdDogcGxvdF9scChscDEpIE9SIHBsb3RfbHAobHAxLCBscDIsIC4uLikgT1IgcGxvdF9scChsaXN0KGxwMSwgbHAyKSkNCiAgbW9kZWxzIDwtIGxpc3QobHBfbW9kZWwsIC4uLikNCiAgaWYgKGxlbmd0aChtb2RlbHMpID09IDEgJiYgaXMubGlzdChtb2RlbHNbWzFdXSkgJiYgIWluaGVyaXRzKG1vZGVsc1tbMV1dW1sxXV0sICJmaXhlc3QiKSkgew0KICAgICMgSWYgdXNlciBwYXNzZWQgYSBwbGFpbiBsaXN0IG9mIG1vZGVsczogcGxvdF9scChsaXN0KGxwMSwgbHAyKSkNCiAgICBtb2RlbHMgPC0gbW9kZWxzW1sxXV0NCiAgfQ0KDQogIHN0b3BpZm5vdChsZW5ndGgobW9kZWxzKSA+IDApDQoNCiAgIyByZWN5Y2xlIC8gdmFsaWRhdGUgdHlwZSBsYWJlbHMNCiAgaWYgKGxlbmd0aCh0eXBlKSA9PSAxKSB0eXBlIDwtIHJlcCh0eXBlLCBsZW5ndGgobW9kZWxzKSkNCiAgaWYgKGxlbmd0aCh0eXBlKSAhPSBsZW5ndGgobW9kZWxzKSkgew0KICAgIHN0b3AoImB0eXBlYCBtdXN0IGhhdmUgbGVuZ3RoIDEgb3IgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBudW1iZXIgb2YgTFAgbW9kZWxzLiIpDQogIH0NCg0KICAjIGhlbHBlcjogZXh0cmFjdCBkZiBmb3IgT05FIGxwIG9iamVjdA0KICBvbmVfbHBfdG9fZGYgPC0gZnVuY3Rpb24ob25lX2xwLCBvbmVfdHlwZSkgew0KICAgIHN0b3BpZm5vdChpcy5saXN0KG9uZV9scCksIGxlbmd0aChvbmVfbHApID4gMCkNCiAgICBIIDwtIGxlbmd0aChvbmVfbHApIC0gMQ0KDQogICAgcHVycnI6Om1hcDJfZGZyKA0KICAgICAgb25lX2xwLA0KICAgICAgMDpILA0KICAgICAgfnsNCiAgICAgICAgdHQgPC0gYnJvb206OnRpZHkoLngsIGNvbmYuaW50ID0gVFJVRSwgY29uZi5sZXZlbCA9IGNvbmYubGV2ZWwsIHZjb3YgPSB2Y292KQ0KDQogICAgICAgIHNob2NrX3Rlcm0gPC0gaWYgKGlzLm51bGwoa2VlcF90ZXJtKSkgew0KICAgICAgICAgIHR0JHRlcm1bIXR0JHRlcm0gJWluJSBjKCIoSW50ZXJjZXB0KSIsICIoaW50ZXJjZXB0KSIsICJJbnRlcmNlcHQiKV1bMV0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBrZWVwX3Rlcm0NCiAgICAgICAgfQ0KDQogICAgICAgIHR0ICU+JQ0KICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoLmRhdGEkdGVybSA9PSBzaG9ja190ZXJtKSAlPiUNCiAgICAgICAgICBkcGx5cjo6dHJhbnNtdXRlKA0KICAgICAgICAgICAgaCAgID0gLnksDQogICAgICAgICAgICBpcmYgPSAuZGF0YSRlc3RpbWF0ZSwNCiAgICAgICAgICAgIGxvdyA9IC5kYXRhJGNvbmYubG93LA0KICAgICAgICAgICAgdXAgID0gLmRhdGEkY29uZi5oaWdoLA0KICAgICAgICAgICAgdGVybSA9IC5kYXRhJHRlcm0sDQogICAgICAgICAgICB0eXBlID0gb25lX3R5cGUNCiAgICAgICAgICApDQogICAgICB9DQogICAgKQ0KICB9DQoNCiAgaXJmX2RmIDwtIHB1cnJyOjptYXAyX2Rmcihtb2RlbHMsIHR5cGUsIG9uZV9scF90b19kZikNCg0KICBnZ3Bsb3QoDQogICAgaXJmX2RmLA0KICAgIGFlcygNCiAgICAgIHggPSBoLCB5ID0gaXJmLA0KICAgICAgeW1pbiA9IGxvdywgeW1heCA9IHVwLA0KICAgICAgY29sb3IgPSB0eXBlLCBmaWxsID0gdHlwZQ0KICAgICkNCiAgKSArDQogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICAgIGdlb21fcmliYm9uKGFscGhhID0gMC4zLCBjb2xvciA9IE5BKSArDQogICAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDAuNykgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xzX3R5cGUpICsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xzX3R5cGUpICsNCiAgICBsYWJzKA0KICAgICAgeCA9ICJIb3Jpem9uIiwNCiAgICAgIHkgPSAiUmVzcG9uc2Ugb2YgU3VwcGx5IChsb2cpIiwNCiAgICAgIGNvbG9yID0gTlVMTCwgZmlsbCA9IE5VTEwsDQogICAgICB0aXRsZSA9IHRpdGxlDQogICAgKSArDQogICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikgKw0KICAgIHRoZW1lKA0KICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KQ0KICAgICkNCn0NCmBgYA0KDQoNCiMgTW9kZWxzDQpXZSBlc3RpbWF0ZSB0aGUgZm9sbG93aW5nIGxvY2FsIHByb2plY3Rpb24gbW9kZWwgOg0KDQokJA0KWV97aSx0K2h9LVlfe2ksdC0xfT0gXGFscGhhX2kgKyBcYmV0YV5oICBYX3QgKyBcZ2FtbWEgWl90ICsgXG11X3tpLHR9DQokJA0KV2hlcmUgJFkkIGlzIHRoZSBsb2ctZGlmZmVyZW5jZSBvZiBzdGFibGVjb2luIHN1cHBseSwgJFxhbHBoYV9pJCBpcyBhbiBpbmRpdmlkdWFsIEZFLCBhbmQgJFhfdCQgaXMgb3VyIGluZGV4IG9mIHNwZWVjaCBDQkRDLXJlbGF0ZWQgc2VudGltZW50L3N0YW5jZS4gJFpfdCQgYXJlIGNvbnRyb2wgdmFyaWFibGVzIHJlcHJlc2VudGluZyB0aGUgVklYIGFuZCB0aGUgR1BSRCBhbmQgdGhlaXIgbGFncywgYW5kIGR1bW1pZXMgcmVwcmVzZW50aW5nIFRlcnJhLUx1bmEgYW5kIEZUWCBjcmFzaGVzLiBXZSBpbmNsdWRlIGluZGl2aWR1YWwgKCRcYWxwaGFfaSQpIGZpeGVkLWVmZmVjdHMuICANCk5vdGUgOiB3ZSB0YWtlIHRoZSA5MCUgaW50ZXJ2YWwgY29uZmlkZW5jZXMgZm9yIGFsbCBlc3RpbWF0aW9ucy4gU3RhbmRhcmQgZXJyb3JzIGFyZSBoZXRlcm9za2VkYXN0aWNpdHkgcm9idXN0cyAoY2x1c3Rlcml6ZWQgYnkgc3RhYmxlY29pbikuDQoNCiMjIERhaWx5DQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmggPSAzMA0KbHBfYXVlciA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBzdGFuY2VfYXVlciArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpDQopDQoNCmxwX3NlbnQgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpDQopDQoNCmxwX3N0YW5jZSA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksIDEpIH4gaW5kZXhfc3RhbmNlICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCg0KYGBgDQojIyMgU2VudGltZW50IC8gU3RhbmNlDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCnBsb3RfbHAobHBfYXVlciwgdHlwZT0iU2VudGltZW50IChBdWVyKSIsIHRpdGxlPSJEYWlseSByZXNwb25zZSBvZiBNYXJrZXQgQ2FwaXRhbGl6YXRpb24gdG8gaW5jcmVhc2UgaW4gQXVlciAmIGFsLiAoMjAyMSkgc2VudGltZW50IikNCnBsb3RfbHAobHBfc2VudCwgbHBfc3RhbmNlLCB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgdGl0bGU9IkRhaWx5IHJlc3BvbnNlIG9mIE1hcmtldCBDYXBpdGFsaXphdGlvbiB0byBpbmNyZWFzZSBpbiBzZW50aW1lbnQvc3RhbmNlIikNCg0KYGBgDQoNCg0KU2VudGltZW50LCBhcyBtZWFzdXJlZCBieSBBdWVyICYgYWwuICgyMDIxKSB0ZW5kIG5vdCB0byBjYXB0dXJlIHRoZSBlZmZlY3Qgb2YgQ0JEQydzIHJlbGF0ZWQgY29tbXVuaWNhdGlvbnMgb24gc3RhYmxlY29pbiBzdXBwbGllcy4gSG93ZXZlciwgdGhlIE1hY2hpbmUgTGVhcm5pbmcgZnJhbWV3b3JrIGRvZXMgY2FwdHVyZSB0aGUgbmVnYXRpdmUgZWZmZWN0IG9mIGFuIGluY3JlYXNpbmcgc2VudGltZW50L3N0YW5jZSBmcm9tIENlbnRyYWwgQmFua3MsIHN1Z2dlc3RpbmcgYSBzdWJzdGl0dXRpb24gYmV0d2VlbiBzdGFibGVjb2lucyBhbmQgQ0JEQy4gVGhpcyBlZmZlY3QgaXMgcmVsYXRpdmVseSBzbWFsbCB5ZXQgc2lnbmlmaWNhbnQsIGFuZCBtYXkgYmUgZHVlIHRvIHRoZSBmYWN0IHRoYXQgYW4gaW1wb3J0YW50IG51bWJlciBvZiBzcGVlY2hlcyBhcmUgbm90IHBhcnRpY3VsYXJseSBmb2N1c2VkIG9uIENCREMsIGJ1dCBtYXkgdHJlYXQgc2V2ZXJhbCBzdWJqZWN0cyB0aGF0IENlbnRyYWwgQmFua3MgdGFrZSBjYXJlIG9mIGFuZCBtZW50aW9uIG1hcmdpbmFsbHkgQ0JEQyBldmVudHVhbGx5IGp1c3QgdG8gdGFsayBhYm91dCBpdCB3aXRob3V0IHJlYWxseSB1c2luZyBhIGZvcndhcmQgZ3VpZGFuY2UgZGVzaWduLiBXZSB0aHVzIGZvY3VzIG9uIGltcG9ydGFudCBzcGVlY2hlcywgaS5lLiBjb21tdW5pY2F0aW9ucyB0aGF0IGV4cGxpY2l0bHkgZm9jdXMgb24gQ0JEQyBpbiB0aGVpciB0aXRsZSAoTm90ZSA6IGFub3RoZXIgYXBwcm9hY2ggY291bGQgYmUgdG8gd2VpZ2h0IHRoZSBzcGVlY2hlcyBieSB0aGUgbnVtYmVyIG9mIHNlbnRlbmNlcyByZWxhdGVkIHRvIENCREMsIG9yIHRoZSBzaGFyZSBvZiB0aGVzZSBzZW50ZW5jZXMgaW4gdGhlIHRvdGFsIG51bWJlciBvZiBzZW50ZW5jZXMpLiAgIA0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KaD0zMA0KbHBfc2VudF9pbXBvcnRhbnQgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudF9jYmRjdGl0bGUgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpscF9zdGFuY2VfaW1wb3J0YW50ICA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zdGFuY2VfY2JkY3RpdGxlICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCg0KcGxvdF9scChscF9zZW50X2ltcG9ydGFudCwgbHBfc3RhbmNlX2ltcG9ydGFudCwgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIHRpdGxlPSJJbXBvcnRhbnQgU3BlZWNoZXMgT25seSIpDQpgYGANCkltbWVkaWF0ZSBlZmZlY3QgZm9sbG93aW5nIGltcG9ydGFudCBDQkRDLXJlbGF0ZWQgc3BlZWNoZXMsIGkuZS4gc3BlZWNoZXMgdGhhdCBleHBsaWNpdGx5IG1lbnRpb24gQ0JEQyBvciByZWxhdGVkIGtleXdvcmRzIGluIHRoZWlyIHRpdGxlLiBUaGUgZWZmZWN0IGlzIGFsbW9zdCBpbW1lZGlhdGUsIGFuZCB0aGUgY29tbXVuaWNhdGlvbnMgdGVuZCB0byBkZWNyZWFzZSBzdGFibGVjb2lucyBzdXBwbHkgYnkgMC4zJSBhZnRlciBhYm91dCBhIG1vbnRoLiANCg0KDQpJbiBhZGRpdGlvbiwgd2UgY2FuIGRlY29tcG9zZSB0aGUgbWFya2V0IGNhcGl0YWxpemF0aW9uIGVmZmVjdCBvbiB0d28gZWZmZWN0cyA6IHRoZSBwcmljZSBlZmZlY3QsIGFuZCB0aGUgc3VwcGx5IGVmZmVjdC4gV2UgcmV0cmlldmUgYm90aCBwcmljZSBhbmQgc3VwcGx5IGZyb20gQXJ0ZW1pcy54eXouIA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCmxwX3NlbnRfcCA8LSBmZW9scygNCiAgZihwcmljZSwgMDpoKS0gbChwcmljZSwxKSB+IGluZGV4X3NlbnQgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KbHBfc2VudF9zIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHlfc3VwLCAwOmgpLSBsKGxvZ19zdXBwbHlfc3VwLDEpIH4gaW5kZXhfc2VudCsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCg0KbHBfc3RhbmNlX3AgIDwtIGZlb2xzKA0KICBmKHByaWNlLCAwOmgpLSBsKHByaWNlLDEpIH4gaW5kZXhfc3RhbmNlICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCg0KbHBfc3RhbmNlX3MgIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHlfc3VwLCAwOmgpLSBsKGxvZ19zdXBwbHlfc3VwLDEpIH4gaW5kZXhfc3RhbmNlICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCg0KcGxvdF9scChscF9zZW50X3AsIGxwX3N0YW5jZV9wLCB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgdGl0bGU9IlJlYWN0aW9uIG9mIHByaWNlcyB0byBpbmNyZWFzZSBpbiBzZW50aW1lbnQvc3RhbmNlIikNCnBsb3RfbHAobHBfc2VudF9zLCBscF9zdGFuY2VfcywgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIHRpdGxlPSJSZWFjdGlvbiBvZiBzdXBwbHkgdG8gaW5jcmVhc2UgaW4gc2VudGltZW50L3N0YW5jZSIpDQoNCmBgYA0KDQpPdmVyYWxsLCB3ZSBjYW4gc2VlIHRoYXQgYW4gaW5jcmVhc2UgaW4gc2VudGltZW50L3N0YW5jZSBvZiBDQiB0b3dhcmRzIENCREMgdGVuZCB0byBkZWNyZWFzZSB0aGUgbWFya2V0IGNhcGl0YWxpemF0aW9uIG9mIHN0YWJsZWNvaW5zLCBtYWlubHkgdGhyb3VnaCBhIGRlY3JlYXNlIGluIHN1cHBseSB0byBkZWZlbmQgdGhlIHBhcml0eS4gSW5kZWVkLCB0aGUgcHJpY2UgZG8gbm90IHRlbmQgdG8gbW92ZSB3aGlsZSB0aGUgc3VwcGx5IGRvZXMsIGltcGx5aW5nIGEgZGVjcmVhc2UgaW4gZGVtYW5kIGZvciBzdGFibGVjb2lucyB0byBlbnN1cmUgdGhhdCBkZW1hbmQgPSBzdXBwbHkgc28gdGhhdCBwcmljZSBpcyBhdCBwYXIuIA0KDQpXZSBjYW4gYWxzbyB0ZXN0IHdpdGggdGhlIE91dHN0YW5kaW5nIFN1cHBseSA6DQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpscF9zZW50X29zIDwtIGZlb2xzKA0KICBmKGxvZ19vdXRzdGFuZGluZ19zdXBwbHksIDA6aCktIGwobG9nX291dHN0YW5kaW5nX3N1cHBseSwxKSB+IGluZGV4X3NlbnQrICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpDQopDQpscF9zdGFuY2Vfb3MgPC0gZmVvbHMoDQogIGYobG9nX291dHN0YW5kaW5nX3N1cHBseSwgMDpoKS0gbChsb2dfb3V0c3RhbmRpbmdfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpscF9zZW50X29zX2ltcCA8LSBmZW9scygNCiAgZihsb2dfb3V0c3RhbmRpbmdfc3VwcGx5LCAwOmgpLSBsKGxvZ19vdXRzdGFuZGluZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X2NiZGN0aXRsZSsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCmxwX3N0YW5jZV9vc19pbXAgPC0gZmVvbHMoDQogIGYobG9nX291dHN0YW5kaW5nX3N1cHBseSwgMDpoKS0gbChsb2dfb3V0c3RhbmRpbmdfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX2NiZGN0aXRsZSsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCg0KcGxvdF9scChscF9zZW50X29zLCBscF9zdGFuY2Vfb3MsIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCB0aXRsZT0iUmVhY3Rpb24gb2YgT3V0c3RhbmRpbmcgU3VwcGx5IHRvIGluY3JlYXNlIGluIHNlbnRpbWVudC9zdGFuY2UgIikNCnBsb3RfbHAobHBfc2VudF9vc19pbXAsIGxwX3N0YW5jZV9vc19pbXAsIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCB0aXRsZT0iUmVhY3Rpb24gb2YgT3V0c3RhbmRpbmcgU3VwcGx5IHRvIGluY3JlYXNlIGluIHNlbnRpbWVudC9zdGFuY2UgKEltcG9ydGFudCBTcGVlY2hlcykgIikNCg0KYGBgDQoNCg0KIyMjIERlY29tcG9zaXRpb24gYnkgdHlwZQ0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIHR5cGVzDQojaCA9IDEwMA0KDQojIyBHZW5lcmFsDQpscF9nZW5zZW50IDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfdHlwZV9nZW5lcmFsX3Vuc3BlY2lmaWVkICsgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggIHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCg0KbHBfZ2Vuc3RhbmNlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV90eXBlX2dlbmVyYWxfdW5zcGVjaWZpZWQgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQojIyBXaG9sZXNhbGUNCg0KbHBfd2hvc2VudCA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X3R5cGVfd2hvbGVzYWxlX2NiZGMgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpscF93aG9zdGFuY2UgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX3R5cGVfd2hvbGVzYWxlX2NiZGMgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQojIyBSZXRhaWwNCg0KbHBfcmV0c2VudCA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X3R5cGVfcmV0YWlsX2NiZGMgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpscF9yZXRzdGFuY2UgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX3R5cGVfcmV0YWlsX2NiZGMgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpwbG90X2xwKGxwX2dlbnNlbnQsIGxwX2dlbnN0YW5jZSwgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIHRpdGxlPSJHZW5lcmFsL1Vuc3BlY2lmaWVkIChkYWlseSkiKQ0KcGxvdF9scChscF93aG9zZW50LCBscF93aG9zdGFuY2UsIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCB0aXRsZT0iV2hvbGVzYWxlIChkYWlseSkiKQ0KcGxvdF9scChscF9yZXRzZW50LCBscF9yZXRzdGFuY2UsIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCB0aXRsZT0iUmV0YWlsIChkYWlseSkiKQ0KDQpgYGANClVuZSBoYXVzc2UgZHUgc2VudGltZW50L3N0YW5jZSDDoCBwcm9wb3MgZGVzIE1OQkMgZ2VuZXJhbCBvdSBub24tc3DDqWNpZmnDqSBuZSB0ZW5kIHBhcyDDoCBjcsOpZXIgdW5lIGJhaXNzZSBkZSBsYSBkZW1hbmRlIHBvdXIgbGVzIHN0YWJsZWNvaW5zDQoNCg0KDQoNCiMjIyBEZWNvbXBvc2l0aW9uIGJ5IFByb2Nlc3MgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KI2ggPSAxMDANCg0KbHBfZmVhdHVyZV9zZW50IDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfZGlzY19mZWF0dXJlICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCmxwX2ZlYXR1cmVfc3RhbmNlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kaXNjX2ZlYXR1cmUgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KbHBfcHJvY2Vzc19zZW50IDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfZGlzY19wcm9jZXNzICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCmxwX3Byb2Nlc3Nfc3RhbmNlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kaXNjX3Byb2Nlc3MgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KbHBfcmlza2JlbmVmX3NlbnQgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudF9kaXNjX3Jpc2tfYmVuZWZpdCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9yaXNrYmVuZWZfc3RhbmNlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kaXNjX3Jpc2tfYmVuZWZpdCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRX0NCnBsb3RfbHAobHBfZmVhdHVyZV9zZW50LCBscF9mZWF0dXJlX3N0YW5jZSwgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIHRpdGxlPSJGZWF0dXJlIikNCnBsb3RfbHAobHBfcHJvY2Vzc19zZW50LCBscF9wcm9jZXNzX3N0YW5jZSwgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIHRpdGxlPSJQcm9jZXNzIikNCnBsb3RfbHAobHBfcmlza2JlbmVmX3NlbnQsIGxwX3Jpc2tiZW5lZl9zdGFuY2UsIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCB0aXRsZT0iUmlza3MvQmVuZWZpdHMiKQ0KDQpgYGANCg0KDQojIyMgRGVjb21wb3NpdGlvbiBieSB0eXBlIGFuZCBwcm9jZXNzDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiNGZWF0dXJlDQpscF9mZWF0dXJlX3NlbnRfZ2VuIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfdHlwZV9kaXNjX2dlbmVyYWxfdW5zcGVjaWZpZWRfZmVhdHVyZSArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9mZWF0dXJlX3N0YW5jZV9nZW4gPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX3R5cGVfZGlzY19nZW5lcmFsX3Vuc3BlY2lmaWVkX2ZlYXR1cmUgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KDQpscF9mZWF0dXJlX3NlbnRfcmV0IDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfdHlwZV9kaXNjX3JldGFpbF9jYmRjX2ZlYXR1cmUgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KbHBfZmVhdHVyZV9zdGFuY2VfcmV0IDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV90eXBlX2Rpc2NfcmV0YWlsX2NiZGNfZmVhdHVyZSArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9mZWF0dXJlX3NlbnRfd2hvPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudF90eXBlX2Rpc2Nfd2hvbGVzYWxlX2NiZGNfZmVhdHVyZSArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9mZWF0dXJlX3N0YW5jZV93aG88LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zdGFuY2VfdHlwZV9kaXNjX3dob2xlc2FsZV9jYmRjX2ZlYXR1cmUgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KIyBQcm9jZXNzDQpscF9wcm9jZXNzX3NlbnRfZ2VuIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfdHlwZV9kaXNjX2dlbmVyYWxfdW5zcGVjaWZpZWRfcHJvY2VzcyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9wcm9jZXNzX3N0YW5jZV9nZW4gPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX3R5cGVfZGlzY19nZW5lcmFsX3Vuc3BlY2lmaWVkX3Byb2Nlc3MgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KDQpscF9wcm9jZXNzX3NlbnRfcmV0IDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfdHlwZV9kaXNjX3JldGFpbF9jYmRjX3Byb2Nlc3MgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KbHBfcHJvY2Vzc19zdGFuY2VfcmV0IDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV90eXBlX2Rpc2NfcmV0YWlsX2NiZGNfcHJvY2VzcyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQoNCmxwX3Byb2Nlc3Nfc2VudF93aG8gPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudF90eXBlX2Rpc2Nfd2hvbGVzYWxlX2NiZGNfcHJvY2VzcyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9wcm9jZXNzX3N0YW5jZV93aG8gPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX3R5cGVfZGlzY193aG9sZXNhbGVfY2JkY19wcm9jZXNzICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCg0KIyBSaXNrLUJlbmVmaXRzDQoNCmxwX3Jpc2tiZW5lZl9zZW50X2dlbiA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X3R5cGVfZGlzY19nZW5lcmFsX3Vuc3BlY2lmaWVkX3Jpc2tfYmVuZWZpdCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9yaXNrYmVuZWZfc3RhbmNlX2dlbiA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zdGFuY2VfdHlwZV9kaXNjX2dlbmVyYWxfdW5zcGVjaWZpZWRfcmlza19iZW5lZml0ICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCg0KbHBfcmlza2JlbmVmX3NlbnRfcmV0IDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfdHlwZV9kaXNjX3JldGFpbF9jYmRjX3Jpc2tfYmVuZWZpdCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9yaXNrYmVuZWZfc3RhbmNlX3JldCA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zdGFuY2VfdHlwZV9kaXNjX3JldGFpbF9jYmRjX3Jpc2tfYmVuZWZpdCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQoNCmxwX3Jpc2tiZW5lZl9zZW50X3dobyA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X3R5cGVfZGlzY193aG9sZXNhbGVfY2JkY19yaXNrX2JlbmVmaXQgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KbHBfcmlza2JlbmVmX3N0YW5jZV93aG8gPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX3R5cGVfZGlzY193aG9sZXNhbGVfY2JkY19yaXNrX2JlbmVmaXQgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KDQpgYGANCg0KIyMjIyBGZWF0dXJlcw0KYGBge3IsIGVjaG89RkFMU0V9DQpwbG90X2xwKGxwX2ZlYXR1cmVfc2VudF9nZW4sIGxwX2ZlYXR1cmVfc3RhbmNlX2dlbiwgDQogICAgICAgIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCANCiAgICAgICAgdGl0bGU9IkluY3JlYXNlIGluIFNlbnRpbWVudCB0b3dhcmRzIEdlbmVyYWwvVW5zcGVjaWZpZWQgQ0JEQyBGZWF0dXJlcyIpDQoNCnBsb3RfbHAobHBfZmVhdHVyZV9zZW50X3JldCwgbHBfZmVhdHVyZV9zdGFuY2VfcmV0LCANCiAgICAgICAgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIA0KICAgICAgICB0aXRsZT0iSW5jcmVhc2UgaW4gU2VudGltZW50IHRvd2FyZHMgUmV0YWlsIENCREMgRmVhdHVyZXMiKQ0KDQpwbG90X2xwKGxwX2ZlYXR1cmVfc2VudF93aG8sIGxwX2ZlYXR1cmVfc3RhbmNlX3dobywgDQogICAgICAgIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCANCiAgICAgICAgdGl0bGU9IkluY3JlYXNlIGluIFNlbnRpbWVudCB0b3dhcmRzIFdob2xlc2FsZSBDQkRDIEZlYXR1cmVzIikNCg0KYGBgDQoNCiMjIyMgUHJvY2Vzcw0KYGBge3IsIGVjaG89RkFMU0V9DQpwbG90X2xwKGxwX3Byb2Nlc3Nfc2VudF9nZW4sIGxwX3Byb2Nlc3Nfc3RhbmNlX2dlbiwgDQogICAgICAgIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCANCiAgICAgICAgdGl0bGU9IkluY3JlYXNlIGluIFNlbnRpbWVudCB0b3dhcmRzIEdlbmVyYWwvVW5zcGVjaWZpZWQgQ0JEQyBQcm9jZXNzIikNCg0KcGxvdF9scChscF9wcm9jZXNzX3NlbnRfcmV0LCBscF9wcm9jZXNzX3N0YW5jZV9yZXQsIA0KICAgICAgICB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgDQogICAgICAgIHRpdGxlPSJJbmNyZWFzZSBpbiBTZW50aW1lbnQgdG93YXJkcyBSZXRhaWwgQ0JEQyBQcm9jZXNzIikNCg0KcGxvdF9scChscF9wcm9jZXNzX3NlbnRfd2hvLCBscF9wcm9jZXNzX3N0YW5jZV93aG8sIA0KICAgICAgICB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgDQogICAgICAgIHRpdGxlPSJJbmNyZWFzZSBpbiBTZW50aW1lbnQgdG93YXJkcyBXaG9sZXNhbGUgQ0JEQyBQcm9jZXNzIikNCg0KYGBgDQoNCg0KIyMjIyBSaXNrLUJlbmVmaXRzDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcGxvdF9scChscF9yaXNrYmVuZWZfc2VudF9nZW4sIGxwX3Jpc2tiZW5lZl9zdGFuY2VfZ2VuLCANCiAgICAgICAgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIA0KICAgICAgICB0aXRsZT0iSW5jcmVhc2UgaW4gU2VudGltZW50IHRvd2FyZHMgR2VuZXJhbC9VbnNwZWNpZmllZCBDQkRDIFJpc2stQmVuZWZpdHMiKQ0KDQpwbG90X2xwKGxwX3Jpc2tiZW5lZl9zZW50X3JldCwgbHBfcmlza2JlbmVmX3N0YW5jZV9yZXQsIA0KICAgICAgICB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgDQogICAgICAgIHRpdGxlPSJJbmNyZWFzZSBpbiBTZW50aW1lbnQgdG93YXJkcyBSZXRhaWwgQ0JEQyBSaXNrLUJlbmVmaXRzIikNCg0KcGxvdF9scChscF9yaXNrYmVuZWZfc2VudF93aG8sIGxwX3Jpc2tiZW5lZl9zdGFuY2Vfd2hvLCANCiAgICAgICAgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIA0KICAgICAgICB0aXRsZT0iSW5jcmVhc2UgaW4gU2VudGltZW50IHRvd2FyZHMgV2hvbGVzYWxlIENCREMgUmlzay1CZW5lZml0cyIpDQoNCmBgYA0KDQojIyMgRGVjb21wb3NpdGlvbiBieSBNYXJrZXRzL0NlbnRyYWwgQmFua3MNCiMjIyMgRGV2RW1lDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxwX2RldmVtZV9zZW50X2RldiA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X2RldmVtZV9kZXZlbG9wZWQgICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCmxwX2RldmVtZV9zdGFuY2VfZGV2IDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kZXZlbWVfZGV2ZWxvcGVkICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCg0KDQpscF9kZXZlbWVfc2VudF9lbWUgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudF9kZXZlbWVfZW1lcmdpbmcgICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCmxwX2RldmVtZV9zdGFuY2VfZW1lIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kZXZlbWVfZW1lcmdpbmcgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnBsb3RfbHAobHBfZGV2ZW1lX3NlbnRfZGV2LCBscF9kZXZlbWVfc3RhbmNlX2RldiwgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIHRpdGxlPSJEZXZlbG9wZWQiKQ0KcGxvdF9scChscF9kZXZlbWVfc2VudF9lbWUsIGxwX2RldmVtZV9zdGFuY2VfZW1lLCB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgdGl0bGU9IkVtZXJnaW5nIikNCg0KYGBgDQoNCiMjIyMgRUNCIHZzIG90aGVyDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCmxwX3NlbnRfZWNiIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfY2JfZWNiICArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9zdGFuY2VfZWNiIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9jYl9lY2IgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KbHBfc2VudF9vdGhlciA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X2NiX290aGVyICArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9zdGFuY2Vfb3RoZXIgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX2NiX290aGVyICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCnBsb3RfbHAobHBfc2VudF9lY2IsIGxwX3N0YW5jZV9lY2IsIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCB0aXRsZT0iRUNCIikNCnBsb3RfbHAobHBfc2VudF9vdGhlciwgbHBfc3RhbmNlX290aGVyLCB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgdGl0bGU9Ik90aGVyIikNCg0KYGBgDQoNCg0KDQoNCldoYXQgd2Ugb2JzZXJ2ZSBvdmVyYWxsIDoNCi0gQW4gaW5jcmVhc2UgaW4gc2VudGltZW50L3N0YW5jZSB0ZW5kIHRvIGRlY3JlYXNlIHRoZSBkZW1hbmQgZm9yIHN0YWJsZWNvaW5zIA0KLSBUaGlzIHJlc3VsdHMgaGlkZXMgaGV0ZXJvZ2VuZWl0eQ0KLSBBbiBpbmNyZWFzZSBpbiBzZW50aW1lbnQvc3RhbmNlIGZvciByZXRhaWwgYW5kIHdob2xlc2FsZSBDQkRDIGRlY3JlYXNlIHRoZSBkZW1hbmQgZm9yIHN0YWJsZWNvaW5zLCB3aGlsZSBhbiBpbmNyZWFzZSBpbiBzZW50aW1lbnQvc3RhbmNlIGZvciBHZW5lcmFsL1Vuc3BlY2lmaWVkIENCREMgdGVuZCB0byBpbmNyZWFzZSB0aGUgZGVtYW5kIG9yIGhhdmUgbm8gZWZmZWN0IGRlcGVuZGluZyBvbiB0aGUgZGlzY291cnNlIGFzc29jaWF0ZWQuDQotIEFuIGludGVycHJldGF0aW9uIGlzIHRoYXQgd2hlbiBDZW50cmFsIEJhbmsgdGFsayBhYm91dCBHZW5lcmFsL1Vuc3BlY2lmaWVkIENCREMsIGl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9qZWN0IG9mIG90aGVyIGNlbnRyYWwgYmFua3MgImNlbnRyYWwgYmFua3Mgb2YgbWFqb3IgY291bnRyaWVzIGFyZSBjYXJyeWluZyBvdXQgaW4tZGVwdGggcmVzZWFyY2ggcmVjZW50bHkgb24gZGlnaXRhbCBjdXJyZW5jaWVzIiBvciBiZSBpbnRlcnByZXRlZCAtIGluIHNvbWUgY2FzZXMgLSBhcyBhIHNpZ24gdGhhdCBjZW50cmFsIGJhbmtzIHdpbGwgYWRvcHQgYW4gYWxyZWFkeS1leGlzdGluZyBzdGFibGVjb2luLg0KLSBIb3dldmVyLCB3aGVuIHRoZSBzcGVlY2ggY2xlYXJseSBzdGF0ZXMgdGhhdCBpdCBhaW1zIHRvIGlzc3VlIGEgcmV0YWlsL3dob2xlc2FsZSBzdGFibGVjb2lucywgaXQgaXMgcGVyY2VpdmVkIGFzIGEgc3Vic3RpdHV0ZSBmb3IgZXhpc3Rpbmcgc3RhYmxlY29pbnMuDQotIE5vdGFibHksIHdoZW4gY2VudHJhbCBiYW5rcyBhbm5vdW5jZSBwcm9ncmVzcyBvbiBXaG9sZXNhbGUgKEZlYXR1cmVzIHBhcnRpY3VsYXJseSkgb3IgUmV0YWlsIChQcm9jZXNzIHBhcnRpY3VsYXJseSkgQ0JEQywgaXQgZGFtcGVucyB0aGUgZGVtYW5kIGZvciBzdGFibGVjb2lucy4gDQotIFRoZSBlZmZlY3QgaXMgcGFydGljdWxhcmx5IHZpc2libGUgd2hlbiBDZW50cmFsIEJhbmtzIGZyb20gRGV2ZWxvcGVkIE1hcmtldHMgY29tbXVuaWNhdGUgYWJvdXQgQ0JEQyAtIGFuZCBlc3BlY2lhbGx5IEVDQi4NCg0KDQoNCiMjIyBJbXBvcnRhbnQgc3BlZWNoZXMgb25seQ0KIyMjIyBEZWNvbXBvc2l0aW9uIGJ5IHR5cGUNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxwX3NlbnRfaW1wb3J0YW50X2dlbmVyYWwgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudF90eXBlX2NiZGN0aXRsZV9nZW5lcmFsX3Vuc3BlY2lmaWVkICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCmxwX3N0YW5jZV9pbXBvcnRhbnRfZ2VuZXJhbCA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zdGFuY2VfdHlwZV9jYmRjdGl0bGVfZ2VuZXJhbF91bnNwZWNpZmllZCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpDQopDQoNCg0KbHBfc2VudF9pbXBvcnRhbnRfcmV0YWlsIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfdHlwZV9jYmRjdGl0bGVfcmV0YWlsX2NiZGMgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpscF9zdGFuY2VfaW1wb3J0YW50X3JldGFpbCAgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX3R5cGVfY2JkY3RpdGxlX3JldGFpbF9jYmRjICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikNCikNCg0KbHBfc2VudF9pbXBvcnRhbnRfd2hvbGVzYWxlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfdHlwZV9jYmRjdGl0bGVfd2hvbGVzYWxlX2NiZGMgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpscF9zdGFuY2VfaW1wb3J0YW50X3dob2xlc2FsZSA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zdGFuY2VfdHlwZV9jYmRjdGl0bGVfd2hvbGVzYWxlX2NiZGMgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQoNCmBgYA0KDQogDQpgYGB7ciwgZWNobz1GQUxTRX0NCnBsb3RfbHAobHBfc2VudF9pbXBvcnRhbnRfZ2VuZXJhbCwgbHBfc3RhbmNlX2ltcG9ydGFudF9nZW5lcmFsLCB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgdGl0bGU9IkdlbmVyYWwvVW5zcGVjaWZpZWQgaW5jcmVhc2UgaW4gc2VudGltZW50IChpbXBvcnRhbnQgc3BlZWNoZXMpIikNCg0KcGxvdF9scChscF9zZW50X2ltcG9ydGFudF9yZXRhaWwsIGxwX3N0YW5jZV9pbXBvcnRhbnRfcmV0YWlsLCB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgdGl0bGU9IlJldGFpbCBDQkRDIGluY3JlYXNlIGluIHNlbnRpbWVudCAoaW1wb3J0YW50IHNwZWVjaGVzKSIpDQoNCnBsb3RfbHAobHBfc2VudF9pbXBvcnRhbnRfd2hvbGVzYWxlLCBscF9zdGFuY2VfaW1wb3J0YW50X3dob2xlc2FsZSwgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIHRpdGxlPSJXaG9sZXNhbGUgQ0JEQyBpbmNyZWFzZSBpbiBzZW50aW1lbnQgKGltcG9ydGFudCBzcGVlY2hlcykiKQ0KYGBgDQojIyMjIERlY29tcG9zaXRpb24gYnkgRGlzY291cnNlICBpbiBpbXBvcnRhbnQgc3BlZWNoZXMNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbHBfc2VudF9pbXBvcnRhbnRfZmVhdHVyZSA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X2Rpc2NvdXJzZV9jYmRjdGl0bGVfZmVhdHVyZSArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpDQopDQoNCg0KbHBfc3RhbmNlX2ltcG9ydGFudF9mZWF0dXJlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kaXNjb3Vyc2VfY2JkY3RpdGxlX2ZlYXR1cmUgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQoNCmxwX3NlbnRfaW1wb3J0YW50X3Byb2Nlc3MgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudF9kaXNjb3Vyc2VfY2JkY3RpdGxlX3Byb2Nlc3MgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpscF9zdGFuY2VfaW1wb3J0YW50X3Byb2Nlc3MgIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kaXNjb3Vyc2VfY2JkY3RpdGxlX3Byb2Nlc3MgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpscF9zZW50X2ltcG9ydGFudF9yaXNrYmVuZWYgPC0gZmVvbHMoICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfZGlzY291cnNlX2NiZGN0aXRsZV9yaXNrX2JlbmVmaXQgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KDQpscF9zdGFuY2VfaW1wb3J0YW50X3Jpc2tiZW5lZiA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zdGFuY2VfZGlzY291cnNlX2NiZGN0aXRsZV9yaXNrX2JlbmVmaXQgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKQ0KKQ0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRX0NCnBsb3RfbHAobHBfc2VudF9pbXBvcnRhbnRfZmVhdHVyZSwgbHBfc3RhbmNlX2ltcG9ydGFudF9mZWF0dXJlLCB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgdGl0bGU9IkZlYXR1cmVzIGluY3JlYXNlIGluIHNlbnRpbWVudCAoaW1wb3J0YW50IHNwZWVjaGVzKSIpDQoNCnBsb3RfbHAobHBfc2VudF9pbXBvcnRhbnRfcHJvY2VzcywgbHBfc3RhbmNlX2ltcG9ydGFudF9wcm9jZXNzLCB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgdGl0bGU9IlByb2Nlc3MgaW5jcmVhc2UgaW4gc2VudGltZW50IChpbXBvcnRhbnQgc3BlZWNoZXMpIikNCg0KcGxvdF9scChscF9zZW50X2ltcG9ydGFudF9yaXNrYmVuZWYsIGxwX3N0YW5jZV9pbXBvcnRhbnRfcmlza2JlbmVmLCB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgdGl0bGU9IlJpc2stQmVuZWZpdCBpbmNyZWFzZSBpbiBzZW50aW1lbnQgKGltcG9ydGFudCBzcGVlY2hlcykiKQ0KYGBgDQoNCg0KDQoNCg0KDQojIyMjIERlY29tcG9zaXRpb24gYnkgdHlwZSBhbmQgcHJvY2VzcyBpbiBpbXBvcnRhbnQgc3BlZWNoZXMNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KI0ZlYXR1cmUNCmxwX2ZlYXR1cmVfc2VudF9nZW5fY2JkY3RpdGxlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfZGlzY190eXBlX2NiZGN0aXRsZV9mZWF0dXJlX2dlbmVyYWxfdW5zcGVjaWZpZWQgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KbHBfZmVhdHVyZV9zdGFuY2VfZ2VuX2NiZGN0aXRsZSA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zdGFuY2VfZGlzY190eXBlX2NiZGN0aXRsZV9mZWF0dXJlX2dlbmVyYWxfdW5zcGVjaWZpZWQgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KDQpscF9mZWF0dXJlX3NlbnRfcmV0X2NiZGN0aXRsZSA8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X2Rpc2NfdHlwZV9jYmRjdGl0bGVfZmVhdHVyZV9yZXRhaWxfY2JkYyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9mZWF0dXJlX3N0YW5jZV9yZXRfY2JkY3RpdGxlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kaXNjX3R5cGVfY2JkY3RpdGxlX2ZlYXR1cmVfcmV0YWlsX2NiZGMgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KbHBfZmVhdHVyZV9zZW50X3dob19jYmRjdGl0bGU8LSBmZW9scygNCiAgZihsb2dfc3VwcGx5LCAwOmgpLSBsKGxvZ19zdXBwbHksMSkgfiBpbmRleF9zZW50X2Rpc2NfdHlwZV9jYmRjdGl0bGVfZmVhdHVyZV93aG9sZXNhbGVfY2JkYyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9mZWF0dXJlX3N0YW5jZV93aG9fY2JkY3RpdGxlPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX2Rpc2NfdHlwZV9jYmRjdGl0bGVfZmVhdHVyZV93aG9sZXNhbGVfY2JkYyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQoNCiMgUHJvY2Vzcw0KbHBfcHJvY2Vzc19zZW50X2dlbl9jYmRjdGl0bGUgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudF9kaXNjX3R5cGVfY2JkY3RpdGxlX3Byb2Nlc3NfZ2VuZXJhbF91bnNwZWNpZmllZCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9wcm9jZXNzX3N0YW5jZV9nZW5fY2JkY3RpdGxlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kaXNjX3R5cGVfY2JkY3RpdGxlX3Byb2Nlc3NfZ2VuZXJhbF91bnNwZWNpZmllZCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQoNCmxwX3Byb2Nlc3Nfc2VudF9yZXRfY2JkY3RpdGxlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfZGlzY190eXBlX2NiZGN0aXRsZV9wcm9jZXNzX3JldGFpbF9jYmRjICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCmxwX3Byb2Nlc3Nfc3RhbmNlX3JldF9jYmRjdGl0bGUgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX2Rpc2NfdHlwZV9jYmRjdGl0bGVfcHJvY2Vzc19yZXRhaWxfY2JkYyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQoNCmxwX3Byb2Nlc3Nfc2VudF93aG9fY2JkY3RpdGxlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfZGlzY190eXBlX2NiZGN0aXRsZV9wcm9jZXNzX3dob2xlc2FsZV9jYmRjICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCmxwX3Byb2Nlc3Nfc3RhbmNlX3dob19jYmRjdGl0bGUgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX2Rpc2NfdHlwZV9jYmRjdGl0bGVfcHJvY2Vzc193aG9sZXNhbGVfY2JkYyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQoNCiMgUmlzay1CZW5lZml0cw0KDQpscF9yaXNrYmVuZWZfc2VudF9nZW5fY2JkY3RpdGxlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfZGlzY190eXBlX2NiZGN0aXRsZV9yaXNrX2JlbmVmaXRfZ2VuZXJhbF91bnNwZWNpZmllZCArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9yaXNrYmVuZWZfc3RhbmNlX2dlbl9jYmRjdGl0bGUgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX2Rpc2NfdHlwZV9jYmRjdGl0bGVfcmlza19iZW5lZml0X2dlbmVyYWxfdW5zcGVjaWZpZWQgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KDQpscF9yaXNrYmVuZWZfc2VudF9yZXRfY2JkY3RpdGxlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3NlbnRfZGlzY190eXBlX2NiZGN0aXRsZV9yaXNrX2JlbmVmaXRfcmV0YWlsX2NiZGMgKyAgbChncHJkLDA6MSkrbCh2aXhfY2xvc2UsIDA6MSkrbHVuYStmdHggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzLCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgImRhdGUiKSkNCg0KbHBfcmlza2JlbmVmX3N0YW5jZV9yZXRfY2JkY3RpdGxlIDwtIGZlb2xzKA0KICBmKGxvZ19zdXBwbHksIDA6aCktIGwobG9nX3N1cHBseSwxKSB+IGluZGV4X3N0YW5jZV9kaXNjX3R5cGVfY2JkY3RpdGxlX3Jpc2tfYmVuZWZpdF9yZXRhaWxfY2JkYyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQoNCmxwX3Jpc2tiZW5lZl9zZW50X3dob19jYmRjdGl0bGUgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc2VudF9kaXNjX3R5cGVfY2JkY3RpdGxlX3Jpc2tfYmVuZWZpdF93aG9sZXNhbGVfY2JkYyArICBsKGdwcmQsMDoxKStsKHZpeF9jbG9zZSwgMDoxKStsdW5hK2Z0eCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXMsIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAiZGF0ZSIpKQ0KDQpscF9yaXNrYmVuZWZfc3RhbmNlX3dob19jYmRjdGl0bGUgPC0gZmVvbHMoDQogIGYobG9nX3N1cHBseSwgMDpoKS0gbChsb2dfc3VwcGx5LDEpIH4gaW5kZXhfc3RhbmNlX2Rpc2NfdHlwZV9jYmRjdGl0bGVfcmlza19iZW5lZml0X3dob2xlc2FsZV9jYmRjICsgIGwoZ3ByZCwwOjEpK2wodml4X2Nsb3NlLCAwOjEpK2x1bmErZnR4IHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pcywgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJkYXRlIikpDQoNCmBgYA0KDQoNCiMjIyMjIEZlYXR1cmVzDQpgYGB7ciwgZWNobz1GQUxTRX0NCnBsb3RfbHAobHBfZmVhdHVyZV9zZW50X2dlbl9jYmRjdGl0bGUsIGxwX2ZlYXR1cmVfc3RhbmNlX2dlbl9jYmRjdGl0bGUsIA0KICAgICAgICB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgDQogICAgICAgIHRpdGxlPSJJbmNyZWFzZSBpbiBTZW50aW1lbnQgdG93YXJkcyBHZW5lcmFsL1Vuc3BlY2lmaWVkIENCREMgRmVhdHVyZXMgKEltcG9ydGFudCBTcGVlY2hlcykiKQ0KDQpwbG90X2xwKGxwX2ZlYXR1cmVfc2VudF9yZXRfY2JkY3RpdGxlLCBscF9mZWF0dXJlX3N0YW5jZV9yZXRfY2JkY3RpdGxlLCANCiAgICAgICAgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIA0KICAgICAgICB0aXRsZT0iSW5jcmVhc2UgaW4gU2VudGltZW50IHRvd2FyZHMgUmV0YWlsIENCREMgRmVhdHVyZXMgKEltcG9ydGFudCBTcGVlY2hlcykiKQ0KDQpwbG90X2xwKGxwX2ZlYXR1cmVfc2VudF93aG9fY2JkY3RpdGxlLCBscF9mZWF0dXJlX3N0YW5jZV93aG9fY2JkY3RpdGxlLCANCiAgICAgICAgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIA0KICAgICAgICB0aXRsZT0iSW5jcmVhc2UgaW4gU2VudGltZW50IHRvd2FyZHMgV2hvbGVzYWxlIENCREMgRmVhdHVyZXMgKEltcG9ydGFudCBTcGVlY2hlcykiKQ0KDQpgYGANCiMjIyMjIFByb2Nlc3MNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcGxvdF9scChscF9wcm9jZXNzX3NlbnRfZ2VuX2NiZGN0aXRsZSwgbHBfcHJvY2Vzc19zdGFuY2VfZ2VuX2NiZGN0aXRsZSwgDQogICAgICAgIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCANCiAgICAgICAgdGl0bGU9IkluY3JlYXNlIGluIFNlbnRpbWVudCB0b3dhcmRzIEdlbmVyYWwvVW5zcGVjaWZpZWQgQ0JEQyBQcm9jZXNzIChJbXBvcnRhbnQgU3BlZWNoZXMpIikNCg0KcGxvdF9scChscF9wcm9jZXNzX3NlbnRfcmV0X2NiZGN0aXRsZSwgbHBfcHJvY2Vzc19zdGFuY2VfcmV0X2NiZGN0aXRsZSwgDQogICAgICAgIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCANCiAgICAgICAgdGl0bGU9IkluY3JlYXNlIGluIFNlbnRpbWVudCB0b3dhcmRzIFJldGFpbCBDQkRDIFByb2Nlc3MgKEltcG9ydGFudCBTcGVlY2hlcykiKQ0KDQpwbG90X2xwKGxwX3Byb2Nlc3Nfc2VudF93aG9fY2JkY3RpdGxlLCBscF9wcm9jZXNzX3N0YW5jZV93aG9fY2JkY3RpdGxlLCANCiAgICAgICAgdHlwZT1jKCJTZW50aW1lbnQiLCAiU3RhbmNlIiksIA0KICAgICAgICB0aXRsZT0iSW5jcmVhc2UgaW4gU2VudGltZW50IHRvd2FyZHMgV2hvbGVzYWxlIENCREMgUHJvY2VzcyAoSW1wb3J0YW50IFNwZWVjaGVzKSIpDQpgYGANCg0KDQojIyMjIyBSaXNrLUJlbmVmaXQNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcGxvdF9scChscF9yaXNrYmVuZWZfc2VudF9nZW5fY2JkY3RpdGxlLCBscF9yaXNrYmVuZWZfc3RhbmNlX2dlbl9jYmRjdGl0bGUsIA0KICAgICAgICB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgDQogICAgICAgIHRpdGxlPSJJbmNyZWFzZSBpbiBTZW50aW1lbnQgdG93YXJkcyBHZW5lcmFsL1Vuc3BlY2lmaWVkIENCREMgUmlzay1CZW5lZml0IChJbXBvcnRhbnQgU3BlZWNoZXMpIikNCg0KcGxvdF9scChscF9yaXNrYmVuZWZfc2VudF9yZXRfY2JkY3RpdGxlLCBscF9yaXNrYmVuZWZfc3RhbmNlX3JldF9jYmRjdGl0bGUsIA0KICAgICAgICB0eXBlPWMoIlNlbnRpbWVudCIsICJTdGFuY2UiKSwgDQogICAgICAgIHRpdGxlPSJJbmNyZWFzZSBpbiBTZW50aW1lbnQgdG93YXJkcyBSZXRhaWwgQ0JEQyBSaXNrLUJlbmVmaXQgKEltcG9ydGFudCBTcGVlY2hlcykiKQ0KDQpwbG90X2xwKGxwX3Jpc2tiZW5lZl9zZW50X3dob19jYmRjdGl0bGUsIGxwX3Jpc2tiZW5lZl9zdGFuY2Vfd2hvX2NiZGN0aXRsZSwgDQogICAgICAgIHR5cGU9YygiU2VudGltZW50IiwgIlN0YW5jZSIpLCANCiAgICAgICAgdGl0bGU9IkluY3JlYXNlIGluIFNlbnRpbWVudCB0b3dhcmRzIFdob2xlc2FsZSBDQkRDIFJpc2stQmVuZWZpdCAoSW1wb3J0YW50IFNwZWVjaGVzKSIpDQoNCmBgYA0KDQoNCk5vdGUgOiBKZSBwZW5zZSBxdSdvbiBwZXV0IHV0aWxpc2VyIHVuaXF1ZW1lbnQgbGVzIHNwZWVjaGVzIGltcG9ydGFudHMsIGlscyBkb25uZW50IGRlcyByw6lzdWx0YXRzIHBsdXMgY2xhaXJzIGV0IGMnZXN0IGFzc2V6IGZhY2lsZSBkZSBqdXN0aWZpZXIgbGV1ciB1dGlsaXNhdGlvbiArIGxlcyByw6lzdWx0YXRzIHNvbnQgcm9idXN0ZXMgbWFpcyBtb2lucyBtYXJxdWFudHMgcXVhbmQgb24gdXRpbGlzZSB0b3VzIGxlcyBzcGVlY2hlcy4NCg0KDQoNCg==