{ "name": "RareFiAlphaCompoundingVault", "structs": {}, "methods": [ { "name": "createVault", "args": [ { "type": "uint64", "name": "alphaAssetId" }, { "type": "uint64", "name": "usdcAssetId" }, { "type": "uint64", "name": "creatorFeeRate" }, { "type": "uint64", "name": "minSwapThreshold" }, { "type": "uint64", "name": "maxSlippageBps" }, { "type": "uint64", "name": "tinymanPoolAppId" }, { "type": "address", "name": "tinymanPoolAddress" }, { "type": "address", "name": "rarefiAddress" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Create and initialize the vault\r\nCalled once at deployment", "events": [], "recommendations": {} }, { "name": "optInAssets", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Opt the contract into required assets\r\nMust be called by creator after deployment with:\r\n- 5.4 ALGO payment (stays in contract for MBR and operational fees)", "events": [], "recommendations": {} }, { "name": "optIn", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "OptIn" ] }, "readonly": false, "desc": "User opts into the contract to enable local storage", "events": [], "recommendations": {} }, { "name": "closeOut", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "CloseOut" ] }, "readonly": false, "desc": "User closes out - withdraws all Alpha (deposit + yield)", "events": [], "recommendations": {} }, { "name": "deposit", "args": [ { "type": "uint64", "name": "slippageBps", "desc": "- Slippage tolerance for auto-compound (ignored if no compound needed)" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "User deposits Alpha into the vault\r\nReceives shares proportional to their deposit\r\n\r\nIf USDC balance >= threshold and has existing depositors, automatically\r\ncompounds yield BEFORE processing deposit. This ensures yield goes to\r\nexisting depositors, not the new one.", "events": [], "recommendations": {} }, { "name": "withdraw", "args": [ { "type": "uint64", "name": "shareAmount", "desc": "- Shares to redeem (0 = withdraw all)" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "User withdraws Alpha from the vault\r\nReceives proportional share of vault's Alpha (original deposit + compounded yield)", "events": [], "recommendations": {} }, { "name": "claimCreator", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Creator claims their accumulated Alpha from fees", "events": [], "recommendations": {} }, { "name": "compoundYield", "args": [ { "type": "uint64", "name": "slippageBps", "desc": "- Slippage tolerance in basis points (e.g., 50 = 0.5%, 100 = 1%)" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Swaps accumulated USDC to Alpha and compounds into vault\r\nThe Alpha is added to totalAlpha, increasing the value of all shares\r\nPermissionless - anyone can trigger, slippage capped by maxSlippageBps", "events": [], "recommendations": {} }, { "name": "getVaultStats", "args": [], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64)", "desc": "[totalShares, totalAlpha, creatorUnclaimedAlpha, usdcBalance, totalYieldCompounded, sharePrice]\r\nNote: sharePrice is scaled by SCALE (1e12) for precision" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get vault statistics", "events": [], "recommendations": {} }, { "name": "getUserAlphaBalance", "args": [ { "type": "address", "name": "user" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get user's current Alpha balance (shares converted to Alpha)\r\nThis includes their original deposit + all compounded yield", "events": [], "recommendations": {} }, { "name": "getUserShares", "args": [ { "type": "address", "name": "user" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get user's share balance", "events": [], "recommendations": {} }, { "name": "previewDeposit", "args": [ { "type": "uint64", "name": "alphaAmount" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Preview how many shares a deposit would receive", "events": [], "recommendations": {} }, { "name": "previewWithdraw", "args": [ { "type": "uint64", "name": "shareAmount" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Preview how much Alpha a share redemption would receive", "events": [], "recommendations": {} }, { "name": "getCompoundQuote", "args": [], "returns": { "type": "(uint64,uint64,uint64)", "desc": "[usdcBalance, expectedAlphaOutput, minOutputAt50bps]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Preview compound - shows expected Alpha for current USDC balance", "events": [], "recommendations": {} }, { "name": "updateMinSwapThreshold", "args": [ { "type": "uint64", "name": "newThreshold" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update the minimum swap threshold", "events": [], "recommendations": {} }, { "name": "updateMaxSlippage", "args": [ { "type": "uint64", "name": "newMaxSlippageBps" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update the maximum slippage tolerance for swaps\r\nOnly callable by creator", "events": [], "recommendations": {} }, { "name": "updateCreatorAddress", "args": [ { "type": "address", "name": "newCreatorAddress" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update the creator address (key rotation)\r\nOnly callable by current creator", "events": [], "recommendations": {} }, { "name": "updateRarefiAddress", "args": [ { "type": "address", "name": "newRarefiAddress" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update the RareFi platform address\r\nOnly callable by current RareFi address", "events": [], "recommendations": {} }, { "name": "updateCreatorFeeRate", "args": [ { "type": "uint64", "name": "newFeeRate" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update the creator fee rate\r\nOnly callable by creator, constrained to 0-6% range", "events": [], "recommendations": {} }, { "name": "contributeFarm", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Anyone can contribute to the farm by sending Alpha\r\nFarm bonus is distributed proportionally during yield compounds\r\nThis allows projects/sponsors to boost yield for depositors\r\n\r\nExpects an asset transfer of alphaAsset before this call", "events": [], "recommendations": {} }, { "name": "setEmissionRatio", "args": [ { "type": "uint64", "name": "newRatio", "desc": "- The emission ratio multiplier (e.g., 4000000 for aggressive distribution)" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set the emission ratio (multiplier for dynamic farm rate calculation)\r\nOnly callable by creator or RareFi\r\nDynamic rate = farmBalance * emissionRatio / totalAlpha", "events": [], "recommendations": {} }, { "name": "getFarmStats", "args": [], "returns": { "type": "(uint64,uint64,uint64)", "desc": "[farmBalance, emissionRatio, currentDynamicRate]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get farm statistics including dynamic emission rate", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 13, "bytes": 3 }, "local": { "ints": 1, "bytes": 0 } }, "keys": { "global": { "alphaAsset": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWxwaGFBc3NldA==" }, "usdcAsset": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dXNkY0Fzc2V0" }, "creatorAddress": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvckFkZHJlc3M=" }, "rarefiAddress": { "keyType": "AVMString", "valueType": "address", "key": "cmFyZWZpQWRkcmVzcw==" }, "creatorFeeRate": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y3JlYXRvckZlZVJhdGU=" }, "creatorUnclaimedAlpha": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y3JlYXRvclVuY2xhaW1lZEFscGhh" }, "totalShares": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxTaGFyZXM=" }, "totalAlpha": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxBbHBoYQ==" }, "minSwapThreshold": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bWluU3dhcFRocmVzaG9sZA==" }, "maxSlippageBps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bWF4U2xpcHBhZ2VCcHM=" }, "totalYieldCompounded": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxZaWVsZENvbXBvdW5kZWQ=" }, "tinymanPoolAppId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dGlueW1hblBvb2xBcHBJZA==" }, "tinymanPoolAddress": { "keyType": "AVMString", "valueType": "address", "key": "dGlueW1hblBvb2xBZGRyZXNz" }, "farmBalance": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZmFybUJhbGFuY2U=" }, "emissionRatio": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZW1pc3Npb25SYXRpbw==" }, "assetsOptedIn": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXNzZXRzT3B0ZWRJbg==" } }, "local": { "userShares": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dXNlclNoYXJlcw==" } }, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [ "DeleteApplication", "UpdateApplication" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1114 ], "errorMessage": "Alpha amount is zero" }, { "pc": [ 632 ], "errorMessage": "Alpha and USDC must be different" }, { "pc": [ 971, 1739 ], "errorMessage": "App call must follow asset transfer" }, { "pc": [ 731 ], "errorMessage": "App call must follow payment" }, { "pc": [ 725 ], "errorMessage": "Assets already opted in" }, { "pc": [ 1268 ], "errorMessage": "Below minimum swap threshold" }, { "pc": [ 2043 ], "errorMessage": "Cannot read pool asset_1_id" }, { "pc": [ 2070 ], "errorMessage": "Cannot read pool asset_1_reserves" }, { "pc": [ 2097 ], "errorMessage": "Cannot read pool asset_2_reserves" }, { "pc": [ 2122 ], "errorMessage": "Cannot read pool total_fee_share" }, { "pc": [ 1653, 1687 ], "errorMessage": "Cannot set zero address" }, { "pc": [ 507 ], "errorMessage": "Contract deletion disabled" }, { "pc": [ 511 ], "errorMessage": "Contract updates disabled" }, { "pc": [ 1789 ], "errorMessage": "Contribution must be positive" }, { "pc": [ 595 ], "errorMessage": "Creator fee rate exceeds maximum (6%)" }, { "pc": [ 1026 ], "errorMessage": "Deposit too small" }, { "pc": [ 1833 ], "errorMessage": "Emission ratio must be positive" }, { "pc": [ 2193 ], "errorMessage": "Expected output is zero" }, { "pc": [ 1721 ], "errorMessage": "Fee rate exceeds maximum (6%)" }, { "pc": [ 756 ], "errorMessage": "Insufficient ALGO (need 5.4 ALGO)" }, { "pc": [ 1108 ], "errorMessage": "Insufficient shares" }, { "pc": [ 623 ], "errorMessage": "Invalid Alpha asset" }, { "pc": [ 635 ], "errorMessage": "Invalid Tinyman pool app ID" }, { "pc": [ 626 ], "errorMessage": "Invalid USDC asset" }, { "pc": [ 620, 1619 ], "errorMessage": "Max slippage too high" }, { "pc": [ 614, 1614 ], "errorMessage": "Max slippage too low (min 5%)" }, { "pc": [ 1319, 1524, 1928, 1975, 2010, 2152, 2169, 2209, 2343, 2387 ], "errorMessage": "Multiplication overflow in mulDivFloor" }, { "pc": [ 996, 1764 ], "errorMessage": "Must send to contract" }, { "pc": [ 989, 1757 ], "errorMessage": "Must transfer Alpha asset" }, { "pc": [ 1273 ], "errorMessage": "No depositors to compound for" }, { "pc": [ 1196 ], "errorMessage": "Nothing to claim" }, { "pc": [ 1100 ], "errorMessage": "Nothing to withdraw" }, { "pc": [ 477 ], "errorMessage": "OnCompletion must be CloseOut && can only call when not creating" }, { "pc": [ 308 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 488 ], "errorMessage": "OnCompletion must be OptIn && can only call when not creating" }, { "pc": [ 1682 ], "errorMessage": "Only RareFi can update" }, { "pc": [ 1189 ], "errorMessage": "Only creator can claim" }, { "pc": [ 718 ], "errorMessage": "Only creator can opt-in assets" }, { "pc": [ 1648 ], "errorMessage": "Only creator can update" }, { "pc": [ 1716 ], "errorMessage": "Only creator can update fee rate" }, { "pc": [ 1608 ], "errorMessage": "Only creator can update max slippage" }, { "pc": [ 1831 ], "errorMessage": "Only creator or RareFi can set emission ratio" }, { "pc": [ 1569 ], "errorMessage": "Only creator or RareFi can update" }, { "pc": [ 763 ], "errorMessage": "Payment must be from caller" }, { "pc": [ 746 ], "errorMessage": "Payment must be to app" }, { "pc": [ 1032 ], "errorMessage": "Shares to mint is zero" }, { "pc": [ 930, 1249 ], "errorMessage": "Slippage exceeds maximum allowed" }, { "pc": [ 2308 ], "errorMessage": "Swap output below minimum" }, { "pc": [ 607 ], "errorMessage": "Swap threshold too high (max 50 USDC)" }, { "pc": [ 601 ], "errorMessage": "Swap threshold too low" }, { "pc": [ 1579 ], "errorMessage": "Threshold too high (max 50 USDC)" }, { "pc": [ 1574 ], "errorMessage": "Threshold too low" }, { "pc": [ 1003, 1771 ], "errorMessage": "Transfer must be from caller" }, { "pc": [ 945, 1259, 1289, 1469, 2218, 2301 ], "errorMessage": "account opted into asset" }, { "pc": [ 1017, 1785 ], "errorMessage": "assetCloseTo must be zero" }, { "pc": [ 506, 510 ], "errorMessage": "can only call when not creating" }, { "pc": [ 716, 723, 782, 803, 866, 876, 890, 928, 938, 950, 958, 987, 1053, 1061, 1130, 1140, 1154, 1187, 1194, 1208, 1245, 1256, 1264, 1272, 1286, 1295, 1302, 1306, 1325, 1329, 1334, 1339, 1462, 1558, 1566, 1606, 1646, 1680, 1714, 1755, 1793, 1820, 1828, 1845, 1852, 1864, 1869, 1896, 1903, 1913, 1918, 1947, 1957, 1961, 1983, 1992, 1996, 2021, 2026, 2127, 2214, 2224, 2229, 2250, 2314, 2321, 2347, 2359, 2375, 2394, 2405, 2414, 2424 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 854, 1039, 1093, 1382, 1407 ], "errorMessage": "check LocalState exists" }, { "pc": [ 776 ], "errorMessage": "closeRemainderTo must be zero" }, { "pc": [ 574, 583, 1377, 1402, 1634, 1667 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 519, 528, 537, 546, 555, 564, 915, 1075, 1233, 1423, 1443, 1545, 1593, 1701, 1807 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 589, 710, 770, 829, 843, 923, 1010, 1083, 1181, 1240, 1552, 1600, 1640, 1673, 1708, 1733, 1778, 1814 ], "errorMessage": "rekeyTo must be zero" }, { "pc": [ 979, 1747 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 739 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMCAxMDAwMDAgNTAwMDAwMDAgMTAwMDAwMDAwMDAwMAogICAgYnl0ZWNibG9jayAidG90YWxTaGFyZXMiICJ0b3RhbEFscGhhIiAiZmFybUJhbGFuY2UiICJjcmVhdG9yQWRkcmVzcyIgImFscGhhQXNzZXQiICJ1c2RjQXNzZXQiICJ1c2VyU2hhcmVzIiAweDE1MWY3Yzc1ICJjcmVhdG9yVW5jbGFpbWVkQWxwaGEiICJlbWlzc2lvblJhdGlvIiAicmFyZWZpQWRkcmVzcyIgIm1pblN3YXBUaHJlc2hvbGQiICJtYXhTbGlwcGFnZUJwcyIgInRvdGFsWWllbGRDb21wb3VuZGVkIiAiY3JlYXRvckZlZVJhdGUiICJ0aW55bWFuUG9vbEFwcElkIiAidGlueW1hblBvb2xBZGRyZXNzIiAiYXNzZXRzT3B0ZWRJbiIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM3CiAgICAvLyBleHBvcnQgY2xhc3MgUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMzEKICAgIHB1c2hieXRlc3MgMHgyOTMxNGQ5NSAweDZhNjkxZmUyIC8vIG1ldGhvZCAib3B0SW4oKXZvaWQiLCBtZXRob2QgImNsb3NlT3V0KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9vcHRJbl9yb3V0ZUAzIG1haW5fY2xvc2VPdXRfcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNwogICAgLy8gZXhwb3J0IGNsYXNzIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDI3CiAgICBwdXNoYnl0ZXNzIDB4NDE0ZTQxYjUgMHg2ZTJlYmM5YiAweDIxZjFkZGZmIDB4YmM5OTQ0OWUgMHhjOGIzYzBmMCAweDAwMzU5N2EyIDB4YzdkNGRiZjMgMHgzZTJmN2NiNyAweDNmZDc5ODU2IDB4OTczNjU0YmYgMHgwYzc5M2IxOCAweGFiNmVmNzNiIDB4YWFlMmNhZDIgMHgxZjY1ZDY0ZSAweDE0ZmE5NDczIDB4YmM1ZTM4YzYgMHhhZmViZmNhYyAweGQwNTRjMTlmIDB4MTcwZTcyOTIgLy8gbWV0aG9kICJvcHRJbkFzc2V0cygpdm9pZCIsIG1ldGhvZCAiZGVwb3NpdCh1aW50NjQpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXcodWludDY0KXZvaWQiLCBtZXRob2QgImNsYWltQ3JlYXRvcigpdm9pZCIsIG1ldGhvZCAiY29tcG91bmRZaWVsZCh1aW50NjQpdm9pZCIsIG1ldGhvZCAiZ2V0VmF1bHRTdGF0cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0VXNlckFscGhhQmFsYW5jZShhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0VXNlclNoYXJlcyhhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAicHJldmlld0RlcG9zaXQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAicHJldmlld1dpdGhkcmF3KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldENvbXBvdW5kUXVvdGUoKSh1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInVwZGF0ZU1pblN3YXBUaHJlc2hvbGQodWludDY0KXZvaWQiLCBtZXRob2QgInVwZGF0ZU1heFNsaXBwYWdlKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ1cGRhdGVDcmVhdG9yQWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInVwZGF0ZVJhcmVmaUFkZHJlc3MoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJ1cGRhdGVDcmVhdG9yRmVlUmF0ZSh1aW50NjQpdm9pZCIsIG1ldGhvZCAiY29udHJpYnV0ZUZhcm0oKXZvaWQiLCBtZXRob2QgInNldEVtaXNzaW9uUmF0aW8odWludDY0KXZvaWQiLCBtZXRob2QgImdldEZhcm1TdGF0cygpKHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG9wdEluQXNzZXRzIGRlcG9zaXQgd2l0aGRyYXcgY2xhaW1DcmVhdG9yIGNvbXBvdW5kWWllbGQgZ2V0VmF1bHRTdGF0cyBnZXRVc2VyQWxwaGFCYWxhbmNlIGdldFVzZXJTaGFyZXMgcHJldmlld0RlcG9zaXQgcHJldmlld1dpdGhkcmF3IGdldENvbXBvdW5kUXVvdGUgdXBkYXRlTWluU3dhcFRocmVzaG9sZCB1cGRhdGVNYXhTbGlwcGFnZSB1cGRhdGVDcmVhdG9yQWRkcmVzcyB1cGRhdGVSYXJlZmlBZGRyZXNzIHVwZGF0ZUNyZWF0b3JGZWVSYXRlIGNvbnRyaWJ1dGVGYXJtIHNldEVtaXNzaW9uUmF0aW8gZ2V0RmFybVN0YXRzCiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMjc6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNwogICAgLy8gZXhwb3J0IGNsYXNzIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4NGQwM2NiMjkgLy8gbWV0aG9kICJjcmVhdGVWYXVsdCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3Mpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZVZhdWx0CiAgICBlcnIKCm1haW5fY2xvc2VPdXRfcm91dGVANDoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnQ2xvc2VPdXQnIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBDbG9zZU91dCAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIGNsb3NlT3V0CgptYWluX29wdEluX3JvdXRlQDM6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ09wdEluJyB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgT3B0SW4gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYiBvcHRJbgoKbWFpbl9iYXJlX3JvdXRpbmdAMzE6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNwogICAgLy8gZXhwb3J0IGNsYXNzIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18zIC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIG1haW5fdXBkYXRlQXBwbGljYXRpb25AMzIgbWFpbl9kZWxldGVBcHBsaWNhdGlvbkAzMwogICAgZXJyCgptYWluX2RlbGV0ZUFwcGxpY2F0aW9uQDMzOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzU3CiAgICAvLyBAYmFyZW1ldGhvZCh7IGFsbG93QWN0aW9uczogJ0RlbGV0ZUFwcGxpY2F0aW9uJyB9KQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NTkKICAgIC8vIGFzc2VydChmYWxzZSwgJ0NvbnRyYWN0IGRlbGV0aW9uIGRpc2FibGVkJyk7CiAgICBlcnIgLy8gQ29udHJhY3QgZGVsZXRpb24gZGlzYWJsZWQKCm1haW5fdXBkYXRlQXBwbGljYXRpb25AMzI6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NTIKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnVXBkYXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjc1NAogICAgLy8gYXNzZXJ0KGZhbHNlLCAnQ29udHJhY3QgdXBkYXRlcyBkaXNhYmxlZCcpOwogICAgZXJyIC8vIENvbnRyYWN0IHVwZGF0ZXMgZGlzYWJsZWQKCgovLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo6UmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmNyZWF0ZVZhdWx0W3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlVmF1bHQ6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI2MQogICAgLy8gYXNzZXJ0KFR4bi5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdyZWtleVRvIG11c3QgYmUgemVybycpOwogICAgdHhuIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWtleVRvIG11c3QgYmUgemVybwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjY0CiAgICAvLyBhc3NlcnQoY3JlYXRvckZlZVJhdGUgPD0gTUFYX0ZFRV9SQVRFLCAnQ3JlYXRvciBmZWUgcmF0ZSBleGNlZWRzIG1heGltdW0gKDYlKScpOwogICAgZGlnIDUKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA8PQogICAgYXNzZXJ0IC8vIENyZWF0b3IgZmVlIHJhdGUgZXhjZWVkcyBtYXhpbXVtICg2JSkKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI2NQogICAgLy8gYXNzZXJ0KG1pblN3YXBUaHJlc2hvbGQgPj0gTUlOX1NXQVBfQU1PVU5ULCAnU3dhcCB0aHJlc2hvbGQgdG9vIGxvdycpOwogICAgZGlnIDQKICAgIGludGMgNSAvLyAxMDAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gU3dhcCB0aHJlc2hvbGQgdG9vIGxvdwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjY2CiAgICAvLyBhc3NlcnQobWluU3dhcFRocmVzaG9sZCA8PSBNQVhfU1dBUF9USFJFU0hPTEQsICdTd2FwIHRocmVzaG9sZCB0b28gaGlnaCAobWF4IDUwIFVTREMpJyk7CiAgICBkaWcgNAogICAgaW50YyA2IC8vIDUwMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIFN3YXAgdGhyZXNob2xkIHRvbyBoaWdoIChtYXggNTAgVVNEQykKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI2NwogICAgLy8gYXNzZXJ0KG1heFNsaXBwYWdlQnBzID49IE1JTl9NQVhfU0xJUFBBR0VfQlBTLCAnTWF4IHNsaXBwYWdlIHRvbyBsb3cgKG1pbiA1JSknKTsKICAgIGRpZyAzCiAgICBwdXNoaW50IDUwMCAvLyA1MDAKICAgID49CiAgICBhc3NlcnQgLy8gTWF4IHNsaXBwYWdlIHRvbyBsb3cgKG1pbiA1JSkKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI2OAogICAgLy8gYXNzZXJ0KG1heFNsaXBwYWdlQnBzIDw9IE1BWF9TTElQUEFHRV9CUFMsICdNYXggc2xpcHBhZ2UgdG9vIGhpZ2gnKTsKICAgIGRpZyAzCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gTWF4IHNsaXBwYWdlIHRvbyBoaWdoCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyNjkKICAgIC8vIGFzc2VydChhbHBoYUFzc2V0SWQgIT09IFVpbnQ2NCgwKSwgJ0ludmFsaWQgQWxwaGEgYXNzZXQnKTsKICAgIGRpZyA3CiAgICBhc3NlcnQgLy8gSW52YWxpZCBBbHBoYSBhc3NldAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjcwCiAgICAvLyBhc3NlcnQodXNkY0Fzc2V0SWQgIT09IFVpbnQ2NCgwKSwgJ0ludmFsaWQgVVNEQyBhc3NldCcpOwogICAgZGlnIDYKICAgIGFzc2VydCAvLyBJbnZhbGlkIFVTREMgYXNzZXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI3MQogICAgLy8gYXNzZXJ0KGFscGhhQXNzZXRJZCAhPT0gdXNkY0Fzc2V0SWQsICdBbHBoYSBhbmQgVVNEQyBtdXN0IGJlIGRpZmZlcmVudCcpOwogICAgZGlnIDcKICAgIGRpZyA3CiAgICAhPQogICAgYXNzZXJ0IC8vIEFscGhhIGFuZCBVU0RDIG11c3QgYmUgZGlmZmVyZW50CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyNzIKICAgIC8vIGFzc2VydCh0aW55bWFuUG9vbEFwcElkICE9PSBVaW50NjQoMCksICdJbnZhbGlkIFRpbnltYW4gcG9vbCBhcHAgSUQnKTsKICAgIGRpZyAyCiAgICBhc3NlcnQgLy8gSW52YWxpZCBUaW55bWFuIHBvb2wgYXBwIElECiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0MwogICAgLy8gYWxwaGFBc3NldCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgLy8gQWxwaGEgQVNBIElEIChkZXBvc2l0ICYgeWllbGQgYXNzZXQpCiAgICBieXRlYyA0IC8vICJhbHBoYUFzc2V0IgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Mjc1CiAgICAvLyB0aGlzLmFscGhhQXNzZXQudmFsdWUgPSBhbHBoYUFzc2V0SWQ7CiAgICB1bmNvdmVyIDgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NAogICAgLy8gdXNkY0Fzc2V0ID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAgLy8gVVNEQyBBU0EgSUQgKGFpcmRyb3BzIGNvbWUgaW4gYXMgdGhpcykKICAgIGJ5dGVjIDUgLy8gInVzZGNBc3NldCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI3NgogICAgLy8gdGhpcy51c2RjQXNzZXQudmFsdWUgPSB1c2RjQXNzZXRJZDsKICAgIHVuY292ZXIgNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ3CiAgICAvLyBjcmVhdG9yQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCk7ICAgLy8gVmF1bHQgY3JlYXRvciB3aG8gcmVjZWl2ZXMgZmVlCiAgICBieXRlY18zIC8vICJjcmVhdG9yQWRkcmVzcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI3OQogICAgLy8gdGhpcy5jcmVhdG9yQWRkcmVzcy52YWx1ZSA9IFR4bi5zZW5kZXI7CiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDgKICAgIC8vIHJhcmVmaUFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOyAgICAvLyBSYXJlRmkgcGxhdGZvcm0gYWRkcmVzcyAoY2FuIGFsc28gdHJpZ2dlciBzd2FwcykKICAgIGJ5dGVjIDEwIC8vICJyYXJlZmlBZGRyZXNzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjgwCiAgICAvLyB0aGlzLnJhcmVmaUFkZHJlc3MudmFsdWUgPSByYXJlZmlBZGRyZXNzOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ5CiAgICAvLyBjcmVhdG9yRmVlUmF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgLy8gMC0xMDAsIHBlcmNlbnRhZ2Ugb2YgeWllbGQgdG8gY3JlYXRvcgogICAgYnl0ZWMgMTQgLy8gImNyZWF0b3JGZWVSYXRlIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjgxCiAgICAvLyB0aGlzLmNyZWF0b3JGZWVSYXRlLnZhbHVlID0gY3JlYXRvckZlZVJhdGU7CiAgICB1bmNvdmVyIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MAogICAgLy8gY3JlYXRvclVuY2xhaW1lZEFscGhhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAvLyBBY2N1bXVsYXRlZCBBbHBoYSBmb3IgY3JlYXRvciB0byBjbGFpbQogICAgYnl0ZWMgOCAvLyAiY3JlYXRvclVuY2xhaW1lZEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjgyCiAgICAvLyB0aGlzLmNyZWF0b3JVbmNsYWltZWRBbHBoYS52YWx1ZSA9IFVpbnQ2NCgwKTsKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTMKICAgIC8vIHRvdGFsU2hhcmVzID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAvLyBUb3RhbCBzaGFyZXMgaXNzdWVkIHRvIGFsbCBkZXBvc2l0b3JzCiAgICBieXRlY18wIC8vICJ0b3RhbFNoYXJlcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI4NQogICAgLy8gdGhpcy50b3RhbFNoYXJlcy52YWx1ZSA9IFVpbnQ2NCgwKTsKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Mjg2CiAgICAvLyB0aGlzLnRvdGFsQWxwaGEudmFsdWUgPSBVaW50NjQoMCk7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU1CiAgICAvLyBtaW5Td2FwVGhyZXNob2xkID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgLy8gTWluaW11bSBVU0RDIGJlZm9yZSBzd2FwIGFsbG93ZWQKICAgIGJ5dGVjIDExIC8vICJtaW5Td2FwVGhyZXNob2xkIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Mjg3CiAgICAvLyB0aGlzLm1pblN3YXBUaHJlc2hvbGQudmFsdWUgPSBtaW5Td2FwVGhyZXNob2xkOwogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTYKICAgIC8vIG1heFNsaXBwYWdlQnBzID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAvLyBNYXhpbXVtIHNsaXBwYWdlIHRvbGVyYW5jZSBpbiBiYXNpcyBwb2ludHMKICAgIGJ5dGVjIDEyIC8vICJtYXhTbGlwcGFnZUJwcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI4OAogICAgLy8gdGhpcy5tYXhTbGlwcGFnZUJwcy52YWx1ZSA9IG1heFNsaXBwYWdlQnBzOwogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTcKICAgIC8vIHRvdGFsWWllbGRDb21wb3VuZGVkID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAvLyBUb3RhbCB5aWVsZCBjb21wb3VuZGVkIChmb3Igc3RhdHMpCiAgICBieXRlYyAxMyAvLyAidG90YWxZaWVsZENvbXBvdW5kZWQiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyODkKICAgIC8vIHRoaXMudG90YWxZaWVsZENvbXBvdW5kZWQudmFsdWUgPSBVaW50NjQoMCk7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjYwCiAgICAvLyB0aW55bWFuUG9vbEFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgLy8gVGlueW1hbiBWMiBwb29sIGFwcCBJRAogICAgYnl0ZWMgMTUgLy8gInRpbnltYW5Qb29sQXBwSWQiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyOTIKICAgIC8vIHRoaXMudGlueW1hblBvb2xBcHBJZC52YWx1ZSA9IHRpbnltYW5Qb29sQXBwSWQ7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MQogICAgLy8gdGlueW1hblBvb2xBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsgLy8gVGlueW1hbiBwb29sIGFkZHJlc3MKICAgIGJ5dGVjIDE2IC8vICJ0aW55bWFuUG9vbEFkZHJlc3MiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyOTMKICAgIC8vIHRoaXMudGlueW1hblBvb2xBZGRyZXNzLnZhbHVlID0gdGlueW1hblBvb2xBZGRyZXNzOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY0CiAgICAvLyBmYXJtQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgICAvLyBUb3RhbCBBbHBoYSBhdmFpbGFibGUgZm9yIGZhcm0gYm9udXMKICAgIGJ5dGVjXzIgLy8gImZhcm1CYWxhbmNlIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Mjk2CiAgICAvLyB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlID0gVWludDY0KDApOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NQogICAgLy8gZW1pc3Npb25SYXRpbyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgLy8gTXVsdGlwbGllciBmb3IgZHluYW1pYyByYXRlOiByYXRlID0gZmFybUJhbGFuY2UgKiBlbWlzc2lvblJhdGlvIC8gdG90YWxBbHBoYQogICAgYnl0ZWMgOSAvLyAiZW1pc3Npb25SYXRpbyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjI5NwogICAgLy8gdGhpcy5lbWlzc2lvblJhdGlvLnZhbHVlID0gVWludDY0KDApOyAvLyBEaXNhYmxlZCBieSBkZWZhdWx0LCBjcmVhdG9yIHNldHMgdmlhIHNldEVtaXNzaW9uUmF0aW8KICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjgKICAgIC8vIGFzc2V0c09wdGVkSW4gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgLy8gMSBpZiBhc3NldHMgYXJlIG9wdGVkIGluLCAwIG90aGVyd2lzZQogICAgYnl0ZWMgMTcgLy8gImFzc2V0c09wdGVkSW4iCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMDAKICAgIC8vIHRoaXMuYXNzZXRzT3B0ZWRJbi52YWx1ZSA9IFVpbnQ2NCgwKTsKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5vcHRJbkFzc2V0c1tyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdEluQXNzZXRzOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzEwCiAgICAvLyBhc3NlcnQoVHhuLnJla2V5VG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3Jla2V5VG8gbXVzdCBiZSB6ZXJvJyk7CiAgICB0eG4gUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJla2V5VG8gbXVzdCBiZSB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMTEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3JBZGRyZXNzLnZhbHVlLCAnT25seSBjcmVhdG9yIGNhbiBvcHQtaW4gYXNzZXRzJyk7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDcKICAgIC8vIGNyZWF0b3JBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsgICAvLyBWYXVsdCBjcmVhdG9yIHdobyByZWNlaXZlcyBmZWUKICAgIGJ5dGVjXzMgLy8gImNyZWF0b3JBZGRyZXNzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzExCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yQWRkcmVzcy52YWx1ZSwgJ09ubHkgY3JlYXRvciBjYW4gb3B0LWluIGFzc2V0cycpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBjcmVhdG9yIGNhbiBvcHQtaW4gYXNzZXRzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMTIKICAgIC8vIGFzc2VydCh0aGlzLmFzc2V0c09wdGVkSW4udmFsdWUgPT09IFVpbnQ2NCgwKSwgJ0Fzc2V0cyBhbHJlYWR5IG9wdGVkIGluJyk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjgKICAgIC8vIGFzc2V0c09wdGVkSW4gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgLy8gMSBpZiBhc3NldHMgYXJlIG9wdGVkIGluLCAwIG90aGVyd2lzZQogICAgYnl0ZWMgMTcgLy8gImFzc2V0c09wdGVkSW4iCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMTIKICAgIC8vIGFzc2VydCh0aGlzLmFzc2V0c09wdGVkSW4udmFsdWUgPT09IFVpbnQ2NCgwKSwgJ0Fzc2V0cyBhbHJlYWR5IG9wdGVkIGluJyk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFzc2V0cyBhbHJlYWR5IG9wdGVkIGluCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMTQKICAgIC8vIGNvbnN0IGFwcEFkZHI6IEFjY291bnQgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzczsKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMTgKICAgIC8vIGNvbnN0IGN1cnJlbnRJbmRleCA9IFR4bi5ncm91cEluZGV4OwogICAgdHhuIEdyb3VwSW5kZXgKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjMxOQogICAgLy8gYXNzZXJ0KGN1cnJlbnRJbmRleCA+PSBVaW50NjQoMSksICdBcHAgY2FsbCBtdXN0IGZvbGxvdyBwYXltZW50Jyk7CiAgICBkdXAKICAgIGFzc2VydCAvLyBBcHAgY2FsbCBtdXN0IGZvbGxvdyBwYXltZW50CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMjEKICAgIC8vIGNvbnN0IGFsZ29QYXltZW50ID0gZ3R4bi5QYXltZW50VHhuKGN1cnJlbnRJbmRleCAtIFVpbnQ2NCgxKSk7CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzIyCiAgICAvLyBhc3NlcnQoYWxnb1BheW1lbnQucmVjZWl2ZXIgPT09IGFwcEFkZHIsICdQYXltZW50IG11c3QgYmUgdG8gYXBwJyk7CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgdG8gYXBwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMjMKICAgIC8vIGFzc2VydChhbGdvUGF5bWVudC5hbW91bnQgPj0gdG90YWxSZXF1aXJlZCwgJ0luc3VmZmljaWVudCBBTEdPIChuZWVkIDUuNCBBTEdPKScpOwogICAgZHVwCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgNTQwMDAwMCAvLyA1NDAwMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBBTEdPIChuZWVkIDUuNCBBTEdPKQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzI0CiAgICAvLyBhc3NlcnQoYWxnb1BheW1lbnQuc2VuZGVyID09PSBUeG4uc2VuZGVyLCAnUGF5bWVudCBtdXN0IGJlIGZyb20gY2FsbGVyJyk7CiAgICBkdXAKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgZnJvbSBjYWxsZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjMyNwogICAgLy8gYXNzZXJ0KGFsZ29QYXltZW50LnJla2V5VG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3Jla2V5VG8gbXVzdCBiZSB6ZXJvJyk7CiAgICBkdXAKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWtleVRvIG11c3QgYmUgemVybwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzI4CiAgICAvLyBhc3NlcnQoYWxnb1BheW1lbnQuY2xvc2VSZW1haW5kZXJUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnY2xvc2VSZW1haW5kZXJUbyBtdXN0IGJlIHplcm8nKTsKICAgIGd0eG5zIENsb3NlUmVtYWluZGVyVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBjbG9zZVJlbWFpbmRlclRvIG11c3QgYmUgemVybwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzMxLTMzNgogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogYXBwQWRkciwKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLAogICAgLy8gICBhc3NldEFtb3VudDogVWludDY0KDApLAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzMzCiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMuYWxwaGFBc3NldC52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDMKICAgIC8vIGFscGhhQXNzZXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIEFscGhhIEFTQSBJRCAoZGVwb3NpdCAmIHlpZWxkIGFzc2V0KQogICAgYnl0ZWMgNCAvLyAiYWxwaGFBc3NldCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjMzMwogICAgLy8geGZlckFzc2V0OiBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjMzNAogICAgLy8gYXNzZXRBbW91bnQ6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjMzMS0zMzYKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IGFwcEFkZHIsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMzUKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozMzEtMzM2CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBhcHBBZGRyLAogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMuYWxwaGFBc3NldC52YWx1ZSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiBVaW50NjQoMCksCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzM5LTM0NAogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogYXBwQWRkciwKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLnVzZGNBc3NldC52YWx1ZSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiBVaW50NjQoMCksCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNDEKICAgIC8vIHhmZXJBc3NldDogQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ0CiAgICAvLyB1c2RjQXNzZXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBVU0RDIEFTQSBJRCAoYWlyZHJvcHMgY29tZSBpbiBhcyB0aGlzKQogICAgYnl0ZWMgNSAvLyAidXNkY0Fzc2V0IgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzQxCiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMudXNkY0Fzc2V0LnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNDIKICAgIC8vIGFzc2V0QW1vdW50OiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzM5LTM0NAogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogYXBwQWRkciwKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLnVzZGNBc3NldC52YWx1ZSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiBVaW50NjQoMCksCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzQzCiAgICAvLyBmZWU6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzM5LTM0NAogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogYXBwQWRkciwKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLnVzZGNBc3NldC52YWx1ZSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiBVaW50NjQoMCksCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjgKICAgIC8vIGFzc2V0c09wdGVkSW4gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgLy8gMSBpZiBhc3NldHMgYXJlIG9wdGVkIGluLCAwIG90aGVyd2lzZQogICAgYnl0ZWMgMTcgLy8gImFzc2V0c09wdGVkSW4iCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNDYKICAgIC8vIHRoaXMuYXNzZXRzT3B0ZWRJbi52YWx1ZSA9IFVpbnQ2NCgxKTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjpSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM1OAogICAgLy8gYXNzZXJ0KFR4bi5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdyZWtleVRvIG11c3QgYmUgemVybycpOwogICAgdHhuIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWtleVRvIG11c3QgYmUgemVybwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzYwCiAgICAvLyB0aGlzLnVzZXJTaGFyZXMoVHhuLnNlbmRlcikudmFsdWUgPSBVaW50NjQoMCk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NAogICAgLy8gdXNlclNoYXJlcyA9IExvY2FsU3RhdGU8dWludDY0PigpOyAgICAgICAgIC8vIFVzZXIncyBzaGFyZSBiYWxhbmNlIChyZXByZXNlbnRzIHByb3BvcnRpb25hbCBvd25lcnNoaXApCiAgICBieXRlYyA2IC8vICJ1c2VyU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzYwCiAgICAvLyB0aGlzLnVzZXJTaGFyZXMoVHhuLnNlbmRlcikudmFsdWUgPSBVaW50NjQoMCk7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MzU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdPcHRJbicgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo6UmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmNsb3NlT3V0W3JvdXRpbmddKCkgLT4gdm9pZDoKY2xvc2VPdXQ6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNjgKICAgIC8vIGFzc2VydChUeG4ucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncmVrZXlUbyBtdXN0IGJlIHplcm8nKTsKICAgIHR4biBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gcmVrZXlUbyBtdXN0IGJlIHplcm8KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM2OQogICAgLy8gY29uc3Qgc2hhcmVzID0gdGhpcy51c2VyU2hhcmVzKFR4bi5zZW5kZXIpLnZhbHVlOwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjc0CiAgICAvLyB1c2VyU2hhcmVzID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAgLy8gVXNlcidzIHNoYXJlIGJhbGFuY2UgKHJlcHJlc2VudHMgcHJvcG9ydGlvbmFsIG93bmVyc2hpcCkKICAgIGJ5dGVjIDYgLy8gInVzZXJTaGFyZXMiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNjkKICAgIC8vIGNvbnN0IHNoYXJlcyA9IHRoaXMudXNlclNoYXJlcyhUeG4uc2VuZGVyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM3MQogICAgLy8gaWYgKHNoYXJlcyA+IFVpbnQ2NCgwKSkgewogICAgYnogY2xvc2VPdXRfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNzMKICAgIC8vIGNvbnN0IGFscGhhQW1vdW50ID0gdGhpcy5zaGFyZXNUb0FscGhhKHNoYXJlcyk7CiAgICBkdXBuIDIKICAgIGNhbGxzdWIgc2hhcmVzVG9BbHBoYQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Mzc2CiAgICAvLyB0aGlzLnRvdGFsU2hhcmVzLnZhbHVlID0gdGhpcy50b3RhbFNoYXJlcy52YWx1ZSAtIHNoYXJlczsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MwogICAgLy8gdG90YWxTaGFyZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIFRvdGFsIHNoYXJlcyBpc3N1ZWQgdG8gYWxsIGRlcG9zaXRvcnMKICAgIGJ5dGVjXzAgLy8gInRvdGFsU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Mzc2CiAgICAvLyB0aGlzLnRvdGFsU2hhcmVzLnZhbHVlID0gdGhpcy50b3RhbFNoYXJlcy52YWx1ZSAtIHNoYXJlczsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUzCiAgICAvLyB0b3RhbFNoYXJlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgLy8gVG90YWwgc2hhcmVzIGlzc3VlZCB0byBhbGwgZGVwb3NpdG9ycwogICAgYnl0ZWNfMCAvLyAidG90YWxTaGFyZXMiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozNzYKICAgIC8vIHRoaXMudG90YWxTaGFyZXMudmFsdWUgPSB0aGlzLnRvdGFsU2hhcmVzLnZhbHVlIC0gc2hhcmVzOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM3NwogICAgLy8gdGhpcy50b3RhbEFscGhhLnZhbHVlID0gdGhpcy50b3RhbEFscGhhLnZhbHVlIC0gYWxwaGFBbW91bnQ7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Mzc3CiAgICAvLyB0aGlzLnRvdGFsQWxwaGEudmFsdWUgPSB0aGlzLnRvdGFsQWxwaGEudmFsdWUgLSBhbHBoYUFtb3VudDsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Mzc3CiAgICAvLyB0aGlzLnRvdGFsQWxwaGEudmFsdWUgPSB0aGlzLnRvdGFsQWxwaGEudmFsdWUgLSBhbHBoYUFtb3VudDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozODAtMzg1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMuYWxwaGFBc3NldC52YWx1ZSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbHBoYUFtb3VudCwKICAgIC8vICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM4MQogICAgLy8gYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM4MgogICAgLy8geGZlckFzc2V0OiBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQzCiAgICAvLyBhbHBoYUFzc2V0ID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAvLyBBbHBoYSBBU0EgSUQgKGRlcG9zaXQgJiB5aWVsZCBhc3NldCkKICAgIGJ5dGVjIDQgLy8gImFscGhhQXNzZXQiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czozODIKICAgIC8vIHhmZXJBc3NldDogQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM4MC0zODUKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFscGhhQW1vdW50LAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM4NAogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM4MC0zODUKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFscGhhQW1vdW50LAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKCmNsb3NlT3V0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjM2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnQ2xvc2VPdXQnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5kZXBvc2l0W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVwb3NpdDoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDA1CiAgICAvLyBhc3NlcnQoVHhuLnJla2V5VG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3Jla2V5VG8gbXVzdCBiZSB6ZXJvJyk7CiAgICB0eG4gUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJla2V5VG8gbXVzdCBiZSB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0MDYKICAgIC8vIGFzc2VydChzbGlwcGFnZUJwcyA8PSB0aGlzLm1heFNsaXBwYWdlQnBzLnZhbHVlLCAnU2xpcHBhZ2UgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQnKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NgogICAgLy8gbWF4U2xpcHBhZ2VCcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgIC8vIE1heGltdW0gc2xpcHBhZ2UgdG9sZXJhbmNlIGluIGJhc2lzIHBvaW50cwogICAgYnl0ZWMgMTIgLy8gIm1heFNsaXBwYWdlQnBzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDA2CiAgICAvLyBhc3NlcnQoc2xpcHBhZ2VCcHMgPD0gdGhpcy5tYXhTbGlwcGFnZUJwcy52YWx1ZSwgJ1NsaXBwYWdlIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkJyk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPD0KICAgIGFzc2VydCAvLyBTbGlwcGFnZSBleGNlZWRzIG1heGltdW0gYWxsb3dlZAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDA4CiAgICAvLyBjb25zdCBhcHBBZGRyOiBBY2NvdW50ID0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3M7CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZHVwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0MDkKICAgIC8vIGNvbnN0IHVzZGNCYWxhbmNlID0gQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLmJhbGFuY2UoYXBwQWRkcik7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDQKICAgIC8vIHVzZGNBc3NldCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgIC8vIFVTREMgQVNBIElEIChhaXJkcm9wcyBjb21lIGluIGFzIHRoaXMpCiAgICBieXRlYyA1IC8vICJ1c2RjQXNzZXQiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0MDkKICAgIC8vIGNvbnN0IHVzZGNCYWxhbmNlID0gQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLmJhbGFuY2UoYXBwQWRkcik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDEzCiAgICAvLyBpZiAodXNkY0JhbGFuY2UgPj0gdGhpcy5taW5Td2FwVGhyZXNob2xkLnZhbHVlICYmIHRoaXMudG90YWxTaGFyZXMudmFsdWUgPiBVaW50NjQoMCkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NQogICAgLy8gbWluU3dhcFRocmVzaG9sZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgIC8vIE1pbmltdW0gVVNEQyBiZWZvcmUgc3dhcCBhbGxvd2VkCiAgICBieXRlYyAxMSAvLyAibWluU3dhcFRocmVzaG9sZCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQxMwogICAgLy8gaWYgKHVzZGNCYWxhbmNlID49IHRoaXMubWluU3dhcFRocmVzaG9sZC52YWx1ZSAmJiB0aGlzLnRvdGFsU2hhcmVzLnZhbHVlID4gVWludDY0KDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPj0KICAgIGJ6IGRlcG9zaXRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTMKICAgIC8vIHRvdGFsU2hhcmVzID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAvLyBUb3RhbCBzaGFyZXMgaXNzdWVkIHRvIGFsbCBkZXBvc2l0b3JzCiAgICBieXRlY18wIC8vICJ0b3RhbFNoYXJlcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQxMwogICAgLy8gaWYgKHVzZGNCYWxhbmNlID49IHRoaXMubWluU3dhcFRocmVzaG9sZC52YWx1ZSAmJiB0aGlzLnRvdGFsU2hhcmVzLnZhbHVlID4gVWludDY0KDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZGVwb3NpdF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQxNAogICAgLy8gdGhpcy5leGVjdXRlQ29tcG91bmQodXNkY0JhbGFuY2UsIHNsaXBwYWdlQnBzKTsKICAgIGR1cAogICAgZGlnIDMKICAgIGNhbGxzdWIgZXhlY3V0ZUNvbXBvdW5kCgpkZXBvc2l0X2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQxOAogICAgLy8gY29uc3QgY3VycmVudEluZGV4ID0gVHhuLmdyb3VwSW5kZXg7CiAgICB0eG4gR3JvdXBJbmRleAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDE5CiAgICAvLyBhc3NlcnQoY3VycmVudEluZGV4ID49IFVpbnQ2NCgxKSwgJ0FwcCBjYWxsIG11c3QgZm9sbG93IGFzc2V0IHRyYW5zZmVyJyk7CiAgICBkdXAKICAgIGFzc2VydCAvLyBBcHAgY2FsbCBtdXN0IGZvbGxvdyBhc3NldCB0cmFuc2ZlcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDIxCiAgICAvLyBjb25zdCBkZXBvc2l0VHJhbnNmZXIgPSBndHhuLkFzc2V0VHJhbnNmZXJUeG4oY3VycmVudEluZGV4IC0gVWludDY0KDEpKTsKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDIyCiAgICAvLyBhc3NlcnQoZGVwb3NpdFRyYW5zZmVyLnhmZXJBc3NldCA9PT0gQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKSwgJ011c3QgdHJhbnNmZXIgQWxwaGEgYXNzZXQnKTsKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDMKICAgIC8vIGFscGhhQXNzZXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIEFscGhhIEFTQSBJRCAoZGVwb3NpdCAmIHlpZWxkIGFzc2V0KQogICAgYnl0ZWMgNCAvLyAiYWxwaGFBc3NldCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQyMgogICAgLy8gYXNzZXJ0KGRlcG9zaXRUcmFuc2Zlci54ZmVyQXNzZXQgPT09IEFzc2V0KHRoaXMuYWxwaGFBc3NldC52YWx1ZSksICdNdXN0IHRyYW5zZmVyIEFscGhhIGFzc2V0Jyk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBNdXN0IHRyYW5zZmVyIEFscGhhIGFzc2V0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0MjMKICAgIC8vIGFzc2VydChkZXBvc2l0VHJhbnNmZXIuYXNzZXRSZWNlaXZlciA9PT0gYXBwQWRkciwgJ011c3Qgc2VuZCB0byBjb250cmFjdCcpOwogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBNdXN0IHNlbmQgdG8gY29udHJhY3QKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQyNAogICAgLy8gYXNzZXJ0KGRlcG9zaXRUcmFuc2Zlci5zZW5kZXIgPT09IFR4bi5zZW5kZXIsICdUcmFuc2ZlciBtdXN0IGJlIGZyb20gY2FsbGVyJyk7CiAgICBkdXAKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBUcmFuc2ZlciBtdXN0IGJlIGZyb20gY2FsbGVyCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0MjcKICAgIC8vIGFzc2VydChkZXBvc2l0VHJhbnNmZXIucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncmVrZXlUbyBtdXN0IGJlIHplcm8nKTsKICAgIGR1cAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJla2V5VG8gbXVzdCBiZSB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0MjgKICAgIC8vIGFzc2VydChkZXBvc2l0VHJhbnNmZXIuYXNzZXRDbG9zZVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdhc3NldENsb3NlVG8gbXVzdCBiZSB6ZXJvJyk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0Q2xvc2VUbyBtdXN0IGJlIHplcm8KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQzMAogICAgLy8gY29uc3QgYW1vdW50ID0gZGVwb3NpdFRyYW5zZmVyLmFzc2V0QW1vdW50OwogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQzMQogICAgLy8gYXNzZXJ0KGFtb3VudCA+PSBNSU5fREVQT1NJVF9BTU9VTlQsICdEZXBvc2l0IHRvbyBzbWFsbCcpOwogICAgZHVwCiAgICBwdXNoaW50IDEwMDAwMDAgLy8gMTAwMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBEZXBvc2l0IHRvbyBzbWFsbAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDM0CiAgICAvLyBjb25zdCBzaGFyZXNUb01pbnQgPSB0aGlzLmFscGhhVG9TaGFyZXMoYW1vdW50KTsKICAgIGR1cAogICAgY2FsbHN1YiBhbHBoYVRvU2hhcmVzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0MzUKICAgIC8vIGFzc2VydChzaGFyZXNUb01pbnQgPiBVaW50NjQoMCksICdTaGFyZXMgdG8gbWludCBpcyB6ZXJvJyk7CiAgICBkdXAKICAgIGFzc2VydCAvLyBTaGFyZXMgdG8gbWludCBpcyB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0MzgKICAgIC8vIHRoaXMudXNlclNoYXJlcyhUeG4uc2VuZGVyKS52YWx1ZSA9IHRoaXMudXNlclNoYXJlcyhUeG4uc2VuZGVyKS52YWx1ZSArIHNoYXJlc1RvTWludDsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NAogICAgLy8gdXNlclNoYXJlcyA9IExvY2FsU3RhdGU8dWludDY0PigpOyAgICAgICAgIC8vIFVzZXIncyBzaGFyZSBiYWxhbmNlIChyZXByZXNlbnRzIHByb3BvcnRpb25hbCBvd25lcnNoaXApCiAgICBieXRlYyA2IC8vICJ1c2VyU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDM4CiAgICAvLyB0aGlzLnVzZXJTaGFyZXMoVHhuLnNlbmRlcikudmFsdWUgPSB0aGlzLnVzZXJTaGFyZXMoVHhuLnNlbmRlcikudmFsdWUgKyBzaGFyZXNUb01pbnQ7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICB0eG4gU2VuZGVyCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NAogICAgLy8gdXNlclNoYXJlcyA9IExvY2FsU3RhdGU8dWludDY0PigpOyAgICAgICAgIC8vIFVzZXIncyBzaGFyZSBiYWxhbmNlIChyZXByZXNlbnRzIHByb3BvcnRpb25hbCBvd25lcnNoaXApCiAgICBieXRlYyA2IC8vICJ1c2VyU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDM4CiAgICAvLyB0aGlzLnVzZXJTaGFyZXMoVHhuLnNlbmRlcikudmFsdWUgPSB0aGlzLnVzZXJTaGFyZXMoVHhuLnNlbmRlcikudmFsdWUgKyBzaGFyZXNUb01pbnQ7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQzOQogICAgLy8gdGhpcy50b3RhbFNoYXJlcy52YWx1ZSA9IHRoaXMudG90YWxTaGFyZXMudmFsdWUgKyBzaGFyZXNUb01pbnQ7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTMKICAgIC8vIHRvdGFsU2hhcmVzID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAvLyBUb3RhbCBzaGFyZXMgaXNzdWVkIHRvIGFsbCBkZXBvc2l0b3JzCiAgICBieXRlY18wIC8vICJ0b3RhbFNoYXJlcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQzOQogICAgLy8gdGhpcy50b3RhbFNoYXJlcy52YWx1ZSA9IHRoaXMudG90YWxTaGFyZXMudmFsdWUgKyBzaGFyZXNUb01pbnQ7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgKwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTMKICAgIC8vIHRvdGFsU2hhcmVzID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAvLyBUb3RhbCBzaGFyZXMgaXNzdWVkIHRvIGFsbCBkZXBvc2l0b3JzCiAgICBieXRlY18wIC8vICJ0b3RhbFNoYXJlcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQzOQogICAgLy8gdGhpcy50b3RhbFNoYXJlcy52YWx1ZSA9IHRoaXMudG90YWxTaGFyZXMudmFsdWUgKyBzaGFyZXNUb01pbnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDQwCiAgICAvLyB0aGlzLnRvdGFsQWxwaGEudmFsdWUgPSB0aGlzLnRvdGFsQWxwaGEudmFsdWUgKyBhbW91bnQ7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDQwCiAgICAvLyB0aGlzLnRvdGFsQWxwaGEudmFsdWUgPSB0aGlzLnRvdGFsQWxwaGEudmFsdWUgKyBhbW91bnQ7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgKwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDQwCiAgICAvLyB0aGlzLnRvdGFsQWxwaGEudmFsdWUgPSB0aGlzLnRvdGFsQWxwaGEudmFsdWUgKyBhbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjpSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQud2l0aGRyYXdbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoZHJhdzoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDUwCiAgICAvLyBhc3NlcnQoVHhuLnJla2V5VG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3Jla2V5VG8gbXVzdCBiZSB6ZXJvJyk7CiAgICB0eG4gUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJla2V5VG8gbXVzdCBiZSB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NTEKICAgIC8vIGNvbnN0IHVzZXJTaGFyZUJhbGFuY2UgPSB0aGlzLnVzZXJTaGFyZXMoVHhuLnNlbmRlcikudmFsdWU7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzQKICAgIC8vIHVzZXJTaGFyZXMgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgICAvLyBVc2VyJ3Mgc2hhcmUgYmFsYW5jZSAocmVwcmVzZW50cyBwcm9wb3J0aW9uYWwgb3duZXJzaGlwKQogICAgYnl0ZWMgNiAvLyAidXNlclNoYXJlcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ1MQogICAgLy8gY29uc3QgdXNlclNoYXJlQmFsYW5jZSA9IHRoaXMudXNlclNoYXJlcyhUeG4uc2VuZGVyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDU1CiAgICAvLyBpZiAoc2hhcmVzVG9SZWRlZW0gPT09IFVpbnQ2NCgwKSkgewogICAgYnogd2l0aGRyYXdfaWZfYm9keUAyCiAgICBkaWcgMQoKd2l0aGRyYXdfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDU5CiAgICAvLyBhc3NlcnQoc2hhcmVzVG9SZWRlZW0gPiBVaW50NjQoMCksICdOb3RoaW5nIHRvIHdpdGhkcmF3Jyk7CiAgICBkdXAKICAgIGFzc2VydCAvLyBOb3RoaW5nIHRvIHdpdGhkcmF3CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NjAKICAgIC8vIGFzc2VydChzaGFyZXNUb1JlZGVlbSA8PSB1c2VyU2hhcmVCYWxhbmNlLCAnSW5zdWZmaWNpZW50IHNoYXJlcycpOwogICAgZHVwCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzaGFyZXMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ2MwogICAgLy8gY29uc3QgYWxwaGFBbW91bnQgPSB0aGlzLnNoYXJlc1RvQWxwaGEoc2hhcmVzVG9SZWRlZW0pOwogICAgZHVwCiAgICBjYWxsc3ViIHNoYXJlc1RvQWxwaGEKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ2NAogICAgLy8gYXNzZXJ0KGFscGhhQW1vdW50ID4gVWludDY0KDApLCAnQWxwaGEgYW1vdW50IGlzIHplcm8nKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIEFscGhhIGFtb3VudCBpcyB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NjcKICAgIC8vIHRoaXMudXNlclNoYXJlcyhUeG4uc2VuZGVyKS52YWx1ZSA9IHVzZXJTaGFyZUJhbGFuY2UgLSBzaGFyZXNUb1JlZGVlbTsKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIC0KICAgIHR4biBTZW5kZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjc0CiAgICAvLyB1c2VyU2hhcmVzID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAgLy8gVXNlcidzIHNoYXJlIGJhbGFuY2UgKHJlcHJlc2VudHMgcHJvcG9ydGlvbmFsIG93bmVyc2hpcCkKICAgIGJ5dGVjIDYgLy8gInVzZXJTaGFyZXMiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NjcKICAgIC8vIHRoaXMudXNlclNoYXJlcyhUeG4uc2VuZGVyKS52YWx1ZSA9IHVzZXJTaGFyZUJhbGFuY2UgLSBzaGFyZXNUb1JlZGVlbTsKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDY4CiAgICAvLyB0aGlzLnRvdGFsU2hhcmVzLnZhbHVlID0gdGhpcy50b3RhbFNoYXJlcy52YWx1ZSAtIHNoYXJlc1RvUmVkZWVtOwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUzCiAgICAvLyB0b3RhbFNoYXJlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgLy8gVG90YWwgc2hhcmVzIGlzc3VlZCB0byBhbGwgZGVwb3NpdG9ycwogICAgYnl0ZWNfMCAvLyAidG90YWxTaGFyZXMiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NjgKICAgIC8vIHRoaXMudG90YWxTaGFyZXMudmFsdWUgPSB0aGlzLnRvdGFsU2hhcmVzLnZhbHVlIC0gc2hhcmVzVG9SZWRlZW07CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICAtCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MwogICAgLy8gdG90YWxTaGFyZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIFRvdGFsIHNoYXJlcyBpc3N1ZWQgdG8gYWxsIGRlcG9zaXRvcnMKICAgIGJ5dGVjXzAgLy8gInRvdGFsU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDY4CiAgICAvLyB0aGlzLnRvdGFsU2hhcmVzLnZhbHVlID0gdGhpcy50b3RhbFNoYXJlcy52YWx1ZSAtIHNoYXJlc1RvUmVkZWVtOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ2OQogICAgLy8gdGhpcy50b3RhbEFscGhhLnZhbHVlID0gdGhpcy50b3RhbEFscGhhLnZhbHVlIC0gYWxwaGFBbW91bnQ7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDY5CiAgICAvLyB0aGlzLnRvdGFsQWxwaGEudmFsdWUgPSB0aGlzLnRvdGFsQWxwaGEudmFsdWUgLSBhbHBoYUFtb3VudDsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDY5CiAgICAvLyB0aGlzLnRvdGFsQWxwaGEudmFsdWUgPSB0aGlzLnRvdGFsQWxwaGEudmFsdWUgLSBhbHBoYUFtb3VudDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NzItNDc3CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMuYWxwaGFBc3NldC52YWx1ZSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbHBoYUFtb3VudCwKICAgIC8vICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ3MwogICAgLy8gYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ3NAogICAgLy8geGZlckFzc2V0OiBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQzCiAgICAvLyBhbHBoYUFzc2V0ID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAvLyBBbHBoYSBBU0EgSUQgKGRlcG9zaXQgJiB5aWVsZCBhc3NldCkKICAgIGJ5dGVjIDQgLy8gImFscGhhQXNzZXQiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NzQKICAgIC8vIHhmZXJBc3NldDogQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ3Mi00NzcKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFscGhhQW1vdW50LAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ3NgogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ3Mi00NzcKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFscGhhQW1vdW50LAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCndpdGhkcmF3X2lmX2JvZHlAMjoKICAgIGR1cAogICAgYiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDMKCgovLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo6UmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmNsYWltQ3JlYXRvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmNsYWltQ3JlYXRvcjoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ4OQogICAgLy8gYXNzZXJ0KFR4bi5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdyZWtleVRvIG11c3QgYmUgemVybycpOwogICAgdHhuIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWtleVRvIG11c3QgYmUgemVybwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDkwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yQWRkcmVzcy52YWx1ZSwgJ09ubHkgY3JlYXRvciBjYW4gY2xhaW0nKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NwogICAgLy8gY3JlYXRvckFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOyAgIC8vIFZhdWx0IGNyZWF0b3Igd2hvIHJlY2VpdmVzIGZlZQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvckFkZHJlc3MiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0OTAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3JBZGRyZXNzLnZhbHVlLCAnT25seSBjcmVhdG9yIGNhbiBjbGFpbScpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBjcmVhdG9yIGNhbiBjbGFpbQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDkyCiAgICAvLyBjb25zdCBjbGFpbWFibGUgPSB0aGlzLmNyZWF0b3JVbmNsYWltZWRBbHBoYS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MAogICAgLy8gY3JlYXRvclVuY2xhaW1lZEFscGhhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAvLyBBY2N1bXVsYXRlZCBBbHBoYSBmb3IgY3JlYXRvciB0byBjbGFpbQogICAgYnl0ZWMgOCAvLyAiY3JlYXRvclVuY2xhaW1lZEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDkyCiAgICAvLyBjb25zdCBjbGFpbWFibGUgPSB0aGlzLmNyZWF0b3JVbmNsYWltZWRBbHBoYS52YWx1ZTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0OTMKICAgIC8vIGFzc2VydChjbGFpbWFibGUgPiBVaW50NjQoMCksICdOb3RoaW5nIHRvIGNsYWltJyk7CiAgICBkdXAKICAgIGFzc2VydCAvLyBOb3RoaW5nIHRvIGNsYWltCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MAogICAgLy8gY3JlYXRvclVuY2xhaW1lZEFscGhhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAvLyBBY2N1bXVsYXRlZCBBbHBoYSBmb3IgY3JlYXRvciB0byBjbGFpbQogICAgYnl0ZWMgOCAvLyAiY3JlYXRvclVuY2xhaW1lZEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDk2CiAgICAvLyB0aGlzLmNyZWF0b3JVbmNsYWltZWRBbHBoYS52YWx1ZSA9IFVpbnQ2NCgwKTsKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDk5LTUwNAogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLAogICAgLy8gICBhc3NldEFtb3VudDogY2xhaW1hYmxlLAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTAwCiAgICAvLyBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTAxCiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMuYWxwaGFBc3NldC52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDMKICAgIC8vIGFscGhhQXNzZXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIEFscGhhIEFTQSBJRCAoZGVwb3NpdCAmIHlpZWxkIGFzc2V0KQogICAgYnl0ZWMgNCAvLyAiYWxwaGFBc3NldCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUwMQogICAgLy8geGZlckFzc2V0OiBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDk5LTUwNAogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLAogICAgLy8gICBhc3NldEFtb3VudDogY2xhaW1hYmxlLAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUwMwogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ5OS01MDQKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGNsYWltYWJsZSwKICAgIC8vICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5jb21wb3VuZFlpZWxkW3JvdXRpbmddKCkgLT4gdm9pZDoKY29tcG91bmRZaWVsZDoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUyMAogICAgLy8gYXNzZXJ0KFR4bi5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdyZWtleVRvIG11c3QgYmUgemVybycpOwogICAgdHhuIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWtleVRvIG11c3QgYmUgemVybwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTIxCiAgICAvLyBhc3NlcnQoc2xpcHBhZ2VCcHMgPD0gdGhpcy5tYXhTbGlwcGFnZUJwcy52YWx1ZSwgJ1NsaXBwYWdlIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkJyk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTYKICAgIC8vIG1heFNsaXBwYWdlQnBzID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAvLyBNYXhpbXVtIHNsaXBwYWdlIHRvbGVyYW5jZSBpbiBiYXNpcyBwb2ludHMKICAgIGJ5dGVjIDEyIC8vICJtYXhTbGlwcGFnZUJwcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUyMQogICAgLy8gYXNzZXJ0KHNsaXBwYWdlQnBzIDw9IHRoaXMubWF4U2xpcHBhZ2VCcHMudmFsdWUsICdTbGlwcGFnZSBleGNlZWRzIG1heGltdW0gYWxsb3dlZCcpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIFNsaXBwYWdlIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MjMKICAgIC8vIGNvbnN0IGFwcEFkZHI6IEFjY291bnQgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzczsKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MjQKICAgIC8vIGNvbnN0IHVzZGNCYWxhbmNlID0gQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLmJhbGFuY2UoYXBwQWRkcik7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDQKICAgIC8vIHVzZGNBc3NldCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgIC8vIFVTREMgQVNBIElEIChhaXJkcm9wcyBjb21lIGluIGFzIHRoaXMpCiAgICBieXRlYyA1IC8vICJ1c2RjQXNzZXQiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MjQKICAgIC8vIGNvbnN0IHVzZGNCYWxhbmNlID0gQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLmJhbGFuY2UoYXBwQWRkcik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MjYKICAgIC8vIGFzc2VydCh1c2RjQmFsYW5jZSA+PSB0aGlzLm1pblN3YXBUaHJlc2hvbGQudmFsdWUsICdCZWxvdyBtaW5pbXVtIHN3YXAgdGhyZXNob2xkJyk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTUKICAgIC8vIG1pblN3YXBUaHJlc2hvbGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAvLyBNaW5pbXVtIFVTREMgYmVmb3JlIHN3YXAgYWxsb3dlZAogICAgYnl0ZWMgMTEgLy8gIm1pblN3YXBUaHJlc2hvbGQiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MjYKICAgIC8vIGFzc2VydCh1c2RjQmFsYW5jZSA+PSB0aGlzLm1pblN3YXBUaHJlc2hvbGQudmFsdWUsICdCZWxvdyBtaW5pbXVtIHN3YXAgdGhyZXNob2xkJyk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gQmVsb3cgbWluaW11bSBzd2FwIHRocmVzaG9sZAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTI3CiAgICAvLyBhc3NlcnQodGhpcy50b3RhbFNoYXJlcy52YWx1ZSA+IFVpbnQ2NCgwKSwgJ05vIGRlcG9zaXRvcnMgdG8gY29tcG91bmQgZm9yJyk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTMKICAgIC8vIHRvdGFsU2hhcmVzID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAvLyBUb3RhbCBzaGFyZXMgaXNzdWVkIHRvIGFsbCBkZXBvc2l0b3JzCiAgICBieXRlY18wIC8vICJ0b3RhbFNoYXJlcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUyNwogICAgLy8gYXNzZXJ0KHRoaXMudG90YWxTaGFyZXMudmFsdWUgPiBVaW50NjQoMCksICdObyBkZXBvc2l0b3JzIHRvIGNvbXBvdW5kIGZvcicpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2VydCAvLyBObyBkZXBvc2l0b3JzIHRvIGNvbXBvdW5kIGZvcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTI5CiAgICAvLyB0aGlzLmV4ZWN1dGVDb21wb3VuZCh1c2RjQmFsYW5jZSwgc2xpcHBhZ2VCcHMpOwogICAgc3dhcAogICAgY2FsbHN1YiBleGVjdXRlQ29tcG91bmQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo6UmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmdldFZhdWx0U3RhdHNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRWYXVsdFN0YXRzOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQzCiAgICAvLyBjb25zdCBhcHBBZGRyOiBBY2NvdW50ID0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3M7CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQ0CiAgICAvLyBjb25zdCB1c2RjQmFsYW5jZSA9IEFzc2V0KHRoaXMudXNkY0Fzc2V0LnZhbHVlKS5iYWxhbmNlKGFwcEFkZHIpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ0CiAgICAvLyB1c2RjQXNzZXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBVU0RDIEFTQSBJRCAoYWlyZHJvcHMgY29tZSBpbiBhcyB0aGlzKQogICAgYnl0ZWMgNSAvLyAidXNkY0Fzc2V0IgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQ0CiAgICAvLyBjb25zdCB1c2RjQmFsYW5jZSA9IEFzc2V0KHRoaXMudXNkY0Fzc2V0LnZhbHVlKS5iYWxhbmNlKGFwcEFkZHIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQ3CiAgICAvLyBsZXQgc2hhcmVQcmljZTogdWludDY0ID0gU0NBTEU7IC8vIERlZmF1bHQgMToxIGlmIG5vIHNoYXJlcwogICAgaW50YyA3IC8vIDEwMDAwMDAwMDAwMDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU0OAogICAgLy8gaWYgKHRoaXMudG90YWxTaGFyZXMudmFsdWUgPiBVaW50NjQoMCkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MwogICAgLy8gdG90YWxTaGFyZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIFRvdGFsIHNoYXJlcyBpc3N1ZWQgdG8gYWxsIGRlcG9zaXRvcnMKICAgIGJ5dGVjXzAgLy8gInRvdGFsU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQ4CiAgICAvLyBpZiAodGhpcy50b3RhbFNoYXJlcy52YWx1ZSA+IFVpbnQ2NCgwKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IGdldFZhdWx0U3RhdHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NDkKICAgIC8vIHNoYXJlUHJpY2UgPSB0aGlzLm11bERpdkZsb29yKHRoaXMudG90YWxBbHBoYS52YWx1ZSwgU0NBTEUsIHRoaXMudG90YWxTaGFyZXMudmFsdWUpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU0CiAgICAvLyB0b3RhbEFscGhhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAgLy8gVG90YWwgQWxwaGEgaGVsZCAoZGVwb3NpdHMgKyBjb21wb3VuZGVkIHlpZWxkKQogICAgYnl0ZWNfMSAvLyAidG90YWxBbHBoYSIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU0OQogICAgLy8gc2hhcmVQcmljZSA9IHRoaXMubXVsRGl2Rmxvb3IodGhpcy50b3RhbEFscGhhLnZhbHVlLCBTQ0FMRSwgdGhpcy50b3RhbFNoYXJlcy52YWx1ZSk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUzCiAgICAvLyB0b3RhbFNoYXJlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgLy8gVG90YWwgc2hhcmVzIGlzc3VlZCB0byBhbGwgZGVwb3NpdG9ycwogICAgYnl0ZWNfMCAvLyAidG90YWxTaGFyZXMiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NDkKICAgIC8vIHNoYXJlUHJpY2UgPSB0aGlzLm11bERpdkZsb29yKHRoaXMudG90YWxBbHBoYS52YWx1ZSwgU0NBTEUsIHRoaXMudG90YWxTaGFyZXMudmFsdWUpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg1CiAgICAvLyBjb25zdCBbaGksIGxvXSA9IG11bHcobjEsIG4yKTsKICAgIHN3YXAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU0OQogICAgLy8gc2hhcmVQcmljZSA9IHRoaXMubXVsRGl2Rmxvb3IodGhpcy50b3RhbEFscGhhLnZhbHVlLCBTQ0FMRSwgdGhpcy50b3RhbFNoYXJlcy52YWx1ZSk7CiAgICBpbnRjIDcgLy8gMTAwMDAwMDAwMDAwMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODUKICAgIC8vIGNvbnN0IFtoaSwgbG9dID0gbXVsdyhuMSwgbjIpOwogICAgbXVsdwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IFtxX2hpLCBxX2xvLCBfcl9oaSwgX3JfbG9dID0gZGl2bW9kdyhoaSwgbG8sIFVpbnQ2NCgwKSwgZCk7CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBkaXZtb2R3CiAgICBwb3BuIDIKICAgIHN3YXAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg3CiAgICAvLyBhc3NlcnQocV9oaSA9PT0gVWludDY0KDApLCAnTXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgaW4gbXVsRGl2Rmxvb3InKTsKICAgICEKICAgIGFzc2VydCAvLyBNdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyBpbiBtdWxEaXZGbG9vcgogICAgYnVyeSAxCgpnZXRWYXVsdFN0YXRzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU1MwogICAgLy8gdGhpcy50b3RhbFNoYXJlcy52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MwogICAgLy8gdG90YWxTaGFyZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIFRvdGFsIHNoYXJlcyBpc3N1ZWQgdG8gYWxsIGRlcG9zaXRvcnMKICAgIGJ5dGVjXzAgLy8gInRvdGFsU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTUzCiAgICAvLyB0aGlzLnRvdGFsU2hhcmVzLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU1NAogICAgLy8gdGhpcy50b3RhbEFscGhhLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU0CiAgICAvLyB0b3RhbEFscGhhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAgLy8gVG90YWwgQWxwaGEgaGVsZCAoZGVwb3NpdHMgKyBjb21wb3VuZGVkIHlpZWxkKQogICAgYnl0ZWNfMSAvLyAidG90YWxBbHBoYSIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU1NAogICAgLy8gdGhpcy50b3RhbEFscGhhLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU1NQogICAgLy8gdGhpcy5jcmVhdG9yVW5jbGFpbWVkQWxwaGEudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTAKICAgIC8vIGNyZWF0b3JVbmNsYWltZWRBbHBoYSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgLy8gQWNjdW11bGF0ZWQgQWxwaGEgZm9yIGNyZWF0b3IgdG8gY2xhaW0KICAgIGJ5dGVjIDggLy8gImNyZWF0b3JVbmNsYWltZWRBbHBoYSIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU1NQogICAgLy8gdGhpcy5jcmVhdG9yVW5jbGFpbWVkQWxwaGEudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTU3CiAgICAvLyB0aGlzLnRvdGFsWWllbGRDb21wb3VuZGVkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU3CiAgICAvLyB0b3RhbFlpZWxkQ29tcG91bmRlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgLy8gVG90YWwgeWllbGQgY29tcG91bmRlZCAoZm9yIHN0YXRzKQogICAgYnl0ZWMgMTMgLy8gInRvdGFsWWllbGRDb21wb3VuZGVkIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTU3CiAgICAvLyB0aGlzLnRvdGFsWWllbGRDb21wb3VuZGVkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU1Mi01NTkKICAgIC8vIHJldHVybiBbCiAgICAvLyAgIHRoaXMudG90YWxTaGFyZXMudmFsdWUsCiAgICAvLyAgIHRoaXMudG90YWxBbHBoYS52YWx1ZSwKICAgIC8vICAgdGhpcy5jcmVhdG9yVW5jbGFpbWVkQWxwaGEudmFsdWUsCiAgICAvLyAgIHVzZGNCYWxhbmNlLAogICAgLy8gICB0aGlzLnRvdGFsWWllbGRDb21wb3VuZGVkLnZhbHVlLAogICAgLy8gICBzaGFyZVByaWNlCiAgICAvLyBdOwogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWMgNyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjpSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuZ2V0VXNlckFscGhhQmFsYW5jZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFVzZXJBbHBoYUJhbGFuY2U6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NjgKICAgIC8vIGNvbnN0IHNoYXJlcyA9IHRoaXMudXNlclNoYXJlcyh1c2VyKS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NAogICAgLy8gdXNlclNoYXJlcyA9IExvY2FsU3RhdGU8dWludDY0PigpOyAgICAgICAgIC8vIFVzZXIncyBzaGFyZSBiYWxhbmNlIChyZXByZXNlbnRzIHByb3BvcnRpb25hbCBvd25lcnNoaXApCiAgICBieXRlYyA2IC8vICJ1c2VyU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTY4CiAgICAvLyBjb25zdCBzaGFyZXMgPSB0aGlzLnVzZXJTaGFyZXModXNlcikudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU2OQogICAgLy8gcmV0dXJuIHRoaXMuc2hhcmVzVG9BbHBoYShzaGFyZXMpOwogICAgY2FsbHN1YiBzaGFyZXNUb0FscGhhCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5nZXRVc2VyU2hhcmVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0VXNlclNoYXJlczoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU3NwogICAgLy8gcmV0dXJuIHRoaXMudXNlclNoYXJlcyh1c2VyKS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NAogICAgLy8gdXNlclNoYXJlcyA9IExvY2FsU3RhdGU8dWludDY0PigpOyAgICAgICAgIC8vIFVzZXIncyBzaGFyZSBiYWxhbmNlIChyZXByZXNlbnRzIHByb3BvcnRpb25hbCBvd25lcnNoaXApCiAgICBieXRlYyA2IC8vICJ1c2VyU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTc3CiAgICAvLyByZXR1cm4gdGhpcy51c2VyU2hhcmVzKHVzZXIpLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5wcmV2aWV3RGVwb3NpdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnByZXZpZXdEZXBvc2l0OgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTg1CiAgICAvLyByZXR1cm4gdGhpcy5hbHBoYVRvU2hhcmVzKGFscGhhQW1vdW50KTsKICAgIGNhbGxzdWIgYWxwaGFUb1NoYXJlcwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWMgNyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjpSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQucHJldmlld1dpdGhkcmF3W3JvdXRpbmddKCkgLT4gdm9pZDoKcHJldmlld1dpdGhkcmF3OgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTkzCiAgICAvLyByZXR1cm4gdGhpcy5zaGFyZXNUb0FscGhhKHNoYXJlQW1vdW50KTsKICAgIGNhbGxzdWIgc2hhcmVzVG9BbHBoYQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWMgNyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjpSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuZ2V0Q29tcG91bmRRdW90ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldENvbXBvdW5kUXVvdGU6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MDIKICAgIC8vIGNvbnN0IGFwcEFkZHI6IEFjY291bnQgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzczsKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MDMKICAgIC8vIGNvbnN0IHVzZGNCYWxhbmNlID0gQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLmJhbGFuY2UoYXBwQWRkcik7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDQKICAgIC8vIHVzZGNBc3NldCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgIC8vIFVTREMgQVNBIElEIChhaXJkcm9wcyBjb21lIGluIGFzIHRoaXMpCiAgICBieXRlYyA1IC8vICJ1c2RjQXNzZXQiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MDMKICAgIC8vIGNvbnN0IHVzZGNCYWxhbmNlID0gQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLmJhbGFuY2UoYXBwQWRkcik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjA1CiAgICAvLyBpZiAodXNkY0JhbGFuY2UgPT09IFVpbnQ2NCgwKSkgewogICAgYm56IGdldENvbXBvdW5kUXVvdGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MDYKICAgIC8vIHJldHVybiBbVWludDY0KDApLCBVaW50NjQoMCksIFVpbnQ2NCgwKV07CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKCmdldENvbXBvdW5kUXVvdGVfYWZ0ZXJfaW5saW5lZF9SYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo6UmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmdldENvbXBvdW5kUXVvdGVANDoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjYwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldENvbXBvdW5kUXVvdGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjA5CiAgICAvLyBjb25zdCBleHBlY3RlZE91dHB1dCA9IHRoaXMuZ2V0RXhwZWN0ZWRTd2FwT3V0cHV0KHVzZGNCYWxhbmNlKTsKICAgIGR1cG4gMgogICAgY2FsbHN1YiBnZXRFeHBlY3RlZFN3YXBPdXRwdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg1CiAgICAvLyBjb25zdCBbaGksIGxvXSA9IG11bHcobjEsIG4yKTsKICAgIGR1cAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjEwCiAgICAvLyBjb25zdCBtaW5BdDUwQnBzID0gdGhpcy5tdWxEaXZGbG9vcihleHBlY3RlZE91dHB1dCwgRkVFX0JQU19CQVNFIC0gVWludDY0KDUwKSwgRkVFX0JQU19CQVNFKTsKICAgIHB1c2hpbnQgOTk1MCAvLyA5OTUwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NQogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KG4xLCBuMik7CiAgICBtdWx3CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NgogICAgLy8gY29uc3QgW3FfaGksIHFfbG8sIF9yX2hpLCBfcl9sb10gPSBkaXZtb2R3KGhpLCBsbywgVWludDY0KDApLCBkKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MTAKICAgIC8vIGNvbnN0IG1pbkF0NTBCcHMgPSB0aGlzLm11bERpdkZsb29yKGV4cGVjdGVkT3V0cHV0LCBGRUVfQlBTX0JBU0UgLSBVaW50NjQoNTApLCBGRUVfQlBTX0JBU0UpOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NgogICAgLy8gY29uc3QgW3FfaGksIHFfbG8sIF9yX2hpLCBfcl9sb10gPSBkaXZtb2R3KGhpLCBsbywgVWludDY0KDApLCBkKTsKICAgIGRpdm1vZHcKICAgIHBvcG4gMgogICAgc3dhcAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODcKICAgIC8vIGFzc2VydChxX2hpID09PSBVaW50NjQoMCksICdNdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyBpbiBtdWxEaXZGbG9vcicpOwogICAgIQogICAgYXNzZXJ0IC8vIE11bHRpcGxpY2F0aW9uIG92ZXJmbG93IGluIG11bERpdkZsb29yCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MTIKICAgIC8vIHJldHVybiBbdXNkY0JhbGFuY2UsIGV4cGVjdGVkT3V0cHV0LCBtaW5BdDUwQnBzXTsKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRDb21wb3VuZFF1b3RlX2FmdGVyX2lubGluZWRfUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5nZXRDb21wb3VuZFF1b3RlQDQKCgovLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo6UmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LnVwZGF0ZU1pblN3YXBUaHJlc2hvbGRbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVNaW5Td2FwVGhyZXNob2xkOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjI0CiAgICAvLyBhc3NlcnQoVHhuLnJla2V5VG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3Jla2V5VG8gbXVzdCBiZSB6ZXJvJyk7CiAgICB0eG4gUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJla2V5VG8gbXVzdCBiZSB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MjUKICAgIC8vIGNvbnN0IGlzQ3JlYXRvciA9IFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvckFkZHJlc3MudmFsdWU7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDcKICAgIC8vIGNyZWF0b3JBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsgICAvLyBWYXVsdCBjcmVhdG9yIHdobyByZWNlaXZlcyBmZWUKICAgIGJ5dGVjXzMgLy8gImNyZWF0b3JBZGRyZXNzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjI1CiAgICAvLyBjb25zdCBpc0NyZWF0b3IgPSBUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3JBZGRyZXNzLnZhbHVlOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MjYKICAgIC8vIGNvbnN0IGlzUmFyZWZpID0gVHhuLnNlbmRlciA9PT0gdGhpcy5yYXJlZmlBZGRyZXNzLnZhbHVlOwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ4CiAgICAvLyByYXJlZmlBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsgICAgLy8gUmFyZUZpIHBsYXRmb3JtIGFkZHJlc3MgKGNhbiBhbHNvIHRyaWdnZXIgc3dhcHMpCiAgICBieXRlYyAxMCAvLyAicmFyZWZpQWRkcmVzcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjYyNgogICAgLy8gY29uc3QgaXNSYXJlZmkgPSBUeG4uc2VuZGVyID09PSB0aGlzLnJhcmVmaUFkZHJlc3MudmFsdWU7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjYyNwogICAgLy8gYXNzZXJ0KGlzQ3JlYXRvciB8fCBpc1JhcmVmaSwgJ09ubHkgY3JlYXRvciBvciBSYXJlRmkgY2FuIHVwZGF0ZScpOwogICAgfHwKICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3Igb3IgUmFyZUZpIGNhbiB1cGRhdGUKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjYyOAogICAgLy8gYXNzZXJ0KG5ld1RocmVzaG9sZCA+PSBNSU5fU1dBUF9BTU9VTlQsICdUaHJlc2hvbGQgdG9vIGxvdycpOwogICAgZHVwCiAgICBpbnRjIDUgLy8gMTAwMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIFRocmVzaG9sZCB0b28gbG93CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MjkKICAgIC8vIGFzc2VydChuZXdUaHJlc2hvbGQgPD0gTUFYX1NXQVBfVEhSRVNIT0xELCAnVGhyZXNob2xkIHRvbyBoaWdoIChtYXggNTAgVVNEQyknKTsKICAgIGR1cAogICAgaW50YyA2IC8vIDUwMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIFRocmVzaG9sZCB0b28gaGlnaCAobWF4IDUwIFVTREMpCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NQogICAgLy8gbWluU3dhcFRocmVzaG9sZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgIC8vIE1pbmltdW0gVVNEQyBiZWZvcmUgc3dhcCBhbGxvd2VkCiAgICBieXRlYyAxMSAvLyAibWluU3dhcFRocmVzaG9sZCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjYzMAogICAgLy8gdGhpcy5taW5Td2FwVGhyZXNob2xkLnZhbHVlID0gbmV3VGhyZXNob2xkOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjYyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo6UmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LnVwZGF0ZU1heFNsaXBwYWdlW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlTWF4U2xpcHBhZ2U6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MzkKICAgIC8vIGFzc2VydChUeG4ucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncmVrZXlUbyBtdXN0IGJlIHplcm8nKTsKICAgIHR4biBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gcmVrZXlUbyBtdXN0IGJlIHplcm8KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY0MAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvckFkZHJlc3MudmFsdWUsICdPbmx5IGNyZWF0b3IgY2FuIHVwZGF0ZSBtYXggc2xpcHBhZ2UnKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NwogICAgLy8gY3JlYXRvckFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOyAgIC8vIFZhdWx0IGNyZWF0b3Igd2hvIHJlY2VpdmVzIGZlZQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvckFkZHJlc3MiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NDAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3JBZGRyZXNzLnZhbHVlLCAnT25seSBjcmVhdG9yIGNhbiB1cGRhdGUgbWF4IHNsaXBwYWdlJyk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIHVwZGF0ZSBtYXggc2xpcHBhZ2UKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY0MQogICAgLy8gYXNzZXJ0KG5ld01heFNsaXBwYWdlQnBzID49IE1JTl9NQVhfU0xJUFBBR0VfQlBTLCAnTWF4IHNsaXBwYWdlIHRvbyBsb3cgKG1pbiA1JSknKTsKICAgIGR1cAogICAgcHVzaGludCA1MDAgLy8gNTAwCiAgICA+PQogICAgYXNzZXJ0IC8vIE1heCBzbGlwcGFnZSB0b28gbG93IChtaW4gNSUpCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NDIKICAgIC8vIGFzc2VydChuZXdNYXhTbGlwcGFnZUJwcyA8PSBNQVhfU0xJUFBBR0VfQlBTLCAnTWF4IHNsaXBwYWdlIHRvbyBoaWdoJyk7CiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBNYXggc2xpcHBhZ2UgdG9vIGhpZ2gKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU2CiAgICAvLyBtYXhTbGlwcGFnZUJwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgLy8gTWF4aW11bSBzbGlwcGFnZSB0b2xlcmFuY2UgaW4gYmFzaXMgcG9pbnRzCiAgICBieXRlYyAxMiAvLyAibWF4U2xpcHBhZ2VCcHMiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NDMKICAgIC8vIHRoaXMubWF4U2xpcHBhZ2VCcHMudmFsdWUgPSBuZXdNYXhTbGlwcGFnZUJwczsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC51cGRhdGVDcmVhdG9yQWRkcmVzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUNyZWF0b3JBZGRyZXNzOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjUyCiAgICAvLyBhc3NlcnQoVHhuLnJla2V5VG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3Jla2V5VG8gbXVzdCBiZSB6ZXJvJyk7CiAgICB0eG4gUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJla2V5VG8gbXVzdCBiZSB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NTMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3JBZGRyZXNzLnZhbHVlLCAnT25seSBjcmVhdG9yIGNhbiB1cGRhdGUnKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NwogICAgLy8gY3JlYXRvckFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOyAgIC8vIFZhdWx0IGNyZWF0b3Igd2hvIHJlY2VpdmVzIGZlZQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvckFkZHJlc3MiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NTMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3JBZGRyZXNzLnZhbHVlLCAnT25seSBjcmVhdG9yIGNhbiB1cGRhdGUnKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gdXBkYXRlCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NTQKICAgIC8vIGFzc2VydChuZXdDcmVhdG9yQWRkcmVzcyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnQ2Fubm90IHNldCB6ZXJvIGFkZHJlc3MnKTsKICAgIGR1cAogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIENhbm5vdCBzZXQgemVybyBhZGRyZXNzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NwogICAgLy8gY3JlYXRvckFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOyAgIC8vIFZhdWx0IGNyZWF0b3Igd2hvIHJlY2VpdmVzIGZlZQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvckFkZHJlc3MiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NTUKICAgIC8vIHRoaXMuY3JlYXRvckFkZHJlc3MudmFsdWUgPSBuZXdDcmVhdG9yQWRkcmVzczsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC51cGRhdGVSYXJlZmlBZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlUmFyZWZpQWRkcmVzczoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY2NAogICAgLy8gYXNzZXJ0KFR4bi5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdyZWtleVRvIG11c3QgYmUgemVybycpOwogICAgdHhuIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWtleVRvIG11c3QgYmUgemVybwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjY1CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5yYXJlZmlBZGRyZXNzLnZhbHVlLCAnT25seSBSYXJlRmkgY2FuIHVwZGF0ZScpOwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ4CiAgICAvLyByYXJlZmlBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsgICAgLy8gUmFyZUZpIHBsYXRmb3JtIGFkZHJlc3MgKGNhbiBhbHNvIHRyaWdnZXIgc3dhcHMpCiAgICBieXRlYyAxMCAvLyAicmFyZWZpQWRkcmVzcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY2NQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMucmFyZWZpQWRkcmVzcy52YWx1ZSwgJ09ubHkgUmFyZUZpIGNhbiB1cGRhdGUnKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgUmFyZUZpIGNhbiB1cGRhdGUKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY2NgogICAgLy8gYXNzZXJ0KG5ld1JhcmVmaUFkZHJlc3MgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ0Nhbm5vdCBzZXQgemVybyBhZGRyZXNzJyk7CiAgICBkdXAKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBDYW5ub3Qgc2V0IHplcm8gYWRkcmVzcwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDgKICAgIC8vIHJhcmVmaUFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOyAgICAvLyBSYXJlRmkgcGxhdGZvcm0gYWRkcmVzcyAoY2FuIGFsc28gdHJpZ2dlciBzd2FwcykKICAgIGJ5dGVjIDEwIC8vICJyYXJlZmlBZGRyZXNzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjY3CiAgICAvLyB0aGlzLnJhcmVmaUFkZHJlc3MudmFsdWUgPSBuZXdSYXJlZmlBZGRyZXNzOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo6UmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LnVwZGF0ZUNyZWF0b3JGZWVSYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQ3JlYXRvckZlZVJhdGU6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NzYKICAgIC8vIGFzc2VydChUeG4ucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncmVrZXlUbyBtdXN0IGJlIHplcm8nKTsKICAgIHR4biBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gcmVrZXlUbyBtdXN0IGJlIHplcm8KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY3NwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvckFkZHJlc3MudmFsdWUsICdPbmx5IGNyZWF0b3IgY2FuIHVwZGF0ZSBmZWUgcmF0ZScpOwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ3CiAgICAvLyBjcmVhdG9yQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCk7ICAgLy8gVmF1bHQgY3JlYXRvciB3aG8gcmVjZWl2ZXMgZmVlCiAgICBieXRlY18zIC8vICJjcmVhdG9yQWRkcmVzcyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY3NwogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvckFkZHJlc3MudmFsdWUsICdPbmx5IGNyZWF0b3IgY2FuIHVwZGF0ZSBmZWUgcmF0ZScpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBjcmVhdG9yIGNhbiB1cGRhdGUgZmVlIHJhdGUKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY3OAogICAgLy8gYXNzZXJ0KG5ld0ZlZVJhdGUgPD0gTUFYX0ZFRV9SQVRFLCAnRmVlIHJhdGUgZXhjZWVkcyBtYXhpbXVtICg2JSknKTsKICAgIGR1cAogICAgcHVzaGludCA2IC8vIDYKICAgIDw9CiAgICBhc3NlcnQgLy8gRmVlIHJhdGUgZXhjZWVkcyBtYXhpbXVtICg2JSkKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ5CiAgICAvLyBjcmVhdG9yRmVlUmF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgLy8gMC0xMDAsIHBlcmNlbnRhZ2Ugb2YgeWllbGQgdG8gY3JlYXRvcgogICAgYnl0ZWMgMTQgLy8gImNyZWF0b3JGZWVSYXRlIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Njc5CiAgICAvLyB0aGlzLmNyZWF0b3JGZWVSYXRlLnZhbHVlID0gbmV3RmVlUmF0ZTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5jb250cmlidXRlRmFybVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyaWJ1dGVGYXJtOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6Njk1CiAgICAvLyBhc3NlcnQoVHhuLnJla2V5VG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3Jla2V5VG8gbXVzdCBiZSB6ZXJvJyk7CiAgICB0eG4gUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJla2V5VG8gbXVzdCBiZSB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2OTYKICAgIC8vIGNvbnN0IGFwcEFkZHI6IEFjY291bnQgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzczsKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2OTcKICAgIC8vIGNvbnN0IGN1cnJlbnRJbmRleCA9IFR4bi5ncm91cEluZGV4OwogICAgdHhuIEdyb3VwSW5kZXgKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY5OAogICAgLy8gYXNzZXJ0KGN1cnJlbnRJbmRleCA+PSBVaW50NjQoMSksICdBcHAgY2FsbCBtdXN0IGZvbGxvdyBhc3NldCB0cmFuc2ZlcicpOwogICAgZHVwCiAgICBhc3NlcnQgLy8gQXBwIGNhbGwgbXVzdCBmb2xsb3cgYXNzZXQgdHJhbnNmZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjcwMQogICAgLy8gY29uc3QgZmFybVRyYW5zZmVyID0gZ3R4bi5Bc3NldFRyYW5zZmVyVHhuKGN1cnJlbnRJbmRleCAtIFVpbnQ2NCgxKSk7CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjcwMgogICAgLy8gYXNzZXJ0KGZhcm1UcmFuc2Zlci54ZmVyQXNzZXQgPT09IEFzc2V0KHRoaXMuYWxwaGFBc3NldC52YWx1ZSksICdNdXN0IHRyYW5zZmVyIEFscGhhIGFzc2V0Jyk7CiAgICBkdXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQzCiAgICAvLyBhbHBoYUFzc2V0ID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAvLyBBbHBoYSBBU0EgSUQgKGRlcG9zaXQgJiB5aWVsZCBhc3NldCkKICAgIGJ5dGVjIDQgLy8gImFscGhhQXNzZXQiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3MDIKICAgIC8vIGFzc2VydChmYXJtVHJhbnNmZXIueGZlckFzc2V0ID09PSBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLCAnTXVzdCB0cmFuc2ZlciBBbHBoYSBhc3NldCcpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTXVzdCB0cmFuc2ZlciBBbHBoYSBhc3NldAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzAzCiAgICAvLyBhc3NlcnQoZmFybVRyYW5zZmVyLmFzc2V0UmVjZWl2ZXIgPT09IGFwcEFkZHIsICdNdXN0IHNlbmQgdG8gY29udHJhY3QnKTsKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIE11c3Qgc2VuZCB0byBjb250cmFjdAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzA0CiAgICAvLyBhc3NlcnQoZmFybVRyYW5zZmVyLnNlbmRlciA9PT0gVHhuLnNlbmRlciwgJ1RyYW5zZmVyIG11c3QgYmUgZnJvbSBjYWxsZXInKTsKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIFRyYW5zZmVyIG11c3QgYmUgZnJvbSBjYWxsZXIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjcwNwogICAgLy8gYXNzZXJ0KGZhcm1UcmFuc2Zlci5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdyZWtleVRvIG11c3QgYmUgemVybycpOwogICAgZHVwCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gcmVrZXlUbyBtdXN0IGJlIHplcm8KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjcwOAogICAgLy8gYXNzZXJ0KGZhcm1UcmFuc2Zlci5hc3NldENsb3NlVG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2Fzc2V0Q2xvc2VUbyBtdXN0IGJlIHplcm8nKTsKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXRDbG9zZVRvIG11c3QgYmUgemVybwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzEwCiAgICAvLyBjb25zdCBhbW91bnQgPSBmYXJtVHJhbnNmZXIuYXNzZXRBbW91bnQ7CiAgICBndHhucyBBc3NldEFtb3VudAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzExCiAgICAvLyBhc3NlcnQoYW1vdW50ID4gVWludDY0KDApLCAnQ29udHJpYnV0aW9uIG11c3QgYmUgcG9zaXRpdmUnKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIENvbnRyaWJ1dGlvbiBtdXN0IGJlIHBvc2l0aXZlCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3MTQKICAgIC8vIHRoaXMuZmFybUJhbGFuY2UudmFsdWUgPSB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlICsgYW1vdW50OwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY0CiAgICAvLyBmYXJtQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgICAvLyBUb3RhbCBBbHBoYSBhdmFpbGFibGUgZm9yIGZhcm0gYm9udXMKICAgIGJ5dGVjXzIgLy8gImZhcm1CYWxhbmNlIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzE0CiAgICAvLyB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlID0gdGhpcy5mYXJtQmFsYW5jZS52YWx1ZSArIGFtb3VudDsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICArCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NAogICAgLy8gZmFybUJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAgLy8gVG90YWwgQWxwaGEgYXZhaWxhYmxlIGZvciBmYXJtIGJvbnVzCiAgICBieXRlY18yIC8vICJmYXJtQmFsYW5jZSIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjcxNAogICAgLy8gdGhpcy5mYXJtQmFsYW5jZS52YWx1ZSA9IHRoaXMuZmFybUJhbGFuY2UudmFsdWUgKyBhbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjpSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuc2V0RW1pc3Npb25SYXRpb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldEVtaXNzaW9uUmF0aW86CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3MjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3MjYKICAgIC8vIGFzc2VydChUeG4ucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncmVrZXlUbyBtdXN0IGJlIHplcm8nKTsKICAgIHR4biBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gcmVrZXlUbyBtdXN0IGJlIHplcm8KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjcyNwogICAgLy8gY29uc3QgaXNDcmVhdG9yID0gVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yQWRkcmVzcy52YWx1ZTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo0NwogICAgLy8gY3JlYXRvckFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOyAgIC8vIFZhdWx0IGNyZWF0b3Igd2hvIHJlY2VpdmVzIGZlZQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvckFkZHJlc3MiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3MjcKICAgIC8vIGNvbnN0IGlzQ3JlYXRvciA9IFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvckFkZHJlc3MudmFsdWU7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjcyOAogICAgLy8gY29uc3QgaXNSYXJlZmkgPSBUeG4uc2VuZGVyID09PSB0aGlzLnJhcmVmaUFkZHJlc3MudmFsdWU7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDgKICAgIC8vIHJhcmVmaUFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOyAgICAvLyBSYXJlRmkgcGxhdGZvcm0gYWRkcmVzcyAoY2FuIGFsc28gdHJpZ2dlciBzd2FwcykKICAgIGJ5dGVjIDEwIC8vICJyYXJlZmlBZGRyZXNzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzI4CiAgICAvLyBjb25zdCBpc1JhcmVmaSA9IFR4bi5zZW5kZXIgPT09IHRoaXMucmFyZWZpQWRkcmVzcy52YWx1ZTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzI5CiAgICAvLyBhc3NlcnQoaXNDcmVhdG9yIHx8IGlzUmFyZWZpLCAnT25seSBjcmVhdG9yIG9yIFJhcmVGaSBjYW4gc2V0IGVtaXNzaW9uIHJhdGlvJyk7CiAgICB8fAogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBvciBSYXJlRmkgY2FuIHNldCBlbWlzc2lvbiByYXRpbwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzMwCiAgICAvLyBhc3NlcnQobmV3UmF0aW8gPiBVaW50NjQoMCksICdFbWlzc2lvbiByYXRpbyBtdXN0IGJlIHBvc2l0aXZlJyk7CiAgICBkdXAKICAgIGFzc2VydCAvLyBFbWlzc2lvbiByYXRpbyBtdXN0IGJlIHBvc2l0aXZlCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NQogICAgLy8gZW1pc3Npb25SYXRpbyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgLy8gTXVsdGlwbGllciBmb3IgZHluYW1pYyByYXRlOiByYXRlID0gZmFybUJhbGFuY2UgKiBlbWlzc2lvblJhdGlvIC8gdG90YWxBbHBoYQogICAgYnl0ZWMgOSAvLyAiZW1pc3Npb25SYXRpbyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjczMgogICAgLy8gdGhpcy5lbWlzc2lvblJhdGlvLnZhbHVlID0gbmV3UmF0aW87CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjpSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuZ2V0RmFybVN0YXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0RmFybVN0YXRzOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzQxCiAgICAvLyBsZXQgY3VycmVudFJhdGU6IHVpbnQ2NCA9IFVpbnQ2NCgwKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NDIKICAgIC8vIGlmICh0aGlzLmVtaXNzaW9uUmF0aW8udmFsdWUgPiBVaW50NjQoMCkgJiYgdGhpcy5mYXJtQmFsYW5jZS52YWx1ZSA+IFVpbnQ2NCgwKSkgewogICAgZHVwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NQogICAgLy8gZW1pc3Npb25SYXRpbyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgLy8gTXVsdGlwbGllciBmb3IgZHluYW1pYyByYXRlOiByYXRlID0gZmFybUJhbGFuY2UgKiBlbWlzc2lvblJhdGlvIC8gdG90YWxBbHBoYQogICAgYnl0ZWMgOSAvLyAiZW1pc3Npb25SYXRpbyIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjc0MgogICAgLy8gaWYgKHRoaXMuZW1pc3Npb25SYXRpby52YWx1ZSA+IFVpbnQ2NCgwKSAmJiB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlID4gVWludDY0KDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZ2V0RmFybVN0YXRzX2FmdGVyX2lmX2Vsc2VANAogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY0CiAgICAvLyBmYXJtQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgICAvLyBUb3RhbCBBbHBoYSBhdmFpbGFibGUgZm9yIGZhcm0gYm9udXMKICAgIGJ5dGVjXzIgLy8gImZhcm1CYWxhbmNlIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NzQyCiAgICAvLyBpZiAodGhpcy5lbWlzc2lvblJhdGlvLnZhbHVlID4gVWludDY0KDApICYmIHRoaXMuZmFybUJhbGFuY2UudmFsdWUgPiBVaW50NjQoMCkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieiBnZXRGYXJtU3RhdHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NDMKICAgIC8vIGN1cnJlbnRSYXRlID0gdGhpcy5jYWxjdWxhdGVEeW5hbWljRW1pc3Npb25SYXRlKCk7CiAgICBjYWxsc3ViIGNhbGN1bGF0ZUR5bmFtaWNFbWlzc2lvblJhdGUKICAgIGJ1cnkgMQoKZ2V0RmFybVN0YXRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjc0NQogICAgLy8gcmV0dXJuIFt0aGlzLmZhcm1CYWxhbmNlLnZhbHVlLCB0aGlzLmVtaXNzaW9uUmF0aW8udmFsdWUsIGN1cnJlbnRSYXRlXTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NAogICAgLy8gZmFybUJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAgLy8gVG90YWwgQWxwaGEgYXZhaWxhYmxlIGZvciBmYXJtIGJvbnVzCiAgICBieXRlY18yIC8vICJmYXJtQmFsYW5jZSIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjc0NQogICAgLy8gcmV0dXJuIFt0aGlzLmZhcm1CYWxhbmNlLnZhbHVlLCB0aGlzLmVtaXNzaW9uUmF0aW8udmFsdWUsIGN1cnJlbnRSYXRlXTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjUKICAgIC8vIGVtaXNzaW9uUmF0aW8gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIE11bHRpcGxpZXIgZm9yIGR5bmFtaWMgcmF0ZTogcmF0ZSA9IGZhcm1CYWxhbmNlICogZW1pc3Npb25SYXRpbyAvIHRvdGFsQWxwaGEKICAgIGJ5dGVjIDkgLy8gImVtaXNzaW9uUmF0aW8iCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3NDUKICAgIC8vIHJldHVybiBbdGhpcy5mYXJtQmFsYW5jZS52YWx1ZSwgdGhpcy5lbWlzc2lvblJhdGlvLnZhbHVlLCBjdXJyZW50UmF0ZV07CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo3MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5jYWxjdWxhdGVEeW5hbWljRW1pc3Npb25SYXRlKCkgLT4gdWludDY0OgpjYWxjdWxhdGVEeW5hbWljRW1pc3Npb25SYXRlOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OTUKICAgIC8vIHByaXZhdGUgY2FsY3VsYXRlRHluYW1pY0VtaXNzaW9uUmF0ZSgpOiB1aW50NjQgewogICAgcHJvdG8gMCAxCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo5NgogICAgLy8gY29uc3QgdG90YWxEZXBvc2l0ZWQgPSB0aGlzLnRvdGFsQWxwaGEudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OTYKICAgIC8vIGNvbnN0IHRvdGFsRGVwb3NpdGVkID0gdGhpcy50b3RhbEFscGhhLnZhbHVlOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo5OAogICAgLy8gaWYgKHRvdGFsRGVwb3NpdGVkID09PSBVaW50NjQoMCkgfHwgdGhpcy5mYXJtQmFsYW5jZS52YWx1ZSA9PT0gVWludDY0KDApKSB7CiAgICBieiBjYWxjdWxhdGVEeW5hbWljRW1pc3Npb25SYXRlX2lmX2JvZHlAMgogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY0CiAgICAvLyBmYXJtQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgICAvLyBUb3RhbCBBbHBoYSBhdmFpbGFibGUgZm9yIGZhcm0gYm9udXMKICAgIGJ5dGVjXzIgLy8gImZhcm1CYWxhbmNlIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OTgKICAgIC8vIGlmICh0b3RhbERlcG9zaXRlZCA9PT0gVWludDY0KDApIHx8IHRoaXMuZmFybUJhbGFuY2UudmFsdWUgPT09IFVpbnQ2NCgwKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJueiBjYWxjdWxhdGVEeW5hbWljRW1pc3Npb25SYXRlX2FmdGVyX2lmX2Vsc2VAMwoKY2FsY3VsYXRlRHluYW1pY0VtaXNzaW9uUmF0ZV9pZl9ib2R5QDI6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo5OQogICAgLy8gcmV0dXJuIFVpbnQ2NCgwKTsKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICByZXRzdWIKCmNhbGN1bGF0ZUR5bmFtaWNFbWlzc2lvblJhdGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTAyCiAgICAvLyBjb25zdCBkeW5hbWljUmF0ZSA9IHRoaXMubXVsRGl2Rmxvb3IodGhpcy5mYXJtQmFsYW5jZS52YWx1ZSwgdGhpcy5lbWlzc2lvblJhdGlvLnZhbHVlLCB0b3RhbERlcG9zaXRlZCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjQKICAgIC8vIGZhcm1CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAgIC8vIFRvdGFsIEFscGhhIGF2YWlsYWJsZSBmb3IgZmFybSBib251cwogICAgYnl0ZWNfMiAvLyAiZmFybUJhbGFuY2UiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxMDIKICAgIC8vIGNvbnN0IGR5bmFtaWNSYXRlID0gdGhpcy5tdWxEaXZGbG9vcih0aGlzLmZhcm1CYWxhbmNlLnZhbHVlLCB0aGlzLmVtaXNzaW9uUmF0aW8udmFsdWUsIHRvdGFsRGVwb3NpdGVkKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjUKICAgIC8vIGVtaXNzaW9uUmF0aW8gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIE11bHRpcGxpZXIgZm9yIGR5bmFtaWMgcmF0ZTogcmF0ZSA9IGZhcm1CYWxhbmNlICogZW1pc3Npb25SYXRpbyAvIHRvdGFsQWxwaGEKICAgIGJ5dGVjIDkgLy8gImVtaXNzaW9uUmF0aW8iCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxMDIKICAgIC8vIGNvbnN0IGR5bmFtaWNSYXRlID0gdGhpcy5tdWxEaXZGbG9vcih0aGlzLmZhcm1CYWxhbmNlLnZhbHVlLCB0aGlzLmVtaXNzaW9uUmF0aW8udmFsdWUsIHRvdGFsRGVwb3NpdGVkKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NQogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KG4xLCBuMik7CiAgICBtdWx3CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NgogICAgLy8gY29uc3QgW3FfaGksIHFfbG8sIF9yX2hpLCBfcl9sb10gPSBkaXZtb2R3KGhpLCBsbywgVWludDY0KDApLCBkKTsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgMAogICAgZGl2bW9kdwogICAgcG9wbiAyCiAgICBzd2FwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NwogICAgLy8gYXNzZXJ0KHFfaGkgPT09IFVpbnQ2NCgwKSwgJ011bHRpcGxpY2F0aW9uIG92ZXJmbG93IGluIG11bERpdkZsb29yJyk7CiAgICAhCiAgICBhc3NlcnQgLy8gTXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgaW4gbXVsRGl2Rmxvb3IKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjEwNAogICAgLy8gcmV0dXJuIGR5bmFtaWNSYXRlIDwgTUlOX0ZBUk1fRU1JU1NJT05fQlBTID8gTUlOX0ZBUk1fRU1JU1NJT05fQlBTIDogZHluYW1pY1JhdGU7CiAgICBkdXAKICAgIHB1c2hpbnQgMTAwMCAvLyAxMDAwCiAgICA8CiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgc3dhcAogICAgc2VsZWN0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo6UmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFscGhhVG9TaGFyZXMoYWxwaGFBbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgphbHBoYVRvU2hhcmVzOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTEyCiAgICAvLyBwcml2YXRlIGFscGhhVG9TaGFyZXMoYWxwaGFBbW91bnQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjExMwogICAgLy8gaWYgKHRoaXMudG90YWxTaGFyZXMudmFsdWUgPT09IFVpbnQ2NCgwKSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUzCiAgICAvLyB0b3RhbFNoYXJlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgLy8gVG90YWwgc2hhcmVzIGlzc3VlZCB0byBhbGwgZGVwb3NpdG9ycwogICAgYnl0ZWNfMCAvLyAidG90YWxTaGFyZXMiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxMTMKICAgIC8vIGlmICh0aGlzLnRvdGFsU2hhcmVzLnZhbHVlID09PSBVaW50NjQoMCkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBibnogYWxwaGFUb1NoYXJlc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjExNQogICAgLy8gcmV0dXJuIGFscGhhQW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCmFscGhhVG9TaGFyZXNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTE3CiAgICAvLyByZXR1cm4gdGhpcy5tdWxEaXZGbG9vcihhbHBoYUFtb3VudCwgdGhpcy50b3RhbFNoYXJlcy52YWx1ZSwgdGhpcy50b3RhbEFscGhhLnZhbHVlKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MwogICAgLy8gdG90YWxTaGFyZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIFRvdGFsIHNoYXJlcyBpc3N1ZWQgdG8gYWxsIGRlcG9zaXRvcnMKICAgIGJ5dGVjXzAgLy8gInRvdGFsU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTE3CiAgICAvLyByZXR1cm4gdGhpcy5tdWxEaXZGbG9vcihhbHBoYUFtb3VudCwgdGhpcy50b3RhbFNoYXJlcy52YWx1ZSwgdGhpcy50b3RhbEFscGhhLnZhbHVlKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTE3CiAgICAvLyByZXR1cm4gdGhpcy5tdWxEaXZGbG9vcihhbHBoYUFtb3VudCwgdGhpcy50b3RhbFNoYXJlcy52YWx1ZSwgdGhpcy50b3RhbEFscGhhLnZhbHVlKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NQogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KG4xLCBuMik7CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgbXVsdwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IFtxX2hpLCBxX2xvLCBfcl9oaSwgX3JfbG9dID0gZGl2bW9kdyhoaSwgbG8sIFVpbnQ2NCgwKSwgZCk7CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBkaXZtb2R3CiAgICBwb3BuIDIKICAgIHN3YXAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg3CiAgICAvLyBhc3NlcnQocV9oaSA9PT0gVWludDY0KDApLCAnTXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgaW4gbXVsRGl2Rmxvb3InKTsKICAgICEKICAgIGFzc2VydCAvLyBNdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyBpbiBtdWxEaXZGbG9vcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTE3CiAgICAvLyByZXR1cm4gdGhpcy5tdWxEaXZGbG9vcihhbHBoYUFtb3VudCwgdGhpcy50b3RhbFNoYXJlcy52YWx1ZSwgdGhpcy50b3RhbEFscGhhLnZhbHVlKTsKICAgIHJldHN1YgoKCi8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjpSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuc2hhcmVzVG9BbHBoYShzaGFyZXM6IHVpbnQ2NCkgLT4gdWludDY0OgpzaGFyZXNUb0FscGhhOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTI0CiAgICAvLyBwcml2YXRlIHNoYXJlc1RvQWxwaGEoc2hhcmVzOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxMjUKICAgIC8vIGlmICh0aGlzLnRvdGFsU2hhcmVzLnZhbHVlID09PSBVaW50NjQoMCkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MwogICAgLy8gdG90YWxTaGFyZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIFRvdGFsIHNoYXJlcyBpc3N1ZWQgdG8gYWxsIGRlcG9zaXRvcnMKICAgIGJ5dGVjXzAgLy8gInRvdGFsU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTI1CiAgICAvLyBpZiAodGhpcy50b3RhbFNoYXJlcy52YWx1ZSA9PT0gVWludDY0KDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYm56IHNoYXJlc1RvQWxwaGFfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxMjYKICAgIC8vIHJldHVybiBVaW50NjQoMCk7CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpzaGFyZXNUb0FscGhhX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjEyOAogICAgLy8gcmV0dXJuIHRoaXMubXVsRGl2Rmxvb3Ioc2hhcmVzLCB0aGlzLnRvdGFsQWxwaGEudmFsdWUsIHRoaXMudG90YWxTaGFyZXMudmFsdWUpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjU0CiAgICAvLyB0b3RhbEFscGhhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAgLy8gVG90YWwgQWxwaGEgaGVsZCAoZGVwb3NpdHMgKyBjb21wb3VuZGVkIHlpZWxkKQogICAgYnl0ZWNfMSAvLyAidG90YWxBbHBoYSIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjEyOAogICAgLy8gcmV0dXJuIHRoaXMubXVsRGl2Rmxvb3Ioc2hhcmVzLCB0aGlzLnRvdGFsQWxwaGEudmFsdWUsIHRoaXMudG90YWxTaGFyZXMudmFsdWUpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MwogICAgLy8gdG90YWxTaGFyZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIFRvdGFsIHNoYXJlcyBpc3N1ZWQgdG8gYWxsIGRlcG9zaXRvcnMKICAgIGJ5dGVjXzAgLy8gInRvdGFsU2hhcmVzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTI4CiAgICAvLyByZXR1cm4gdGhpcy5tdWxEaXZGbG9vcihzaGFyZXMsIHRoaXMudG90YWxBbHBoYS52YWx1ZSwgdGhpcy50b3RhbFNoYXJlcy52YWx1ZSk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODUKICAgIC8vIGNvbnN0IFtoaSwgbG9dID0gbXVsdyhuMSwgbjIpOwogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIG11bHcKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg2CiAgICAvLyBjb25zdCBbcV9oaSwgcV9sbywgX3JfaGksIF9yX2xvXSA9IGRpdm1vZHcoaGksIGxvLCBVaW50NjQoMCksIGQpOwogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgZGl2bW9kdwogICAgcG9wbiAyCiAgICBzd2FwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NwogICAgLy8gYXNzZXJ0KHFfaGkgPT09IFVpbnQ2NCgwKSwgJ011bHRpcGxpY2F0aW9uIG92ZXJmbG93IGluIG11bERpdkZsb29yJyk7CiAgICAhCiAgICBhc3NlcnQgLy8gTXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgaW4gbXVsRGl2Rmxvb3IKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjEyOAogICAgLy8gcmV0dXJuIHRoaXMubXVsRGl2Rmxvb3Ioc2hhcmVzLCB0aGlzLnRvdGFsQWxwaGEudmFsdWUsIHRoaXMudG90YWxTaGFyZXMudmFsdWUpOwogICAgcmV0c3ViCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5nZXRFeHBlY3RlZFN3YXBPdXRwdXQoaW5wdXRBbW91bnQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRFeHBlY3RlZFN3YXBPdXRwdXQ6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxMzUKICAgIC8vIHByaXZhdGUgZ2V0RXhwZWN0ZWRTd2FwT3V0cHV0KGlucHV0QW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjEzNgogICAgLy8gY29uc3QgcG9vbEFwcCA9IHRoaXMudGlueW1hblBvb2xBcHBJZC52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MAogICAgLy8gdGlueW1hblBvb2xBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgIC8vIFRpbnltYW4gVjIgcG9vbCBhcHAgSUQKICAgIGJ5dGVjIDE1IC8vICJ0aW55bWFuUG9vbEFwcElkIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTM2CiAgICAvLyBjb25zdCBwb29sQXBwID0gdGhpcy50aW55bWFuUG9vbEFwcElkLnZhbHVlOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjEzNwogICAgLy8gY29uc3QgcG9vbEFkZHIgPSB0aGlzLnRpbnltYW5Qb29sQWRkcmVzcy52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2MQogICAgLy8gdGlueW1hblBvb2xBZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsgLy8gVGlueW1hbiBwb29sIGFkZHJlc3MKICAgIGJ5dGVjIDE2IC8vICJ0aW55bWFuUG9vbEFkZHJlc3MiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxMzcKICAgIC8vIGNvbnN0IHBvb2xBZGRyID0gdGhpcy50aW55bWFuUG9vbEFkZHJlc3MudmFsdWU7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTQwCiAgICAvLyBjb25zdCBbYXNzZXQxSWQsIGhhc0Fzc2V0MUlkXSA9IEFwcExvY2FsLmdldEV4VWludDY0KHBvb2xBZGRyLCBwb29sQXBwLCBCeXRlcygnYXNzZXRfMV9pZCcpKTsKICAgIGR1cAogICAgZGlnIDIKICAgIHB1c2hieXRlcyAiYXNzZXRfMV9pZCIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE0MQogICAgLy8gYXNzZXJ0KGhhc0Fzc2V0MUlkLCAnQ2Fubm90IHJlYWQgcG9vbCBhc3NldF8xX2lkJyk7CiAgICBhc3NlcnQgLy8gQ2Fubm90IHJlYWQgcG9vbCBhc3NldF8xX2lkCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxNDMKICAgIC8vIGNvbnN0IFthc3NldDFSZXNlcnZlcywgaGFzQXNzZXQxUmVzZXJ2ZXNdID0gQXBwTG9jYWwuZ2V0RXhVaW50NjQocG9vbEFkZHIsIHBvb2xBcHAsIEJ5dGVzKCdhc3NldF8xX3Jlc2VydmVzJykpOwogICAgZGlnIDEKICAgIGRpZyAzCiAgICBwdXNoYnl0ZXMgImFzc2V0XzFfcmVzZXJ2ZXMiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciA0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxNDQKICAgIC8vIGFzc2VydChoYXNBc3NldDFSZXNlcnZlcywgJ0Nhbm5vdCByZWFkIHBvb2wgYXNzZXRfMV9yZXNlcnZlcycpOwogICAgYXNzZXJ0IC8vIENhbm5vdCByZWFkIHBvb2wgYXNzZXRfMV9yZXNlcnZlcwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTQ2CiAgICAvLyBjb25zdCBbYXNzZXQyUmVzZXJ2ZXMsIGhhc0Fzc2V0MlJlc2VydmVzXSA9IEFwcExvY2FsLmdldEV4VWludDY0KHBvb2xBZGRyLCBwb29sQXBwLCBCeXRlcygnYXNzZXRfMl9yZXNlcnZlcycpKTsKICAgIGRpZyAxCiAgICBkaWcgMwogICAgcHVzaGJ5dGVzICJhc3NldF8yX3Jlc2VydmVzIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgNAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTQ3CiAgICAvLyBhc3NlcnQoaGFzQXNzZXQyUmVzZXJ2ZXMsICdDYW5ub3QgcmVhZCBwb29sIGFzc2V0XzJfcmVzZXJ2ZXMnKTsKICAgIGFzc2VydCAvLyBDYW5ub3QgcmVhZCBwb29sIGFzc2V0XzJfcmVzZXJ2ZXMKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE0OQogICAgLy8gY29uc3QgW3RvdGFsRmVlU2hhcmUsIGhhc1RvdGFsRmVlU2hhcmVdID0gQXBwTG9jYWwuZ2V0RXhVaW50NjQocG9vbEFkZHIsIHBvb2xBcHAsIEJ5dGVzKCd0b3RhbF9mZWVfc2hhcmUnKSk7CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hieXRlcyAidG90YWxfZmVlX3NoYXJlIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTUwCiAgICAvLyBhc3NlcnQoaGFzVG90YWxGZWVTaGFyZSwgJ0Nhbm5vdCByZWFkIHBvb2wgdG90YWxfZmVlX3NoYXJlJyk7CiAgICBhc3NlcnQgLy8gQ2Fubm90IHJlYWQgcG9vbCB0b3RhbF9mZWVfc2hhcmUKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE1NgogICAgLy8gaWYgKGFzc2V0MUlkID09PSB0aGlzLnVzZGNBc3NldC52YWx1ZSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ0CiAgICAvLyB1c2RjQXNzZXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBVU0RDIEFTQSBJRCAoYWlyZHJvcHMgY29tZSBpbiBhcyB0aGlzKQogICAgYnl0ZWMgNSAvLyAidXNkY0Fzc2V0IgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTU2CiAgICAvLyBpZiAoYXNzZXQxSWQgPT09IHRoaXMudXNkY0Fzc2V0LnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGJ6IGdldEV4cGVjdGVkU3dhcE91dHB1dF9lbHNlX2JvZHlAMgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAoKZ2V0RXhwZWN0ZWRTd2FwT3V0cHV0X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE2OAogICAgLy8gY29uc3QgbmV0SW5wdXQgPSB0aGlzLm11bERpdkZsb29yKGlucHV0QW1vdW50LCBGRUVfQlBTX0JBU0UgLSBmZWVCcHMsIEZFRV9CUFNfQkFTRSk7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIGZyYW1lX2RpZyAyCiAgICAtCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NQogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KG4xLCBuMik7CiAgICBmcmFtZV9kaWcgLTEKICAgIG11bHcKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg2CiAgICAvLyBjb25zdCBbcV9oaSwgcV9sbywgX3JfaGksIF9yX2xvXSA9IGRpdm1vZHcoaGksIGxvLCBVaW50NjQoMCksIGQpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE2OAogICAgLy8gY29uc3QgbmV0SW5wdXQgPSB0aGlzLm11bERpdkZsb29yKGlucHV0QW1vdW50LCBGRUVfQlBTX0JBU0UgLSBmZWVCcHMsIEZFRV9CUFNfQkFTRSk7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg2CiAgICAvLyBjb25zdCBbcV9oaSwgcV9sbywgX3JfaGksIF9yX2xvXSA9IGRpdm1vZHcoaGksIGxvLCBVaW50NjQoMCksIGQpOwogICAgZGl2bW9kdwogICAgcG9wbiAyCiAgICBzd2FwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NwogICAgLy8gYXNzZXJ0KHFfaGkgPT09IFVpbnQ2NCgwKSwgJ011bHRpcGxpY2F0aW9uIG92ZXJmbG93IGluIG11bERpdkZsb29yJyk7CiAgICAhCiAgICBhc3NlcnQgLy8gTXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgaW4gbXVsRGl2Rmxvb3IKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE3MQogICAgLy8gY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSB0aGlzLm11bERpdkZsb29yKG91dHB1dFJlc2VydmVzLCBuZXRJbnB1dCwgaW5wdXRSZXNlcnZlcyArIG5ldElucHV0KTsKICAgIGZyYW1lX2RpZyAwCiAgICBkaWcgMQogICAgKwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODUKICAgIC8vIGNvbnN0IFtoaSwgbG9dID0gbXVsdyhuMSwgbjIpOwogICAgY292ZXIgMgogICAgbXVsdwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IFtxX2hpLCBxX2xvLCBfcl9oaSwgX3JfbG9dID0gZGl2bW9kdyhoaSwgbG8sIFVpbnQ2NCgwKSwgZCk7CiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBkaXZtb2R3CiAgICBwb3BuIDIKICAgIHN3YXAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg3CiAgICAvLyBhc3NlcnQocV9oaSA9PT0gVWludDY0KDApLCAnTXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgaW4gbXVsRGl2Rmxvb3InKTsKICAgICEKICAgIGFzc2VydCAvLyBNdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyBpbiBtdWxEaXZGbG9vcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTczCiAgICAvLyByZXR1cm4gZXhwZWN0ZWRPdXRwdXQ7CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0RXhwZWN0ZWRTd2FwT3V0cHV0X2Vsc2VfYm9keUAyOgogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgMQogICAgYiBnZXRFeHBlY3RlZFN3YXBPdXRwdXRfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6OlJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5leGVjdXRlQ29tcG91bmQodXNkY0JhbGFuY2U6IHVpbnQ2NCwgc2xpcHBhZ2VCcHM6IHVpbnQ2NCkgLT4gdm9pZDoKZXhlY3V0ZUNvbXBvdW5kOgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTgwCiAgICAvLyBwcml2YXRlIGV4ZWN1dGVDb21wb3VuZCh1c2RjQmFsYW5jZTogdWludDY0LCBzbGlwcGFnZUJwczogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTgxCiAgICAvLyBjb25zdCBhcHBBZGRyOiBBY2NvdW50ID0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3M7CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTg0CiAgICAvLyBjb25zdCBleHBlY3RlZE91dHB1dCA9IHRoaXMuZ2V0RXhwZWN0ZWRTd2FwT3V0cHV0KHVzZGNCYWxhbmNlKTsKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBnZXRFeHBlY3RlZFN3YXBPdXRwdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE4NQogICAgLy8gYXNzZXJ0KGV4cGVjdGVkT3V0cHV0ID4gVWludDY0KDApLCAnRXhwZWN0ZWQgb3V0cHV0IGlzIHplcm8nKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIEV4cGVjdGVkIG91dHB1dCBpcyB6ZXJvCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxODgKICAgIC8vIGNvbnN0IG1pbkFtb3VudE91dCA9IHRoaXMubXVsRGl2Rmxvb3IoZXhwZWN0ZWRPdXRwdXQsIEZFRV9CUFNfQkFTRSAtIHNsaXBwYWdlQnBzLCBGRUVfQlBTX0JBU0UpOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg1CiAgICAvLyBjb25zdCBbaGksIGxvXSA9IG11bHcobjEsIG4yKTsKICAgIG11bHcKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg2CiAgICAvLyBjb25zdCBbcV9oaSwgcV9sbywgX3JfaGksIF9yX2xvXSA9IGRpdm1vZHcoaGksIGxvLCBVaW50NjQoMCksIGQpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE4OAogICAgLy8gY29uc3QgbWluQW1vdW50T3V0ID0gdGhpcy5tdWxEaXZGbG9vcihleHBlY3RlZE91dHB1dCwgRkVFX0JQU19CQVNFIC0gc2xpcHBhZ2VCcHMsIEZFRV9CUFNfQkFTRSk7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg2CiAgICAvLyBjb25zdCBbcV9oaSwgcV9sbywgX3JfaGksIF9yX2xvXSA9IGRpdm1vZHcoaGksIGxvLCBVaW50NjQoMCksIGQpOwogICAgZGl2bW9kdwogICAgcG9wbiAyCiAgICBjb3ZlciAyCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NwogICAgLy8gYXNzZXJ0KHFfaGkgPT09IFVpbnQ2NCgwKSwgJ011bHRpcGxpY2F0aW9uIG92ZXJmbG93IGluIG11bERpdkZsb29yJyk7CiAgICAhCiAgICBhc3NlcnQgLy8gTXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgaW4gbXVsRGl2Rmxvb3IKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE5MQogICAgLy8gY29uc3QgYWxwaGFCZWZvcmUgPSBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLmJhbGFuY2UoYXBwQWRkcik7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NDMKICAgIC8vIGFscGhhQXNzZXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIEFscGhhIEFTQSBJRCAoZGVwb3NpdCAmIHlpZWxkIGFzc2V0KQogICAgYnl0ZWMgNCAvLyAiYWxwaGFBc3NldCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE5MQogICAgLy8gY29uc3QgYWxwaGFCZWZvcmUgPSBBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpLmJhbGFuY2UoYXBwQWRkcik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxOTQtMjA4CiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKAogICAgLy8gICBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMudGlueW1hblBvb2xBZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHhmZXJBc3NldDogQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiB1c2RjQmFsYW5jZSwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSksCiAgICAvLyAgIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogQXBwbGljYXRpb24odGhpcy50aW55bWFuUG9vbEFwcElkLnZhbHVlKSwKICAgIC8vICAgICBhcHBBcmdzOiBbQnl0ZXMoJ3N3YXAnKSwgQnl0ZXMoJ2ZpeGVkLWlucHV0JyksIGl0b2IobWluQW1vdW50T3V0KV0sCiAgICAvLyAgICAgYXNzZXRzOiBbQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKV0sCiAgICAvLyAgICAgYWNjb3VudHM6IFt0aGlzLnRpbnltYW5Qb29sQWRkcmVzcy52YWx1ZV0sCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pLAogICAgLy8gKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE5NgogICAgLy8gYXNzZXRSZWNlaXZlcjogdGhpcy50aW55bWFuUG9vbEFkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjEKICAgIC8vIHRpbnltYW5Qb29sQWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCk7IC8vIFRpbnltYW4gcG9vbCBhZGRyZXNzCiAgICBieXRlYyAxNiAvLyAidGlueW1hblBvb2xBZGRyZXNzIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTk2CiAgICAvLyBhc3NldFJlY2VpdmVyOiB0aGlzLnRpbnltYW5Qb29sQWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoxOTcKICAgIC8vIHhmZXJBc3NldDogQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ0CiAgICAvLyB1c2RjQXNzZXQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBVU0RDIEFTQSBJRCAoYWlyZHJvcHMgY29tZSBpbiBhcyB0aGlzKQogICAgYnl0ZWMgNSAvLyAidXNkY0Fzc2V0IgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTk3CiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMudXNkY0Fzc2V0LnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTk1LTIwMAogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogdGhpcy50aW55bWFuUG9vbEFkZHJlc3MudmFsdWUsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy51c2RjQXNzZXQudmFsdWUpLAogICAgLy8gICBhc3NldEFtb3VudDogdXNkY0JhbGFuY2UsCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSksCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MTk5CiAgICAvLyBmZWU6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjAxLTIwNwogICAgLy8gaXR4bi5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICBhcHBJZDogQXBwbGljYXRpb24odGhpcy50aW55bWFuUG9vbEFwcElkLnZhbHVlKSwKICAgIC8vICAgYXBwQXJnczogW0J5dGVzKCdzd2FwJyksIEJ5dGVzKCdmaXhlZC1pbnB1dCcpLCBpdG9iKG1pbkFtb3VudE91dCldLAogICAgLy8gICBhc3NldHM6IFtBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpXSwKICAgIC8vICAgYWNjb3VudHM6IFt0aGlzLnRpbnltYW5Qb29sQWRkcmVzcy52YWx1ZV0sCiAgICAvLyAgIGZlZTogVWludDY0KDApLAogICAgLy8gfSksCiAgICBpdHhuX25leHQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIwMgogICAgLy8gYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMudGlueW1hblBvb2xBcHBJZC52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjAKICAgIC8vIHRpbnltYW5Qb29sQXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAvLyBUaW55bWFuIFYyIHBvb2wgYXBwIElECiAgICBieXRlYyAxNSAvLyAidGlueW1hblBvb2xBcHBJZCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIwMgogICAgLy8gYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMudGlueW1hblBvb2xBcHBJZC52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjAzCiAgICAvLyBhcHBBcmdzOiBbQnl0ZXMoJ3N3YXAnKSwgQnl0ZXMoJ2ZpeGVkLWlucHV0JyksIGl0b2IobWluQW1vdW50T3V0KV0sCiAgICBkaWcgNQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFjY291bnRzCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBBc3NldHMKICAgIHB1c2hieXRlcyAic3dhcCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgImZpeGVkLWlucHV0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIwMS0yMDcKICAgIC8vIGl0eG4uYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMudGlueW1hblBvb2xBcHBJZC52YWx1ZSksCiAgICAvLyAgIGFwcEFyZ3M6IFtCeXRlcygnc3dhcCcpLCBCeXRlcygnZml4ZWQtaW5wdXQnKSwgaXRvYihtaW5BbW91bnRPdXQpXSwKICAgIC8vICAgYXNzZXRzOiBbQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKV0sCiAgICAvLyAgIGFjY291bnRzOiBbdGhpcy50aW55bWFuUG9vbEFkZHJlc3MudmFsdWVdLAogICAgLy8gICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vIH0pLAogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIwNgogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjE5NC0yMDgKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAoCiAgICAvLyAgIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy50aW55bWFuUG9vbEFkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLnVzZGNBc3NldC52YWx1ZSksCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IHVzZGNCYWxhbmNlLAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICB9KSwKICAgIC8vICAgaXR4bi5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnRpbnltYW5Qb29sQXBwSWQudmFsdWUpLAogICAgLy8gICAgIGFwcEFyZ3M6IFtCeXRlcygnc3dhcCcpLCBCeXRlcygnZml4ZWQtaW5wdXQnKSwgaXRvYihtaW5BbW91bnRPdXQpXSwKICAgIC8vICAgICBhc3NldHM6IFtBc3NldCh0aGlzLmFscGhhQXNzZXQudmFsdWUpXSwKICAgIC8vICAgICBhY2NvdW50czogW3RoaXMudGlueW1hblBvb2xBZGRyZXNzLnZhbHVlXSwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSksCiAgICAvLyApOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIxMQogICAgLy8gY29uc3QgYWxwaGFBZnRlcjogdWludDY0ID0gQXNzZXQodGhpcy5hbHBoYUFzc2V0LnZhbHVlKS5iYWxhbmNlKGFwcEFkZHIpOwogICAgY292ZXIgMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMTIKICAgIC8vIGNvbnN0IHN3YXBPdXRwdXQ6IHVpbnQ2NCA9IGFscGhhQWZ0ZXIgLSBhbHBoYUJlZm9yZTsKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMTMKICAgIC8vIGFzc2VydChzd2FwT3V0cHV0ID49IG1pbkFtb3VudE91dCwgJ1N3YXAgb3V0cHV0IGJlbG93IG1pbmltdW0nKTsKICAgID49CiAgICBhc3NlcnQgLy8gU3dhcCBvdXRwdXQgYmVsb3cgbWluaW11bQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjE2CiAgICAvLyBsZXQgZmFybUJvbnVzOiB1aW50NjQgPSBVaW50NjQoMCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjE3CiAgICAvLyBpZiAodGhpcy5lbWlzc2lvblJhdGlvLnZhbHVlID4gVWludDY0KDApICYmIHRoaXMuZmFybUJhbGFuY2UudmFsdWUgPiBVaW50NjQoMCkpIHsKICAgIGR1cAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjUKICAgIC8vIGVtaXNzaW9uUmF0aW8gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgIC8vIE11bHRpcGxpZXIgZm9yIGR5bmFtaWMgcmF0ZTogcmF0ZSA9IGZhcm1CYWxhbmNlICogZW1pc3Npb25SYXRpbyAvIHRvdGFsQWxwaGEKICAgIGJ5dGVjIDkgLy8gImVtaXNzaW9uUmF0aW8iCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMTcKICAgIC8vIGlmICh0aGlzLmVtaXNzaW9uUmF0aW8udmFsdWUgPiBVaW50NjQoMCkgJiYgdGhpcy5mYXJtQmFsYW5jZS52YWx1ZSA+IFVpbnQ2NCgwKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IGV4ZWN1dGVDb21wb3VuZF9hZnRlcl9pZl9lbHNlQDgKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NAogICAgLy8gZmFybUJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAgLy8gVG90YWwgQWxwaGEgYXZhaWxhYmxlIGZvciBmYXJtIGJvbnVzCiAgICBieXRlY18yIC8vICJmYXJtQmFsYW5jZSIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIxNwogICAgLy8gaWYgKHRoaXMuZW1pc3Npb25SYXRpby52YWx1ZSA+IFVpbnQ2NCgwKSAmJiB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlID4gVWludDY0KDApKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnogZXhlY3V0ZUNvbXBvdW5kX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjE4CiAgICAvLyBjb25zdCBjdXJyZW50UmF0ZSA9IHRoaXMuY2FsY3VsYXRlRHluYW1pY0VtaXNzaW9uUmF0ZSgpOwogICAgY2FsbHN1YiBjYWxjdWxhdGVEeW5hbWljRW1pc3Npb25SYXRlCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NQogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KG4xLCBuMik7CiAgICBmcmFtZV9kaWcgMQogICAgbXVsdwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IFtxX2hpLCBxX2xvLCBfcl9oaSwgX3JfbG9dID0gZGl2bW9kdyhoaSwgbG8sIFVpbnQ2NCgwKSwgZCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjE5CiAgICAvLyBjb25zdCByZXF1ZXN0ZWRCb251cyA9IHRoaXMubXVsRGl2Rmxvb3Ioc3dhcE91dHB1dCwgY3VycmVudFJhdGUsIEZFRV9CUFNfQkFTRSk7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg2CiAgICAvLyBjb25zdCBbcV9oaSwgcV9sbywgX3JfaGksIF9yX2xvXSA9IGRpdm1vZHcoaGksIGxvLCBVaW50NjQoMCksIGQpOwogICAgZGl2bW9kdwogICAgcG9wbiAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODcKICAgIC8vIGFzc2VydChxX2hpID09PSBVaW50NjQoMCksICdNdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyBpbiBtdWxEaXZGbG9vcicpOwogICAgIQogICAgYXNzZXJ0IC8vIE11bHRpcGxpY2F0aW9uIG92ZXJmbG93IGluIG11bERpdkZsb29yCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMjAKICAgIC8vIGZhcm1Cb251cyA9IHJlcXVlc3RlZEJvbnVzIDwgdGhpcy5mYXJtQmFsYW5jZS52YWx1ZSA/IHJlcXVlc3RlZEJvbnVzIDogdGhpcy5mYXJtQmFsYW5jZS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NAogICAgLy8gZmFybUJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAgLy8gVG90YWwgQWxwaGEgYXZhaWxhYmxlIGZvciBmYXJtIGJvbnVzCiAgICBieXRlY18yIC8vICJmYXJtQmFsYW5jZSIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIyMAogICAgLy8gZmFybUJvbnVzID0gcmVxdWVzdGVkQm9udXMgPCB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlID8gcmVxdWVzdGVkQm9udXMgOiB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDwKICAgIGJ6IGV4ZWN1dGVDb21wb3VuZF90ZXJuYXJ5X2ZhbHNlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDIKCmV4ZWN1dGVDb21wb3VuZF90ZXJuYXJ5X21lcmdlQDc6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMjEKICAgIC8vIHRoaXMuZmFybUJhbGFuY2UudmFsdWUgPSB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlIC0gZmFybUJvbnVzOwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjY0CiAgICAvLyBmYXJtQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgICAvLyBUb3RhbCBBbHBoYSBhdmFpbGFibGUgZm9yIGZhcm0gYm9udXMKICAgIGJ5dGVjXzIgLy8gImZhcm1CYWxhbmNlIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjIxCiAgICAvLyB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlID0gdGhpcy5mYXJtQmFsYW5jZS52YWx1ZSAtIGZhcm1Cb251czsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMgogICAgLQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NjQKICAgIC8vIGZhcm1CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAgICAgICAgIC8vIFRvdGFsIEFscGhhIGF2YWlsYWJsZSBmb3IgZmFybSBib251cwogICAgYnl0ZWNfMiAvLyAiZmFybUJhbGFuY2UiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMjEKICAgIC8vIHRoaXMuZmFybUJhbGFuY2UudmFsdWUgPSB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlIC0gZmFybUJvbnVzOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmV4ZWN1dGVDb21wb3VuZF9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMjUKICAgIC8vIGNvbnN0IHRvdGFsT3V0cHV0OiB1aW50NjQgPSBzd2FwT3V0cHV0ICsgZmFybUJvbnVzOwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMjgKICAgIC8vIGNvbnN0IGNyZWF0b3JDdXQ6IHVpbnQ2NCA9IHRoaXMubXVsRGl2Rmxvb3IodG90YWxPdXRwdXQsIHRoaXMuY3JlYXRvckZlZVJhdGUudmFsdWUsIEZFRV9QRVJDRU5UX0JBU0UpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjQ5CiAgICAvLyBjcmVhdG9yRmVlUmF0ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgLy8gMC0xMDAsIHBlcmNlbnRhZ2Ugb2YgeWllbGQgdG8gY3JlYXRvcgogICAgYnl0ZWMgMTQgLy8gImNyZWF0b3JGZWVSYXRlIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjI4CiAgICAvLyBjb25zdCBjcmVhdG9yQ3V0OiB1aW50NjQgPSB0aGlzLm11bERpdkZsb29yKHRvdGFsT3V0cHV0LCB0aGlzLmNyZWF0b3JGZWVSYXRlLnZhbHVlLCBGRUVfUEVSQ0VOVF9CQVNFKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo4NQogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KG4xLCBuMik7CiAgICBkaWcgMQogICAgbXVsdwogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IFtxX2hpLCBxX2xvLCBfcl9oaSwgX3JfbG9dID0gZGl2bW9kdyhoaSwgbG8sIFVpbnQ2NCgwKSwgZCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjI4CiAgICAvLyBjb25zdCBjcmVhdG9yQ3V0OiB1aW50NjQgPSB0aGlzLm11bERpdkZsb29yKHRvdGFsT3V0cHV0LCB0aGlzLmNyZWF0b3JGZWVSYXRlLnZhbHVlLCBGRUVfUEVSQ0VOVF9CQVNFKTsKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IFtxX2hpLCBxX2xvLCBfcl9oaSwgX3JfbG9dID0gZGl2bW9kdyhoaSwgbG8sIFVpbnQ2NCgwKSwgZCk7CiAgICBkaXZtb2R3CiAgICBwb3BuIDIKICAgIHN3YXAKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjg3CiAgICAvLyBhc3NlcnQocV9oaSA9PT0gVWludDY0KDApLCAnTXVsdGlwbGljYXRpb24gb3ZlcmZsb3cgaW4gbXVsRGl2Rmxvb3InKTsKICAgICEKICAgIGFzc2VydCAvLyBNdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyBpbiBtdWxEaXZGbG9vcgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjI5CiAgICAvLyBjb25zdCB2YXVsdEN1dDogdWludDY0ID0gdG90YWxPdXRwdXQgLSBjcmVhdG9yQ3V0OwogICAgZHVwMgogICAgLQogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjMyCiAgICAvLyB0aGlzLmNyZWF0b3JVbmNsYWltZWRBbHBoYS52YWx1ZSA9IHRoaXMuY3JlYXRvclVuY2xhaW1lZEFscGhhLnZhbHVlICsgY3JlYXRvckN1dDsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1MAogICAgLy8gY3JlYXRvclVuY2xhaW1lZEFscGhhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOyAvLyBBY2N1bXVsYXRlZCBBbHBoYSBmb3IgY3JlYXRvciB0byBjbGFpbQogICAgYnl0ZWMgOCAvLyAiY3JlYXRvclVuY2xhaW1lZEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjMyCiAgICAvLyB0aGlzLmNyZWF0b3JVbmNsYWltZWRBbHBoYS52YWx1ZSA9IHRoaXMuY3JlYXRvclVuY2xhaW1lZEFscGhhLnZhbHVlICsgY3JlYXRvckN1dDsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjUwCiAgICAvLyBjcmVhdG9yVW5jbGFpbWVkQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7IC8vIEFjY3VtdWxhdGVkIEFscGhhIGZvciBjcmVhdG9yIHRvIGNsYWltCiAgICBieXRlYyA4IC8vICJjcmVhdG9yVW5jbGFpbWVkQWxwaGEiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMzIKICAgIC8vIHRoaXMuY3JlYXRvclVuY2xhaW1lZEFscGhhLnZhbHVlID0gdGhpcy5jcmVhdG9yVW5jbGFpbWVkQWxwaGEudmFsdWUgKyBjcmVhdG9yQ3V0OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIzNQogICAgLy8gdGhpcy50b3RhbEFscGhhLnZhbHVlID0gdGhpcy50b3RhbEFscGhhLnZhbHVlICsgdmF1bHRDdXQ7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6NTQKICAgIC8vIHRvdGFsQWxwaGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAvLyBUb3RhbCBBbHBoYSBoZWxkIChkZXBvc2l0cyArIGNvbXBvdW5kZWQgeWllbGQpCiAgICBieXRlY18xIC8vICJ0b3RhbEFscGhhIgogICAgLy8gUmFyZUZpQWxwaGFDb21wb3VuZGluZ1ZhdWx0LmFsZ28udHM6MjM1CiAgICAvLyB0aGlzLnRvdGFsQWxwaGEudmFsdWUgPSB0aGlzLnRvdGFsQWxwaGEudmFsdWUgKyB2YXVsdEN1dDsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICArCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NAogICAgLy8gdG90YWxBbHBoYSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsgICAgICAgIC8vIFRvdGFsIEFscGhhIGhlbGQgKGRlcG9zaXRzICsgY29tcG91bmRlZCB5aWVsZCkKICAgIGJ5dGVjXzEgLy8gInRvdGFsQWxwaGEiCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMzUKICAgIC8vIHRoaXMudG90YWxBbHBoYS52YWx1ZSA9IHRoaXMudG90YWxBbHBoYS52YWx1ZSArIHZhdWx0Q3V0OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy50b3RhbFlpZWxkQ29tcG91bmRlZC52YWx1ZSA9IHRoaXMudG90YWxZaWVsZENvbXBvdW5kZWQudmFsdWUgKyB0b3RhbE91dHB1dDsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NwogICAgLy8gdG90YWxZaWVsZENvbXBvdW5kZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7IC8vIFRvdGFsIHlpZWxkIGNvbXBvdW5kZWQgKGZvciBzdGF0cykKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbFlpZWxkQ29tcG91bmRlZCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy50b3RhbFlpZWxkQ29tcG91bmRlZC52YWx1ZSA9IHRoaXMudG90YWxZaWVsZENvbXBvdW5kZWQudmFsdWUgKyB0b3RhbE91dHB1dDsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICArCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo1NwogICAgLy8gdG90YWxZaWVsZENvbXBvdW5kZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7IC8vIFRvdGFsIHlpZWxkIGNvbXBvdW5kZWQgKGZvciBzdGF0cykKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbFlpZWxkQ29tcG91bmRlZCIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy50b3RhbFlpZWxkQ29tcG91bmRlZC52YWx1ZSA9IHRoaXMudG90YWxZaWVsZENvbXBvdW5kZWQudmFsdWUgKyB0b3RhbE91dHB1dDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmV4ZWN1dGVDb21wb3VuZF90ZXJuYXJ5X2ZhbHNlQDY6CiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czoyMjAKICAgIC8vIGZhcm1Cb251cyA9IHJlcXVlc3RlZEJvbnVzIDwgdGhpcy5mYXJtQmFsYW5jZS52YWx1ZSA/IHJlcXVlc3RlZEJvbnVzIDogdGhpcy5mYXJtQmFsYW5jZS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBSYXJlRmlBbHBoYUNvbXBvdW5kaW5nVmF1bHQuYWxnby50czo2NAogICAgLy8gZmFybUJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7ICAgICAgICAgLy8gVG90YWwgQWxwaGEgYXZhaWxhYmxlIGZvciBmYXJtIGJvbnVzCiAgICBieXRlY18yIC8vICJmYXJtQmFsYW5jZSIKICAgIC8vIFJhcmVGaUFscGhhQ29tcG91bmRpbmdWYXVsdC5hbGdvLnRzOjIyMAogICAgLy8gZmFybUJvbnVzID0gcmVxdWVzdGVkQm9udXMgPCB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlID8gcmVxdWVzdGVkQm9udXMgOiB0aGlzLmZhcm1CYWxhbmNlLnZhbHVlOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2J1cnkgMgogICAgYiBleGVjdXRlQ29tcG91bmRfdGVybmFyeV9tZXJnZUA3Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAIAAEIBJBOoI0GgOHrF4CglKWNHSYSC3RvdGFsU2hhcmVzCnRvdGFsQWxwaGELZmFybUJhbGFuY2UOY3JlYXRvckFkZHJlc3MKYWxwaGFBc3NldAl1c2RjQXNzZXQKdXNlclNoYXJlcwQVH3x1FWNyZWF0b3JVbmNsYWltZWRBbHBoYQ1lbWlzc2lvblJhdGlvDXJhcmVmaUFkZHJlc3MQbWluU3dhcFRocmVzaG9sZA5tYXhTbGlwcGFnZUJwcxR0b3RhbFlpZWxkQ29tcG91bmRlZA5jcmVhdG9yRmVlUmF0ZRB0aW55bWFuUG9vbEFwcElkEnRpbnltYW5Qb29sQWRkcmVzcw1hc3NldHNPcHRlZEluMRtBANCCAgQpMU2VBGppH+I2GgCOAgCwAKQxGRREMRhBAI2CEwRBTkG1BG4uvJsEIfHd/wS8mUSeBMizwPAEADWXogTH1NvzBD4vfLcEP9eYVgSXNlS/BAx5OxgEq273OwSq4srSBB9l1k4EFPqUcwS8XjjGBK/r/KwE0FTBnwQXDnKSNhoAjhMA+wHGAmYC0gMEAzoDkwOsA8ID1gPqBDwEbASUBLUE2AT6BUIFagCABE0Dyyk2GgCOAQAsADEZgQISMRgQREIBZTEZIxIxGBBEQgFMJYEFMRmOAgAFAAEAMRhEADEYRAA2GgFJFSQSRBc2GgJJFSQSRBc2GgNJFSQSRBc2GgRJFSQSRBc2GgVJFSQSRBc2GgZJFSQSRBc2GgdJFYEgEkQ2GghJFYEgEkQxIDIDEkRLBYEGDkRLBCEFD0RLBCEGDkRLA4H0Aw9ESwMhBA5ESwdESwZESwdLBxNESwJEJwRPCGcnBU8HZysxAGcnCkxnJw5PBWcnCCJnKCJnKSJnJwtPBGcnDE8DZycNImcnD08CZycQTGcqImcnCSJnJxEiZyNDMSAyAxJEMQAiK2VEEkQiJxFlRBREMgoxFklEIwlJOBAjEkRJOAdLAhJESTgIgcDLyQIPREk4ADEAEkRJOCAyAxJEOAkyAxJEsSInBGVEIrISshFJshQlshAisgGzsSInBWVEIrISshGyFCWyECKyAbMnESNnI0MxIDIDEkQxACcGImYjQzEgMgMSRDEAIicGY0xJTwJEQQAwRwKIBFoiKGVETwIJKExnIillREsBCSlMZ7ExACInBGVETwKyErIRshQlshAisgGzI0M2GgFJFSQSRBdJMSAyAxJEIicMZUQORDIKSSInBWVEcABMSU8CRCInC2VED0EADSIoZURBAAZJSwOIBLwxFklEIwlJOBAlEkRJOBEiJwRlRBJESTgUSwMSREk4ADEAEkRJOCAyAxJESTgVMgMSRDgSSYHAhD0PREmIA45JRDEAIicGY0RLAQgxACcGTwJmIihlRAgoTGciKWVECClMZyNDNhoBSRUkEkQXSTEgMgMSRDEAIicGY0xOAkRBAEtLAUlESUsCSU4DDkRJiANgSURPAksCCTEAJwZPAmYiKGVETwIJKExnIillREsBCSlMZ7ExACInBGVETwKyErIRshQlshAisgGzI0NJQv+zMSAyAxJEMQAiK2VEEkQiJwhlRElEJwgiZ7ExACInBGVETwKyErIRshQlshAisgGzI0M2GgFJFSQSRBcxIDIDEkQiJwxlREsBD0QyCiInBWVEcABEIicLZURLAQ5EIihlRERMiAOGI0MyCiInBWVEcABEIQciKGVEQQAXIillRCIoZURMIQcdIk8DH0YCTBRERQEiKGVEIillRCInCGVEIicNZURPAxZPAxZQTwIWUEsDFlBMFlBLARZQJwdMULAjQzYaAUkVgSASRCInBmNEiAJPFicHTFCwI0M2GgFJFYEgEkQiJwZjRBYnB0xQsCNDNhoBSRUkEkQXiAIBFicHTFCwI0M2GgFJFSQSRBeIAhEWJwdMULAjQzIKIicFZURwAExJTwJEQAAhgBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnB0xQsCNDRwKIAfVJgd5NHSIhBB9GAkwURE8CFk8CFlBMFlBC/9k2GgFJFSQSRBcxIDIDEkQxACIrZUQSMQAiJwplRBIRREkhBQ9ESSEGDkQnC0xnI0M2GgFJFSQSRBcxIDIDEkQxACIrZUQSREmB9AMPREkhBA5EJwxMZyNDNhoBSRWBIBJEMSAyAxJEMQAiK2VEEkRJMgMTRCtMZyNDNhoBSRWBIBJEMSAyAxJEMQAiJwplRBJESTIDE0QnCkxnI0M2GgFJFSQSRBcxIDIDEkQxACIrZUQSREmBBg5EJw5MZyNDMSAyAxJEMgoxFklEIwlJOBAlEkRJOBEiJwRlRBJESTgUTwISREk4ADEAEkRJOCAyAxJESTgVMgMSRDgSSUQiKmVECCpMZyNDNhoBSRUkEkQXMSAyAxJEMQAiK2VEEjEAIicKZUQSEURJRCcJTGcjQyJJJwllREEADCIqZURBAAWIABtFASIqZUQiJwllREwWTBZQSwEWUCcHTFCwI0OKAAEiKWVMSU8CREEAByIqZURAAAMiTIkiKmVEIicJZUQdIosAH0YCTBRESYHoBwyB6AdMTUyJigEBIihlREAAA4v/iSIoZUQiKWVEi/9PAh0iTwMfRgJMFESJigEBIihlREAAAiKJIillRCIoZUSL/08CHSJPAx9GAkwURImKAQGAACInD2VEIicQZURJSwKACmFzc2V0XzFfaWRjREsBSwOAEGFzc2V0XzFfcmVzZXJ2ZXNjTE4EREsBSwOAEGFzc2V0XzJfcmVzZXJ2ZXNjTE4ERExPAoAPdG90YWxfZmVlX3NoYXJlY0xOA0QiJwVlRBJBACmLAYwAIQSLAgmL/x0iIQQfRgJMFESLAEsBCE4CHSJPAx9GAkwURIwAiYwAiwFC/9SKAgCAADIKi/6I/0xJRCEEi/8JHSIhBB9GAk4CFEQiJwRlREpwAESxIicQZUQiJwVlRIv+shKyEUmyFCWyECKyAbYiJw9lREsFFk8CshxLA7IwgARzd2FwshqAC2ZpeGVkLWlucHV0shqyGrIYgQayECKyAbNOAnAAREwJSU8CD0QiSScJZURBADAiKmVEQQApiP5GiwEdIiEEH0YCSU4CjAAURCIqZUQMQQBFiwCMAiIqZUSLAgkqTGeLAYsCCCInDmVESwEdIoFkH0YCTBRESgkiJwhlRE8CCCcITGciKWVECClMZyInDWVECCcNTGeJIiplRIwCQv+2", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }