{ "name": "ValidatorRegistry", "structs": { "Constraints": [ { "name": "epochPayoutRoundsMin", "type": "uint64" }, { "name": "epochPayoutRoundsMax", "type": "uint64" }, { "name": "minPctToValidatorWFourDecimals", "type": "uint64" }, { "name": "maxPctToValidatorWFourDecimals", "type": "uint64" }, { "name": "minEntryStake", "type": "uint64" }, { "name": "maxAlgoPerPool", "type": "uint64" }, { "name": "maxAlgoPerValidator", "type": "uint64" }, { "name": "amtConsideredSaturated", "type": "uint64" }, { "name": "maxNodes", "type": "uint64" }, { "name": "maxPoolsPerNode", "type": "uint64" }, { "name": "maxStakersPerPool", "type": "uint64" } ], "MbrAmounts": [ { "name": "addValidatorMbr", "type": "uint64" }, { "name": "addPoolMbr", "type": "uint64" }, { "name": "poolInitMbr", "type": "uint64" }, { "name": "addStakerMbr", "type": "uint64" } ], "NodePoolAssignmentConfig": [ { "name": "nodes", "type": "(uint64[3])[8]" } ], "PoolInfo": [ { "name": "poolAppId", "type": "uint64" }, { "name": "totalStakers", "type": "uint16" }, { "name": "totalAlgoStaked", "type": "uint64" } ], "PoolTokenPayoutRatio": [ { "name": "poolPctOfWhole", "type": "uint64[24]" }, { "name": "updatedForPayout", "type": "uint64" } ], "ValidatorConfig": [ { "name": "id", "type": "uint64" }, { "name": "owner", "type": "address" }, { "name": "manager", "type": "address" }, { "name": "nfdForInfo", "type": "uint64" }, { "name": "entryGatingType", "type": "uint8" }, { "name": "entryGatingAddress", "type": "address" }, { "name": "entryGatingAssets", "type": "uint64[4]" }, { "name": "gatingAssetMinBalance", "type": "uint64" }, { "name": "rewardTokenId", "type": "uint64" }, { "name": "rewardPerPayout", "type": "uint64" }, { "name": "epochRoundLength", "type": "uint32" }, { "name": "percentToValidator", "type": "uint32" }, { "name": "validatorCommissionAddress", "type": "address" }, { "name": "minEntryStake", "type": "uint64" }, { "name": "maxAlgoPerPool", "type": "uint64" }, { "name": "poolsPerNode", "type": "uint8" }, { "name": "sunsettingOn", "type": "uint64" }, { "name": "sunsettingTo", "type": "uint64" } ], "ValidatorCurState": [ { "name": "numPools", "type": "uint16" }, { "name": "totalStakers", "type": "uint64" }, { "name": "totalAlgoStaked", "type": "uint64" }, { "name": "rewardTokenHeldBack", "type": "uint64" } ], "ValidatorInfo": [ { "name": "config", "type": "ValidatorConfig" }, { "name": "state", "type": "ValidatorCurState" }, { "name": "pools", "type": "(uint64,uint16,uint64)[24]" }, { "name": "tokenPayoutRatio", "type": "PoolTokenPayoutRatio" }, { "name": "nodePoolAssignments", "type": "NodePoolAssignmentConfig" } ], "ValidatorPoolKey": [ { "name": "id", "type": "uint64" }, { "name": "poolId", "type": "uint64" }, { "name": "poolAppId", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "initStakingContract", "args": [ { "type": "uint64", "name": "approvalProgramSize" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "loadStakingContractData", "args": [ { "type": "uint64", "name": "offset" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "finalizeStakingContract", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "gas", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "gas is a dummy no-op call that can be used to pool-up resource references and opcode cost", "events": [], "recommendations": {} }, { "name": "getMbrAmounts", "args": [], "returns": { "type": "(uint64,uint64,uint64,uint64)", "struct": "MbrAmounts" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the MBR amounts needed for various actions:\n[\n addValidatorMbr: uint64 - mbr needed to add a new validator - paid to validator contract\n addPoolMbr: uint64 - mbr needed to add a new pool - paid to validator\n poolInitMbr: uint64 - mbr needed to initStorage() of pool - paid to pool itself\n addStakerMbr: uint64 - mbr staker needs to add to first staking payment (stays w/ validator)\n]", "events": [], "recommendations": {} }, { "name": "getProtocolConstraints", "args": [], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "Constraints" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the protocol constraints so that UIs can limit what users specify for validator configuration parameters.", "events": [], "recommendations": {} }, { "name": "getNumValidators", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the current number of validators", "events": [], "recommendations": {} }, { "name": "getValidatorConfig", "args": [ { "type": "uint64", "name": "validatorId" } ], "returns": { "type": "(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)", "struct": "ValidatorConfig" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getValidatorState", "args": [ { "type": "uint64", "name": "validatorId" } ], "returns": { "type": "(uint16,uint64,uint64,uint64)", "struct": "ValidatorCurState" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getValidatorOwnerAndManager", "args": [ { "type": "uint64", "name": "validatorId" } ], "returns": { "type": "(address,address)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getPools", "args": [ { "type": "uint64", "name": "validatorId", "desc": "" } ], "returns": { "type": "(uint64,uint16,uint64)[]", "desc": "- array of pools\nNot callable from other contracts because >1K return but can be called w/ simulate which bumps log returns" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return list of all pools for this validator.", "events": [], "recommendations": {} }, { "name": "getPoolAppId", "args": [ { "type": "uint64", "name": "validatorId" }, { "type": "uint64", "name": "poolId" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "getPoolAppId is useful for callers to determine app to call for removing stake if they don't have staking or\nwant to get staker list for an account. The staking pool also uses it to get the app id of staking pool 1\n(which contains reward tokens if being used) so that the amount available can be determined.", "events": [], "recommendations": {} }, { "name": "getPoolInfo", "args": [ { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "name": "poolKey" } ], "returns": { "type": "(uint64,uint16,uint64)", "struct": "PoolInfo" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getCurMaxStakePerPool", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Calculate the maximum stake per pool for a given validator.\nNormally this would be maxAlgoPerPool, but it should also never go above MaxAllowedStake / numPools so\nas pools are added the max allowed per pool can reduce.", "events": [], "recommendations": {} }, { "name": "doesStakerNeedToPayMBR", "args": [ { "type": "address", "name": "staker", "desc": "" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Helper callers can call w/ simulate to determine if 'AddStaker' MBR should be included w/ staking amount", "events": [], "recommendations": {} }, { "name": "getStakedPoolsForAccount", "args": [ { "type": "address", "name": "staker", "desc": "- The account to retrieve staked pools for." } ], "returns": { "type": "(uint64,uint64,uint64)[]", "desc": "- The array of staked pools for the account." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Retrieves the staked pools for an account.", "events": [], "recommendations": {} }, { "name": "getTokenPayoutRatio", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." } ], "returns": { "type": "(uint64[24],uint64)", "struct": "PoolTokenPayoutRatio", "desc": "- The token payout ratio for the validator." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Retrieves the token payout ratio for a given validator - returning the pool ratios of whole so that token\npayouts across pools can be based on a stable snaphost of stake.", "events": [], "recommendations": {} }, { "name": "getNodePoolAssignments", "args": [ { "type": "uint64", "name": "validatorId" } ], "returns": { "type": "((uint64[3])[8])", "struct": "NodePoolAssignmentConfig" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getNFDRegistryID", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "addValidator", "args": [ { "type": "pay", "name": "mbrPayment", "desc": "payment from caller which covers mbr increase of new validator storage" }, { "type": "string", "name": "nfdName", "desc": "(Optional) Name of nfd (used as double-check against id specified in config)" }, { "type": "(uint64,address,address,uint64,uint8,address,uint64[4],uint64,uint64,uint64,uint32,uint32,address,uint64,uint64,uint8,uint64,uint64)", "struct": "ValidatorConfig", "name": "config", "desc": "ValidatorConfig struct" } ], "returns": { "type": "uint64", "desc": "validator id" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Adds a new validator\nRequires at least 10 ALGO as the 'fee' for the transaction to help dissuade spammed validator adds.", "events": [ { "name": "retiOP_addedValidator", "args": [ { "type": "uint64", "name": "id" }, { "type": "address", "name": "owner" }, { "type": "address", "name": "manager" } ] } ], "recommendations": {} }, { "name": "changeValidatorManager", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator to change the manager for." }, { "type": "address", "name": "manager", "desc": "- The new manager address." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Changes the Validator manager for a specific Validator id.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "changeValidatorSunsetInfo", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator to update." }, { "type": "uint64", "name": "sunsettingOn", "desc": "- The new sunset timestamp." }, { "type": "uint64", "name": "sunsettingTo", "desc": "- The new sunset to validator id." } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Updates the sunset information for a given validator.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "changeValidatorNFD", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator to update." }, { "type": "uint64", "name": "nfdAppID", "desc": "- The application id of the NFD to assign to the validator." }, { "type": "string", "name": "nfdName", "desc": "- The name of the NFD (which must match)" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Changes the NFD for a validator in the validatorList contract.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "changeValidatorCommissionAddress", "args": [ { "type": "uint64", "name": "validatorId" }, { "type": "address", "name": "commissionAddress" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Change the commission address that validator rewards are sent to.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "changeValidatorRewardInfo", "args": [ { "type": "uint64", "name": "validatorId" }, { "type": "uint8", "name": "EntryGatingType" }, { "type": "address", "name": "EntryGatingAddress" }, { "type": "uint64[4]", "name": "EntryGatingAssets" }, { "type": "uint64", "name": "GatingAssetMinBalance" }, { "type": "uint64", "name": "RewardPerPayout" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Allow the additional rewards (gating entry, additional token rewards) information be changed at will.\n[ ONLY OWNER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "addPool", "args": [ { "type": "pay", "name": "mbrPayment", "desc": "payment from caller which covers mbr increase of adding a new pool" }, { "type": "uint64", "name": "validatorId", "desc": "is id of validator to pool to (must be owner or manager)" }, { "type": "uint64", "name": "nodeNum", "desc": "is node number to add to" } ], "returns": { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "desc": "pool key to created pool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Adds a new pool to a validator's pool set, returning the 'key' to reference the pool in the future for staking, etc.\nThe caller must pay the cost of the validators MBR increase as well as the MBR that will be needed for the pool itself.\n\n[ ONLY OWNER OR MANAGER CAN call ]", "events": [ { "name": "retiOP_validatorAddedPool", "args": [ { "type": "uint64", "name": "id" }, { "type": "uint16", "name": "num" }, { "type": "uint64", "name": "poolAppId" } ] } ], "recommendations": {} }, { "name": "addStake", "args": [ { "type": "pay", "name": "stakedAmountPayment", "desc": "- payment coming from staker to place into a pool" }, { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." }, { "type": "uint64", "name": "valueToVerify", "desc": "- only if validator has gating to enter - this is asset id or nfd id that corresponds to gating.\nTxn sender is factored in as well if that is part of gating.\n*" } ], "returns": { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "desc": "- The key of the validator pool." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Adds stake to a validator pool.", "events": [ { "name": "retiOP_stakeAdded", "args": [ { "type": "uint64", "name": "id" }, { "type": "uint16", "name": "poolNum" }, { "type": "uint64", "name": "poolAppId" }, { "type": "address", "name": "staker" }, { "type": "uint64", "name": "amountStaked" } ] } ], "recommendations": {} }, { "name": "setTokenPayoutRatio", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- validator id (and thus pool) calling us. Verified so that sender MUST be pool 1 of this validator." } ], "returns": { "type": "(uint64[24],uint64)", "struct": "PoolTokenPayoutRatio", "desc": "PoolTokenPayoutRatio - the finished ratio data" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "setTokenPayoutRatio is called by Staking Pool # 1 (ONLY) to ask the validator (us) to calculate the ratios\nof stake in the pools for subsequent token payouts (ie: 2 pools, '100' algo total staked, 60 in pool 1, and 40\nin pool 2) This is done so we have a stable snapshot of stake - taken once per epoch - only triggered by\npool 1 doing payout. pools other than 1 doing payout call pool 1 to ask it do it first.\nIt would be 60/40% in the poolPctOfWhole values. The token reward payouts then use these values instead of\ntheir 'current' stake which changes as part of the payouts themselves (and people could be changing stake\nduring the epoch updates across pools)\n\nMultiple pools will call us via pool 1 (pool2->pool1->validator, etc.) so don't assert on pool1 calling multiple\ntimes in same epoch. Just return.", "events": [], "recommendations": {} }, { "name": "stakeUpdatedViaRewards", "args": [ { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "name": "poolKey", "desc": "- ValidatorPoolKey type" }, { "type": "uint64", "name": "algoToAdd", "desc": "- amount this validator's total stake increased via rewards" }, { "type": "uint64", "name": "rewardTokenAmountReserved", "desc": "- amount this validator's total stake increased via rewards (that should be" }, { "type": "uint64", "name": "validatorCommission", "desc": "- the commission amount the validator was paid, if any" }, { "type": "uint64", "name": "saturatedBurnToFeeSink", "desc": "- if the pool was in saturated state, the amount sent back to the fee sink.\nseen as 'accounted for/pending spent')" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "stakeUpdatedViaRewards is called by Staking pools to inform the validator (us) that a particular amount of total\nstake has been added to the specified pool. This is used to update the stats we have in our PoolInfo storage.\nThe calling App id is validated against our pool list as well.", "events": [ { "name": "retiOP_epochRewardUpdate", "args": [ { "type": "uint64", "name": "id" }, { "type": "uint16", "name": "poolNum" }, { "type": "uint64", "name": "poolAppId" }, { "type": "uint64", "name": "validatorCommission" }, { "type": "uint64", "name": "saturatedBurnToFeeSink" }, { "type": "uint64", "name": "algoAdded" }, { "type": "uint64", "name": "rewardTokenHeldBack" } ] } ], "recommendations": {} }, { "name": "stakeRemoved", "args": [ { "type": "(uint64,uint64,uint64)", "struct": "ValidatorPoolKey", "name": "poolKey", "desc": "calling us from which stake was removed" }, { "type": "address", "name": "staker", "desc": "" }, { "type": "uint64", "name": "amountRemoved", "desc": "- algo amount removed" }, { "type": "uint64", "name": "rewardRemoved", "desc": "- if applicable, amount of token reward removed (by pool 1 caller) or TO remove and pay out (via pool 1 from different pool caller)" }, { "type": "bool", "name": "stakerRemoved", "desc": "" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "stakeRemoved is called by Staking pools to inform the validator (us) that a particular amount of total stake has been removed\nfrom the specified pool. This is used to update the stats we have in our PoolInfo storage.\nIf any amount of rewardRemoved is specified, then that amount of reward is sent to the use\nThe calling App id is validated against our pool list as well.", "events": [ { "name": "retiOP_stakeRemoved", "args": [ { "type": "uint64", "name": "id" }, { "type": "uint16", "name": "poolNum" }, { "type": "uint64", "name": "poolAppId" }, { "type": "address", "name": "staker" }, { "type": "uint64", "name": "amountUnstaked" }, { "type": "uint64", "name": "rewardTokensReceived" }, { "type": "uint64", "name": "rewardTokenAssetId" } ] } ], "recommendations": {} }, { "name": "findPoolForStaker", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." }, { "type": "address", "name": "staker", "desc": "- The address of the staker." }, { "type": "uint64", "name": "amountToStake", "desc": "- The amount to stake." } ], "returns": { "type": "((uint64,uint64,uint64),bool,bool)", "desc": ", boolean, boolean} - The pool for the staker, true/false on whether the staker is 'new'\nto this VALIDATOR, and true/false if staker is new to the protocol." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Finds the pool for a staker based on the provided validator id, staker address, and amount to stake.\nFirst checks the stakers 'already staked list' for the validator preferring those (adding if possible) then adds\nto new pool if necessary.", "events": [], "recommendations": {} }, { "name": "movePoolToNode", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." }, { "type": "uint64", "name": "poolAppId", "desc": "" }, { "type": "uint64", "name": "nodeNum", "desc": "" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Find the specified pool (in any node number) and move it to the specified node.\nThe pool account is forced offline if moved so prior node will still run for 320 rounds but\nnew key goes online on new node soon after (320 rounds after it goes online)\nNo-op if success, asserts if not found or can't move (no space in target)\n[ ONLY OWNER OR MANAGER CAN CHANGE ]", "events": [], "recommendations": {} }, { "name": "emptyTokenRewards", "args": [ { "type": "uint64", "name": "validatorId", "desc": "- The id of the validator." }, { "type": "address", "name": "receiver", "desc": "- the account to send the tokens to (must already be opted-in to the reward token)" } ], "returns": { "type": "uint64", "desc": "the amount of reward token sent" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Sends the reward tokens held in pool 1 to specified receiver.\nThis is intended to be used by the owner when they want to get reward tokens 'back' which they sent to\nthe first pool (likely because validator is sunsetting. Any tokens currently 'reserved' for stakers to claim will\nNOT be sent as they must be held back for stakers to later claim.\n[ ONLY OWNER CAN CALL]", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "ValidatorRegistry is the 'master contract' for the reti pooling protocol.\nA single immutable instance of this is deployed. All state for all validators including information about their\npools and nodes is stored via this contract in global state and box storage. Data in the pools themselves is stored\nwithin the StakingPool contract instance, also in global state and box storage.\nSee the StakingPool contract comments for details on how this contract creates new instances of them.", "networks": {}, "state": { "schema": { "global": { "ints": 4, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "stakingPoolInitialized": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aW5pdA==" }, "numValidators": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnVtVg==" }, "numStakers": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnVtU3Rha2Vycw==" }, "totalAlgoStaked": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3Rha2Vk" } }, "local": {}, "box": { "stakingPoolApprovalProgram": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcw==" } } }, "maps": { "global": {}, "local": {}, "box": { "validatorList": { "keyType": "uint64", "valueType": "ValidatorInfo", "prefix": "dg==" }, "stakerPoolSet": { "keyType": "address", "valueType": "(uint64,uint64,uint64)[6]", "prefix": "c3Bz" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1383, 1398, 1413, 1440, 1521, 1539, 1574, 1605, 1618, 1697, 1779, 2547, 2583, 2606, 2639, 2870, 2956, 3065, 3210, 3245, 3368, 3395, 3411, 3451, 3463, 3497, 3550, 3621, 3652, 3903, 3990, 4039, 4131, 4203, 4212, 4406, 4532, 4597, 4676, 4816, 4986, 5089, 5114, 5130, 5181, 5203, 5296 ], "errorMessage": "Box must have value" }, { "pc": [ 3145 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 2043, 2158 ], "errorMessage": "If specifying NFD, account adding validator must be owner" }, { "pc": [ 3326 ], "errorMessage": "No empty slot available in the staker pool set" }, { "pc": [ 4374 ], "errorMessage": "No matching slot found when told to remove a pool from the stakers set" }, { "pc": [ 2928 ], "errorMessage": "No pool available with free stake. Validator needs to add another pool" }, { "pc": [ 255, 279, 303, 330, 361, 392, 412, 446, 480, 513, 532, 558, 582, 601, 637, 653, 673, 693, 712, 737, 758, 777, 802, 822, 842, 862, 882, 899, 915, 963, 972, 984, 1006, 1022 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ 5227 ], "errorMessage": "The passed in app id doesn't match the passed in ids" }, { "pc": [ 2333 ], "errorMessage": "already at max pool size" }, { "pc": [ 3101, 3387, 5025, 5066, 5234 ], "errorMessage": "application exists" }, { "pc": [ 1973, 2306, 2579 ], "errorMessage": "assert target is match for conditions" }, { "pc": [ 2676, 2756 ], "errorMessage": "asset exists" }, { "pc": [ 5075 ], "errorMessage": "balance of remaining reward tokens should match the held back amount" }, { "pc": [ 5142 ], "errorMessage": "can only be called by owner or manager of validator" }, { "pc": [ 5097 ], "errorMessage": "can only be called by validator owner" }, { "pc": [ 1026 ], "errorMessage": "can only call when creating" }, { "pc": [ 258, 282, 306, 333, 364, 395, 415, 449, 483, 516, 535, 561, 585, 604, 640, 656, 676, 696, 715, 740, 761, 780, 805, 825, 845, 865, 885, 902, 918, 966, 975, 987, 1009 ], "errorMessage": "can only call when not creating" }, { "pc": [ 4898 ], "errorMessage": "can't move to same node" }, { "pc": [ 2557 ], "errorMessage": "can't stake with a validator that is past its sunsetting time" }, { "pc": [ 1263, 1371, 1989, 3234, 3269, 3743, 3974, 4430 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 1893 ], "errorMessage": "commission percentage not valid" }, { "pc": [ 4838 ], "errorMessage": "couldn't find pool app id in nodes to move" }, { "pc": [ 1876 ], "errorMessage": "epoch length not in allowable range" }, { "pc": [ 1984 ], "errorMessage": "fee must be 10 ALGO or more to prevent spamming of validators" }, { "pc": [ 1854 ], "errorMessage": "gating type not valid" }, { "pc": [ 1462, 1554, 1591, 1719, 2975, 3084, 3374, 3564, 3676, 3930, 4045, 4143, 4234, 4564, 4614, 4718, 4873, 5017, 5221, 5353 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 2464, 3181, 3597, 3689, 3943, 4908, 5380 ], "errorMessage": "index out of bounds" }, { "pc": [ 2219 ], "errorMessage": "invalid Entry gating type" }, { "pc": [ 1476, 1737 ], "errorMessage": "max array length exceeded" }, { "pc": [ 2666 ], "errorMessage": "must have required minimum balance of validator defined token to add stake" }, { "pc": [ 4687 ], "errorMessage": "must stake at least the minimum for this pool" }, { "pc": [ 2095 ], "errorMessage": "needs to at least be valid address" }, { "pc": [ 5329 ], "errorMessage": "no available space in specified node for this pool" }, { "pc": [ 5313 ], "errorMessage": "node number not in valid range" }, { "pc": [ 4830 ], "errorMessage": "node number out of allowable range" }, { "pc": [ 1938 ], "errorMessage": "number of pools per node must be be between 1 and the maximum allowed number" }, { "pc": [ 1134, 1191, 1214, 2437, 3172, 3282, 3809, 4085, 4154, 4446 ], "errorMessage": "overflow" }, { "pc": [ 1531 ], "errorMessage": "pool id must be between 1 and number of pools for this validator" }, { "pc": [ 5174 ], "errorMessage": "pool id not in valid range" }, { "pc": [ 5194 ], "errorMessage": "pool id outside of range of pools created for this validator" }, { "pc": [ 2792 ], "errorMessage": "provided nfd for entry isn't owned or linked to the staker" }, { "pc": [ 4018 ], "errorMessage": "reward being removed must be covered by hold back amount" }, { "pc": [ 4008 ], "errorMessage": "rewardRemoved can't be set if validator doesn't have reward token!" }, { "pc": [ 1841 ], "errorMessage": "sender must be owner to add new validator" }, { "pc": [ 3886 ], "errorMessage": "should only be called if algo or reward was removed" }, { "pc": [ 2760 ], "errorMessage": "specified asset must be created by creator that is one of the linked addresses in an nfd" }, { "pc": [ 2686 ], "errorMessage": "specified asset must be created by creator that the validator defined as a requirement to stake" }, { "pc": [ 2733 ], "errorMessage": "specified asset must be identical to the asset id defined as a requirement to stake" }, { "pc": [ 2824 ], "errorMessage": "specified nfd must be a segment of the nfd the validator specified as a requirement" }, { "pc": [ 2318, 2532 ], "errorMessage": "specified validator id isn't valid" }, { "pc": [ 1916 ], "errorMessage": "staking pool must have minimum entry of 1 algo" }, { "pc": [ 1955 ], "errorMessage": "sunsettingOn must be later than now if set" }, { "pc": [ 1799 ], "errorMessage": "the specified validator id doesn't exist" }, { "pc": [ 5164 ], "errorMessage": "the specified validator id isn't valid" }, { "pc": [ 5009 ], "errorMessage": "this validator doesn't have a reward token defined" }, { "pc": [ 2887 ], "errorMessage": "total staked for all of a validators pools may not exceed hard cap" }, { "pc": [ 425, 459, 614 ], "errorMessage": "transaction type is pay" }, { "pc": [ 1907 ], "errorMessage": "validatorCommissionAddress must be set if percent to validator is not 0" } ], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDE4IDggMjY4IDQzMiAyMDAgNzAwIDkwMCAxOTIgMTAwMDAwMCAyMjYgMjA5IDQwOTYgMjc4IDI1MiA3NDEwMCBUTVBMX05GRF9SRUdJU1RSWV9BUFBfSUQKICAgIGJ5dGVjYmxvY2sgInYiIDB4MTUxZjdjNzUgIiIgInN0YWtlZCIgIm51bVN0YWtlcnMiICJzcHMiIDB4MDAgInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiICJudW1WIiAiaS5vd25lci5hIiAiaW5pdCIgMHgwMDAyIDB4MDAwMCAweDA2ODEwMSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIDB4MDAwMTAwMDAwMDAwMDAwMDAzZTggMHg2M2YzZjI4YiAweDEyZjRiZDRiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDQwCiAgICBwdXNoYnl0ZXNzIDB4Yjg0NDdiMzYgMHgxYjVlODJjNiAweDc5NDcyZDgzIDB4NWY3YWNmZDkgMHgzMTcyY2E5ZCAweDhhODcxNDJkIDB4ZDEzNjZjYzMgMHgzYjA0NWM1YyAweDc1YWZmNjFkIDB4MWYyZjAxMDkgMHgyZmEyMmM0YiAweDkxMGU5NGFjIDB4NTcyNzY3ZDEgMHg5YjUwNGFhZiAweGZiYzYzMTc4IDB4MjQ0OThjZjQgMHhmODQ2ZGQ3YSAweDgzMDUwNTAxIDB4N2JiYjZjOGQgMHhmODM5NDE0YSAweDBjMzE3Y2ZiIDB4M2UyODg5NzIgMHhkZDVmYWFkYSAweDE4YWFjN2E3IDB4Zjk5ZWY1NGQgMHgxMDgwOWQ0ZCAweGU3NzhkZDVhIDB4YmY1MjU5ZDAgMHg0ZGY4ZDg2ZSAweDQxOGZjZWZjIDB4YTJkYzUxYjUgMHgyODczZjUwNCAweDA1NDdmNGZlIDB4Y2I2NjgzNTggLy8gbWV0aG9kICJjcmVhdGVBcHBsaWNhdGlvbigpdm9pZCIsIG1ldGhvZCAiaW5pdFN0YWtpbmdDb250cmFjdCh1aW50NjQpdm9pZCIsIG1ldGhvZCAibG9hZFN0YWtpbmdDb250cmFjdERhdGEodWludDY0LGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpdm9pZCIsIG1ldGhvZCAiZ2FzKCl2b2lkIiwgbWV0aG9kICJnZXRNYnJBbW91bnRzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXROdW1WYWxpZGF0b3JzKCl1aW50NjQiLCBtZXRob2QgImdldFZhbGlkYXRvckNvbmZpZyh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQzMix1aW50MzIsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRWYWxpZGF0b3JTdGF0ZSh1aW50NjQpKHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcih1aW50NjQpKGFkZHJlc3MsYWRkcmVzcykiLCBtZXRob2QgImdldFBvb2xzKHVpbnQ2NCkodWludDY0LHVpbnQxNix1aW50NjQpW10iLCBtZXRob2QgImdldFBvb2xBcHBJZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZ2V0UG9vbEluZm8oKHVpbnQ2NCx1aW50NjQsdWludDY0KSkodWludDY0LHVpbnQxNix1aW50NjQpIiwgbWV0aG9kICJnZXRDdXJNYXhTdGFrZVBlclBvb2wodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZG9lc1N0YWtlck5lZWRUb1BheU1CUihhZGRyZXNzKWJvb2wiLCBtZXRob2QgImdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAiZ2V0VG9rZW5QYXlvdXRSYXRpbyh1aW50NjQpKHVpbnQ2NFsyNF0sdWludDY0KSIsIG1ldGhvZCAiZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh1aW50NjQpKCh1aW50NjRbM10pWzhdKSIsIG1ldGhvZCAiZ2V0TkZEUmVnaXN0cnlJRCgpdWludDY0IiwgbWV0aG9kICJhZGRWYWxpZGF0b3IocGF5LHN0cmluZywodWludDY0LGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDgsYWRkcmVzcyx1aW50NjRbNF0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDMyLHVpbnQzMixhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHVpbnQ2NCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImNoYW5nZVZhbGlkYXRvclN1bnNldEluZm8odWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2hhbmdlVmFsaWRhdG9yTkZEKHVpbnQ2NCx1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHVpbnQ2NCxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odWludDY0LHVpbnQ4LGFkZHJlc3MsdWludDY0WzRdLHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiYWRkUG9vbChwYXksdWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhZGRTdGFrZShwYXksdWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJzZXRUb2tlblBheW91dFJhdGlvKHVpbnQ2NCkodWludDY0WzI0XSx1aW50NjQpIiwgbWV0aG9kICJzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzKCh1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgInN0YWtlUmVtb3ZlZCgodWludDY0LHVpbnQ2NCx1aW50NjQpLGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sKXZvaWQiLCBtZXRob2QgImZpbmRQb29sRm9yU3Rha2VyKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkoKHVpbnQ2NCx1aW50NjQsdWludDY0KSxib29sLGJvb2wpIiwgbWV0aG9kICJtb3ZlUG9vbFRvTm9kZSh1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJlbXB0eVRva2VuUmV3YXJkcyh1aW50NjQsYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDMgbWFpbl9pbml0U3Rha2luZ0NvbnRyYWN0X3JvdXRlQDQgbWFpbl9sb2FkU3Rha2luZ0NvbnRyYWN0RGF0YV9yb3V0ZUA1IG1haW5fZmluYWxpemVTdGFraW5nQ29udHJhY3Rfcm91dGVANiBtYWluX2dhc19yb3V0ZUA3IG1haW5fZ2V0TWJyQW1vdW50c19yb3V0ZUA4IG1haW5fZ2V0UHJvdG9jb2xDb25zdHJhaW50c19yb3V0ZUA5IG1haW5fZ2V0TnVtVmFsaWRhdG9yc19yb3V0ZUAxMCBtYWluX2dldFZhbGlkYXRvckNvbmZpZ19yb3V0ZUAxMSBtYWluX2dldFZhbGlkYXRvclN0YXRlX3JvdXRlQDEyIG1haW5fZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyX3JvdXRlQDEzIG1haW5fZ2V0UG9vbHNfcm91dGVAMTQgbWFpbl9nZXRQb29sQXBwSWRfcm91dGVAMTUgbWFpbl9nZXRQb29sSW5mb19yb3V0ZUAxNiBtYWluX2dldEN1ck1heFN0YWtlUGVyUG9vbF9yb3V0ZUAxNyBtYWluX2RvZXNTdGFrZXJOZWVkVG9QYXlNQlJfcm91dGVAMTggbWFpbl9nZXRTdGFrZWRQb29sc0ZvckFjY291bnRfcm91dGVAMTkgbWFpbl9nZXRUb2tlblBheW91dFJhdGlvX3JvdXRlQDIwIG1haW5fZ2V0Tm9kZVBvb2xBc3NpZ25tZW50c19yb3V0ZUAyMSBtYWluX2dldE5GRFJlZ2lzdHJ5SURfcm91dGVAMjIgbWFpbl9hZGRWYWxpZGF0b3Jfcm91dGVAMjMgbWFpbl9jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyX3JvdXRlQDI0IG1haW5fY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mb19yb3V0ZUAyNSBtYWluX2NoYW5nZVZhbGlkYXRvck5GRF9yb3V0ZUAyNiBtYWluX2NoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzX3JvdXRlQDI3IG1haW5fY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mb19yb3V0ZUAyOCBtYWluX2FkZFBvb2xfcm91dGVAMjkgbWFpbl9hZGRTdGFrZV9yb3V0ZUAzMCBtYWluX3NldFRva2VuUGF5b3V0UmF0aW9fcm91dGVAMzEgbWFpbl9zdGFrZVVwZGF0ZWRWaWFSZXdhcmRzX3JvdXRlQDMyIG1haW5fc3Rha2VSZW1vdmVkX3JvdXRlQDMzIG1haW5fZmluZFBvb2xGb3JTdGFrZXJfcm91dGVAMzQgbWFpbl9tb3ZlUG9vbFRvTm9kZV9yb3V0ZUAzNSBtYWluX2VtcHR5VG9rZW5SZXdhcmRzX3JvdXRlQDM2CgptYWluX2FmdGVyX2lmX2Vsc2VANDA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2VtcHR5VG9rZW5SZXdhcmRzX3JvdXRlQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0NgogICAgLy8gZW1wdHlUb2tlblJld2FyZHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcmVjZWl2ZXI6IEFkZHJlc3MpOiB1aW50NjQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTQ2CiAgICAvLyBlbXB0eVRva2VuUmV3YXJkcyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCByZWNlaXZlcjogQWRkcmVzcyk6IHVpbnQ2NCB7CiAgICBjYWxsc3ViIGVtcHR5VG9rZW5SZXdhcmRzCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX21vdmVQb29sVG9Ob2RlX3JvdXRlQDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOAogICAgLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTA4CiAgICAvLyBtb3ZlUG9vbFRvTm9kZSh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBwb29sQXBwSWQ6IHVpbnQ2NCwgbm9kZU51bTogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIG1vdmVQb29sVG9Ob2RlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2ZpbmRQb29sRm9yU3Rha2VyX3JvdXRlQDM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgzNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MzUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBmaW5kUG9vbEZvclN0YWtlcgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFrZVJlbW92ZWRfcm91dGVAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQwLTc0NgogICAgLy8gc3Rha2VSZW1vdmVkKAogICAgLy8gICBwb29sS2V5OiBWYWxpZGF0b3JQb29sS2V5LAogICAgLy8gICBzdGFrZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudFJlbW92ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcmV3YXJkUmVtb3ZlZDogdWludDY0LAogICAgLy8gICBzdGFrZXJSZW1vdmVkOiBib29sZWFuLAogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NDAtNzQ2CiAgICAvLyBzdGFrZVJlbW92ZWQoCiAgICAvLyAgIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksCiAgICAvLyAgIHN0YWtlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50UmVtb3ZlZDogdWludDY0LAogICAgLy8gICByZXdhcmRSZW1vdmVkOiB1aW50NjQsCiAgICAvLyAgIHN0YWtlclJlbW92ZWQ6IGJvb2xlYW4sCiAgICAvLyApOiB2b2lkIHsKICAgIGNhbGxzdWIgc3Rha2VSZW1vdmVkCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0YWtlVXBkYXRlZFZpYVJld2FyZHNfcm91dGVAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njk4LTcwNAogICAgLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygKICAgIC8vICAgcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleSwKICAgIC8vICAgYWxnb1RvQWRkOiB1aW50NjQsCiAgICAvLyAgIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NCwKICAgIC8vICAgdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0LAogICAgLy8gICBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4LTg5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY5OC03MDQKICAgIC8vIHN0YWtlVXBkYXRlZFZpYVJld2FyZHMoCiAgICAvLyAgIHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXksCiAgICAvLyAgIGFsZ29Ub0FkZDogdWludDY0LAogICAgLy8gICByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkOiB1aW50NjQsCiAgICAvLyAgIHZhbGlkYXRvckNvbW1pc3Npb246IHVpbnQ2NCwKICAgIC8vICAgc2F0dXJhdGVkQnVyblRvRmVlU2luazogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICBjYWxsc3ViIHN0YWtlVXBkYXRlZFZpYVJld2FyZHMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0VG9rZW5QYXlvdXRSYXRpb19yb3V0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDMKICAgIC8vIHNldFRva2VuUGF5b3V0UmF0aW8odmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xUb2tlblBheW91dFJhdGlvIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4LTg5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY0MwogICAgLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8gewogICAgY2FsbHN1YiBzZXRUb2tlblBheW91dFJhdGlvCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FkZFN0YWtlX3JvdXRlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU1NS01NTkKICAgIC8vIGFkZFN0YWtlKAogICAgLy8gICBzdGFrZWRBbW91bnRQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsCiAgICAvLyAgIHZhbHVlVG9WZXJpZnk6IHVpbnQ2NCwKICAgIC8vICk6IFZhbGlkYXRvclBvb2xLZXkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NTUtNTU5CiAgICAvLyBhZGRTdGFrZSgKICAgIC8vICAgc3Rha2VkQW1vdW50UGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLAogICAgLy8gICB2YWx1ZVRvVmVyaWZ5OiB1aW50NjQsCiAgICAvLyApOiBWYWxpZGF0b3JQb29sS2V5IHsKICAgIGNhbGxzdWIgYWRkU3Rha2UKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkUG9vbF9yb3V0ZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTIKICAgIC8vIGFkZFBvb2wobWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBub2RlTnVtOiB1aW50NjQpOiBWYWxpZGF0b3JQb29sS2V5IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4LTg5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDkyCiAgICAvLyBhZGRQb29sKG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgbm9kZU51bTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleSB7CiAgICBjYWxsc3ViIGFkZFBvb2wKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mb19yb3V0ZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NTEtNDU4CiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvKAogICAgLy8gICB2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLAogICAgLy8gICBFbnRyeUdhdGluZ1R5cGU6IFVpbnQ4LAogICAgLy8gICBFbnRyeUdhdGluZ0FkZHJlc3M6IEFkZHJlc3MsCiAgICAvLyAgIEVudHJ5R2F0aW5nQXNzZXRzOiBGaXhlZEFycmF5PHVpbnQ2NCwgND4sCiAgICAvLyAgIEdhdGluZ0Fzc2V0TWluQmFsYW5jZTogdWludDY0LAogICAgLy8gICBSZXdhcmRQZXJQYXlvdXQ6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDUxLTQ1OAogICAgLy8gY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbygKICAgIC8vICAgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwKICAgIC8vICAgRW50cnlHYXRpbmdUeXBlOiBVaW50OCwKICAgIC8vICAgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLAogICAgLy8gICBFbnRyeUdhdGluZ0Fzc2V0czogRml4ZWRBcnJheTx1aW50NjQsIDQ+LAogICAgLy8gICBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NCwKICAgIC8vICAgUmV3YXJkUGVyUGF5b3V0OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzc19yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NDEKICAgIC8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NDEKICAgIC8vIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIGNvbW1pc3Npb25BZGRyZXNzOiBBZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIGNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZVZhbGlkYXRvck5GRF9yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjUKICAgIC8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4LTg5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MjUKICAgIC8vIGNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGNhbGxzdWIgY2hhbmdlVmFsaWRhdG9yTkZECiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZVZhbGlkYXRvclN1bnNldEluZm9fcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDEwCiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN1bnNldHRpbmdPbjogdWludDY0LCBzdW5zZXR0aW5nVG86IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDEwCiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN1bnNldHRpbmdPbjogdWludDY0LCBzdW5zZXR0aW5nVG86IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQgewogICAgY2FsbHN1YiBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NoYW5nZVZhbGlkYXRvck1hbmFnZXJfcm91dGVAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk2CiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIG1hbmFnZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4LTg5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM5NgogICAgLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIGNoYW5nZVZhbGlkYXRvck1hbmFnZXIKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkVmFsaWRhdG9yX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0OQogICAgLy8gYWRkVmFsaWRhdG9yKG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgbmZkTmFtZTogc3RyaW5nLCBjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHVpbnQ2NCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNDkKICAgIC8vIGFkZFZhbGlkYXRvcihtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sIG5mZE5hbWU6IHN0cmluZywgY29uZmlnOiBWYWxpZGF0b3JDb25maWcpOiB1aW50NjQgewogICAgY2FsbHN1YiBhZGRWYWxpZGF0b3IKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0TkZEUmVnaXN0cnlJRF9yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMzYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzM4CiAgICAvLyByZXR1cm4gbmZkUmVnaXN0cnlBcHBJZAogICAgaW50YyAxNyAvLyBUTVBMX05GRF9SRUdJU1RSWV9BUFBfSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMzYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXROb2RlUG9vbEFzc2lnbm1lbnRzX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyOQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBnZXROb2RlUG9vbEFzc2lnbm1lbnRzCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldFRva2VuUGF5b3V0UmF0aW9fcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzI0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4LTg5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyNAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGdldFRva2VuUGF5b3V0UmF0aW8KICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMwMgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMDIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBnZXRTdGFrZWRQb29sc0ZvckFjY291bnQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZG9lc1N0YWtlck5lZWRUb1BheU1CUl9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyOTEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjkxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgogICAgYnl0ZWMgNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0Q3VyTWF4U3Rha2VQZXJQb29sX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI3MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNzMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBnZXRDdXJNYXhTdGFrZVBlclBvb2wKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0UG9vbEluZm9fcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjYxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4LTg5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGdldFBvb2xJbmZvCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldFBvb2xBcHBJZF9yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNTIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjUyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0UG9vbEFwcElkCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldFBvb2xzX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzMwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBnZXRQb29scwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXJfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4LTg5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIyMgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGdldFZhbGlkYXRvck93bmVyQW5kTWFuYWdlcgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRWYWxpZGF0b3JTdGF0ZV9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODgtODkKICAgIC8vIEBjb250cmFjdCh7IGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VmFsaWRhdG9yU3RhdGUKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0VmFsaWRhdG9yQ29uZmlnX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIxMgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMTIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBnZXRWYWxpZGF0b3JDb25maWcKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0TnVtVmFsaWRhdG9yc19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldE51bVZhbGlkYXRvcnMKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0UHJvdG9jb2xDb25zdHJhaW50c19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0UHJvdG9jb2xDb25zdHJhaW50cwogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRNYnJBbW91bnRzX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTUxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDAwMDAwMDAwMDZjMjE0MDAwMDAwMDAwMDBlYjNhYzAwMDAwMDAwMDA0ZmJiNTQwMDAwMDAwMDAwMDEyMTc0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2FzX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTQwCiAgICAvLyBnYXMoKTogdm9pZCB7fQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2ZpbmFsaXplU3Rha2luZ0NvbnRyYWN0X3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMzCiAgICAvLyBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBmaW5hbGl6ZVN0YWtpbmdDb250cmFjdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9sb2FkU3Rha2luZ0NvbnRyYWN0RGF0YV9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyOAogICAgLy8gbG9hZFN0YWtpbmdDb250cmFjdERhdGEob2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OC04OQogICAgLy8gQGNvbnRyYWN0KHsgYXZtVmVyc2lvbjogMTEgfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4CiAgICAvLyBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YShvZmZzZXQ6IHVpbnQ2NCwgZGF0YTogYnl0ZXMpOiB2b2lkIHsKICAgIGNhbGxzdWIgbG9hZFN0YWtpbmdDb250cmFjdERhdGEKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5faW5pdFN0YWtpbmdDb250cmFjdF9yb3V0ZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMwogICAgLy8gaW5pdFN0YWtpbmdDb250cmFjdChhcHByb3ZhbFByb2dyYW1TaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4LTg5CiAgICAvLyBAY29udHJhY3QoeyBhdm1WZXJzaW9uOiAxMSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMwogICAgLy8gaW5pdFN0YWtpbmdDb250cmFjdChhcHByb3ZhbFByb2dyYW1TaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIGNhbGxzdWIgaW5pdFN0YWtpbmdDb250cmFjdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVBcHBsaWNhdGlvbl9yb3V0ZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNgogICAgLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDEzIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTMgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANjoKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDc6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3V0aWxzLmFsZ28udHM6OndpZGVSYXRpbyhudW1lcmF0b3JGYWN0b3JzOiBieXRlcywgZGVub21pbmF0b3JGYWN0b3JzOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6CndpZGVSYXRpbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdXRpbHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgZnVuY3Rpb24gd2lkZVJhdGlvKG51bWVyYXRvckZhY3RvcnM6IHVpbnQ2NFtdLCBkZW5vbWluYXRvckZhY3RvcnM6IHVpbnQ2NFtdKTogdWludDY0IHsKICAgIHByb3RvIDIgMwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjUKICAgIC8vIGxldCBudW1lcmF0b3IgPSBuZXcgVWludDEyOCgxbikKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdXRpbHMuYWxnby50czo2CiAgICAvLyBmb3IgKGNvbnN0IGZhY3RvciBvZiBudW1lcmF0b3JGYWN0b3JzKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCndpZGVSYXRpb19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3V0aWxzLmFsZ28udHM6NgogICAgLy8gZm9yIChjb25zdCBmYWN0b3Igb2YgbnVtZXJhdG9yRmFjdG9ycykgewogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiB3aWRlUmF0aW9fYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjcKICAgIC8vIG51bWVyYXRvciA9IG5ldyBVaW50MTI4KEJpZ1VpbnQoZmFjdG9yKSAqIG51bWVyYXRvci5uYXRpdmUpCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMwogICAgYioKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBiemVybwogICAgYnwKICAgIGZyYW1lX2J1cnkgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNQogICAgYiB3aWRlUmF0aW9fZm9yX2hlYWRlckAxCgp3aWRlUmF0aW9fYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3V0aWxzLmFsZ28udHM6MTAKICAgIC8vIGxldCBkZW5vbWluYXRvciA9IG5ldyBVaW50MTI4KDFuKQogICAgYnl0ZWMgMTQgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3V0aWxzLmFsZ28udHM6MTEKICAgIC8vIGZvciAoY29uc3QgZmFjdG9yIG9mIGRlbm9taW5hdG9yRmFjdG9ycykgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKd2lkZVJhdGlvX2Zvcl9oZWFkZXJANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdXRpbHMuYWxnby50czoxMQogICAgLy8gZm9yIChjb25zdCBmYWN0b3Igb2YgZGVub21pbmF0b3JGYWN0b3JzKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IHdpZGVSYXRpb19hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3V0aWxzLmFsZ28udHM6MTIKICAgIC8vIGRlbm9taW5hdG9yID0gbmV3IFVpbnQxMjgoQmlnVWludChmYWN0b3IpICogZGVub21pbmF0b3IubmF0aXZlKQogICAgaXRvYgogICAgZnJhbWVfZGlnIDAKICAgIGIqCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgcHVzaGludCAxNiAvLyAxNgogICAgYnplcm8KICAgIGJ8CiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgd2lkZVJhdGlvX2Zvcl9oZWFkZXJANQoKd2lkZVJhdGlvX2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC91dGlscy5hbGdvLnRzOjE1CiAgICAvLyBjb25zdCByYXRpbzogYmlndWludCA9IG51bWVyYXRvci5uYXRpdmUgLyBkZW5vbWluYXRvci5uYXRpdmUKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdXRpbHMuYWxnby50czoxNgogICAgLy8gcmV0dXJuIG5ldyBVaW50NjQocmF0aW8pLm5hdGl2ZQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzMgLy8gOAogICAgYnplcm8KICAgIGJ8CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5jcmVhdGVBcHBsaWNhdGlvbigpIC0+IHZvaWQ6CmNyZWF0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk1CiAgICAvLyBzdGFraW5nUG9vbEluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6ICdpbml0JyB9KQogICAgYnl0ZWMgMTAgLy8gImluaXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTcKICAgIC8vIG51bVZhbGlkYXRvcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtVicgfSkKICAgIGJ5dGVjIDggLy8gIm51bVYiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE4CiAgICAvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDAKICAgIC8vIG51bVN0YWtlcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtU3Rha2VycycgfSkKICAgIGJ5dGVjIDQgLy8gIm51bVN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5CiAgICAvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDMKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlY18zIC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIwCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSA9IDAKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5pbml0U3Rha2luZ0NvbnRyYWN0KGFwcHJvdmFsUHJvZ3JhbVNpemU6IHVpbnQ2NCkgLT4gdm9pZDoKaW5pdFN0YWtpbmdDb250cmFjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjMKICAgIC8vIGluaXRTdGFraW5nQ29udHJhY3QoYXBwcm92YWxQcm9ncmFtU2l6ZTogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MwogICAgLy8gc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0gPSBCb3g8Ynl0ZXM+KHsga2V5OiAncG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcycgfSkKICAgIGJ5dGVjIDcgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1CiAgICAvLyB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmNyZWF0ZSh7IHNpemU6IGFwcHJvdmFsUHJvZ3JhbVNpemUgfSkKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmxvYWRTdGFraW5nQ29udHJhY3REYXRhKG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcykgLT4gdm9pZDoKbG9hZFN0YWtpbmdDb250cmFjdERhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI4CiAgICAvLyBsb2FkU3Rha2luZ0NvbnRyYWN0RGF0YShvZmZzZXQ6IHVpbnQ2NCwgZGF0YTogYnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyOQogICAgLy8gYXNzZXJ0KCF0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk1CiAgICAvLyBzdGFraW5nUG9vbEluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6ICdpbml0JyB9KQogICAgYnl0ZWMgMTAgLy8gImluaXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI5CiAgICAvLyBhc3NlcnQoIXRoaXMuc3Rha2luZ1Bvb2xJbml0aWFsaXplZC52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MwogICAgLy8gc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0gPSBCb3g8Ynl0ZXM+KHsga2V5OiAncG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcycgfSkKICAgIGJ5dGVjIDcgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMwCiAgICAvLyB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnJlZi5yZXBsYWNlKG9mZnNldCwgZGF0YSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcmVwbGFjZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5maW5hbGl6ZVN0YWtpbmdDb250cmFjdCgpIC0+IHZvaWQ6CmZpbmFsaXplU3Rha2luZ0NvbnRyYWN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk1CiAgICAvLyBzdGFraW5nUG9vbEluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBrZXk6ICdpbml0JyB9KQogICAgYnl0ZWMgMTAgLy8gImluaXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM0CiAgICAvLyB0aGlzLnN0YWtpbmdQb29sSW5pdGlhbGl6ZWQudmFsdWUgPSB0cnVlCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0UHJvdG9jb2xDb25zdHJhaW50cygpIC0+IGJ5dGVzOgpnZXRQcm90b2NvbENvbnN0cmFpbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNTUKICAgIC8vIHJldHVybiBHbG9iYWwucGF5b3V0c01heEJhbGFuY2UKICAgIGdsb2JhbCBQYXlvdXRzTWF4QmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5NgogICAgLy8gbWF4QWxnb1BlclZhbGlkYXRvcjogdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKICAgIGNhbGxzdWIgbWF4QWxsb3dlZFN0YWtlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1OQogICAgLy8gcmV0dXJuIG9wLm9ubGluZVN0YWtlKCkKICAgIG9ubGluZV9zdGFrZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMzgKICAgIC8vIHJldHVybiB3aWRlUmF0aW8oW29ubGluZSwgTUFYX1ZBTElEQVRPUl9TT0ZUX1BDVF9PRl9PTkxJTkVfMURFQ0lNQUxdLCBbMTAwMF0pCiAgICBpdG9iCiAgICBieXRlYyAxMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDE1IC8vIDB4MDAwMTAwMDAwMDAwMDAwMDAzZTgKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxODktMjAxCiAgICAvLyByZXR1cm4gewogICAgLy8gICBlcG9jaFBheW91dFJvdW5kc01pbjogTUlOX0VQT0NIX0xFTkdUSCwKICAgIC8vICAgZXBvY2hQYXlvdXRSb3VuZHNNYXg6IE1BWF9FUE9DSF9MRU5HVEgsCiAgICAvLyAgIG1pblBjdFRvVmFsaWRhdG9yV0ZvdXJEZWNpbWFsczogTUlOX1BDVF9UT19WQUxJREFUT1IsCiAgICAvLyAgIG1heFBjdFRvVmFsaWRhdG9yV0ZvdXJEZWNpbWFsczogTUFYX1BDVF9UT19WQUxJREFUT1IsCiAgICAvLyAgIG1pbkVudHJ5U3Rha2U6IE1JTl9BTEdPX1NUQUtFX1BFUl9QT09MLAogICAgLy8gICBtYXhBbGdvUGVyUG9vbDogdGhpcy5tYXhBbGdvQWxsb3dlZFBlclBvb2woKSwKICAgIC8vICAgbWF4QWxnb1BlclZhbGlkYXRvcjogdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKICAgIC8vICAgYW10Q29uc2lkZXJlZFNhdHVyYXRlZDogdGhpcy5hbGdvU2F0dXJhdGlvbkxldmVsKCksCiAgICAvLyAgIG1heE5vZGVzOiBNQVhfTk9ERVMsCiAgICAvLyAgIG1heFBvb2xzUGVyTm9kZTogTUFYX1BPT0xTX1BFUl9OT0RFLAogICAgLy8gICBtYXhTdGFrZXJzUGVyUG9vbDogTUFYX1NUQUtFUlNfUEVSX1BPT0wsCiAgICAvLyB9CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMGY0MjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZjQyNDAwMDAwMDAwMDAwMGY0MjQwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxOTgKICAgIC8vIG1heE5vZGVzOiBNQVhfTk9ERVMsCiAgICBpbnRjXzMgLy8gOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4OS0yMDEKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAogICAgLy8gICBlcG9jaFBheW91dFJvdW5kc01heDogTUFYX0VQT0NIX0xFTkdUSCwKICAgIC8vICAgbWluUGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNSU5fUENUX1RPX1ZBTElEQVRPUiwKICAgIC8vICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKICAgIC8vICAgbWluRW50cnlTdGFrZTogTUlOX0FMR09fU1RBS0VfUEVSX1BPT0wsCiAgICAvLyAgIG1heEFsZ29QZXJQb29sOiB0aGlzLm1heEFsZ29BbGxvd2VkUGVyUG9vbCgpLAogICAgLy8gICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAogICAgLy8gICBhbXRDb25zaWRlcmVkU2F0dXJhdGVkOiB0aGlzLmFsZ29TYXR1cmF0aW9uTGV2ZWwoKSwKICAgIC8vICAgbWF4Tm9kZXM6IE1BWF9OT0RFUywKICAgIC8vICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCiAgICAvLyAgIG1heFN0YWtlcnNQZXJQb29sOiBNQVhfU1RBS0VSU19QRVJfUE9PTCwKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE5OQogICAgLy8gbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4OS0yMDEKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAogICAgLy8gICBlcG9jaFBheW91dFJvdW5kc01heDogTUFYX0VQT0NIX0xFTkdUSCwKICAgIC8vICAgbWluUGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNSU5fUENUX1RPX1ZBTElEQVRPUiwKICAgIC8vICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKICAgIC8vICAgbWluRW50cnlTdGFrZTogTUlOX0FMR09fU1RBS0VfUEVSX1BPT0wsCiAgICAvLyAgIG1heEFsZ29QZXJQb29sOiB0aGlzLm1heEFsZ29BbGxvd2VkUGVyUG9vbCgpLAogICAgLy8gICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAogICAgLy8gICBhbXRDb25zaWRlcmVkU2F0dXJhdGVkOiB0aGlzLmFsZ29TYXR1cmF0aW9uTGV2ZWwoKSwKICAgIC8vICAgbWF4Tm9kZXM6IE1BWF9OT0RFUywKICAgIC8vICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCiAgICAvLyAgIG1heFN0YWtlcnNQZXJQb29sOiBNQVhfU1RBS0VSU19QRVJfUE9PTCwKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwMAogICAgLy8gbWF4U3Rha2Vyc1BlclBvb2w6IE1BWF9TVEFLRVJTX1BFUl9QT09MLAogICAgaW50YyA2IC8vIDIwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjE4OS0yMDEKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGVwb2NoUGF5b3V0Um91bmRzTWluOiBNSU5fRVBPQ0hfTEVOR1RILAogICAgLy8gICBlcG9jaFBheW91dFJvdW5kc01heDogTUFYX0VQT0NIX0xFTkdUSCwKICAgIC8vICAgbWluUGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNSU5fUENUX1RPX1ZBTElEQVRPUiwKICAgIC8vICAgbWF4UGN0VG9WYWxpZGF0b3JXRm91ckRlY2ltYWxzOiBNQVhfUENUX1RPX1ZBTElEQVRPUiwKICAgIC8vICAgbWluRW50cnlTdGFrZTogTUlOX0FMR09fU1RBS0VfUEVSX1BPT0wsCiAgICAvLyAgIG1heEFsZ29QZXJQb29sOiB0aGlzLm1heEFsZ29BbGxvd2VkUGVyUG9vbCgpLAogICAgLy8gICBtYXhBbGdvUGVyVmFsaWRhdG9yOiB0aGlzLm1heEFsbG93ZWRTdGFrZSgpLAogICAgLy8gICBhbXRDb25zaWRlcmVkU2F0dXJhdGVkOiB0aGlzLmFsZ29TYXR1cmF0aW9uTGV2ZWwoKSwKICAgIC8vICAgbWF4Tm9kZXM6IE1BWF9OT0RFUywKICAgIC8vICAgbWF4UG9vbHNQZXJOb2RlOiBNQVhfUE9PTFNfUEVSX05PREUsCiAgICAvLyAgIG1heFN0YWtlcnNQZXJQb29sOiBNQVhfU1RBS0VSU19QRVJfUE9PTCwKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5nZXROdW1WYWxpZGF0b3JzKCkgLT4gdWludDY0OgpnZXROdW1WYWxpZGF0b3JzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIwOQogICAgLy8gcmV0dXJuIHRoaXMubnVtVmFsaWRhdG9ycy52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NwogICAgLy8gbnVtVmFsaWRhdG9ycyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdudW1WJyB9KQogICAgYnl0ZWMgOCAvLyAibnVtViIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMDkKICAgIC8vIHJldHVybiB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmdldFZhbGlkYXRvckNvbmZpZyh2YWxpZGF0b3JJZDogdWludDY0KSAtPiBieXRlczoKZ2V0VmFsaWRhdG9yQ29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIxMi0yMTMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0VmFsaWRhdG9yQ29uZmlnKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiBWYWxpZGF0b3JDb25maWcgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjE0CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMTQKICAgIC8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0VmFsaWRhdG9yU3RhdGUodmFsaWRhdG9ySWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldFZhbGlkYXRvclN0YXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIxNy0yMTgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0VmFsaWRhdG9yU3RhdGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFZhbGlkYXRvckN1clN0YXRlIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIxOQogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMTkKICAgIC8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAyNDIgMjYKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0VmFsaWRhdG9yT3duZXJBbmRNYW5hZ2VyKHZhbGlkYXRvcklkOiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjIyLTIyMwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRWYWxpZGF0b3JPd25lckFuZE1hbmFnZXIodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFtBZGRyZXNzLCBBZGRyZXNzXSB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMjQKICAgIC8vIHJldHVybiBbdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIsIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1hbmFnZXJdCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjI0CiAgICAvLyByZXR1cm4gW3RoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLCB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGR1cAogICAgZXh0cmFjdCA4IDMyCiAgICBzd2FwCiAgICBleHRyYWN0IDQwIDMyCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0UG9vbHModmFsaWRhdG9ySWQ6IHVpbnQ2NCkgLT4gYnl0ZXM6CmdldFBvb2xzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzMy0yMzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0UG9vbHModmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSk6IFBvb2xJbmZvW10gewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzNQogICAgLy8gY29uc3QgcmV0RGF0YTogUG9vbEluZm9bXSA9IFtdCiAgICBieXRlYyAxMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzYKICAgIC8vIGNvbnN0IHBvb2xTZXQgPSBjbG9uZSh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzNgogICAgLy8gY29uc3QgcG9vbFNldCA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzNwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCgpnZXRQb29sc193aGlsZV90b3BAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgPAogICAgYnogZ2V0UG9vbHNfYmxvY2tANgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjIzOAogICAgLy8gaWYgKHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBnZXRQb29sc19ibG9ja0A2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjQyCiAgICAvLyByZXREYXRhLnB1c2gocG9vbFNldFtpXSkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGZyYW1lX2RpZyAwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyMzcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwb29sU2V0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRQb29sc193aGlsZV90b3BAMQoKZ2V0UG9vbHNfYmxvY2tANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNDQKICAgIC8vIHJldHVybiByZXREYXRhCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmdldFBvb2xBcHBJZCh2YWxpZGF0b3JJZDogdWludDY0LCBwb29sSWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRQb29sQXBwSWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjUyLTI1MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRQb29sQXBwSWQodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgcG9vbElkOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjU1CiAgICAvLyBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAogICAgZnJhbWVfZGlnIC0xCiAgICBieiBnZXRQb29sQXBwSWRfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjU1CiAgICAvLyBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICA8PQogICAgYnogZ2V0UG9vbEFwcElkX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmdldFBvb2xBcHBJZF9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjU0LTI1NwogICAgLy8gYXNzZXJ0KAogICAgLy8gICBwb29sSWQgIT09IDAgJiYgcG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHMubGVuZ3RoLAogICAgLy8gICAncG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcicsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gcG9vbCBpZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgbnVtYmVyIG9mIHBvb2xzIGZvciB0aGlzIHZhbGlkYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI1OAogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbcG9vbElkIC0gMV0ucG9vbEFwcElkCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjU4CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1twb29sSWQgLSAxXS5wb29sQXBwSWQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBzd2FwCiAgICBpbnRjIDQgLy8gMjY4CiAgICBpbnRjIDUgLy8gNDMyCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgaW50Y18yIC8vIDE4CiAgICAqCiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICByZXRzdWIKCmdldFBvb2xBcHBJZF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRQb29sQXBwSWRfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5nZXRQb29sSW5mbyhwb29sS2V5OiBieXRlcykgLT4gYnl0ZXM6CmdldFBvb2xJbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2MS0yNjIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0UG9vbEluZm8ocG9vbEtleTogVmFsaWRhdG9yUG9vbEtleSk6IFBvb2xJbmZvIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI2MwogICAgLy8gcmV0dXJuIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyNjMKICAgIC8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIHN3YXAKICAgIGludGNfMiAvLyAxOAogICAgKgogICAgaW50Y18yIC8vIDE4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiB1aW50NjQpIC0+IHVpbnQ2NDoKZ2V0Q3VyTWF4U3Rha2VQZXJQb29sOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI3My0yNzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0Q3VyTWF4U3Rha2VQZXJQb29sKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBieXRlY18yIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjc1CiAgICAvLyBjb25zdCBudW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjc1CiAgICAvLyBjb25zdCBudW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDI0MiAyNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjc2CiAgICAvLyBjb25zdCBoYXJkTWF4RGl2aWRlZEJldHdlZW5Qb29sczogdWludDY0ID0gdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSAvIG51bVBvb2xzCiAgICBjYWxsc3ViIG1heEFsbG93ZWRTdGFrZQogICAgc3dhcAogICAgLwogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI3NwogICAgLy8gbGV0IG1heFBlclBvb2w6IHVpbnQ2NCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1heEFsZ29QZXJQb29sCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAwIDI0MgogICAgcHVzaGludCAyMTcgLy8gMjE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjc4CiAgICAvLyBpZiAobWF4UGVyUG9vbCA9PT0gMCkgewogICAgYm56IGdldEN1ck1heFN0YWtlUGVyUG9vbF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzU1CiAgICAvLyByZXR1cm4gR2xvYmFsLnBheW91dHNNYXhCYWxhbmNlCiAgICBnbG9iYWwgUGF5b3V0c01heEJhbGFuY2UKICAgIGZyYW1lX2J1cnkgMgoKZ2V0Q3VyTWF4U3Rha2VQZXJQb29sX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjI4MQogICAgLy8gaWYgKGhhcmRNYXhEaXZpZGVkQmV0d2VlblBvb2xzIDwgbWF4UGVyUG9vbCkgewogICAgZnJhbWVfZGlnIDEKICAgID4KICAgIGJ6IGdldEN1ck1heFN0YWtlUGVyUG9vbF9hZnRlcl9pZl9lbHNlQDQKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKCmdldEN1ck1heFN0YWtlUGVyUG9vbF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mjg0CiAgICAvLyByZXR1cm4gbWF4UGVyUG9vbAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5kb2VzU3Rha2VyTmVlZFRvUGF5TUJSKHN0YWtlcjogYnl0ZXMpIC0+IHVpbnQ2NDoKZG9lc1N0YWtlck5lZWRUb1BheU1CUjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoyOTEtMjkyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoc3Rha2VyOiBBZGRyZXNzKTogYm9vbGVhbiB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTEKICAgIC8vIHN0YWtlclBvb2xTZXQgPSBCb3hNYXA8QWRkcmVzcywgRml4ZWRBcnJheTxWYWxpZGF0b3JQb29sS2V5LCB0eXBlb2YgTUFYX1BPT0xTX1BFUl9TVEFLRVI+Pih7IGtleVByZWZpeDogJ3NwcycgfSkKICAgIGJ5dGVjIDUgLy8gInNwcyIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MjkzCiAgICAvLyByZXR1cm4gIXRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudChzdGFrZXI6IGJ5dGVzKSAtPiBieXRlczoKZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMwMi0zMDMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50KHN0YWtlcjogQWRkcmVzcyk6IFZhbGlkYXRvclBvb2xLZXlbXSB7CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTEKICAgIC8vIHN0YWtlclBvb2xTZXQgPSBCb3hNYXA8QWRkcmVzcywgRml4ZWRBcnJheTxWYWxpZGF0b3JQb29sS2V5LCB0eXBlb2YgTUFYX1BPT0xTX1BFUl9TVEFLRVI+Pih7IGtleVByZWZpeDogJ3NwcycgfSkKICAgIGJ5dGVjIDUgLy8gInNwcyIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMDQKICAgIC8vIGlmICghdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRTdGFrZWRQb29sc0ZvckFjY291bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzA1CiAgICAvLyByZXR1cm4gW10KICAgIGJ5dGVjIDEyIC8vIDB4MDAwMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFN0YWtlZFBvb2xzRm9yQWNjb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzA3CiAgICAvLyBjb25zdCByZXREYXRhOiBWYWxpZGF0b3JQb29sS2V5W10gPSBbXQogICAgYnl0ZWMgMTIgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMDgKICAgIC8vIGNvbnN0IHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKICAgIGZyYW1lX2RpZyA1CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzA5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcG9vbFNldC5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAoKZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X3doaWxlX3RvcEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMwOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDYgLy8gNgogICAgPAogICAgYnogZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X2FmdGVyX3doaWxlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMTAKICAgIC8vIGlmIChwb29sU2V0W2ldLmlkICE9PSAwKSB7CiAgICBmcmFtZV9kaWcgNAogICAgcHVzaGludCAyNCAvLyAyNAogICAgKgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYnogZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMxMQogICAgLy8gcmV0RGF0YS5wdXNoKHBvb2xTZXRbaV0pCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAzCgpnZXRTdGFrZWRQb29sc0ZvckFjY291bnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMwOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGdldFN0YWtlZFBvb2xzRm9yQWNjb3VudF93aGlsZV90b3BAMwoKZ2V0U3Rha2VkUG9vbHNGb3JBY2NvdW50X2FmdGVyX3doaWxlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzE0CiAgICAvLyByZXR1cm4gcmV0RGF0YQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5nZXRUb2tlblBheW91dFJhdGlvKHZhbGlkYXRvcklkOiB1aW50NjQpIC0+IGJ5dGVzOgpnZXRUb2tlblBheW91dFJhdGlvOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMyNC0zMjUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8gewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzI2CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzI2CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50YyA3IC8vIDcwMAogICAgaW50YyA2IC8vIDIwMAogICAgZXh0cmFjdDMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZ2V0Tm9kZVBvb2xBc3NpZ25tZW50cyh2YWxpZGF0b3JJZDogdWludDY0KSAtPiBieXRlczoKZ2V0Tm9kZVBvb2xBc3NpZ25tZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMjktMzMwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGdldE5vZGVQb29sQXNzaWdubWVudHModmFsaWRhdG9ySWQ6IHVpbnQ2NCk6IE5vZGVQb29sQXNzaWdubWVudENvbmZpZyB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMzEKICAgIC8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjMzMQogICAgLy8gYXNzZXJ0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuZXhpc3RzLCAidGhlIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgZG9lc24ndCBleGlzdCIpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGRvZXNuJ3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozMzMKICAgIC8vIHJldHVybiB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50YyA4IC8vIDkwMAogICAgaW50YyA5IC8vIDE5MgogICAgZXh0cmFjdDMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuYWRkVmFsaWRhdG9yKG1iclBheW1lbnQ6IHVpbnQ2NCwgbmZkTmFtZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IHVpbnQ2NDoKYWRkVmFsaWRhdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM0OQogICAgLy8gYWRkVmFsaWRhdG9yKG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgbmZkTmFtZTogc3RyaW5nLCBjb25maWc6IFZhbGlkYXRvckNvbmZpZyk6IHVpbnQ2NCB7CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDM1CiAgICAvLyBhc3NlcnQoY29uZmlnLm93bmVyLm5hdGl2ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDggMzIKICAgIGR1cG4gMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzNgogICAgLy8gYXNzZXJ0KGNvbmZpZy5tYW5hZ2VyLm5hdGl2ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDQwIDMyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMzcKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBjb25maWcub3duZXIubmF0aXZlLCAnc2VuZGVyIG11c3QgYmUgb3duZXIgdG8gYWRkIG5ldyB2YWxpZGF0b3InKQogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgbXVzdCBiZSBvd25lciB0byBhZGQgbmV3IHZhbGlkYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDAKICAgIC8vIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUubmF0aXZlID49IEdBVElOR19UWVBFX05PTkUgJiYgY29uZmlnLmVudHJ5R2F0aW5nVHlwZS5uYXRpdmUgPD0gR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBnZXRieXRlCiAgICBwdXNoaW50IDQgLy8gNAogICAgPD0KICAgIGJ6IGFkZFZhbGlkYXRvcl9ib29sX2ZhbHNlQDEzCiAgICBpbnRjXzEgLy8gMQoKYWRkVmFsaWRhdG9yX2Jvb2xfbWVyZ2VAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzOS0xMDQyCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIGNvbmZpZy5lbnRyeUdhdGluZ1R5cGUubmF0aXZlID49IEdBVElOR19UWVBFX05PTkUgJiYgY29uZmlnLmVudHJ5R2F0aW5nVHlwZS5uYXRpdmUgPD0gR0FUSU5HX1RZUEVfQ09OU1RfTUFYLAogICAgLy8gICAnZ2F0aW5nIHR5cGUgbm90IHZhbGlkJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBnYXRpbmcgdHlwZSBub3QgdmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQ0CiAgICAvLyBjb25maWcuZXBvY2hSb3VuZExlbmd0aC5uYXRpdmUgPj0gTUlOX0VQT0NIX0xFTkdUSCAmJiBjb25maWcuZXBvY2hSb3VuZExlbmd0aC5uYXRpdmUgPD0gTUFYX0VQT0NIX0xFTkdUSCwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNjkgLy8gMTY5CiAgICBleHRyYWN0X3VpbnQzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJ6IGFkZFZhbGlkYXRvcl9ib29sX2ZhbHNlQDE3CiAgICBmcmFtZV9kaWcgMQogICAgaW50YyAxMCAvLyAxMDAwMDAwCiAgICA8PQogICAgYnogYWRkVmFsaWRhdG9yX2Jvb2xfZmFsc2VAMTcKICAgIGludGNfMSAvLyAxCgphZGRWYWxpZGF0b3JfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQzLTEwNDYKICAgIC8vIGFzc2VydCgKICAgIC8vICAgY29uZmlnLmVwb2NoUm91bmRMZW5ndGgubmF0aXZlID49IE1JTl9FUE9DSF9MRU5HVEggJiYgY29uZmlnLmVwb2NoUm91bmRMZW5ndGgubmF0aXZlIDw9IE1BWF9FUE9DSF9MRU5HVEgsCiAgICAvLyAgICdlcG9jaCBsZW5ndGggbm90IGluIGFsbG93YWJsZSByYW5nZScsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gZXBvY2ggbGVuZ3RoIG5vdCBpbiBhbGxvd2FibGUgcmFuZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDQ4CiAgICAvLyBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yLm5hdGl2ZSA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJgogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE3MyAvLyAxNzMKICAgIGV4dHJhY3RfdWludDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDkKICAgIC8vIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IubmF0aXZlIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAogICAgaW50YyAxMCAvLyAxMDAwMDAwCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDgtMTA0OQogICAgLy8gY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvci5uYXRpdmUgPj0gTUlOX1BDVF9UT19WQUxJREFUT1IgJiYKICAgIC8vICAgY29uZmlnLnBlcmNlbnRUb1ZhbGlkYXRvci5uYXRpdmUgPD0gTUFYX1BDVF9UT19WQUxJREFUT1IsCiAgICBieiBhZGRWYWxpZGF0b3JfYm9vbF9mYWxzZUAyMQogICAgaW50Y18xIC8vIDEKCmFkZFZhbGlkYXRvcl9ib29sX21lcmdlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNDctMTA1MQogICAgLy8gYXNzZXJ0KAogICAgLy8gICBjb25maWcucGVyY2VudFRvVmFsaWRhdG9yLm5hdGl2ZSA+PSBNSU5fUENUX1RPX1ZBTElEQVRPUiAmJgogICAgLy8gICAgIGNvbmZpZy5wZXJjZW50VG9WYWxpZGF0b3IubmF0aXZlIDw9IE1BWF9QQ1RfVE9fVkFMSURBVE9SLAogICAgLy8gICAnY29tbWlzc2lvbiBwZXJjZW50YWdlIG5vdCB2YWxpZCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gY29tbWlzc2lvbiBwZXJjZW50YWdlIG5vdCB2YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTIKICAgIC8vIGlmIChjb25maWcucGVyY2VudFRvVmFsaWRhdG9yLm5hdGl2ZSAhPT0gMCkgewogICAgZnJhbWVfZGlnIDIKICAgIGJ6IGFkZFZhbGlkYXRvcl9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA1NAogICAgLy8gY29uZmlnLnZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzLm5hdGl2ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDE3NyAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTMtMTA1NgogICAgLy8gYXNzZXJ0KAogICAgLy8gICBjb25maWcudmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MubmF0aXZlICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsCiAgICAvLyAgICd2YWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyBtdXN0IGJlIHNldCBpZiBwZXJjZW50IHRvIHZhbGlkYXRvciBpcyBub3QgMCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gdmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgbXVzdCBiZSBzZXQgaWYgcGVyY2VudCB0byB2YWxpZGF0b3IgaXMgbm90IDAKCmFkZFZhbGlkYXRvcl9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNTgKICAgIC8vIGFzc2VydChjb25maWcubWluRW50cnlTdGFrZSA+PSBNSU5fQUxHT19TVEFLRV9QRVJfUE9PTCwgJ3N0YWtpbmcgcG9vbCBtdXN0IGhhdmUgbWluaW11bSBlbnRyeSBvZiAxIGFsZ28nKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDEyIC8vIDIwOQogICAgZXh0cmFjdF91aW50NjQKICAgIGludGMgMTAgLy8gMTAwMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBzdGFraW5nIHBvb2wgbXVzdCBoYXZlIG1pbmltdW0gZW50cnkgb2YgMSBhbGdvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA2MQogICAgLy8gY29uZmlnLnBvb2xzUGVyTm9kZS5uYXRpdmUgPiAwICYmIGNvbmZpZy5wb29sc1Blck5vZGUubmF0aXZlIDw9IE1BWF9QT09MU19QRVJfTk9ERSwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyMjUgLy8gMjI1CiAgICBnZXRieXRlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgYnogYWRkVmFsaWRhdG9yX2Jvb2xfZmFsc2VAMjcKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDMgLy8gMwogICAgPD0KICAgIGJ6IGFkZFZhbGlkYXRvcl9ib29sX2ZhbHNlQDI3CiAgICBpbnRjXzEgLy8gMQoKYWRkVmFsaWRhdG9yX2Jvb2xfbWVyZ2VAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA2MC0xMDYzCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIGNvbmZpZy5wb29sc1Blck5vZGUubmF0aXZlID4gMCAmJiBjb25maWcucG9vbHNQZXJOb2RlLm5hdGl2ZSA8PSBNQVhfUE9PTFNfUEVSX05PREUsCiAgICAvLyAgICdudW1iZXIgb2YgcG9vbHMgcGVyIG5vZGUgbXVzdCBiZSBiZSBiZXR3ZWVuIDEgYW5kIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBudW1iZXIgb2YgcG9vbHMgcGVyIG5vZGUgbXVzdCBiZSBiZSBiZXR3ZWVuIDEgYW5kIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA2NAogICAgLy8gaWYgKGNvbmZpZy5zdW5zZXR0aW5nT24gIT09IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyAxMSAvLyAyMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgYnogYWRkVmFsaWRhdG9yX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDY1CiAgICAvLyBhc3NlcnQoY29uZmlnLnN1bnNldHRpbmdPbiA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsICdzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQnKQogICAgZnJhbWVfZGlnIDUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIGFzc2VydCAvLyBzdW5zZXR0aW5nT24gbXVzdCBiZSBsYXRlciB0aGFuIG5vdyBpZiBzZXQKCmFkZFZhbGlkYXRvcl9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1Mi0zNTUKICAgIC8vIGFzc2VydE1hdGNoKG1iclBheW1lbnQsIHsKICAgIC8vICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHRoaXMuZ2V0TWJyQW1vdW50cygpLmFkZFZhbGlkYXRvck1iciwKICAgIC8vIH0pCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzUzCiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM1Mi0zNTUKICAgIC8vIGFzc2VydE1hdGNoKG1iclBheW1lbnQsIHsKICAgIC8vICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IHRoaXMuZ2V0TWJyQW1vdW50cygpLmFkZFZhbGlkYXRvck1iciwKICAgIC8vIH0pCiAgICA9PQogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTQKICAgIC8vIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyLAogICAgcHVzaGludCA0NDI5MDAgLy8gNDQyOTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzUyLTM1NQogICAgLy8gYXNzZXJ0TWF0Y2gobWJyUGF5bWVudCwgewogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkVmFsaWRhdG9yTWJyLAogICAgLy8gfSkKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGFzc2VydCB0YXJnZXQgaXMgbWF0Y2ggZm9yIGNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNTcKICAgIC8vIGFzc2VydChtYnJQYXltZW50LmZlZSA+IDEwICogMTAwMDAwMCwgJ2ZlZSBtdXN0IGJlIDEwIEFMR08gb3IgbW9yZSB0byBwcmV2ZW50IHNwYW1taW5nIG9mIHZhbGlkYXRvcnMnKQogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBGZWUKICAgIHB1c2hpbnQgMTAwMDAwMDAgLy8gMTAwMDAwMDAKICAgID4KICAgIGFzc2VydCAvLyBmZWUgbXVzdCBiZSAxMCBBTEdPIG9yIG1vcmUgdG8gcHJldmVudCBzcGFtbWluZyBvZiB2YWxpZGF0b3JzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzYwCiAgICAvLyBjb25zdCB2YWxpZGF0b3JJZDogdWludDY0ID0gdGhpcy5udW1WYWxpZGF0b3JzLnZhbHVlICsgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NwogICAgLy8gbnVtVmFsaWRhdG9ycyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdudW1WJyB9KQogICAgYnl0ZWMgOCAvLyAibnVtViIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjAKICAgIC8vIGNvbnN0IHZhbGlkYXRvcklkOiB1aW50NjQgPSB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgKyAxCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTcKICAgIC8vIG51bVZhbGlkYXRvcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtVicgfSkKICAgIGJ5dGVjIDggLy8gIm51bVYiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzYxCiAgICAvLyB0aGlzLm51bVZhbGlkYXRvcnMudmFsdWUgPSB2YWxpZGF0b3JJZAogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzYzCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmNyZWF0ZSgpCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzYzCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmNyZWF0ZSgpCiAgICBkdXAKICAgIHB1c2hpbnQgMTA5MiAvLyAxMDkyCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjQKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnID0gY2xvbmUoY29uZmlnKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM2NQogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuaWQgPSB2YWxpZGF0b3JJZAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNjgKICAgIC8vIGlmIChjb25maWcubmZkRm9ySW5mbyAhPT0gMCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIGJ6IGFkZFZhbGlkYXRvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozNzQKICAgIC8vIFR4bi5zZW5kZXIgPT09IEFjY291bnQob3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoY29uZmlnLm5mZEZvckluZm8sIEJ5dGVzKCdpLm93bmVyLmEnKSlbMF0pLAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDUKICAgIGJ5dGVjIDkgLy8gImkub3duZXIuYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MzczLTM3NgogICAgLy8gYXNzZXJ0KAogICAgLy8gICBUeG4uc2VuZGVyID09PSBBY2NvdW50KG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGNvbmZpZy5uZmRGb3JJbmZvLCBCeXRlcygnaS5vd25lci5hJykpWzBdKSwKICAgIC8vICAgJ0lmIHNwZWNpZnlpbmcgTkZELCBhY2NvdW50IGFkZGluZyB2YWxpZGF0b3IgbXVzdCBiZSBvd25lcicsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gSWYgc3BlY2lmeWluZyBORkQsIGFjY291bnQgYWRkaW5nIHZhbGlkYXRvciBtdXN0IGJlIG93bmVyCgphZGRWYWxpZGF0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM4NQogICAgLy8gZW1pdDxyZXRpT1BfYWRkZWRWYWxpZGF0b3I+KHsgaWQ6IHZhbGlkYXRvcklkLCBvd25lcjogY29uZmlnLm93bmVyLCBtYW5hZ2VyOiBjb25maWcubWFuYWdlciB9KQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA3CiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGE4ZGQyMWNiIC8vIG1ldGhvZCAicmV0aU9QX2FkZGVkVmFsaWRhdG9yKHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozODYKICAgIC8vIHJldHVybiB2YWxpZGF0b3JJZAogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphZGRWYWxpZGF0b3JfYm9vbF9mYWxzZUAyNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFkZFZhbGlkYXRvcl9ib29sX21lcmdlQDI4CgphZGRWYWxpZGF0b3JfYm9vbF9mYWxzZUAyMToKICAgIGludGNfMCAvLyAwCiAgICBiIGFkZFZhbGlkYXRvcl9ib29sX21lcmdlQDIyCgphZGRWYWxpZGF0b3JfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFkZFZhbGlkYXRvcl9ib29sX21lcmdlQDE4CgphZGRWYWxpZGF0b3JfYm9vbF9mYWxzZUAxMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFkZFZhbGlkYXRvcl9ib29sX21lcmdlQDE0CgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5jaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyKHZhbGlkYXRvcklkOiB1aW50NjQsIG1hbmFnZXI6IGJ5dGVzKSAtPiB2b2lkOgpjaGFuZ2VWYWxpZGF0b3JNYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM5NgogICAgLy8gY2hhbmdlVmFsaWRhdG9yTWFuYWdlcih2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBtYW5hZ2VyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozOTcKICAgIC8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czozOTgKICAgIC8vIGFzc2VydChtYW5hZ2VyLm5hdGl2ZSAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnbmVlZHMgdG8gYXQgbGVhc3QgYmUgdmFsaWQgYWRkcmVzcycpCiAgICBmcmFtZV9kaWcgLTEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBuZWVkcyB0byBhdCBsZWFzdCBiZSB2YWxpZCBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Mzk5CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyID0gbWFuYWdlcgogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjM5OQogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlciA9IG1hbmFnZXIKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3JlcGxhY2UKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuY2hhbmdlVmFsaWRhdG9yU3Vuc2V0SW5mbyh2YWxpZGF0b3JJZDogdWludDY0LCBzdW5zZXR0aW5nT246IHVpbnQ2NCwgc3Vuc2V0dGluZ1RvOiB1aW50NjQpIC0+IHZvaWQ6CmNoYW5nZVZhbGlkYXRvclN1bnNldEluZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDEwCiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JTdW5zZXRJbmZvKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHN1bnNldHRpbmdPbjogdWludDY0LCBzdW5zZXR0aW5nVG86IFZhbGlkYXRvcklkVHlwZSk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDExCiAgICAvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDEyCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5zdW5zZXR0aW5nT24gPSBzdW5zZXR0aW5nT24KICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTIKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA9IHN1bnNldHRpbmdPbgogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50YyAxMSAvLyAyMjYKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MTMKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdUbyA9IHN1bnNldHRpbmdUbwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBwdXNoaW50IDIzNCAvLyAyMzQKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmNoYW5nZVZhbGlkYXRvck5GRCh2YWxpZGF0b3JJZDogdWludDY0LCBuZmRBcHBJRDogdWludDY0LCBuZmROYW1lOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlVmFsaWRhdG9yTkZEOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQyNQogICAgLy8gY2hhbmdlVmFsaWRhdG9yTkZEKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIG5mZEFwcElEOiB1aW50NjQsIG5mZE5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDI2CiAgICAvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDMxCiAgICAvLyBUeG4uc2VuZGVyID09PSBBY2NvdW50KG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKG5mZEFwcElELCBCeXRlcygnaS5vd25lci5hJykpWzBdKSwKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgOSAvLyAiaS5vd25lci5hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzAtNDMzCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IEFjY291bnQob3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMobmZkQXBwSUQsIEJ5dGVzKCdpLm93bmVyLmEnKSlbMF0pLAogICAgLy8gICAnSWYgc3BlY2lmeWluZyBORkQsIGFjY291bnQgYWRkaW5nIHZhbGlkYXRvciBtdXN0IGJlIG93bmVyJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBJZiBzcGVjaWZ5aW5nIE5GRCwgYWNjb3VudCBhZGRpbmcgdmFsaWRhdG9yIG11c3QgYmUgb3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0MzQKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm5mZEZvckluZm8gPSBuZmRBcHBJRAogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQzNAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubmZkRm9ySW5mbyA9IG5mZEFwcElECiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmNoYW5nZVZhbGlkYXRvckNvbW1pc3Npb25BZGRyZXNzKHZhbGlkYXRvcklkOiB1aW50NjQsIGNvbW1pc3Npb25BZGRyZXNzOiBieXRlcykgLT4gdm9pZDoKY2hhbmdlVmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDQxCiAgICAvLyBjaGFuZ2VWYWxpZGF0b3JDb21taXNzaW9uQWRkcmVzcyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBjb21taXNzaW9uQWRkcmVzczogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDQyCiAgICAvLyB0aGlzLmNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGNhbGxlck11c3RCZU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDQzCiAgICAvLyBhc3NlcnQoY29tbWlzc2lvbkFkZHJlc3MubmF0aXZlICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ0NAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcudmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgPSBjb21taXNzaW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ0NAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcudmFsaWRhdG9yQ29tbWlzc2lvbkFkZHJlc3MgPSBjb21taXNzaW9uQWRkcmVzcwogICAgcHVzaGludCAxNzcgLy8gMTc3CiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm8odmFsaWRhdG9ySWQ6IHVpbnQ2NCwgRW50cnlHYXRpbmdUeXBlOiBieXRlcywgRW50cnlHYXRpbmdBZGRyZXNzOiBieXRlcywgRW50cnlHYXRpbmdBc3NldHM6IGJ5dGVzLCBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NCwgUmV3YXJkUGVyUGF5b3V0OiB1aW50NjQpIC0+IHZvaWQ6CmNoYW5nZVZhbGlkYXRvclJld2FyZEluZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDUxLTQ1OAogICAgLy8gY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mbygKICAgIC8vICAgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwKICAgIC8vICAgRW50cnlHYXRpbmdUeXBlOiBVaW50OCwKICAgIC8vICAgRW50cnlHYXRpbmdBZGRyZXNzOiBBZGRyZXNzLAogICAgLy8gICBFbnRyeUdhdGluZ0Fzc2V0czogRml4ZWRBcnJheTx1aW50NjQsIDQ+LAogICAgLy8gICBHYXRpbmdBc3NldE1pbkJhbGFuY2U6IHVpbnQ2NCwKICAgIC8vICAgUmV3YXJkUGVyUGF5b3V0OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ1OQogICAgLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKICAgIGZyYW1lX2RpZyAtNgogICAgY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ2MgogICAgLy8gRW50cnlHYXRpbmdUeXBlLm5hdGl2ZSA+PSBHQVRJTkdfVFlQRV9OT05FICYmIEVudHJ5R2F0aW5nVHlwZS5uYXRpdmUgPCBHQVRJTkdfVFlQRV9DT05TVF9NQVgsCiAgICBmcmFtZV9kaWcgLTUKICAgIGJ0b2kKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgIDwKICAgIGJ6IGNoYW5nZVZhbGlkYXRvclJld2FyZEluZm9fYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mb19ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDYxLTQ2NAogICAgLy8gYXNzZXJ0KAogICAgLy8gICBFbnRyeUdhdGluZ1R5cGUubmF0aXZlID49IEdBVElOR19UWVBFX05PTkUgJiYgRW50cnlHYXRpbmdUeXBlLm5hdGl2ZSA8IEdBVElOR19UWVBFX0NPTlNUX01BWCwKICAgIC8vICAgJ2ludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGludmFsaWQgRW50cnkgZ2F0aW5nIHR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjUKICAgIC8vIGlmIChFbnRyeUdhdGluZ1R5cGUubmF0aXZlID09PSBHQVRJTkdfVFlQRV9BU1NFVFNfQ1JFQVRFRF9CWSkgewogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mb19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NjYKICAgIC8vIGFzc2VydChFbnRyeUdhdGluZ0FkZHJlc3MubmF0aXZlICE9PSBHbG9iYWwuemVyb0FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTQKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydAoKY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mb19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDc0CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ1R5cGUgPSBFbnRyeUdhdGluZ1R5cGUKICAgIGZyYW1lX2RpZyAtNgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0NzQKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZSA9IEVudHJ5R2F0aW5nVHlwZQogICAgZHVwCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBmcmFtZV9kaWcgLTUKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDc1CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5lbnRyeUdhdGluZ0FkZHJlc3MgPSBFbnRyeUdhdGluZ0FkZHJlc3MKICAgIGR1cAogICAgcHVzaGludCA4MSAvLyA4MQogICAgZnJhbWVfZGlnIC00CiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3NgogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZW50cnlHYXRpbmdBc3NldHMgPSBjbG9uZShFbnRyeUdhdGluZ0Fzc2V0cykKICAgIGR1cAogICAgcHVzaGludCAxMTMgLy8gMTEzCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDc3CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UgPSBHYXRpbmdBc3NldE1pbkJhbGFuY2UKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTQ1IC8vIDE0NQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ3OAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcucmV3YXJkUGVyUGF5b3V0ID0gUmV3YXJkUGVyUGF5b3V0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIHB1c2hpbnQgMTYxIC8vIDE2MQogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIHJldHN1YgoKY2hhbmdlVmFsaWRhdG9yUmV3YXJkSW5mb19ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjaGFuZ2VWYWxpZGF0b3JSZXdhcmRJbmZvX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuYWRkUG9vbChtYnJQYXltZW50OiB1aW50NjQsIHZhbGlkYXRvcklkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCkgLT4gYnl0ZXM6CmFkZFBvb2w6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NDkyCiAgICAvLyBhZGRQb29sKG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgbm9kZU51bTogdWludDY0KTogVmFsaWRhdG9yUG9vbEtleSB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTQKICAgIC8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo0OTcKICAgIC8vIGFzc2VydE1hdGNoKG1iclBheW1lbnQsIHsgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBhbW91bnQ6IHRoaXMuZ2V0TWJyQW1vdW50cygpLmFkZFBvb2xNYnIgfSkKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgOTYzNTAwIC8vIDk2MzUwMAogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gYXNzZXJ0IHRhcmdldCBpcyBtYXRjaCBmb3IgY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5OQogICAgLy8gYXNzZXJ0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuZXhpc3RzLCAic3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZCIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5OQogICAgLy8gYXNzZXJ0KHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkuZXhpc3RzLCAic3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZCIpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MDEKICAgIC8vIGxldCBudW1Qb29sczogdWludDY0ID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBkdXAKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MDIKICAgIC8vIGlmICgobnVtUG9vbHMgYXMgdWludDY0KSA+PSBNQVhfUE9PTFMpIHsKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgPj0KICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGF0IG1heCBwb29sIHNpemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MDUKICAgIC8vIG51bVBvb2xzICs9IDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTA4LTUyOAogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uTm9PcCwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFsKICAgIC8vICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ucmVmLmV4dHJhY3QoMCwgNDA5NiksCiAgICAvLyAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnJlZi5leHRyYWN0KDQwOTYsIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ubGVuZ3RoIC0gNDA5NiksCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogc3Rha2luZ1Bvb2wuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsTnVtVWludDogc3Rha2luZ1Bvb2wuZ2xvYmFsVWludHMsCiAgICAvLyAgICAgZ2xvYmFsTnVtQnl0ZXM6IHN0YWtpbmdQb29sLmdsb2JhbEJ5dGVzLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIC8vIGNyZWF0aW5nQ29udHJhY3RJRCwgdmFsaWRhdG9ySWQsIHBvb2xJZCwgbWluRW50cnlTdGFrZQogICAgLy8gICAgICAgbWV0aG9kU2VsZWN0b3IoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCiAgICAvLyAgICAgICBvcC5pdG9iKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCksCiAgICAvLyAgICAgICBvcC5pdG9iKHZhbGlkYXRvcklkKSwKICAgIC8vICAgICAgIG9wLml0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKICAgIC8vICAgICAgIG9wLml0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCiAgICAvLyAgICAgXSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTMKICAgIC8vIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtID0gQm94PGJ5dGVzPih7IGtleTogJ3Bvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMnIH0pCiAgICBieXRlYyA3IC8vICJwb29sVGVtcGxhdGVBcHByb3ZhbEJ5dGVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUxMgogICAgLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZWYuZXh0cmFjdCgwLCA0MDk2KSwKICAgIGludGNfMCAvLyAwCiAgICBpbnRjIDEzIC8vIDQwOTYKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTMKICAgIC8vIHN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtID0gQm94PGJ5dGVzPih7IGtleTogJ3Bvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMnIH0pCiAgICBieXRlYyA3IC8vICJwb29sVGVtcGxhdGVBcHByb3ZhbEJ5dGVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUxMwogICAgLy8gdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZWYuZXh0cmFjdCg0MDk2LCB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLmxlbmd0aCAtIDQwOTYpLAogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjIDEzIC8vIDQwOTYKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MwogICAgLy8gc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0gPSBCb3g8Ynl0ZXM+KHsga2V5OiAncG9vbFRlbXBsYXRlQXBwcm92YWxCeXRlcycgfSkKICAgIGJ5dGVjIDcgLy8gInBvb2xUZW1wbGF0ZUFwcHJvdmFsQnl0ZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTEzCiAgICAvLyB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnJlZi5leHRyYWN0KDQwOTYsIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ubGVuZ3RoIC0gNDA5NiksCiAgICBpbnRjIDEzIC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MjIKICAgIC8vIG9wLml0b2IoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkKSwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyNAogICAgLy8gb3AuaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAogICAgZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MjUKICAgIC8vIG9wLml0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGludGMgMTIgLy8gMjA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUyMQogICAgLy8gbWV0aG9kU2VsZWN0b3IoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCiAgICBwdXNoYnl0ZXMgMHg1OWU5MGFhNiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjUxOAogICAgLy8gZXh0cmFQcm9ncmFtUGFnZXM6IDMsCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXR4bl9maWVsZCBFeHRyYVByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjQ5MwogICAgLy8gY29uc3Qgc3Rha2luZ1Bvb2wgPSBjb21waWxlQXJjNChTdGFraW5nUG9vbCkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAxMSAvLyAxMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICBwdXNoYnl0ZXMgYmFzZTY0KEM0RUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MTAKICAgIC8vIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5Ob09wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTA4LTUyNwogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uTm9PcCwKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFsKICAgIC8vICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ucmVmLmV4dHJhY3QoMCwgNDA5NiksCiAgICAvLyAgICAgICB0aGlzLnN0YWtpbmdQb29sQXBwcm92YWxQcm9ncmFtLnJlZi5leHRyYWN0KDQwOTYsIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ubGVuZ3RoIC0gNDA5NiksCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjbGVhclN0YXRlUHJvZ3JhbTogc3Rha2luZ1Bvb2wuY2xlYXJTdGF0ZVByb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsTnVtVWludDogc3Rha2luZ1Bvb2wuZ2xvYmFsVWludHMsCiAgICAvLyAgICAgZ2xvYmFsTnVtQnl0ZXM6IHN0YWtpbmdQb29sLmdsb2JhbEJ5dGVzLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiAzLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIC8vIGNyZWF0aW5nQ29udHJhY3RJRCwgdmFsaWRhdG9ySWQsIHBvb2xJZCwgbWluRW50cnlTdGFrZQogICAgLy8gICAgICAgbWV0aG9kU2VsZWN0b3IoJ2NyZWF0ZUFwcGxpY2F0aW9uKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkJyksCiAgICAvLyAgICAgICBvcC5pdG9iKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZC5pZCksCiAgICAvLyAgICAgICBvcC5pdG9iKHZhbGlkYXRvcklkKSwKICAgIC8vICAgICAgIG9wLml0b2IobnVtUG9vbHMgYXMgdWludDY0KSwKICAgIC8vICAgICAgIG9wLml0b2IodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWluRW50cnlTdGFrZSksCiAgICAvLyAgICAgXSwKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MDgtNTI4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5Ob09wLAogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogWwogICAgLy8gICAgICAgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5yZWYuZXh0cmFjdCgwLCA0MDk2KSwKICAgIC8vICAgICAgIHRoaXMuc3Rha2luZ1Bvb2xBcHByb3ZhbFByb2dyYW0ucmVmLmV4dHJhY3QoNDA5NiwgdGhpcy5zdGFraW5nUG9vbEFwcHJvdmFsUHJvZ3JhbS5sZW5ndGggLSA0MDk2KSwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBzdGFraW5nUG9vbC5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxOdW1VaW50OiBzdGFraW5nUG9vbC5nbG9iYWxVaW50cywKICAgIC8vICAgICBnbG9iYWxOdW1CeXRlczogc3Rha2luZ1Bvb2wuZ2xvYmFsQnl0ZXMsCiAgICAvLyAgICAgZXh0cmFQcm9ncmFtUGFnZXM6IDMsCiAgICAvLyAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgLy8gY3JlYXRpbmdDb250cmFjdElELCB2YWxpZGF0b3JJZCwgcG9vbElkLCBtaW5FbnRyeVN0YWtlCiAgICAvLyAgICAgICBtZXRob2RTZWxlY3RvcignY3JlYXRlQXBwbGljYXRpb24odWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQnKSwKICAgIC8vICAgICAgIG9wLml0b2IoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkKSwKICAgIC8vICAgICAgIG9wLml0b2IodmFsaWRhdG9ySWQpLAogICAgLy8gICAgICAgb3AuaXRvYihudW1Qb29scyBhcyB1aW50NjQpLAogICAgLy8gICAgICAgb3AuaXRvYih0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5taW5FbnRyeVN0YWtlKSwKICAgIC8vICAgICBdLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTMwCiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzID0gbmV3IFVpbnQxNihudW1Qb29scykKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBkdXAKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgMwogICAgcHVzaGludCAyNDIgLy8gMjQyCiAgICBkaWcgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzMKICAgIC8vIGNvbnN0IHBvb2xBcHBJZCA9IElUeG4uY3JlYXRlZEFwcGxpY2F0aW9uSWQuaWQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzQKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbbnVtUG9vbHMgLSAxXS5wb29sQXBwSWQgPSBwb29sQXBwSWQKICAgIHVuY292ZXIgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBpdG9iCiAgICBkaWcgMQogICAgcHVzaGludCAyNCAvLyAyNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGludGNfMiAvLyAxOAogICAgKgogICAgaW50YyA0IC8vIDI2OAogICAgKwogICAgdW5jb3ZlciA1CiAgICBzd2FwCiAgICBkaWcgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1MzUKICAgIC8vIHRoaXMuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZCwgcG9vbEFwcElkLCBub2RlTnVtKQogICAgZnJhbWVfZGlnIC0yCiAgICB1bmNvdmVyIDIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhZGRQb29sVG9Ob2RlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTM3LTU0MQogICAgLy8gZW1pdDxyZXRpT1BfdmFsaWRhdG9yQWRkZWRQb29sPih7CiAgICAvLyAgIGlkOiB2YWxpZGF0b3JJZCwKICAgIC8vICAgbnVtOiBuZXcgVWludDE2KG51bVBvb2xzKSwKICAgIC8vICAgcG9vbEFwcElkOiBwb29sQXBwSWQsCiAgICAvLyB9KQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGZiY2MwZjZiIC8vIG1ldGhvZCAicmV0aU9QX3ZhbGlkYXRvckFkZGVkUG9vbCh1aW50NjQsdWludDE2LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU0MwogICAgLy8gcmV0dXJuIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IG51bVBvb2xzIGFzIHVpbnQ2NCwgcG9vbEFwcElkOiBvcC5JVHhuLmNyZWF0ZWRBcHBsaWNhdGlvbklkLmlkIH0KICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmFkZFN0YWtlKHN0YWtlZEFtb3VudFBheW1lbnQ6IHVpbnQ2NCwgdmFsaWRhdG9ySWQ6IHVpbnQ2NCwgdmFsdWVUb1ZlcmlmeTogdWludDY0KSAtPiBieXRlczoKYWRkU3Rha2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTU1LTU1OQogICAgLy8gYWRkU3Rha2UoCiAgICAvLyAgIHN0YWtlZEFtb3VudFBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwKICAgIC8vICAgdmFsdWVUb1ZlcmlmeTogdWludDY0LAogICAgLy8gKTogVmFsaWRhdG9yUG9vbEtleSB7CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDYKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NjAKICAgIC8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NjAKICAgIC8vIGFzc2VydCh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLmV4aXN0cywgInNwZWNpZmllZCB2YWxpZGF0b3IgaWQgaXNuJ3QgdmFsaWQiKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU2MwogICAgLy8gaWYgKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA+IDApIHsKICAgIGJveF9nZXQKICAgIHBvcAogICAgZXh0cmFjdCAwIDI0MgogICAgaW50YyAxMSAvLyAyMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NjYKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICBmcmFtZV9kaWcgMjQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgMjQyCiAgICBpbnRjIDExIC8vIDIyNgogICAgZXh0cmFjdF91aW50NjQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NjUtNTY4CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnN1bnNldHRpbmdPbiA+IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICAvLyAgICJjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lIiwKICAgIC8vICkKICAgIGFzc2VydCAvLyBjYW4ndCBzdGFrZSB3aXRoIGEgdmFsaWRhdG9yIHRoYXQgaXMgcGFzdCBpdHMgc3Vuc2V0dGluZyB0aW1lCgphZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTcxCiAgICAvLyBjb25zdCBzdGFrZXIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NzUtNTc4CiAgICAvLyBhc3NlcnRNYXRjaChzdGFrZWRBbW91bnRQYXltZW50LCB7CiAgICAvLyAgIHNlbmRlcjogc3Rha2VyLm5hdGl2ZSwKICAgIC8vICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gfSkKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgU2VuZGVyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgPT0KICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1NzcKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTc1LTU3OAogICAgLy8gYXNzZXJ0TWF0Y2goc3Rha2VkQW1vdW50UGF5bWVudCwgewogICAgLy8gICBzZW5kZXI6IHN0YWtlci5uYXRpdmUsCiAgICAvLyAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vIH0pCiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBhc3NlcnQgdGFyZ2V0IGlzIG1hdGNoIGZvciBjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIxMgogICAgLy8gY29uc3QgdHlwZSA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLmVudHJ5R2F0aW5nVHlwZQogICAgZnJhbWVfZGlnIDI0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAwIDI0MgogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMTMKICAgIC8vIGlmICh0eXBlLm5hdGl2ZSA9PT0gR0FUSU5HX1RZUEVfTk9ORSkgewogICAgZ2V0Ynl0ZQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE5CiAgICBieiBhZGRTdGFrZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZG9lc1N0YWtlck1lZXRHYXRpbmdANTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjE2CiAgICAvLyBjb25zdCBzdGFrZXIgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjE3CiAgICAvLyBjb25zdCBjb25maWcgPSBjbG9uZSh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZykKICAgIGZyYW1lX2RpZyAyNAogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjEKICAgIC8vIHR5cGUubmF0aXZlID09PSBHQVRJTkdfVFlQRV9BU1NFVFNfQ1JFQVRFRF9CWSB8fAogICAgZnJhbWVfZGlnIDE5CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjEtMTIyMgogICAgLy8gdHlwZS5uYXRpdmUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CiAgICAvLyB0eXBlLm5hdGl2ZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRfSUQgfHwKICAgIGJueiBhZGRTdGFrZV9pZl9ib2R5QDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMgogICAgLy8gdHlwZS5uYXRpdmUgPT09IEdBVElOR19UWVBFX0FTU0VUX0lEIHx8CiAgICBmcmFtZV9kaWcgMTkKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjEtMTIyMgogICAgLy8gdHlwZS5uYXRpdmUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZIHx8CiAgICAvLyB0eXBlLm5hdGl2ZSA9PT0gR0FUSU5HX1RZUEVfQVNTRVRfSUQgfHwKICAgIGJueiBhZGRTdGFrZV9pZl9ib2R5QDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyMwogICAgLy8gdHlwZS5uYXRpdmUgPT09IEdBVElOR19UWVBFX0NSRUFURURfQllfTkZEX0FERFJFU1NFUwogICAgZnJhbWVfZGlnIDE5CiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjIxLTEyMjMKICAgIC8vIHR5cGUubmF0aXZlID09PSBHQVRJTkdfVFlQRV9BU1NFVFNfQ1JFQVRFRF9CWSB8fAogICAgLy8gdHlwZS5uYXRpdmUgPT09IEdBVElOR19UWVBFX0FTU0VUX0lEIHx8CiAgICAvLyB0eXBlLm5hdGl2ZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTCiAgICBieiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDM3CgphZGRTdGFrZV9pZl9ib2R5QDM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjUKICAgIC8vIGFzc2VydCh2YWx1ZVRvVmVyaWZ5ICE9PSAwKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjI2CiAgICAvLyBsZXQgYmFsUmVxdWlyZWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5nYXRpbmdBc3NldE1pbkJhbGFuY2UKICAgIGZyYW1lX2RpZyAyNAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIHB1c2hpbnQgMTQ1IC8vIDE0NQogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIyNwogICAgLy8gaWYgKGJhbFJlcXVpcmVkID09PSAwKSB7CiAgICBibnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMjgKICAgIC8vIGJhbFJlcXVpcmVkID0gMQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNwoKYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIGZyYW1lX2RpZyA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIzMQogICAgLy8gb3AuQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZShzdGFrZXIsIHZhbHVlVG9WZXJpZnkpWzBdID49IGJhbFJlcXVpcmVkLAogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTIzMC0xMjMzCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIG9wLkFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2Uoc3Rha2VyLCB2YWx1ZVRvVmVyaWZ5KVswXSA+PSBiYWxSZXF1aXJlZCwKICAgIC8vICAgJ211c3QgaGF2ZSByZXF1aXJlZCBtaW5pbXVtIGJhbGFuY2Ugb2YgdmFsaWRhdG9yIGRlZmluZWQgdG9rZW4gdG8gYWRkIHN0YWtlJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBtdXN0IGhhdmUgcmVxdWlyZWQgbWluaW11bSBiYWxhbmNlIG9mIHZhbGlkYXRvciBkZWZpbmVkIHRva2VuIHRvIGFkZCBzdGFrZQoKYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAzNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjM1CiAgICAvLyBpZiAodHlwZS5uYXRpdmUgPT09IEdBVElOR19UWVBFX0FTU0VUU19DUkVBVEVEX0JZKSB7CiAgICBmcmFtZV9kaWcgMjAKICAgIGJ6IGFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VAMzkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjM3CiAgICAvLyBBc3NldCh2YWx1ZVRvVmVyaWZ5KS5jcmVhdG9yID09PSBjb25maWcuZW50cnlHYXRpbmdBZGRyZXNzLm5hdGl2ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDAgMjQyCiAgICBleHRyYWN0IDgxIDMyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyMzYtMTIzOQogICAgLy8gYXNzZXJ0KAogICAgLy8gICBBc3NldCh2YWx1ZVRvVmVyaWZ5KS5jcmVhdG9yID09PSBjb25maWcuZW50cnlHYXRpbmdBZGRyZXNzLm5hdGl2ZSwKICAgIC8vICAgJ3NwZWNpZmllZCBhc3NldCBtdXN0IGJlIGNyZWF0ZWQgYnkgY3JlYXRvciB0aGF0IHRoZSB2YWxpZGF0b3IgZGVmaW5lZCBhcyBhIHJlcXVpcmVtZW50IHRvIHN0YWtlJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBzcGVjaWZpZWQgYXNzZXQgbXVzdCBiZSBjcmVhdGVkIGJ5IGNyZWF0b3IgdGhhdCB0aGUgdmFsaWRhdG9yIGRlZmluZWQgYXMgYSByZXF1aXJlbWVudCB0byBzdGFrZQoKYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAzOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjQxCiAgICAvLyBpZiAodHlwZS5uYXRpdmUgPT09IEdBVElOR19UWVBFX0FTU0VUX0lEKSB7CiAgICBmcmFtZV9kaWcgMTkKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUA0OAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDIKICAgIC8vIGxldCBmb3VuZCA9IGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTUKCmFkZFN0YWtlX2Zvcl9oZWFkZXJANDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI0MwogICAgLy8gZm9yIChjb25zdCBhc3NldElkIG9mIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0cykgewogICAgZnJhbWVfZGlnIDE1CiAgICBwdXNoaW50IDQgLy8gNAogICAgPAogICAgYnogYWRkU3Rha2VfYmxvY2tANDcKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDAgMjQyCiAgICBleHRyYWN0IDExMyAzMgogICAgZnJhbWVfZGlnIDE1CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjQ0CiAgICAvLyBpZiAodmFsdWVUb1ZlcmlmeSA9PT0gYXNzZXRJZCkgewogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUA0NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDUKICAgIC8vIGZvdW5kID0gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMTAKCmFkZFN0YWtlX2Jsb2NrQDQ3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNDkKICAgIC8vIGFzc2VydChmb3VuZCwgJ3NwZWNpZmllZCBhc3NldCBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgYXNzZXQgaWQgZGVmaW5lZCBhcyBhIHJlcXVpcmVtZW50IHRvIHN0YWtlJykKICAgIGZyYW1lX2RpZyAxMAogICAgYXNzZXJ0IC8vIHNwZWNpZmllZCBhc3NldCBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgYXNzZXQgaWQgZGVmaW5lZCBhcyBhIHJlcXVpcmVtZW50IHRvIHN0YWtlCgphZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDQ4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTEKICAgIC8vIGlmICh0eXBlLm5hdGl2ZSA9PT0gR0FUSU5HX1RZUEVfQ1JFQVRFRF9CWV9ORkRfQUREUkVTU0VTKSB7CiAgICBmcmFtZV9kaWcgMTkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNTUKICAgIC8vIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgbmV3IEFkZHJlc3MoQXNzZXQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvcikpLAogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgMTEzIDMyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGNhbGxzdWIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI1NC0xMjU3CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwgbmV3IEFkZHJlc3MoQXNzZXQodmFsdWVUb1ZlcmlmeSkuY3JlYXRvcikpLAogICAgLy8gICAnc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgaXMgb25lIG9mIHRoZSBsaW5rZWQgYWRkcmVzc2VzIGluIGFuIG5mZCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gc3BlY2lmaWVkIGFzc2V0IG11c3QgYmUgY3JlYXRlZCBieSBjcmVhdG9yIHRoYXQgaXMgb25lIG9mIHRoZSBsaW5rZWQgYWRkcmVzc2VzIGluIGFuIG5mZAoKYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUA1MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjU5CiAgICAvLyBpZiAodHlwZS5uYXRpdmUgPT09IEdBVElOR19UWVBFX1NFR01FTlRfT0ZfTkZEKSB7CiAgICBmcmFtZV9kaWcgMTkKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmRvZXNTdGFrZXJNZWV0R2F0aW5nQDU3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI2NgogICAgLy8gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXModXNlck9mZmVyZWRORkRBcHBJRCwgQnl0ZXMoJ2kub3duZXIuYScpKVswXSA9PT0gZW5jb2RlQXJjNChzdGFrZXIpIHx8CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDkgLy8gImkub3duZXIuYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIGZyYW1lX2RpZyA1CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjYtMTI2NwogICAgLy8gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXModXNlck9mZmVyZWRORkRBcHBJRCwgQnl0ZXMoJ2kub3duZXIuYScpKVswXSA9PT0gZW5jb2RlQXJjNChzdGFrZXIpIHx8CiAgICAvLyAgIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KHVzZXJPZmZlcmVkTkZEQXBwSUQsIG5ldyBBZGRyZXNzKHN0YWtlcikpLAogICAgYm56IGFkZFN0YWtlX2Jvb2xfdHJ1ZUA1MwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjcKICAgIC8vIHRoaXMuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KHVzZXJPZmZlcmVkTkZEQXBwSUQsIG5ldyBBZGRyZXNzKHN0YWtlcikpLAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNQogICAgY2FsbHN1YiBpc0FkZHJlc3NJbk5GRENBQWxnb0xpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjY2LTEyNjcKICAgIC8vIG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKHVzZXJPZmZlcmVkTkZEQXBwSUQsIEJ5dGVzKCdpLm93bmVyLmEnKSlbMF0gPT09IGVuY29kZUFyYzQoc3Rha2VyKSB8fAogICAgLy8gICB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBuZXcgQWRkcmVzcyhzdGFrZXIpKSwKICAgIGJ6IGFkZFN0YWtlX2Jvb2xfZmFsc2VANTQKCmFkZFN0YWtlX2Jvb2xfdHJ1ZUA1MzoKICAgIGludGNfMSAvLyAxCgphZGRTdGFrZV9ib29sX21lcmdlQDU1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNjUtMTI2OQogICAgLy8gYXNzZXJ0KAogICAgLy8gICBvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyh1c2VyT2ZmZXJlZE5GREFwcElELCBCeXRlcygnaS5vd25lci5hJykpWzBdID09PSBlbmNvZGVBcmM0KHN0YWtlcikgfHwKICAgIC8vICAgICB0aGlzLmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdCh1c2VyT2ZmZXJlZE5GREFwcElELCBuZXcgQWRkcmVzcyhzdGFrZXIpKSwKICAgIC8vICAgInByb3ZpZGVkIG5mZCBmb3IgZW50cnkgaXNuJ3Qgb3duZWQgb3IgbGlua2VkIHRvIHRoZSBzdGFrZXIiLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIHByb3ZpZGVkIG5mZCBmb3IgZW50cnkgaXNuJ3Qgb3duZWQgb3IgbGlua2VkIHRvIHRoZSBzdGFrZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjczCiAgICAvLyBvcC5idG9pKG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKHVzZXJPZmZlcmVkTkZEQXBwSUQsIEJ5dGVzKCdpLnBhcmVudEFwcElEJykpWzBdKSA9PT0KICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzICJpLnBhcmVudEFwcElEIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEyNzQKICAgIC8vIGNvbmZpZy5lbnRyeUdhdGluZ0Fzc2V0c1swXSwKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDAgMjQyCiAgICBleHRyYWN0IDExMyAzMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTI3My0xMjc0CiAgICAvLyBvcC5idG9pKG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKHVzZXJPZmZlcmVkTkZEQXBwSUQsIEJ5dGVzKCdpLnBhcmVudEFwcElEJykpWzBdKSA9PT0KICAgIC8vICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMjcyLTEyNzYKICAgIC8vIGFzc2VydCgKICAgIC8vICAgb3AuYnRvaShvcC5BcHBHbG9iYWwuZ2V0RXhCeXRlcyh1c2VyT2ZmZXJlZE5GREFwcElELCBCeXRlcygnaS5wYXJlbnRBcHBJRCcpKVswXSkgPT09CiAgICAvLyAgICAgY29uZmlnLmVudHJ5R2F0aW5nQXNzZXRzWzBdLAogICAgLy8gICAnc3BlY2lmaWVkIG5mZCBtdXN0IGJlIGEgc2VnbWVudCBvZiB0aGUgbmZkIHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGFzIGEgcmVxdWlyZW1lbnQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIHNwZWNpZmllZCBuZmQgbXVzdCBiZSBhIHNlZ21lbnQgb2YgdGhlIG5mZCB0aGUgdmFsaWRhdG9yIHNwZWNpZmllZCBhcyBhIHJlcXVpcmVtZW50CgphZGRTdGFrZV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZG9lc1N0YWtlck1lZXRHYXRpbmdANTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTg1CiAgICAvLyBsZXQgcmVhbEFtb3VudCA9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50CiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIEFtb3VudAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTg2CiAgICAvLyBsZXQgbWJyQW10TGVmdEJlaGluZDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1ODgKICAgIC8vIGlmICh0aGlzLmRvZXNTdGFrZXJOZWVkVG9QYXlNQlIoc3Rha2VyKSkgewogICAgZnJhbWVfZGlnIDQKICAgIGNhbGxzdWIgZG9lc1N0YWtlck5lZWRUb1BheU1CUgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxOAogICAgYnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTkxCiAgICAvLyBtYnJBbXRMZWZ0QmVoaW5kID0gdGhpcy5nZXRNYnJBbW91bnRzKCkuYWRkU3Rha2VyTWJyCiAgICBpbnRjIDE2IC8vIDc0MTAwCiAgICBmcmFtZV9idXJ5IDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTkyCiAgICAvLyByZWFsQW1vdW50IC09IG1ickFtdExlZnRCZWhpbmQKICAgIGZyYW1lX2RpZyAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU5MQogICAgLy8gbWJyQW10TGVmdEJlaGluZCA9IHRoaXMuZ2V0TWJyQW1vdW50cygpLmFkZFN0YWtlck1icgogICAgaW50YyAxNiAvLyA3NDEwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU5MgogICAgLy8gcmVhbEFtb3VudCAtPSBtYnJBbXRMZWZ0QmVoaW5kCiAgICAtCiAgICBmcmFtZV9idXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTExCiAgICAvLyBzdGFrZXJQb29sU2V0ID0gQm94TWFwPEFkZHJlc3MsIEZpeGVkQXJyYXk8VmFsaWRhdG9yUG9vbEtleSwgdHlwZW9mIE1BWF9QT09MU19QRVJfU1RBS0VSPj4oeyBrZXlQcmVmaXg6ICdzcHMnIH0pCiAgICBieXRlYyA1IC8vICJzcHMiCiAgICBmcmFtZV9kaWcgNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NTkzCiAgICAvLyB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5jcmVhdGUoKQogICAgcHVzaGludCAxNDQgLy8gMTQ0CiAgICBib3hfY3JlYXRlCiAgICBwb3AKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo1OTgKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkICsgcmVhbEFtb3VudCA8IHRoaXMubWF4QWxsb3dlZFN0YWtlKCksCiAgICBmcmFtZV9kaWcgMjQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDI0MiAyNgogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxOAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBjYWxsc3ViIG1heEFsbG93ZWRTdGFrZQogICAgPAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjU5Ny02MDAKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKyByZWFsQW1vdW50IDwgdGhpcy5tYXhBbGxvd2VkU3Rha2UoKSwKICAgIC8vICAgJ3RvdGFsIHN0YWtlZCBmb3IgYWxsIG9mIGEgdmFsaWRhdG9ycyBwb29scyBtYXkgbm90IGV4Y2VlZCBoYXJkIGNhcCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gdG90YWwgc3Rha2VkIGZvciBhbGwgb2YgYSB2YWxpZGF0b3JzIHBvb2xzIG1heSBub3QgZXhjZWVkIGhhcmQgY2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA0CiAgICAvLyBjb25zdCBmaW5kUmV0ID0gdGhpcy5maW5kUG9vbEZvclN0YWtlcih2YWxpZGF0b3JJZCwgc3Rha2VyLCByZWFsQW1vdW50KQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgZmluZFBvb2xGb3JTdGFrZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDUKICAgIC8vIGNvbnN0IHBvb2xLZXkgPSBjbG9uZShmaW5kUmV0WzBdKQogICAgZHVwCiAgICBleHRyYWN0IDAgMjQKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA2CiAgICAvLyBjb25zdCBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gZmluZFJldFsxXQogICAgZHVwCiAgICBpbnRjIDkgLy8gMTkyCiAgICBnZXRiaXQKICAgIGZyYW1lX2J1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MDcKICAgIC8vIGNvbnN0IGlzTmV3U3Rha2VyVG9Qcm90b2NvbCA9IGZpbmRSZXRbMl0KICAgIHB1c2hpbnQgMTkzIC8vIDE5MwogICAgZ2V0Yml0CiAgICBmcmFtZV9idXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjA4CiAgICAvLyBpZiAocG9vbEtleS5wb29sSWQgPT09IDApIHsKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIyCiAgICAhCiAgICAhCiAgICBhc3NlcnQgLy8gTm8gcG9vbCBhdmFpbGFibGUgd2l0aCBmcmVlIHN0YWtlLiAgVmFsaWRhdG9yIG5lZWRzIHRvIGFkZCBhbm90aGVyIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTEKICAgIC8vIHN0YWtlclBvb2xTZXQgPSBCb3hNYXA8QWRkcmVzcywgRml4ZWRBcnJheTxWYWxpZGF0b3JQb29sS2V5LCB0eXBlb2YgTUFYX1BPT0xTX1BFUl9TVEFLRVI+Pih7IGtleVByZWZpeDogJ3NwcycgfSkKICAgIGJ5dGVjIDUgLy8gInNwcyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEyNAogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLmV4aXN0cykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTI2CiAgICAvLyBjb25zdCBwb29sU2V0ID0gY2xvbmUodGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUpCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMjcKICAgIC8vIGxldCBmaXJzdEVtcHR5OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEyOAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxMQoKYWRkU3Rha2Vfd2hpbGVfdG9wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEyOAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMjQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAxMQogICAgcHVzaGludCA2IC8vIDYKICAgIDwKICAgIGJ6IGFkZFN0YWtlX2FmdGVyX3doaWxlQDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMAogICAgLy8gcG9vbFNldFtpXS5pZCA9PT0gcG9vbEtleS5pZCAmJgogICAgZnJhbWVfZGlnIDExCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgc3dhcAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjEKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMC0xMTMxCiAgICAvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkICYmCiAgICAvLyBwb29sU2V0W2ldLnBvb2xJZCA9PT0gcG9vbEtleS5wb29sSWQgJiYKICAgIGJ6IGFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMxCiAgICAvLyBwb29sU2V0W2ldLnBvb2xJZCA9PT0gcG9vbEtleS5wb29sSWQgJiYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMC0xMTMxCiAgICAvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkICYmCiAgICAvLyBwb29sU2V0W2ldLnBvb2xJZCA9PT0gcG9vbEtleS5wb29sSWQgJiYKICAgIGludGNfMyAvLyA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMQogICAgLy8gcG9vbFNldFtpXS5wb29sSWQgPT09IHBvb2xLZXkucG9vbElkICYmCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDIyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMzAtMTEzMQogICAgLy8gcG9vbFNldFtpXS5pZCA9PT0gcG9vbEtleS5pZCAmJgogICAgLy8gcG9vbFNldFtpXS5wb29sSWQgPT09IHBvb2xLZXkucG9vbElkICYmCiAgICBieiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEzMgogICAgLy8gcG9vbFNldFtpXS5wb29sQXBwSWQgPT09IHBvb2xLZXkucG9vbEFwcElkCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTMwLTExMzIKICAgIC8vIHBvb2xTZXRbaV0uaWQgPT09IHBvb2xLZXkuaWQgJiYKICAgIC8vIHBvb2xTZXRbaV0ucG9vbElkID09PSBwb29sS2V5LnBvb2xJZCAmJgogICAgLy8gcG9vbFNldFtpXS5wb29sQXBwSWQgPT09IHBvb2xLZXkucG9vbEFwcElkCiAgICBibnogYWRkU3Rha2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LnVwZGF0ZVN0YWtlclBvb2xTZXRAMjAKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICBmcmFtZV9kaWcgOAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTM3CiAgICAvLyBpZiAoZmlyc3RFbXB0eSA9PT0gMCAmJiBwb29sU2V0W2ldLmlkID09PSAwKSB7CiAgICBibnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNgogICAgZnJhbWVfZGlnIDgKICAgIGZyYW1lX2J1cnkgOQogICAgZnJhbWVfZGlnIDIxCiAgICBibnogYWRkU3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMzgKICAgIC8vIGZpcnN0RW1wdHkgPSBpICsgMQogICAgZnJhbWVfZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA5CgphZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDE2OgogICAgZnJhbWVfZGlnIDkKICAgIGZyYW1lX2J1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMjgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDExCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxMQogICAgYiBhZGRTdGFrZV93aGlsZV90b3BAOAoKYWRkU3Rha2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LnVwZGF0ZVN0YWtlclBvb2xTZXRAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4NwogICAgLy8gY29uc3QgcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA4NwogICAgLy8gY29uc3QgcG9vbEFwcElkID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgMjIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBzd2FwCiAgICBpbnRjIDQgLy8gMjY4CiAgICBpbnRjIDUgLy8gNDMyCiAgICBleHRyYWN0MwogICAgZGlnIDEKICAgIGludGNfMiAvLyAxOAogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDkxLTExMDAKICAgIC8vIGFiaUNhbGwoU3Rha2luZ1Bvb2wucHJvdG90eXBlLmFkZFN0YWtlLCB7CiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbihwb29sQXBwSWQpLAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgLy8gPT09PT09PQogICAgLy8gICAgIC8vIFRISVMgSVMgQSBTRU5EIG9mIHRoZSBhbW91bnQgcmVjZWl2ZWQgcmlnaHQgYmFjayBvdXQgYW5kIGludG8gdGhlIHN0YWtpbmcgcG9vbCBjb250cmFjdCBhY2NvdW50LgogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7IGFtb3VudDogc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQgLSBtYnJBbXRQYWlkLCByZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbEFwcElkKS5hZGRyZXNzIH0pLAogICAgLy8gICAgIC8vID09PT09PT0KICAgIC8vICAgICBuZXcgQWRkcmVzcyhzdGFrZWRBbW91bnRQYXltZW50LnNlbmRlciksCiAgICAvLyAgIF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTYKICAgIC8vIGl0eG4ucGF5bWVudCh7IGFtb3VudDogc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQgLSBtYnJBbXRQYWlkLCByZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbEFwcElkKS5hZGRyZXNzIH0pLAogICAgZnJhbWVfZGlnIDE3CiAgICBmcmFtZV9kaWcgMTYKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxMgogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwOTEtMTEwMAogICAgLy8gYWJpQ2FsbChTdGFraW5nUG9vbC5wcm90b3R5cGUuYWRkU3Rha2UsIHsKICAgIC8vICAgYXBwSWQ6IEFwcGxpY2F0aW9uKHBvb2xBcHBJZCksCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICAvLyA9PT09PT09CiAgICAvLyAgICAgLy8gVEhJUyBJUyBBIFNFTkQgb2YgdGhlIGFtb3VudCByZWNlaXZlZCByaWdodCBiYWNrIG91dCBhbmQgaW50byB0aGUgc3Rha2luZyBwb29sIGNvbnRyYWN0IGFjY291bnQuCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsgYW1vdW50OiBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQsIHJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sQXBwSWQpLmFkZHJlc3MgfSksCiAgICAvLyAgICAgLy8gPT09PT09PQogICAgLy8gICAgIG5ldyBBZGRyZXNzKHN0YWtlZEFtb3VudFBheW1lbnQuc2VuZGVyKSwKICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIHB1c2hieXRlcyAweGY5YzcwY2JkIC8vIG1ldGhvZCAiYWRkU3Rha2UocGF5LGFkZHJlc3MpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyA2CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBnaXR4biAxIExhc3RMb2cKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDEKICAgIC8vIGVuc3VyZUJ1ZGdldCg1MDApCiAgICBwdXNoaW50IDUwMCAvLyA1MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTA0CiAgICAvLyBjb25zdCBbcG9vbE51bVN0YWtlcnMsIG51bVN0YWtlcnNEZWZpbmVkXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChwb29sQXBwSWQsIEJ5dGVzKCdudW1TdGFrZXJzJykpCiAgICBkdXAKICAgIGJ5dGVjIDQgLy8gIm51bVN0YWtlcnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDUKICAgIC8vIGNvbnN0IFtwb29sQWxnb1N0YWtlZCwgc3Rha2VkRGVmaW5lZF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQocG9vbEFwcElkLCBCeXRlcygnc3Rha2VkJykpCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzMgLy8gInN0YWtlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEwNgogICAgLy8gYXNzZXJ0KG51bVN0YWtlcnNEZWZpbmVkKQogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTA3CiAgICAvLyBhc3NlcnQoc3Rha2VkRGVmaW5lZCkKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMDkKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsU3Rha2VycyA9IG5ldyBVaW50MTYocG9vbE51bVN0YWtlcnMpCiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDI3NiAvLyAyNzYKICAgICsKICAgIGRpZyA0CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTExMAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkID0gcG9vbEFsZ29TdGFrZWQKICAgIGl0b2IKICAgIHN3YXAKICAgIGludGMgMTQgLy8gMjc4CiAgICArCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMTMKICAgIC8vIGlmIChpc05ld1N0YWtlclRvVmFsaWRhdG9yKSB7CiAgICBmcmFtZV9kaWcgMTQKICAgIGJ6IGFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VAMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTE0CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxTdGFrZXJzICs9IDEKICAgIGZyYW1lX2RpZyAyNAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAyNDIgMjYKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgMjQ0IC8vIDI0NAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKCmFkZFN0YWtlX2FmdGVyX2lmX2Vsc2VAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTExNgogICAgLy8gaWYgKGlzTmV3U3Rha2VyVG9Qcm90b2NvbCkgewogICAgZnJhbWVfZGlnIDEzCiAgICBieiBhZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTExNwogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlICs9IDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAwCiAgICAvLyBudW1TdGFrZXJzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVN0YWtlcnMnIH0pCiAgICBieXRlYyA0IC8vICJudW1TdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMTcKICAgIC8vIHRoaXMubnVtU3Rha2Vycy52YWx1ZSArPSAxCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDAKICAgIC8vIG51bVN0YWtlcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtU3Rha2VycycgfSkKICAgIGJ5dGVjIDQgLy8gIm51bVN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTExNwogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlICs9IDEKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgphZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMTkKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQgKz0gc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQgLSBtYnJBbXRQYWlkCiAgICBmcmFtZV9kaWcgMjQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaW50YyAxNSAvLyAyNTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTIwCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBzdGFrZWRBbW91bnRQYXltZW50LmFtb3VudCAtIG1ickFtdFBhaWQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzCiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWNfMyAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExMjAKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlICs9IHN0YWtlZEFtb3VudFBheW1lbnQuYW1vdW50IC0gbWJyQW10UGFpZAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDMKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlY18zIC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTEyMAogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gc3Rha2VkQW1vdW50UGF5bWVudC5hbW91bnQgLSBtYnJBbXRQYWlkCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxOQogICAgLy8gcG9vbE51bTogbmV3IFVpbnQxNihwb29sS2V5LnBvb2xJZCksCiAgICBmcmFtZV9kaWcgMjIKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYyMAogICAgLy8gcG9vbEFwcElkOiBwb29sS2V5LnBvb2xBcHBJZCwKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjE3LTYyMwogICAgLy8gZW1pdDxyZXRpT1Bfc3Rha2VBZGRlZD4oewogICAgLy8gICBpZDogdmFsaWRhdG9ySWQsCiAgICAvLyAgIHBvb2xOdW06IG5ldyBVaW50MTYocG9vbEtleS5wb29sSWQpLAogICAgLy8gICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAogICAgLy8gICBhbW91bnRTdGFrZWQ6IHJlYWxBbW91bnQsCiAgICAvLyAgIHN0YWtlcjogc3Rha2VyLAogICAgLy8gfSkKICAgIGZyYW1lX2RpZyAyMwogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDE4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDk2MmI0MTQzIC8vIG1ldGhvZCAicmV0aU9QX3N0YWtlQWRkZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2MjUKICAgIC8vIHJldHVybiBwb29sS2V5CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYWRkU3Rha2VfYWZ0ZXJfd2hpbGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE0MQogICAgLy8gaWYgKGZpcnN0RW1wdHkgPT09IDApIHsKICAgIGZyYW1lX2RpZyA4CiAgICBkdXAKICAgICEKICAgICEKICAgIGFzc2VydCAvLyBObyBlbXB0eSBzbG90IGF2YWlsYWJsZSBpbiB0aGUgc3Rha2VyIHBvb2wgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE0NAogICAgLy8gdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWVbZmlyc3RFbXB0eSAtIDFdID0gY2xvbmUocG9vbEtleSkKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICAqCiAgICBmcmFtZV9kaWcgMjQKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjYxMwogICAgLy8gdGhpcy51cGRhdGVTdGFrZXJQb29sU2V0KHN0YWtlciwgcG9vbEtleSkKICAgIGIgYWRkU3Rha2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LnVwZGF0ZVN0YWtlclBvb2xTZXRAMjAKCmFkZFN0YWtlX2Jvb2xfZmFsc2VANTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhZGRTdGFrZV9ib29sX21lcmdlQDU1CgphZGRTdGFrZV9hZnRlcl9pZl9lbHNlQDQ0OgogICAgZnJhbWVfZGlnIDE1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxNQogICAgYiBhZGRTdGFrZV9mb3JfaGVhZGVyQDQxCgoKLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjpWYWxpZGF0b3JSZWdpc3RyeS5zZXRUb2tlblBheW91dFJhdGlvKHZhbGlkYXRvcklkOiB1aW50NjQpIC0+IGJ5dGVzOgpzZXRUb2tlblBheW91dFJhdGlvOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY0MwogICAgLy8gc2V0VG9rZW5QYXlvdXRSYXRpbyh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlKTogUG9vbFRva2VuUGF5b3V0UmF0aW8gewogICAgcHJvdG8gMSAxCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDUKICAgIC8vIGNvbnN0IHBvb2wxQXBwSUQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjQ1CiAgICAvLyBjb25zdCBwb29sMUFwcElEID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5wb29sc1swXS5wb29sQXBwSWQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjIDQgLy8gMjY4CiAgICBpbnRjIDUgLy8gNDMyCiAgICBleHRyYWN0MwogICAgZXh0cmFjdCAwIDE4IC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NDYKICAgIC8vIGFzc2VydChwb29sMUFwcElEICE9PSAwKQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjQ4CiAgICAvLyBpZiAoVHhuLnNlbmRlciAhPT0gQXBwbGljYXRpb24ocG9vbDFBcHBJRCkuYWRkcmVzcykgewogICAgdHhuIFNlbmRlcgogICAgc3dhcAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgIT0KICAgIGJ6IHNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjQ5CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCiAgICBmcmFtZV9kaWcgNQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGMgNyAvLyA3MDAKICAgIGludGMgNiAvLyAyMDAKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc2V0VG9rZW5QYXlvdXRSYXRpb19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjU1CiAgICAvLyBjb25zdCBjdXJSb3VuZCA9IEdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NTYKICAgIC8vIGNvbnN0IGxhc3RQYXlvdXRVcGRhdGUgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dAogICAgZnJhbWVfZGlnIDUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjIDcgLy8gNzAwCiAgICBpbnRjIDYgLy8gMjAwCiAgICBleHRyYWN0MwogICAgaW50YyA5IC8vIDE5MgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjU3CiAgICAvLyBpZiAobGFzdFBheW91dFVwZGF0ZSAhPT0gMCkgewogICAgYnogc2V0VG9rZW5QYXlvdXRSYXRpb19hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NTkKICAgIC8vIGlmIChvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQocG9vbDFBcHBJRCwgQnl0ZXMoJ2xhc3RQYXlvdXQnKSlbMF0gPT09IGxhc3RQYXlvdXRVcGRhdGUpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBwdXNoYnl0ZXMgImxhc3RQYXlvdXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBmcmFtZV9kaWcgMwogICAgPT0KICAgIGJ6IHNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYwCiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCiAgICBmcmFtZV9kaWcgNQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGMgNyAvLyA3MDAKICAgIGludGMgNiAvLyAyMDAKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc2V0VG9rZW5QYXlvdXRSYXRpb19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjYyCiAgICAvLyBjb25zdCBlcG9jaFJvdW5kTGVuZ3RoID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcuZXBvY2hSb3VuZExlbmd0aC5uYXRpdmUKICAgIGZyYW1lX2RpZyA1CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAwIDI0MgogICAgcHVzaGludCAxNjkgLy8gMTY5CiAgICBleHRyYWN0X3VpbnQzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY2MwogICAgLy8gY29uc3QgdGhpc0Vwb2NoQmVnaW46IHVpbnQ2NCA9IGN1clJvdW5kIC0gKGN1clJvdW5kICUgZXBvY2hSb3VuZExlbmd0aCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICAlCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NjUKICAgIC8vIGlmIChsYXN0UGF5b3V0VXBkYXRlIC0gKGxhc3RQYXlvdXRVcGRhdGUgJSBlcG9jaFJvdW5kTGVuZ3RoKSA9PT0gdGhpc0Vwb2NoQmVnaW4pIHsKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMwogICAgJQogICAgLQogICAgPT0KICAgIGJ6IHNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjY2CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCiAgICBmcmFtZV9kaWcgNQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGMgNyAvLyA3MDAKICAgIGludGMgNiAvLyAyMDAKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc2V0VG9rZW5QYXlvdXRSYXRpb19hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjY5CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnRva2VuUGF5b3V0UmF0aW8udXBkYXRlZEZvclBheW91dCA9IGN1clJvdW5kCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA4OTIgLy8gODkyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjcxCiAgICAvLyBjb25zdCBjdXJOdW1Qb29scyA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuc3RhdGUubnVtUG9vbHMubmF0aXZlCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjcyCiAgICAvLyBjb25zdCB0b3RhbFN0YWtlRm9yVmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS50b3RhbEFsZ29TdGFrZWQKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NzMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjdXJOdW1Qb29sczsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpzZXRUb2tlblBheW91dFJhdGlvX3doaWxlX3RvcEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3MwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogc2V0VG9rZW5QYXlvdXRSYXRpb19hZnRlcl93aGlsZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY3OQogICAgLy8gW3RoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbaV0udG90YWxBbGdvU3Rha2VkLCAxXzAwMF8wMDBdLAogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGMgNCAvLyAyNjgKICAgIGludGMgNSAvLyA0MzIKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWMgMTEgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGludGMgMTAgLy8gMTAwMDAwMAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NjgwCiAgICAvLyBbdG90YWxTdGFrZUZvclZhbGlkYXRvcl0sCiAgICBmcmFtZV9kaWcgNAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAwMQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njc4LTY4MQogICAgLy8gY29uc3Qgb3VyUG9vbFBjdE9mV2hvbGUgPSB3aWRlUmF0aW8oCiAgICAvLyAgIFt0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzW2ldLnRvdGFsQWxnb1N0YWtlZCwgMV8wMDBfMDAwXSwKICAgIC8vICAgW3RvdGFsU3Rha2VGb3JWYWxpZGF0b3JdLAogICAgLy8gKQogICAgY2FsbHN1YiB3aWRlUmF0aW8KICAgIHBvcG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjY4MgogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvLnBvb2xQY3RPZldob2xlW2ldID0gb3VyUG9vbFBjdE9mV2hvbGUKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBpbnRjIDcgLy8gNzAwCiAgICArCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo2NzMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjdXJOdW1Qb29sczsgaSArPSAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIHNldFRva2VuUGF5b3V0UmF0aW9fd2hpbGVfdG9wQDkKCnNldFRva2VuUGF5b3V0UmF0aW9fYWZ0ZXJfd2hpbGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njg0CiAgICAvLyByZXR1cm4gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS50b2tlblBheW91dFJhdGlvCiAgICBmcmFtZV9kaWcgNQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGMgNyAvLyA3MDAKICAgIGludGMgNiAvLyAyMDAKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuc3Rha2VVcGRhdGVkVmlhUmV3YXJkcyhwb29sS2V5OiBieXRlcywgYWxnb1RvQWRkOiB1aW50NjQsIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NCwgdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0LCBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQpIC0+IHZvaWQ6CnN0YWtlVXBkYXRlZFZpYVJld2FyZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Njk4LTcwNAogICAgLy8gc3Rha2VVcGRhdGVkVmlhUmV3YXJkcygKICAgIC8vICAgcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleSwKICAgIC8vICAgYWxnb1RvQWRkOiB1aW50NjQsCiAgICAvLyAgIHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQ6IHVpbnQ2NCwKICAgIC8vICAgdmFsaWRhdG9yQ29tbWlzc2lvbjogdWludDY0LAogICAgLy8gICBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDUgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDUKICAgIC8vIHRoaXMudmVyaWZ5UG9vbEtleUNhbGxlcihwb29sS2V5KQogICAgZnJhbWVfZGlnIC01CiAgICBjYWxsc3ViIHZlcmlmeVBvb2xLZXlDYWxsZXIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtNQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcwOAogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkICs9IGFsZ29Ub0FkZAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MDgKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCArPSBhbGdvVG9BZGQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTUKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgc3dhcAogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtNAogICAgKwogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50YyAxNCAvLyAyNzgKICAgICsKICAgIGRpZyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzA5CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkICs9IGFsZ29Ub0FkZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC00CiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgaW50YyAxNSAvLyAyNTIKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTAKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrICs9IHJld2FyZFRva2VuQW1vdW50UmVzZXJ2ZWQKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBleHRyYWN0IDI0MiAyNgogICAgaW50Y18yIC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0zCiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgcHVzaGludCAyNjAgLy8gMjYwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzEyCiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSArPSBhbGdvVG9BZGQKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzCiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWNfMyAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAzCiAgICAvLyB0b3RhbEFsZ29TdGFrZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc3Rha2VkJyB9KQogICAgYnl0ZWNfMyAvLyAic3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcxMgogICAgLy8gdGhpcy50b3RhbEFsZ29TdGFrZWQudmFsdWUgKz0gYWxnb1RvQWRkCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMTkKICAgIC8vIGNvbnN0IHZhbGlkYXRvckNvbmZpZyA9IGNsb25lKHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAxOS0xMDIwCiAgICAvLyBjb25zdCB2YWxpZGF0b3JDb25maWcgPSBjbG9uZSh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZykKICAgIC8vIGlmICh2YWxpZGF0b3JDb25maWcubmZkRm9ySW5mbyAhPT0gMCkgewogICAgZXh0cmFjdCAwIDI0MgogICAgZHVwCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAyMAogICAgLy8gaWYgKHZhbGlkYXRvckNvbmZpZy5uZmRGb3JJbmZvICE9PSAwKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBieiBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMjQKICAgIC8vIGNvbnN0IG5mZE93bmVyID0gbmV3IEFkZHJlc3Mob3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXModmFsaWRhdG9yQ29uZmlnLm5mZEZvckluZm8sIEJ5dGVzKCdpLm93bmVyLmEnKSlbMF0pCiAgICBmcmFtZV9kaWcgNQogICAgYnl0ZWMgOSAvLyAiaS5vd25lci5hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDI2CiAgICAvLyBpZiAodmFsaWRhdG9yQ29uZmlnLm93bmVyICE9PSBuZmRPd25lciAmJiB2YWxpZGF0b3JDb25maWcubWFuYWdlciAhPT0gbmZkT3duZXIpIHsKICAgIGZyYW1lX2RpZyA0CiAgICBleHRyYWN0IDggMzIKICAgICE9CiAgICBieiBzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANgogICAgZnJhbWVfZGlnIDQKICAgIGV4dHJhY3QgNDAgMzIKICAgIGZyYW1lX2RpZyAwCiAgICAhPQogICAgYnogc3Rha2VVcGRhdGVkVmlhUmV3YXJkc19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDI4CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5uZmRGb3JJbmZvID0gMAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAyCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCgpzdGFrZVVwZGF0ZWRWaWFSZXdhcmRzX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTkKICAgIC8vIHBvb2xOdW06IG5ldyBVaW50MTYocG9vbEtleS5wb29sSWQpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjcyMAogICAgLy8gcG9vbEFwcElkOiBwb29sS2V5LnBvb2xBcHBJZCwKICAgIGZyYW1lX2RpZyAtNQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3MTctNzI1CiAgICAvLyBlbWl0PHJldGlPUF9lcG9jaFJld2FyZFVwZGF0ZT4oewogICAgLy8gICBpZDogcG9vbEtleS5pZCwKICAgIC8vICAgcG9vbE51bTogbmV3IFVpbnQxNihwb29sS2V5LnBvb2xJZCksCiAgICAvLyAgIHBvb2xBcHBJZDogcG9vbEtleS5wb29sQXBwSWQsCiAgICAvLyAgIGFsZ29BZGRlZDogYWxnb1RvQWRkLAogICAgLy8gICByZXdhcmRUb2tlbkhlbGRCYWNrOiByZXdhcmRUb2tlbkFtb3VudFJlc2VydmVkLAogICAgLy8gICBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rOiBzYXR1cmF0ZWRCdXJuVG9GZWVTaW5rLAogICAgLy8gICB2YWxpZGF0b3JDb21taXNzaW9uOiB2YWxpZGF0b3JDb21taXNzaW9uLAogICAgLy8gfSkKICAgIGZyYW1lX2RpZyAxCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4YjNlNDdjM2QgLy8gbWV0aG9kICJyZXRpT1BfZXBvY2hSZXdhcmRVcGRhdGUodWludDY0LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LnN0YWtlUmVtb3ZlZChwb29sS2V5OiBieXRlcywgc3Rha2VyOiBieXRlcywgYW1vdW50UmVtb3ZlZDogdWludDY0LCByZXdhcmRSZW1vdmVkOiB1aW50NjQsIHN0YWtlclJlbW92ZWQ6IHVpbnQ2NCkgLT4gdm9pZDoKc3Rha2VSZW1vdmVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc0MC03NDYKICAgIC8vIHN0YWtlUmVtb3ZlZCgKICAgIC8vICAgcG9vbEtleTogVmFsaWRhdG9yUG9vbEtleSwKICAgIC8vICAgc3Rha2VyOiBBZGRyZXNzLAogICAgLy8gICBhbW91bnRSZW1vdmVkOiB1aW50NjQsCiAgICAvLyAgIHJld2FyZFJlbW92ZWQ6IHVpbnQ2NCwKICAgIC8vICAgc3Rha2VyUmVtb3ZlZDogYm9vbGVhbiwKICAgIC8vICk6IHZvaWQgewogICAgcHJvdG8gNSAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiA1CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ3CiAgICAvLyBlbnN1cmVCdWRnZXQoMzAwKQogICAgcHVzaGludCAzMDAgLy8gMzAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzQ4CiAgICAvLyB0aGlzLnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleSkKICAgIGZyYW1lX2RpZyAtNQogICAgY2FsbHN1YiB2ZXJpZnlQb29sS2V5Q2FsbGVyCiAgICBmcmFtZV9idXJ5IC01CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzUyCiAgICAvLyBhc3NlcnQoYW1vdW50UmVtb3ZlZCA+IDAgfHwgcmV3YXJkUmVtb3ZlZCA+IDAsICdzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgYWxnbyBvciByZXdhcmQgd2FzIHJlbW92ZWQnKQogICAgZnJhbWVfZGlnIC0zCiAgICBibnogc3Rha2VSZW1vdmVkX2Jvb2xfdHJ1ZUAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6IHN0YWtlUmVtb3ZlZF9ib29sX2ZhbHNlQDMKCnN0YWtlUmVtb3ZlZF9ib29sX3RydWVAMjoKICAgIGludGNfMSAvLyAxCgpzdGFrZVJlbW92ZWRfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc1MgogICAgLy8gYXNzZXJ0KGFtb3VudFJlbW92ZWQgPiAwIHx8IHJld2FyZFJlbW92ZWQgPiAwLCAnc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsZ28gb3IgcmV3YXJkIHdhcyByZW1vdmVkJykKICAgIGFzc2VydCAvLyBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgYWxnbyBvciByZXdhcmQgd2FzIHJlbW92ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NTUKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnRvdGFsQWxnb1N0YWtlZCAtPSBhbW91bnRSZW1vdmVkCiAgICBmcmFtZV9kaWcgLTUKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc1NQogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkIC09IGFtb3VudFJlbW92ZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtNQogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBzd2FwCiAgICBpbnRjIDQgLy8gMjY4CiAgICBpbnRjIDUgLy8gNDMyCiAgICBleHRyYWN0MwogICAgZGlnIDEKICAgIGludGNfMiAvLyAxOAogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIHN3YXAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMwogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgaW50YyAxNCAvLyAyNzgKICAgICsKICAgIGRpZyAyCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU2CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUuc3RhdGUudG90YWxBbGdvU3Rha2VkIC09IGFtb3VudFJlbW92ZWQKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBleHRyYWN0IDI0MiAyNgogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMwogICAgLQogICAgaXRvYgogICAgaW50YyAxNSAvLyAyNTIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU3CiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSAtPSBhbW91bnRSZW1vdmVkCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMwogICAgLy8gdG90YWxBbGdvU3Rha2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3N0YWtlZCcgfSkKICAgIGJ5dGVjXzMgLy8gInN0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NTcKICAgIC8vIHRoaXMudG90YWxBbGdvU3Rha2VkLnZhbHVlIC09IGFtb3VudFJlbW92ZWQKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDMKICAgIC8vIHRvdGFsQWxnb1N0YWtlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzdGFrZWQnIH0pCiAgICBieXRlY18zIC8vICJzdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6NzU3CiAgICAvLyB0aGlzLnRvdGFsQWxnb1N0YWtlZC52YWx1ZSAtPSBhbW91bnRSZW1vdmVkCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc1OQogICAgLy8gaWYgKHJld2FyZFJlbW92ZWQgPiAwKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6IHN0YWtlUmVtb3ZlZF9lbHNlX2JvZHlAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc2MAogICAgLy8gY29uc3QgcmV3YXJkVG9rZW5JRCA9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5jb25maWcucmV3YXJkVG9rZW5JZAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGR1cAogICAgZXh0cmFjdCAwIDI0MgogICAgZHVwCiAgICBleHRyYWN0IDE1MyA4CiAgICBmcmFtZV9idXJ5IDEKICAgIHB1c2hpbnQgMTUzIC8vIDE1MwogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc2MQogICAgLy8gYXNzZXJ0KHJld2FyZFRva2VuSUQgIT09IDAsICJyZXdhcmRSZW1vdmVkIGNhbid0IGJlIHNldCBpZiB2YWxpZGF0b3IgZG9lc24ndCBoYXZlIHJld2FyZCB0b2tlbiEiKQogICAgYXNzZXJ0IC8vIHJld2FyZFJlbW92ZWQgY2FuJ3QgYmUgc2V0IGlmIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgcmV3YXJkIHRva2VuIQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc2MwogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sgPj0gcmV3YXJkUmVtb3ZlZCwKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjItNzY1CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrID49IHJld2FyZFJlbW92ZWQsCiAgICAvLyAgICdyZXdhcmQgYmVpbmcgcmVtb3ZlZCBtdXN0IGJlIGNvdmVyZWQgYnkgaG9sZCBiYWNrIGFtb3VudCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gcmV3YXJkIGJlaW5nIHJlbW92ZWQgbXVzdCBiZSBjb3ZlcmVkIGJ5IGhvbGQgYmFjayBhbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NjgKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5yZXdhcmRUb2tlbkhlbGRCYWNrIC09IHJld2FyZFJlbW92ZWQKICAgIGZyYW1lX2RpZyAtMgogICAgLQogICAgaXRvYgogICAgcHVzaGludCAyNjAgLy8gMjYwCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3MwogICAgLy8gaWYgKHBvb2xLZXkucG9vbElkICE9PSAxKSB7CiAgICBmcmFtZV9kaWcgMTgKICAgIGludGNfMSAvLyAxCiAgICAhPQogICAgYnogc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3NC03NzcKICAgIC8vIGFiaUNhbGwoU3Rha2luZ1Bvb2wucHJvdG90eXBlLnBheVRva2VuUmV3YXJkLCB7CiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKICAgIC8vICAgYXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCiAgICAvLyB9KQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3NQogICAgLy8gYXBwSWQ6IEFwcGxpY2F0aW9uKHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1swXS5wb29sQXBwSWQpLAogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjIDQgLy8gMjY4CiAgICBpbnRjIDUgLy8gNDMyCiAgICBleHRyYWN0MwogICAgZXh0cmFjdCAwIDE4IC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6Nzc2CiAgICAvLyBhcmdzOiBbc3Rha2VyLCByZXdhcmRUb2tlbklELCByZXdhcmRSZW1vdmVkXSwKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc3NC03NzcKICAgIC8vIGFiaUNhbGwoU3Rha2luZ1Bvb2wucHJvdG90eXBlLnBheVRva2VuUmV3YXJkLCB7CiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbih0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbMF0ucG9vbEFwcElkKSwKICAgIC8vICAgYXJnczogW3N0YWtlciwgcmV3YXJkVG9rZW5JRCwgcmV3YXJkUmVtb3ZlZF0sCiAgICAvLyB9KQogICAgYnl0ZWMgMTYgLy8gbWV0aG9kICJwYXlUb2tlblJld2FyZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CgpzdGFrZVJlbW92ZWRfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc4MQogICAgLy8gcG9vbE51bTogbmV3IFVpbnQxNihwb29sS2V5LnBvb2xJZCksCiAgICBmcmFtZV9kaWcgMTgKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc4MgogICAgLy8gcG9vbEFwcElkOiBwb29sS2V5LnBvb2xBcHBJZCwKICAgIGZyYW1lX2RpZyAtNQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3NzktNzg3CiAgICAvLyBlbWl0PHJldGlPUF9zdGFrZVJlbW92ZWQ+KHsKICAgIC8vICAgaWQ6IHBvb2xLZXkuaWQsCiAgICAvLyAgIHBvb2xOdW06IG5ldyBVaW50MTYocG9vbEtleS5wb29sSWQpLAogICAgLy8gICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAogICAgLy8gICBzdGFrZXI6IHN0YWtlciwKICAgIC8vICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCiAgICAvLyAgIHJld2FyZFRva2VuQXNzZXRJZDogcmV3YXJkVG9rZW5JRCwKICAgIC8vICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IHJld2FyZFJlbW92ZWQsCiAgICAvLyB9KQogICAgZnJhbWVfZGlnIDQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxNAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAxNyAvLyBtZXRob2QgInJldGlPUF9zdGFrZVJlbW92ZWQodWludDY0LHVpbnQxNix1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwoKc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODAxCiAgICAvLyBpZiAoc3Rha2VyUmVtb3ZlZCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBzdGFrZVJlbW92ZWRfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwMwogICAgLy8gY29uc3QgdG90YWxTdGFrZXJzID0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0udG90YWxTdGFrZXJzLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGMgNCAvLyAyNjgKICAgIGludGMgNSAvLyA0MzIKICAgIGV4dHJhY3QzCiAgICBmcmFtZV9kaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA0CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QocG9vbEtleS5pZCkudmFsdWUucG9vbHNbcG9vbEtleS5wb29sSWQgLSAxXS50b3RhbFN0YWtlcnMgPSBuZXcgVWludDE2KHRvdGFsU3Rha2VycyAtIDEpCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBwdXNoaW50IDI3NiAvLyAyNzYKICAgICsKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODA5CiAgICAvLyBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAogICAgZnJhbWVfZGlnIC01CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgwNi04MTAKICAgIC8vIGNvbnN0IHJlbW92ZVJldCA9IHRoaXMucmVtb3ZlRnJvbVN0YWtlclBvb2xTZXQoc3Rha2VyLCB7CiAgICAvLyAgIGlkOiBwb29sS2V5LmlkLAogICAgLy8gICBwb29sSWQ6IHBvb2xLZXkucG9vbElkLAogICAgLy8gICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAogICAgLy8gfSkKICAgIGZyYW1lX2RpZyAxOAogICAgaXRvYgogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IC01CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1NwogICAgLy8gbGV0IGluU2FtZVZhbGlkYXRvclBvb2xDb3VudDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTU4CiAgICAvLyBsZXQgaW5BbnlQb29sQ291bnQ6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE1OQogICAgLy8gbGV0IGZvdW5kID0gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTEKICAgIC8vIHN0YWtlclBvb2xTZXQgPSBCb3hNYXA8QWRkcmVzcywgRml4ZWRBcnJheTxWYWxpZGF0b3JQb29sS2V5LCB0eXBlb2YgTUFYX1BPT0xTX1BFUl9TVEFLRVI+Pih7IGtleVByZWZpeDogJ3NwcycgfSkKICAgIGJ5dGVjIDUgLy8gInNwcyIKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjEKICAgIC8vIGNvbnN0IHBvb2xTZXQgPSBjbG9uZSh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTYyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEwCgpzdGFrZVJlbW92ZWRfd2hpbGVfdG9wQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS52YWx1ZS5sZW5ndGg7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAxMAogICAgcHVzaGludCA2IC8vIDYKICAgIDwKICAgIGJ6IHN0YWtlUmVtb3ZlZF9hZnRlcl93aGlsZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjMKICAgIC8vIGlmIChwb29sU2V0W2ldLmlkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgMTAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICBmcmFtZV9kaWcgNQogICAgc3dhcAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTcKICAgIGJ6IHN0YWtlUmVtb3ZlZF9ibG9ja0AyOQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjYKICAgIC8vIGluQW55UG9vbENvdW50ICs9IDEKICAgIGZyYW1lX2RpZyAxMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTY3CiAgICAvLyBpZiAocG9vbFNldFtpXS5pZCA9PT0gcG9vbEtleS5pZCkgewogICAgZnJhbWVfZGlnIC01CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxNwogICAgPT0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNgogICAgZnJhbWVfZGlnIDgKICAgIGZyYW1lX2J1cnkgOQogICAgZnJhbWVfZGlnIDEyCiAgICBmcmFtZV9idXJ5IDEzCiAgICBieiBzdGFrZVJlbW92ZWRfYWZ0ZXJfaWZfZWxzZUAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjktMTE3MAogICAgLy8gcG9vbFNldFtpXS5pZCA9PT0gcG9vbEtleS5pZCAmJgogICAgLy8gcG9vbFNldFtpXS5wb29sSWQgPT09IHBvb2xLZXkucG9vbElkICYmCiAgICBmcmFtZV9kaWcgMTYKICAgIGJ6IHN0YWtlUmVtb3ZlZF9lbHNlX2JvZHlAMjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTcwCiAgICAvLyBwb29sU2V0W2ldLnBvb2xJZCA9PT0gcG9vbEtleS5wb29sSWQgJiYKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtNQogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNjktMTE3MAogICAgLy8gcG9vbFNldFtpXS5pZCA9PT0gcG9vbEtleS5pZCAmJgogICAgLy8gcG9vbFNldFtpXS5wb29sSWQgPT09IHBvb2xLZXkucG9vbElkICYmCiAgICBieiBzdGFrZVJlbW92ZWRfZWxzZV9ib2R5QDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE3MQogICAgLy8gcG9vbFNldFtpXS5wb29sQXBwSWQgPT09IHBvb2xLZXkucG9vbEFwcElkCiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtNQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE2OS0xMTcxCiAgICAvLyBwb29sU2V0W2ldLmlkID09PSBwb29sS2V5LmlkICYmCiAgICAvLyBwb29sU2V0W2ldLnBvb2xJZCA9PT0gcG9vbEtleS5wb29sSWQgJiYKICAgIC8vIHBvb2xTZXRbaV0ucG9vbEFwcElkID09PSBwb29sS2V5LnBvb2xBcHBJZAogICAgYnogc3Rha2VSZW1vdmVkX2Vsc2VfYm9keUAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzMKICAgIC8vIGZvdW5kID0gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExNzUKICAgIC8vIHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlW2ldID0geyBpZDogMCwgcG9vbElkOiAwLCBwb29sQXBwSWQ6IDAgfQogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyA3CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGJveF9yZXBsYWNlCgpzdGFrZVJlbW92ZWRfYWZ0ZXJfaWZfZWxzZUAyNzoKICAgIGZyYW1lX2RpZyA4CiAgICBmcmFtZV9idXJ5IDkKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfYnVyeSAxMwoKc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAMjg6CiAgICBmcmFtZV9kaWcgOQogICAgZnJhbWVfYnVyeSA4CiAgICBmcmFtZV9kaWcgMTMKICAgIGZyYW1lX2J1cnkgMTIKCnN0YWtlUmVtb3ZlZF9ibG9ja0AyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTYyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdGhpcy5zdGFrZXJQb29sU2V0KHN0YWtlcikudmFsdWUubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAxMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMTAKICAgIGIgc3Rha2VSZW1vdmVkX3doaWxlX3RvcEAxOAoKc3Rha2VSZW1vdmVkX2Vsc2VfYm9keUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTc3CiAgICAvLyBpblNhbWVWYWxpZGF0b3JQb29sQ291bnQgKz0gMQogICAgZnJhbWVfZGlnIDEyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxMgogICAgYiBzdGFrZVJlbW92ZWRfYWZ0ZXJfaWZfZWxzZUAyNwoKc3Rha2VSZW1vdmVkX2FmdGVyX3doaWxlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODEKICAgIC8vIGlmICghZm91bmQpIHsKICAgIGZyYW1lX2RpZyA4CiAgICBhc3NlcnQgLy8gTm8gbWF0Y2hpbmcgc2xvdCBmb3VuZCB3aGVuIHRvbGQgdG8gcmVtb3ZlIGEgcG9vbCBmcm9tIHRoZSBzdGFrZXJzIHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODUKICAgIC8vIHJldHVybiBbaW5TYW1lVmFsaWRhdG9yUG9vbENvdW50ID09PSAwLCBpbkFueVBvb2xDb3VudCA9PT0gMF0KICAgIGZyYW1lX2RpZyAxMgogICAgIQogICAgZnJhbWVfZGlnIDExCiAgICAhCiAgICBieXRlYyA2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgaW50Y18xIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODExCiAgICAvLyBjb25zdCBzdGFrZXJPdXRPZlRoaXNWYWxpZGF0b3IgPSByZW1vdmVSZXRbMF0KICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxMgogICAgLy8gY29uc3Qgc3Rha2VyT3V0T2ZQcm90b2NvbCA9IHJlbW92ZVJldFsxXQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGdldGJpdAogICAgZnJhbWVfYnVyeSAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxNAogICAgLy8gaWYgKHN0YWtlck91dE9mVGhpc1ZhbGlkYXRvcikgewogICAgYnogc3Rha2VSZW1vdmVkX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTUKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS50b3RhbFN0YWtlcnMgLT0gMQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBwdXNoaW50IDI0NCAvLyAyNDQKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCgpzdGFrZVJlbW92ZWRfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4MTgKICAgIC8vIGlmIChzdGFrZXJPdXRPZlByb3RvY29sKSB7CiAgICBmcmFtZV9kaWcgMTUKICAgIGJ6IHN0YWtlUmVtb3ZlZF9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE5CiAgICAvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgLT0gMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDAKICAgIC8vIG51bVN0YWtlcnMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnVtU3Rha2VycycgfSkKICAgIGJ5dGVjIDQgLy8gIm51bVN0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODE5CiAgICAvLyB0aGlzLm51bVN0YWtlcnMudmFsdWUgLT0gMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAwCiAgICAvLyBudW1TdGFrZXJzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ251bVN0YWtlcnMnIH0pCiAgICBieXRlYyA0IC8vICJudW1TdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjgxOQogICAgLy8gdGhpcy5udW1TdGFrZXJzLnZhbHVlIC09IDEKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzdGFrZVJlbW92ZWRfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIHJldHN1YgoKc3Rha2VSZW1vdmVkX2Vsc2VfYm9keUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc5MQogICAgLy8gcG9vbE51bTogbmV3IFVpbnQxNihwb29sS2V5LnBvb2xJZCksCiAgICBmcmFtZV9kaWcgMTgKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc5MgogICAgLy8gcG9vbEFwcElkOiBwb29sS2V5LnBvb2xBcHBJZCwKICAgIGZyYW1lX2RpZyAtNQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo3ODktNzk4CiAgICAvLyBlbWl0PHJldGlPUF9zdGFrZVJlbW92ZWQ+KHsKICAgIC8vICAgaWQ6IHBvb2xLZXkuaWQsCiAgICAvLyAgIHBvb2xOdW06IG5ldyBVaW50MTYocG9vbEtleS5wb29sSWQpLAogICAgLy8gICBwb29sQXBwSWQ6IHBvb2xLZXkucG9vbEFwcElkLAogICAgLy8gICBzdGFrZXI6IHN0YWtlciwKICAgIC8vICAgYW1vdW50VW5zdGFrZWQ6IGFtb3VudFJlbW92ZWQsCiAgICAvLyAgIC8vIG5vIHRva2VucyByZXdhcmRlZC4uCiAgICAvLyAgIHJld2FyZFRva2VuQXNzZXRJZDogMCwKICAgIC8vICAgcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCiAgICAvLyB9KQogICAgZnJhbWVfZGlnIDQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc5NwogICAgLy8gcmV3YXJkVG9rZW5zUmVjZWl2ZWQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjc4OS03OTgKICAgIC8vIGVtaXQ8cmV0aU9QX3N0YWtlUmVtb3ZlZD4oewogICAgLy8gICBpZDogcG9vbEtleS5pZCwKICAgIC8vICAgcG9vbE51bTogbmV3IFVpbnQxNihwb29sS2V5LnBvb2xJZCksCiAgICAvLyAgIHBvb2xBcHBJZDogcG9vbEtleS5wb29sQXBwSWQsCiAgICAvLyAgIHN0YWtlcjogc3Rha2VyLAogICAgLy8gICBhbW91bnRVbnN0YWtlZDogYW1vdW50UmVtb3ZlZCwKICAgIC8vICAgLy8gbm8gdG9rZW5zIHJld2FyZGVkLi4KICAgIC8vICAgcmV3YXJkVG9rZW5Bc3NldElkOiAwLAogICAgLy8gICByZXdhcmRUb2tlbnNSZWNlaXZlZDogMCwKICAgIC8vIH0pCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDE3IC8vIG1ldGhvZCAicmV0aU9QX3N0YWtlUmVtb3ZlZCh1aW50NjQsdWludDE2LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIHN0YWtlUmVtb3ZlZF9hZnRlcl9pZl9lbHNlQDEwCgpzdGFrZVJlbW92ZWRfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgc3Rha2VSZW1vdmVkX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuZmluZFBvb2xGb3JTdGFrZXIodmFsaWRhdG9ySWQ6IHVpbnQ2NCwgc3Rha2VyOiBieXRlcywgYW1vdW50VG9TdGFrZTogdWludDY0KSAtPiBieXRlczoKZmluZFBvb2xGb3JTdGFrZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODM1LTg0MAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBmaW5kUG9vbEZvclN0YWtlcigKICAgIC8vICAgdmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwKICAgIC8vICAgc3Rha2VyOiBBZGRyZXNzLAogICAgLy8gICBhbW91bnRUb1N0YWtlOiB1aW50NjQsCiAgICAvLyApOiBbVmFsaWRhdG9yUG9vbEtleSwgYm9vbGVhbiwgYm9vbGVhbl0gewogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NDEKICAgIC8vIGxldCBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gdHJ1ZQogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NDEtODQyCiAgICAvLyBsZXQgaXNOZXdTdGFrZXJUb1ZhbGlkYXRvciA9IHRydWUKICAgIC8vIGxldCBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSB0cnVlCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NTAKICAgIC8vIGNvbnN0IG1heFBlclBvb2wgPSB0aGlzLmdldEN1ck1heFN0YWtlUGVyUG9vbCh2YWxpZGF0b3JJZCkKICAgIGZyYW1lX2RpZyAtMwogICAgY2FsbHN1YiBnZXRDdXJNYXhTdGFrZVBlclBvb2wKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTEKICAgIC8vIHN0YWtlclBvb2xTZXQgPSBCb3hNYXA8QWRkcmVzcywgRml4ZWRBcnJheTxWYWxpZGF0b3JQb29sS2V5LCB0eXBlb2YgTUFYX1BPT0xTX1BFUl9TVEFLRVI+Pih7IGtleVByZWZpeDogJ3NwcycgfSkKICAgIGJ5dGVjIDUgLy8gInNwcyIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NTMKICAgIC8vIGlmICh0aGlzLnN0YWtlclBvb2xTZXQoc3Rha2VyKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgc3dhcAogICAgY292ZXIgMgogICAgYnogZmluZFBvb2xGb3JTdGFrZXJfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NAogICAgLy8gY29uc3QgcG9vbFNldCA9IGNsb25lKHRoaXMuc3Rha2VyUG9vbFNldChzdGFrZXIpLnZhbHVlKQogICAgZnJhbWVfZGlnIDEyCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODU1CiAgICAvLyBhc3NlcnQodmFsaWRhdG9ySWQgIT09IDApCiAgICBmcmFtZV9kaWcgLTMKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDYKCmZpbmRQb29sRm9yU3Rha2VyX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBwdXNoaW50IDYgLy8gNgogICAgPAogICAgYnogZmluZFBvb2xGb3JTdGFrZXJfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NTcKICAgIC8vIGVuc3VyZUJ1ZGdldCgzMDApCiAgICBwdXNoaW50IDMwMCAvLyAzMDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NTgKICAgIC8vIGlmIChwb29sU2V0W2ldLmlkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgNgogICAgcHVzaGludCAyNCAvLyAyNAogICAgKgogICAgZnJhbWVfZGlnIDQKICAgIHN3YXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDgKICAgIGJ6IGZpbmRQb29sRm9yU3Rha2VyX2Jsb2NrQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODYxCiAgICAvLyBpc05ld1N0YWtlclRvUHJvdG9jb2wgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NjIKICAgIC8vIGlmIChwb29sU2V0W2ldLmlkID09PSB2YWxpZGF0b3JJZCkgewogICAgZnJhbWVfZGlnIDgKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGJ6IGZpbmRQb29sRm9yU3Rha2VyX2Jsb2NrQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODY0CiAgICAvLyBpc05ld1N0YWtlclRvVmFsaWRhdG9yID0gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4NjYKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbcG9vbFNldFtpXS5wb29sSWQgLSAxXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODY2CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzW3Bvb2xTZXRbaV0ucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkICsgYW1vdW50VG9TdGFrZSA8PQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBzd2FwCiAgICBpbnRjIDQgLy8gMjY4CiAgICBpbnRjIDUgLy8gNDMyCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgaW50Y18yIC8vIDE4CiAgICAqCiAgICBpbnRjXzIgLy8gMTgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg2Ni04NjcKICAgIC8vIHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUucG9vbHNbcG9vbFNldFtpXS5wb29sSWQgLSAxXS50b3RhbEFsZ29TdGFrZWQgKyBhbW91bnRUb1N0YWtlIDw9CiAgICAvLyBtYXhQZXJQb29sCiAgICBmcmFtZV9kaWcgMTEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODY1LTg2OAogICAgLy8gaWYgKAogICAgLy8gICB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzW3Bvb2xTZXRbaV0ucG9vbElkIC0gMV0udG90YWxBbGdvU3Rha2VkICsgYW1vdW50VG9TdGFrZSA8PQogICAgLy8gICBtYXhQZXJQb29sCiAgICAvLyApIHsKICAgIGJ6IGZpbmRQb29sRm9yU3Rha2VyX2Jsb2NrQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODY5CiAgICAvLyByZXR1cm4gW3Bvb2xTZXRbaV0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyA2IC8vIDB4MDAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmZpbmRQb29sRm9yU3Rha2VyX2Jsb2NrQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg1NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHBvb2xTZXQubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2CiAgICBiIGZpbmRQb29sRm9yU3Rha2VyX3doaWxlX3RvcEAyCgpmaW5kUG9vbEZvclN0YWtlcl9hZnRlcl93aGlsZUAxMToKICAgIGZyYW1lX2RpZyAxMAogICAgZnJhbWVfYnVyeSAxMwogICAgZnJhbWVfZGlnIDkKICAgIGZyYW1lX2J1cnkgMTQKCmZpbmRQb29sRm9yU3Rha2VyX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICBmcmFtZV9kaWcgMTMKICAgIGZyYW1lX2J1cnkgMTAKICAgIGZyYW1lX2RpZyAxNAogICAgZnJhbWVfYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODc3CiAgICAvLyBhbW91bnRUb1N0YWtlID49IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1pbkVudHJ5U3Rha2UsCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3NwogICAgLy8gYW1vdW50VG9TdGFrZSA+PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5taW5FbnRyeVN0YWtlLAogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIGV4dHJhY3QgMCAyNDIKICAgIGludGMgMTIgLy8gMjA5CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg3Ni04NzkKICAgIC8vIGFzc2VydCgKICAgIC8vICAgYW1vdW50VG9TdGFrZSA+PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5taW5FbnRyeVN0YWtlLAogICAgLy8gICAnbXVzdCBzdGFrZSBhdCBsZWFzdCB0aGUgbWluaW11bSBmb3IgdGhpcyBwb29sJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBtdXN0IHN0YWtlIGF0IGxlYXN0IHRoZSBtaW5pbXVtIGZvciB0aGlzIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4ODMKICAgIC8vIGNvbnN0IGN1ck51bVBvb2xzID0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5zdGF0ZS5udW1Qb29scy5uYXRpdmUKICAgIGV4dHJhY3QgMjQyIDI2CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGN1ck51bVBvb2xzOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCmZpbmRQb29sRm9yU3Rha2VyX3doaWxlX3RvcEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4ODQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjdXJOdW1Qb29sczsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgNwogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIGJ6IGZpbmRQb29sRm9yU3Rha2VyX2FmdGVyX3doaWxlQDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODg1CiAgICAvLyBpZiAocG9vbHNbaV0udG90YWxBbGdvU3Rha2VkICsgYW1vdW50VG9TdGFrZSA8PSBtYXhQZXJQb29sKSB7CiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGZyYW1lX2RpZyA3CiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZnJhbWVfZGlnIDExCiAgICA8PQogICAgYnogZmluZFBvb2xGb3JTdGFrZXJfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4NwogICAgLy8geyBpZDogdmFsaWRhdG9ySWQsIHBvb2xJZDogaSArIDEsIHBvb2xBcHBJZDogcG9vbHNbaV0ucG9vbEFwcElkIH0sCiAgICBmcmFtZV9kaWcgNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjg4Ni04OTAKICAgIC8vIHJldHVybiBbCiAgICAvLyAgIHsgaWQ6IHZhbGlkYXRvcklkLCBwb29sSWQ6IGkgKyAxLCBwb29sQXBwSWQ6IHBvb2xzW2ldLnBvb2xBcHBJZCB9LAogICAgLy8gICBpc05ld1N0YWtlclRvVmFsaWRhdG9yLAogICAgLy8gICBpc05ld1N0YWtlclRvUHJvdG9jb2wsCiAgICAvLyBdCiAgICBieXRlYyA2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgOQogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfZGlnIDEwCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmZpbmRQb29sRm9yU3Rha2VyX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6ODg0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY3VyTnVtUG9vbHM7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDcKICAgIGIgZmluZFBvb2xGb3JTdGFrZXJfd2hpbGVfdG9wQDEzCgpmaW5kUG9vbEZvclN0YWtlcl9hZnRlcl93aGlsZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo4OTQKICAgIC8vIHJldHVybiBbeyBpZDogdmFsaWRhdG9ySWQsIHBvb2xJZDogMCwgcG9vbEFwcElkOiAwIH0sIGlzTmV3U3Rha2VyVG9WYWxpZGF0b3IsIGlzTmV3U3Rha2VyVG9Qcm90b2NvbF0KICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgOQogICAgc2V0Yml0CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfZGlnIDEwCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5Lm1vdmVQb29sVG9Ob2RlKHZhbGlkYXRvcklkOiB1aW50NjQsIHBvb2xBcHBJZDogdWludDY0LCBub2RlTnVtOiB1aW50NjQpIC0+IHZvaWQ6Cm1vdmVQb29sVG9Ob2RlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkwOAogICAgLy8gbW92ZVBvb2xUb05vZGUodmFsaWRhdG9ySWQ6IFZhbGlkYXRvcklkVHlwZSwgcG9vbEFwcElkOiB1aW50NjQsIG5vZGVOdW06IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MDkKICAgIC8vIHRoaXMuY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQpCiAgICBmcmFtZV9kaWcgLTMKICAgIGNhbGxzdWIgY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTEKICAgIC8vIGNvbnN0IG5vZGVQb29sQXNzaWdubWVudHMgPSBjbG9uZSh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTEKICAgIC8vIGNvbnN0IG5vZGVQb29sQXNzaWdubWVudHMgPSBjbG9uZSh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxMgogICAgLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG91dCBvZiBhbGxvd2FibGUgcmFuZ2UnKQogICAgZnJhbWVfZGlnIC0xCiAgICBieiBtb3ZlUG9vbFRvTm9kZV9ib29sX2ZhbHNlQDMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18zIC8vIDgKICAgIDw9CiAgICBieiBtb3ZlUG9vbFRvTm9kZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgptb3ZlUG9vbFRvTm9kZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTEyCiAgICAvLyBhc3NlcnQobm9kZU51bSA+PSAxICYmIG5vZGVOdW0gPD0gTUFYX05PREVTLCAnbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZScpCiAgICBhc3NlcnQgLy8gbm9kZSBudW1iZXIgb3V0IG9mIGFsbG93YWJsZSByYW5nZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxNAogICAgLy8gZm9yIChsZXQgc3JjTm9kZUlkeDogdWludDY0ID0gMDsgc3JjTm9kZUlkeCA8IE1BWF9OT0RFUzsgc3JjTm9kZUlkeCArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCgptb3ZlUG9vbFRvTm9kZV93aGlsZV90b3BANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MTQKICAgIC8vIGZvciAobGV0IHNyY05vZGVJZHg6IHVpbnQ2NCA9IDA7IHNyY05vZGVJZHggPCBNQVhfTk9ERVM7IHNyY05vZGVJZHggKz0gMSkgewogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMyAvLyA4CiAgICA8CiAgICBhc3NlcnQgLy8gY291bGRuJ3QgZmluZCBwb29sIGFwcCBpZCBpbiBub2RlcyB0byBtb3ZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTE1CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgTUFYX1BPT0xTX1BFUl9OT0RFOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCm1vdmVQb29sVG9Ob2RlX3doaWxlX3RvcEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxNQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IE1BWF9QT09MU19QRVJfTk9ERTsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgcHVzaGludCAzIC8vIDMKICAgIDwKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBieiBtb3ZlUG9vbFRvTm9kZV9hZnRlcl93aGlsZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxNgogICAgLy8gaWYgKG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbc3JjTm9kZUlkeF0ucG9vbEFwcElkc1tpXSA9PT0gcG9vbEFwcElkKSB7CiAgICBmcmFtZV9kaWcgNgogICAgaW50YyA4IC8vIDkwMAogICAgaW50YyA5IC8vIDE5MgogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMCAxOTIKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICAqCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgMjQKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieiBtb3ZlUG9vbFRvTm9kZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTE3CiAgICAvLyBhc3NlcnQobm9kZU51bSAtIDEgIT09IHNyY05vZGVJZHgsICJjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZSIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBmcmFtZV9kaWcgMwogICAgIT0KICAgIGFzc2VydCAvLyBjYW4ndCBtb3ZlIHRvIHNhbWUgbm9kZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxOQogICAgLy8gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzLm5vZGVzW3NyY05vZGVJZHhdLnBvb2xBcHBJZHNbaV0gPSAwCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgaW50YyA4IC8vIDkwMAogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGZyYW1lX2RpZyA0CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2RpZyA1CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTIyLTkyNAogICAgLy8gYWJpQ2FsbChTdGFraW5nUG9vbC5wcm90b3R5cGUuZ29PZmZsaW5lLCB7CiAgICAvLyAgIGFwcElkOiBBcHBsaWNhdGlvbihwb29sQXBwSWQpLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweDUxZWYzYjIxIC8vIG1ldGhvZCAiZ29PZmZsaW5lKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkyNwogICAgLy8gdGhpcy5hZGRQb29sVG9Ob2RlKHZhbGlkYXRvcklkLCBwb29sQXBwSWQsIG5vZGVOdW0pCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFkZFBvb2xUb05vZGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5MjgKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgptb3ZlUG9vbFRvTm9kZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjkxNQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IE1BWF9QT09MU19QRVJfTk9ERTsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiBtb3ZlUG9vbFRvTm9kZV93aGlsZV90b3BANwoKbW92ZVBvb2xUb05vZGVfYWZ0ZXJfd2hpbGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTE0CiAgICAvLyBmb3IgKGxldCBzcmNOb2RlSWR4OiB1aW50NjQgPSAwOyBzcmNOb2RlSWR4IDwgTUFYX05PREVTOyBzcmNOb2RlSWR4ICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIG1vdmVQb29sVG9Ob2RlX3doaWxlX3RvcEA1Cgptb3ZlUG9vbFRvTm9kZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBtb3ZlUG9vbFRvTm9kZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LmVtcHR5VG9rZW5SZXdhcmRzKHZhbGlkYXRvcklkOiB1aW50NjQsIHJlY2VpdmVyOiBieXRlcykgLT4gdWludDY0OgplbXB0eVRva2VuUmV3YXJkczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NDYKICAgIC8vIGVtcHR5VG9rZW5SZXdhcmRzKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUsIHJlY2VpdmVyOiBBZGRyZXNzKTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0NwogICAgLy8gdGhpcy5jYWxsZXJNdXN0QmVPd25lcih2YWxpZGF0b3JJZCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBjYWxsZXJNdXN0QmVPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk0OAogICAgLy8gY29uc3QgcmV3YXJkVG9rZW5JZCA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnJld2FyZFRva2VuSWQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwNwogICAgLy8gdmFsaWRhdG9yTGlzdCA9IEJveE1hcDxWYWxpZGF0b3JJZFR5cGUsIFZhbGlkYXRvckluZm8+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzAgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NDgKICAgIC8vIGNvbnN0IHJld2FyZFRva2VuSWQgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5yZXdhcmRUb2tlbklkCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZHVwCiAgICBleHRyYWN0IDAgMjQyCiAgICBkdXAKICAgIGV4dHJhY3QgMTUzIDgKICAgIHN3YXAKICAgIHB1c2hpbnQgMTUzIC8vIDE1MwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NDkKICAgIC8vIGNvbnN0IHJld2FyZFRva2VuSGVsZEJhY2sgPSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnN0YXRlLnJld2FyZFRva2VuSGVsZEJhY2sKICAgIGRpZyAyCiAgICBleHRyYWN0IDI0MiAyNgogICAgaW50Y18yIC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk1MAogICAgLy8gYXNzZXJ0KHJld2FyZFRva2VuSWQgIT09IDAsICJ0aGlzIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUgYSByZXdhcmQgdG9rZW4gZGVmaW5lZCIpCiAgICBkaWcgMQogICAgYXNzZXJ0IC8vIHRoaXMgdmFsaWRhdG9yIGRvZXNuJ3QgaGF2ZSBhIHJld2FyZCB0b2tlbiBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTUxCiAgICAvLyBjb25zdCBwb29sT25lQXBwSWQgPSBBcHBsaWNhdGlvbih0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLnBvb2xzWzBdLnBvb2xBcHBJZCkKICAgIHVuY292ZXIgMwogICAgaW50YyA0IC8vIDI2OAogICAgaW50YyA1IC8vIDQzMgogICAgZXh0cmFjdDMKICAgIGV4dHJhY3QgMCAxOCAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk1NAogICAgLy8gb3AuQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZShwb29sT25lQXBwSWQuYWRkcmVzcywgcmV3YXJkVG9rZW5JZClbMF0gLSByZXdhcmRUb2tlbkhlbGRCYWNrCiAgICBkdXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGRpZyAzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIHBvcAogICAgZGlnIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NTctOTYwCiAgICAvLyBhYmlDYWxsKFN0YWtpbmdQb29sLnByb3RvdHlwZS5wYXlUb2tlblJld2FyZCwgewogICAgLy8gICBhcHBJZDogcG9vbE9uZUFwcElkLAogICAgLy8gICBhcmdzOiBbcmVjZWl2ZXIsIHJld2FyZFRva2VuSWQsIHRva2VuUmV3YXJkQmFsXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTU5CiAgICAvLyBhcmdzOiBbcmVjZWl2ZXIsIHJld2FyZFRva2VuSWQsIHRva2VuUmV3YXJkQmFsXSwKICAgIGR1cAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk1Ny05NjAKICAgIC8vIGFiaUNhbGwoU3Rha2luZ1Bvb2wucHJvdG90eXBlLnBheVRva2VuUmV3YXJkLCB7CiAgICAvLyAgIGFwcElkOiBwb29sT25lQXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtyZWNlaXZlciwgcmV3YXJkVG9rZW5JZCwgdG9rZW5SZXdhcmRCYWxdLAogICAgLy8gfSkKICAgIGJ5dGVjIDE2IC8vIG1ldGhvZCAicGF5VG9rZW5SZXdhcmQoYWRkcmVzcyx1aW50NjQsdWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTYyCiAgICAvLyBvcC5Bc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKHBvb2xPbmVBcHBJZC5hZGRyZXNzLCByZXdhcmRUb2tlbklkKVswXSA9PT0gcmV3YXJkVG9rZW5IZWxkQmFjaywKICAgIHN3YXAKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NjEtOTY0CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIG9wLkFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UocG9vbE9uZUFwcElkLmFkZHJlc3MsIHJld2FyZFRva2VuSWQpWzBdID09PSByZXdhcmRUb2tlbkhlbGRCYWNrLAogICAgLy8gICAnYmFsYW5jZSBvZiByZW1haW5pbmcgcmV3YXJkIHRva2VucyBzaG91bGQgbWF0Y2ggdGhlIGhlbGQgYmFjayBhbW91bnQnLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGJhbGFuY2Ugb2YgcmVtYWluaW5nIHJld2FyZCB0b2tlbnMgc2hvdWxkIG1hdGNoIHRoZSBoZWxkIGJhY2sgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTY1CiAgICAvLyByZXR1cm4gdG9rZW5SZXdhcmRCYWwKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuY2FsbGVyTXVzdEJlT3duZXIodmFsaWRhdG9ySWQ6IHVpbnQ2NCkgLT4gdm9pZDoKY2FsbGVyTXVzdEJlT3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTcyCiAgICAvLyBwcml2YXRlIGNhbGxlck11c3RCZU93bmVyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk3NAogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlLAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk3NAogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlLAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgOCAzMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5NzMtOTc2CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSwKICAgIC8vICAgJ2NhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXInLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGJlIGNhbGxlZCBieSB2YWxpZGF0b3Igb3duZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXIodmFsaWRhdG9ySWQ6IHVpbnQ2NCkgLT4gdm9pZDoKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTc5CiAgICAvLyBwcml2YXRlIGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyKHZhbGlkYXRvcklkOiBWYWxpZGF0b3JJZFR5cGUpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk4MQogICAgLy8gVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlIHx8CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5ODEKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSB8fAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGV4dHJhY3QgMCAyNDIKICAgIGV4dHJhY3QgOCAzMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5ODEtOTgyCiAgICAvLyBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5vd25lci5uYXRpdmUgfHwKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlci5uYXRpdmUsCiAgICBibnogY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXJfYm9vbF90cnVlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo5ODIKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm1hbmFnZXIubmF0aXZlLAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgMjQyCiAgICBleHRyYWN0IDQwIDMyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk4MS05ODIKICAgIC8vIFR4bi5zZW5kZXIgPT09IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLm93bmVyLm5hdGl2ZSB8fAogICAgLy8gICBUeG4uc2VuZGVyID09PSB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLmNvbmZpZy5tYW5hZ2VyLm5hdGl2ZSwKICAgIGJ6IGNhbGxlck11c3RCZU93bmVyT3JNYW5hZ2VyX2Jvb2xfZmFsc2VAMwoKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXJfYm9vbF90cnVlQDI6CiAgICBpbnRjXzEgLy8gMQoKY2FsbGVyTXVzdEJlT3duZXJPck1hbmFnZXJfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk4MC05ODQKICAgIC8vIGFzc2VydCgKICAgIC8vICAgVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcub3duZXIubmF0aXZlIHx8CiAgICAvLyAgICAgVHhuLnNlbmRlciA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5jb25maWcubWFuYWdlci5uYXRpdmUsCiAgICAvLyAgICdjYW4gb25seSBiZSBjYWxsZWQgYnkgb3duZXIgb3IgbWFuYWdlciBvZiB2YWxpZGF0b3InLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBvd25lciBvciBtYW5hZ2VyIG9mIHZhbGlkYXRvcgogICAgcmV0c3ViCgpjYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcl9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBjYWxsZXJNdXN0QmVPd25lck9yTWFuYWdlcl9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OlZhbGlkYXRvclJlZ2lzdHJ5LnZlcmlmeVBvb2xLZXlDYWxsZXIocG9vbEtleTogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlQb29sS2V5Q2FsbGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5MgogICAgLy8gcHJpdmF0ZSB2ZXJpZnlQb29sS2V5Q2FsbGVyKHBvb2xLZXk6IFZhbGlkYXRvclBvb2xLZXkpOiB2b2lkIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5MwogICAgLy8gYXNzZXJ0KHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS5leGlzdHMsICJ0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZCBpc24ndCB2YWxpZCIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTA3CiAgICAvLyB2YWxpZGF0b3JMaXN0ID0gQm94TWFwPFZhbGlkYXRvcklkVHlwZSwgVmFsaWRhdG9ySW5mbz4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMCAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTkzCiAgICAvLyBhc3NlcnQodGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLmV4aXN0cywgInRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkIikKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkIGlzbid0IHZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTk0CiAgICAvLyBhc3NlcnQocG9vbEtleS5wb29sSWQgPD0gTUFYX1BPT0xTLCAncG9vbCBpZCBub3QgaW4gdmFsaWQgcmFuZ2UnKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cG4gMgogICAgcHVzaGludCAyNCAvLyAyNAogICAgPD0KICAgIGFzc2VydCAvLyBwb29sIGlkIG5vdCBpbiB2YWxpZCByYW5nZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjk5NgogICAgLy8gcG9vbEtleS5wb29sSWQgPiAwICYmIHBvb2xLZXkucG9vbElkIDw9IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5zdGF0ZS5udW1Qb29scy5uYXRpdmUsCiAgICBieiB2ZXJpZnlQb29sS2V5Q2FsbGVyX2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDI0MiAyNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgPj0KICAgIGJ6IHZlcmlmeVBvb2xLZXlDYWxsZXJfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKdmVyaWZ5UG9vbEtleUNhbGxlcl9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6OTk1LTk5OAogICAgLy8gYXNzZXJ0KAogICAgLy8gICBwb29sS2V5LnBvb2xJZCA+IDAgJiYgcG9vbEtleS5wb29sSWQgPD0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnN0YXRlLm51bVBvb2xzLm5hdGl2ZSwKICAgIC8vICAgJ3Bvb2wgaWQgb3V0c2lkZSBvZiByYW5nZSBvZiBwb29scyBjcmVhdGVkIGZvciB0aGlzIHZhbGlkYXRvcicsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gcG9vbCBpZCBvdXRzaWRlIG9mIHJhbmdlIG9mIHBvb2xzIGNyZWF0ZWQgZm9yIHRoaXMgdmFsaWRhdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAwMgogICAgLy8gcG9vbEtleS5wb29sQXBwSWQgPT09IHRoaXMudmFsaWRhdG9yTGlzdChwb29sS2V5LmlkKS52YWx1ZS5wb29sc1twb29sS2V5LnBvb2xJZCAtIDFdLnBvb2xBcHBJZCwKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIHN3YXAKICAgIGludGMgNCAvLyAyNjgKICAgIGludGMgNSAvLyA0MzIKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMTgKICAgICoKICAgIGludGNfMiAvLyAxOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMDEtMTAwNAogICAgLy8gYXNzZXJ0KAogICAgLy8gICBwb29sS2V5LnBvb2xBcHBJZCA9PT0gdGhpcy52YWxpZGF0b3JMaXN0KHBvb2xLZXkuaWQpLnZhbHVlLnBvb2xzW3Bvb2xLZXkucG9vbElkIC0gMV0ucG9vbEFwcElkLAogICAgLy8gICAiVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcyIsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gVGhlIHBhc3NlZCBpbiBhcHAgaWQgZG9lc24ndCBtYXRjaCB0aGUgcGFzc2VkIGluIGlkcwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEwMDYKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBBcHBsaWNhdGlvbihwb29sS2V5LnBvb2xBcHBJZCkuYWRkcmVzcykKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTAwOAogICAgLy8gYXNzZXJ0KHBvb2xLZXkuaWQgPT09IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCwgQnl0ZXMoJ3ZhbGlkYXRvcklkJykpWzBdKQogICAgZHVwCiAgICBwdXNoYnl0ZXMgInZhbGlkYXRvcklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgZnJhbWVfZGlnIDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDA5CiAgICAvLyBhc3NlcnQocG9vbEtleS5wb29sSWQgPT09IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChwb29sS2V5LnBvb2xBcHBJZCwgQnl0ZXMoJ3Bvb2xJZCcpKVswXSkKICAgIHB1c2hieXRlcyAicG9vbElkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgPT0KICAgIGFzc2VydAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdmVyaWZ5UG9vbEtleUNhbGxlcl9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiB2ZXJpZnlQb29sS2V5Q2FsbGVyX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZDogdWludDY0LCBwb29sQXBwSWQ6IHVpbnQ2NCwgbm9kZU51bTogdWludDY0KSAtPiB2b2lkOgphZGRQb29sVG9Ob2RlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODgKICAgIC8vIHByaXZhdGUgYWRkUG9vbFRvTm9kZSh2YWxpZGF0b3JJZDogVmFsaWRhdG9ySWRUeXBlLCBwb29sQXBwSWQ6IHVpbnQ2NCwgbm9kZU51bTogdWludDY0KSB7CiAgICBwcm90byAzIDAKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExODkKICAgIC8vIGNvbnN0IG5vZGVQb29sQXNzaWdubWVudHMgPSBjbG9uZSh0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMDcKICAgIC8vIHZhbGlkYXRvckxpc3QgPSBCb3hNYXA8VmFsaWRhdG9ySWRUeXBlLCBWYWxpZGF0b3JJbmZvPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18wIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTg5CiAgICAvLyBjb25zdCBub2RlUG9vbEFzc2lnbm1lbnRzID0gY2xvbmUodGhpcy52YWxpZGF0b3JMaXN0KHZhbGlkYXRvcklkKS52YWx1ZS5ub2RlUG9vbEFzc2lnbm1lbnRzKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5MAogICAgLy8gY29uc3QgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnBvb2xzUGVyTm9kZQogICAgZXh0cmFjdCAwIDI0MgogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTIKICAgIC8vIGFzc2VydChub2RlTnVtID49IDEgJiYgbm9kZU51bSA8PSBNQVhfTk9ERVMsICdub2RlIG51bWJlciBub3QgaW4gdmFsaWQgcmFuZ2UnKQogICAgZnJhbWVfZGlnIC0xCiAgICBieiBhZGRQb29sVG9Ob2RlX2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGJ6IGFkZFBvb2xUb05vZGVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKYWRkUG9vbFRvTm9kZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5MgogICAgLy8gYXNzZXJ0KG5vZGVOdW0gPj0gMSAmJiBub2RlTnVtIDw9IE1BWF9OT0RFUywgJ25vZGUgbnVtYmVyIG5vdCBpbiB2YWxpZCByYW5nZScpCiAgICBhc3NlcnQgLy8gbm9kZSBudW1iZXIgbm90IGluIHZhbGlkIHJhbmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3IubmF0aXZlOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKCmFkZFBvb2xUb05vZGVfd2hpbGVfdG9wQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3IubmF0aXZlOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5MAogICAgLy8gY29uc3QgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvciA9IHRoaXMudmFsaWRhdG9yTGlzdCh2YWxpZGF0b3JJZCkudmFsdWUuY29uZmlnLnBvb2xzUGVyTm9kZQogICAgcHVzaGludCAyMjUgLy8gMjI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IG1heFBvb2xzUGVyTm9kZUZvclRoaXNWYWxpZGF0b3IubmF0aXZlOyBpICs9IDEpIHsKICAgIGdldGJ5dGUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPAogICAgYXNzZXJ0IC8vIG5vIGF2YWlsYWJsZSBzcGFjZSBpbiBzcGVjaWZpZWQgbm9kZSBmb3IgdGhpcyBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTE5NQogICAgLy8gaWYgKG5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPT09IDApIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGZyYW1lX2RpZyA0CiAgICBpbnRjIDggLy8gOTAwCiAgICBpbnRjIDkgLy8gMTkyCiAgICBleHRyYWN0MwogICAgZXh0cmFjdCAwIDE5MgogICAgc3dhcAogICAgcHVzaGludCAyNCAvLyAyNAogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAwIDI0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogYWRkUG9vbFRvTm9kZV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk3CiAgICAvLyB0aGlzLnZhbGlkYXRvckxpc3QodmFsaWRhdG9ySWQpLnZhbHVlLm5vZGVQb29sQXNzaWdubWVudHMubm9kZXNbbm9kZU51bSAtIDFdLnBvb2xBcHBJZHNbaV0gPSBwb29sQXBwSWQKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgaW50YyA4IC8vIDkwMAogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGZyYW1lX2RpZyAyCiAgICBwdXNoaW50IDMgLy8gMwogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9kaWcgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjExOTgKICAgIC8vIHJldHVybgogICAgcmV0c3ViCgphZGRQb29sVG9Ob2RlX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMTk0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbWF4UG9vbHNQZXJOb2RlRm9yVGhpc1ZhbGlkYXRvci5uYXRpdmU7IGkgKz0gMSkgewogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgYWRkUG9vbFRvTm9kZV93aGlsZV90b3BANQoKYWRkUG9vbFRvTm9kZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhZGRQb29sVG9Ob2RlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkuaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0KG5mZEFwcElEOiB1aW50NjQsIGFkZHJUb0ZpbmQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzEzCiAgICAvLyBwcml2YXRlIGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdChuZmRBcHBJRDogdWludDY0LCBhZGRyVG9GaW5kOiBBZGRyZXNzKTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMxNC0xMzE5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBBcHBsaWNhdGlvbihuZmRBcHBJRCksCiAgICAvLyAgICAgYXBwQXJnczogW0J5dGVzKCdyZWFkX3Byb3BlcnR5JyksIEJ5dGVzKCd2LmNhQWxnby4wLmFzJyldLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzE3CiAgICAvLyBhcHBBcmdzOiBbQnl0ZXMoJ3JlYWRfcHJvcGVydHknKSwgQnl0ZXMoJ3YuY2FBbGdvLjAuYXMnKV0sCiAgICBwdXNoYnl0ZXMgInJlYWRfcHJvcGVydHkiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzICJ2LmNhQWxnby4wLmFzIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMxNC0xMzE4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBBcHBsaWNhdGlvbihuZmRBcHBJRCksCiAgICAvLyAgICAgYXBwQXJnczogW0J5dGVzKCdyZWFkX3Byb3BlcnR5JyksIEJ5dGVzKCd2LmNhQWxnby4wLmFzJyldLAogICAgLy8gICB9KQogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMTQtMTMxOQogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogQXBwbGljYXRpb24obmZkQXBwSUQpLAogICAgLy8gICAgIGFwcEFyZ3M6IFtCeXRlcygncmVhZF9wcm9wZXJ0eScpLCBCeXRlcygndi5jYUFsZ28uMC5hcycpXSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjAKICAgIC8vIGNvbnN0IGNhQWxnb0RhdGEgPSBvcC5JVHhuLmxhc3RMb2cKICAgIGl0eG4gTGFzdExvZwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjYUFsZ29EYXRhLmxlbmd0aDsgaSArPSAzMikgewogICAgaW50Y18wIC8vIDAKCmlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdF93aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzIxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY2FBbGdvRGF0YS5sZW5ndGg7IGkgKz0gMzIpIHsKICAgIGZyYW1lX2RpZyAxCiAgICBsZW4KICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICBieiBpc0FkZHJlc3NJbk5GRENBQWxnb0xpc3RfYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzMjIKICAgIC8vIGNvbnN0IGFkZHIgPSBvcC5leHRyYWN0KGNhQWxnb0RhdGEsIGksIDMyKQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzIzCiAgICAvLyBpZiAoYWRkciAhPT0gZW5jb2RlQXJjNChHbG9iYWwuemVyb0FkZHJlc3MpICYmIGFkZHIgPT09IGVuY29kZUFyYzQoYWRkclRvRmluZCkpIHsKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGlzQWRkcmVzc0luTkZEQ0FBbGdvTGlzdF9hZnRlcl9pZl9lbHNlQDYKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBpc0FkZHJlc3NJbk5GRENBQWxnb0xpc3RfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTMyNAogICAgLy8gcmV0dXJuIHRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzIxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY2FBbGdvRGF0YS5sZW5ndGg7IGkgKz0gMzIpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgaXNBZGRyZXNzSW5ORkRDQUFsZ29MaXN0X3doaWxlX3RvcEAyCgppc0FkZHJlc3NJbk5GRENBQWxnb0xpc3RfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czoxMzI3CiAgICAvLyByZXR1cm4gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXRpX3Byb2QvdmFsaWRhdG9yUmVnaXN0cnkuYWxnby50czo6VmFsaWRhdG9yUmVnaXN0cnkubWF4QWxsb3dlZFN0YWtlKCkgLT4gdWludDY0OgptYXhBbGxvd2VkU3Rha2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV0aV9wcm9kL3ZhbGlkYXRvclJlZ2lzdHJ5LmFsZ28udHM6MTM1OQogICAgLy8gcmV0dXJuIG9wLm9ubGluZVN0YWtlKCkKICAgIG9ubGluZV9zdGFrZQogICAgLy8gc21hcnRfY29udHJhY3RzL3JldGlfcHJvZC92YWxpZGF0b3JSZWdpc3RyeS5hbGdvLnRzOjEzNDgKICAgIC8vIHJldHVybiB3aWRlUmF0aW8oW29ubGluZSwgTUFYX1ZBTElEQVRPUl9IQVJEX1BDVF9PRl9PTkxJTkVfMURFQ0lNQUxdLCBbMTAwMF0pCiAgICBpdG9iCiAgICBieXRlYyAxMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGludCAxNTAgLy8gMTUwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDE1IC8vIDB4MDAwMTAwMDAwMDAwMDAwMDAzZTgKICAgIGNhbGxzdWIgd2lkZVJhdGlvCiAgICBwb3BuIDIKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyASAAESCIwCsAPIAbwFhAfAAcCEPeIB0QGAIJYC/AH0wgQAJhIBdgQVH3x1AAZzdGFrZWQKbnVtU3Rha2VycwNzcHMBABlwb29sVGVtcGxhdGVBcHByb3ZhbEJ5dGVzBG51bVYJaS5vd25lci5hBGluaXQCAAICAAADBoEBEAAAAAAAAAAAAAAAAAAAAAEKAAEAAAAAAAAD6ARj8/KLBBL0vUsxG0EA9YIiBLhEezYEG16CxgR5Ry2DBF96z9kEMXLKnQSKhxQtBNE2bMMEOwRcXAR1r/YdBB8vAQkEL6IsSwSRDpSsBFcnZ9EEm1BKrwT7xjF4BCRJjPQE+EbdegSDBQUBBHu7bI0E+DlBSgQMMXz7BD4oiXIE3V+q2gQYqsenBPme9U0EEICdTQTneN1aBL9SWdAETfjYbgRBj878BKLcUbUEKHP1BAQFR/T+BMtmg1g2GgCOIgMBAvEC2wLPAsYClgKGAnUCYQJNAjkCJQIMAfkB5AHLAbgBpAGQAYABXAFJATEBFwEEAOMAwQCfAIsAbABNADIAGgACIkMxGRREMRhENhoBFzYaAogSXhYpTFCwI0MxGRREMRhENhoBFzYaAhc2GgMXiBGTI0MxGRREMRhENhoBFzYaAjYaAxeIEEkpTFCwI0MxGRREMRhENhoBNhoCNhoDFzYaBBc2GgUiU4gNqCNDMRkURDEYRDYaATYaAhc2GgMXNhoEFzYaBReIDKsjQzEZFEQxGEQ2GgEXiAuHKUxQsCNDMRkURDEYRDEWIwlJOBAjEkQ2GgEXNhoCF4gIGilMULAjQzEZFEQxGEQxFiMJSTgQIxJENhoBFzYaAheIBxIpTFCwI0MxGRREMRhENhoBFzYaAjYaAzYaBDYaBRc2GgYXiAacI0MxGRREMRhENhoBFzYaAogGbiNDMRkURDEYRDYaARc2GgIXNhoDVwIAiAY0I0MxGRREMRhENhoBFzYaAhc2GgMXiAX7I0MxGRREMRhENhoBFzYaAogFziNDMRkURDEYRDEWIwlJOBAjEkQ2GgFXAgA2GgKIBJ0WKUxQsCNDMRkURDEYRCERFilMULAjQzEZFEQxGEQ2GgEXiARiKUxQsCNDMRkURDEYRDYaAReIBD0pTFCwI0MxGRREMRhENhoBiAPAKUxQsCNDMRkURDEYRDYaAYgDoCcGIk8CVClMULAjQzEZFEQxGEQ2GgEXiANNFilMULAjQzEZFEQxGEQ2GgGIAxopTFCwI0MxGRREMRhENhoBFzYaAheIAsgWKUxQsCNDMRkURDEYRDYaAReIAmYpTFCwI0MxGRREMRhENhoBF4gCOilMULAjQzEZFEQxGEQ2GgEXiAIXKUxQsCNDMRkURDEYRDYaAReIAfQpTFCwI0MxGRREMRhEiAHeFilMULAjQzEZFEQxGESIAXUpTFCwI0MxGRREMRhEgCQVH3x1AAAAAAAGwhQAAAAAAA6zrAAAAAAAT7tUAAAAAAABIXSwI0MxGRREMRhEI0MxGRREMRhEiAEnI0MxGRREMRhENhoBFzYaAlcCAIgA/yNDMRkURDEYRDYaAReIAOUjQzEZFEQxGBREiADII0OKAgCL/oEKCIsAMgwNQQAqsYEGshCBBbIZJw2yHicNsh+L/40CAAsABLNC/9syALIBQv/1IrIBQv/viYoCAyIqSScOi/4iWSKLBYsEDEEAJIv+VwIAiwVJTgIlC1sWiwOjSRWBEA5EgRCvq4wDIwiMBUL/1CcOjACL/yJZjAEijAKLAosBDEEAJIv/VwIAiwJJTgIlC1sWiwCjSRWBEA5EgRCvq4wAIwiMAkL/1IsDiwCiSRUlDkQlr6sXi/6L/4wCjAGMAIknCiJnJwgiZycEImcrImeJigEAJweL/7lIiYoCACInCmVEFEQnB4v+i/+7iScKI2eJMhaIEIF1FicLTFCBZBZQJw+I/zBGAk8CFoAoAAAAAAAAAAEAAAAAAA9CQAAAAAAAAAAAAAAAAAAPQkAAAAAAAA9CQExQTwIWUEwWUCUWUIEDFlAhBhZQiSInCGVEiYoBAYv/FihMUL5EVwDyiYoBAYv/FihMUL5EV/IaiYoBAYv/FihMUL5EVwDySVcIIExXKCBQiYoBASInDIv/FihMUL5EIosDgRgMQQAxiwIhBCEFWIsDJAskWEmMACJbQQAciwFJiwBQTCJZIwgWVwYCXACMAYsDIwiMA0L/x4sBjACJigIBi/9BAC6L/hYoTFC9RQFEi/+BGA5BABwjRIv+FihMUL5Ei/8jCUwhBCEFWEwkCyRYIluJIkL/4YoBAYv/IlsWKExQvkSL/yVbIwlMIQQhBVhMJAskWImKAQEqi/8WKExQSb5EV/IaIlmIDzdMCky+RFcA8oHZAVtJQAAEMhaMAosCSYwAiwENQQAEiwGMAImKAQEnBYv/UL1FARSJigEBIkcDKicFi/9QSb1FAUAABScMjACJJwyMAosFvkyMAUQijASLBIEGDEEAN4sEgRgLiwFMgRhYSYwAIluLAowDQQATiwJJiwBQTCJZIwgWVwYCXACMA4sDjAKLBCMIjARC/8GLAowAiYoBAYv/FihMUL5EIQchBliJigEBi/8WKExQSb1FAUS+SCEIIQlYiYoDASIqRwSL/1cIIEcCMgMTRIv/VyggSU4CMgMTRDEAEkSL/4FQVYEEDkEA4SNEi/+BqQFaSYwBQQDPiwEhCg5BAMcjRIv/ga0BWkmMAiEKDkEAsiNEiwJBAAmL/1exIDIDE0SL/yEMWyEKD0SL/4HhAVVJjANBAImLA4EDDkEAgSNEi/8hC1tJjAVBAAaLBTIHDUSL/TgHMgoSi/04CIGUhBsSEESL/TgBgYCt4gQNRCInCGVEIwhJjAQnCEsBZxZJjAAoSwFQSYHECLlISSKL/7siTwK7i/+BSFtJjAVBAAoxAIsFJwllSBJEiwCLBlCLB1CABKjdIctMULCLBIwAiSJC/3wiQv9LIkL/NiJC/xyKAgCL/ogLq4v/MgMTRIv+FihMUIEoi/+7iYoDAIv9iAuRi/0WKExQi/4WSwEhC08Cu4v/FoHqAUy7iYoDAIv9iAtwMQCL/icJZUgSRIv9FihMUIv+FoFITLuJigIAi/6IC1CL/zIDE0SL/hYoTFCBsQGL/7uJigYAi/qICzWL+xdJgQQMQQA7I0SLACMSQQAGi/wyAxNEi/oWKExQSYFQi/u7SYFRi/y7SYFxi/27i/4WSwGBkQFPAruL/xaBoQFMu4kiQv/CigMBi/6ICvqL/TgHMgoSi/04CIGs5zoSEESL/hYoSwFQSb1FAURJvkhJV/IaIllJgRgPFEQjCLEnByIhDbonB71IIQ0JJwchDU8CujIIFksDFk8FVwDyIQxbFoAEWekKprIaTwKyGksGshpLAbIashqBA7I4gQOyNYELsjSABAuBAUOyQk8CskBMskAishmBBrIQIrIBs0mTgRAORElXBgJLA4HyAUsCu7Q9TwMjCUsBFksBgRgMREwkCyEECE8FTEsCu4v+TwKL/4gK6EsDTwJQTFCABPvMD2tMULC0PU4CUEwWUImKAwEiRwYqRw+L/hZJKExQRwK9RQFEvkhXAPIhC1tBAA6LGL5EVwDyIQtbMgcNRDEASYwEi/04AEmMBhKL/TgHMgoSEESLGL5EVwDygVBVSYwTQQDlMQCMBYsYvkyMAESLEyMSSYwUQAAQixOBAhJAAAiLE4EDEkEAIov/RIsYvkRXAPKBkQFbSYwHQAADI4wHiweLBYv/cABIDkSLFEEAD4v/cQtEiwBXAPJXUSASRIsTgQISQQAnIowKIowPiw+BBAxBABaLAFcA8ldxIIsPJQtbi/8SQQJpI4wKiwpEixOBAxJBABOLAFcA8ldxICJbi/9xC0SIClREixOBBBJBADiL/ycJZUiLBRJAAAqL/4sFiAo4QQImI0SL/4ANaS5wYXJlbnRBcHBJRGVIF4sAVwDyV3EgIlsSRIv9OAhJjBEijBCLBIj7WkyMEkEAFSEQjBCLESEQCYwSJwWLBFCBkAG5SIsYvkRX8hqBCluLEklOAgiICj8MRIv+iwRJTgNPAogGNklXABhJTgKMAkkhCVOMDoHBAVOMDSVbSYwWFBREJwVMUEmMGEm9RQFEvkiMAyKMCCKMC4sYvUUBRIsLgQYMQQFkiwuBGAuLA0yBGFhJjAEiW0mMFYsCIlsSQQAYiwElW4sWEkEADosBgRBbiwKBEFsSQAAkiwhJjAlAAA+LCIwJixVAAAaLCyMIjAmLCYwIiwsjCIwLQv+biwIiWxYoTFBJjBhJvkSLFiMJTCEEIQVYSwEkC0xLASRYIluxixGLEAlJTgKMDElyCESyB0yyCCOyECKyAbaABPnHDL2yGosGshpJshiBBrIQIrIBs7cBPlcABCkSRIH0AyKI97dJJwRlTwIrZU8CRERMFkmTgRAORFcGAk8DgRgMREsCgZQCCEsETE8CuxZMIQ4ITLuLDkEAE4sYSb5EV/IagQJbIwgWgfQBTLuLDUEACyInBGVEIwgnBExnixhJvkRX8hqBCluLDElOAggWTwIhD08CuyIrZUQIK0xnixYWSZOBEA5EVwYCiwJJTgKBEFuLF08CUEwWUIsEUIsSFlCABJYrQUNMULCMAImLCEkUFEQjCYEYC4sYTIsCu0L+3yJC/deLDyMIjA9C/XOKAQEqRwSL/xYoTFBJvkQhBCEFWFcAEiJbRwJEMQBMcghEE0EADIsFvkQhByEGWIwAiTIGjAGLBb5EIQchBlghCVtJjANBAFCLBoAKbGFzdFBheW91dGVIiwMSQQAMiwW+RCEHIQZYjACJiwW+RFcA8oGpAVqLAUlOAksBGE8CTAmLA0lPAxgJEkEADIsFvkQhByEGWIwAiYsBFosFSU4CgfwGTwK7vkhX8hpJIlmMAIEKW4wEIowCiwKLAAxBAEiLBUm+RCEEIQVYiwJJTgIkCyRYgQpbFicLTFAhChZQiwQWgAIAAUxQiPY+RgIWSwGBGAxESwElCyEHCE8DTE8CuyMIjAJC/7CLBb5EIQchBliMAImKBQAii/uIBeVJjPsiWxZJKExQRwK+RIv7JVtJTgMjCUwhBCEFWEsBJAtMSwEkWIEKW4v8CBZPAoEYDERMIQ4ISwJMTwK7Sb5IV/IagQpbi/wIFksBIQ9PArtJvkhX8hokW4v9CBZLAYGEAk8CuyIrZUSL/AgrTGe+SFcA8kmBSFtJQQAmiwUnCWVISYwAiwRXCCATQQAUiwRXKCCLABNBAAkiFosCgUhPAruLAxZJk4EQDkRXBgKL+4EQW4sBTwJQTBZQi/4WUIv/FlCL/BZQi/0WUIAEs+R8PUxQsImKBQAiRwUqRwyBrAIiiPTsi/uIBPuM+4v9QAAFi/5BAlkjRIv7IlsWSYwEKExQSYwCSb5Ei/slW0mMEiMJTCEEIQVYSwEkC0mMBkxLASRYgQpbi/0JFk8CgRgMREwhDghLAkxPArtJvkhX8hqBCluL/QkWIQ9MuyIrZUSL/QkrTGeL/kEBxIsCSb5ESVcA8klXmQiMAYGZAVtJjA5EV/IaJFtJi/4PRIv+CRaBhAJMu4sSIxNBACqxiwK+RCEEIQVYVwASIluL/hYnELIai/yyGosBshqyGrIYgQayECKyAbOLEhZJk4EQDkRXBgKL+4EQW4sETwJQTBZQi/xQi/0WUIv+FlCLDhZQJxFMULCL/0EBNosCSb5EIQQhBViLBklOAiRYJVkjCRZJk4EQDkRXBgJMgZQCCEy7i/uBEFuLEhaLBExQTBZQjPsijAwijAsijAgnBYv8UEmMA75MjAVEIowKiwO9RQFEiwqBBgxBAJeLCoEYC0mMB4sFTIEYWEmMACJbSYwRQQBsiwsjCIwLi/siW4sREkmMEIsIjAmLDIwNQQBJixBBAFWLACVbi/slWxJBAEmLAIEQW4v7gRBbEkEAOyOMCIsDiweAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALuLCIwJiwyMDYsJjAiLDYwMiwojCIwKQv9kiwwjCIwMQv/eiwhEiwwUiwsUJwYiTwNUI08CVEkiU0wjU4wPQQATiwJJvkRX8hqBAlsjCRaB9AFMu4sPQQALIicEZUQjCScETGeJixIWSZOBEA5EVwYCi/uBEFuLBE8CUEwWUIv8UIv9FlAiFkxLAVBMUCcRTFCwQv6UIkL9pIoDASJHBCpHAyNHA4v9iPSeTgInBYv+UElOA71FAUxOAkEAfosMvkyMBESL/UQijAaLBoEGDEEAYYGsAiKI8j6LBoEYC4sETIEYWEmMASJbSYwIQQA7IowKiwiL/RJBADAijAmL/RYoTFC+RIsBJVsjCUwhBCEFWEwkCyRYgQpbi/8IiwsOQQAIiwEnBlCMAImLBiMIjAZC/5eLCowNiwmMDosNjAqLDowJi/0WSYwDKExQvkxJTgKMAERJVwDyIQxbi/8ORFfyGiJZjAUijAeLB4sFDEEARIsAIQQhBViLByQLJFhJjAKBCluL/wiLCw5BAB+LByMIiwIiW0wWiwNMUEwWUCcGIosJVCOLClRQjACJiwcjCIwHQv+0IhaLA0sBUExQJwYiiwlUI4sKVFCMAImKAwAqRwSL/YgBI4v9FihMUEm+RIv/QQCRi/8lDkEAiiNEIowDiwMlDEQijAKLAoEDDEmMBEEAaYsGIQghCVhXAMCLA4EYC0mMAIEYWFcAGIsCJQtJjAFbi/4SQQA6i/8jCYsDE0QiFiEIiwAIiwREiwEIiwVMTwK7sYAEUe87IbIai/6yGIEGshAisgGzi/2L/ov/iAFKiYsCIwiMAkL/jIsDIwiMA0L/eyJC/3OKAgGL/ogAYov+FihMUL5ESVcA8klXmQhMgZkBW0sCV/IaJFtLAURPAyEEIQVYVwASIltJcghESwNwAEhLAgmxSRYnELIai/+yGk8FshqyGksBshiBBrIQIrIBs0xyCERPA3AASE8CEkSJigEAMQCL/xYoTFC+RFcA8lcIIBJEiYoBADEAi/8WKExQSU4CvkRXAPJXCCASQAAQMQCLAL5EVwDyVyggEkEAAyNEiSJC//qKAQGL/yJbSRYoTFBJvUUBRIv/JVtHAoEYDkRBAGCLAb5EV/IaIlmLAg9BAFEjRIv/gRBbiwG+RIsCSU4DIwlMIQQhBVhMJAskWCJbSwESRDEASwFyCEQSREmAC3ZhbGlkYXRvcklkZUiLABJEgAZwb29sSWRlSBJEi/+MAIkiQv+sigMAKkcCi/0WKExQSb5MSU8CRFcA8ov/QQBfi/8lDkEAWCNEIowCiwWB4QFViwJJTwIMRIv/IwmLBCEIIQlYVwDATIEYC0mMAIEYWFcAGEwlC0mMAVtAABiL/hYhCIsACIsCgQMMRIsBCIsDTE8Cu4mLAiMIjAJC/60iQv+ligIBIrGADXJlYWRfcHJvcGVydHmyGoANdi5jYUFsZ28uMC5hc7Iai/6yGIEGshAisgGztD4iiwEViwINQQAmiwGLAoEgWEmMADIDE0EADIsAi/8SQQAEI4wAiYsCgSAIjAJC/9EijACJdRYnC0xQgZYBFlAnD4jurkYCiQ==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 0, "patch": 0 } }, "events": [ { "name": "retiOP_addedValidator", "args": [ { "type": "uint64", "name": "id" }, { "type": "address", "name": "owner" }, { "type": "address", "name": "manager" } ] }, { "name": "retiOP_validatorAddedPool", "args": [ { "type": "uint64", "name": "id" }, { "type": "uint16", "name": "num" }, { "type": "uint64", "name": "poolAppId" } ] }, { "name": "retiOP_stakeAdded", "args": [ { "type": "uint64", "name": "id" }, { "type": "uint16", "name": "poolNum" }, { "type": "uint64", "name": "poolAppId" }, { "type": "address", "name": "staker" }, { "type": "uint64", "name": "amountStaked" } ] }, { "name": "retiOP_epochRewardUpdate", "args": [ { "type": "uint64", "name": "id" }, { "type": "uint16", "name": "poolNum" }, { "type": "uint64", "name": "poolAppId" }, { "type": "uint64", "name": "validatorCommission" }, { "type": "uint64", "name": "saturatedBurnToFeeSink" }, { "type": "uint64", "name": "algoAdded" }, { "type": "uint64", "name": "rewardTokenHeldBack" } ] }, { "name": "retiOP_stakeRemoved", "args": [ { "type": "uint64", "name": "id" }, { "type": "uint16", "name": "poolNum" }, { "type": "uint64", "name": "poolAppId" }, { "type": "address", "name": "staker" }, { "type": "uint64", "name": "amountUnstaked" }, { "type": "uint64", "name": "rewardTokensReceived" }, { "type": "uint64", "name": "rewardTokenAssetId" } ] } ], "templateVariables": { "NFD_REGISTRY_APP_ID": { "type": "AVMUint64" } } }