diff --git a/chainweb.cabal b/chainweb.cabal index 6539136bd4..ccd1770444 100644 --- a/chainweb.cabal +++ b/chainweb.cabal @@ -148,6 +148,8 @@ library , Chainweb.BlockHeader.Genesis.QuirkedGasPact5InstantTimedCPM1to9Payload , Chainweb.BlockHeader.Genesis.Testnet040Payload , Chainweb.BlockHeader.Genesis.Testnet041to19Payload + , Chainweb.BlockHeader.Genesis.Testnet060Payload + , Chainweb.BlockHeader.Genesis.Testnet061to19Payload , Chainweb.BlockHeader.Genesis.Mainnet0Payload , Chainweb.BlockHeader.Genesis.Mainnet1Payload , Chainweb.BlockHeader.Genesis.Mainnet2Payload @@ -273,6 +275,7 @@ library , Chainweb.Version.RecapDevelopment , Chainweb.Version.Registry , Chainweb.Version.Testnet04 + , Chainweb.Version.Testnet06 , Chainweb.Version.Utils , Chainweb.WebBlockHeaderDB , Chainweb.WebPactExecutionService diff --git a/cwtools/ea/Ea.hs b/cwtools/ea/Ea.hs index a00b2fe738..fb182dcbf9 100644 --- a/cwtools/ea/Ea.hs +++ b/cwtools/ea/Ea.hs @@ -84,6 +84,7 @@ main = do , pact53Transitionnet , quirkedPact5Instantnet , testnet04 + , testnet06 , mainnet , genTxModules , genCoinV3Payloads @@ -108,6 +109,7 @@ main = do pact53Transitionnet = mkPayloads [pact53TransitionCPM0, pact53TransitionCPMN] quirkedPact5Instantnet = mkPayloads [quirkedPact5InstantCPM0, quirkedPact5InstantCPMN] testnet04 = mkPayloads [testnet040, testnet04N] + testnet06 = mkPayloads [testnet060, testnet06N] mainnet = mkPayloads [ mainnet0 , mainnet1 diff --git a/cwtools/ea/Ea/Genesis.hs b/cwtools/ea/Ea/Genesis.hs index 54aa32b47d..920020137b 100644 --- a/cwtools/ea/Ea/Genesis.hs +++ b/cwtools/ea/Ea/Genesis.hs @@ -36,6 +36,10 @@ module Ea.Genesis , testnet040 , testnet04N +-- * Testnet06 Genesis txs +, testnet060 +, testnet06N + -- * Mainnet Genesis txs , mainnet0 , mainnet1 @@ -77,6 +81,7 @@ import Chainweb.Version.Development import Chainweb.Version.RecapDevelopment import Chainweb.Version.Mainnet import Chainweb.Version.Testnet04 +import Chainweb.Version.Testnet06 -- ---------------------------------------------------------------------- -- -- Genesis Tx Data @@ -372,6 +377,28 @@ testnetAllocations = "pact/genesis/testnet04/allocations.yaml" testnetKeysets :: FilePath testnetKeysets = "pact/genesis/testnet04/keysets.yaml" + +-- ---------------------------------------------------------------------- -- +-- Testnet 06 + +testnet060 :: Genesis +testnet060 = Genesis + { _version = Testnet06 + , _tag = "Testnet06" + , _txChainIds = onlyChainId 0 + , _coinbase = Just "pact/genesis/testnet06/grants0.yaml" + , _keysets = Just "pact/genesis/testnet06/keysets.yaml" + , _allocations = Just "pact/genesis/testnet06/allocations.yaml" + , _namespaces = Just testNs + , _coinContract = [fungibleAssetV1, coinContractV1, gasPayer] + } + +testnet06N :: Genesis +testnet06N = testnet060 + & txChainIds .~ mkChainIdRange 1 19 + & coinbase ?~ "pact/genesis/testnet06/grantsN.yaml" + + -- ---------------------------------------------------------------------- -- -- Mainnet diff --git a/pact/genesis/testnet06/allocations.yaml b/pact/genesis/testnet06/allocations.yaml new file mode 100644 index 0000000000..4780125039 --- /dev/null +++ b/pact/genesis/testnet06/allocations.yaml @@ -0,0 +1,6 @@ +code: |- + (coin.create-allocation-account "allocation00" (time "1900-10-15T18:00:00Z") "allocation00" 1000000.0) + (coin.create-allocation-account "allocation01" (time "2026-01-31T18:00:00Z") "allocation01" 1000000.0) + (coin.create-allocation-account "allocation02" (time "2026-06-31T18:00:00Z") "allocation02" 1000000.0) +nonce: testnet-allocations-0 +keyPairs: [] diff --git a/pact/genesis/testnet06/grants0.yaml b/pact/genesis/testnet06/grants0.yaml new file mode 100644 index 0000000000..c7d5976a68 --- /dev/null +++ b/pact/genesis/testnet06/grants0.yaml @@ -0,0 +1,21 @@ +# Internal testnet accounts +code: |- + (coin.coinbase "sender0" (read-keyset "sender0") 1.0) + (coin.coinbase "pascal" (read-keyset "pascal") 100000.0) + (coin.coinbase "edmund" (read-keyset "edmund") 100000.0) + (coin.coinbase "jose" (read-keyset "jose") 100000.0) + (coin.coinbase "jumbo" (read-keyset "jumbo") 100000.0) + (coin.coinbase "philipp" (read-keyset "edmund") 100000.0) + (coin.coinbase "louis" (read-keyset "louis") 100000.0) + + +data: + sender0: ["c03e76c81a56f831a1ea91b93545d6b49daffc53c7416e065fcffb025faee47e"] + pascal: ["85e745b37605de2e4be123c8e9e65404227912c429e45f87b348b5c19ffb1f38"] + edmund: ["bb42ed45d8f2676b0b75cc11abe834f8287841322271ba574011e4fdf23631b7"] + jose: ["f5a17c5fd9f9d2623ba5e6283de1445f694c0d5a6f7df7b6a44a4f887b3e9eae"] + jumbo: ["eeb0fca9d4d8a72178e4d150152858484a63c27d3991caf48cc9003479156f00"] + philipp: ["3c7cd44578bb90b793e62a10f05a99ce9a2e0f067fbb4ff094d19e13a279ef9b"] + louis: ["c389e2fab9fabdc2958d3d9916ea7899f35b906d192b69f211a79bb4c2379bcf"] +nonce: testnet06-grants-0 +keyPairs: [] diff --git a/pact/genesis/testnet06/grantsN.yaml b/pact/genesis/testnet06/grantsN.yaml new file mode 100644 index 0000000000..8cab5ff784 --- /dev/null +++ b/pact/genesis/testnet06/grantsN.yaml @@ -0,0 +1,8 @@ +# Internal testnet accounts +code: |- + (coin.coinbase "sender0" (read-keyset "sender0") 1.0) + +data: + sender0: ["c03e76c81a56f831a1ea91b93545d6b49daffc53c7416e065fcffb025faee47e"] +nonce: testnet06-grants-N +keyPairs: [] diff --git a/pact/genesis/testnet06/keysets.yaml b/pact/genesis/testnet06/keysets.yaml new file mode 100644 index 0000000000..9007d691e5 --- /dev/null +++ b/pact/genesis/testnet06/keysets.yaml @@ -0,0 +1,12 @@ +code: |- + (define-keyset "allocation00" (read-keyset "allocation00")) + (define-keyset "allocation01" (read-keyset "allocation01")) + (define-keyset "allocation02" (read-keyset "allocation02")) + +data: + allocation00: ["f8a1c425cb65899ae0bf0dd4c6a982554f2ce8914c5084446f4999c3c0019990"] + allocation01: ["e55612401fb67190d3c0a905749264806a3b66c9b9d048b84b96e120e4a387dc"] + allocation02: ["d2502cdab08ef8649090e924d0fd69ce89c2c314fb52bf54405769aa5b425eeb"] + +nonce: testnet06-keysets-N +keyPairs: [] diff --git a/src/Chainweb/BlockHeader/Genesis/Testnet060Payload.hs b/src/Chainweb/BlockHeader/Genesis/Testnet060Payload.hs new file mode 100644 index 0000000000..bd9d31a087 --- /dev/null +++ b/src/Chainweb/BlockHeader/Genesis/Testnet060Payload.hs @@ -0,0 +1,37 @@ +{-# LANGUAGE OverloadedStrings #-} + +-- This module is auto-generated. DO NOT EDIT IT MANUALLY. + +module Chainweb.BlockHeader.Genesis.Testnet060Payload ( payloadBlock ) where + +import qualified Data.Text as T +import qualified Data.Vector as V +import GHC.Stack + +import Chainweb.Payload +import Chainweb.Utils (unsafeFromText, toText) + +payloadBlock :: HasCallStack => PayloadWithOutputs +payloadBlock + | actualHash == expectedHash = payload + | otherwise = error + $ "inconsistent genesis payload detected. THIS IS A BUG in chainweb-node" + <> ". Expected: " <> T.unpack (toText expectedHash) + <> ", actual: " <> T.unpack (toText actualHash) + where + actualHash, expectedHash :: BlockPayloadHash + actualHash = _payloadWithOutputsPayloadHash payload + expectedHash = unsafeFromText "EyMMEitzZjPXEtL8cVgEgiN4w48CBBx0wMWZGQDretw" + + payload = newPayloadWithOutputs minerData coinbase txs + minerData = unsafeFromText "eyJhY2NvdW50IjoiTm9NaW5lciIsInByZWRpY2F0ZSI6IjwiLCJwdWJsaWMta2V5cyI6W119" + coinbase = unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6Ik5PX0NPSU5CQVNFIn0sInJlcUtleSI6IkRsZFJ3Q2JsUTdMb3F5NndZSm5hb2RIbDMwZDNqM2VILXF0RnpmRXY0NmciLCJsb2dzIjpudWxsLCJtZXRhRGF0YSI6bnVsbCwiY29udGludWF0aW9uIjpudWxsLCJ0eElkIjpudWxsfQ" + txs = V.fromList + [ (unsafeFromText "eyJoYXNoIjoiNDhUMExqQW5TRnBGV3h2dmFQVi1fNkUtQ2pEQVBoV1lVRldidnlmMmxGcyIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6bnVsbCxcImNvZGVcIjpcIihpbnRlcmZhY2UgZnVuZ2libGUtdjFcXG5cXG4gIFxcXCIgU3RhbmRhcmQgZm9yIGZ1bmdpYmxlIGNvaW5zIGFuZCB0b2tlbnMgYXMgc3BlY2lmaWVkIGluIEtJUC0wMDAyLiBcXFwiXFxuXFxuICAgOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICAgOyBTY2hlbWFcXG5cXG4gICAoZGVmc2NoZW1hIGFjY291bnQtZGV0YWlsc1xcbiAgICBAZG9jIFxcXCJTY2hlbWEgZm9yIHJlc3VsdHMgb2YgJ2FjY291bnQnIG9wZXJhdGlvbi5cXFwiXFxuICAgIEBtb2RlbCBbIChpbnZhcmlhbnQgKCE9IFxcXCJcXFwiIHNlbmRlcikpIF1cXG5cXG4gICAgYWNjb3VudDpzdHJpbmdcXG4gICAgYmFsYW5jZTpkZWNpbWFsXFxuICAgIGd1YXJkOmd1YXJkKVxcblxcblxcbiAgIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgIDsgQ2Fwc1xcblxcbiAgIChkZWZjYXAgVFJBTlNGRVI6Ym9vbFxcbiAgICAgKCBzZW5kZXI6c3RyaW5nXFxuICAgICAgIHJlY2VpdmVyOnN0cmluZ1xcbiAgICAgICBhbW91bnQ6ZGVjaW1hbFxcbiAgICAgKVxcbiAgICAgQGRvYyBcXFwiIE1hbmFnZWQgY2FwYWJpbGl0eSBzZWFsaW5nIEFNT1VOVCBmb3IgdHJhbnNmZXIgZnJvbSBTRU5ERVIgdG8gXFxcXFxcbiAgICAgICAgICBcXFxcIFJFQ0VJVkVSLiBQZXJtaXRzIGFueSBudW1iZXIgb2YgdHJhbnNmZXJzIHVwIHRvIEFNT1VOVC5cXFwiXFxuICAgICBAbWFuYWdlZCBhbW91bnQgVFJBTlNGRVItbWdyXFxuICAgICApXFxuXFxuICAgKGRlZnVuIFRSQU5TRkVSLW1ncjpkZWNpbWFsXFxuICAgICAoIG1hbmFnZWQ6ZGVjaW1hbFxcbiAgICAgICByZXF1ZXN0ZWQ6ZGVjaW1hbFxcbiAgICAgKVxcbiAgICAgQGRvYyBcXFwiIE1hbmFnZXMgVFJBTlNGRVIgQU1PVU5UIGxpbmVhcmx5LCBcXFxcXFxuICAgICAgICAgIFxcXFwgc3VjaCB0aGF0IGEgcmVxdWVzdCBmb3IgMS4wIGFtb3VudCBvbiBhIDMuMCBcXFxcXFxuICAgICAgICAgIFxcXFwgbWFuYWdlZCBxdWFudGl0eSBlbWl0cyB1cGRhdGVkIGFtb3VudCAyLjAuXFxcIlxcbiAgICAgKVxcblxcbiAgIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgIDsgRnVuY3Rpb25hbGl0eVxcblxcbiAgIChkZWZ1biB0cmFuc2Zlci1jcmVhdGU6c3RyaW5nXFxuICAgICAoIHNlbmRlcjpzdHJpbmdcXG4gICAgICAgcmVjZWl2ZXI6c3RyaW5nXFxuICAgICAgIHJlY2VpdmVyLWd1YXJkOmd1YXJkXFxuICAgICAgIGFtb3VudDpkZWNpbWFsXFxuICAgICApXFxuICAgICBAZG9jIFxcXCIgVHJhbnNmZXIgQU1PVU5UIGJldHdlZW4gYWNjb3VudHMgU0VOREVSIGFuZCBSRUNFSVZFUi4gXFxcXFxcbiAgICAgICAgICBcXFxcIEZhaWxzIGlmIFNFTkRFUiBkb2VzIG5vdCBleGlzdC4gSWYgUkVDRUlWRVIgZXhpc3RzLCBndWFyZCBcXFxcXFxuICAgICAgICAgIFxcXFwgbXVzdCBtYXRjaCBleGlzdGluZyB2YWx1ZS4gSWYgUkVDRUlWRVIgZG9lcyBub3QgZXhpc3QsIFxcXFxcXG4gICAgICAgICAgXFxcXCBSRUNFSVZFUiBhY2NvdW50IGlzIGNyZWF0ZWQgdXNpbmcgUkVDRUlWRVItR1VBUkQuIFxcXFxcXG4gICAgICAgICAgXFxcXCBTdWJqZWN0IHRvIG1hbmFnZW1lbnQgYnkgVFJBTlNGRVIgY2FwYWJpbGl0eS5cXFwiXFxuICAgICBAbW9kZWwgWyAocHJvcGVydHkgKD4gYW1vdW50IDAuMCkpXFxuICAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHNlbmRlciBcXFwiXFxcIikpXFxuICAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHJlY2VpdmVyIFxcXCJcXFwiKSlcXG4gICAgICAgICAgICAgIChwcm9wZXJ0eSAoIT0gc2VuZGVyIHJlY2VpdmVyKSlcXG4gICAgICAgICAgICBdXFxuICAgICApXFxuXFxuICAgKGRlZnBhY3QgdHJhbnNmZXItY3Jvc3NjaGFpbjpzdHJpbmdcXG4gICAgICggc2VuZGVyOnN0cmluZ1xcbiAgICAgICByZWNlaXZlcjpzdHJpbmdcXG4gICAgICAgcmVjZWl2ZXItZ3VhcmQ6Z3VhcmRcXG4gICAgICAgdGFyZ2V0LWNoYWluOnN0cmluZ1xcbiAgICAgICBhbW91bnQ6ZGVjaW1hbFxcbiAgICAgKVxcbiAgICAgQGRvYyBcXFwiIDItc3RlcCBwYWN0IHRvIHRyYW5zZmVyIEFNT1VOVCBmcm9tIFNFTkRFUiBvbiBjdXJyZW50IGNoYWluIFxcXFxcXG4gICAgICAgICAgXFxcXCB0byBSRUNFSVZFUiBvbiBUQVJHRVQtQ0hBSU4gdmlhIFNQViBwcm9vZi4gXFxcXFxcbiAgICAgICAgICBcXFxcIFRBUkdFVC1DSEFJTiBtdXN0IGJlIGRpZmZlcmVudCB0aGFuIGN1cnJlbnQgY2hhaW4gaWQuIFxcXFxcXG4gICAgICAgICAgXFxcXCBGaXJzdCBzdGVwIGRlYml0cyBBTU9VTlQgY29pbnMgaW4gU0VOREVSIGFjY291bnQgYW5kIHlpZWxkcyBcXFxcXFxuICAgICAgICAgIFxcXFwgUkVDRUlWRVIsIFJFQ0VJVkVSX0dVQVJEIGFuZCBBTU9VTlQgdG8gVEFSR0VULUNIQUlOLiBcXFxcXFxuICAgICAgICAgIFxcXFwgU2Vjb25kIHN0ZXAgY29udGludWF0aW9uIGlzIHNlbnQgaW50byBUQVJHRVQtQ0hBSU4gd2l0aCBwcm9vZiBcXFxcXFxuICAgICAgICAgIFxcXFwgb2J0YWluZWQgZnJvbSB0aGUgc3B2ICdvdXRwdXQnIGVuZHBvaW50IG9mIENoYWlud2ViLiBcXFxcXFxuICAgICAgICAgIFxcXFwgUHJvb2YgaXMgdmFsaWRhdGVkIGFuZCBSRUNFSVZFUiBpcyBjcmVkaXRlZCB3aXRoIEFNT1VOVCBcXFxcXFxuICAgICAgICAgIFxcXFwgY3JlYXRpbmcgYWNjb3VudCB3aXRoIFJFQ0VJVkVSX0dVQVJEIGFzIG5lY2Vzc2FyeS5cXFwiXFxuICAgICBAbW9kZWwgWyAocHJvcGVydHkgKD4gYW1vdW50IDAuMCkpXFxuICAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHNlbmRlciBcXFwiXFxcIikpXFxuICAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHJlY2VpdmVyIFxcXCJcXFwiKSlcXG4gICAgICAgICAgICAgIChwcm9wZXJ0eSAoIT0gc2VuZGVyIHJlY2VpdmVyKSlcXG4gICAgICAgICAgICAgIChwcm9wZXJ0eSAoIT0gdGFyZ2V0LWNoYWluIFxcXCJcXFwiKSlcXG4gICAgICAgICAgICBdXFxuICAgICApXFxuXFxuICAgKGRlZnVuIGdldC1iYWxhbmNlOmRlY2ltYWxcXG4gICAgICggYWNjb3VudDpzdHJpbmcgKVxcbiAgICAgXFxcIiBHZXQgYmFsYW5jZSBmb3IgQUNDT1VOVC4gRmFpbHMgaWYgYWNjb3VudCBkb2VzIG5vdCBleGlzdC5cXFwiXFxuICAgICApXFxuXFxuICAgKGRlZnVuIGRldGFpbHM6b2JqZWN0e2FjY291bnQtZGV0YWlsc31cXG4gICAgICggYWNjb3VudDogc3RyaW5nIClcXG4gICAgIFxcXCIgR2V0IGFuIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgQUNDT1VOVC4gXFxcXFxcbiAgICAgXFxcXCBGYWlscyBpZiBhY2NvdW50IGRvZXMgbm90IGV4aXN0LlxcXCJcXG4gICAgIClcXG5cXG4gICAoZGVmdW4gcHJlY2lzaW9uOmludGVnZXJcXG4gICAgICgpXFxuICAgICBcXFwiUmV0dXJuIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGVjaW1hbCBwcmVjaXNpb24uXFxcIlxcbiAgICAgKVxcblxcbiAgIChkZWZ1biBlbmZvcmNlLXVuaXQ6Ym9vbFxcbiAgICAgKCBhbW91bnQ6ZGVjaW1hbCApXFxuICAgICBcXFwiIEVuZm9yY2UgbWluaW11bSBwcmVjaXNpb24gYWxsb3dlZCBmb3IgdHJhbnNhY3Rpb25zLlxcXCJcXG4gICAgIClcXG5cXG4gICAoZGVmdW4gY3JlYXRlLWFjY291bnQ6c3RyaW5nXFxuICAgICAoIGFjY291bnQ6c3RyaW5nXFxuICAgICAgIGd1YXJkOmd1YXJkXFxuICAgICApXFxuICAgICBcXFwiIENyZWF0ZSBBQ0NPVU5UIHdpdGggMC4wIGJhbGFuY2UsIHdpdGggR1VBUkQgY29udHJvbGxpbmcgYWNjZXNzLlxcXCJcXG4gICAgIClcXG5cXG4gICAoZGVmdW4gcm90YXRlOnN0cmluZ1xcbiAgICAgKCBhY2NvdW50OnN0cmluZ1xcbiAgICAgICBuZXctZ3VhcmQ6Z3VhcmRcXG4gICAgIClcXG4gICAgIFxcXCIgUm90YXRlIGd1YXJkIGZvciBBQ0NPVU5ULiBUcmFuc2FjdGlvbiBpcyB2YWxpZGF0ZWQgYWdhaW5zdCBcXFxcXFxuICAgICBcXFxcIGV4aXN0aW5nIGd1YXJkIGJlZm9yZSBpbnN0YWxsaW5nIG5ldyBndWFyZC4gXFxcIlxcbiAgICAgKVxcblxcbilcXG5cIn19LFwic2lnbmVyc1wiOltdLFwibWV0YVwiOntcImNyZWF0aW9uVGltZVwiOjAsXCJ0dGxcIjoxNzI4MDAsXCJnYXNMaW1pdFwiOjAsXCJjaGFpbklkXCI6XCJcIixcImdhc1ByaWNlXCI6MCxcInNlbmRlclwiOlwiXCJ9LFwibm9uY2VcIjpcImdlbmVzaXMtMDFcIn0ifQ", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IkxvYWRlZCBpbnRlcmZhY2UgZnVuZ2libGUtdjEifSwicmVxS2V5IjoiNDhUMExqQW5TRnBGV3h2dmFQVi1fNkUtQ2pEQVBoV1lVRldidnlmMmxGcyIsImxvZ3MiOiJRRmEyOHRuOXkydFdMVzdUc3lHdzNOTkhpYzhxYjJ6UGtudXRpWWhnQXc4IiwibWV0YURhdGEiOm51bGwsImNvbnRpbnVhdGlvbiI6bnVsbCwidHhJZCI6MH0") + , (unsafeFromText "eyJoYXNoIjoiWEdQRVFEazVQSXZRa3BxMEdHa2dOVG1vLW1qa2k2M1pQZ0VSX2tvdnhxNCIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6bnVsbCxcImNvZGVcIjpcIihtb2R1bGUgY29pbiBHT1ZFUk5BTkNFXFxuXFxuICBAZG9jIFxcXCInY29pbicgcmVwcmVzZW50cyB0aGUgS2FkZW5hIENvaW4gQ29udHJhY3QuIFRoaXMgY29udHJhY3QgcHJvdmlkZXMgYm90aCB0aGUgXFxcXFxcbiAgXFxcXGJ1eS9yZWRlZW0gZ2FzIHN1cHBvcnQgaW4gdGhlIGZvcm0gb2YgJ2Z1bmQtdHgnLCBhcyB3ZWxsIGFzIHRyYW5zZmVyLCAgICAgICBcXFxcXFxuICBcXFxcY3JlZGl0LCBkZWJpdCwgY29pbmJhc2UsIGFjY291bnQgY3JlYXRpb24gYW5kIHF1ZXJ5LCBhcyB3ZWxsIGFzIFNQViBidXJuICAgIFxcXFxcXG4gIFxcXFxjcmVhdGUuIFRvIGFjY2VzcyB0aGUgY29pbiBjb250cmFjdCwgeW91IG1heSB1c2UgaXRzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCAgXFxcXFxcbiAgXFxcXG9yIGlzc3VlIHRoZSAnKHVzZSBjb2luKScgY29tbWFuZCBpbiB0aGUgYm9keSBvZiBhIG1vZHVsZSBkZWNsYXJhdGlvbi5cXFwiXFxuXFxuICBAbW9kZWxcXG4gICAgWyAoZGVmcHJvcGVydHkgY29uc2VydmVzLW1hc3NcXG4gICAgICAgICg9IChjb2x1bW4tZGVsdGEgY29pbi10YWJsZSAnYmFsYW5jZSkgMC4wKSlcXG5cXG4gICAgICAoZGVmcHJvcGVydHkgdmFsaWQtYWNjb3VudCAoYWNjb3VudDpzdHJpbmcpXFxuICAgICAgICAoYW5kXFxuICAgICAgICAgICg-PSAobGVuZ3RoIGFjY291bnQpIDMpXFxuICAgICAgICAgICg8PSAobGVuZ3RoIGFjY291bnQpIDI1NikpKVxcbiAgICBdXFxuXFxuICAoaW1wbGVtZW50cyBmdW5naWJsZS12MSlcXG5cXG4gIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gIDsgU2NoZW1hcyBhbmQgVGFibGVzXFxuXFxuICAoZGVmc2NoZW1hIGNvaW4tc2NoZW1hXFxuICAgIEBkb2MgXFxcIlRoZSBjb2luIGNvbnRyYWN0IHRva2VuIHNjaGVtYVxcXCJcXG4gICAgQG1vZGVsIFsgKGludmFyaWFudCAoPj0gYmFsYW5jZSAwLjApKSBdXFxuXFxuICAgIGJhbGFuY2U6ZGVjaW1hbFxcbiAgICBndWFyZDpndWFyZClcXG5cXG4gIChkZWZ0YWJsZSBjb2luLXRhYmxlOntjb2luLXNjaGVtYX0pXFxuXFxuICA7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICA7IENhcGFiaWxpdGllc1xcblxcbiAgKGRlZmNhcCBHT1ZFUk5BTkNFICgpXFxuICAgIChlbmZvcmNlIGZhbHNlIFxcXCJFbmZvcmNlIG5vbi11cGdyYWRlYWJpbGl0eVxcXCIpKVxcblxcbiAgKGRlZmNhcCBHQVMgKClcXG4gICAgXFxcIk1hZ2ljIGNhcGFiaWxpdHkgdG8gcHJvdGVjdCBnYXMgYnV5IGFuZCByZWRlZW1cXFwiXFxuICAgIHRydWUpXFxuXFxuICAoZGVmY2FwIENPSU5CQVNFICgpXFxuICAgIFxcXCJNYWdpYyBjYXBhYmlsaXR5IHRvIHByb3RlY3QgbWluZXIgcmV3YXJkXFxcIlxcbiAgICB0cnVlKVxcblxcbiAgKGRlZmNhcCBHRU5FU0lTICgpXFxuICAgIFxcXCJNYWdpYyBjYXBhYmlsaXR5IGNvbnN0cmFpbmluZyBnZW5lc2lzIHRyYW5zYWN0aW9uc1xcXCJcXG4gICAgdHJ1ZSlcXG5cXG4gIChkZWZjYXAgREVCSVQgKHNlbmRlcjpzdHJpbmcpXFxuICAgIFxcXCJDYXBhYmlsaXR5IGZvciBtYW5hZ2luZyBkZWJpdGluZyBvcGVyYXRpb25zXFxcIlxcbiAgICAoZW5mb3JjZS1ndWFyZCAoYXQgJ2d1YXJkIChyZWFkIGNvaW4tdGFibGUgc2VuZGVyKSkpXFxuICAgIChlbmZvcmNlICghPSBzZW5kZXIgXFxcIlxcXCIpIFxcXCJ2YWxpZCBzZW5kZXJcXFwiKSlcXG5cXG4gIChkZWZjYXAgQ1JFRElUIChyZWNlaXZlcjpzdHJpbmcpXFxuICAgIFxcXCJDYXBhYmlsaXR5IGZvciBtYW5hZ2luZyBjcmVkaXRpbmcgb3BlcmF0aW9uc1xcXCJcXG4gICAgKGVuZm9yY2UgKCE9IHJlY2VpdmVyIFxcXCJcXFwiKSBcXFwidmFsaWQgcmVjZWl2ZXJcXFwiKSlcXG5cXG4gIChkZWZjYXAgVFJBTlNGRVI6Ym9vbFxcbiAgICAoIHNlbmRlcjpzdHJpbmdcXG4gICAgICByZWNlaXZlcjpzdHJpbmdcXG4gICAgICBhbW91bnQ6ZGVjaW1hbFxcbiAgICApXFxuICAgIEBtYW5hZ2VkIGFtb3VudCBUUkFOU0ZFUi1tZ3JcXG4gICAgKGVuZm9yY2UgKCE9IHNlbmRlciByZWNlaXZlcikgXFxcInNhbWUgc2VuZGVyIGFuZCByZWNlaXZlclxcXCIpXFxuICAgIChlbmZvcmNlLXVuaXQgYW1vdW50KVxcbiAgICAoZW5mb3JjZSAoPiBhbW91bnQgMC4wKSBcXFwiUG9zaXRpdmUgYW1vdW50XFxcIilcXG4gICAgKGNvbXBvc2UtY2FwYWJpbGl0eSAoREVCSVQgc2VuZGVyKSlcXG4gICAgKGNvbXBvc2UtY2FwYWJpbGl0eSAoQ1JFRElUIHJlY2VpdmVyKSlcXG4gIClcXG5cXG4gIChkZWZ1biBUUkFOU0ZFUi1tZ3I6ZGVjaW1hbFxcbiAgICAoIG1hbmFnZWQ6ZGVjaW1hbFxcbiAgICAgIHJlcXVlc3RlZDpkZWNpbWFsXFxuICAgIClcXG5cXG4gICAgKGxldCAoKG5ld2JhbCAoLSBtYW5hZ2VkIHJlcXVlc3RlZCkpKVxcbiAgICAgIChlbmZvcmNlICg-PSBuZXdiYWwgMC4wKVxcbiAgICAgICAgKGZvcm1hdCBcXFwiVFJBTlNGRVIgZXhjZWVkZWQgZm9yIGJhbGFuY2Uge31cXFwiIFttYW5hZ2VkXSkpXFxuICAgICAgbmV3YmFsKVxcbiAgKVxcblxcbiAgOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgOyBDb25zdGFudHNcXG5cXG4gIChkZWZjb25zdCBDT0lOX0NIQVJTRVQgQ0hBUlNFVF9MQVRJTjFcXG4gICAgXFxcIlRoZSBkZWZhdWx0IGNvaW4gY29udHJhY3QgY2hhcmFjdGVyIHNldFxcXCIpXFxuXFxuICAoZGVmY29uc3QgTUlOSU1VTV9QUkVDSVNJT04gMTJcXG4gICAgXFxcIk1pbmltdW0gYWxsb3dlZCBwcmVjaXNpb24gZm9yIGNvaW4gdHJhbnNhY3Rpb25zXFxcIilcXG5cXG4gIChkZWZjb25zdCBNSU5JTVVNX0FDQ09VTlRfTEVOR1RIIDNcXG4gICAgXFxcIk1pbmltdW0gYWNjb3VudCBsZW5ndGggYWRtaXNzaWJsZSBmb3IgY29pbiBhY2NvdW50c1xcXCIpXFxuXFxuICAoZGVmY29uc3QgTUFYSU1VTV9BQ0NPVU5UX0xFTkdUSCAyNTZcXG4gICAgXFxcIk1heGltdW0gYWNjb3VudCBuYW1lIGxlbmd0aCBhZG1pc3NpYmxlIGZvciBjb2luIGFjY291bnRzXFxcIilcXG5cXG4gIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gIDsgVXRpbGl0aWVzXFxuXFxuICAoZGVmdW4gZW5mb3JjZS11bml0OmJvb2wgKGFtb3VudDpkZWNpbWFsKVxcbiAgICBAZG9jIFxcXCJFbmZvcmNlIG1pbmltdW0gcHJlY2lzaW9uIGFsbG93ZWQgZm9yIGNvaW4gdHJhbnNhY3Rpb25zXFxcIlxcblxcbiAgICAoZW5mb3JjZVxcbiAgICAgICg9IChmbG9vciBhbW91bnQgTUlOSU1VTV9QUkVDSVNJT04pXFxuICAgICAgICAgYW1vdW50KVxcbiAgICAgIChmb3JtYXQgXFxcIkFtb3VudCB2aW9sYXRlcyBtaW5pbXVtIHByZWNpc2lvbjoge31cXFwiIFthbW91bnRdKSlcXG4gICAgKVxcblxcbiAgKGRlZnVuIHZhbGlkYXRlLWFjY291bnQgKGFjY291bnQ6c3RyaW5nKVxcbiAgICBAZG9jIFxcXCJFbmZvcmNlIHRoYXQgYW4gYWNjb3VudCBuYW1lIGNvbmZvcm1zIHRvIHRoZSBjb2luIGNvbnRyYWN0IFxcXFxcXG4gICAgICAgICBcXFxcbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggcmVxdWlyZW1lbnRzLCBhcyB3ZWxsIGFzIHRoZSAgICBcXFxcXFxuICAgICAgICAgXFxcXGxhdGluLTEgY2hhcmFjdGVyIHNldC5cXFwiXFxuXFxuICAgIChlbmZvcmNlXFxuICAgICAgKGlzLWNoYXJzZXQgQ09JTl9DSEFSU0VUIGFjY291bnQpXFxuICAgICAgKGZvcm1hdFxcbiAgICAgICAgXFxcIkFjY291bnQgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgY29pbiBjb250cmFjdCBjaGFyc2V0OiB7fVxcXCJcXG4gICAgICAgIFthY2NvdW50XSkpXFxuXFxuICAgIChsZXQgKChhY2NvdW50LWxlbmd0aCAobGVuZ3RoIGFjY291bnQpKSlcXG5cXG4gICAgICAoZW5mb3JjZVxcbiAgICAgICAgKD49IGFjY291bnQtbGVuZ3RoIE1JTklNVU1fQUNDT1VOVF9MRU5HVEgpXFxuICAgICAgICAoZm9ybWF0XFxuICAgICAgICAgIFxcXCJBY2NvdW50IG5hbWUgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgbWluIGxlbmd0aCByZXF1aXJlbWVudDoge31cXFwiXFxuICAgICAgICAgIFthY2NvdW50XSkpXFxuXFxuICAgICAgKGVuZm9yY2VcXG4gICAgICAgICg8PSBhY2NvdW50LWxlbmd0aCBNQVhJTVVNX0FDQ09VTlRfTEVOR1RIKVxcbiAgICAgICAgKGZvcm1hdFxcbiAgICAgICAgICBcXFwiQWNjb3VudCBuYW1lIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIG1heCBsZW5ndGggcmVxdWlyZW1lbnQ6IHt9XFxcIlxcbiAgICAgICAgICBbYWNjb3VudF0pKVxcbiAgICAgIClcXG4gIClcXG5cXG4gIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gIDsgQ29pbiBDb250cmFjdFxcblxcbiAgKGRlZnVuIGdhcy1vbmx5ICgpXFxuICAgIFxcXCJQcmVkaWNhdGUgZm9yIGdhcy1vbmx5IHVzZXIgZ3VhcmRzLlxcXCJcXG4gICAgKHJlcXVpcmUtY2FwYWJpbGl0eSAoR0FTKSkpXFxuXFxuICAoZGVmdW4gZ2FzLWd1YXJkIChndWFyZDpndWFyZClcXG4gICAgXFxcIlByZWRpY2F0ZSBmb3IgZ2FzICsgc2luZ2xlIGtleSB1c2VyIGd1YXJkc1xcXCJcXG4gICAgKGVuZm9yY2Utb25lXFxuICAgICAgXFxcIkVuZm9yY2UgZWl0aGVyIHRoZSBwcmVzZW5jZSBvZiBhIEdBUyBjYXAgb3Iga2V5c2V0XFxcIlxcbiAgICAgIFsgKGdhcy1vbmx5KVxcbiAgICAgICAgKGVuZm9yY2UtZ3VhcmQgZ3VhcmQpXFxuICAgICAgXSkpXFxuXFxuICAoZGVmdW4gYnV5LWdhczpzdHJpbmcgKHNlbmRlcjpzdHJpbmcgdG90YWw6ZGVjaW1hbClcXG4gICAgQGRvYyBcXFwiVGhpcyBmdW5jdGlvbiBkZXNjcmliZXMgdGhlIG1haW4gJ2dhcyBidXknIG9wZXJhdGlvbi4gQXQgdGhpcyBwb2ludCBcXFxcXFxuICAgIFxcXFxNSU5FUiBoYXMgYmVlbiBjaG9zZW4gZnJvbSB0aGUgcG9vbCwgYW5kIHdpbGwgYmUgdmFsaWRhdGVkLiBUaGUgU0VOREVSICAgXFxcXFxcbiAgICBcXFxcb2YgdGhpcyB0cmFuc2FjdGlvbiBoYXMgc3BlY2lmaWVkIGEgZ2FzIGxpbWl0IExJTUlUIChtYXhpbXVtIGdhcykgZm9yICAgIFxcXFxcXG4gICAgXFxcXHRoZSB0cmFuc2FjdGlvbiwgYW5kIHRoZSBwcmljZSBpcyB0aGUgc3BvdCBwcmljZSBvZiBnYXMgYXQgdGhhdCB0aW1lLiAgICBcXFxcXFxuICAgIFxcXFxUaGUgZ2FzIGJ1eSB3aWxsIGJlIGV4ZWN1dGVkIHByaW9yIHRvIGV4ZWN1dGluZyBTRU5ERVIncyBjb2RlLlxcXCJcXG5cXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5ICg-IHRvdGFsIDAuMCkpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBzZW5kZXIpKVxcbiAgICAgICAgICAgXVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBzZW5kZXIpXFxuXFxuICAgIChlbmZvcmNlLXVuaXQgdG90YWwpXFxuICAgIChlbmZvcmNlICg-IHRvdGFsIDAuMCkgXFxcImdhcyBzdXBwbHkgbXVzdCBiZSBhIHBvc2l0aXZlIHF1YW50aXR5XFxcIilcXG5cXG4gICAgKHJlcXVpcmUtY2FwYWJpbGl0eSAoR0FTKSlcXG4gICAgKHdpdGgtY2FwYWJpbGl0eSAoREVCSVQgc2VuZGVyKVxcbiAgICAgIChkZWJpdCBzZW5kZXIgdG90YWwpKVxcbiAgICApXFxuXFxuICAoZGVmdW4gcmVkZWVtLWdhczpzdHJpbmcgKG1pbmVyOnN0cmluZyBtaW5lci1ndWFyZDpndWFyZCBzZW5kZXI6c3RyaW5nIHRvdGFsOmRlY2ltYWwpXFxuICAgIEBkb2MgXFxcIlRoaXMgZnVuY3Rpb24gZGVzY3JpYmVzIHRoZSBtYWluICdyZWRlZW0gZ2FzJyBvcGVyYXRpb24uIEF0IHRoaXMgICAgXFxcXFxcbiAgICBcXFxccG9pbnQsIHRoZSBTRU5ERVIncyB0cmFuc2FjdGlvbiBoYXMgYmVlbiBleGVjdXRlZCwgYW5kIHRoZSBnYXMgdGhhdCAgICAgIFxcXFxcXG4gICAgXFxcXHdhcyBjaGFyZ2VkIGhhcyBiZWVuIGNhbGN1bGF0ZWQuIE1JTkVSIHdpbGwgYmUgY3JlZGl0ZWQgdGhlIGdhcyBjb3N0LCAgICBcXFxcXFxuICAgIFxcXFxhbmQgU0VOREVSIHdpbGwgcmVjZWl2ZSB0aGUgcmVtYWluZGVyIHVwIHRvIHRoZSBsaW1pdFxcXCJcXG5cXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5ICg-IHRvdGFsIDAuMCkpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBzZW5kZXIpKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKHZhbGlkLWFjY291bnQgbWluZXIpKVxcbiAgICAgICAgICAgXVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBzZW5kZXIpXFxuICAgICh2YWxpZGF0ZS1hY2NvdW50IG1pbmVyKVxcbiAgICAoZW5mb3JjZS11bml0IHRvdGFsKVxcblxcbiAgICAocmVxdWlyZS1jYXBhYmlsaXR5IChHQVMpKVxcbiAgICAobGV0KlxcbiAgICAgICgoZmVlIChyZWFkLWRlY2ltYWwgXFxcImZlZVxcXCIpKVxcbiAgICAgICAocmVmdW5kICgtIHRvdGFsIGZlZSkpKVxcblxcbiAgICAgIChlbmZvcmNlLXVuaXQgZmVlKVxcbiAgICAgIChlbmZvcmNlICg-PSBmZWUgMC4wKVxcbiAgICAgICAgXFxcImZlZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHF1YW50aXR5XFxcIilcXG5cXG4gICAgICAoZW5mb3JjZSAoPj0gcmVmdW5kIDAuMClcXG4gICAgICAgIFxcXCJyZWZ1bmQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBxdWFudGl0eVxcXCIpXFxuXFxuICAgICAgICA7IGRpcmVjdGx5IHVwZGF0ZSBpbnN0ZWFkIG9mIGNyZWRpdFxcbiAgICAgICh3aXRoLWNhcGFiaWxpdHkgKENSRURJVCBzZW5kZXIpXFxuICAgICAgICAoaWYgKD4gcmVmdW5kIDAuMClcXG4gICAgICAgICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIHNlbmRlclxcbiAgICAgICAgICAgIHsgXFxcImJhbGFuY2VcXFwiIDo9IGJhbGFuY2UgfVxcbiAgICAgICAgICAgICh1cGRhdGUgY29pbi10YWJsZSBzZW5kZXJcXG4gICAgICAgICAgICAgIHsgXFxcImJhbGFuY2VcXFwiOiAoKyBiYWxhbmNlIHJlZnVuZCkgfSkpXFxuXFxuICAgICAgICAgIFxcXCJub29wXFxcIikpXFxuXFxuICAgICAgKHdpdGgtY2FwYWJpbGl0eSAoQ1JFRElUIG1pbmVyKVxcbiAgICAgICAgKGlmICg-IGZlZSAwLjApXFxuICAgICAgICAgIChjcmVkaXQgbWluZXIgbWluZXItZ3VhcmQgZmVlKVxcbiAgICAgICAgICBcXFwibm9vcFxcXCIpKVxcbiAgICAgIClcXG5cXG4gICAgKVxcblxcbiAgKGRlZnVuIGNyZWF0ZS1hY2NvdW50OnN0cmluZyAoYWNjb3VudDpzdHJpbmcgZ3VhcmQ6Z3VhcmQpXFxuICAgIEBtb2RlbCBbIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBhY2NvdW50KSkgXVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBhY2NvdW50KVxcblxcbiAgICAoaW5zZXJ0IGNvaW4tdGFibGUgYWNjb3VudFxcbiAgICAgIHsgXFxcImJhbGFuY2VcXFwiIDogMC4wXFxuICAgICAgLCBcXFwiZ3VhcmRcXFwiICAgOiBndWFyZFxcbiAgICAgIH0pXFxuICAgIClcXG5cXG4gIChkZWZ1biBnZXQtYmFsYW5jZTpkZWNpbWFsIChhY2NvdW50OnN0cmluZylcXG4gICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6PSBiYWxhbmNlIH1cXG4gICAgICBiYWxhbmNlXFxuICAgICAgKVxcbiAgICApXFxuXFxuICAoZGVmdW4gZGV0YWlsczpvYmplY3R7ZnVuZ2libGUtdjEuYWNjb3VudC1kZXRhaWxzfVxcbiAgICAoIGFjY291bnQ6c3RyaW5nIClcXG4gICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6PSBiYWxcXG4gICAgICAsIFxcXCJndWFyZFxcXCIgOj0gZyB9XFxuICAgICAgeyBcXFwiYWNjb3VudFxcXCIgOiBhY2NvdW50XFxuICAgICAgLCBcXFwiYmFsYW5jZVxcXCIgOiBiYWxcXG4gICAgICAsIFxcXCJndWFyZFxcXCI6IGcgfSlcXG4gICAgKVxcblxcbiAgKGRlZnVuIHJvdGF0ZTpzdHJpbmcgKGFjY291bnQ6c3RyaW5nIG5ldy1ndWFyZDpndWFyZClcXG5cXG4gICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJndWFyZFxcXCIgOj0gb2xkLWd1YXJkIH1cXG5cXG4gICAgICAoZW5mb3JjZS1ndWFyZCBvbGQtZ3VhcmQpXFxuICAgICAgKGVuZm9yY2UtZ3VhcmQgbmV3LWd1YXJkKVxcblxcbiAgICAgICh1cGRhdGUgY29pbi10YWJsZSBhY2NvdW50XFxuICAgICAgICB7IFxcXCJndWFyZFxcXCIgOiBuZXctZ3VhcmQgfVxcbiAgICAgICAgKSkpXFxuXFxuXFxuICAoZGVmdW4gcHJlY2lzaW9uOmludGVnZXJcXG4gICAgKClcXG4gICAgTUlOSU1VTV9QUkVDSVNJT04pXFxuXFxuICAoZGVmdW4gdHJhbnNmZXI6c3RyaW5nIChzZW5kZXI6c3RyaW5nIHJlY2VpdmVyOnN0cmluZyBhbW91bnQ6ZGVjaW1hbClcXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5IGNvbnNlcnZlcy1tYXNzKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKD4gYW1vdW50IDAuMCkpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBzZW5kZXIpKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKHZhbGlkLWFjY291bnQgcmVjZWl2ZXIpKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHNlbmRlciByZWNlaXZlcikpIF1cXG5cXG4gICAgKGVuZm9yY2UgKCE9IHNlbmRlciByZWNlaXZlcilcXG4gICAgICBcXFwic2VuZGVyIGNhbm5vdCBiZSB0aGUgcmVjZWl2ZXIgb2YgYSB0cmFuc2ZlclxcXCIpXFxuXFxuICAgICh2YWxpZGF0ZS1hY2NvdW50IHNlbmRlcilcXG4gICAgKHZhbGlkYXRlLWFjY291bnQgcmVjZWl2ZXIpXFxuXFxuICAgIChlbmZvcmNlICg-IGFtb3VudCAwLjApXFxuICAgICAgXFxcInRyYW5zZmVyIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlXFxcIilcXG5cXG4gICAgKGVuZm9yY2UtdW5pdCBhbW91bnQpXFxuXFxuICAgICh3aXRoLWNhcGFiaWxpdHkgKFRSQU5TRkVSIHNlbmRlciByZWNlaXZlciBhbW91bnQpXFxuICAgICAgKGRlYml0IHNlbmRlciBhbW91bnQpXFxuICAgICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIHJlY2VpdmVyXFxuICAgICAgICB7IFxcXCJndWFyZFxcXCIgOj0gZyB9XFxuXFxuICAgICAgICAoY3JlZGl0IHJlY2VpdmVyIGcgYW1vdW50KSlcXG4gICAgICApXFxuICAgIClcXG5cXG4gIChkZWZ1biB0cmFuc2Zlci1jcmVhdGU6c3RyaW5nXFxuICAgICggc2VuZGVyOnN0cmluZ1xcbiAgICAgIHJlY2VpdmVyOnN0cmluZ1xcbiAgICAgIHJlY2VpdmVyLWd1YXJkOmd1YXJkXFxuICAgICAgYW1vdW50OmRlY2ltYWwgKVxcblxcbiAgICBAbW9kZWwgWyAocHJvcGVydHkgY29uc2VydmVzLW1hc3MpIF1cXG5cXG4gICAgKGVuZm9yY2UgKCE9IHNlbmRlciByZWNlaXZlcilcXG4gICAgICBcXFwic2VuZGVyIGNhbm5vdCBiZSB0aGUgcmVjZWl2ZXIgb2YgYSB0cmFuc2ZlclxcXCIpXFxuXFxuICAgICh2YWxpZGF0ZS1hY2NvdW50IHNlbmRlcilcXG4gICAgKHZhbGlkYXRlLWFjY291bnQgcmVjZWl2ZXIpXFxuXFxuICAgIChlbmZvcmNlICg-IGFtb3VudCAwLjApXFxuICAgICAgXFxcInRyYW5zZmVyIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlXFxcIilcXG5cXG4gICAgKGVuZm9yY2UtdW5pdCBhbW91bnQpXFxuXFxuICAgICh3aXRoLWNhcGFiaWxpdHkgKFRSQU5TRkVSIHNlbmRlciByZWNlaXZlciBhbW91bnQpXFxuICAgICAgKGRlYml0IHNlbmRlciBhbW91bnQpXFxuICAgICAgKGNyZWRpdCByZWNlaXZlciByZWNlaXZlci1ndWFyZCBhbW91bnQpKVxcbiAgICApXFxuXFxuICAoZGVmdW4gY29pbmJhc2U6c3RyaW5nIChhY2NvdW50OnN0cmluZyBhY2NvdW50LWd1YXJkOmd1YXJkIGFtb3VudDpkZWNpbWFsKVxcbiAgICBAZG9jIFxcXCJJbnRlcm5hbCBmdW5jdGlvbiBmb3IgdGhlIGluaXRpYWwgY3JlYXRpb24gb2YgY29pbnMuICBUaGlzIGZ1bmN0aW9uIFxcXFxcXG4gICAgXFxcXGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIGNvaW4gY29udHJhY3QuXFxcIlxcblxcbiAgICBAbW9kZWwgWyAocHJvcGVydHkgKHZhbGlkLWFjY291bnQgYWNjb3VudCkpIF1cXG5cXG4gICAgKHZhbGlkYXRlLWFjY291bnQgYWNjb3VudClcXG4gICAgKGVuZm9yY2UtdW5pdCBhbW91bnQpXFxuXFxuICAgIChyZXF1aXJlLWNhcGFiaWxpdHkgKENPSU5CQVNFKSlcXG4gICAgKHdpdGgtY2FwYWJpbGl0eSAoQ1JFRElUIGFjY291bnQpXFxuICAgICAgKGNyZWRpdCBhY2NvdW50IGFjY291bnQtZ3VhcmQgYW1vdW50KSlcXG4gICAgKVxcblxcbiAgKGRlZnBhY3QgZnVuZC10eCAoc2VuZGVyOnN0cmluZyBtaW5lcjpzdHJpbmcgbWluZXItZ3VhcmQ6Z3VhcmQgdG90YWw6ZGVjaW1hbClcXG4gICAgQGRvYyBcXFwiJ2Z1bmQtdHgnIGlzIGEgc3BlY2lhbCBwYWN0IHRvIGZ1bmQgYSB0cmFuc2FjdGlvbiBpbiB0d28gc3RlcHMsICAgICBcXFxcXFxuICAgIFxcXFx3aXRoIHRoZSBhY3R1YWwgdHJhbnNhY3Rpb24gdHJhbnNwaXJpbmcgaW4gdGhlIG1pZGRsZTogICAgICAgICAgICAgICAgICAgXFxcXFxcbiAgICBcXFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXG4gICAgXFxcXCAgMSkgQSBidXlpbmcgcGhhc2UsIGRlYml0aW5nIHRoZSBzZW5kZXIgZm9yIHRvdGFsIGdhcyBhbmQgZmVlLCB5aWVsZGluZyBcXFxcXFxuICAgIFxcXFwgICAgIFRYX01BWF9DSEFSR0UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcbiAgICBcXFxcICAyKSBBIHNldHRsZW1lbnQgcGhhc2UsIHJlc3VtaW5nIFRYX01BWF9DSEFSR0UsIGFuZCBhbGxvY2F0aW5nIHRvIHRoZSAgIFxcXFxcXG4gICAgXFxcXCAgICAgY29pbmJhc2UgYWNjb3VudCBmb3IgdXNlZCBnYXMgYW5kIGZlZSwgYW5kIHNlbmRlciBhY2NvdW50IGZvciBiYWwtICBcXFxcXFxuICAgIFxcXFwgICAgIGFuY2UgKHVudXNlZCBnYXMsIGlmIGFueSkuXFxcIlxcblxcbiAgICBAbW9kZWwgWyAocHJvcGVydHkgKD4gdG90YWwgMC4wKSlcXG4gICAgICAgICAgICAgKHByb3BlcnR5ICh2YWxpZC1hY2NvdW50IHNlbmRlcikpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBtaW5lcikpXFxuICAgICAgICAgICAgIDsocHJvcGVydHkgY29uc2VydmVzLW1hc3MpIG5vdCBzdXBwb3J0ZWQgeWV0XFxuICAgICAgICAgICBdXFxuXFxuICAgIChzdGVwIChidXktZ2FzIHNlbmRlciB0b3RhbCkpXFxuICAgIChzdGVwIChyZWRlZW0tZ2FzIG1pbmVyIG1pbmVyLWd1YXJkIHNlbmRlciB0b3RhbCkpXFxuICAgIClcXG5cXG4gIChkZWZ1biBkZWJpdDpzdHJpbmcgKGFjY291bnQ6c3RyaW5nIGFtb3VudDpkZWNpbWFsKVxcbiAgICBAZG9jIFxcXCJEZWJpdCBBTU9VTlQgZnJvbSBBQ0NPVU5UIGJhbGFuY2VcXFwiXFxuXFxuICAgIEBtb2RlbCBbIChwcm9wZXJ0eSAoPiBhbW91bnQgMC4wKSlcXG4gICAgICAgICAgICAgKHByb3BlcnR5ICh2YWxpZC1hY2NvdW50IGFjY291bnQpKVxcbiAgICAgICAgICAgXVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBhY2NvdW50KVxcblxcbiAgICAoZW5mb3JjZSAoPiBhbW91bnQgMC4wKVxcbiAgICAgIFxcXCJkZWJpdCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZVxcXCIpXFxuXFxuICAgIChlbmZvcmNlLXVuaXQgYW1vdW50KVxcblxcbiAgICAocmVxdWlyZS1jYXBhYmlsaXR5IChERUJJVCBhY2NvdW50KSlcXG4gICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6PSBiYWxhbmNlIH1cXG5cXG4gICAgICAoZW5mb3JjZSAoPD0gYW1vdW50IGJhbGFuY2UpIFxcXCJJbnN1ZmZpY2llbnQgZnVuZHNcXFwiKVxcblxcbiAgICAgICh1cGRhdGUgY29pbi10YWJsZSBhY2NvdW50XFxuICAgICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6ICgtIGJhbGFuY2UgYW1vdW50KSB9XFxuICAgICAgICApKVxcbiAgICApXFxuXFxuXFxuICAoZGVmdW4gY3JlZGl0OnN0cmluZyAoYWNjb3VudDpzdHJpbmcgZ3VhcmQ6Z3VhcmQgYW1vdW50OmRlY2ltYWwpXFxuICAgIEBkb2MgXFxcIkNyZWRpdCBBTU9VTlQgdG8gQUNDT1VOVCBiYWxhbmNlXFxcIlxcblxcbiAgICBAbW9kZWwgWyAocHJvcGVydHkgKD4gYW1vdW50IDAuMCkpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBhY2NvdW50KSlcXG4gICAgICAgICAgIF1cXG5cXG4gICAgKHZhbGlkYXRlLWFjY291bnQgYWNjb3VudClcXG5cXG4gICAgKGVuZm9yY2UgKD4gYW1vdW50IDAuMCkgXFxcImNyZWRpdCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZVxcXCIpXFxuICAgIChlbmZvcmNlLXVuaXQgYW1vdW50KVxcblxcbiAgICAocmVxdWlyZS1jYXBhYmlsaXR5IChDUkVESVQgYWNjb3VudCkpXFxuICAgICh3aXRoLWRlZmF1bHQtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6IDAuMCwgXFxcImd1YXJkXFxcIiA6IGd1YXJkIH1cXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6PSBiYWxhbmNlLCBcXFwiZ3VhcmRcXFwiIDo9IHJldGcgfVxcbiAgICAgIDsgd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZ3VhcmQgd2l0aCB0aGUgdXNlci1zdXBwbGllZCBvbmVcXG4gICAgICAoZW5mb3JjZSAoPSByZXRnIGd1YXJkKVxcbiAgICAgICAgXFxcImFjY291bnQgZ3VhcmRzIGRvIG5vdCBtYXRjaFxcXCIpXFxuXFxuICAgICAgKHdyaXRlIGNvaW4tdGFibGUgYWNjb3VudFxcbiAgICAgICAgeyBcXFwiYmFsYW5jZVxcXCIgOiAoKyBiYWxhbmNlIGFtb3VudClcXG4gICAgICAgICwgXFxcImd1YXJkXFxcIiAgIDogcmV0Z1xcbiAgICAgICAgfSlcXG4gICAgICApKVxcblxcblxcbiAgKGRlZnNjaGVtYSBjcm9zc2NoYWluLXNjaGVtYVxcbiAgICBAZG9jIFxcXCJTY2hlbWEgZm9yIHlpZWxkZWQgdmFsdWUgaW4gY3Jvc3MtY2hhaW4gdHJhbnNmZXJzXFxcIlxcbiAgICByZWNlaXZlcjpzdHJpbmdcXG4gICAgcmVjZWl2ZXItZ3VhcmQ6Z3VhcmRcXG4gICAgYW1vdW50OmRlY2ltYWwpXFxuXFxuICAoZGVmcGFjdCB0cmFuc2Zlci1jcm9zc2NoYWluOnN0cmluZ1xcbiAgICAoIHNlbmRlcjpzdHJpbmdcXG4gICAgICByZWNlaXZlcjpzdHJpbmdcXG4gICAgICByZWNlaXZlci1ndWFyZDpndWFyZFxcbiAgICAgIHRhcmdldC1jaGFpbjpzdHJpbmdcXG4gICAgICBhbW91bnQ6ZGVjaW1hbCApXFxuXFxuICAgIEBtb2RlbCBbIChwcm9wZXJ0eSAoPiBhbW91bnQgMC4wKSlcXG4gICAgICAgICAgICAgKHByb3BlcnR5ICghPSByZWNlaXZlciBcXFwiXFxcIikpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBzZW5kZXIpKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKHZhbGlkLWFjY291bnQgcmVjZWl2ZXIpKVxcbiAgICAgICAgICAgXVxcblxcbiAgICAoc3RlcFxcbiAgICAgICh3aXRoLWNhcGFiaWxpdHkgKERFQklUIHNlbmRlcilcXG5cXG4gICAgICAgICh2YWxpZGF0ZS1hY2NvdW50IHNlbmRlcilcXG4gICAgICAgICh2YWxpZGF0ZS1hY2NvdW50IHJlY2VpdmVyKVxcblxcbiAgICAgICAgKGVuZm9yY2UgKCE9IFxcXCJcXFwiIHRhcmdldC1jaGFpbikgXFxcImVtcHR5IHRhcmdldC1jaGFpblxcXCIpXFxuICAgICAgICAoZW5mb3JjZSAoIT0gKGF0ICdjaGFpbi1pZCAoY2hhaW4tZGF0YSkpIHRhcmdldC1jaGFpbilcXG4gICAgICAgICAgXFxcImNhbm5vdCBydW4gY3Jvc3MtY2hhaW4gdHJhbnNmZXJzIHRvIHRoZSBzYW1lIGNoYWluXFxcIilcXG5cXG4gICAgICAgIChlbmZvcmNlICg-IGFtb3VudCAwLjApXFxuICAgICAgICAgIFxcXCJ0cmFuc2ZlciBxdWFudGl0eSBtdXN0IGJlIHBvc2l0aXZlXFxcIilcXG5cXG4gICAgICAgIChlbmZvcmNlLXVuaXQgYW1vdW50KVxcblxcbiAgICAgICAgOzsgc3RlcCAxIC0gZGViaXQgZGVsZXRlLWFjY291bnQgb24gY3VycmVudCBjaGFpblxcbiAgICAgICAgKGRlYml0IHNlbmRlciBhbW91bnQpXFxuXFxuICAgICAgICAobGV0XFxuICAgICAgICAgICgoY3Jvc3NjaGFpbi1kZXRhaWxzOm9iamVjdHtjcm9zc2NoYWluLXNjaGVtYX1cXG4gICAgICAgICAgICB7IFxcXCJyZWNlaXZlclxcXCIgOiByZWNlaXZlclxcbiAgICAgICAgICAgICwgXFxcInJlY2VpdmVyLWd1YXJkXFxcIiA6IHJlY2VpdmVyLWd1YXJkXFxuICAgICAgICAgICAgLCBcXFwiYW1vdW50XFxcIiA6IGFtb3VudFxcbiAgICAgICAgICAgIH0pKVxcbiAgICAgICAgICAoeWllbGQgY3Jvc3NjaGFpbi1kZXRhaWxzIHRhcmdldC1jaGFpbilcXG4gICAgICAgICAgKSkpXFxuXFxuICAgIChzdGVwXFxuICAgICAgKHJlc3VtZVxcbiAgICAgICAgeyBcXFwicmVjZWl2ZXJcXFwiIDo9IHJlY2VpdmVyXFxuICAgICAgICAsIFxcXCJyZWNlaXZlci1ndWFyZFxcXCIgOj0gcmVjZWl2ZXItZ3VhcmRcXG4gICAgICAgICwgXFxcImFtb3VudFxcXCIgOj0gYW1vdW50XFxuICAgICAgICB9XFxuXFxuICAgICAgICA7OyBzdGVwIDIgLSBjcmVkaXQgY3JlYXRlIGFjY291bnQgb24gdGFyZ2V0IGNoYWluXFxuICAgICAgICAod2l0aC1jYXBhYmlsaXR5IChDUkVESVQgcmVjZWl2ZXIpXFxuICAgICAgICAgIChjcmVkaXQgcmVjZWl2ZXIgcmVjZWl2ZXItZ3VhcmQgYW1vdW50KSlcXG4gICAgICAgICkpXFxuICAgIClcXG5cXG5cXG4gIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gIDsgQ29pbiBhbGxvY2F0aW9uc1xcblxcbiAgKGRlZnNjaGVtYSBhbGxvY2F0aW9uLXNjaGVtYVxcbiAgICBAZG9jIFxcXCJHZW5lc2lzIGFsbG9jYXRpb24gcmVnaXN0cnlcXFwiXFxuICAgIDtAbW9kZWwgWyAoaW52YXJpYW50ICg-PSBiYWxhbmNlIDAuMCkpIF1cXG5cXG4gICAgYmFsYW5jZTpkZWNpbWFsXFxuICAgIGRhdGU6dGltZVxcbiAgICBndWFyZDpndWFyZFxcbiAgICByZWRlZW1lZDpib29sKVxcblxcbiAgKGRlZnRhYmxlIGFsbG9jYXRpb24tdGFibGU6e2FsbG9jYXRpb24tc2NoZW1hfSlcXG5cXG4gIChkZWZ1biBjcmVhdGUtYWxsb2NhdGlvbi1hY2NvdW50XFxuICAgICggYWNjb3VudDpzdHJpbmdcXG4gICAgICBkYXRlOnRpbWVcXG4gICAgICBrZXlzZXQtcmVmOnN0cmluZ1xcbiAgICAgIGFtb3VudDpkZWNpbWFsXFxuICAgIClcXG5cXG4gICAgQGRvYyBcXFwiQWRkIGFuIGVudHJ5IHRvIHRoZSBjb2luIGFsbG9jYXRpb24gdGFibGUuIFRoaXMgZnVuY3Rpb24gXFxcXFxcbiAgICAgICAgIFxcXFxhbHNvIGNyZWF0ZXMgYSBjb3JyZXNwb25kaW5nIGVtcHR5IGNvaW4gY29udHJhY3QgYWNjb3VudCBcXFxcXFxuICAgICAgICAgXFxcXG9mIHRoZSBzYW1lIG5hbWUgYW5kIGd1YXJkLiBSZXF1aXJlcyBHRU5FU0lTIGNhcGFiaWxpdHkuIFxcXCJcXG5cXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5ICh2YWxpZC1hY2NvdW50IGFjY291bnQpKSBdXFxuXFxuICAgIChyZXF1aXJlLWNhcGFiaWxpdHkgKEdFTkVTSVMpKVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBhY2NvdW50KVxcbiAgICAoZW5mb3JjZSAoPj0gYW1vdW50IDAuMClcXG4gICAgICBcXFwiYWxsb2NhdGlvbiBhbW91bnQgbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKVxcblxcbiAgICAoZW5mb3JjZS11bml0IGFtb3VudClcXG5cXG4gICAgKGxldFxcbiAgICAgICgoZ3VhcmQ6Z3VhcmQgKGtleXNldC1yZWYtZ3VhcmQga2V5c2V0LXJlZikpKVxcblxcbiAgICAgIChjcmVhdGUtYWNjb3VudCBhY2NvdW50IGd1YXJkKVxcblxcbiAgICAgIChpbnNlcnQgYWxsb2NhdGlvbi10YWJsZSBhY2NvdW50XFxuICAgICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6IGFtb3VudFxcbiAgICAgICAgLCBcXFwiZGF0ZVxcXCIgOiBkYXRlXFxuICAgICAgICAsIFxcXCJndWFyZFxcXCIgOiBndWFyZFxcbiAgICAgICAgLCBcXFwicmVkZWVtZWRcXFwiIDogZmFsc2VcXG4gICAgICAgIH0pKSlcXG5cXG4gIChkZWZ1biByZWxlYXNlLWFsbG9jYXRpb25cXG4gICAgKCBhY2NvdW50OnN0cmluZyApXFxuXFxuICAgIEBkb2MgXFxcIlJlbGVhc2UgZnVuZHMgYXNzb2NpYXRlZCB3aXRoIGFsbG9jYXRpb24gQUNDT1VOVCBpbnRvIG1haW4gbGVkZ2VyLiAgIFxcXFxcXG4gICAgICAgICBcXFxcQUNDT1VOVCBtdXN0IGFscmVhZHkgZXhpc3QgaW4gbWFpbiBsZWRnZXIuIEFsbG9jYXRpb24gaXMgZGVhY3RpdmF0ZWQgXFxcXFxcbiAgICAgICAgIFxcXFxhZnRlciByZWxlYXNlLlxcXCJcXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5ICh2YWxpZC1hY2NvdW50IGFjY291bnQpKSBdXFxuXFxuICAgICh2YWxpZGF0ZS1hY2NvdW50IGFjY291bnQpXFxuXFxuICAgICh3aXRoLXJlYWQgYWxsb2NhdGlvbi10YWJsZSBhY2NvdW50XFxuICAgICAgeyBcXFwiYmFsYW5jZVxcXCIgOj0gYmFsYW5jZVxcbiAgICAgICwgXFxcImRhdGVcXFwiIDo9IHJlbGVhc2UtdGltZVxcbiAgICAgICwgXFxcInJlZGVlbWVkXFxcIiA6PSByZWRlZW1lZFxcbiAgICAgICwgXFxcImd1YXJkXFxcIiA6PSBndWFyZFxcbiAgICAgIH1cXG5cXG4gICAgICAobGV0ICgoY3Vyci10aW1lOnRpbWUgKGF0ICdibG9jay10aW1lIChjaGFpbi1kYXRhKSkpKVxcblxcbiAgICAgICAgKGVuZm9yY2UgKG5vdCByZWRlZW1lZClcXG4gICAgICAgICAgXFxcImFsbG9jYXRpb24gZnVuZHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVkZWVtZWRcXFwiKVxcblxcbiAgICAgICAgKGVuZm9yY2VcXG4gICAgICAgICAgKD49IGN1cnItdGltZSByZWxlYXNlLXRpbWUpXFxuICAgICAgICAgIChmb3JtYXQgXFxcImZ1bmRzIGxvY2tlZCB1bnRpbCB7fS4gY3VycmVudCB0aW1lOiB7fVxcXCIgW3JlbGVhc2UtdGltZSBjdXJyLXRpbWVdKSlcXG5cXG4gICAgICAgIChlbmZvcmNlLWd1YXJkIGd1YXJkKVxcblxcbiAgICAgICAgKHdpdGgtY2FwYWJpbGl0eSAoQ1JFRElUIGFjY291bnQpXFxuICAgICAgICAgIChjcmVkaXQgYWNjb3VudCBndWFyZCBiYWxhbmNlKVxcblxcbiAgICAgICAgICAodXBkYXRlIGFsbG9jYXRpb24tdGFibGUgYWNjb3VudFxcbiAgICAgICAgICAgIHsgXFxcInJlZGVlbWVkXFxcIiA6IHRydWVcXG4gICAgICAgICAgICAsIFxcXCJiYWxhbmNlXFxcIiA6IDAuMFxcbiAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICAgIFxcXCJBbGxvY2F0aW9uIHN1Y2Nlc3NmdWxseSByZWxlYXNlZCB0byBtYWluIGxlZGdlclxcXCIpXFxuICAgICkpKVxcblxcbilcXG5cXG4oY3JlYXRlLXRhYmxlIGNvaW4tdGFibGUpXFxuKGNyZWF0ZS10YWJsZSBhbGxvY2F0aW9uLXRhYmxlKVxcblwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwiZ2VuZXNpcy0wMVwifSJ9", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IlRhYmxlQ3JlYXRlZCJ9LCJyZXFLZXkiOiJYR1BFUURrNVBJdlFrcHEwR0drZ05UbW8tbWpraTYzWlBnRVJfa292eHE0IiwibG9ncyI6IkpvNXhfMEl0dnZLVTY5dHJFbjh1a3FCeWpSTy1XaEZJZFlmMDV5dDlfN0UiLCJtZXRhRGF0YSI6bnVsbCwiY29udGludWF0aW9uIjpudWxsLCJ0eElkIjoxfQ") + , (unsafeFromText "eyJoYXNoIjoiU0IzVzVFTGl6azl4elNWWk9MX3dsem5VNjh5aUhPQzlwWUhreHBVXzBnbyIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6bnVsbCxcImNvZGVcIjpcIihpbnRlcmZhY2UgZ2FzLXBheWVyLXYxXFxuXFxuICAoZGVmY2FwIEdBU19QQVlFUjpib29sXFxuICAgICggdXNlcjpzdHJpbmdcXG4gICAgICBsaW1pdDppbnRlZ2VyXFxuICAgICAgcHJpY2U6ZGVjaW1hbFxcbiAgICApXFxuICAgIEBkb2NcXG4gICAgXFxcIiBQcm92aWRlIGEgY2FwYWJpbGl0eSBpbmRpY2F0aW5nIHRoYXQgZGVjbGFyaW5nIG1vZHVsZSBzdXBwb3J0cyBcXFxcXFxuICAgIFxcXFwgZ2FzIHBheW1lbnQgZm9yIFVTRVIgZm9yIGdhcyBMSU1JVCBhbmQgUFJJQ0UuIEZ1bmN0aW9uYWxpdHkgXFxcXFxcbiAgICBcXFxcIHNob3VsZCByZXF1aXJlIGNhcGFiaWxpdHkgKGNvaW4uRlVORF9UWCksIGFuZCBzaG91bGQgdmFsaWRhdGUgXFxcXFxcbiAgICBcXFxcIHRoZSBzcGVuZCBvZiAobGltaXQgKiBwcmljZSksIHBvc3NpYmx5IHVwZGF0aW5nIHNvbWUgZGF0YWJhc2UgXFxcXFxcbiAgICBcXFxcIGVudHJ5LiBcXFxcXFxuICAgIFxcXFwgU2hvdWxkIGNvbXBvc2UgY2FwYWJpbGl0eSByZXF1aXJlZCBmb3IgJ2NyZWF0ZS1nYXMtcGF5ZXItZ3VhcmQnLlxcXCJcXG4gICAgQG1vZGVsXFxuICAgIFsgKHByb3BlcnR5ICh1c2VyICE9IFxcXCJcXFwiKSlcXG4gICAgICAocHJvcGVydHkgKGxpbWl0ID4gMCkpXFxuICAgICAgKHByb3BlcnR5IChwcmljZSA-IDAuMCkpXFxuICAgIF1cXG4gIClcXG5cXG4gIChkZWZ1biBjcmVhdGUtZ2FzLXBheWVyLWd1YXJkOmd1YXJkICgpXFxuICAgIEBkb2NcXG4gICAgXFxcIiBQcm92aWRlIGEgZ3VhcmQgc3VpdGFibGUgZm9yIGNvbnRyb2xsaW5nIGEgY29pbiBhY2NvdW50IHRoYXQgY2FuIFxcXFxcXG4gICAgXFxcXCBwYXkgZ2FzIHZpYSBHQVNfUEFZRVIgbWVjaGFuaWNzLiBHZW5lcmFsbHkgdGhpcyBpcyBhY2NvbXBsaXNoZWQgXFxcXFxcbiAgICBcXFxcIGJ5IGhhdmluZyBHQVNfUEFZRVIgY29tcG9zZSBhbiB1bnBhcmFtZXRlcml6ZWQsIHVubWFuYWdlZCBjYXBhYmlsaXR5IFxcXFxcXG4gICAgXFxcXCB0aGF0IGlzIHJlcXVpcmVkIGluIHRoaXMgZ3VhcmQuIFRodXMsIGlmIGNvaW4gY29udHJhY3QgaXMgYWJsZSB0byBcXFxcXFxuICAgIFxcXFwgc3VjY2Vzc2Z1bGx5IGFjcXVpcmUgR0FTX1BBWUVSLCB0aGUgY29tcG9zZWQgJ2Fub255bW91cycgY2FwIHJlcXVpcmVkIFxcXFxcXG4gICAgXFxcXCBoZXJlIHdpbGwgYmUgaW4gc2NvcGUsIGFuZCBnYXMgYnV5IHdpbGwgc3VjY2VlZC5cXFwiXFxuICApXFxuXFxuKVxcblwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwiZ2VuZXNpcy0wMVwifSJ9", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IkxvYWRlZCBpbnRlcmZhY2UgZ2FzLXBheWVyLXYxIn0sInJlcUtleSI6IlNCM1c1RUxpems5eHpTVlpPTF93bHpuVTY4eWlIT0M5cFlIa3hwVV8wZ28iLCJsb2dzIjoiZlZuSFlta19QNmJSY3VjeVg1RDdLamNLYkVsVDlEcU9vZW9yUFEtUXdsMCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjJ9") + , (unsafeFromText "eyJoYXNoIjoia2ZMd2Y2a0FzdEVnc0NLYnZPOHR2YTNnWktBWXgzT0dHYTZYRURMaU9hMCIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1wibnMtYWRtaW4ta2V5c2V0XCI6W1wiMzY4ODIwZjgwYzMyNGJiYzdjMmIwNjEwNjg4YTdkYTQzZTM5ZjkxZDExODczMjY3MWNkOWM3NTAwZmY0M2NjYVwiXSxcIm5zLW9wZXJhdGUta2V5c2V0XCI6W1wiMzY4ODIwZjgwYzMyNGJiYzdjMmIwNjEwNjg4YTdkYTQzZTM5ZjkxZDExODczMjY3MWNkOWM3NTAwZmY0M2NjYVwiXSxcIm5zLWdlbmVzaXMta2V5c2V0XCI6e1wicHJlZFwiOlwiPVwiLFwia2V5c1wiOltdfX0sXCJjb2RlXCI6XCJcXG4oZGVmaW5lLWtleXNldCAnbnMtYWRtaW4ta2V5c2V0IChyZWFkLWtleXNldCAnbnMtYWRtaW4ta2V5c2V0KSlcXG4oZGVmaW5lLWtleXNldCAnbnMtb3BlcmF0ZS1rZXlzZXQgKHJlYWQta2V5c2V0ICducy1nZW5lc2lzLWtleXNldCkpXFxuXFxuKG1vZHVsZSBucyBHT1ZFUk5BTkNFXFxuICBcXFwiQWRtaW5pc3RlcnMgZGVmaW5pdGlvbiBvZiBuZXcgbmFtZXNwYWNlcyBpbiBDaGFpbndlYi5cXFwiXFxuXFxuICAoZGVmc2NoZW1hIHJlZy1lbnRyeVxcbiAgICBhZG1pbi1ndWFyZDpndWFyZFxcbiAgICBhY3RpdmU6Ym9vbClcXG5cXG4gIChkZWZ0YWJsZSByZWdpc3RyeTp7cmVnLWVudHJ5fSlcXG5cXG4gIChkZWZjYXAgR09WRVJOQU5DRSAoKVxcbiAgICAoZW5mb3JjZS1rZXlzZXQgJ25zLWFkbWluLWtleXNldCkpXFxuXFxuICAoZGVmY2FwIE9QRVJBVEUgKClcXG4gICAgKGVuZm9yY2Uta2V5c2V0ICducy1vcGVyYXRlLWtleXNldCkpXFxuXFxuICAoZGVmY29uc3QgR1VBUkRfU1VDQ0VTUyAoY3JlYXRlLXVzZXItZ3VhcmQgKHN1Y2Nlc3MpKSlcXG4gIChkZWZjb25zdCBHVUFSRF9GQUlMVVJFIChjcmVhdGUtdXNlci1ndWFyZCAoZmFpbHVyZSkpKVxcblxcbiAgKGRlZnVuIHN1Y2Nlc3MgKClcXG4gICAgdHJ1ZSlcXG4gIChkZWZ1biBmYWlsdXJlICgpXFxuICAgIChlbmZvcmNlIGZhbHNlIFxcXCJEaXNhYmxlZFxcXCIpKVxcblxcbiAgKGRlZnVuIHZhbGlkYXRlLW5hbWUgKG5hbWUpXFxuICAgIChlbmZvcmNlICghPSBcXFwiXFxcIiBuYW1lKSBcXFwiRW1wdHkgbmFtZSBub3QgYWxsb3dlZFxcXCIpXFxuICAgIChlbmZvcmNlICg8IChsZW5ndGggbmFtZSkgNjQpIFxcXCJOYW1lIG11c3QgYmUgbGVzcyB0aGFuIDY0IGNoYXJhY3RlcnMgbG9uZ1xcXCIpXFxuICAgIChlbmZvcmNlIChpcy1jaGFyc2V0IENIQVJTRVRfTEFUSU4xIG5hbWUpXFxuICAgICAgICAgICAgIFxcXCJOYW1lIG11c3QgYmUgaW4gbGF0aW4xIGNoYXJzZXRcXFwiKSlcXG5cXG4gIChkZWZ1biB2YWxpZGF0ZTpib29sXFxuICAgICAgKCBucy1uYW1lOnN0cmluZ1xcbiAgICAgICAgbnMtYWRtaW46Z3VhcmRcXG4gICAgICAgIClcXG4gICAgXFxcIiBNYW5hZ2VzIG5hbWVzcGFjZSBpbnN0YWxsIGZvciBDaGFpbndlYi4gUmVxdWlyZXMgYWN0aXZlIHJvdyBpbiByZWdpc3RyeSBcXFxcXFxuICAgIFxcXFwgZm9yIE5TLU5BTUUgd2l0aCBndWFyZCBtYXRjaGluZyBOUy1BRE1JTi5cXFwiXFxuXFxuICAgICh2YWxpZGF0ZS1uYW1lIG5zLW5hbWUpXFxuXFxuICAgICh3aXRoLWRlZmF1bHQtcmVhZCByZWdpc3RyeSBucy1uYW1lXFxuICAgICAgeyAnYWRtaW4tZ3VhcmQgOiBucy1hZG1pblxcbiAgICAgICwgJ2FjdGl2ZSA6IGZhbHNlIH1cXG4gICAgICB7ICdhZG1pbi1ndWFyZCA6PSBhZ1xcbiAgICAgICwgJ2FjdGl2ZSA6PSBpcy1hY3RpdmUgfVxcblxcbiAgICAgICAgKGVuZm9yY2UgaXMtYWN0aXZlIFxcXCJJbmFjdGl2ZSBvciB1bnJlZ2lzdGVyZWQgbmFtZXNwYWNlXFxcIilcXG4gICAgICAgIChlbmZvcmNlICg9IG5zLWFkbWluIGFnKSBcXFwiQWRtaW4gZ3VhcmQgbXVzdCBtYXRjaCBndWFyZCBpbiByZWdpc3RyeVxcXCIpXFxuXFxuICAgICAgICB0cnVlKSlcXG5cXG4gIChkZWZ1biB3cml0ZS1yZWdpc3RyeTpzdHJpbmdcXG4gICAgICAoIG5zLW5hbWU6c3RyaW5nXFxuICAgICAgICBndWFyZDpndWFyZFxcbiAgICAgICAgYWN0aXZlOmJvb2xcXG4gICAgICAgIClcXG4gICAgXFxcIiBXcml0ZSBlbnRyeSB3aXRoIEdVQVJEIGFuZCBBQ1RJVkUgaW50byByZWdpc3RyeSBmb3IgTkFNRS4gXFxcXFxcbiAgICBcXFxcIEd1YXJkZWQgYnkgb3BlcmF0ZSBrZXlzZXQuIFxcXCJcXG5cXG4gICAgKHdpdGgtY2FwYWJpbGl0eSAoT1BFUkFURSlcXG5cXG4gICAgICAodmFsaWRhdGUtbmFtZSBucy1uYW1lKVxcblxcbiAgICAgICh3cml0ZSByZWdpc3RyeSBucy1uYW1lXFxuICAgICAgICB7ICdhZG1pbi1ndWFyZDogZ3VhcmRcXG4gICAgICAgICwgJ2FjdGl2ZTogYWN0aXZlIH0pXFxuXFxuICAgICAgXFxcIlJlZ2lzdGVyIGVudHJ5IHdyaXR0ZW5cXFwiKSlcXG5cXG4gIChkZWZ1biBxdWVyeTpvYmplY3R7cmVnLWVudHJ5fVxcbiAgICAgICggbnMtbmFtZTpzdHJpbmcgKVxcbiAgICAocmVhZCByZWdpc3RyeSBucy1uYW1lKSlcXG5cXG4gIClcXG5cXG4oY3JlYXRlLXRhYmxlIHJlZ2lzdHJ5KVxcblxcbih3cml0ZS1yZWdpc3RyeSBcXFwia2FkZW5hXFxcIlxcbiAgKGtleXNldC1yZWYtZ3VhcmQgJ25zLW9wZXJhdGUta2V5c2V0KSB0cnVlKVxcbih3cml0ZS1yZWdpc3RyeSBcXFwidXNlclxcXCIgR1VBUkRfRkFJTFVSRSB0cnVlKVxcbih3cml0ZS1yZWdpc3RyeSBcXFwiZnJlZVxcXCIgR1VBUkRfRkFJTFVSRSB0cnVlKVxcblxcbihkZWZpbmUtbmFtZXNwYWNlIFxcXCJrYWRlbmFcXFwiXFxuICAoa2V5c2V0LXJlZi1ndWFyZCAnbnMtb3BlcmF0ZS1rZXlzZXQpXFxuICAoa2V5c2V0LXJlZi1ndWFyZCAnbnMtb3BlcmF0ZS1rZXlzZXQpKVxcblxcbihkZWZpbmUtbmFtZXNwYWNlIFxcXCJ1c2VyXFxcIiBHVUFSRF9TVUNDRVNTIEdVQVJEX0ZBSUxVUkUpXFxuKGRlZmluZS1uYW1lc3BhY2UgXFxcImZyZWVcXFwiIEdVQVJEX1NVQ0NFU1MgR1VBUkRfRkFJTFVSRSlcXG47O3JvdGF0ZSB0byByZWFsIG9wZXJhdGUga2V5c2V0XFxuKGRlZmluZS1rZXlzZXQgJ25zLW9wZXJhdGUta2V5c2V0IChyZWFkLWtleXNldCAnbnMtb3BlcmF0ZS1rZXlzZXQpKVxcblwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwibG9hZC1ucy1kZXZuZXQtc2VuZGVyMDBcIn0ifQ", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IktleXNldCBkZWZpbmVkIn0sInJlcUtleSI6ImtmTHdmNmtBc3RFZ3NDS2J2Tzh0dmEzZ1pLQVl4M09HR2E2WEVETGlPYTAiLCJsb2dzIjoiZ1BaazFQZzY5UDZUYXlTSEpxZE9QeEthdHc5WTV3eHZXdjNBRFRqMHVRdyIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjN9") + , (unsafeFromText "eyJoYXNoIjoiYWlyX21QQWdzOW1hOWlaMS1FdHhYcjV5X1E0bm9xZ0k1T245MjZsWVRqOCIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1wiYWxsb2NhdGlvbjAyXCI6W1wiZDI1MDJjZGFiMDhlZjg2NDkwOTBlOTI0ZDBmZDY5Y2U4OWMyYzMxNGZiNTJiZjU0NDA1NzY5YWE1YjQyNWVlYlwiXSxcImFsbG9jYXRpb24wMFwiOltcImY4YTFjNDI1Y2I2NTg5OWFlMGJmMGRkNGM2YTk4MjU1NGYyY2U4OTE0YzUwODQ0NDZmNDk5OWMzYzAwMTk5OTBcIl0sXCJhbGxvY2F0aW9uMDFcIjpbXCJlNTU2MTI0MDFmYjY3MTkwZDNjMGE5MDU3NDkyNjQ4MDZhM2I2NmM5YjlkMDQ4Yjg0Yjk2ZTEyMGU0YTM4N2RjXCJdfSxcImNvZGVcIjpcIihkZWZpbmUta2V5c2V0IFxcXCJhbGxvY2F0aW9uMDBcXFwiIChyZWFkLWtleXNldCBcXFwiYWxsb2NhdGlvbjAwXFxcIikpXFxuKGRlZmluZS1rZXlzZXQgXFxcImFsbG9jYXRpb24wMVxcXCIgKHJlYWQta2V5c2V0IFxcXCJhbGxvY2F0aW9uMDFcXFwiKSlcXG4oZGVmaW5lLWtleXNldCBcXFwiYWxsb2NhdGlvbjAyXFxcIiAocmVhZC1rZXlzZXQgXFxcImFsbG9jYXRpb24wMlxcXCIpKVwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwidGVzdG5ldDA2LWtleXNldHMtTlwifSJ9", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IktleXNldCBkZWZpbmVkIn0sInJlcUtleSI6ImFpcl9tUEFnczltYTlpWjEtRXR4WHI1eV9RNG5vcWdJNU9uOTI2bFlUajgiLCJsb2dzIjoiMmtJc0VCSUlQU0c5MmZuRW96aGVtR1k1dmQ5Vlowb3ZCSXhNYmhJUUlUdyIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjR9") + , (unsafeFromText "eyJoYXNoIjoiRjlTLUpKX0Zrdm04dlQtZXdlSkRZZlZTMnVSR0lRcUVHdElUTHRyeDJZbyIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6bnVsbCxcImNvZGVcIjpcIihjb2luLmNyZWF0ZS1hbGxvY2F0aW9uLWFjY291bnQgXFxcImFsbG9jYXRpb24wMFxcXCIgKHRpbWUgXFxcIjE5MDAtMTAtMTVUMTg6MDA6MDBaXFxcIikgXFxcImFsbG9jYXRpb24wMFxcXCIgMTAwMDAwMC4wKVxcbihjb2luLmNyZWF0ZS1hbGxvY2F0aW9uLWFjY291bnQgXFxcImFsbG9jYXRpb24wMVxcXCIgKHRpbWUgXFxcIjIwMjYtMDEtMzFUMTg6MDA6MDBaXFxcIikgXFxcImFsbG9jYXRpb24wMVxcXCIgMTAwMDAwMC4wKVxcbihjb2luLmNyZWF0ZS1hbGxvY2F0aW9uLWFjY291bnQgXFxcImFsbG9jYXRpb24wMlxcXCIgKHRpbWUgXFxcIjIwMjYtMDYtMzFUMTg6MDA6MDBaXFxcIikgXFxcImFsbG9jYXRpb24wMlxcXCIgMTAwMDAwMC4wKVwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwidGVzdG5ldC1hbGxvY2F0aW9ucy0wXCJ9In0", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJGOVMtSkpfRmt2bTh2VC1ld2VKRFlmVlMydVJHSVFxRUd0SVRMdHJ4MllvIiwibG9ncyI6Ik8tWExZNzBQWDhHRzZiU3hTdk8xZUZNVDg1VUkxUnBFZ1BKVVJTMFJzTVkiLCJtZXRhRGF0YSI6bnVsbCwiY29udGludWF0aW9uIjpudWxsLCJ0eElkIjo1fQ") + , (unsafeFromText "eyJoYXNoIjoiRFN0b2hEZGtVWVA5MnQwVVh2V2lnUlcyMWEtbEtqejFFUzdkYlozMFA3YyIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1wibG91aXNcIjpbXCJjMzg5ZTJmYWI5ZmFiZGMyOTU4ZDNkOTkxNmVhNzg5OWYzNWI5MDZkMTkyYjY5ZjIxMWE3OWJiNGMyMzc5YmNmXCJdLFwicGFzY2FsXCI6W1wiODVlNzQ1YjM3NjA1ZGUyZTRiZTEyM2M4ZTllNjU0MDQyMjc5MTJjNDI5ZTQ1Zjg3YjM0OGI1YzE5ZmZiMWYzOFwiXSxcImp1bWJvXCI6W1wiZWViMGZjYTlkNGQ4YTcyMTc4ZTRkMTUwMTUyODU4NDg0YTYzYzI3ZDM5OTFjYWY0OGNjOTAwMzQ3OTE1NmYwMFwiXSxcImpvc2VcIjpbXCJmNWExN2M1ZmQ5ZjlkMjYyM2JhNWU2MjgzZGUxNDQ1ZjY5NGMwZDVhNmY3ZGY3YjZhNDRhNGY4ODdiM2U5ZWFlXCJdLFwicGhpbGlwcFwiOltcIjNjN2NkNDQ1NzhiYjkwYjc5M2U2MmExMGYwNWE5OWNlOWEyZTBmMDY3ZmJiNGZmMDk0ZDE5ZTEzYTI3OWVmOWJcIl0sXCJzZW5kZXIwXCI6W1wiYzAzZTc2YzgxYTU2ZjgzMWExZWE5MWI5MzU0NWQ2YjQ5ZGFmZmM1M2M3NDE2ZTA2NWZjZmZiMDI1ZmFlZTQ3ZVwiXSxcImVkbXVuZFwiOltcImJiNDJlZDQ1ZDhmMjY3NmIwYjc1Y2MxMWFiZTgzNGY4Mjg3ODQxMzIyMjcxYmE1NzQwMTFlNGZkZjIzNjMxYjdcIl19LFwiY29kZVwiOlwiKGNvaW4uY29pbmJhc2UgXFxcInNlbmRlcjBcXFwiIChyZWFkLWtleXNldCBcXFwic2VuZGVyMFxcXCIpIDEuMClcXG4oY29pbi5jb2luYmFzZSBcXFwicGFzY2FsXFxcIiAgKHJlYWQta2V5c2V0IFxcXCJwYXNjYWxcXFwiKSAxMDAwMDAuMClcXG4oY29pbi5jb2luYmFzZSBcXFwiZWRtdW5kXFxcIiAgKHJlYWQta2V5c2V0IFxcXCJlZG11bmRcXFwiKSAxMDAwMDAuMClcXG4oY29pbi5jb2luYmFzZSBcXFwiam9zZVxcXCIgICAgKHJlYWQta2V5c2V0IFxcXCJqb3NlXFxcIikgICAxMDAwMDAuMClcXG4oY29pbi5jb2luYmFzZSBcXFwianVtYm9cXFwiICAgKHJlYWQta2V5c2V0IFxcXCJqdW1ib1xcXCIpICAxMDAwMDAuMClcXG4oY29pbi5jb2luYmFzZSBcXFwicGhpbGlwcFxcXCIgKHJlYWQta2V5c2V0IFxcXCJlZG11bmRcXFwiKSAxMDAwMDAuMClcXG4oY29pbi5jb2luYmFzZSBcXFwibG91aXNcXFwiICAgKHJlYWQta2V5c2V0IFxcXCJsb3Vpc1xcXCIpICAxMDAwMDAuMClcIn19LFwic2lnbmVyc1wiOltdLFwibWV0YVwiOntcImNyZWF0aW9uVGltZVwiOjAsXCJ0dGxcIjoxNzI4MDAsXCJnYXNMaW1pdFwiOjAsXCJjaGFpbklkXCI6XCJcIixcImdhc1ByaWNlXCI6MCxcInNlbmRlclwiOlwiXCJ9LFwibm9uY2VcIjpcInRlc3RuZXQwNi1ncmFudHMtMFwifSJ9", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJEU3RvaERka1VZUDkydDBVWHZXaWdSVzIxYS1sS2p6MUVTN2RiWjMwUDdjIiwibG9ncyI6ImVzRU5WZjdlVHp4WmVKNTl0OWRCenVZR2VRZ3paM1FKR0FKRUgwWXBNaFkiLCJtZXRhRGF0YSI6bnVsbCwiY29udGludWF0aW9uIjpudWxsLCJ0eElkIjo2fQ") + ] diff --git a/src/Chainweb/BlockHeader/Genesis/Testnet061to19Payload.hs b/src/Chainweb/BlockHeader/Genesis/Testnet061to19Payload.hs new file mode 100644 index 0000000000..e5f0dbc51d --- /dev/null +++ b/src/Chainweb/BlockHeader/Genesis/Testnet061to19Payload.hs @@ -0,0 +1,37 @@ +{-# LANGUAGE OverloadedStrings #-} + +-- This module is auto-generated. DO NOT EDIT IT MANUALLY. + +module Chainweb.BlockHeader.Genesis.Testnet061to19Payload ( payloadBlock ) where + +import qualified Data.Text as T +import qualified Data.Vector as V +import GHC.Stack + +import Chainweb.Payload +import Chainweb.Utils (unsafeFromText, toText) + +payloadBlock :: HasCallStack => PayloadWithOutputs +payloadBlock + | actualHash == expectedHash = payload + | otherwise = error + $ "inconsistent genesis payload detected. THIS IS A BUG in chainweb-node" + <> ". Expected: " <> T.unpack (toText expectedHash) + <> ", actual: " <> T.unpack (toText actualHash) + where + actualHash, expectedHash :: BlockPayloadHash + actualHash = _payloadWithOutputsPayloadHash payload + expectedHash = unsafeFromText "eq3MSmd5bkjQXSqibeEjWvL2_AZqwwipPEWOTMl0FkY" + + payload = newPayloadWithOutputs minerData coinbase txs + minerData = unsafeFromText "eyJhY2NvdW50IjoiTm9NaW5lciIsInByZWRpY2F0ZSI6IjwiLCJwdWJsaWMta2V5cyI6W119" + coinbase = unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6Ik5PX0NPSU5CQVNFIn0sInJlcUtleSI6IkRsZFJ3Q2JsUTdMb3F5NndZSm5hb2RIbDMwZDNqM2VILXF0RnpmRXY0NmciLCJsb2dzIjpudWxsLCJtZXRhRGF0YSI6bnVsbCwiY29udGludWF0aW9uIjpudWxsLCJ0eElkIjpudWxsfQ" + txs = V.fromList + [ (unsafeFromText "eyJoYXNoIjoiNDhUMExqQW5TRnBGV3h2dmFQVi1fNkUtQ2pEQVBoV1lVRldidnlmMmxGcyIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6bnVsbCxcImNvZGVcIjpcIihpbnRlcmZhY2UgZnVuZ2libGUtdjFcXG5cXG4gIFxcXCIgU3RhbmRhcmQgZm9yIGZ1bmdpYmxlIGNvaW5zIGFuZCB0b2tlbnMgYXMgc3BlY2lmaWVkIGluIEtJUC0wMDAyLiBcXFwiXFxuXFxuICAgOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICAgOyBTY2hlbWFcXG5cXG4gICAoZGVmc2NoZW1hIGFjY291bnQtZGV0YWlsc1xcbiAgICBAZG9jIFxcXCJTY2hlbWEgZm9yIHJlc3VsdHMgb2YgJ2FjY291bnQnIG9wZXJhdGlvbi5cXFwiXFxuICAgIEBtb2RlbCBbIChpbnZhcmlhbnQgKCE9IFxcXCJcXFwiIHNlbmRlcikpIF1cXG5cXG4gICAgYWNjb3VudDpzdHJpbmdcXG4gICAgYmFsYW5jZTpkZWNpbWFsXFxuICAgIGd1YXJkOmd1YXJkKVxcblxcblxcbiAgIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgIDsgQ2Fwc1xcblxcbiAgIChkZWZjYXAgVFJBTlNGRVI6Ym9vbFxcbiAgICAgKCBzZW5kZXI6c3RyaW5nXFxuICAgICAgIHJlY2VpdmVyOnN0cmluZ1xcbiAgICAgICBhbW91bnQ6ZGVjaW1hbFxcbiAgICAgKVxcbiAgICAgQGRvYyBcXFwiIE1hbmFnZWQgY2FwYWJpbGl0eSBzZWFsaW5nIEFNT1VOVCBmb3IgdHJhbnNmZXIgZnJvbSBTRU5ERVIgdG8gXFxcXFxcbiAgICAgICAgICBcXFxcIFJFQ0VJVkVSLiBQZXJtaXRzIGFueSBudW1iZXIgb2YgdHJhbnNmZXJzIHVwIHRvIEFNT1VOVC5cXFwiXFxuICAgICBAbWFuYWdlZCBhbW91bnQgVFJBTlNGRVItbWdyXFxuICAgICApXFxuXFxuICAgKGRlZnVuIFRSQU5TRkVSLW1ncjpkZWNpbWFsXFxuICAgICAoIG1hbmFnZWQ6ZGVjaW1hbFxcbiAgICAgICByZXF1ZXN0ZWQ6ZGVjaW1hbFxcbiAgICAgKVxcbiAgICAgQGRvYyBcXFwiIE1hbmFnZXMgVFJBTlNGRVIgQU1PVU5UIGxpbmVhcmx5LCBcXFxcXFxuICAgICAgICAgIFxcXFwgc3VjaCB0aGF0IGEgcmVxdWVzdCBmb3IgMS4wIGFtb3VudCBvbiBhIDMuMCBcXFxcXFxuICAgICAgICAgIFxcXFwgbWFuYWdlZCBxdWFudGl0eSBlbWl0cyB1cGRhdGVkIGFtb3VudCAyLjAuXFxcIlxcbiAgICAgKVxcblxcbiAgIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgIDsgRnVuY3Rpb25hbGl0eVxcblxcbiAgIChkZWZ1biB0cmFuc2Zlci1jcmVhdGU6c3RyaW5nXFxuICAgICAoIHNlbmRlcjpzdHJpbmdcXG4gICAgICAgcmVjZWl2ZXI6c3RyaW5nXFxuICAgICAgIHJlY2VpdmVyLWd1YXJkOmd1YXJkXFxuICAgICAgIGFtb3VudDpkZWNpbWFsXFxuICAgICApXFxuICAgICBAZG9jIFxcXCIgVHJhbnNmZXIgQU1PVU5UIGJldHdlZW4gYWNjb3VudHMgU0VOREVSIGFuZCBSRUNFSVZFUi4gXFxcXFxcbiAgICAgICAgICBcXFxcIEZhaWxzIGlmIFNFTkRFUiBkb2VzIG5vdCBleGlzdC4gSWYgUkVDRUlWRVIgZXhpc3RzLCBndWFyZCBcXFxcXFxuICAgICAgICAgIFxcXFwgbXVzdCBtYXRjaCBleGlzdGluZyB2YWx1ZS4gSWYgUkVDRUlWRVIgZG9lcyBub3QgZXhpc3QsIFxcXFxcXG4gICAgICAgICAgXFxcXCBSRUNFSVZFUiBhY2NvdW50IGlzIGNyZWF0ZWQgdXNpbmcgUkVDRUlWRVItR1VBUkQuIFxcXFxcXG4gICAgICAgICAgXFxcXCBTdWJqZWN0IHRvIG1hbmFnZW1lbnQgYnkgVFJBTlNGRVIgY2FwYWJpbGl0eS5cXFwiXFxuICAgICBAbW9kZWwgWyAocHJvcGVydHkgKD4gYW1vdW50IDAuMCkpXFxuICAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHNlbmRlciBcXFwiXFxcIikpXFxuICAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHJlY2VpdmVyIFxcXCJcXFwiKSlcXG4gICAgICAgICAgICAgIChwcm9wZXJ0eSAoIT0gc2VuZGVyIHJlY2VpdmVyKSlcXG4gICAgICAgICAgICBdXFxuICAgICApXFxuXFxuICAgKGRlZnBhY3QgdHJhbnNmZXItY3Jvc3NjaGFpbjpzdHJpbmdcXG4gICAgICggc2VuZGVyOnN0cmluZ1xcbiAgICAgICByZWNlaXZlcjpzdHJpbmdcXG4gICAgICAgcmVjZWl2ZXItZ3VhcmQ6Z3VhcmRcXG4gICAgICAgdGFyZ2V0LWNoYWluOnN0cmluZ1xcbiAgICAgICBhbW91bnQ6ZGVjaW1hbFxcbiAgICAgKVxcbiAgICAgQGRvYyBcXFwiIDItc3RlcCBwYWN0IHRvIHRyYW5zZmVyIEFNT1VOVCBmcm9tIFNFTkRFUiBvbiBjdXJyZW50IGNoYWluIFxcXFxcXG4gICAgICAgICAgXFxcXCB0byBSRUNFSVZFUiBvbiBUQVJHRVQtQ0hBSU4gdmlhIFNQViBwcm9vZi4gXFxcXFxcbiAgICAgICAgICBcXFxcIFRBUkdFVC1DSEFJTiBtdXN0IGJlIGRpZmZlcmVudCB0aGFuIGN1cnJlbnQgY2hhaW4gaWQuIFxcXFxcXG4gICAgICAgICAgXFxcXCBGaXJzdCBzdGVwIGRlYml0cyBBTU9VTlQgY29pbnMgaW4gU0VOREVSIGFjY291bnQgYW5kIHlpZWxkcyBcXFxcXFxuICAgICAgICAgIFxcXFwgUkVDRUlWRVIsIFJFQ0VJVkVSX0dVQVJEIGFuZCBBTU9VTlQgdG8gVEFSR0VULUNIQUlOLiBcXFxcXFxuICAgICAgICAgIFxcXFwgU2Vjb25kIHN0ZXAgY29udGludWF0aW9uIGlzIHNlbnQgaW50byBUQVJHRVQtQ0hBSU4gd2l0aCBwcm9vZiBcXFxcXFxuICAgICAgICAgIFxcXFwgb2J0YWluZWQgZnJvbSB0aGUgc3B2ICdvdXRwdXQnIGVuZHBvaW50IG9mIENoYWlud2ViLiBcXFxcXFxuICAgICAgICAgIFxcXFwgUHJvb2YgaXMgdmFsaWRhdGVkIGFuZCBSRUNFSVZFUiBpcyBjcmVkaXRlZCB3aXRoIEFNT1VOVCBcXFxcXFxuICAgICAgICAgIFxcXFwgY3JlYXRpbmcgYWNjb3VudCB3aXRoIFJFQ0VJVkVSX0dVQVJEIGFzIG5lY2Vzc2FyeS5cXFwiXFxuICAgICBAbW9kZWwgWyAocHJvcGVydHkgKD4gYW1vdW50IDAuMCkpXFxuICAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHNlbmRlciBcXFwiXFxcIikpXFxuICAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHJlY2VpdmVyIFxcXCJcXFwiKSlcXG4gICAgICAgICAgICAgIChwcm9wZXJ0eSAoIT0gc2VuZGVyIHJlY2VpdmVyKSlcXG4gICAgICAgICAgICAgIChwcm9wZXJ0eSAoIT0gdGFyZ2V0LWNoYWluIFxcXCJcXFwiKSlcXG4gICAgICAgICAgICBdXFxuICAgICApXFxuXFxuICAgKGRlZnVuIGdldC1iYWxhbmNlOmRlY2ltYWxcXG4gICAgICggYWNjb3VudDpzdHJpbmcgKVxcbiAgICAgXFxcIiBHZXQgYmFsYW5jZSBmb3IgQUNDT1VOVC4gRmFpbHMgaWYgYWNjb3VudCBkb2VzIG5vdCBleGlzdC5cXFwiXFxuICAgICApXFxuXFxuICAgKGRlZnVuIGRldGFpbHM6b2JqZWN0e2FjY291bnQtZGV0YWlsc31cXG4gICAgICggYWNjb3VudDogc3RyaW5nIClcXG4gICAgIFxcXCIgR2V0IGFuIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgQUNDT1VOVC4gXFxcXFxcbiAgICAgXFxcXCBGYWlscyBpZiBhY2NvdW50IGRvZXMgbm90IGV4aXN0LlxcXCJcXG4gICAgIClcXG5cXG4gICAoZGVmdW4gcHJlY2lzaW9uOmludGVnZXJcXG4gICAgICgpXFxuICAgICBcXFwiUmV0dXJuIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGVjaW1hbCBwcmVjaXNpb24uXFxcIlxcbiAgICAgKVxcblxcbiAgIChkZWZ1biBlbmZvcmNlLXVuaXQ6Ym9vbFxcbiAgICAgKCBhbW91bnQ6ZGVjaW1hbCApXFxuICAgICBcXFwiIEVuZm9yY2UgbWluaW11bSBwcmVjaXNpb24gYWxsb3dlZCBmb3IgdHJhbnNhY3Rpb25zLlxcXCJcXG4gICAgIClcXG5cXG4gICAoZGVmdW4gY3JlYXRlLWFjY291bnQ6c3RyaW5nXFxuICAgICAoIGFjY291bnQ6c3RyaW5nXFxuICAgICAgIGd1YXJkOmd1YXJkXFxuICAgICApXFxuICAgICBcXFwiIENyZWF0ZSBBQ0NPVU5UIHdpdGggMC4wIGJhbGFuY2UsIHdpdGggR1VBUkQgY29udHJvbGxpbmcgYWNjZXNzLlxcXCJcXG4gICAgIClcXG5cXG4gICAoZGVmdW4gcm90YXRlOnN0cmluZ1xcbiAgICAgKCBhY2NvdW50OnN0cmluZ1xcbiAgICAgICBuZXctZ3VhcmQ6Z3VhcmRcXG4gICAgIClcXG4gICAgIFxcXCIgUm90YXRlIGd1YXJkIGZvciBBQ0NPVU5ULiBUcmFuc2FjdGlvbiBpcyB2YWxpZGF0ZWQgYWdhaW5zdCBcXFxcXFxuICAgICBcXFxcIGV4aXN0aW5nIGd1YXJkIGJlZm9yZSBpbnN0YWxsaW5nIG5ldyBndWFyZC4gXFxcIlxcbiAgICAgKVxcblxcbilcXG5cIn19LFwic2lnbmVyc1wiOltdLFwibWV0YVwiOntcImNyZWF0aW9uVGltZVwiOjAsXCJ0dGxcIjoxNzI4MDAsXCJnYXNMaW1pdFwiOjAsXCJjaGFpbklkXCI6XCJcIixcImdhc1ByaWNlXCI6MCxcInNlbmRlclwiOlwiXCJ9LFwibm9uY2VcIjpcImdlbmVzaXMtMDFcIn0ifQ", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IkxvYWRlZCBpbnRlcmZhY2UgZnVuZ2libGUtdjEifSwicmVxS2V5IjoiNDhUMExqQW5TRnBGV3h2dmFQVi1fNkUtQ2pEQVBoV1lVRldidnlmMmxGcyIsImxvZ3MiOiJRRmEyOHRuOXkydFdMVzdUc3lHdzNOTkhpYzhxYjJ6UGtudXRpWWhnQXc4IiwibWV0YURhdGEiOm51bGwsImNvbnRpbnVhdGlvbiI6bnVsbCwidHhJZCI6MH0") + , (unsafeFromText "eyJoYXNoIjoiWEdQRVFEazVQSXZRa3BxMEdHa2dOVG1vLW1qa2k2M1pQZ0VSX2tvdnhxNCIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6bnVsbCxcImNvZGVcIjpcIihtb2R1bGUgY29pbiBHT1ZFUk5BTkNFXFxuXFxuICBAZG9jIFxcXCInY29pbicgcmVwcmVzZW50cyB0aGUgS2FkZW5hIENvaW4gQ29udHJhY3QuIFRoaXMgY29udHJhY3QgcHJvdmlkZXMgYm90aCB0aGUgXFxcXFxcbiAgXFxcXGJ1eS9yZWRlZW0gZ2FzIHN1cHBvcnQgaW4gdGhlIGZvcm0gb2YgJ2Z1bmQtdHgnLCBhcyB3ZWxsIGFzIHRyYW5zZmVyLCAgICAgICBcXFxcXFxuICBcXFxcY3JlZGl0LCBkZWJpdCwgY29pbmJhc2UsIGFjY291bnQgY3JlYXRpb24gYW5kIHF1ZXJ5LCBhcyB3ZWxsIGFzIFNQViBidXJuICAgIFxcXFxcXG4gIFxcXFxjcmVhdGUuIFRvIGFjY2VzcyB0aGUgY29pbiBjb250cmFjdCwgeW91IG1heSB1c2UgaXRzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCAgXFxcXFxcbiAgXFxcXG9yIGlzc3VlIHRoZSAnKHVzZSBjb2luKScgY29tbWFuZCBpbiB0aGUgYm9keSBvZiBhIG1vZHVsZSBkZWNsYXJhdGlvbi5cXFwiXFxuXFxuICBAbW9kZWxcXG4gICAgWyAoZGVmcHJvcGVydHkgY29uc2VydmVzLW1hc3NcXG4gICAgICAgICg9IChjb2x1bW4tZGVsdGEgY29pbi10YWJsZSAnYmFsYW5jZSkgMC4wKSlcXG5cXG4gICAgICAoZGVmcHJvcGVydHkgdmFsaWQtYWNjb3VudCAoYWNjb3VudDpzdHJpbmcpXFxuICAgICAgICAoYW5kXFxuICAgICAgICAgICg-PSAobGVuZ3RoIGFjY291bnQpIDMpXFxuICAgICAgICAgICg8PSAobGVuZ3RoIGFjY291bnQpIDI1NikpKVxcbiAgICBdXFxuXFxuICAoaW1wbGVtZW50cyBmdW5naWJsZS12MSlcXG5cXG4gIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gIDsgU2NoZW1hcyBhbmQgVGFibGVzXFxuXFxuICAoZGVmc2NoZW1hIGNvaW4tc2NoZW1hXFxuICAgIEBkb2MgXFxcIlRoZSBjb2luIGNvbnRyYWN0IHRva2VuIHNjaGVtYVxcXCJcXG4gICAgQG1vZGVsIFsgKGludmFyaWFudCAoPj0gYmFsYW5jZSAwLjApKSBdXFxuXFxuICAgIGJhbGFuY2U6ZGVjaW1hbFxcbiAgICBndWFyZDpndWFyZClcXG5cXG4gIChkZWZ0YWJsZSBjb2luLXRhYmxlOntjb2luLXNjaGVtYX0pXFxuXFxuICA7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICA7IENhcGFiaWxpdGllc1xcblxcbiAgKGRlZmNhcCBHT1ZFUk5BTkNFICgpXFxuICAgIChlbmZvcmNlIGZhbHNlIFxcXCJFbmZvcmNlIG5vbi11cGdyYWRlYWJpbGl0eVxcXCIpKVxcblxcbiAgKGRlZmNhcCBHQVMgKClcXG4gICAgXFxcIk1hZ2ljIGNhcGFiaWxpdHkgdG8gcHJvdGVjdCBnYXMgYnV5IGFuZCByZWRlZW1cXFwiXFxuICAgIHRydWUpXFxuXFxuICAoZGVmY2FwIENPSU5CQVNFICgpXFxuICAgIFxcXCJNYWdpYyBjYXBhYmlsaXR5IHRvIHByb3RlY3QgbWluZXIgcmV3YXJkXFxcIlxcbiAgICB0cnVlKVxcblxcbiAgKGRlZmNhcCBHRU5FU0lTICgpXFxuICAgIFxcXCJNYWdpYyBjYXBhYmlsaXR5IGNvbnN0cmFpbmluZyBnZW5lc2lzIHRyYW5zYWN0aW9uc1xcXCJcXG4gICAgdHJ1ZSlcXG5cXG4gIChkZWZjYXAgREVCSVQgKHNlbmRlcjpzdHJpbmcpXFxuICAgIFxcXCJDYXBhYmlsaXR5IGZvciBtYW5hZ2luZyBkZWJpdGluZyBvcGVyYXRpb25zXFxcIlxcbiAgICAoZW5mb3JjZS1ndWFyZCAoYXQgJ2d1YXJkIChyZWFkIGNvaW4tdGFibGUgc2VuZGVyKSkpXFxuICAgIChlbmZvcmNlICghPSBzZW5kZXIgXFxcIlxcXCIpIFxcXCJ2YWxpZCBzZW5kZXJcXFwiKSlcXG5cXG4gIChkZWZjYXAgQ1JFRElUIChyZWNlaXZlcjpzdHJpbmcpXFxuICAgIFxcXCJDYXBhYmlsaXR5IGZvciBtYW5hZ2luZyBjcmVkaXRpbmcgb3BlcmF0aW9uc1xcXCJcXG4gICAgKGVuZm9yY2UgKCE9IHJlY2VpdmVyIFxcXCJcXFwiKSBcXFwidmFsaWQgcmVjZWl2ZXJcXFwiKSlcXG5cXG4gIChkZWZjYXAgVFJBTlNGRVI6Ym9vbFxcbiAgICAoIHNlbmRlcjpzdHJpbmdcXG4gICAgICByZWNlaXZlcjpzdHJpbmdcXG4gICAgICBhbW91bnQ6ZGVjaW1hbFxcbiAgICApXFxuICAgIEBtYW5hZ2VkIGFtb3VudCBUUkFOU0ZFUi1tZ3JcXG4gICAgKGVuZm9yY2UgKCE9IHNlbmRlciByZWNlaXZlcikgXFxcInNhbWUgc2VuZGVyIGFuZCByZWNlaXZlclxcXCIpXFxuICAgIChlbmZvcmNlLXVuaXQgYW1vdW50KVxcbiAgICAoZW5mb3JjZSAoPiBhbW91bnQgMC4wKSBcXFwiUG9zaXRpdmUgYW1vdW50XFxcIilcXG4gICAgKGNvbXBvc2UtY2FwYWJpbGl0eSAoREVCSVQgc2VuZGVyKSlcXG4gICAgKGNvbXBvc2UtY2FwYWJpbGl0eSAoQ1JFRElUIHJlY2VpdmVyKSlcXG4gIClcXG5cXG4gIChkZWZ1biBUUkFOU0ZFUi1tZ3I6ZGVjaW1hbFxcbiAgICAoIG1hbmFnZWQ6ZGVjaW1hbFxcbiAgICAgIHJlcXVlc3RlZDpkZWNpbWFsXFxuICAgIClcXG5cXG4gICAgKGxldCAoKG5ld2JhbCAoLSBtYW5hZ2VkIHJlcXVlc3RlZCkpKVxcbiAgICAgIChlbmZvcmNlICg-PSBuZXdiYWwgMC4wKVxcbiAgICAgICAgKGZvcm1hdCBcXFwiVFJBTlNGRVIgZXhjZWVkZWQgZm9yIGJhbGFuY2Uge31cXFwiIFttYW5hZ2VkXSkpXFxuICAgICAgbmV3YmFsKVxcbiAgKVxcblxcbiAgOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgOyBDb25zdGFudHNcXG5cXG4gIChkZWZjb25zdCBDT0lOX0NIQVJTRVQgQ0hBUlNFVF9MQVRJTjFcXG4gICAgXFxcIlRoZSBkZWZhdWx0IGNvaW4gY29udHJhY3QgY2hhcmFjdGVyIHNldFxcXCIpXFxuXFxuICAoZGVmY29uc3QgTUlOSU1VTV9QUkVDSVNJT04gMTJcXG4gICAgXFxcIk1pbmltdW0gYWxsb3dlZCBwcmVjaXNpb24gZm9yIGNvaW4gdHJhbnNhY3Rpb25zXFxcIilcXG5cXG4gIChkZWZjb25zdCBNSU5JTVVNX0FDQ09VTlRfTEVOR1RIIDNcXG4gICAgXFxcIk1pbmltdW0gYWNjb3VudCBsZW5ndGggYWRtaXNzaWJsZSBmb3IgY29pbiBhY2NvdW50c1xcXCIpXFxuXFxuICAoZGVmY29uc3QgTUFYSU1VTV9BQ0NPVU5UX0xFTkdUSCAyNTZcXG4gICAgXFxcIk1heGltdW0gYWNjb3VudCBuYW1lIGxlbmd0aCBhZG1pc3NpYmxlIGZvciBjb2luIGFjY291bnRzXFxcIilcXG5cXG4gIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gIDsgVXRpbGl0aWVzXFxuXFxuICAoZGVmdW4gZW5mb3JjZS11bml0OmJvb2wgKGFtb3VudDpkZWNpbWFsKVxcbiAgICBAZG9jIFxcXCJFbmZvcmNlIG1pbmltdW0gcHJlY2lzaW9uIGFsbG93ZWQgZm9yIGNvaW4gdHJhbnNhY3Rpb25zXFxcIlxcblxcbiAgICAoZW5mb3JjZVxcbiAgICAgICg9IChmbG9vciBhbW91bnQgTUlOSU1VTV9QUkVDSVNJT04pXFxuICAgICAgICAgYW1vdW50KVxcbiAgICAgIChmb3JtYXQgXFxcIkFtb3VudCB2aW9sYXRlcyBtaW5pbXVtIHByZWNpc2lvbjoge31cXFwiIFthbW91bnRdKSlcXG4gICAgKVxcblxcbiAgKGRlZnVuIHZhbGlkYXRlLWFjY291bnQgKGFjY291bnQ6c3RyaW5nKVxcbiAgICBAZG9jIFxcXCJFbmZvcmNlIHRoYXQgYW4gYWNjb3VudCBuYW1lIGNvbmZvcm1zIHRvIHRoZSBjb2luIGNvbnRyYWN0IFxcXFxcXG4gICAgICAgICBcXFxcbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggcmVxdWlyZW1lbnRzLCBhcyB3ZWxsIGFzIHRoZSAgICBcXFxcXFxuICAgICAgICAgXFxcXGxhdGluLTEgY2hhcmFjdGVyIHNldC5cXFwiXFxuXFxuICAgIChlbmZvcmNlXFxuICAgICAgKGlzLWNoYXJzZXQgQ09JTl9DSEFSU0VUIGFjY291bnQpXFxuICAgICAgKGZvcm1hdFxcbiAgICAgICAgXFxcIkFjY291bnQgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgY29pbiBjb250cmFjdCBjaGFyc2V0OiB7fVxcXCJcXG4gICAgICAgIFthY2NvdW50XSkpXFxuXFxuICAgIChsZXQgKChhY2NvdW50LWxlbmd0aCAobGVuZ3RoIGFjY291bnQpKSlcXG5cXG4gICAgICAoZW5mb3JjZVxcbiAgICAgICAgKD49IGFjY291bnQtbGVuZ3RoIE1JTklNVU1fQUNDT1VOVF9MRU5HVEgpXFxuICAgICAgICAoZm9ybWF0XFxuICAgICAgICAgIFxcXCJBY2NvdW50IG5hbWUgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgbWluIGxlbmd0aCByZXF1aXJlbWVudDoge31cXFwiXFxuICAgICAgICAgIFthY2NvdW50XSkpXFxuXFxuICAgICAgKGVuZm9yY2VcXG4gICAgICAgICg8PSBhY2NvdW50LWxlbmd0aCBNQVhJTVVNX0FDQ09VTlRfTEVOR1RIKVxcbiAgICAgICAgKGZvcm1hdFxcbiAgICAgICAgICBcXFwiQWNjb3VudCBuYW1lIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIG1heCBsZW5ndGggcmVxdWlyZW1lbnQ6IHt9XFxcIlxcbiAgICAgICAgICBbYWNjb3VudF0pKVxcbiAgICAgIClcXG4gIClcXG5cXG4gIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gIDsgQ29pbiBDb250cmFjdFxcblxcbiAgKGRlZnVuIGdhcy1vbmx5ICgpXFxuICAgIFxcXCJQcmVkaWNhdGUgZm9yIGdhcy1vbmx5IHVzZXIgZ3VhcmRzLlxcXCJcXG4gICAgKHJlcXVpcmUtY2FwYWJpbGl0eSAoR0FTKSkpXFxuXFxuICAoZGVmdW4gZ2FzLWd1YXJkIChndWFyZDpndWFyZClcXG4gICAgXFxcIlByZWRpY2F0ZSBmb3IgZ2FzICsgc2luZ2xlIGtleSB1c2VyIGd1YXJkc1xcXCJcXG4gICAgKGVuZm9yY2Utb25lXFxuICAgICAgXFxcIkVuZm9yY2UgZWl0aGVyIHRoZSBwcmVzZW5jZSBvZiBhIEdBUyBjYXAgb3Iga2V5c2V0XFxcIlxcbiAgICAgIFsgKGdhcy1vbmx5KVxcbiAgICAgICAgKGVuZm9yY2UtZ3VhcmQgZ3VhcmQpXFxuICAgICAgXSkpXFxuXFxuICAoZGVmdW4gYnV5LWdhczpzdHJpbmcgKHNlbmRlcjpzdHJpbmcgdG90YWw6ZGVjaW1hbClcXG4gICAgQGRvYyBcXFwiVGhpcyBmdW5jdGlvbiBkZXNjcmliZXMgdGhlIG1haW4gJ2dhcyBidXknIG9wZXJhdGlvbi4gQXQgdGhpcyBwb2ludCBcXFxcXFxuICAgIFxcXFxNSU5FUiBoYXMgYmVlbiBjaG9zZW4gZnJvbSB0aGUgcG9vbCwgYW5kIHdpbGwgYmUgdmFsaWRhdGVkLiBUaGUgU0VOREVSICAgXFxcXFxcbiAgICBcXFxcb2YgdGhpcyB0cmFuc2FjdGlvbiBoYXMgc3BlY2lmaWVkIGEgZ2FzIGxpbWl0IExJTUlUIChtYXhpbXVtIGdhcykgZm9yICAgIFxcXFxcXG4gICAgXFxcXHRoZSB0cmFuc2FjdGlvbiwgYW5kIHRoZSBwcmljZSBpcyB0aGUgc3BvdCBwcmljZSBvZiBnYXMgYXQgdGhhdCB0aW1lLiAgICBcXFxcXFxuICAgIFxcXFxUaGUgZ2FzIGJ1eSB3aWxsIGJlIGV4ZWN1dGVkIHByaW9yIHRvIGV4ZWN1dGluZyBTRU5ERVIncyBjb2RlLlxcXCJcXG5cXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5ICg-IHRvdGFsIDAuMCkpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBzZW5kZXIpKVxcbiAgICAgICAgICAgXVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBzZW5kZXIpXFxuXFxuICAgIChlbmZvcmNlLXVuaXQgdG90YWwpXFxuICAgIChlbmZvcmNlICg-IHRvdGFsIDAuMCkgXFxcImdhcyBzdXBwbHkgbXVzdCBiZSBhIHBvc2l0aXZlIHF1YW50aXR5XFxcIilcXG5cXG4gICAgKHJlcXVpcmUtY2FwYWJpbGl0eSAoR0FTKSlcXG4gICAgKHdpdGgtY2FwYWJpbGl0eSAoREVCSVQgc2VuZGVyKVxcbiAgICAgIChkZWJpdCBzZW5kZXIgdG90YWwpKVxcbiAgICApXFxuXFxuICAoZGVmdW4gcmVkZWVtLWdhczpzdHJpbmcgKG1pbmVyOnN0cmluZyBtaW5lci1ndWFyZDpndWFyZCBzZW5kZXI6c3RyaW5nIHRvdGFsOmRlY2ltYWwpXFxuICAgIEBkb2MgXFxcIlRoaXMgZnVuY3Rpb24gZGVzY3JpYmVzIHRoZSBtYWluICdyZWRlZW0gZ2FzJyBvcGVyYXRpb24uIEF0IHRoaXMgICAgXFxcXFxcbiAgICBcXFxccG9pbnQsIHRoZSBTRU5ERVIncyB0cmFuc2FjdGlvbiBoYXMgYmVlbiBleGVjdXRlZCwgYW5kIHRoZSBnYXMgdGhhdCAgICAgIFxcXFxcXG4gICAgXFxcXHdhcyBjaGFyZ2VkIGhhcyBiZWVuIGNhbGN1bGF0ZWQuIE1JTkVSIHdpbGwgYmUgY3JlZGl0ZWQgdGhlIGdhcyBjb3N0LCAgICBcXFxcXFxuICAgIFxcXFxhbmQgU0VOREVSIHdpbGwgcmVjZWl2ZSB0aGUgcmVtYWluZGVyIHVwIHRvIHRoZSBsaW1pdFxcXCJcXG5cXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5ICg-IHRvdGFsIDAuMCkpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBzZW5kZXIpKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKHZhbGlkLWFjY291bnQgbWluZXIpKVxcbiAgICAgICAgICAgXVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBzZW5kZXIpXFxuICAgICh2YWxpZGF0ZS1hY2NvdW50IG1pbmVyKVxcbiAgICAoZW5mb3JjZS11bml0IHRvdGFsKVxcblxcbiAgICAocmVxdWlyZS1jYXBhYmlsaXR5IChHQVMpKVxcbiAgICAobGV0KlxcbiAgICAgICgoZmVlIChyZWFkLWRlY2ltYWwgXFxcImZlZVxcXCIpKVxcbiAgICAgICAocmVmdW5kICgtIHRvdGFsIGZlZSkpKVxcblxcbiAgICAgIChlbmZvcmNlLXVuaXQgZmVlKVxcbiAgICAgIChlbmZvcmNlICg-PSBmZWUgMC4wKVxcbiAgICAgICAgXFxcImZlZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHF1YW50aXR5XFxcIilcXG5cXG4gICAgICAoZW5mb3JjZSAoPj0gcmVmdW5kIDAuMClcXG4gICAgICAgIFxcXCJyZWZ1bmQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBxdWFudGl0eVxcXCIpXFxuXFxuICAgICAgICA7IGRpcmVjdGx5IHVwZGF0ZSBpbnN0ZWFkIG9mIGNyZWRpdFxcbiAgICAgICh3aXRoLWNhcGFiaWxpdHkgKENSRURJVCBzZW5kZXIpXFxuICAgICAgICAoaWYgKD4gcmVmdW5kIDAuMClcXG4gICAgICAgICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIHNlbmRlclxcbiAgICAgICAgICAgIHsgXFxcImJhbGFuY2VcXFwiIDo9IGJhbGFuY2UgfVxcbiAgICAgICAgICAgICh1cGRhdGUgY29pbi10YWJsZSBzZW5kZXJcXG4gICAgICAgICAgICAgIHsgXFxcImJhbGFuY2VcXFwiOiAoKyBiYWxhbmNlIHJlZnVuZCkgfSkpXFxuXFxuICAgICAgICAgIFxcXCJub29wXFxcIikpXFxuXFxuICAgICAgKHdpdGgtY2FwYWJpbGl0eSAoQ1JFRElUIG1pbmVyKVxcbiAgICAgICAgKGlmICg-IGZlZSAwLjApXFxuICAgICAgICAgIChjcmVkaXQgbWluZXIgbWluZXItZ3VhcmQgZmVlKVxcbiAgICAgICAgICBcXFwibm9vcFxcXCIpKVxcbiAgICAgIClcXG5cXG4gICAgKVxcblxcbiAgKGRlZnVuIGNyZWF0ZS1hY2NvdW50OnN0cmluZyAoYWNjb3VudDpzdHJpbmcgZ3VhcmQ6Z3VhcmQpXFxuICAgIEBtb2RlbCBbIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBhY2NvdW50KSkgXVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBhY2NvdW50KVxcblxcbiAgICAoaW5zZXJ0IGNvaW4tdGFibGUgYWNjb3VudFxcbiAgICAgIHsgXFxcImJhbGFuY2VcXFwiIDogMC4wXFxuICAgICAgLCBcXFwiZ3VhcmRcXFwiICAgOiBndWFyZFxcbiAgICAgIH0pXFxuICAgIClcXG5cXG4gIChkZWZ1biBnZXQtYmFsYW5jZTpkZWNpbWFsIChhY2NvdW50OnN0cmluZylcXG4gICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6PSBiYWxhbmNlIH1cXG4gICAgICBiYWxhbmNlXFxuICAgICAgKVxcbiAgICApXFxuXFxuICAoZGVmdW4gZGV0YWlsczpvYmplY3R7ZnVuZ2libGUtdjEuYWNjb3VudC1kZXRhaWxzfVxcbiAgICAoIGFjY291bnQ6c3RyaW5nIClcXG4gICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6PSBiYWxcXG4gICAgICAsIFxcXCJndWFyZFxcXCIgOj0gZyB9XFxuICAgICAgeyBcXFwiYWNjb3VudFxcXCIgOiBhY2NvdW50XFxuICAgICAgLCBcXFwiYmFsYW5jZVxcXCIgOiBiYWxcXG4gICAgICAsIFxcXCJndWFyZFxcXCI6IGcgfSlcXG4gICAgKVxcblxcbiAgKGRlZnVuIHJvdGF0ZTpzdHJpbmcgKGFjY291bnQ6c3RyaW5nIG5ldy1ndWFyZDpndWFyZClcXG5cXG4gICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJndWFyZFxcXCIgOj0gb2xkLWd1YXJkIH1cXG5cXG4gICAgICAoZW5mb3JjZS1ndWFyZCBvbGQtZ3VhcmQpXFxuICAgICAgKGVuZm9yY2UtZ3VhcmQgbmV3LWd1YXJkKVxcblxcbiAgICAgICh1cGRhdGUgY29pbi10YWJsZSBhY2NvdW50XFxuICAgICAgICB7IFxcXCJndWFyZFxcXCIgOiBuZXctZ3VhcmQgfVxcbiAgICAgICAgKSkpXFxuXFxuXFxuICAoZGVmdW4gcHJlY2lzaW9uOmludGVnZXJcXG4gICAgKClcXG4gICAgTUlOSU1VTV9QUkVDSVNJT04pXFxuXFxuICAoZGVmdW4gdHJhbnNmZXI6c3RyaW5nIChzZW5kZXI6c3RyaW5nIHJlY2VpdmVyOnN0cmluZyBhbW91bnQ6ZGVjaW1hbClcXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5IGNvbnNlcnZlcy1tYXNzKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKD4gYW1vdW50IDAuMCkpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBzZW5kZXIpKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKHZhbGlkLWFjY291bnQgcmVjZWl2ZXIpKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKCE9IHNlbmRlciByZWNlaXZlcikpIF1cXG5cXG4gICAgKGVuZm9yY2UgKCE9IHNlbmRlciByZWNlaXZlcilcXG4gICAgICBcXFwic2VuZGVyIGNhbm5vdCBiZSB0aGUgcmVjZWl2ZXIgb2YgYSB0cmFuc2ZlclxcXCIpXFxuXFxuICAgICh2YWxpZGF0ZS1hY2NvdW50IHNlbmRlcilcXG4gICAgKHZhbGlkYXRlLWFjY291bnQgcmVjZWl2ZXIpXFxuXFxuICAgIChlbmZvcmNlICg-IGFtb3VudCAwLjApXFxuICAgICAgXFxcInRyYW5zZmVyIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlXFxcIilcXG5cXG4gICAgKGVuZm9yY2UtdW5pdCBhbW91bnQpXFxuXFxuICAgICh3aXRoLWNhcGFiaWxpdHkgKFRSQU5TRkVSIHNlbmRlciByZWNlaXZlciBhbW91bnQpXFxuICAgICAgKGRlYml0IHNlbmRlciBhbW91bnQpXFxuICAgICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIHJlY2VpdmVyXFxuICAgICAgICB7IFxcXCJndWFyZFxcXCIgOj0gZyB9XFxuXFxuICAgICAgICAoY3JlZGl0IHJlY2VpdmVyIGcgYW1vdW50KSlcXG4gICAgICApXFxuICAgIClcXG5cXG4gIChkZWZ1biB0cmFuc2Zlci1jcmVhdGU6c3RyaW5nXFxuICAgICggc2VuZGVyOnN0cmluZ1xcbiAgICAgIHJlY2VpdmVyOnN0cmluZ1xcbiAgICAgIHJlY2VpdmVyLWd1YXJkOmd1YXJkXFxuICAgICAgYW1vdW50OmRlY2ltYWwgKVxcblxcbiAgICBAbW9kZWwgWyAocHJvcGVydHkgY29uc2VydmVzLW1hc3MpIF1cXG5cXG4gICAgKGVuZm9yY2UgKCE9IHNlbmRlciByZWNlaXZlcilcXG4gICAgICBcXFwic2VuZGVyIGNhbm5vdCBiZSB0aGUgcmVjZWl2ZXIgb2YgYSB0cmFuc2ZlclxcXCIpXFxuXFxuICAgICh2YWxpZGF0ZS1hY2NvdW50IHNlbmRlcilcXG4gICAgKHZhbGlkYXRlLWFjY291bnQgcmVjZWl2ZXIpXFxuXFxuICAgIChlbmZvcmNlICg-IGFtb3VudCAwLjApXFxuICAgICAgXFxcInRyYW5zZmVyIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlXFxcIilcXG5cXG4gICAgKGVuZm9yY2UtdW5pdCBhbW91bnQpXFxuXFxuICAgICh3aXRoLWNhcGFiaWxpdHkgKFRSQU5TRkVSIHNlbmRlciByZWNlaXZlciBhbW91bnQpXFxuICAgICAgKGRlYml0IHNlbmRlciBhbW91bnQpXFxuICAgICAgKGNyZWRpdCByZWNlaXZlciByZWNlaXZlci1ndWFyZCBhbW91bnQpKVxcbiAgICApXFxuXFxuICAoZGVmdW4gY29pbmJhc2U6c3RyaW5nIChhY2NvdW50OnN0cmluZyBhY2NvdW50LWd1YXJkOmd1YXJkIGFtb3VudDpkZWNpbWFsKVxcbiAgICBAZG9jIFxcXCJJbnRlcm5hbCBmdW5jdGlvbiBmb3IgdGhlIGluaXRpYWwgY3JlYXRpb24gb2YgY29pbnMuICBUaGlzIGZ1bmN0aW9uIFxcXFxcXG4gICAgXFxcXGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIGNvaW4gY29udHJhY3QuXFxcIlxcblxcbiAgICBAbW9kZWwgWyAocHJvcGVydHkgKHZhbGlkLWFjY291bnQgYWNjb3VudCkpIF1cXG5cXG4gICAgKHZhbGlkYXRlLWFjY291bnQgYWNjb3VudClcXG4gICAgKGVuZm9yY2UtdW5pdCBhbW91bnQpXFxuXFxuICAgIChyZXF1aXJlLWNhcGFiaWxpdHkgKENPSU5CQVNFKSlcXG4gICAgKHdpdGgtY2FwYWJpbGl0eSAoQ1JFRElUIGFjY291bnQpXFxuICAgICAgKGNyZWRpdCBhY2NvdW50IGFjY291bnQtZ3VhcmQgYW1vdW50KSlcXG4gICAgKVxcblxcbiAgKGRlZnBhY3QgZnVuZC10eCAoc2VuZGVyOnN0cmluZyBtaW5lcjpzdHJpbmcgbWluZXItZ3VhcmQ6Z3VhcmQgdG90YWw6ZGVjaW1hbClcXG4gICAgQGRvYyBcXFwiJ2Z1bmQtdHgnIGlzIGEgc3BlY2lhbCBwYWN0IHRvIGZ1bmQgYSB0cmFuc2FjdGlvbiBpbiB0d28gc3RlcHMsICAgICBcXFxcXFxuICAgIFxcXFx3aXRoIHRoZSBhY3R1YWwgdHJhbnNhY3Rpb24gdHJhbnNwaXJpbmcgaW4gdGhlIG1pZGRsZTogICAgICAgICAgICAgICAgICAgXFxcXFxcbiAgICBcXFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXFxcXG4gICAgXFxcXCAgMSkgQSBidXlpbmcgcGhhc2UsIGRlYml0aW5nIHRoZSBzZW5kZXIgZm9yIHRvdGFsIGdhcyBhbmQgZmVlLCB5aWVsZGluZyBcXFxcXFxuICAgIFxcXFwgICAgIFRYX01BWF9DSEFSR0UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcXFxcbiAgICBcXFxcICAyKSBBIHNldHRsZW1lbnQgcGhhc2UsIHJlc3VtaW5nIFRYX01BWF9DSEFSR0UsIGFuZCBhbGxvY2F0aW5nIHRvIHRoZSAgIFxcXFxcXG4gICAgXFxcXCAgICAgY29pbmJhc2UgYWNjb3VudCBmb3IgdXNlZCBnYXMgYW5kIGZlZSwgYW5kIHNlbmRlciBhY2NvdW50IGZvciBiYWwtICBcXFxcXFxuICAgIFxcXFwgICAgIGFuY2UgKHVudXNlZCBnYXMsIGlmIGFueSkuXFxcIlxcblxcbiAgICBAbW9kZWwgWyAocHJvcGVydHkgKD4gdG90YWwgMC4wKSlcXG4gICAgICAgICAgICAgKHByb3BlcnR5ICh2YWxpZC1hY2NvdW50IHNlbmRlcikpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBtaW5lcikpXFxuICAgICAgICAgICAgIDsocHJvcGVydHkgY29uc2VydmVzLW1hc3MpIG5vdCBzdXBwb3J0ZWQgeWV0XFxuICAgICAgICAgICBdXFxuXFxuICAgIChzdGVwIChidXktZ2FzIHNlbmRlciB0b3RhbCkpXFxuICAgIChzdGVwIChyZWRlZW0tZ2FzIG1pbmVyIG1pbmVyLWd1YXJkIHNlbmRlciB0b3RhbCkpXFxuICAgIClcXG5cXG4gIChkZWZ1biBkZWJpdDpzdHJpbmcgKGFjY291bnQ6c3RyaW5nIGFtb3VudDpkZWNpbWFsKVxcbiAgICBAZG9jIFxcXCJEZWJpdCBBTU9VTlQgZnJvbSBBQ0NPVU5UIGJhbGFuY2VcXFwiXFxuXFxuICAgIEBtb2RlbCBbIChwcm9wZXJ0eSAoPiBhbW91bnQgMC4wKSlcXG4gICAgICAgICAgICAgKHByb3BlcnR5ICh2YWxpZC1hY2NvdW50IGFjY291bnQpKVxcbiAgICAgICAgICAgXVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBhY2NvdW50KVxcblxcbiAgICAoZW5mb3JjZSAoPiBhbW91bnQgMC4wKVxcbiAgICAgIFxcXCJkZWJpdCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZVxcXCIpXFxuXFxuICAgIChlbmZvcmNlLXVuaXQgYW1vdW50KVxcblxcbiAgICAocmVxdWlyZS1jYXBhYmlsaXR5IChERUJJVCBhY2NvdW50KSlcXG4gICAgKHdpdGgtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6PSBiYWxhbmNlIH1cXG5cXG4gICAgICAoZW5mb3JjZSAoPD0gYW1vdW50IGJhbGFuY2UpIFxcXCJJbnN1ZmZpY2llbnQgZnVuZHNcXFwiKVxcblxcbiAgICAgICh1cGRhdGUgY29pbi10YWJsZSBhY2NvdW50XFxuICAgICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6ICgtIGJhbGFuY2UgYW1vdW50KSB9XFxuICAgICAgICApKVxcbiAgICApXFxuXFxuXFxuICAoZGVmdW4gY3JlZGl0OnN0cmluZyAoYWNjb3VudDpzdHJpbmcgZ3VhcmQ6Z3VhcmQgYW1vdW50OmRlY2ltYWwpXFxuICAgIEBkb2MgXFxcIkNyZWRpdCBBTU9VTlQgdG8gQUNDT1VOVCBiYWxhbmNlXFxcIlxcblxcbiAgICBAbW9kZWwgWyAocHJvcGVydHkgKD4gYW1vdW50IDAuMCkpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBhY2NvdW50KSlcXG4gICAgICAgICAgIF1cXG5cXG4gICAgKHZhbGlkYXRlLWFjY291bnQgYWNjb3VudClcXG5cXG4gICAgKGVuZm9yY2UgKD4gYW1vdW50IDAuMCkgXFxcImNyZWRpdCBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZVxcXCIpXFxuICAgIChlbmZvcmNlLXVuaXQgYW1vdW50KVxcblxcbiAgICAocmVxdWlyZS1jYXBhYmlsaXR5IChDUkVESVQgYWNjb3VudCkpXFxuICAgICh3aXRoLWRlZmF1bHQtcmVhZCBjb2luLXRhYmxlIGFjY291bnRcXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6IDAuMCwgXFxcImd1YXJkXFxcIiA6IGd1YXJkIH1cXG4gICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6PSBiYWxhbmNlLCBcXFwiZ3VhcmRcXFwiIDo9IHJldGcgfVxcbiAgICAgIDsgd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZ3VhcmQgd2l0aCB0aGUgdXNlci1zdXBwbGllZCBvbmVcXG4gICAgICAoZW5mb3JjZSAoPSByZXRnIGd1YXJkKVxcbiAgICAgICAgXFxcImFjY291bnQgZ3VhcmRzIGRvIG5vdCBtYXRjaFxcXCIpXFxuXFxuICAgICAgKHdyaXRlIGNvaW4tdGFibGUgYWNjb3VudFxcbiAgICAgICAgeyBcXFwiYmFsYW5jZVxcXCIgOiAoKyBiYWxhbmNlIGFtb3VudClcXG4gICAgICAgICwgXFxcImd1YXJkXFxcIiAgIDogcmV0Z1xcbiAgICAgICAgfSlcXG4gICAgICApKVxcblxcblxcbiAgKGRlZnNjaGVtYSBjcm9zc2NoYWluLXNjaGVtYVxcbiAgICBAZG9jIFxcXCJTY2hlbWEgZm9yIHlpZWxkZWQgdmFsdWUgaW4gY3Jvc3MtY2hhaW4gdHJhbnNmZXJzXFxcIlxcbiAgICByZWNlaXZlcjpzdHJpbmdcXG4gICAgcmVjZWl2ZXItZ3VhcmQ6Z3VhcmRcXG4gICAgYW1vdW50OmRlY2ltYWwpXFxuXFxuICAoZGVmcGFjdCB0cmFuc2Zlci1jcm9zc2NoYWluOnN0cmluZ1xcbiAgICAoIHNlbmRlcjpzdHJpbmdcXG4gICAgICByZWNlaXZlcjpzdHJpbmdcXG4gICAgICByZWNlaXZlci1ndWFyZDpndWFyZFxcbiAgICAgIHRhcmdldC1jaGFpbjpzdHJpbmdcXG4gICAgICBhbW91bnQ6ZGVjaW1hbCApXFxuXFxuICAgIEBtb2RlbCBbIChwcm9wZXJ0eSAoPiBhbW91bnQgMC4wKSlcXG4gICAgICAgICAgICAgKHByb3BlcnR5ICghPSByZWNlaXZlciBcXFwiXFxcIikpXFxuICAgICAgICAgICAgIChwcm9wZXJ0eSAodmFsaWQtYWNjb3VudCBzZW5kZXIpKVxcbiAgICAgICAgICAgICAocHJvcGVydHkgKHZhbGlkLWFjY291bnQgcmVjZWl2ZXIpKVxcbiAgICAgICAgICAgXVxcblxcbiAgICAoc3RlcFxcbiAgICAgICh3aXRoLWNhcGFiaWxpdHkgKERFQklUIHNlbmRlcilcXG5cXG4gICAgICAgICh2YWxpZGF0ZS1hY2NvdW50IHNlbmRlcilcXG4gICAgICAgICh2YWxpZGF0ZS1hY2NvdW50IHJlY2VpdmVyKVxcblxcbiAgICAgICAgKGVuZm9yY2UgKCE9IFxcXCJcXFwiIHRhcmdldC1jaGFpbikgXFxcImVtcHR5IHRhcmdldC1jaGFpblxcXCIpXFxuICAgICAgICAoZW5mb3JjZSAoIT0gKGF0ICdjaGFpbi1pZCAoY2hhaW4tZGF0YSkpIHRhcmdldC1jaGFpbilcXG4gICAgICAgICAgXFxcImNhbm5vdCBydW4gY3Jvc3MtY2hhaW4gdHJhbnNmZXJzIHRvIHRoZSBzYW1lIGNoYWluXFxcIilcXG5cXG4gICAgICAgIChlbmZvcmNlICg-IGFtb3VudCAwLjApXFxuICAgICAgICAgIFxcXCJ0cmFuc2ZlciBxdWFudGl0eSBtdXN0IGJlIHBvc2l0aXZlXFxcIilcXG5cXG4gICAgICAgIChlbmZvcmNlLXVuaXQgYW1vdW50KVxcblxcbiAgICAgICAgOzsgc3RlcCAxIC0gZGViaXQgZGVsZXRlLWFjY291bnQgb24gY3VycmVudCBjaGFpblxcbiAgICAgICAgKGRlYml0IHNlbmRlciBhbW91bnQpXFxuXFxuICAgICAgICAobGV0XFxuICAgICAgICAgICgoY3Jvc3NjaGFpbi1kZXRhaWxzOm9iamVjdHtjcm9zc2NoYWluLXNjaGVtYX1cXG4gICAgICAgICAgICB7IFxcXCJyZWNlaXZlclxcXCIgOiByZWNlaXZlclxcbiAgICAgICAgICAgICwgXFxcInJlY2VpdmVyLWd1YXJkXFxcIiA6IHJlY2VpdmVyLWd1YXJkXFxuICAgICAgICAgICAgLCBcXFwiYW1vdW50XFxcIiA6IGFtb3VudFxcbiAgICAgICAgICAgIH0pKVxcbiAgICAgICAgICAoeWllbGQgY3Jvc3NjaGFpbi1kZXRhaWxzIHRhcmdldC1jaGFpbilcXG4gICAgICAgICAgKSkpXFxuXFxuICAgIChzdGVwXFxuICAgICAgKHJlc3VtZVxcbiAgICAgICAgeyBcXFwicmVjZWl2ZXJcXFwiIDo9IHJlY2VpdmVyXFxuICAgICAgICAsIFxcXCJyZWNlaXZlci1ndWFyZFxcXCIgOj0gcmVjZWl2ZXItZ3VhcmRcXG4gICAgICAgICwgXFxcImFtb3VudFxcXCIgOj0gYW1vdW50XFxuICAgICAgICB9XFxuXFxuICAgICAgICA7OyBzdGVwIDIgLSBjcmVkaXQgY3JlYXRlIGFjY291bnQgb24gdGFyZ2V0IGNoYWluXFxuICAgICAgICAod2l0aC1jYXBhYmlsaXR5IChDUkVESVQgcmVjZWl2ZXIpXFxuICAgICAgICAgIChjcmVkaXQgcmVjZWl2ZXIgcmVjZWl2ZXItZ3VhcmQgYW1vdW50KSlcXG4gICAgICAgICkpXFxuICAgIClcXG5cXG5cXG4gIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gIDsgQ29pbiBhbGxvY2F0aW9uc1xcblxcbiAgKGRlZnNjaGVtYSBhbGxvY2F0aW9uLXNjaGVtYVxcbiAgICBAZG9jIFxcXCJHZW5lc2lzIGFsbG9jYXRpb24gcmVnaXN0cnlcXFwiXFxuICAgIDtAbW9kZWwgWyAoaW52YXJpYW50ICg-PSBiYWxhbmNlIDAuMCkpIF1cXG5cXG4gICAgYmFsYW5jZTpkZWNpbWFsXFxuICAgIGRhdGU6dGltZVxcbiAgICBndWFyZDpndWFyZFxcbiAgICByZWRlZW1lZDpib29sKVxcblxcbiAgKGRlZnRhYmxlIGFsbG9jYXRpb24tdGFibGU6e2FsbG9jYXRpb24tc2NoZW1hfSlcXG5cXG4gIChkZWZ1biBjcmVhdGUtYWxsb2NhdGlvbi1hY2NvdW50XFxuICAgICggYWNjb3VudDpzdHJpbmdcXG4gICAgICBkYXRlOnRpbWVcXG4gICAgICBrZXlzZXQtcmVmOnN0cmluZ1xcbiAgICAgIGFtb3VudDpkZWNpbWFsXFxuICAgIClcXG5cXG4gICAgQGRvYyBcXFwiQWRkIGFuIGVudHJ5IHRvIHRoZSBjb2luIGFsbG9jYXRpb24gdGFibGUuIFRoaXMgZnVuY3Rpb24gXFxcXFxcbiAgICAgICAgIFxcXFxhbHNvIGNyZWF0ZXMgYSBjb3JyZXNwb25kaW5nIGVtcHR5IGNvaW4gY29udHJhY3QgYWNjb3VudCBcXFxcXFxuICAgICAgICAgXFxcXG9mIHRoZSBzYW1lIG5hbWUgYW5kIGd1YXJkLiBSZXF1aXJlcyBHRU5FU0lTIGNhcGFiaWxpdHkuIFxcXCJcXG5cXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5ICh2YWxpZC1hY2NvdW50IGFjY291bnQpKSBdXFxuXFxuICAgIChyZXF1aXJlLWNhcGFiaWxpdHkgKEdFTkVTSVMpKVxcblxcbiAgICAodmFsaWRhdGUtYWNjb3VudCBhY2NvdW50KVxcbiAgICAoZW5mb3JjZSAoPj0gYW1vdW50IDAuMClcXG4gICAgICBcXFwiYWxsb2NhdGlvbiBhbW91bnQgbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKVxcblxcbiAgICAoZW5mb3JjZS11bml0IGFtb3VudClcXG5cXG4gICAgKGxldFxcbiAgICAgICgoZ3VhcmQ6Z3VhcmQgKGtleXNldC1yZWYtZ3VhcmQga2V5c2V0LXJlZikpKVxcblxcbiAgICAgIChjcmVhdGUtYWNjb3VudCBhY2NvdW50IGd1YXJkKVxcblxcbiAgICAgIChpbnNlcnQgYWxsb2NhdGlvbi10YWJsZSBhY2NvdW50XFxuICAgICAgICB7IFxcXCJiYWxhbmNlXFxcIiA6IGFtb3VudFxcbiAgICAgICAgLCBcXFwiZGF0ZVxcXCIgOiBkYXRlXFxuICAgICAgICAsIFxcXCJndWFyZFxcXCIgOiBndWFyZFxcbiAgICAgICAgLCBcXFwicmVkZWVtZWRcXFwiIDogZmFsc2VcXG4gICAgICAgIH0pKSlcXG5cXG4gIChkZWZ1biByZWxlYXNlLWFsbG9jYXRpb25cXG4gICAgKCBhY2NvdW50OnN0cmluZyApXFxuXFxuICAgIEBkb2MgXFxcIlJlbGVhc2UgZnVuZHMgYXNzb2NpYXRlZCB3aXRoIGFsbG9jYXRpb24gQUNDT1VOVCBpbnRvIG1haW4gbGVkZ2VyLiAgIFxcXFxcXG4gICAgICAgICBcXFxcQUNDT1VOVCBtdXN0IGFscmVhZHkgZXhpc3QgaW4gbWFpbiBsZWRnZXIuIEFsbG9jYXRpb24gaXMgZGVhY3RpdmF0ZWQgXFxcXFxcbiAgICAgICAgIFxcXFxhZnRlciByZWxlYXNlLlxcXCJcXG4gICAgQG1vZGVsIFsgKHByb3BlcnR5ICh2YWxpZC1hY2NvdW50IGFjY291bnQpKSBdXFxuXFxuICAgICh2YWxpZGF0ZS1hY2NvdW50IGFjY291bnQpXFxuXFxuICAgICh3aXRoLXJlYWQgYWxsb2NhdGlvbi10YWJsZSBhY2NvdW50XFxuICAgICAgeyBcXFwiYmFsYW5jZVxcXCIgOj0gYmFsYW5jZVxcbiAgICAgICwgXFxcImRhdGVcXFwiIDo9IHJlbGVhc2UtdGltZVxcbiAgICAgICwgXFxcInJlZGVlbWVkXFxcIiA6PSByZWRlZW1lZFxcbiAgICAgICwgXFxcImd1YXJkXFxcIiA6PSBndWFyZFxcbiAgICAgIH1cXG5cXG4gICAgICAobGV0ICgoY3Vyci10aW1lOnRpbWUgKGF0ICdibG9jay10aW1lIChjaGFpbi1kYXRhKSkpKVxcblxcbiAgICAgICAgKGVuZm9yY2UgKG5vdCByZWRlZW1lZClcXG4gICAgICAgICAgXFxcImFsbG9jYXRpb24gZnVuZHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVkZWVtZWRcXFwiKVxcblxcbiAgICAgICAgKGVuZm9yY2VcXG4gICAgICAgICAgKD49IGN1cnItdGltZSByZWxlYXNlLXRpbWUpXFxuICAgICAgICAgIChmb3JtYXQgXFxcImZ1bmRzIGxvY2tlZCB1bnRpbCB7fS4gY3VycmVudCB0aW1lOiB7fVxcXCIgW3JlbGVhc2UtdGltZSBjdXJyLXRpbWVdKSlcXG5cXG4gICAgICAgIChlbmZvcmNlLWd1YXJkIGd1YXJkKVxcblxcbiAgICAgICAgKHdpdGgtY2FwYWJpbGl0eSAoQ1JFRElUIGFjY291bnQpXFxuICAgICAgICAgIChjcmVkaXQgYWNjb3VudCBndWFyZCBiYWxhbmNlKVxcblxcbiAgICAgICAgICAodXBkYXRlIGFsbG9jYXRpb24tdGFibGUgYWNjb3VudFxcbiAgICAgICAgICAgIHsgXFxcInJlZGVlbWVkXFxcIiA6IHRydWVcXG4gICAgICAgICAgICAsIFxcXCJiYWxhbmNlXFxcIiA6IDAuMFxcbiAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICAgIFxcXCJBbGxvY2F0aW9uIHN1Y2Nlc3NmdWxseSByZWxlYXNlZCB0byBtYWluIGxlZGdlclxcXCIpXFxuICAgICkpKVxcblxcbilcXG5cXG4oY3JlYXRlLXRhYmxlIGNvaW4tdGFibGUpXFxuKGNyZWF0ZS10YWJsZSBhbGxvY2F0aW9uLXRhYmxlKVxcblwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwiZ2VuZXNpcy0wMVwifSJ9", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IlRhYmxlQ3JlYXRlZCJ9LCJyZXFLZXkiOiJYR1BFUURrNVBJdlFrcHEwR0drZ05UbW8tbWpraTYzWlBnRVJfa292eHE0IiwibG9ncyI6IkpvNXhfMEl0dnZLVTY5dHJFbjh1a3FCeWpSTy1XaEZJZFlmMDV5dDlfN0UiLCJtZXRhRGF0YSI6bnVsbCwiY29udGludWF0aW9uIjpudWxsLCJ0eElkIjoxfQ") + , (unsafeFromText "eyJoYXNoIjoiU0IzVzVFTGl6azl4elNWWk9MX3dsem5VNjh5aUhPQzlwWUhreHBVXzBnbyIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6bnVsbCxcImNvZGVcIjpcIihpbnRlcmZhY2UgZ2FzLXBheWVyLXYxXFxuXFxuICAoZGVmY2FwIEdBU19QQVlFUjpib29sXFxuICAgICggdXNlcjpzdHJpbmdcXG4gICAgICBsaW1pdDppbnRlZ2VyXFxuICAgICAgcHJpY2U6ZGVjaW1hbFxcbiAgICApXFxuICAgIEBkb2NcXG4gICAgXFxcIiBQcm92aWRlIGEgY2FwYWJpbGl0eSBpbmRpY2F0aW5nIHRoYXQgZGVjbGFyaW5nIG1vZHVsZSBzdXBwb3J0cyBcXFxcXFxuICAgIFxcXFwgZ2FzIHBheW1lbnQgZm9yIFVTRVIgZm9yIGdhcyBMSU1JVCBhbmQgUFJJQ0UuIEZ1bmN0aW9uYWxpdHkgXFxcXFxcbiAgICBcXFxcIHNob3VsZCByZXF1aXJlIGNhcGFiaWxpdHkgKGNvaW4uRlVORF9UWCksIGFuZCBzaG91bGQgdmFsaWRhdGUgXFxcXFxcbiAgICBcXFxcIHRoZSBzcGVuZCBvZiAobGltaXQgKiBwcmljZSksIHBvc3NpYmx5IHVwZGF0aW5nIHNvbWUgZGF0YWJhc2UgXFxcXFxcbiAgICBcXFxcIGVudHJ5LiBcXFxcXFxuICAgIFxcXFwgU2hvdWxkIGNvbXBvc2UgY2FwYWJpbGl0eSByZXF1aXJlZCBmb3IgJ2NyZWF0ZS1nYXMtcGF5ZXItZ3VhcmQnLlxcXCJcXG4gICAgQG1vZGVsXFxuICAgIFsgKHByb3BlcnR5ICh1c2VyICE9IFxcXCJcXFwiKSlcXG4gICAgICAocHJvcGVydHkgKGxpbWl0ID4gMCkpXFxuICAgICAgKHByb3BlcnR5IChwcmljZSA-IDAuMCkpXFxuICAgIF1cXG4gIClcXG5cXG4gIChkZWZ1biBjcmVhdGUtZ2FzLXBheWVyLWd1YXJkOmd1YXJkICgpXFxuICAgIEBkb2NcXG4gICAgXFxcIiBQcm92aWRlIGEgZ3VhcmQgc3VpdGFibGUgZm9yIGNvbnRyb2xsaW5nIGEgY29pbiBhY2NvdW50IHRoYXQgY2FuIFxcXFxcXG4gICAgXFxcXCBwYXkgZ2FzIHZpYSBHQVNfUEFZRVIgbWVjaGFuaWNzLiBHZW5lcmFsbHkgdGhpcyBpcyBhY2NvbXBsaXNoZWQgXFxcXFxcbiAgICBcXFxcIGJ5IGhhdmluZyBHQVNfUEFZRVIgY29tcG9zZSBhbiB1bnBhcmFtZXRlcml6ZWQsIHVubWFuYWdlZCBjYXBhYmlsaXR5IFxcXFxcXG4gICAgXFxcXCB0aGF0IGlzIHJlcXVpcmVkIGluIHRoaXMgZ3VhcmQuIFRodXMsIGlmIGNvaW4gY29udHJhY3QgaXMgYWJsZSB0byBcXFxcXFxuICAgIFxcXFwgc3VjY2Vzc2Z1bGx5IGFjcXVpcmUgR0FTX1BBWUVSLCB0aGUgY29tcG9zZWQgJ2Fub255bW91cycgY2FwIHJlcXVpcmVkIFxcXFxcXG4gICAgXFxcXCBoZXJlIHdpbGwgYmUgaW4gc2NvcGUsIGFuZCBnYXMgYnV5IHdpbGwgc3VjY2VlZC5cXFwiXFxuICApXFxuXFxuKVxcblwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwiZ2VuZXNpcy0wMVwifSJ9", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IkxvYWRlZCBpbnRlcmZhY2UgZ2FzLXBheWVyLXYxIn0sInJlcUtleSI6IlNCM1c1RUxpems5eHpTVlpPTF93bHpuVTY4eWlIT0M5cFlIa3hwVV8wZ28iLCJsb2dzIjoiZlZuSFlta19QNmJSY3VjeVg1RDdLamNLYkVsVDlEcU9vZW9yUFEtUXdsMCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjJ9") + , (unsafeFromText "eyJoYXNoIjoia2ZMd2Y2a0FzdEVnc0NLYnZPOHR2YTNnWktBWXgzT0dHYTZYRURMaU9hMCIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1wibnMtYWRtaW4ta2V5c2V0XCI6W1wiMzY4ODIwZjgwYzMyNGJiYzdjMmIwNjEwNjg4YTdkYTQzZTM5ZjkxZDExODczMjY3MWNkOWM3NTAwZmY0M2NjYVwiXSxcIm5zLW9wZXJhdGUta2V5c2V0XCI6W1wiMzY4ODIwZjgwYzMyNGJiYzdjMmIwNjEwNjg4YTdkYTQzZTM5ZjkxZDExODczMjY3MWNkOWM3NTAwZmY0M2NjYVwiXSxcIm5zLWdlbmVzaXMta2V5c2V0XCI6e1wicHJlZFwiOlwiPVwiLFwia2V5c1wiOltdfX0sXCJjb2RlXCI6XCJcXG4oZGVmaW5lLWtleXNldCAnbnMtYWRtaW4ta2V5c2V0IChyZWFkLWtleXNldCAnbnMtYWRtaW4ta2V5c2V0KSlcXG4oZGVmaW5lLWtleXNldCAnbnMtb3BlcmF0ZS1rZXlzZXQgKHJlYWQta2V5c2V0ICducy1nZW5lc2lzLWtleXNldCkpXFxuXFxuKG1vZHVsZSBucyBHT1ZFUk5BTkNFXFxuICBcXFwiQWRtaW5pc3RlcnMgZGVmaW5pdGlvbiBvZiBuZXcgbmFtZXNwYWNlcyBpbiBDaGFpbndlYi5cXFwiXFxuXFxuICAoZGVmc2NoZW1hIHJlZy1lbnRyeVxcbiAgICBhZG1pbi1ndWFyZDpndWFyZFxcbiAgICBhY3RpdmU6Ym9vbClcXG5cXG4gIChkZWZ0YWJsZSByZWdpc3RyeTp7cmVnLWVudHJ5fSlcXG5cXG4gIChkZWZjYXAgR09WRVJOQU5DRSAoKVxcbiAgICAoZW5mb3JjZS1rZXlzZXQgJ25zLWFkbWluLWtleXNldCkpXFxuXFxuICAoZGVmY2FwIE9QRVJBVEUgKClcXG4gICAgKGVuZm9yY2Uta2V5c2V0ICducy1vcGVyYXRlLWtleXNldCkpXFxuXFxuICAoZGVmY29uc3QgR1VBUkRfU1VDQ0VTUyAoY3JlYXRlLXVzZXItZ3VhcmQgKHN1Y2Nlc3MpKSlcXG4gIChkZWZjb25zdCBHVUFSRF9GQUlMVVJFIChjcmVhdGUtdXNlci1ndWFyZCAoZmFpbHVyZSkpKVxcblxcbiAgKGRlZnVuIHN1Y2Nlc3MgKClcXG4gICAgdHJ1ZSlcXG4gIChkZWZ1biBmYWlsdXJlICgpXFxuICAgIChlbmZvcmNlIGZhbHNlIFxcXCJEaXNhYmxlZFxcXCIpKVxcblxcbiAgKGRlZnVuIHZhbGlkYXRlLW5hbWUgKG5hbWUpXFxuICAgIChlbmZvcmNlICghPSBcXFwiXFxcIiBuYW1lKSBcXFwiRW1wdHkgbmFtZSBub3QgYWxsb3dlZFxcXCIpXFxuICAgIChlbmZvcmNlICg8IChsZW5ndGggbmFtZSkgNjQpIFxcXCJOYW1lIG11c3QgYmUgbGVzcyB0aGFuIDY0IGNoYXJhY3RlcnMgbG9uZ1xcXCIpXFxuICAgIChlbmZvcmNlIChpcy1jaGFyc2V0IENIQVJTRVRfTEFUSU4xIG5hbWUpXFxuICAgICAgICAgICAgIFxcXCJOYW1lIG11c3QgYmUgaW4gbGF0aW4xIGNoYXJzZXRcXFwiKSlcXG5cXG4gIChkZWZ1biB2YWxpZGF0ZTpib29sXFxuICAgICAgKCBucy1uYW1lOnN0cmluZ1xcbiAgICAgICAgbnMtYWRtaW46Z3VhcmRcXG4gICAgICAgIClcXG4gICAgXFxcIiBNYW5hZ2VzIG5hbWVzcGFjZSBpbnN0YWxsIGZvciBDaGFpbndlYi4gUmVxdWlyZXMgYWN0aXZlIHJvdyBpbiByZWdpc3RyeSBcXFxcXFxuICAgIFxcXFwgZm9yIE5TLU5BTUUgd2l0aCBndWFyZCBtYXRjaGluZyBOUy1BRE1JTi5cXFwiXFxuXFxuICAgICh2YWxpZGF0ZS1uYW1lIG5zLW5hbWUpXFxuXFxuICAgICh3aXRoLWRlZmF1bHQtcmVhZCByZWdpc3RyeSBucy1uYW1lXFxuICAgICAgeyAnYWRtaW4tZ3VhcmQgOiBucy1hZG1pblxcbiAgICAgICwgJ2FjdGl2ZSA6IGZhbHNlIH1cXG4gICAgICB7ICdhZG1pbi1ndWFyZCA6PSBhZ1xcbiAgICAgICwgJ2FjdGl2ZSA6PSBpcy1hY3RpdmUgfVxcblxcbiAgICAgICAgKGVuZm9yY2UgaXMtYWN0aXZlIFxcXCJJbmFjdGl2ZSBvciB1bnJlZ2lzdGVyZWQgbmFtZXNwYWNlXFxcIilcXG4gICAgICAgIChlbmZvcmNlICg9IG5zLWFkbWluIGFnKSBcXFwiQWRtaW4gZ3VhcmQgbXVzdCBtYXRjaCBndWFyZCBpbiByZWdpc3RyeVxcXCIpXFxuXFxuICAgICAgICB0cnVlKSlcXG5cXG4gIChkZWZ1biB3cml0ZS1yZWdpc3RyeTpzdHJpbmdcXG4gICAgICAoIG5zLW5hbWU6c3RyaW5nXFxuICAgICAgICBndWFyZDpndWFyZFxcbiAgICAgICAgYWN0aXZlOmJvb2xcXG4gICAgICAgIClcXG4gICAgXFxcIiBXcml0ZSBlbnRyeSB3aXRoIEdVQVJEIGFuZCBBQ1RJVkUgaW50byByZWdpc3RyeSBmb3IgTkFNRS4gXFxcXFxcbiAgICBcXFxcIEd1YXJkZWQgYnkgb3BlcmF0ZSBrZXlzZXQuIFxcXCJcXG5cXG4gICAgKHdpdGgtY2FwYWJpbGl0eSAoT1BFUkFURSlcXG5cXG4gICAgICAodmFsaWRhdGUtbmFtZSBucy1uYW1lKVxcblxcbiAgICAgICh3cml0ZSByZWdpc3RyeSBucy1uYW1lXFxuICAgICAgICB7ICdhZG1pbi1ndWFyZDogZ3VhcmRcXG4gICAgICAgICwgJ2FjdGl2ZTogYWN0aXZlIH0pXFxuXFxuICAgICAgXFxcIlJlZ2lzdGVyIGVudHJ5IHdyaXR0ZW5cXFwiKSlcXG5cXG4gIChkZWZ1biBxdWVyeTpvYmplY3R7cmVnLWVudHJ5fVxcbiAgICAgICggbnMtbmFtZTpzdHJpbmcgKVxcbiAgICAocmVhZCByZWdpc3RyeSBucy1uYW1lKSlcXG5cXG4gIClcXG5cXG4oY3JlYXRlLXRhYmxlIHJlZ2lzdHJ5KVxcblxcbih3cml0ZS1yZWdpc3RyeSBcXFwia2FkZW5hXFxcIlxcbiAgKGtleXNldC1yZWYtZ3VhcmQgJ25zLW9wZXJhdGUta2V5c2V0KSB0cnVlKVxcbih3cml0ZS1yZWdpc3RyeSBcXFwidXNlclxcXCIgR1VBUkRfRkFJTFVSRSB0cnVlKVxcbih3cml0ZS1yZWdpc3RyeSBcXFwiZnJlZVxcXCIgR1VBUkRfRkFJTFVSRSB0cnVlKVxcblxcbihkZWZpbmUtbmFtZXNwYWNlIFxcXCJrYWRlbmFcXFwiXFxuICAoa2V5c2V0LXJlZi1ndWFyZCAnbnMtb3BlcmF0ZS1rZXlzZXQpXFxuICAoa2V5c2V0LXJlZi1ndWFyZCAnbnMtb3BlcmF0ZS1rZXlzZXQpKVxcblxcbihkZWZpbmUtbmFtZXNwYWNlIFxcXCJ1c2VyXFxcIiBHVUFSRF9TVUNDRVNTIEdVQVJEX0ZBSUxVUkUpXFxuKGRlZmluZS1uYW1lc3BhY2UgXFxcImZyZWVcXFwiIEdVQVJEX1NVQ0NFU1MgR1VBUkRfRkFJTFVSRSlcXG47O3JvdGF0ZSB0byByZWFsIG9wZXJhdGUga2V5c2V0XFxuKGRlZmluZS1rZXlzZXQgJ25zLW9wZXJhdGUta2V5c2V0IChyZWFkLWtleXNldCAnbnMtb3BlcmF0ZS1rZXlzZXQpKVxcblwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwibG9hZC1ucy1kZXZuZXQtc2VuZGVyMDBcIn0ifQ", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IktleXNldCBkZWZpbmVkIn0sInJlcUtleSI6ImtmTHdmNmtBc3RFZ3NDS2J2Tzh0dmEzZ1pLQVl4M09HR2E2WEVETGlPYTAiLCJsb2dzIjoiZ1BaazFQZzY5UDZUYXlTSEpxZE9QeEthdHc5WTV3eHZXdjNBRFRqMHVRdyIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjN9") + , (unsafeFromText "eyJoYXNoIjoiYWlyX21QQWdzOW1hOWlaMS1FdHhYcjV5X1E0bm9xZ0k1T245MjZsWVRqOCIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1wiYWxsb2NhdGlvbjAyXCI6W1wiZDI1MDJjZGFiMDhlZjg2NDkwOTBlOTI0ZDBmZDY5Y2U4OWMyYzMxNGZiNTJiZjU0NDA1NzY5YWE1YjQyNWVlYlwiXSxcImFsbG9jYXRpb24wMFwiOltcImY4YTFjNDI1Y2I2NTg5OWFlMGJmMGRkNGM2YTk4MjU1NGYyY2U4OTE0YzUwODQ0NDZmNDk5OWMzYzAwMTk5OTBcIl0sXCJhbGxvY2F0aW9uMDFcIjpbXCJlNTU2MTI0MDFmYjY3MTkwZDNjMGE5MDU3NDkyNjQ4MDZhM2I2NmM5YjlkMDQ4Yjg0Yjk2ZTEyMGU0YTM4N2RjXCJdfSxcImNvZGVcIjpcIihkZWZpbmUta2V5c2V0IFxcXCJhbGxvY2F0aW9uMDBcXFwiIChyZWFkLWtleXNldCBcXFwiYWxsb2NhdGlvbjAwXFxcIikpXFxuKGRlZmluZS1rZXlzZXQgXFxcImFsbG9jYXRpb24wMVxcXCIgKHJlYWQta2V5c2V0IFxcXCJhbGxvY2F0aW9uMDFcXFwiKSlcXG4oZGVmaW5lLWtleXNldCBcXFwiYWxsb2NhdGlvbjAyXFxcIiAocmVhZC1rZXlzZXQgXFxcImFsbG9jYXRpb24wMlxcXCIpKVwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwidGVzdG5ldDA2LWtleXNldHMtTlwifSJ9", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IktleXNldCBkZWZpbmVkIn0sInJlcUtleSI6ImFpcl9tUEFnczltYTlpWjEtRXR4WHI1eV9RNG5vcWdJNU9uOTI2bFlUajgiLCJsb2dzIjoiMmtJc0VCSUlQU0c5MmZuRW96aGVtR1k1dmQ5Vlowb3ZCSXhNYmhJUUlUdyIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjR9") + , (unsafeFromText "eyJoYXNoIjoiRjlTLUpKX0Zrdm04dlQtZXdlSkRZZlZTMnVSR0lRcUVHdElUTHRyeDJZbyIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6bnVsbCxcImNvZGVcIjpcIihjb2luLmNyZWF0ZS1hbGxvY2F0aW9uLWFjY291bnQgXFxcImFsbG9jYXRpb24wMFxcXCIgKHRpbWUgXFxcIjE5MDAtMTAtMTVUMTg6MDA6MDBaXFxcIikgXFxcImFsbG9jYXRpb24wMFxcXCIgMTAwMDAwMC4wKVxcbihjb2luLmNyZWF0ZS1hbGxvY2F0aW9uLWFjY291bnQgXFxcImFsbG9jYXRpb24wMVxcXCIgKHRpbWUgXFxcIjIwMjYtMDEtMzFUMTg6MDA6MDBaXFxcIikgXFxcImFsbG9jYXRpb24wMVxcXCIgMTAwMDAwMC4wKVxcbihjb2luLmNyZWF0ZS1hbGxvY2F0aW9uLWFjY291bnQgXFxcImFsbG9jYXRpb24wMlxcXCIgKHRpbWUgXFxcIjIwMjYtMDYtMzFUMTg6MDA6MDBaXFxcIikgXFxcImFsbG9jYXRpb24wMlxcXCIgMTAwMDAwMC4wKVwifX0sXCJzaWduZXJzXCI6W10sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjE3MjgwMCxcImdhc0xpbWl0XCI6MCxcImNoYWluSWRcIjpcIlwiLFwiZ2FzUHJpY2VcIjowLFwic2VuZGVyXCI6XCJcIn0sXCJub25jZVwiOlwidGVzdG5ldC1hbGxvY2F0aW9ucy0wXCJ9In0", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJGOVMtSkpfRmt2bTh2VC1ld2VKRFlmVlMydVJHSVFxRUd0SVRMdHJ4MllvIiwibG9ncyI6Ik8tWExZNzBQWDhHRzZiU3hTdk8xZUZNVDg1VUkxUnBFZ1BKVVJTMFJzTVkiLCJtZXRhRGF0YSI6bnVsbCwiY29udGludWF0aW9uIjpudWxsLCJ0eElkIjo1fQ") + , (unsafeFromText "eyJoYXNoIjoiVmk3cUJXZHFSdkllX3ZmNVN5ckVKcmtzQkFGTnRfaHRSVjJqcld6YUp6RSIsInNpZ3MiOltdLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1wic2VuZGVyMFwiOltcImMwM2U3NmM4MWE1NmY4MzFhMWVhOTFiOTM1NDVkNmI0OWRhZmZjNTNjNzQxNmUwNjVmY2ZmYjAyNWZhZWU0N2VcIl19LFwiY29kZVwiOlwiKGNvaW4uY29pbmJhc2UgXFxcInNlbmRlcjBcXFwiICAocmVhZC1rZXlzZXQgXFxcInNlbmRlcjBcXFwiKSAxLjApXCJ9fSxcInNpZ25lcnNcIjpbXSxcIm1ldGFcIjp7XCJjcmVhdGlvblRpbWVcIjowLFwidHRsXCI6MTcyODAwLFwiZ2FzTGltaXRcIjowLFwiY2hhaW5JZFwiOlwiXCIsXCJnYXNQcmljZVwiOjAsXCJzZW5kZXJcIjpcIlwifSxcIm5vbmNlXCI6XCJ0ZXN0bmV0MDYtZ3JhbnRzLU5cIn0ifQ", unsafeFromText "eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJWaTdxQldkcVJ2SWVfdmY1U3lyRUpya3NCQUZOdF9odFJWMmpyV3phSnpFIiwibG9ncyI6Imhod3hCWjY0OTV1UFUtVExCV1Q5LWNIeHh0dkE4Y2lUYkJUdHo0TDY0eUkiLCJtZXRhRGF0YSI6bnVsbCwiY29udGludWF0aW9uIjpudWxsLCJ0eElkIjo2fQ") + ] diff --git a/src/Chainweb/Version/Registry.hs b/src/Chainweb/Version/Registry.hs index f0653cdf37..4a0f95261f 100644 --- a/src/Chainweb/Version/Registry.hs +++ b/src/Chainweb/Version/Registry.hs @@ -49,6 +49,7 @@ import Chainweb.Version.Development import Chainweb.Version.RecapDevelopment import Chainweb.Version.Mainnet import Chainweb.Version.Testnet04 +import Chainweb.Version.Testnet06 import Chainweb.Utils.Rule -- temporarily left off because it doesn't validate @@ -56,7 +57,7 @@ import Chainweb.Utils.Rule versionMap :: IORef (HashMap ChainwebVersionCode ChainwebVersion) versionMap = unsafePerformIO $ do traverse_ validateVersion knownVersions - newIORef $ HM.fromList [(_versionCode v, v) | v <- [mainnet, testnet04]] + newIORef $ HM.fromList [(_versionCode v, v) | v <- [mainnet, testnet04, testnet06]] -- | Register a version into our registry by code, ensuring it contains no -- errors and there are no others registered with that code. @@ -74,8 +75,8 @@ registerVersion v = do -- | Unregister a version from the registry. This is ONLY for testing versions. unregisterVersion :: HasCallStack => ChainwebVersion -> IO () unregisterVersion v = do - if elem (_versionCode v) (_versionCode <$> [mainnet, testnet04]) - then error "You cannot unregister mainnet or testnet04 versions" + if elem (_versionCode v) (_versionCode <$> [mainnet, testnet06]) + then error "You cannot unregister mainnet or testnet06 versions" else atomicModifyIORef' versionMap $ \m -> (HM.delete (_versionCode v) m, ()) validateVersion :: HasCallStack => ChainwebVersion -> IO () @@ -146,6 +147,7 @@ lookupVersionByName :: HasCallStack => ChainwebVersionName -> ChainwebVersion lookupVersionByName name | name == _versionName mainnet = mainnet | name == _versionName testnet04 = testnet04 + | name == _versionName testnet06 = testnet06 | otherwise = lookupVersion & versionName .~ name where lookupVersion = unsafeDupablePerformIO $ do @@ -163,12 +165,12 @@ fabricateVersionWithName name = -- | Versions known to us by name. knownVersions :: [ChainwebVersion] -knownVersions = [mainnet, testnet04, recapDevnet, devnet] +knownVersions = [mainnet, testnet04, testnet06, recapDevnet, devnet] -- | Look up a known version by name, usually with `m` instantiated to some -- configuration parser monad. findKnownVersion :: MonadFail m => ChainwebVersionName -> m ChainwebVersion findKnownVersion vn = case find (\v -> _versionName v == vn) knownVersions of - Nothing -> fail $ T.unpack (getChainwebVersionName vn) <> " is not a known version: try development, mainnet01, or testnet04" + Nothing -> fail $ T.unpack (getChainwebVersionName vn) <> " is not a known version: try development, mainnet01, or testnet04/06 " Just v -> return v diff --git a/src/Chainweb/Version/Testnet04.hs b/src/Chainweb/Version/Testnet04.hs index 7a4da9db56..369c9604b6 100644 --- a/src/Chainweb/Version/Testnet04.hs +++ b/src/Chainweb/Version/Testnet04.hs @@ -5,6 +5,8 @@ {-# language QuasiQuotes #-} {-# language ViewPatterns #-} +-- Note: Testnet04 is deprecated + module Chainweb.Version.Testnet04(testnet04, pattern Testnet04) where import Control.Lens diff --git a/src/Chainweb/Version/Testnet06.hs b/src/Chainweb/Version/Testnet06.hs new file mode 100644 index 0000000000..975c0cefe8 --- /dev/null +++ b/src/Chainweb/Version/Testnet06.hs @@ -0,0 +1,127 @@ +{-# language LambdaCase #-} +{-# language NumericUnderscores #-} +{-# language OverloadedStrings #-} +{-# language PatternSynonyms #-} +{-# language QuasiQuotes #-} +{-# language ViewPatterns #-} + +module Chainweb.Version.Testnet06(testnet06, pattern Testnet06) where + +import qualified Data.HashMap.Strict as HM +import qualified Data.Set as Set + +import Chainweb.BlockCreationTime +import Chainweb.BlockHeight +import Chainweb.ChainId +import Chainweb.Difficulty +import Chainweb.Graph +import Chainweb.Time +import Chainweb.Utils +import Chainweb.Utils.Rule +import Chainweb.Version +import P2P.BootstrapNodes + +import Pact.Types.Verifier + +import qualified Chainweb.Pact.Transactions.OtherTransactions as CoinV2 +import qualified Chainweb.Pact.Transactions.CoinV3Transactions as CoinV3 +import qualified Chainweb.Pact.Transactions.CoinV4Transactions as CoinV4 +import qualified Chainweb.Pact.Transactions.CoinV5Transactions as CoinV5 +import qualified Chainweb.Pact.Transactions.CoinV6Transactions as CoinV6 + +import qualified Chainweb.BlockHeader.Genesis.Testnet060Payload as TST0 +import qualified Chainweb.BlockHeader.Genesis.Testnet061to19Payload as TSTN + +pattern Testnet06 :: ChainwebVersion +pattern Testnet06 <- ((== testnet06) -> True) where + Testnet06 = testnet06 + +testnet06 :: ChainwebVersion +testnet06 = ChainwebVersion + { _versionCode = ChainwebVersionCode 0x00000008 + , _versionName = ChainwebVersionName "testnet06" + + , _versionForks = tabulateHashMap $ \case + SlowEpoch -> AllChains $ ForkAtBlockHeight $ BlockHeight 0 + Vuln797Fix -> AllChains $ ForkAtBlockHeight $ BlockHeight 0 + PactBackCompat_v16 -> AllChains $ ForkAtBlockHeight $ BlockHeight 0 + OldTargetGuard -> AllChains $ ForkAtBlockHeight $ BlockHeight 0 + SkipFeatureFlagValidation -> AllChains $ ForkAtBlockHeight $ BlockHeight 0 + SkipTxTimingValidation -> AllChains $ ForkAtBlockHeight $ BlockHeight 2 + ModuleNameFix -> AllChains $ ForkAtBlockHeight $ BlockHeight 2 + ModuleNameFix2 -> AllChains $ ForkAtBlockHeight $ BlockHeight 2 + CoinV2 -> onChains $ [(unsafeChainId 0, ForkAtBlockHeight $ BlockHeight 3)] <> [(unsafeChainId i, ForkAtBlockHeight $ BlockHeight 4) | i <- [1..19]] + OldDAGuard -> AllChains $ ForkAtBlockHeight $ BlockHeight 13 + PactEvents -> AllChains $ ForkAtBlockHeight $ BlockHeight 40 + SPVBridge -> AllChains $ ForkAtBlockHeight $ BlockHeight 50 + Pact4Coin3 -> AllChains $ ForkAtBlockHeight $ BlockHeight 80 + Pact42 -> AllChains $ ForkAtBlockHeight $ BlockHeight 90 + EnforceKeysetFormats -> AllChains $ ForkAtBlockHeight $ BlockHeight 100 + CheckTxHash -> AllChains $ ForkAtBlockHeight $ BlockHeight 110 + Chainweb213Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 95 + Chainweb214Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 115 + Chainweb215Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 165 + Pact44NewTrans -> AllChains $ ForkAtBlockHeight $ BlockHeight 185 + Chainweb216Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 215 + Chainweb217Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 470 + Chainweb218Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 500 + Chainweb219Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 550 + Chainweb220Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 560 + Chainweb221Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 580 + Chainweb222Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 590 + Chainweb223Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 600 + Chainweb224Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 610 + Chainweb225Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 620 + Pact5Fork -> AllChains $ ForkAtBlockHeight $ BlockHeight 640 + Chainweb228Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 650 + Chainweb230Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 680 + Chainweb231Pact -> AllChains $ ForkAtBlockHeight $ BlockHeight 690 + Chainweb31 -> AllChains $ ForkAtBlockHeight $ BlockHeight 700 + MigratePlatformShare -> AllChains $ ForkNever + + , _versionUpgrades = foldr (chainZip HM.union) (AllChains mempty) + [ indexByForkHeights testnet06 + [ (CoinV2, AllChains (Pact4Upgrade CoinV2.transactions False)) + , (Pact4Coin3, AllChains (Pact4Upgrade CoinV3.transactions True)) + , (Chainweb214Pact, AllChains (Pact4Upgrade CoinV4.transactions True)) + , (Chainweb215Pact, AllChains (Pact4Upgrade CoinV5.transactions True)) + , (Chainweb223Pact, AllChains (Pact4Upgrade CoinV6.transactions False)) + ] + ] + + , _versionGraphs = Bottom (minBound, twentyChainGraph) + , _versionBlockDelay = BlockDelay 30_000_000 + , _versionWindow = WindowWidth 120 + , _versionHeaderBaseSizeBytes = 318 - 110 + , _versionBootstraps = domainAddr2PeerInfo testnet06BootstrapHosts + , _versionGenesis = VersionGenesis + -- TODO Setup properly here + { _genesisBlockTarget = onChains $ concat + [ [(unsafeChainId i, HashTarget $ maxBound `div` 100_000) | i <- [0..19]] + ] + -- TODO Setup Genesis time properly + , _genesisTime = AllChains $ BlockCreationTime [timeMicrosQQ| 2019-07-17T18:28:37.613832 |] + , _genesisBlockPayload = onChains $ concat + [ [(unsafeChainId 0, TST0.payloadBlock)] + , [(unsafeChainId i, TSTN.payloadBlock) | i <- [1..19]] + ] + } + + , _versionMaxBlockGasLimit = Bottom (minBound, Just 180_000) + , _versionSpvProofRootValidWindow = Bottom (minBound, Nothing) + , _versionCheats = VersionCheats + { _disablePow = False + , _fakeFirstEpochStart = False + , _disablePact = False + } + , _versionDefaults = VersionDefaults + { _disablePeerValidation = False + , _disableMempoolSync = False + } + , _versionVerifierPluginNames = AllChains $ + (600, Set.fromList $ map VerifierName ["hyperlane_v3_message"]) `Above` + Bottom (minBound, mempty) + , _versionQuirks = noQuirks + , _versionForkNumber = 0 + , _versionForkVoteCastingLength = 120 * 119 -- 5 days + } diff --git a/src/P2P/BootstrapNodes.hs b/src/P2P/BootstrapNodes.hs index 0e5ccbafde..72747880a7 100644 --- a/src/P2P/BootstrapNodes.hs +++ b/src/P2P/BootstrapNodes.hs @@ -13,6 +13,8 @@ module P2P.BootstrapNodes ( mainnetBootstrapHosts , testnet04BootstrapHosts +, testnet06BootstrapHosts +, ) where -- internal modules @@ -57,3 +59,18 @@ testnet04BootstrapHosts = [] -- , "ap1.testnet.chainweb.com:443" -- , "ap2.testnet.chainweb.com:443" -- ] + +-- -------------------------------------------------------------------------- -- +-- | Testnet06 bootstrap nodes. +-- +-- Nodes in this list need a public DNS name and a corresponding TLS +-- certificate. Operators of the nodes are expected to guarantee long term +-- availability of the nodes. +-- +-- Please make a pull request, if you like to see your node being included here. +-- +testnet06BootstrapHosts :: [HostAddress] +testnet06BootstrapHosts = map unsafeHostAddressFromText + [ "testnet06-1.chainweb-community.org:443" + , "testnet06-2.chainweb-community.org:443" + ]