{ "name": "AmmDex", "structs": {}, "methods": [ { "name": "bootstrap", "args": [ { "type": "pay", "name": "seed" }, { "type": "uint64", "name": "assetB" }, { "type": "uint64", "name": "feeBps" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Bootstrap the pool: create LP token, opt into asset B.\nRequires a seed payment to cover MBR for the LP ASA + asset B opt-in.", "events": [], "recommendations": {} }, { "name": "addLiquidity", "args": [ { "type": "pay", "name": "payAlgo" }, { "type": "axfer", "name": "xferB" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Add liquidity: deposit ALGO + asset B, receive LP tokens.\nFirst deposit: LP = sqrt(amountA * amountB) - MIN_LIQUIDITY\nSubsequent: LP = min(amountA * totalLp / reserveA, amountB * totalLp / reserveB)", "events": [], "recommendations": {} }, { "name": "removeLiquidity", "args": [ { "type": "axfer", "name": "lpXfer" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Remove liquidity: send LP tokens to contract, receive proportional ALGO + asset B.", "events": [], "recommendations": {} }, { "name": "swapAlgoForAsset", "args": [ { "type": "pay", "name": "payAlgo" }, { "type": "uint64", "name": "minOutput" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Swap ALGO \u2192 Asset B.\nUser sends ALGO payment, receives asset B.", "events": [], "recommendations": {} }, { "name": "swapAssetForAlgo", "args": [ { "type": "axfer", "name": "xferB" }, { "type": "uint64", "name": "minOutput" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Swap Asset B \u2192 ALGO.\nUser sends asset B transfer, receives ALGO.", "events": [], "recommendations": {} }, { "name": "getPrice", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Read-only: price of ALGO in asset B units, scaled by 1e6", "events": [], "recommendations": {} }, { "name": "getReserveA", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getReserveB", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getTotalLp", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getFeeBps", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "swap", "args": [ { "type": "uint64", "name": "direction" }, { "type": "uint64", "name": "amountIn" }, { "type": "uint64", "name": "minAmountOut" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Compatibility helper for checklist-based integrations:\ndirection: 0 => ALGO -> Asset B, 1 => Asset B -> ALGO", "events": [], "recommendations": {} }, { "name": "addLiquidityPreview", "args": [ { "type": "uint64", "name": "amountAlgo" }, { "type": "uint64", "name": "amountAsset" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Compatibility helper for checklist-based integrations", "events": [], "recommendations": {} }, { "name": "removeLiquidityPreview", "args": [ { "type": "uint64", "name": "lpAmount" } ], "returns": { "type": "(uint64,uint64)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Compatibility helper for checklist-based integrations", "events": [], "recommendations": {} }, { "name": "getReserves", "args": [], "returns": { "type": "(uint64,uint64)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Compatibility helper for checklist-based integrations", "events": [], "recommendations": {} }, { "name": "setFee", "args": [ { "type": "uint64", "name": "newFeeBps" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Governor-only: update swap fee", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "AmmDex \u2014 Constant-Product AMM on Algorand\n\nPools ALGO (native) against an ASA (asset B).\nLP token created on-chain at bootstrap via inner txn.\nFee: configurable by governor (default 30 bps = 0.3%).", "networks": {}, "state": { "schema": { "global": { "ints": 6, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "assetB": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXNzZXRfYg==" }, "lpToken": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bHBfdG9rZW4=" }, "governor": { "keyType": "AVMString", "valueType": "address", "key": "Z292ZXJub3I=" }, "feeBps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZmVlX2Jwcw==" }, "reserveA": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmVzZXJ2ZV9h" }, "reserveB": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmVzZXJ2ZV9i" }, "totalLp": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxfbHA=" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 251 ], "errorMessage": "ALREADY_BOOTSTRAPPED" }, { "pc": [ 414 ], "errorMessage": "BAD_ALGO_RECEIVER" }, { "pc": [ 421 ], "errorMessage": "BAD_ASSET_RECEIVER" }, { "pc": [ 583 ], "errorMessage": "BAD_LP_RECEIVER" }, { "pc": [ 747, 861 ], "errorMessage": "BAD_RECEIVER" }, { "pc": [ 264 ], "errorMessage": "BAD_SEED_RECEIVER" }, { "pc": [ 256, 1252 ], "errorMessage": "FEE_TOO_HIGH" }, { "pc": [ 452, 1121 ], "errorMessage": "INITIAL_LIQUIDITY_TOO_LOW" }, { "pc": [ 594 ], "errorMessage": "INSUFFICIENT_LP" }, { "pc": [ 779, 904 ], "errorMessage": "INSUFFICIENT_RESERVES" }, { "pc": [ 406, 570, 739, 853 ], "errorMessage": "NOT_BOOTSTRAPPED" }, { "pc": [ 1247 ], "errorMessage": "NOT_GOVERNOR" }, { "pc": [ 1179 ], "errorMessage": "NO_LP_SUPPLY" }, { "pc": [ 951 ], "errorMessage": "NO_RESERVES" }, { "pc": [ 89 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 213 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 274 ], "errorMessage": "SEED_TOO_LOW" }, { "pc": [ 772, 897, 1066 ], "errorMessage": "SLIPPAGE_EXCEEDED" }, { "pc": [ 431, 872 ], "errorMessage": "WRONG_ASSET" }, { "pc": [ 576 ], "errorMessage": "WRONG_LP_TOKEN" }, { "pc": [ 621 ], "errorMessage": "ZERO_ALGO_OUT" }, { "pc": [ 623 ], "errorMessage": "ZERO_ASSET_OUT" }, { "pc": [ 752, 877, 1047 ], "errorMessage": "ZERO_INPUT" }, { "pc": [ 587, 1173 ], "errorMessage": "ZERO_LP_BURN" }, { "pc": [ 464 ], "errorMessage": "ZERO_LP_MINT" }, { "pc": [ 429, 441, 468, 475, 491, 519, 528, 538, 591, 598, 610, 655, 694, 756, 760, 776, 783, 803, 870, 881, 885, 901, 908, 949, 955, 973, 984, 995, 1007, 1054, 1058, 1077, 1081, 1109, 1135, 1144, 1152, 1177, 1183, 1193, 1214, 1218, 1245, 1266 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 233, 242, 731, 845, 1022, 1031, 1043, 1095, 1104, 1170, 1237 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 399, 565, 837 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 225, 389, 723 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwIDEwMDAwCiAgICBieXRlY2Jsb2NrICJyZXNlcnZlX2EiICJyZXNlcnZlX2IiIDB4MTUxZjdjNzUgInRvdGFsX2xwIiAibHBfdG9rZW4iICJhc3NldF9iIiAiZmVlX2JwcyIgImdvdmVybm9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIEFtbURleCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDIyCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDI1ZTZjMzc2IDB4NDNjMmU2MzAgMHg5MDZhZmJjMyAweGY0YmYwZThiIDB4YWQwNjc3NWUgMHg1ZDI5NzJhNSAweGNjMmFlMmQ2IDB4Y2Y4NTY5N2UgMHhjZjA0NDI4NSAweDExNTE0MTA5IDB4ZWEwYWY5OGQgMHg0MGExYWMyNyAweGYyNGM4ZjIzIDB4ZmI4YTRhNGMgMHhkOWFkY2ZlOCAvLyBtZXRob2QgImJvb3RzdHJhcChwYXksdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFkZExpcXVpZGl0eShwYXksYXhmZXIpdWludDY0IiwgbWV0aG9kICJyZW1vdmVMaXF1aWRpdHkoYXhmZXIpdm9pZCIsIG1ldGhvZCAic3dhcEFsZ29Gb3JBc3NldChwYXksdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic3dhcEFzc2V0Rm9yQWxnbyhheGZlcix1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRQcmljZSgpdWludDY0IiwgbWV0aG9kICJnZXRSZXNlcnZlQSgpdWludDY0IiwgbWV0aG9kICJnZXRSZXNlcnZlQigpdWludDY0IiwgbWV0aG9kICJnZXRUb3RhbExwKCl1aW50NjQiLCBtZXRob2QgImdldEZlZUJwcygpdWludDY0IiwgbWV0aG9kICJzd2FwKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYWRkTGlxdWlkaXR5UHJldmlldyh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAicmVtb3ZlTGlxdWlkaXR5UHJldmlldyh1aW50NjQpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRSZXNlcnZlcygpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRGZWUodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBib290c3RyYXAgYWRkTGlxdWlkaXR5IHJlbW92ZUxpcXVpZGl0eSBzd2FwQWxnb0ZvckFzc2V0IHN3YXBBc3NldEZvckFsZ28gZ2V0UHJpY2UgZ2V0UmVzZXJ2ZUEgZ2V0UmVzZXJ2ZUIgZ2V0VG90YWxMcCBnZXRGZWVCcHMgc3dhcCBhZGRMaXF1aWRpdHlQcmV2aWV3IHJlbW92ZUxpcXVpZGl0eVByZXZpZXcgZ2V0UmVzZXJ2ZXMgc2V0RmVlCiAgICBlcnIKCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIEFtbURleCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjpBbW1EZXguYm9vdHN0cmFwW3JvdXRpbmddKCkgLT4gdm9pZDoKYm9vdHN0cmFwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo0MQogICAgLy8gYXNzZXJ0KCF0aGlzLmxwVG9rZW4uaGFzVmFsdWUsICdBTFJFQURZX0JPT1RTVFJBUFBFRCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyOAogICAgLy8gbHBUb2tlbiA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogJ2xwX3Rva2VuJyB9KQogICAgYnl0ZWMgNCAvLyAibHBfdG9rZW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyBhc3NlcnQoIXRoaXMubHBUb2tlbi5oYXNWYWx1ZSwgJ0FMUkVBRFlfQk9PVFNUUkFQUEVEJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBBTFJFQURZX0JPT1RTVFJBUFBFRAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo0MgogICAgLy8gYXNzZXJ0KGZlZUJwcyA8IFNDQUxFLCAnRkVFX1RPT19ISUdIJykKICAgIGR1cAogICAgaW50YyA1IC8vIDEwMDAwCiAgICA8CiAgICBhc3NlcnQgLy8gRkVFX1RPT19ISUdICiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBhc3NlcnQoc2VlZC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdCQURfU0VFRF9SRUNFSVZFUicpCiAgICBkaWcgMgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEJBRF9TRUVEX1JFQ0VJVkVSCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyBhc3NlcnQoc2VlZC5hbW91bnQgPj0gVWludDY0KDMwMF8wMDApLCAnU0VFRF9UT09fTE9XJykKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDMwMDAwMCAvLyAzMDAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gU0VFRF9UT09fTE9XCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI3CiAgICAvLyBhc3NldEIgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6ICdhc3NldF9iJyB9KQogICAgYnl0ZWMgNSAvLyAiYXNzZXRfYiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIHRoaXMuYXNzZXRCLnZhbHVlID0gYXNzZXRCCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzAKICAgIC8vIGZlZUJwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdmZWVfYnBzJyB9KQogICAgYnl0ZWMgNiAvLyAiZmVlX2JwcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NDcKICAgIC8vIHRoaXMuZmVlQnBzLnZhbHVlID0gZmVlQnBzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyOQogICAgLy8gZ292ZXJub3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2dvdmVybm9yJyB9KQogICAgYnl0ZWMgNyAvLyAiZ292ZXJub3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyB0aGlzLmdvdmVybm9yLnZhbHVlID0gVHhuLnNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIHJlc2VydmVBID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYScgfSkKICAgIGJ5dGVjXzAgLy8gInJlc2VydmVfYSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHRoaXMucmVzZXJ2ZUEudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmVzZXJ2ZUIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9iJyB9KQogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9iIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo1MAogICAgLy8gdGhpcy5yZXNlcnZlQi52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyB0b3RhbExwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3RvdGFsX2xwJyB9KQogICAgYnl0ZWNfMyAvLyAidG90YWxfbHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjUxCiAgICAvLyB0aGlzLnRvdGFsTHAudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo1My02MwogICAgLy8gY29uc3QgbHBSZXN1bHQgPSBpdHhuCiAgICAvLyAgIC5hc3NldENvbmZpZyh7CiAgICAvLyAgICAgdG90YWw6IDEwXzAwMF8wMDBfMDAwLAogICAgLy8gICAgIGRlY2ltYWxzOiA2LAogICAgLy8gICAgIGFzc2V0TmFtZTogJ1NMWURFWC1MUCcsCiAgICAvLyAgICAgdW5pdE5hbWU6ICdTRExQJywKICAgIC8vICAgICBtYW5hZ2VyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBtYW5hZ2VyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjYwCiAgICAvLyByZXNlcnZlOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGR1cAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjU4CiAgICAvLyB1bml0TmFtZTogJ1NETFAnLAogICAgcHVzaGJ5dGVzICJTRExQIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBhc3NldE5hbWU6ICdTTFlERVgtTFAnLAogICAgcHVzaGJ5dGVzICJTTFlERVgtTFAiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gZGVjaW1hbHM6IDYsCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjU1CiAgICAvLyB0b3RhbDogMTBfMDAwXzAwMF8wMDAsCiAgICBwdXNoaW50IDEwMDAwMDAwMDAwIC8vIDEwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NTMtNjIKICAgIC8vIGNvbnN0IGxwUmVzdWx0ID0gaXR4bgogICAgLy8gICAuYXNzZXRDb25maWcoewogICAgLy8gICAgIHRvdGFsOiAxMF8wMDBfMDAwXzAwMCwKICAgIC8vICAgICBkZWNpbWFsczogNiwKICAgIC8vICAgICBhc3NldE5hbWU6ICdTTFlERVgtTFAnLAogICAgLy8gICAgIHVuaXROYW1lOiAnU0RMUCcsCiAgICAvLyAgICAgbWFuYWdlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo2MQogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NTMtNjMKICAgIC8vIGNvbnN0IGxwUmVzdWx0ID0gaXR4bgogICAgLy8gICAuYXNzZXRDb25maWcoewogICAgLy8gICAgIHRvdGFsOiAxMF8wMDBfMDAwXzAwMCwKICAgIC8vICAgICBkZWNpbWFsczogNiwKICAgIC8vICAgICBhc3NldE5hbWU6ICdTTFlERVgtTFAnLAogICAgLy8gICAgIHVuaXROYW1lOiAnU0RMUCcsCiAgICAvLyAgICAgbWFuYWdlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFzc2V0SUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjgKICAgIC8vIGxwVG9rZW4gPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6ICdscF90b2tlbicgfSkKICAgIGJ5dGVjIDQgLy8gImxwX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy5scFRva2VuLnZhbHVlID0gbHBSZXN1bHQuY3JlYXRlZEFzc2V0CiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NjctNzQKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXRCLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NzAKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NzEKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgc3dhcAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NjctNzMKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXRCLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjY3LTc0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0QiwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjpBbW1EZXguYWRkTGlxdWlkaXR5W3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkTGlxdWlkaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo4NgogICAgLy8gYXNzZXJ0KHRoaXMubHBUb2tlbi5oYXNWYWx1ZSwgJ05PVF9CT09UU1RSQVBQRUQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjgKICAgIC8vIGxwVG9rZW4gPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6ICdscF90b2tlbicgfSkKICAgIGJ5dGVjIDQgLy8gImxwX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo4NgogICAgLy8gYXNzZXJ0KHRoaXMubHBUb2tlbi5oYXNWYWx1ZSwgJ05PVF9CT09UU1RSQVBQRUQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIE5PVF9CT09UU1RSQVBQRUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIGFzc2VydChwYXlBbGdvLnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgJ0JBRF9BTEdPX1JFQ0VJVkVSJykKICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX0FMR09fUkVDRUlWRVIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIGFzc2VydCh4ZmVyQi5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgJ0JBRF9BU1NFVF9SRUNFSVZFUicpCiAgICBkdXAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEJBRF9BU1NFVF9SRUNFSVZFUgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo4OQogICAgLy8gYXNzZXJ0KHhmZXJCLnhmZXJBc3NldCA9PT0gdGhpcy5hc3NldEIudmFsdWUsICdXUk9OR19BU1NFVCcpCiAgICBkdXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjcKICAgIC8vIGFzc2V0QiA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogJ2Fzc2V0X2InIH0pCiAgICBieXRlYyA1IC8vICJhc3NldF9iIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo4OQogICAgLy8gYXNzZXJ0KHhmZXJCLnhmZXJBc3NldCA9PT0gdGhpcy5hc3NldEIudmFsdWUsICdXUk9OR19BU1NFVCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBXUk9OR19BU1NFVAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gY29uc3QgYW1vdW50QTogdWludDY0ID0gcGF5QWxnby5hbW91bnQKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo5MgogICAgLy8gY29uc3QgYW1vdW50QjogdWludDY0ID0geGZlckIuYXNzZXRBbW91bnQKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyBpZiAodGhpcy50b3RhbExwLnZhbHVlID09PSBVaW50NjQoMCkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyB0b3RhbExwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3RvdGFsX2xwJyB9KQogICAgYnl0ZWNfMyAvLyAidG90YWxfbHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyBpZiAodGhpcy50b3RhbExwLnZhbHVlID09PSBVaW50NjQoMCkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBibnogYWRkTGlxdWlkaXR5X2Vsc2VfYm9keUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjk2CiAgICAvLyBjb25zdCBwcm9kdWN0OiB1aW50NjQgPSBhbW91bnRBICogYW1vdW50QgogICAgZHVwMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo5NwogICAgLy8gY29uc3Qgc3FydFByb2R1Y3Q6IHVpbnQ2NCA9IG9wLnNxcnQocHJvZHVjdCkKICAgIHNxcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIGFzc2VydChzcXJ0UHJvZHVjdCA+IE1JTl9MSVFVSURJVFksICdJTklUSUFMX0xJUVVJRElUWV9UT09fTE9XJykKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAKICAgID4KICAgIGFzc2VydCAvLyBJTklUSUFMX0xJUVVJRElUWV9UT09fTE9XCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjk5CiAgICAvLyBscFRvTWludCA9IHNxcnRQcm9kdWN0IC0gTUlOX0xJUVVJRElUWQogICAgaW50YyA0IC8vIDEwMDAKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIGNvbnN0IGxvY2tlZDogdWludDY0ID0gbHBUb01pbnQgKyBNSU5fTElRVUlESVRZCiAgICBpbnRjIDQgLy8gMTAwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMwogICAgLy8gdG90YWxMcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0b3RhbF9scCcgfSkKICAgIGJ5dGVjXzMgLy8gInRvdGFsX2xwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMDEKICAgIC8vIHRoaXMudG90YWxMcC52YWx1ZSA9IGxvY2tlZAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFkZExpcXVpZGl0eV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjExMAogICAgLy8gYXNzZXJ0KGxwVG9NaW50ID4gVWludDY0KDApLCAnWkVST19MUF9NSU5UJykKICAgIGR1cAogICAgYXNzZXJ0IC8vIFpFUk9fTFBfTUlOVAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IG5ld1Jlc2VydmVBOiB1aW50NjQgPSB0aGlzLnJlc2VydmVBLnZhbHVlICsgYW1vdW50QQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIHJlc2VydmVBID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYScgfSkKICAgIGJ5dGVjXzAgLy8gInJlc2VydmVfYSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTEyCiAgICAvLyBjb25zdCBuZXdSZXNlcnZlQTogdWludDY0ID0gdGhpcy5yZXNlcnZlQS52YWx1ZSArIGFtb3VudEEKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIGNvbnN0IG5ld1Jlc2VydmVCOiB1aW50NjQgPSB0aGlzLnJlc2VydmVCLnZhbHVlICsgYW1vdW50QgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIHJlc2VydmVCID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYicgfSkKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBjb25zdCBuZXdSZXNlcnZlQjogdWludDY0ID0gdGhpcy5yZXNlcnZlQi52YWx1ZSArIGFtb3VudEIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMQogICAgLy8gcmVzZXJ2ZUEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9hJyB9KQogICAgYnl0ZWNfMCAvLyAicmVzZXJ2ZV9hIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIHRoaXMucmVzZXJ2ZUEudmFsdWUgPSBuZXdSZXNlcnZlQQogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmVzZXJ2ZUIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9iJyB9KQogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9iIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMTUKICAgIC8vIHRoaXMucmVzZXJ2ZUIudmFsdWUgPSBuZXdSZXNlcnZlQgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTE3LTEyNAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLmxwVG9rZW4udmFsdWUsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhc3NldEFtb3VudDogbHBUb01pbnQsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIHhmZXJBc3NldDogdGhpcy5scFRva2VuLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjgKICAgIC8vIGxwVG9rZW4gPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6ICdscF90b2tlbicgfSkKICAgIGJ5dGVjIDQgLy8gImxwX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIHhmZXJBc3NldDogdGhpcy5scFRva2VuLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTIwCiAgICAvLyBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTE3LTEyMwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLmxwVG9rZW4udmFsdWUsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhc3NldEFtb3VudDogbHBUb01pbnQsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjExNy0xMjQKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5scFRva2VuLnZhbHVlLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGxwVG9NaW50LAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYWRkTGlxdWlkaXR5X2Vsc2VfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMDMKICAgIC8vIGNvbnN0IGxwRnJvbUE6IHVpbnQ2NCA9IChhbW91bnRBICogdGhpcy50b3RhbExwLnZhbHVlKSAvIHRoaXMucmVzZXJ2ZUEudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyB0b3RhbExwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3RvdGFsX2xwJyB9KQogICAgYnl0ZWNfMyAvLyAidG90YWxfbHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gY29uc3QgbHBGcm9tQTogdWludDY0ID0gKGFtb3VudEEgKiB0aGlzLnRvdGFsTHAudmFsdWUpIC8gdGhpcy5yZXNlcnZlQS52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyCiAgICBkaWcgMQogICAgKgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIHJlc2VydmVBID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYScgfSkKICAgIGJ5dGVjXzAgLy8gInJlc2VydmVfYSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTAzCiAgICAvLyBjb25zdCBscEZyb21BOiB1aW50NjQgPSAoYW1vdW50QSAqIHRoaXMudG90YWxMcC52YWx1ZSkgLyB0aGlzLnJlc2VydmVBLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMDQKICAgIC8vIGNvbnN0IGxwRnJvbUI6IHVpbnQ2NCA9IChhbW91bnRCICogdGhpcy50b3RhbExwLnZhbHVlKSAvIHRoaXMucmVzZXJ2ZUIudmFsdWUKICAgIGRpZyAyCiAgICBkaWcgMgogICAgKgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIHJlc2VydmVCID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYicgfSkKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyBjb25zdCBscEZyb21COiB1aW50NjQgPSAoYW1vdW50QiAqIHRoaXMudG90YWxMcC52YWx1ZSkgLyB0aGlzLnJlc2VydmVCLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxMDUKICAgIC8vIGxwVG9NaW50ID0gbHBGcm9tQSA8IGxwRnJvbUIgPyBscEZyb21BIDogbHBGcm9tQgogICAgZHVwMgogICAgPAogICAgc3dhcAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTA2CiAgICAvLyBjb25zdCBuZXdUb3RhbDogdWludDY0ID0gdGhpcy50b3RhbExwLnZhbHVlICsgbHBUb01pbnQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIHRvdGFsTHAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndG90YWxfbHAnIH0pCiAgICBieXRlY18zIC8vICJ0b3RhbF9scCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyB0aGlzLnRvdGFsTHAudmFsdWUgPSBuZXdUb3RhbAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgYWRkTGlxdWlkaXR5X2FmdGVyX2lmX2Vsc2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6OkFtbURleC5yZW1vdmVMaXF1aWRpdHlbcm91dGluZ10oKSAtPiB2b2lkOgpyZW1vdmVMaXF1aWRpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBhc3NlcnQodGhpcy5scFRva2VuLmhhc1ZhbHVlLCAnTk9UX0JPT1RTVFJBUFBFRCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyOAogICAgLy8gbHBUb2tlbiA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogJ2xwX3Rva2VuJyB9KQogICAgYnl0ZWMgNCAvLyAibHBfdG9rZW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjEzNAogICAgLy8gYXNzZXJ0KHRoaXMubHBUb2tlbi5oYXNWYWx1ZSwgJ05PVF9CT09UU1RSQVBQRUQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBOT1RfQk9PVFNUUkFQUEVECiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjEzNQogICAgLy8gYXNzZXJ0KGxwWGZlci54ZmVyQXNzZXQgPT09IHRoaXMubHBUb2tlbi52YWx1ZSwgJ1dST05HX0xQX1RPS0VOJykKICAgIGRpZyAxCiAgICBndHhucyBYZmVyQXNzZXQKICAgID09CiAgICBhc3NlcnQgLy8gV1JPTkdfTFBfVE9LRU4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTM2CiAgICAvLyBhc3NlcnQobHBYZmVyLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCAnQkFEX0xQX1JFQ0VJVkVSJykKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX0xQX1JFQ0VJVkVSCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjEzOAogICAgLy8gY29uc3QgbHBBbW91bnQ6IHVpbnQ2NCA9IGxwWGZlci5hc3NldEFtb3VudAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTM5CiAgICAvLyBhc3NlcnQobHBBbW91bnQgPiBVaW50NjQoMCksICdaRVJPX0xQX0JVUk4nKQogICAgZHVwCiAgICBhc3NlcnQgLy8gWkVST19MUF9CVVJOCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE0MAogICAgLy8gYXNzZXJ0KGxwQW1vdW50IDwgdGhpcy50b3RhbExwLnZhbHVlLCAnSU5TVUZGSUNJRU5UX0xQJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyB0b3RhbExwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3RvdGFsX2xwJyB9KQogICAgYnl0ZWNfMyAvLyAidG90YWxfbHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE0MAogICAgLy8gYXNzZXJ0KGxwQW1vdW50IDwgdGhpcy50b3RhbExwLnZhbHVlLCAnSU5TVUZGSUNJRU5UX0xQJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gSU5TVUZGSUNJRU5UX0xQCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE0MgogICAgLy8gY29uc3Qgb3V0QTogdWludDY0ID0gKGxwQW1vdW50ICogdGhpcy5yZXNlcnZlQS52YWx1ZSkgLyB0aGlzLnRvdGFsTHAudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyByZXNlcnZlQSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2EnIH0pCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2EiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE0MgogICAgLy8gY29uc3Qgb3V0QTogdWludDY0ID0gKGxwQW1vdW50ICogdGhpcy5yZXNlcnZlQS52YWx1ZSkgLyB0aGlzLnRvdGFsTHAudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgZGlnIDEKICAgICoKICAgIGRpZyAyCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gY29uc3Qgb3V0QjogdWludDY0ID0gKGxwQW1vdW50ICogdGhpcy5yZXNlcnZlQi52YWx1ZSkgLyB0aGlzLnRvdGFsTHAudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyByZXNlcnZlQiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2InIH0pCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gY29uc3Qgb3V0QjogdWludDY0ID0gKGxwQW1vdW50ICogdGhpcy5yZXNlcnZlQi52YWx1ZSkgLyB0aGlzLnRvdGFsTHAudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgNAogICAgZGlnIDEKICAgICoKICAgIGRpZyA0CiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gYXNzZXJ0KG91dEEgPiBVaW50NjQoMCksICdaRVJPX0FMR09fT1VUJykKICAgIGRpZyAyCiAgICBhc3NlcnQgLy8gWkVST19BTEdPX09VVAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIGFzc2VydChvdXRCID4gVWludDY0KDApLCAnWkVST19BU1NFVF9PVVQnKQogICAgZHVwCiAgICBhc3NlcnQgLy8gWkVST19BU1NFVF9PVVQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBuZXdSZXNBOiB1aW50NjQgPSB0aGlzLnJlc2VydmVBLnZhbHVlIC0gb3V0QQogICAgdW5jb3ZlciAzCiAgICBkaWcgMwogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIGNvbnN0IG5ld1Jlc0I6IHVpbnQ2NCA9IHRoaXMucmVzZXJ2ZUIudmFsdWUgLSBvdXRCCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gY29uc3QgbmV3VG90YWxMcDogdWludDY0ID0gdGhpcy50b3RhbExwLnZhbHVlIC0gbHBBbW91bnQKICAgIHVuY292ZXIgNAogICAgZGlnIDUKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIHJlc2VydmVBID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYScgfSkKICAgIGJ5dGVjXzAgLy8gInJlc2VydmVfYSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTUxCiAgICAvLyB0aGlzLnJlc2VydmVBLnZhbHVlID0gbmV3UmVzQQogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmVzZXJ2ZUIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9iJyB9KQogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9iIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxNTIKICAgIC8vIHRoaXMucmVzZXJ2ZUIudmFsdWUgPSBuZXdSZXNCCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyB0b3RhbExwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3RvdGFsX2xwJyB9KQogICAgYnl0ZWNfMyAvLyAidG90YWxfbHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE1MwogICAgLy8gdGhpcy50b3RhbExwLnZhbHVlID0gbmV3VG90YWxMcAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTU2LTE2MwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLmxwVG9rZW4udmFsdWUsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogb3AuR2xvYmFsLnplcm9BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBscEFtb3VudCwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8geGZlckFzc2V0OiB0aGlzLmxwVG9rZW4udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyOAogICAgLy8gbHBUb2tlbiA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogJ2xwX3Rva2VuJyB9KQogICAgYnl0ZWMgNCAvLyAibHBfdG9rZW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8geGZlckFzc2V0OiB0aGlzLmxwVG9rZW4udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxNTkKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IG9wLkdsb2JhbC56ZXJvQWRkcmVzcywKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE1Ni0xNjIKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5scFRva2VuLnZhbHVlLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IG9wLkdsb2JhbC56ZXJvQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogbHBBbW91bnQsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxNjEKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE1Ni0xNjMKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5scFRva2VuLnZhbHVlLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IG9wLkdsb2JhbC56ZXJvQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogbHBBbW91bnQsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTY1LTE3MQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBvdXRBLAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTY3CiAgICAvLyByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTY1LTE3MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBvdXRBLAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTY5CiAgICAvLyBmZWU6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxNjUtMTcxCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IG91dEEsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTczLTE4MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0Qi52YWx1ZSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBvdXRCLAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTc1CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXRCLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjcKICAgIC8vIGFzc2V0QiA9IEdsb2JhbFN0YXRlPEFzc2V0Pih7IGtleTogJ2Fzc2V0X2InIH0pCiAgICBieXRlYyA1IC8vICJhc3NldF9iIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIHhmZXJBc3NldDogdGhpcy5hc3NldEIudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxNzYKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTczLTE3OQogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0Qi52YWx1ZSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBvdXRCLAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTc4CiAgICAvLyBmZWU6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxNzMtMTgwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXRCLnZhbHVlLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IG91dEIsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6OkFtbURleC5zd2FwQWxnb0ZvckFzc2V0W3JvdXRpbmddKCkgLT4gdm9pZDoKc3dhcEFsZ29Gb3JBc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE4OQogICAgLy8gYXNzZXJ0KHRoaXMubHBUb2tlbi5oYXNWYWx1ZSwgJ05PVF9CT09UU1RSQVBQRUQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjgKICAgIC8vIGxwVG9rZW4gPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6ICdscF90b2tlbicgfSkKICAgIGJ5dGVjIDQgLy8gImxwX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxODkKICAgIC8vIGFzc2VydCh0aGlzLmxwVG9rZW4uaGFzVmFsdWUsICdOT1RfQk9PVFNUUkFQUEVEJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBOT1RfQk9PVFNUUkFQUEVECiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gYXNzZXJ0KHBheUFsZ28ucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCAnQkFEX1JFQ0VJVkVSJykKICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX1JFQ0VJVkVSCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjE5MgogICAgLy8gY29uc3QgYW1vdW50SW46IHVpbnQ2NCA9IHBheUFsZ28uYW1vdW50CiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTkzCiAgICAvLyBhc3NlcnQoYW1vdW50SW4gPiBVaW50NjQoMCksICdaRVJPX0lOUFVUJykKICAgIGR1cAogICAgYXNzZXJ0IC8vIFpFUk9fSU5QVVQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBjb25zdCBhbW91bnRPdXQ6IHVpbnQ2NCA9IHRoaXMuX2NvbXB1dGVPdXRwdXQoYW1vdW50SW4sIHRoaXMucmVzZXJ2ZUEudmFsdWUsIHRoaXMucmVzZXJ2ZUIudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMQogICAgLy8gcmVzZXJ2ZUEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9hJyB9KQogICAgYnl0ZWNfMCAvLyAicmVzZXJ2ZV9hIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxOTUKICAgIC8vIGNvbnN0IGFtb3VudE91dDogdWludDY0ID0gdGhpcy5fY29tcHV0ZU91dHB1dChhbW91bnRJbiwgdGhpcy5yZXNlcnZlQS52YWx1ZSwgdGhpcy5yZXNlcnZlQi52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmVzZXJ2ZUIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9iJyB9KQogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9iIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxOTUKICAgIC8vIGNvbnN0IGFtb3VudE91dDogdWludDY0ID0gdGhpcy5fY29tcHV0ZU91dHB1dChhbW91bnRJbiwgdGhpcy5yZXNlcnZlQS52YWx1ZSwgdGhpcy5yZXNlcnZlQi52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgY292ZXIgMgogICAgY2FsbHN1YiBfY29tcHV0ZU91dHB1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxOTcKICAgIC8vIGFzc2VydChhbW91bnRPdXQgPj0gbWluT3V0cHV0LCAnU0xJUFBBR0VfRVhDRUVERUQnKQogICAgZHVwCiAgICB1bmNvdmVyIDMKICAgID49CiAgICBhc3NlcnQgLy8gU0xJUFBBR0VfRVhDRUVERUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MTk4CiAgICAvLyBhc3NlcnQoYW1vdW50T3V0IDwgdGhpcy5yZXNlcnZlQi52YWx1ZSwgJ0lOU1VGRklDSUVOVF9SRVNFUlZFUycpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmVzZXJ2ZUIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9iJyB9KQogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9iIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxOTgKICAgIC8vIGFzc2VydChhbW91bnRPdXQgPCB0aGlzLnJlc2VydmVCLnZhbHVlLCAnSU5TVUZGSUNJRU5UX1JFU0VSVkVTJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gSU5TVUZGSUNJRU5UX1JFU0VSVkVTCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIwMAogICAgLy8gY29uc3QgbmV3UmVzQTogdWludDY0ID0gdGhpcy5yZXNlcnZlQS52YWx1ZSArIGFtb3VudEluCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMQogICAgLy8gcmVzZXJ2ZUEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9hJyB9KQogICAgYnl0ZWNfMCAvLyAicmVzZXJ2ZV9hIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMDAKICAgIC8vIGNvbnN0IG5ld1Jlc0E6IHVpbnQ2NCA9IHRoaXMucmVzZXJ2ZUEudmFsdWUgKyBhbW91bnRJbgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMDEKICAgIC8vIGNvbnN0IG5ld1Jlc0I6IHVpbnQ2NCA9IHRoaXMucmVzZXJ2ZUIudmFsdWUgLSBhbW91bnRPdXQKICAgIHN3YXAKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyByZXNlcnZlQSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2EnIH0pCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2EiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gdGhpcy5yZXNlcnZlQS52YWx1ZSA9IG5ld1Jlc0EKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIHJlc2VydmVCID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYicgfSkKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjAzCiAgICAvLyB0aGlzLnJlc2VydmVCLnZhbHVlID0gbmV3UmVzQgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjA1LTIxMgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0Qi52YWx1ZSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnRPdXQsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMDcKICAgIC8vIHhmZXJBc3NldDogdGhpcy5hc3NldEIudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNwogICAgLy8gYXNzZXRCID0gR2xvYmFsU3RhdGU8QXNzZXQ+KHsga2V5OiAnYXNzZXRfYicgfSkKICAgIGJ5dGVjIDUgLy8gImFzc2V0X2IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIwNwogICAgLy8geGZlckFzc2V0OiB0aGlzLmFzc2V0Qi52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIwNS0yMTEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5hc3NldEIudmFsdWUsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50T3V0LAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjEwCiAgICAvLyBmZWU6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMDUtMjEyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXRCLnZhbHVlLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudE91dCwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoxODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo6QW1tRGV4LnN3YXBBc3NldEZvckFsZ29bcm91dGluZ10oKSAtPiB2b2lkOgpzd2FwQXNzZXRGb3JBbGdvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIyMwogICAgLy8gYXNzZXJ0KHRoaXMubHBUb2tlbi5oYXNWYWx1ZSwgJ05PVF9CT09UU1RSQVBQRUQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjgKICAgIC8vIGxwVG9rZW4gPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6ICdscF90b2tlbicgfSkKICAgIGJ5dGVjIDQgLy8gImxwX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGFzc2VydCh0aGlzLmxwVG9rZW4uaGFzVmFsdWUsICdOT1RfQk9PVFNUUkFQUEVEJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBOT1RfQk9PVFNUUkFQUEVECiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gYXNzZXJ0KHhmZXJCLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCAnQkFEX1JFQ0VJVkVSJykKICAgIGRpZyAxCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBCQURfUkVDRUlWRVIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjI1CiAgICAvLyBhc3NlcnQoeGZlckIueGZlckFzc2V0ID09PSB0aGlzLmFzc2V0Qi52YWx1ZSwgJ1dST05HX0FTU0VUJykKICAgIGRpZyAxCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI3CiAgICAvLyBhc3NldEIgPSBHbG9iYWxTdGF0ZTxBc3NldD4oeyBrZXk6ICdhc3NldF9iJyB9KQogICAgYnl0ZWMgNSAvLyAiYXNzZXRfYiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjI1CiAgICAvLyBhc3NlcnQoeGZlckIueGZlckFzc2V0ID09PSB0aGlzLmFzc2V0Qi52YWx1ZSwgJ1dST05HX0FTU0VUJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIFdST05HX0FTU0VUCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIyNwogICAgLy8gY29uc3QgYW1vdW50SW46IHVpbnQ2NCA9IHhmZXJCLmFzc2V0QW1vdW50CiAgICBzd2FwCiAgICBndHhucyBBc3NldEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIGFzc2VydChhbW91bnRJbiA+IFVpbnQ2NCgwKSwgJ1pFUk9fSU5QVVQnKQogICAgZHVwCiAgICBhc3NlcnQgLy8gWkVST19JTlBVVAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMzAKICAgIC8vIGNvbnN0IGFtb3VudE91dDogdWludDY0ID0gdGhpcy5fY29tcHV0ZU91dHB1dChhbW91bnRJbiwgdGhpcy5yZXNlcnZlQi52YWx1ZSwgdGhpcy5yZXNlcnZlQS52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyByZXNlcnZlQiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2InIH0pCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIzMAogICAgLy8gY29uc3QgYW1vdW50T3V0OiB1aW50NjQgPSB0aGlzLl9jb21wdXRlT3V0cHV0KGFtb3VudEluLCB0aGlzLnJlc2VydmVCLnZhbHVlLCB0aGlzLnJlc2VydmVBLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyByZXNlcnZlQSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2EnIH0pCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2EiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIzMAogICAgLy8gY29uc3QgYW1vdW50T3V0OiB1aW50NjQgPSB0aGlzLl9jb21wdXRlT3V0cHV0KGFtb3VudEluLCB0aGlzLnJlc2VydmVCLnZhbHVlLCB0aGlzLnJlc2VydmVBLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAyCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF9jb21wdXRlT3V0cHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gYXNzZXJ0KGFtb3VudE91dCA+PSBtaW5PdXRwdXQsICdTTElQUEFHRV9FWENFRURFRCcpCiAgICBkdXAKICAgIHVuY292ZXIgMwogICAgPj0KICAgIGFzc2VydCAvLyBTTElQUEFHRV9FWENFRURFRAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMzMKICAgIC8vIGFzc2VydChhbW91bnRPdXQgPCB0aGlzLnJlc2VydmVBLnZhbHVlLCAnSU5TVUZGSUNJRU5UX1JFU0VSVkVTJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyByZXNlcnZlQSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2EnIH0pCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2EiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIzMwogICAgLy8gYXNzZXJ0KGFtb3VudE91dCA8IHRoaXMucmVzZXJ2ZUEudmFsdWUsICdJTlNVRkZJQ0lFTlRfUkVTRVJWRVMnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBJTlNVRkZJQ0lFTlRfUkVTRVJWRVMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBjb25zdCBuZXdSZXNCOiB1aW50NjQgPSB0aGlzLnJlc2VydmVCLnZhbHVlICsgYW1vdW50SW4KICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyByZXNlcnZlQiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2InIH0pCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIzNQogICAgLy8gY29uc3QgbmV3UmVzQjogdWludDY0ID0gdGhpcy5yZXNlcnZlQi52YWx1ZSArIGFtb3VudEluCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gY29uc3QgbmV3UmVzQTogdWludDY0ID0gdGhpcy5yZXNlcnZlQS52YWx1ZSAtIGFtb3VudE91dAogICAgc3dhcAogICAgZGlnIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIHJlc2VydmVCID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYicgfSkKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjM3CiAgICAvLyB0aGlzLnJlc2VydmVCLnZhbHVlID0gbmV3UmVzQgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMQogICAgLy8gcmVzZXJ2ZUEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9hJyB9KQogICAgYnl0ZWNfMCAvLyAicmVzZXJ2ZV9hIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyMzgKICAgIC8vIHRoaXMucmVzZXJ2ZUEudmFsdWUgPSBuZXdSZXNBCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNDAtMjQ2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudE91dCwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI0MgogICAgLy8gcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjQwLTI0NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRPdXQsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNDQKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI0MC0yNDYKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogYW1vdW50T3V0LAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjIyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGl0b2IKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjpBbW1EZXguZ2V0UHJpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRQcmljZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjU0CiAgICAvLyBhc3NlcnQodGhpcy5yZXNlcnZlQS52YWx1ZSA+IFVpbnQ2NCgwKSwgJ05PX1JFU0VSVkVTJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyByZXNlcnZlQSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2EnIH0pCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2EiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI1NAogICAgLy8gYXNzZXJ0KHRoaXMucmVzZXJ2ZUEudmFsdWUgPiBVaW50NjQoMCksICdOT19SRVNFUlZFUycpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTk9fUkVTRVJWRVMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjU1CiAgICAvLyBjb25zdCBzY2FsZWQ6IHVpbnQ2NCA9IHRoaXMucmVzZXJ2ZUIudmFsdWUgKiBVaW50NjQoMV8wMDBfMDAwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIHJlc2VydmVCID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYicgfSkKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjU1CiAgICAvLyBjb25zdCBzY2FsZWQ6IHVpbnQ2NCA9IHRoaXMucmVzZXJ2ZUIudmFsdWUgKiBVaW50NjQoMV8wMDBfMDAwKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hpbnQgMTAwMDAwMCAvLyAxMDAwMDAwCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI1NgogICAgLy8gY29uc3QgcHJpY2U6IHVpbnQ2NCA9IHNjYWxlZCAvIHRoaXMucmVzZXJ2ZUEudmFsdWUKICAgIHN3YXAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6OkFtbURleC5nZXRSZXNlcnZlQVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFJlc2VydmVBOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNjIKICAgIC8vIHJldHVybiB0aGlzLnJlc2VydmVBLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMQogICAgLy8gcmVzZXJ2ZUEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9hJyB9KQogICAgYnl0ZWNfMCAvLyAicmVzZXJ2ZV9hIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNjIKICAgIC8vIHJldHVybiB0aGlzLnJlc2VydmVBLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo6QW1tRGV4LmdldFJlc2VydmVCW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0UmVzZXJ2ZUI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI2NwogICAgLy8gcmV0dXJuIHRoaXMucmVzZXJ2ZUIudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyByZXNlcnZlQiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2InIH0pCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI2NwogICAgLy8gcmV0dXJuIHRoaXMucmVzZXJ2ZUIudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjpBbW1EZXguZ2V0VG90YWxMcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFRvdGFsTHA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gcmV0dXJuIHRoaXMudG90YWxMcC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIHRvdGFsTHAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndG90YWxfbHAnIH0pCiAgICBieXRlY18zIC8vICJ0b3RhbF9scCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyByZXR1cm4gdGhpcy50b3RhbExwLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo6QW1tRGV4LmdldEZlZUJwc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEZlZUJwczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6Mjc3CiAgICAvLyByZXR1cm4gdGhpcy5mZWVCcHMudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMwCiAgICAvLyBmZWVCcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZmVlX2JwcycgfSkKICAgIGJ5dGVjIDYgLy8gImZlZV9icHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI3NwogICAgLy8gcmV0dXJuIHRoaXMuZmVlQnBzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo6QW1tRGV4LnN3YXBbcm91dGluZ10oKSAtPiB2b2lkOgpzd2FwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6Mjg2CiAgICAvLyBhc3NlcnQoYW1vdW50SW4gPiBVaW50NjQoMCksICdaRVJPX0lOUFVUJykKICAgIGFzc2VydCAvLyBaRVJPX0lOUFVUCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI4OC0yOTAKICAgIC8vIGRpcmVjdGlvbiA9PT0gVWludDY0KDApCiAgICAvLyAgID8gdGhpcy5fY29tcHV0ZU91dHB1dChhbW91bnRJbiwgdGhpcy5yZXNlcnZlQS52YWx1ZSwgdGhpcy5yZXNlcnZlQi52YWx1ZSkKICAgIC8vICAgOiB0aGlzLl9jb21wdXRlT3V0cHV0KGFtb3VudEluLCB0aGlzLnJlc2VydmVCLnZhbHVlLCB0aGlzLnJlc2VydmVBLnZhbHVlKQogICAgYm56IHN3YXBfdGVybmFyeV9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gPyB0aGlzLl9jb21wdXRlT3V0cHV0KGFtb3VudEluLCB0aGlzLnJlc2VydmVBLnZhbHVlLCB0aGlzLnJlc2VydmVCLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIHJlc2VydmVBID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYScgfSkKICAgIGJ5dGVjXzAgLy8gInJlc2VydmVfYSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6Mjg5CiAgICAvLyA/IHRoaXMuX2NvbXB1dGVPdXRwdXQoYW1vdW50SW4sIHRoaXMucmVzZXJ2ZUEudmFsdWUsIHRoaXMucmVzZXJ2ZUIudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIHJlc2VydmVCID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Jlc2VydmVfYicgfSkKICAgIGJ5dGVjXzEgLy8gInJlc2VydmVfYiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6Mjg5CiAgICAvLyA/IHRoaXMuX2NvbXB1dGVPdXRwdXQoYW1vdW50SW4sIHRoaXMucmVzZXJ2ZUEudmFsdWUsIHRoaXMucmVzZXJ2ZUIudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgY2FsbHN1YiBfY29tcHV0ZU91dHB1dAoKc3dhcF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI5MQogICAgLy8gYXNzZXJ0KGFtb3VudE91dCA+PSBtaW5BbW91bnRPdXQsICdTTElQUEFHRV9FWENFRURFRCcpCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIFNMSVBQQUdFX0VYQ0VFREVECiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnN3YXBfdGVybmFyeV9mYWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyOTAKICAgIC8vIDogdGhpcy5fY29tcHV0ZU91dHB1dChhbW91bnRJbiwgdGhpcy5yZXNlcnZlQi52YWx1ZSwgdGhpcy5yZXNlcnZlQS52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyByZXNlcnZlQiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2InIH0pCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI5MAogICAgLy8gOiB0aGlzLl9jb21wdXRlT3V0cHV0KGFtb3VudEluLCB0aGlzLnJlc2VydmVCLnZhbHVlLCB0aGlzLnJlc2VydmVBLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyByZXNlcnZlQSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2EnIH0pCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2EiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI5MAogICAgLy8gOiB0aGlzLl9jb21wdXRlT3V0cHV0KGFtb3VudEluLCB0aGlzLnJlc2VydmVCLnZhbHVlLCB0aGlzLnJlc2VydmVBLnZhbHVlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGNhbGxzdWIgX2NvbXB1dGVPdXRwdXQKICAgIGIgc3dhcF90ZXJuYXJ5X21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjpBbW1EZXguYWRkTGlxdWlkaXR5UHJldmlld1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFkZExpcXVpZGl0eVByZXZpZXc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzQwCiAgICAvLyBpZiAodGhpcy50b3RhbExwLnZhbHVlID09PSBVaW50NjQoMCkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyB0b3RhbExwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3RvdGFsX2xwJyB9KQogICAgYnl0ZWNfMyAvLyAidG90YWxfbHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjM0MAogICAgLy8gaWYgKHRoaXMudG90YWxMcC52YWx1ZSA9PT0gVWludDY0KDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYm56IGFkZExpcXVpZGl0eVByZXZpZXdfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjM0MQogICAgLy8gY29uc3QgcHJvZHVjdDogdWludDY0ID0gYW1vdW50QSAqIGFtb3VudEIKICAgIGRpZyAxCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjM0MgogICAgLy8gY29uc3Qgc3FydFByb2R1Y3Q6IHVpbnQ2NCA9IG9wLnNxcnQocHJvZHVjdCkKICAgIHNxcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhc3NlcnQoc3FydFByb2R1Y3QgPiBNSU5fTElRVUlESVRZLCAnSU5JVElBTF9MSVFVSURJVFlfVE9PX0xPVycpCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwCiAgICA+CiAgICBhc3NlcnQgLy8gSU5JVElBTF9MSVFVSURJVFlfVE9PX0xPVwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozNDQKICAgIC8vIHJldHVybiBzcXJ0UHJvZHVjdCAtIE1JTl9MSVFVSURJVFkKICAgIGludGMgNCAvLyAxMDAwCiAgICAtCgphZGRMaXF1aWRpdHlQcmV2aWV3X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czo6QW1tRGV4Ll9wcmV2aWV3TWludEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyOTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphZGRMaXF1aWRpdHlQcmV2aWV3X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBjb25zdCBscEZyb21BOiB1aW50NjQgPSAoYW1vdW50QSAqIHRoaXMudG90YWxMcC52YWx1ZSkgLyB0aGlzLnJlc2VydmVBLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMwogICAgLy8gdG90YWxMcCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0b3RhbF9scCcgfSkKICAgIGJ5dGVjXzMgLy8gInRvdGFsX2xwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozNDYKICAgIC8vIGNvbnN0IGxwRnJvbUE6IHVpbnQ2NCA9IChhbW91bnRBICogdGhpcy50b3RhbExwLnZhbHVlKSAvIHRoaXMucmVzZXJ2ZUEudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgZGlnIDEKICAgICoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyByZXNlcnZlQSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2EnIH0pCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2EiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gY29uc3QgbHBGcm9tQTogdWludDY0ID0gKGFtb3VudEEgKiB0aGlzLnRvdGFsTHAudmFsdWUpIC8gdGhpcy5yZXNlcnZlQS52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBjb25zdCBscEZyb21COiB1aW50NjQgPSAoYW1vdW50QiAqIHRoaXMudG90YWxMcC52YWx1ZSkgLyB0aGlzLnJlc2VydmVCLnZhbHVlCiAgICBjb3ZlciAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmVzZXJ2ZUIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9iJyB9KQogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9iIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIGNvbnN0IGxwRnJvbUI6IHVpbnQ2NCA9IChhbW91bnRCICogdGhpcy50b3RhbExwLnZhbHVlKSAvIHRoaXMucmVzZXJ2ZUIudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gcmV0dXJuIGxwRnJvbUEgPCBscEZyb21CID8gbHBGcm9tQSA6IGxwRnJvbUIKICAgIGR1cDIKICAgIDwKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyOTgKICAgIC8vIHJldHVybiB0aGlzLl9wcmV2aWV3TWludChhbW91bnRBbGdvLCBhbW91bnRBc3NldCkKICAgIGIgYWRkTGlxdWlkaXR5UHJldmlld19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6OkFtbURleC5fcHJldmlld01pbnRANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6OkFtbURleC5yZW1vdmVMaXF1aWRpdHlQcmV2aWV3W3JvdXRpbmddKCkgLT4gdm9pZDoKcmVtb3ZlTGlxdWlkaXR5UHJldmlldzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMDQKICAgIC8vIGFzc2VydChscEFtb3VudCA+IFVpbnQ2NCgwKSwgJ1pFUk9fTFBfQlVSTicpCiAgICBkdXAKICAgIGFzc2VydCAvLyBaRVJPX0xQX0JVUk4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzA1CiAgICAvLyBhc3NlcnQodGhpcy50b3RhbExwLnZhbHVlID4gVWludDY0KDApLCAnTk9fTFBfU1VQUExZJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyB0b3RhbExwID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3RvdGFsX2xwJyB9KQogICAgYnl0ZWNfMyAvLyAidG90YWxfbHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMwNQogICAgLy8gYXNzZXJ0KHRoaXMudG90YWxMcC52YWx1ZSA+IFVpbnQ2NCgwKSwgJ05PX0xQX1NVUFBMWScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gTk9fTFBfU1VQUExZCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMwNgogICAgLy8gY29uc3QgYW1vdW50QWxnbzogdWludDY0ID0gKGxwQW1vdW50ICogdGhpcy5yZXNlcnZlQS52YWx1ZSkgLyB0aGlzLnRvdGFsTHAudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyByZXNlcnZlQSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2EnIH0pCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2EiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMwNgogICAgLy8gY29uc3QgYW1vdW50QWxnbzogdWludDY0ID0gKGxwQW1vdW50ICogdGhpcy5yZXNlcnZlQS52YWx1ZSkgLyB0aGlzLnRvdGFsTHAudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgKgogICAgZGlnIDEKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzA3CiAgICAvLyBjb25zdCBhbW91bnRBc3NldDogdWludDY0ID0gKGxwQW1vdW50ICogdGhpcy5yZXNlcnZlQi52YWx1ZSkgLyB0aGlzLnRvdGFsTHAudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMyCiAgICAvLyByZXNlcnZlQiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdyZXNlcnZlX2InIH0pCiAgICBieXRlY18xIC8vICJyZXNlcnZlX2IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gY29uc3QgYW1vdW50QXNzZXQ6IHVpbnQ2NCA9IChscEFtb3VudCAqIHRoaXMucmVzZXJ2ZUIudmFsdWUpIC8gdGhpcy50b3RhbExwLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdW5jb3ZlciAzCiAgICAqCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzA4CiAgICAvLyByZXR1cm4gW2Ftb3VudEFsZ28sIGFtb3VudEFzc2V0XQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjpBbW1EZXguZ2V0UmVzZXJ2ZXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRSZXNlcnZlczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzE0CiAgICAvLyByZXR1cm4gW3RoaXMucmVzZXJ2ZUEudmFsdWUsIHRoaXMucmVzZXJ2ZUIudmFsdWVdCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMQogICAgLy8gcmVzZXJ2ZUEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9hJyB9KQogICAgYnl0ZWNfMCAvLyAicmVzZXJ2ZV9hIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIHJldHVybiBbdGhpcy5yZXNlcnZlQS52YWx1ZSwgdGhpcy5yZXNlcnZlQi52YWx1ZV0KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmVzZXJ2ZUIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncmVzZXJ2ZV9iJyB9KQogICAgYnl0ZWNfMSAvLyAicmVzZXJ2ZV9iIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIHJldHVybiBbdGhpcy5yZXNlcnZlQS52YWx1ZSwgdGhpcy5yZXNlcnZlQi52YWx1ZV0KICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6OkFtbURleC5zZXRGZWVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRGZWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nb3Zlcm5vci52YWx1ZSwgJ05PVF9HT1ZFUk5PUicpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czoyOQogICAgLy8gZ292ZXJub3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2dvdmVybm9yJyB9KQogICAgYnl0ZWMgNyAvLyAiZ292ZXJub3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMyMAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ292ZXJub3IudmFsdWUsICdOT1RfR09WRVJOT1InKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTk9UX0dPVkVSTk9SCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gYXNzZXJ0KG5ld0ZlZUJwcyA8IFNDQUxFLCAnRkVFX1RPT19ISUdIJykKICAgIGR1cAogICAgaW50YyA1IC8vIDEwMDAwCiAgICA8CiAgICBhc3NlcnQgLy8gRkVFX1RPT19ISUdICiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMwCiAgICAvLyBmZWVCcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZmVlX2JwcycgfSkKICAgIGJ5dGVjIDYgLy8gImZlZV9icHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMyMgogICAgLy8gdGhpcy5mZWVCcHMudmFsdWUgPSBuZXdGZWVCcHMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjpBbW1EZXguX2NvbXB1dGVPdXRwdXQoYW1vdW50SW46IHVpbnQ2NCwgcmVzZXJ2ZUluOiB1aW50NjQsIHJlc2VydmVPdXQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfY29tcHV0ZU91dHB1dDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBwcml2YXRlIF9jb21wdXRlT3V0cHV0KGFtb3VudEluOiB1aW50NjQsIHJlc2VydmVJbjogdWludDY0LCByZXNlcnZlT3V0OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYW1tX2RleC9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gY29uc3QgZmVlRmFjdG9yOiB1aW50NjQgPSBTQ0FMRSAtIHRoaXMuZmVlQnBzLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMAogICAgLy8gZmVlQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2ZlZV9icHMnIH0pCiAgICBieXRlYyA2IC8vICJmZWVfYnBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMzAKICAgIC8vIGNvbnN0IGZlZUZhY3RvcjogdWludDY0ID0gU0NBTEUgLSB0aGlzLmZlZUJwcy52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGMgNSAvLyAxMDAwMAogICAgc3dhcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMzEKICAgIC8vIGNvbnN0IGFtb3VudEluV2l0aEZlZTogdWludDY0ID0gYW1vdW50SW4gKiBmZWVGYWN0b3IKICAgIGZyYW1lX2RpZyAtMwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIGNvbnN0IG51bWVyYXRvcjogdWludDY0ID0gYW1vdW50SW5XaXRoRmVlICogcmVzZXJ2ZU91dAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzMzCiAgICAvLyBjb25zdCBkZW5vbWluYXRvckJhc2U6IHVpbnQ2NCA9IHJlc2VydmVJbiAqIFNDQUxFCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGMgNSAvLyAxMDAwMAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIGNvbnN0IGRlbm9taW5hdG9yOiB1aW50NjQgPSBkZW5vbWluYXRvckJhc2UgKyBhbW91bnRJbldpdGhGZWUKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FtbV9kZXgvY29udHJhY3QuYWxnby50czozMzUKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3IKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbW1fZGV4L2NvbnRyYWN0LmFsZ28udHM6MzM2CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAGAAEIBOgHkE4mCAlyZXNlcnZlX2EJcmVzZXJ2ZV9iBBUffHUIdG90YWxfbHAIbHBfdG9rZW4HYXNzZXRfYgdmZWVfYnBzCGdvdmVybm9yMRtBAHgxGRREMRhEgg8EJebDdgRDwuYwBJBq+8ME9L8OiwStBndeBF0pcqUEzCri1gTPhWl+BM8EQoUEEVFBCQTqCvmNBEChrCcE8kyPIwT7ikpMBNmtz+g2GgCODwALAK4BXwH9Am8C5QL9AwgDEwMeAyoDcwO+A+4EAQAxGRQxGBQQRCNDMRYjCUk4ECMSRDYaAUkVJBJEFzYaAkkVJBJEFyInBGVFARRESSEFDERLAjgHMgoSRE8COAiB4KcSD0QnBUsCZycGTGcnBzEAZygiZykiZysiZ7EyCkmyKrIpgARTRExQsiWACVNMWURFWC1MULImgQayI4GAyK+gJbIigQOyECKyAbO0PCcESwFnsTIKIrISshRMshElshAisgGzFipMULAjQzEWgQIJSTgQIxJEMRYjCUk4ECUSRCInBGVFAURLATgHMgoSREk4FDIKEkRJOBEiJwVlRBJETDgITDgSIitlREAAR0oLkkkhBA1EIQQJSSEECCtMZ0lEIihlREsDCCIpZURLAwgoTwJnKUxnsSInBGVEMQBLArISshSyESWyECKyAbMWKkxQsCNDIitlREsCSwELIihlRApLAksCCyIpZUQKSgxMTgJNSU4CCCtMZ0L/ozEWIwlJOBAlEkQiJwRlREsBOBESREk4FDIKEkQ4EklEIitlREoMRCIoZURLAksBC0sCCiIpZURLBEsBC0sECksCRElETwNLAwlPAksCCU8ESwUJKE8DZylPAmcrTGexIicEZUQyA08EshKyFLIRJbIQIrIBs7ExAE8CsgiyByOyECKyAbOxIicFZUQxAE8CshKyFLIRJbIQIrIBsyNDMRYjCUk4ECMSRDYaAUkVJBJEFyInBGVFAURLATgHMgoSREw4CElEIihlRCIpZURLAk4CiAHrSU8DD0QiKWVESgxEIihlRE8DCExLAgkoTwJnKUxnsSInBWVEMQBLArISshSyESWyECKyAbMWKkxQsCNDMRYjCUk4ECUSRDYaAUkVJBJEFyInBGVFAURLATgUMgoSREsBOBEiJwVlRBJETDgSSUQiKWVEIihlREsCTgKIAW5JTwMPRCIoZURKDEQiKWVETwMITEsCCSlPAmcoTGexMQBLAbIIsgcjshAisgGzFipMULAjQyIoZURJRCIpZUSBwIQ9C0wKFipMULAjQyIoZUQWKkxQsCNDIillRBYqTFCwI0MiK2VEFipMULAjQyInBmVEFipMULAjQzYaAUkVJBJEFzYaAkkVJBJEF0lOAjYaA0kVJBJEF04DREAAFyIoZUQiKWVEiADFSUsCD0QWKkxQsCNDIillRCIoZUSIAK5C/+Y2GgFJFSQSRBc2GgJJFSQSRBciK2VEQAATSwELkkkhBA1EIQQJFipMULAjQyIrZURLAksBCyIoZUQKTgILIillRApKDExOAk1C/9o2GgFJFSQSRBdJRCIrZURJRCIoZURLAgtLAQoiKWVETwMLTwIKTBZMFlAqTFCwI0MiKGVEIillREwWTBZQKkxQsCNDNhoBSRUkEkQXMQAiJwdlRBJESSEFDEQnBkxnI0OKAwEiJwZlRCEFTAmL/QtJi/8Li/4hBQtPAggKiQ==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }