{ "name": "EscrowSessionVaultHybrid", "structs": { "Object43BC5A10": [ { "name": "payer", "type": "address" }, { "name": "payee", "type": "address" }, { "name": "authorizedSigner", "type": "byte[]" }, { "name": "totalDeposit", "type": "uint64" }, { "name": "lastSettled", "type": "uint64" }, { "name": "latestVoucherAmount", "type": "uint64" }, { "name": "startRound", "type": "uint64" }, { "name": "startTimestamp", "type": "uint64" }, { "name": "closeRequestedAt", "type": "uint64" } ], "ObjectAACF8510": [ { "name": "receiver", "type": "address" } ] }, "methods": [ { "name": "open", "args": [ { "type": "address", "name": "payee" }, { "type": "axfer", "name": "deposit" }, { "type": "byte[]", "name": "salt" }, { "type": "byte[]", "name": "authorizedSigner" }, { "type": "byte[]", "name": "authorizedSignerPublicKey" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Opens a channel with initial USDC deposit and returns derived channelId.\nCaller becomes payer.\nauthorizedSigner is signer pubkey hash (32 bytes) computed client-side.\nauthorizedSignerPublicKey is optional: if provided, stores full signer pubkey in box.", "events": [], "recommendations": {} }, { "name": "topUp", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "axfer", "name": "cumulativeAmount" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Adds funds to an existing channel using a grouped USDC asset transfer.", "events": [], "recommendations": {} }, { "name": "setAuthorizedSignerPublicKey", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "byte[]", "name": "authorizedSignerPublicKey" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set full authorized signer public key and update channel.authorizedSigner hash.", "events": [], "recommendations": {} }, { "name": "setSettlementLogicSig", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "address", "name": "logicSig" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Registers the channel-specific LogicSig used for Falcon-authorized settlement.\nThe payer compiles it with this app id, channel id, payee, and the public key\nwhose sha512_256 hash is stored on the channel.", "events": [], "recommendations": {} }, { "name": "settleFromLogicSig", "args": [ { "type": "byte[]", "name": "channelId" }, { "type": "uint64", "name": "cumulativeAmount" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Settle through the registered LogicSig. Falcon verification occurs in the\nLogicSig program; this call binds that authorization to the channel box and\nadvances its voucher watermark, preventing voucher replay.", "events": [], "recommendations": {} }, { "name": "close", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Payee closes channel.\nHonors the latest on-chain voucher before refunding the payer.", "events": [], "recommendations": {} }, { "name": "requestClose", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Payer requests channel closure, starting forced-close grace period.", "events": [], "recommendations": {} }, { "name": "withdraw", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Payer withdraws remaining funds after grace period expires.\nHonors the latest on-chain voucher before refunding the payer.", "events": [], "recommendations": {} }, { "name": "fundMbrPool", "args": [ { "type": "(address)", "struct": "ObjectAACF8510", "name": "payment" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Funds MBR/fees pool using ALGO.", "events": [], "recommendations": {} }, { "name": "optInUsdc", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Opt app account into configured USDC ASA so it can receive deposits.\nShould be called once by admin/creator.", "events": [], "recommendations": {} }, { "name": "getSessionStaticData", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "(uint64,uint64)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns latest session static data tuple:\n[startRound, startTimestamp]", "events": [], "recommendations": {} }, { "name": "getSessionDynamicData", "args": [ { "type": "byte[]", "name": "channelId" } ], "returns": { "type": "(uint64,uint64,uint64)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns latest session dynamic data tuple:\n[totalDeposit, lastSettled, latestVoucherAmount]", "events": [], "recommendations": {} }, { "name": "computeChannelId", "args": [ { "type": "address", "name": "payer" }, { "type": "address", "name": "payee" }, { "type": "byte[]", "name": "authorizedSigner" }, { "type": "byte[]", "name": "salt" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Backwards-compatible alias for deterministic channelId derivation.\nauthorizedSigner must be signer pubkey hash (32 bytes).", "events": [], "recommendations": {} }, { "name": "deriveChannelId", "args": [ { "type": "address", "name": "payer" }, { "type": "address", "name": "payee" }, { "type": "byte[]", "name": "authorizedSigner" }, { "type": "byte[]", "name": "salt" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Read-only helper for clients: deterministic channelId derivation.\nauthorizedSigner must be signer pubkey hash (32 bytes).", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "channels": { "keyType": "AVMBytes", "valueType": "Object43BC5A10", "desc": "BoxMap for channel data, keyed by channelId bytes. latestVoucherAmount is\nthe replay-protection watermark and is atomically advanced on settlement.", "prefix": "" }, "authorizedSignerPublicKey": { "keyType": "AVMBytes", "valueType": "AVMBytes", "desc": "Full authorized signer public key storage, keyed by channelId.", "prefix": "cA==" }, "settlementLogicSig": { "keyType": "AVMBytes", "valueType": "address", "desc": "Address of the channel-specific Falcon-verifying LogicSig, keyed by channelId.", "prefix": "bA==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1193 ], "errorMessage": "Asset close not allowed" }, { "pc": [ 358, 1362 ], "errorMessage": "Authorized signer hash mismatch" }, { "pc": [ 493 ], "errorMessage": "Authorized signer pubkey required" }, { "pc": [ 319 ], "errorMessage": "Box must have value" }, { "pc": [ 413, 475, 560, 619, 739, 780, 819, 923, 969 ], "errorMessage": "Channel does not exist" }, { "pc": [ 1185 ], "errorMessage": "Clawback transfer not allowed" }, { "pc": [ 850 ], "errorMessage": "Close grace period not elapsed" }, { "pc": [ 841 ], "errorMessage": "Close not requested" }, { "pc": [ 1177 ], "errorMessage": "Deposit must be > 0" }, { "pc": [ 574 ], "errorMessage": "LogicSig account required" }, { "pc": [ 652 ], "errorMessage": "Nothing new to settle" }, { "pc": [ 8 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 125 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 880 ], "errorMessage": "Only creator can opt in USDC" }, { "pc": [ 752 ], "errorMessage": "Only payee can close" }, { "pc": [ 328 ], "errorMessage": "Only payer can reopen channel" }, { "pc": [ 789 ], "errorMessage": "Only payer can request close" }, { "pc": [ 569 ], "errorMessage": "Only payer can set LogicSig" }, { "pc": [ 490 ], "errorMessage": "Only payer can set authorized signer" }, { "pc": [ 427 ], "errorMessage": "Only payer can top up" }, { "pc": [ 832 ], "errorMessage": "Only payer can withdraw" }, { "pc": [ 641 ], "errorMessage": "Only settlement LogicSig can settle" }, { "pc": [ 337 ], "errorMessage": "Payee mismatch" }, { "pc": [ 1171 ], "errorMessage": "Payment asset must be USDC" }, { "pc": [ 872, 1163 ], "errorMessage": "Payment must be to contract" }, { "pc": [ 1155 ], "errorMessage": "Payment sender mismatch" }, { "pc": [ 634 ], "errorMessage": "Settlement LogicSig not set" }, { "pc": [ 210 ], "errorMessage": "Signer hash must be 32 bytes" }, { "pc": [ 664 ], "errorMessage": "Voucher exceeds deposit" }, { "pc": [ 155, 171, 190, 386, 443, 459, 536, 588, 724, 765, 804, 908, 954, 1030, 1046, 1098, 1114 ], "errorMessage": "invalid array length header" }, { "pc": [ 865 ], "errorMessage": "invalid number of bytes for ObjectAACF8510" }, { "pc": [ 162, 178, 197, 393, 450, 466, 543, 595, 731, 772, 811, 915, 961, 1037, 1053, 1105, 1121 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 136, 554, 1016, 1024, 1084, 1092 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 611 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 149, 407 ], "errorMessage": "transaction type is axfer" } ], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDMyIDIgVE1QTF9VU0RDX0FTU0VUX0lECiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUwMDIwICJsIiAweDE1MWY3Yzc1ICJwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIGV4cG9ydCBjbGFzcyBFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMjEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NDhkNTNlMzIgMHhiZGNmYWM1OCAweDRiMWRiYjY3IDB4NDJkOTc1YTYgMHg0MzljNWZiMSAweGU4NmFlOWU5IDB4MzQ2ODUwNTAgMHg1OTA1ZDRmNCAweGFhMTRjNGY5IDB4N2UzZjRhNjggMHhhODcwNDkwMyAweDFlOWMwMDkwIDB4OGM0Y2ZjZjcgMHgyYmY2MDllMCAvLyBtZXRob2QgIm9wZW4oYWRkcmVzcyxheGZlcixieXRlW10sYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInRvcFVwKGJ5dGVbXSxheGZlcil2b2lkIiwgbWV0aG9kICJzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5KGJ5dGVbXSxieXRlW10pdm9pZCIsIG1ldGhvZCAic2V0U2V0dGxlbWVudExvZ2ljU2lnKGJ5dGVbXSxhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldHRsZUZyb21Mb2dpY1NpZyhieXRlW10sdWludDY0KXZvaWQiLCBtZXRob2QgImNsb3NlKGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJyZXF1ZXN0Q2xvc2UoYnl0ZVtdKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3KGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJmdW5kTWJyUG9vbCgoYWRkcmVzcykpdm9pZCIsIG1ldGhvZCAib3B0SW5Vc2RjKCl2b2lkIiwgbWV0aG9kICJnZXRTZXNzaW9uU3RhdGljRGF0YShieXRlW10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRTZXNzaW9uRHluYW1pY0RhdGEoYnl0ZVtdKSh1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImNvbXB1dGVDaGFubmVsSWQoYWRkcmVzcyxhZGRyZXNzLGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJkZXJpdmVDaGFubmVsSWQoYWRkcmVzcyxhZGRyZXNzLGJ5dGVbXSxieXRlW10pYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggb3BlbiB0b3BVcCBzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5IHNldFNldHRsZW1lbnRMb2dpY1NpZyBzZXR0bGVGcm9tTG9naWNTaWcgY2xvc2UgcmVxdWVzdENsb3NlIHdpdGhkcmF3IGZ1bmRNYnJQb29sIG9wdEluVXNkYyBnZXRTZXNzaW9uU3RhdGljRGF0YSBnZXRTZXNzaW9uRHluYW1pY0RhdGEgY29tcHV0ZUNoYW5uZWxJZCBkZXJpdmVDaGFubmVsSWQKICAgIGVycgoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo0MQogICAgLy8gZXhwb3J0IGNsYXNzIEVzY3Jvd1Nlc3Npb25WYXVsdEh5YnJpZCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdEh5YnJpZC5vcGVuW3JvdXRpbmddKCkgLT4gdm9pZDoKb3BlbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjY0LTcxCiAgICAvLyBvcGVuKAogICAgLy8gICBwYXllZTogQWNjb3VudCwKICAgIC8vICAgZGVwb3NpdDogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBzYWx0OiBieXRlcywKICAgIC8vICAgYXV0aG9yaXplZFNpZ25lcjogYnl0ZXMsCiAgICAvLyAgIGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXk6IGJ5dGVzLAogICAgLy8gCiAgICAvLyApOiBieXRlcyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgY292ZXIgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIGFzc2VydChhdXRob3JpemVkU2lnbmVyLmxlbmd0aCA9PT0gMzIsICdTaWduZXIgaGFzaCBtdXN0IGJlIDMyIGJ5dGVzJykKICAgIGR1cAogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDYKICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBTaWduZXIgaGFzaCBtdXN0IGJlIDMyIGJ5dGVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo3NAogICAgLy8gY29uc3QgY2hhbm5lbElkID0gdGhpcy5kZXJpdmVDaGFubmVsSWQoVHhuLnNlbmRlciwgcGF5ZWUsIGF1dGhvcml6ZWRTaWduZXIsIHNhbHQpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyODEKICAgIC8vIHJldHVybiBvcC5zaGEyNTYocGF5ZXIuYnl0ZXMuY29uY2F0KHBheWVlLmJ5dGVzKS5jb25jYXQob3AuaXRvYihVU0RDX0FTU0VUX0lEKSkuY29uY2F0KHNhbHQpLmNvbmNhdChhdXRob3JpemVkU2lnbmVyKSkKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBpbnRjIDQgLy8gVE1QTF9VU0RDX0FTU0VUX0lECiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHNoYTI1NgogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gaWYgKCFjaGFubmVsLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogb3Blbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjg1CiAgICAvLyBzdGFydFJvdW5kOiBvcC5HbG9iYWwucm91bmQsCiAgICBnbG9iYWwgUm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjg2CiAgICAvLyBzdGFydFRpbWVzdGFtcDogb3AuR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjc5CiAgICAvLyBwYXllcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjc4LTg4CiAgICAvLyBjb25zdCBkYXRhOiBDaGFubmVsSW5mbyA9IHsKICAgIC8vICAgcGF5ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIHBheWVlLAogICAgLy8gICBhdXRob3JpemVkU2lnbmVyLAogICAgLy8gICB0b3RhbERlcG9zaXQ6IDAsCiAgICAvLyAgIGxhc3RTZXR0bGVkOiAwLAogICAgLy8gICBsYXRlc3RWb3VjaGVyQW1vdW50OiAwLAogICAgLy8gICBzdGFydFJvdW5kOiBvcC5HbG9iYWwucm91bmQsCiAgICAvLyAgIHN0YXJ0VGltZXN0YW1wOiBvcC5HbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgLy8gICBjbG9zZVJlcXVlc3RlZEF0OiAwLAogICAgLy8gfQogICAgZGlnIDgKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgOAogICAgZHVwCiAgICBjb3ZlciA1CiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwNzIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6ODIKICAgIC8vIHRvdGFsRGVwb3NpdDogMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo3OC04OAogICAgLy8gY29uc3QgZGF0YTogQ2hhbm5lbEluZm8gPSB7CiAgICAvLyAgIHBheWVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBwYXllZSwKICAgIC8vICAgYXV0aG9yaXplZFNpZ25lciwKICAgIC8vICAgdG90YWxEZXBvc2l0OiAwLAogICAgLy8gICBsYXN0U2V0dGxlZDogMCwKICAgIC8vICAgbGF0ZXN0Vm91Y2hlckFtb3VudDogMCwKICAgIC8vICAgc3RhcnRSb3VuZDogb3AuR2xvYmFsLnJvdW5kLAogICAgLy8gICBzdGFydFRpbWVzdGFtcDogb3AuR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIC8vICAgY2xvc2VSZXF1ZXN0ZWRBdDogMCwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyB0aGlzLnNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlJZlByb3ZpZGVkKGNoYW5uZWxJZCwgYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleSwgYXV0aG9yaXplZFNpZ25lcikKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA0CiAgICBjYWxsc3ViIHNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlJZlByb3ZpZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gdGhpcy5hcHBseVRvcFVwKGRhdGEsIGRlcG9zaXQpCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYXBwbHlUb3BVcAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIGNoYW5uZWwudmFsdWUgPSBjbG9uZShkYXRhKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAoKb3Blbl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQub3BlbkA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NjQtNzEKICAgIC8vIG9wZW4oCiAgICAvLyAgIHBheWVlOiBBY2NvdW50LAogICAgLy8gICBkZXBvc2l0OiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHNhbHQ6IGJ5dGVzLAogICAgLy8gICBhdXRob3JpemVkU2lnbmVyOiBieXRlcywKICAgIC8vICAgYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleTogYnl0ZXMsCiAgICAvLyAKICAgIC8vICk6IGJ5dGVzIHsKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NTAwMjAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKb3Blbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo5NQogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICBkaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OTYKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gcmVvcGVuIGNoYW5uZWwnKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OTUtOTYKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiByZW9wZW4gY2hhbm5lbCcpCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjk2CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHJlb3BlbiBjaGFubmVsJykKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBwYXllciBjYW4gcmVvcGVuIGNoYW5uZWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjk3CiAgICAvLyBhc3NlcnQocGF5ZWUgPT09IGRhdGEucGF5ZWUsICdQYXllZSBtaXNtYXRjaCcpCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDMyCiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBkaWcgOAogICAgPT0KICAgIGFzc2VydCAvLyBQYXllZSBtaXNtYXRjaAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIGFzc2VydChhdXRob3JpemVkU2lnbmVyID09PSBkYXRhLmF1dGhvcml6ZWRTaWduZXIsICdBdXRob3JpemVkIHNpZ25lciBoYXNoIG1pc21hdGNoJykKICAgIGR1cAogICAgcHVzaGludCA2NCAvLyA2NAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDcKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIEF1dGhvcml6ZWQgc2lnbmVyIGhhc2ggbWlzbWF0Y2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gdGhpcy5zZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5SWZQcm92aWRlZChjaGFubmVsSWQsIGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXksIGRhdGEuYXV0aG9yaXplZFNpZ25lcikKICAgIGRpZyAyCiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5SWZQcm92aWRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTAxCiAgICAvLyB0aGlzLmFwcGx5VG9wVXAoZGF0YSwgZGVwb3NpdCkKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBhcHBseVRvcFVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIGNoYW5uZWwudmFsdWUgPSBjbG9uZShkYXRhKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NjQtNzEKICAgIC8vIG9wZW4oCiAgICAvLyAgIHBheWVlOiBBY2NvdW50LAogICAgLy8gICBkZXBvc2l0OiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHNhbHQ6IGJ5dGVzLAogICAgLy8gICBhdXRob3JpemVkU2lnbmVyOiBieXRlcywKICAgIC8vICAgYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleTogYnl0ZXMsCiAgICAvLyAKICAgIC8vICk6IGJ5dGVzIHsKICAgIGIgb3Blbl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQub3BlbkA0CgoKLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdEh5YnJpZC50b3BVcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnRvcFVwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTEwCiAgICAvLyB0b3BVcChjaGFubmVsSWQ6IGJ5dGVzLCBjdW11bGF0aXZlQW1vdW50OiBndHhuLkFzc2V0VHJhbnNmZXJUeG4pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIGFzc2VydChjaGFubmVsLmV4aXN0cywgJ0NoYW5uZWwgZG9lcyBub3QgZXhpc3QnKQogICAgZGlnIDEKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENoYW5uZWwgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICBkaWcgMQogICAgYm94X2dldAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMTUKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gdG9wIHVwJykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjExNC0xMTUKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiB0b3AgdXAnKQogICAgZGlnIDMKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMTUKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gdG9wIHVwJykKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBwYXllciBjYW4gdG9wIHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMTcKICAgIC8vIHRoaXMuYXBwbHlUb3BVcChkYXRhLCBjdW11bGF0aXZlQW1vdW50KQogICAgY2FsbHN1YiBhcHBseVRvcFVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIGNoYW5uZWwudmFsdWUgPSBjbG9uZShkYXRhKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTEwCiAgICAvLyB0b3BVcChjaGFubmVsSWQ6IGJ5dGVzLCBjdW11bGF0aXZlQW1vdW50OiBndHhuLkFzc2V0VHJhbnNmZXJUeG4pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0SHlicmlkLnNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5KGNoYW5uZWxJZDogYnl0ZXMsIGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXk6IGJ5dGVzKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEyNgogICAgLy8gYXNzZXJ0KGNoYW5uZWwuZXhpc3RzLCAnQ2hhbm5lbCBkb2VzIG5vdCBleGlzdCcpCiAgICBkaWcgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ2hhbm5lbCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBjb25zdCBkYXRhID0gY2xvbmUoY2hhbm5lbC52YWx1ZSkKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiBzZXQgYXV0aG9yaXplZCBzaWduZXInKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTI4LTEyOQogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHNldCBhdXRob3JpemVkIHNpZ25lcicpCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiBzZXQgYXV0aG9yaXplZCBzaWduZXInKQogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHBheWVyIGNhbiBzZXQgYXV0aG9yaXplZCBzaWduZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gYXNzZXJ0KGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXkubGVuZ3RoID4gMCwgJ0F1dGhvcml6ZWQgc2lnbmVyIHB1YmtleSByZXF1aXJlZCcpCiAgICBkdXAKICAgIGxlbgogICAgYXNzZXJ0IC8vIEF1dGhvcml6ZWQgc2lnbmVyIHB1YmtleSByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyBjb25zdCBhdXRob3JpemVkU2lnbmVySGFzaCA9IHNoYTUxMl8yNTYoYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleSkKICAgIGR1cAogICAgc2hhNTEyXzI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyB0aGlzLnNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlJZlByb3ZpZGVkKGNoYW5uZWxJZCwgYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleSwgYXV0aG9yaXplZFNpZ25lckhhc2gpCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgY2FsbHN1YiBzZXRBdXRob3JpemVkU2lnbmVyUHVibGljS2V5SWZQcm92aWRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTM1CiAgICAvLyBkYXRhLmF1dGhvcml6ZWRTaWduZXIgPSBhdXRob3JpemVkU2lnbmVySGFzaAogICAgcHVzaGJ5dGVzIDB4MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMgogICAgcHVzaGludCA2NCAvLyA2NAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTM2CiAgICAvLyBjaGFubmVsLnZhbHVlID0gY2xvbmUoZGF0YSkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gc2V0QXV0aG9yaXplZFNpZ25lclB1YmxpY0tleShjaGFubmVsSWQ6IGJ5dGVzLCBhdXRob3JpemVkU2lnbmVyUHVibGljS2V5OiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQuc2V0U2V0dGxlbWVudExvZ2ljU2lnW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0U2V0dGxlbWVudExvZ2ljU2lnOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTQ0CiAgICAvLyBzZXRTZXR0bGVtZW50TG9naWNTaWcoY2hhbm5lbElkOiBieXRlcywgbG9naWNTaWc6IEFjY291bnQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE0NgogICAgLy8gYXNzZXJ0KGNoYW5uZWwuZXhpc3RzLCAnQ2hhbm5lbCBkb2VzIG5vdCBleGlzdCcpCiAgICBkaWcgMQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ2hhbm5lbCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHNldCBMb2dpY1NpZycpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNDgtMTQ5CiAgICAvLyBjb25zdCBkYXRhID0gY2xvbmUoY2hhbm5lbC52YWx1ZSkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBkYXRhLnBheWVyLCAnT25seSBwYXllciBjYW4gc2V0IExvZ2ljU2lnJykKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18yIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHNldCBMb2dpY1NpZycpCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgcGF5ZXIgY2FuIHNldCBMb2dpY1NpZwogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTUwCiAgICAvLyBhc3NlcnQobG9naWNTaWcgIT09IEFjY291bnQoKSwgJ0xvZ2ljU2lnIGFjY291bnQgcmVxdWlyZWQnKQogICAgZHVwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gTG9naWNTaWcgYWNjb3VudCByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHNldHRsZW1lbnRMb2dpY1NpZyA9IEJveE1hcDxieXRlcywgQWNjb3VudD4oeyBrZXlQcmVmaXg6ICdsJyB9KQogICAgYnl0ZWNfMSAvLyAibCIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNTIKICAgIC8vIHRoaXMuc2V0dGxlbWVudExvZ2ljU2lnKGNoYW5uZWxJZCkudmFsdWUgPSBsb2dpY1NpZwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTQ0CiAgICAvLyBzZXRTZXR0bGVtZW50TG9naWNTaWcoY2hhbm5lbElkOiBieXRlcywgbG9naWNTaWc6IEFjY291bnQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0SHlicmlkLnNldHRsZUZyb21Mb2dpY1NpZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldHRsZUZyb21Mb2dpY1NpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE2MAogICAgLy8gc2V0dGxlRnJvbUxvZ2ljU2lnKGNoYW5uZWxJZDogYnl0ZXMsIGN1bXVsYXRpdmVBbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBkdXAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gYXNzZXJ0KGNoYW5uZWwuZXhpc3RzLCAnQ2hhbm5lbCBkb2VzIG5vdCBleGlzdCcpCiAgICBkaWcgMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ2hhbm5lbCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTY0CiAgICAvLyBjb25zdCBkYXRhID0gY2xvbmUoY2hhbm5lbC52YWx1ZSkKICAgIGRpZyAyCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBzZXR0bGVtZW50TG9naWNTaWcgPSBCb3hNYXA8Ynl0ZXMsIEFjY291bnQ+KHsga2V5UHJlZml4OiAnbCcgfSkKICAgIGJ5dGVjXzEgLy8gImwiCiAgICBkaWcgNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGFzc2VydChsb2dpY1NpZy5leGlzdHMsICdTZXR0bGVtZW50IExvZ2ljU2lnIG5vdCBzZXQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBTZXR0bGVtZW50IExvZ2ljU2lnIG5vdCBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE2NwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGxvZ2ljU2lnLnZhbHVlLCAnT25seSBzZXR0bGVtZW50IExvZ2ljU2lnIGNhbiBzZXR0bGUnKQogICAgdHhuIFNlbmRlcgogICAgc3dhcAogICAgYm94X2dldAogICAgcG9wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgc2V0dGxlbWVudCBMb2dpY1NpZyBjYW4gc2V0dGxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyOTYKICAgIC8vIGFzc2VydChjdW11bGF0aXZlQW1vdW50ID4gZGF0YS5sYXN0U2V0dGxlZCwgJ05vdGhpbmcgbmV3IHRvIHNldHRsZScpCiAgICBkaWcgMwogICAgcHVzaGludHMgNzQgOCAvLyA3NCwgOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cDIKICAgID4KICAgIGFzc2VydCAvLyBOb3RoaW5nIG5ldyB0byBzZXR0bGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI5NwogICAgLy8gYXNzZXJ0KGN1bXVsYXRpdmVBbW91bnQgPD0gZGF0YS50b3RhbERlcG9zaXQsICdWb3VjaGVyIGV4Y2VlZHMgZGVwb3NpdCcpCiAgICBkaWcgNAogICAgcHVzaGludHMgNjYgOCAvLyA2NiwgOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIFZvdWNoZXIgZXhjZWVkcyBkZXBvc2l0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyOTkKICAgIC8vIGNvbnN0IHBheW91dDogdWludDY0ID0gY3VtdWxhdGl2ZUFtb3VudCAtIGRhdGEubGFzdFNldHRsZWQKICAgIGRpZyAxCiAgICBzd2FwCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMDAtMzA0CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBkYXRhLnBheWVlLAogICAgLy8gICBhc3NldEFtb3VudDogcGF5b3V0LAogICAgLy8gfSkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMwMQogICAgLy8geGZlckFzc2V0OiBBc3NldChVU0RDX0FTU0VUX0lEKSwKICAgIGludGMgNCAvLyBUTVBMX1VTRENfQVNTRVRfSUQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMwMgogICAgLy8gYXNzZXRSZWNlaXZlcjogZGF0YS5wYXllZSwKICAgIHVuY292ZXIgNQogICAgaW50Y18yIC8vIDMyCiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMDAtMzA0CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBkYXRhLnBheWVlLAogICAgLy8gICBhc3NldEFtb3VudDogcGF5b3V0LAogICAgLy8gfSkuc3VibWl0KCkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMDYKICAgIC8vIGRhdGEubGFzdFNldHRsZWQgPSBjdW11bGF0aXZlQW1vdW50CiAgICBjb3ZlciAyCiAgICByZXBsYWNlMiA3NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIGlmIChjdW11bGF0aXZlQW1vdW50ID4gZGF0YS5sYXRlc3RWb3VjaGVyQW1vdW50KSB7CiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPgogICAgYnogc2V0dGxlRnJvbUxvZ2ljU2lnX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzA4CiAgICAvLyBkYXRhLmxhdGVzdFZvdWNoZXJBbW91bnQgPSBjdW11bGF0aXZlQW1vdW50CiAgICBkaWcgMQogICAgcmVwbGFjZTIgODIKCnNldHRsZUZyb21Mb2dpY1NpZ19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIGNoYW5uZWwudmFsdWUgPSBjbG9uZShkYXRhKQogICAgZGlnIDIKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNjAKICAgIC8vIHNldHRsZUZyb21Mb2dpY1NpZyhjaGFubmVsSWQ6IGJ5dGVzLCBjdW11bGF0aXZlQW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0SHlicmlkLmNsb3NlW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xvc2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNzcKICAgIC8vIGNsb3NlKGNoYW5uZWxJZDogYnl0ZXMpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxNzkKICAgIC8vIGFzc2VydChjaGFubmVsLmV4aXN0cywgJ0NoYW5uZWwgZG9lcyBub3QgZXhpc3QnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBDaGFubmVsIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxODEKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE4MwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZWUsICdPbmx5IHBheWVlIGNhbiBjbG9zZScpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDMyCiAgICBkdXAKICAgIGJveF9leHRyYWN0CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgcGF5ZWUgY2FuIGNsb3NlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxODUKICAgIC8vIHRoaXMuZmluYWxpemVDaGFubmVsKGNoYW5uZWxJZCwgZGF0YSkKICAgIHN3YXAKICAgIGNhbGxzdWIgZmluYWxpemVDaGFubmVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE3NwogICAgLy8gY2xvc2UoY2hhbm5lbElkOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQucmVxdWVzdENsb3NlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVxdWVzdENsb3NlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyByZXF1ZXN0Q2xvc2UoY2hhbm5lbElkOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gYXNzZXJ0KGNoYW5uZWwuZXhpc3RzLCAnQ2hhbm5lbCBkb2VzIG5vdCBleGlzdCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENoYW5uZWwgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE5NgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiByZXF1ZXN0IGNsb3NlJykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE5NS0xOTYKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiByZXF1ZXN0IGNsb3NlJykKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18yIC8vIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHJlcXVlc3QgY2xvc2UnKQogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHBheWVyIGNhbiByZXF1ZXN0IGNsb3NlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoxOTgKICAgIC8vIGRhdGEuY2xvc2VSZXF1ZXN0ZWRBdCA9IG9wLkdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjE5OC0xOTkKICAgIC8vIGRhdGEuY2xvc2VSZXF1ZXN0ZWRBdCA9IG9wLkdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIC8vIGNoYW5uZWwudmFsdWUgPSBjbG9uZShkYXRhKQogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyByZXF1ZXN0Q2xvc2UoY2hhbm5lbElkOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQud2l0aGRyYXdbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gd2l0aGRyYXcoY2hhbm5lbElkOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gYXNzZXJ0KGNoYW5uZWwuZXhpc3RzLCAnQ2hhbm5lbCBkb2VzIG5vdCBleGlzdCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIENoYW5uZWwgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjExCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gZGF0YS5wYXllciwgJ09ubHkgcGF5ZXIgY2FuIHdpdGhkcmF3JykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIxMC0yMTEKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiB3aXRoZHJhdycpCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IGRhdGEucGF5ZXIsICdPbmx5IHBheWVyIGNhbiB3aXRoZHJhdycpCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgcGF5ZXIgY2FuIHdpdGhkcmF3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMTIKICAgIC8vIGFzc2VydChkYXRhLmNsb3NlUmVxdWVzdGVkQXQgPiAwLCAnQ2xvc2Ugbm90IHJlcXVlc3RlZCcpCiAgICBkdXAKICAgIHB1c2hpbnRzIDEwNiA4IC8vIDEwNiwgOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIENsb3NlIG5vdCByZXF1ZXN0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gb3AuR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSBkYXRhLmNsb3NlUmVxdWVzdGVkQXQgKyBDTE9TRV9HUkFDRV9QRVJJT0RfU0VDT05EUywKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHN3YXAKICAgIHB1c2hpbnQgODg4IC8vIDg4OAogICAgKwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIxMy0yMTYKICAgIC8vIGFzc2VydCgKICAgIC8vICAgb3AuR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA+PSBkYXRhLmNsb3NlUmVxdWVzdGVkQXQgKyBDTE9TRV9HUkFDRV9QRVJJT0RfU0VDT05EUywKICAgIC8vICAgJ0Nsb3NlIGdyYWNlIHBlcmlvZCBub3QgZWxhcHNlZCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gQ2xvc2UgZ3JhY2UgcGVyaW9kIG5vdCBlbGFwc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMTgKICAgIC8vIHRoaXMuZmluYWxpemVDaGFubmVsKGNoYW5uZWxJZCwgZGF0YSkKICAgIHN3YXAKICAgIGNhbGxzdWIgZmluYWxpemVDaGFubmVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gd2l0aGRyYXcoY2hhbm5lbElkOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQuZnVuZE1iclBvb2xbcm91dGluZ10oKSAtPiB2b2lkOgpmdW5kTWJyUG9vbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gZnVuZE1iclBvb2wocGF5bWVudDogeyByZWNlaXZlcjogQWNjb3VudCB9KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBPYmplY3RBQUNGODUxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjI1CiAgICAvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gb3AuR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdQYXltZW50IG11c3QgYmUgdG8gY29udHJhY3QnKQogICAgZXh0cmFjdCAwIDMyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgdG8gY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gZnVuZE1iclBvb2wocGF5bWVudDogeyByZWNlaXZlcjogQWNjb3VudCB9KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdEh5YnJpZC5vcHRJblVzZGNbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJblVzZGM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMzMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBvcC5HbG9iYWwuY3JlYXRvckFkZHJlc3MsICdPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiBVU0RDJykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiBVU0RDCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMzUtMjM5CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBvcC5HbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyB9KS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjM2CiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgaW50YyA0IC8vIFRNUExfVVNEQ19BU1NFVF9JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjM3CiAgICAvLyBhc3NldFJlY2VpdmVyOiBvcC5HbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyMzgKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjIzNS0yMzkKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IG9wLkdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhc3NldEFtb3VudDogMCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBvcHRJblVzZGMoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6OkVzY3Jvd1Nlc3Npb25WYXVsdEh5YnJpZC5nZXRTZXNzaW9uU3RhdGljRGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFNlc3Npb25TdGF0aWNEYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyBnZXRTZXNzaW9uU3RhdGljRGF0YShjaGFubmVsSWQ6IGJ5dGVzKTogW3VpbnQ2NCwgdWludDY0XSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjQ4CiAgICAvLyBhc3NlcnQoY2hhbm5lbC5leGlzdHMsICdDaGFubmVsIGRvZXMgbm90IGV4aXN0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ2hhbm5lbCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjUwLTI1MQogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICAvLyByZXR1cm4gW2RhdGEuc3RhcnRSb3VuZCwgZGF0YS5zdGFydFRpbWVzdGFtcF0KICAgIGR1cAogICAgcHVzaGludHMgOTAgOCAvLyA5MCwgOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI1MQogICAgLy8gcmV0dXJuIFtkYXRhLnN0YXJ0Um91bmQsIGRhdGEuc3RhcnRUaW1lc3RhbXBdCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNTAtMjUxCiAgICAvLyBjb25zdCBkYXRhID0gY2xvbmUoY2hhbm5lbC52YWx1ZSkKICAgIC8vIHJldHVybiBbZGF0YS5zdGFydFJvdW5kLCBkYXRhLnN0YXJ0VGltZXN0YW1wXQogICAgc3dhcAogICAgcHVzaGludHMgOTggOCAvLyA5OCwgOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI1MQogICAgLy8gcmV0dXJuIFtkYXRhLnN0YXJ0Um91bmQsIGRhdGEuc3RhcnRUaW1lc3RhbXBdCiAgICBidG9pCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI0NgogICAgLy8gZ2V0U2Vzc2lvblN0YXRpY0RhdGEoY2hhbm5lbElkOiBieXRlcyk6IFt1aW50NjQsIHVpbnQ2NF0gewogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQuZ2V0U2Vzc2lvbkR5bmFtaWNEYXRhW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0U2Vzc2lvbkR5bmFtaWNEYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjU4CiAgICAvLyBnZXRTZXNzaW9uRHluYW1pY0RhdGEoY2hhbm5lbElkOiBieXRlcyk6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjYwCiAgICAvLyBhc3NlcnQoY2hhbm5lbC5leGlzdHMsICdDaGFubmVsIGRvZXMgbm90IGV4aXN0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ2hhbm5lbCBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjYyLTI2MwogICAgLy8gY29uc3QgZGF0YSA9IGNsb25lKGNoYW5uZWwudmFsdWUpCiAgICAvLyByZXR1cm4gW2RhdGEudG90YWxEZXBvc2l0LCBkYXRhLmxhc3RTZXR0bGVkLCBkYXRhLmxhdGVzdFZvdWNoZXJBbW91bnRdCiAgICBkdXAKICAgIHB1c2hpbnRzIDY2IDggLy8gNjYsIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNjMKICAgIC8vIHJldHVybiBbZGF0YS50b3RhbERlcG9zaXQsIGRhdGEubGFzdFNldHRsZWQsIGRhdGEubGF0ZXN0Vm91Y2hlckFtb3VudF0KICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI2Mi0yNjMKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gcmV0dXJuIFtkYXRhLnRvdGFsRGVwb3NpdCwgZGF0YS5sYXN0U2V0dGxlZCwgZGF0YS5sYXRlc3RWb3VjaGVyQW1vdW50XQogICAgZGlnIDEKICAgIHB1c2hpbnRzIDc0IDggLy8gNzQsIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNjMKICAgIC8vIHJldHVybiBbZGF0YS50b3RhbERlcG9zaXQsIGRhdGEubGFzdFNldHRsZWQsIGRhdGEubGF0ZXN0Vm91Y2hlckFtb3VudF0KICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI2Mi0yNjMKICAgIC8vIGNvbnN0IGRhdGEgPSBjbG9uZShjaGFubmVsLnZhbHVlKQogICAgLy8gcmV0dXJuIFtkYXRhLnRvdGFsRGVwb3NpdCwgZGF0YS5sYXN0U2V0dGxlZCwgZGF0YS5sYXRlc3RWb3VjaGVyQW1vdW50XQogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50cyA4MiA4IC8vIDgyLCA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjYzCiAgICAvLyByZXR1cm4gW2RhdGEudG90YWxEZXBvc2l0LCBkYXRhLmxhc3RTZXR0bGVkLCBkYXRhLmxhdGVzdFZvdWNoZXJBbW91bnRdCiAgICBidG9pCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI1OAogICAgLy8gZ2V0U2Vzc2lvbkR5bmFtaWNEYXRhKGNoYW5uZWxJZDogYnl0ZXMpOiBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0gewogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQuY29tcHV0ZUNoYW5uZWxJZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbXB1dGVDaGFubmVsSWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIGNvbXB1dGVDaGFubmVsSWQocGF5ZXI6IEFjY291bnQsIHBheWVlOiBBY2NvdW50LCBhdXRob3JpemVkU2lnbmVyOiBieXRlcywgc2FsdDogYnl0ZXMpOiBieXRlcyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czoyODEKICAgIC8vIHJldHVybiBvcC5zaGEyNTYocGF5ZXIuYnl0ZXMuY29uY2F0KHBheWVlLmJ5dGVzKS5jb25jYXQob3AuaXRvYihVU0RDX0FTU0VUX0lEKSkuY29uY2F0KHNhbHQpLmNvbmNhdChhdXRob3JpemVkU2lnbmVyKSkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGludGMgNCAvLyBUTVBMX1VTRENfQVNTRVRfSUQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBjb21wdXRlQ2hhbm5lbElkKHBheWVyOiBBY2NvdW50LCBwYXllZTogQWNjb3VudCwgYXV0aG9yaXplZFNpZ25lcjogYnl0ZXMsIHNhbHQ6IGJ5dGVzKTogYnl0ZXMgewogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0SHlicmlkLmRlcml2ZUNoYW5uZWxJZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlcml2ZUNoYW5uZWxJZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI3OAogICAgLy8gZGVyaXZlQ2hhbm5lbElkKHBheWVyOiBBY2NvdW50LCBwYXllZTogQWNjb3VudCwgYXV0aG9yaXplZFNpZ25lcjogYnl0ZXMsIHNhbHQ6IGJ5dGVzKTogYnl0ZXMgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MjgxCiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KHBheWVyLmJ5dGVzLmNvbmNhdChwYXllZS5ieXRlcykuY29uY2F0KG9wLml0b2IoVVNEQ19BU1NFVF9JRCkpLmNvbmNhdChzYWx0KS5jb25jYXQoYXV0aG9yaXplZFNpZ25lcikpCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBpbnRjIDQgLy8gVE1QTF9VU0RDX0FTU0VUX0lECiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjI3OAogICAgLy8gZGVyaXZlQ2hhbm5lbElkKHBheWVyOiBBY2NvdW50LCBwYXllZTogQWNjb3VudCwgYXV0aG9yaXplZFNpZ25lcjogYnl0ZXMsIHNhbHQ6IGJ5dGVzKTogYnl0ZXMgewogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1MDAyMAogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0SHlicmlkLmFwcGx5VG9wVXAoZGF0YTogYnl0ZXMsIGN1bXVsYXRpdmVBbW91bnQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmFwcGx5VG9wVXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIHByaXZhdGUgYXBwbHlUb3BVcChkYXRhOiBDaGFubmVsSW5mbywgY3VtdWxhdGl2ZUFtb3VudDogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuKTogdm9pZCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMxMwogICAgLy8gYXNzZXJ0KGN1bXVsYXRpdmVBbW91bnQuc2VuZGVyID09PSBUeG4uc2VuZGVyLCAnUGF5bWVudCBzZW5kZXIgbWlzbWF0Y2gnKQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBzZW5kZXIgbWlzbWF0Y2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gYXNzZXJ0KGN1bXVsYXRpdmVBbW91bnQuYXNzZXRSZWNlaXZlciA9PT0gb3AuR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdQYXltZW50IG11c3QgYmUgdG8gY29udHJhY3QnKQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgdG8gY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gYXNzZXJ0KGN1bXVsYXRpdmVBbW91bnQueGZlckFzc2V0LmlkID09PSBVU0RDX0FTU0VUX0lELCAnUGF5bWVudCBhc3NldCBtdXN0IGJlIFVTREMnKQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGMgNCAvLyBUTVBMX1VTRENfQVNTRVRfSUQKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBhc3NldCBtdXN0IGJlIFVTREMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMxNgogICAgLy8gYXNzZXJ0KGN1bXVsYXRpdmVBbW91bnQuYXNzZXRBbW91bnQgPiAwLCAnRGVwb3NpdCBtdXN0IGJlID4gMCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBEZXBvc2l0IG11c3QgYmUgPiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMTcKICAgIC8vIGFzc2VydChjdW11bGF0aXZlQW1vdW50LmFzc2V0U2VuZGVyID09PSBBY2NvdW50KCksICdDbGF3YmFjayB0cmFuc2ZlciBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0U2VuZGVyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQ2xhd2JhY2sgdHJhbnNmZXIgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gYXNzZXJ0KGN1bXVsYXRpdmVBbW91bnQuYXNzZXRDbG9zZVRvID09PSBBY2NvdW50KCksICdBc3NldCBjbG9zZSBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEFzc2V0IGNsb3NlIG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMjAKICAgIC8vIGRhdGEudG90YWxEZXBvc2l0ICs9IGN1bXVsYXRpdmVBbW91bnQuYXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA2NiAvLyA2NgogICAgZXh0cmFjdF91aW50NjQKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgNjYKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMyMgogICAgLy8gZGF0YS5jbG9zZVJlcXVlc3RlZEF0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgcmVwbGFjZTIgMTA2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjpFc2Nyb3dTZXNzaW9uVmF1bHRIeWJyaWQuZmluYWxpemVDaGFubmVsKGNoYW5uZWxJZDogYnl0ZXMsIGRhdGE6IGJ5dGVzKSAtPiBieXRlczoKZmluYWxpemVDaGFubmVsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzI1CiAgICAvLyBwcml2YXRlIGZpbmFsaXplQ2hhbm5lbChjaGFubmVsSWQ6IGJ5dGVzLCBkYXRhOiBDaGFubmVsSW5mbyk6IHZvaWQgewogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gY29uc3QgcGF5ZWVQYXlvdXQ6IHVpbnQ2NCA9IGRhdGEubGF0ZXN0Vm91Y2hlckFtb3VudCAtIGRhdGEubGFzdFNldHRsZWQKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA4MiAvLyA4MgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDc0IC8vIDc0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIGlmIChwYXllZVBheW91dCA+IDApIHsKICAgIGJ6IGZpbmFsaXplQ2hhbm5lbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMyOC0zMzIKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGRhdGEucGF5ZWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBwYXllZVBheW91dCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICBpbnRjIDQgLy8gVE1QTF9VU0RDX0FTU0VUX0lECiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMzAKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IGRhdGEucGF5ZWUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMzIgMzIKICAgIGZyYW1lX2RpZyA0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMjgtMzMyCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KFVTRENfQVNTRVRfSUQpLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBkYXRhLnBheWVlLAogICAgLy8gICBhc3NldEFtb3VudDogcGF5ZWVQYXlvdXQsCiAgICAvLyB9KS5zdWJtaXQoKQogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKCmZpbmFsaXplQ2hhbm5lbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMzUKICAgIC8vIGNvbnN0IHBheWVyUmVmdW5kOiB1aW50NjQgPSBkYXRhLnRvdGFsRGVwb3NpdCAtIGRhdGEubGF0ZXN0Vm91Y2hlckFtb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDMKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMzYKICAgIC8vIGlmIChwYXllclJlZnVuZCA+IDApIHsKICAgIGJ6IGZpbmFsaXplQ2hhbm5lbF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMzNy0zNDEKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGRhdGEucGF5ZXIsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBwYXllclJlZnVuZCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMzgKICAgIC8vIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICBpbnRjIDQgLy8gVE1QTF9VU0RDX0FTU0VUX0lECiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozMzkKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IGRhdGEucGF5ZXIsCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCAzMgogICAgZnJhbWVfZGlnIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjMzNy0zNDEKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQoVVNEQ19BU1NFVF9JRCksCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGRhdGEucGF5ZXIsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBwYXllclJlZnVuZCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKZmluYWxpemVDaGFubmVsX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM0NAogICAgLy8gdGhpcy5jaGFubmVscyhjaGFubmVsSWQpLmRlbGV0ZSgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXkgPSBCb3hNYXA8Ynl0ZXMsIGJ5dGVzPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlY18zIC8vICJwIgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozNDYKICAgIC8vIGlmIChzaWduZXJQdWJsaWNLZXkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGZpbmFsaXplQ2hhbm5lbF9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9lc2Nyb3dfc2Vzc2lvbl92YXVsdF9oeWJyaWRfbWFuYWdlci9jb250cmFjdC5hbGdvLnRzOjM0NwogICAgLy8gc2lnbmVyUHVibGljS2V5LmRlbGV0ZSgpCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2RlbAogICAgcG9wCgpmaW5hbGl6ZUNoYW5uZWxfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHNldHRsZW1lbnRMb2dpY1NpZyA9IEJveE1hcDxieXRlcywgQWNjb3VudD4oeyBrZXlQcmVmaXg6ICdsJyB9KQogICAgYnl0ZWNfMSAvLyAibCIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzUwCiAgICAvLyBpZiAobG9naWNTaWcuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGZpbmFsaXplQ2hhbm5lbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIGxvZ2ljU2lnLmRlbGV0ZSgpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2RlbAogICAgcG9wCgpmaW5hbGl6ZUNoYW5uZWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo6RXNjcm93U2Vzc2lvblZhdWx0SHlicmlkLnNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlJZlByb3ZpZGVkKGNoYW5uZWxJZDogYnl0ZXMsIGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXk6IGJ5dGVzLCBleHBlY3RlZEF1dGhvcml6ZWRTaWduZXJIYXNoOiBieXRlcykgLT4gdm9pZDoKc2V0QXV0aG9yaXplZFNpZ25lclB1YmxpY0tleUlmUHJvdmlkZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozNTUtMzU5CiAgICAvLyBwcml2YXRlIHNldEF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXlJZlByb3ZpZGVkKAogICAgLy8gICBjaGFubmVsSWQ6IGJ5dGVzLAogICAgLy8gICBhdXRob3JpemVkU2lnbmVyUHVibGljS2V5OiBieXRlcywKICAgIC8vICAgZXhwZWN0ZWRBdXRob3JpemVkU2lnbmVySGFzaDogYnl0ZXMsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDMgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzYwCiAgICAvLyBpZiAoYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleS5sZW5ndGggPiAwKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgYnogc2V0QXV0aG9yaXplZFNpZ25lclB1YmxpY0tleUlmUHJvdmlkZWRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czozNjEKICAgIC8vIGFzc2VydChzaGE1MTJfMjU2KGF1dGhvcml6ZWRTaWduZXJQdWJsaWNLZXkpID09PSBleHBlY3RlZEF1dGhvcml6ZWRTaWduZXJIYXNoLCAnQXV0aG9yaXplZCBzaWduZXIgaGFzaCBtaXNtYXRjaCcpCiAgICBmcmFtZV9kaWcgLTIKICAgIHNoYTUxMl8yNTYKICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydCAvLyBBdXRob3JpemVkIHNpZ25lciBoYXNoIG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvZXNjcm93X3Nlc3Npb25fdmF1bHRfaHlicmlkX21hbmFnZXIvY29udHJhY3QuYWxnby50czo1MQogICAgLy8gYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleSA9IEJveE1hcDxieXRlcywgYnl0ZXM+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjXzMgLy8gInAiCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2VzY3Jvd19zZXNzaW9uX3ZhdWx0X2h5YnJpZF9tYW5hZ2VyL2NvbnRyYWN0LmFsZ28udHM6MzYzCiAgICAvLyBhdXRob3JpemVkU2lnbmVyS2V5LnZhbHVlID0gYXV0aG9yaXplZFNpZ25lclB1YmxpY0tleQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAoKc2V0QXV0aG9yaXplZFNpZ25lclB1YmxpY0tleUlmUHJvdmlkZWRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAEgAgAmBAYVH3x1ACABbAQVH3x1AXAxG0EAcTEZFEQxGESCDgRI1T4yBL3PrFgESx27ZwRC2XWmBEOcX7EE6Grp6QQ0aFBQBFkF1PQEqhTE+QR+P0poBKhwSQMEHpwAkASMTPz3BCv2CeA2GgCODgALAQgBQQGeAdICWgKDAqoC5QL2AxIDQAN8A8AAMRkUMRgUEEQjQzYaAUcCFSQSRDEWIwlJTgI4EIEEEkQ2GgJJIlklCEsBFRJEVwIANhoDSSJZJQhLARUSRFcCAElOBDYaBEkiWSUISwEVEkRXAgBOBEkVSU4GJBJEMQBPA1AhBBZQTwJQTFABSU4DvUUBQABQMgYyBzEASwhQSwYWVwYCSwhJTgVQTIACAHJQIhZMSwFQSwFQSwFQTwQWUE8DFlBMUExQSwRJTgJPBU8EiAQZTwKIA0pLAbxIvyhLAVCwI0NLAkm+RDEASwIiJLoSREsBJEm6SwgSREmBQFlLARVLAk4CUlcCAEsHSwESREsCTwVPAogD008CiAMESwG8SL9C/7c2GgFJIlklCEsBFRJEVwIAMRYjCUk4EIEEEkRLAb1FAURLAb5ITDEASwMiJLoSRIgCyksBvEi/I0M2GgFJIlklCEsBFRJEVwIANhoCSSJZJQhLARUSRFcCAEsBvUUBREsBvkhOAjEASwIiJLoSREkVREkDSwJPAksCiANKgAIAIExQSwKBQFlPAyJPAlhMUEsBvEi/I0M2GgFJIlklCEsBFRJEVwIANhoCSRUkEkRLAb1FAUQxAEsCIiS6EkRJMgMTRClPAlBMvyNDNhoBSSJZJQhLARUSRFcCAEk2GgJJTgJJFYEIEkRJF0sCvUUBREsCvkhOAilLBFBJvUUBRDEATL5IEkRLA4MCSgi6F0oNREsEgwJCCLoXSwIPREsBTAmxIQRMTwUkSbqyFLISshGBBLIQIrIBs04CXEpJTgKBUlsNQQAESwFcUksCSbxITL8jQzYaAUkiWSUISwEVEkRXAgBJvUUBREm+SEwxAEsBJEm6EkRMiAHOSCNDNhoBSSJZJQhLARUSRFcCAEm9RQFEMQBLASIkuhJEMgcWgWpMuyNDNhoBSSJZJQhLARUSRFcCAEm9RQFESb5ITDEASwEiJLoSREmDAmoIuhdJRDIHTIH4BggPREyIAWxII0M2GgFJFSQSRFcAIDIKEkQjQzEAMgkSRLEhBDIKIrISshSyEYEEshAisgGzI0M2GgFJIlklCEsBFRJEVwIASb1FAURJgwJaCLoXTIMCYgi6F0wWTBZQKkxQsCNDNhoBSSJZJQhLARUSRFcCAEm9RQFESYMCQgi6F0sBgwJKCLoXTwKDAlIIuhdPAhZPAhZQTBZQKkxQsCNDNhoBSRUkEkQ2GgJJFSQSRDYaA0kiWSUISwEVEkRXAgA2GgRJIlklCEsBFRJEVwIATwNPA1AhBBZQTFBMUAEoTFCwI0M2GgFJFSQSRDYaAkkVJBJENhoDSSJZJQhLARUSRFcCADYaBEkiWSUISwEVEkRXAgBPA08DUCEEFlBMUExQAShMULAjQ4oCAYv/OAAxABJEi/84FDIKEkSL/zgRIQQSRIv/OBJJRIv/OBMyAxJEi/84FTIDEkSL/oFCWwgWi/5MXEKM/iIWi/5MXGpJjP6JigIBIkmAAIv/gVJbSYv/gUpbCUlBABixIQSL/1cgIIsEshKyFLIRgQSyECKyAbOL/4FCW4sDCUmMAkEAGLEhBIv/VwAgiwKyErIUshGBBLIQIrIBs4v+vEgri/5QSYwBvUUBQQAEiwG8SCmL/lBJjAC9RQFBAASLALxIi/+MAImKAwCL/hVBABGL/gOL/xJEK4v9UEm8SIv+v4k=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": { "USDC_ASSET_ID": { "type": "AVMUint64" } } }