{ "name": "AlgoSafe", "structs": { "Object78E87395": [ { "name": "groupId", "type": "uint64" }, { "name": "account", "type": "address" } ], "Object9F556C53": [ { "name": "proposalId", "type": "uint64" }, { "name": "account", "type": "address" } ], "AdminChange": [ { "name": "changeType", "type": "uint64" }, { "name": "targetGroupId", "type": "uint64" }, { "name": "groupName", "type": "string" }, { "name": "memberAddr", "type": "address" }, { "name": "memberType", "type": "uint64" }, { "name": "memberLabel", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "activeFlag", "type": "uint64" } ], "Approval": [ { "name": "signer", "type": "address" }, { "name": "round", "type": "uint64" } ], "GroupSeed": [ { "name": "name", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" } ], "Member": [ { "name": "accountType", "type": "uint64" }, { "name": "label", "type": "string" }, { "name": "addr", "type": "address" } ], "Proposal": [ { "name": "groupId", "type": "uint64" }, { "name": "status", "type": "uint64" }, { "name": "payloadType", "type": "uint64" }, { "name": "approvalsCount", "type": "uint64" }, { "name": "threshold", "type": "uint64" }, { "name": "expiryRound", "type": "uint64" }, { "name": "proposer", "type": "address" }, { "name": "numPayloads", "type": "uint64" }, { "name": "epochAtCreation", "type": "uint64" }, { "name": "payloadVersion", "type": "uint64" }, { "name": "totalTxns", "type": "uint64" } ], "RekeyedAddress": [ { "name": "label", "type": "string" }, { "name": "addedRound", "type": "uint64" } ], "SignerGroup": [ { "name": "name", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "memberCount", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "dailyUsage", "type": "uint64" }, { "name": "dailyPeriodStart", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "monthlyUsage", "type": "uint64" }, { "name": "monthlyPeriodStart", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "lastExecutionRound", "type": "uint64" }, { "name": "membershipEpoch", "type": "uint64" }, { "name": "active", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "string", "name": "name" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Initialise the safe. The creator becomes the bootstrap admin and must call\n`bootstrap` once (after funding the app account) to create the first admin\nsigner group. The application is intentionally non-updatable and\nnon-deletable for custody safety.", "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] } ], "recommendations": {} }, { "name": "bootstrap", "args": [ { "type": "string", "name": "groupName" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Genesis bootstrap: create the first admin signer group as a 1-of-1 group\nwhose sole member is the creator, with full admin privileges and all\nactions allowed. Callable exactly once, only by the creator. After this,\nevery privileged change must go through governance.\n\nRequires the app account to be funded for box MBR beforehand.", "events": [ { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] } ], "recommendations": {} }, { "name": "bootstrapGroup", "args": [ { "type": "(string,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "GroupSeed", "name": "seed" }, { "type": "(address,uint64,string)[]", "name": "members" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Clone-friendly bootstrap: create a fully configured signer group (policy,\nthreshold, privileges, and all members at once) while the safe is still\nun-bootstrapped. Callable repeatedly by the creator to seed a new safe with\nanother safe's configuration during a migration, before `finalizeBootstrap`\nhands control over to governance. Usage counters and the membership epoch\nstart fresh. Returns the new group id.", "events": [ { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] } ], "recommendations": {} }, { "name": "bootstrapRekeyedAddress", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Seed the rekeyed-address registry while the safe is still un-bootstrapped\n(cloning a predecessor safe's registry during a migration). After\n`finalizeBootstrap`, registry changes go through governed admin proposals.", "events": [ { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] } ], "recommendations": {} }, { "name": "finalizeBootstrap", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Close the clone-friendly bootstrap phase. Requires at least one active\ngroup holding PRIV_GROUP so governance can never start locked out. From\nthis point on, every privileged change must go through proposals.", "events": [], "recommendations": {} }, { "name": "proposeTransactionGroup", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,byte[])[]", "name": "payload" }, { "type": "uint64", "name": "expiryRound" }, { "type": "bool", "name": "execute" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a transaction-group proposal from the first payload chunk. When the\ntotal number of transactions exceeds the ~2 KB per-ABI-argument limit, call\nappendTransactionGroupPayload (once per extra chunk, slots 2\u20136) before the\nproposal is approved and executed. Stores the payload at slot 1.\n\nWhen `execute` is true, attempts to execute the proposal immediately after\ncreating it \u2014 this only succeeds if the signer group's threshold is 1 (so\nthe proposer's auto-approval alone satisfies it) and the transactions fall\nwithin the group's spending limits, letting a single app call both propose\nand execute a transaction group.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] }, { "name": "RekeyedAddressRemoved", "args": [ { "type": "address", "name": "addr" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "SafePaused", "args": [ { "type": "uint64", "name": "paused" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "appendTransactionGroupPayload", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" }, { "type": "(uint64,byte[])[]", "name": "payload" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Append an additional payload chunk (slots 2\u20136) to an existing transaction-group\nproposal. Callable only by the original proposer while they remain a *current*\nmember of the group, and only while `approvalsCount === 1` (i.e. no one but the\nproposer's own auto-approval has approved yet). This blocks edits once a second\napproval has actually landed on-chain, but a proposer could otherwise still race\nan independent signer's in-flight approval transaction with an edit here \u2014 that\nremaining window is closed by `payloadVersion`: every successful write here bumps\nit, and `approveProposal` requires the caller to name the version it reviewed, so\na stale approval fails instead of silently binding to different content (H-01).\nThe membership check also prevents a member removed from the group after\nproposing from continuing to rewrite their own now-orphaned proposal. Each chunk's\nlength is tracked in `proposal.totalTxns` (correctly accounting for overwrites of\nan already-written slot) so the aggregate across all chunks can be bounded by\n`MAX_GROUP_TXNS` here, before the AVM's own inner-transaction-group size limit\nwould otherwise reject an over-sized proposal only at execution time (M-02).", "events": [], "recommendations": {} }, { "name": "proposeAdminChange", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,uint64,string,address,uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "AdminChange", "name": "change" }, { "type": "uint64", "name": "expiryRound" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a governed signer-group administration proposal. Deliberately not gated\nby `paused`: pause only ever blocks fund-moving transaction-group proposals, so\ngovernance (including an ADM_SET_PAUSED change that unpauses the safe) always\nstays reachable \u2014 see the comment on `_executeProposalInternal`.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "approveProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "expectedPayloadVersion" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record the caller's approval of a proposal. `expectedPayloadVersion` must match\nthe proposal's current `payloadVersion` (read via `getProposal` immediately\nbefore signing) \u2014 this binds the approval to the exact content the caller\nreviewed, so a proposer editing a transaction-group proposal's payload after\nthe caller decided to approve, but before this call confirms, invalidates the\nstale approval instead of silently applying it to different content (H-01).\nFor admin-change proposals, `payloadVersion` never changes after creation, so\n`expectedPayloadVersion` is always `1`.", "events": [ { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "executeProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Execute a proposal once its threshold has been met.", "events": [ { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] }, { "name": "RekeyedAddressRemoved", "args": [ { "type": "address", "name": "addr" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "SafePaused", "args": [ { "type": "uint64", "name": "paused" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "cancelProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cancel a pending proposal. Allowed for the proposer or any member of the proposal's group.", "events": [ { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "pruneProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Reclaim box MBR for a proposal that finished (EXECUTED/CANCELLED) and is\npast its expiry round, by deleting its proposal record and any\ntransaction-group/admin payload boxes. Callable by any member of the\nproposal's group. Approval boxes (keyed per-signer, with no on-chain list\nof who approved) are not deleted here.", "events": [], "recommendations": {} }, { "name": "getConfig", "args": [ { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,string)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getSignerGroup", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "SignerGroup" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,address,uint64,uint64,uint64,uint64)", "struct": "Proposal" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getTransactionGroup", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,byte[])[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,string,address)", "struct": "Member" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "isMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "hasApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getActivePrivGroupCount", "args": [ { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Count of active signer groups currently holding PRIV_GROUP. Never reaches 0.", "events": [], "recommendations": {} }, { "name": "isRekeyedAddress", "args": [ { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getRekeyedAddress", "args": [ { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64)", "struct": "RekeyedAddress" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 6, "bytes": 3 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "name": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmFtZQ==" }, "creator": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcg==" }, "bootstrapped": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Ym9vdA==" }, "nextGroupId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bmdpZA==" }, "nextProposalId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnBpZA==" }, "groupCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2NudA==" }, "paused": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGF1c2Vk" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVy" }, "activePrivGroupCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXBnYw==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "groups": { "keyType": "uint64", "valueType": "SignerGroup", "prefix": "Zw==" }, "members": { "keyType": "Object78E87395", "valueType": "Member", "prefix": "bQ==" }, "proposals": { "keyType": "uint64", "valueType": "Proposal", "prefix": "cA==" }, "approvals": { "keyType": "Object9F556C53", "valueType": "Approval", "prefix": "YQ==" }, "transactionGroups": { "keyType": "uint64", "valueType": "(uint64,byte[])[]", "prefix": "dHhn" }, "adminPayloads": { "keyType": "uint64", "valueType": "AdminChange", "prefix": "ZHA=" }, "rekeyedAddresses": { "keyType": "address", "valueType": "RekeyedAddress", "prefix": "cg==" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1593, 1799, 2060, 2477, 2667, 2793, 3074, 3118, 3177, 3233, 3481, 3537, 3568, 3740, 4631, 5882, 6371, 6619, 6740, 6885 ], "errorMessage": "Box must have value" }, { "pc": [ 131 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 4452 ], "errorMessage": "acfg not allowed" }, { "pc": [ 1309, 2371 ], "errorMessage": "address required" }, { "pc": [ 6251 ], "errorMessage": "already a member" }, { "pc": [ 2541 ], "errorMessage": "already approved" }, { "pc": [ 503, 887, 1303, 1378 ], "errorMessage": "already bootstrapped" }, { "pc": [ 1320, 2380, 6448 ], "errorMessage": "already registered" }, { "pc": [ 4358 ], "errorMessage": "app args total length exceeded" }, { "pc": [ 4198 ], "errorMessage": "app update not supported" }, { "pc": [ 4181 ], "errorMessage": "appId required" }, { "pc": [ 4175 ], "errorMessage": "appl not allowed" }, { "pc": [ 4023 ], "errorMessage": "asset close target required" }, { "pc": [ 4005 ], "errorMessage": "asset receiver required" }, { "pc": [ 3997 ], "errorMessage": "axfer not allowed" }, { "pc": [ 510 ], "errorMessage": "bootstrapGroup already used; cannot mix bootstrap paths" }, { "pc": [ 1859 ], "errorMessage": "cannot modify payload after independent approval" }, { "pc": [ 494, 501, 508, 517, 686, 878, 885, 957, 1213, 1230, 1294, 1301, 1369, 1376, 1382, 1546, 1759, 2945, 2950, 2955, 2960, 2965, 2970, 3389, 3632, 5908, 6164, 6179, 6804, 6857, 6947, 7002, 7050, 7071, 7606, 7643 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 3871 ], "errorMessage": "close target required" }, { "pc": [ 944, 2124, 2274 ], "errorMessage": "cooldown too large" }, { "pc": [ 7491 ], "errorMessage": "daily limit exceeded" }, { "pc": [ 1142 ], "errorMessage": "duplicate member" }, { "pc": [ 1781 ], "errorMessage": "empty payload" }, { "pc": [ 1537 ], "errorMessage": "empty tx group" }, { "pc": [ 7059 ], "errorMessage": "expiry must be in the future" }, { "pc": [ 2101 ], "errorMessage": "first member required" }, { "pc": [ 7546 ], "errorMessage": "group admin required" }, { "pc": [ 3669 ], "errorMessage": "group cooldown not elapsed" }, { "pc": [ 1565, 2067, 3575 ], "errorMessage": "group disabled" }, { "pc": [ 2556, 3619 ], "errorMessage": "group membership changed since proposal creation" }, { "pc": [ 3501 ], "errorMessage": "group not found" }, { "pc": [ 1102, 3812, 3964, 4140, 4319, 4418, 4525, 4704, 4851, 4994, 5117, 5188, 5322, 5473, 5752 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 921, 2109, 2266 ], "errorMessage": "invalid actions" }, { "pc": [ 799, 1439, 1683 ], "errorMessage": "invalid array encoding" }, { "pc": [ 370, 477, 758, 769, 827, 1277, 1409, 1466, 1601, 1653, 1710, 1992, 2013, 3795, 3947, 4123, 4219, 4238, 4252, 4266, 4401, 4508, 4687, 4834, 4977, 5100, 5166, 5217, 5260, 5305, 5456, 5735, 7321 ], "errorMessage": "invalid array length header" }, { "pc": [ 1506 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 377, 484, 1284 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 848 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1487, 1731 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1271, 3201, 3257, 3320, 3405, 3454 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 856, 1401, 1495, 1518, 1635, 1645, 1739, 1967, 2026, 2035, 2429, 2438, 2447, 2585, 2594, 2625, 2634, 2751, 2760, 2928, 3045, 3054, 3088, 3097, 3132, 3141, 3150, 3191, 3209, 3247, 3265, 3310, 3328, 3373, 3413, 3462 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 2018 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::AdminChange" }, { "pc": [ 763 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::GroupSeed" }, { "pc": [ 4194 ], "errorMessage": "invalid onCompletion" }, { "pc": [ 934, 2117, 2308 ], "errorMessage": "invalid privileges" }, { "pc": [ 1778 ], "errorMessage": "invalid slot" }, { "pc": [ 747 ], "errorMessage": "invalid tail pointer at index 0 of ((len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 1462, 1706 ], "errorMessage": "invalid tail pointer at index 1 of (uint64,(len+uint8[]))" }, { "pc": [ 1984 ], "errorMessage": "invalid tail pointer at index 2 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 823 ], "errorMessage": "invalid tail pointer at index 2 of (uint8[32],uint64,(len+utf8[]))" }, { "pc": [ 2005 ], "errorMessage": "invalid tail pointer at index 5 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 1447, 1691 ], "errorMessage": "invalid tail pointer for (len+(uint64,(len+uint8[]))[])" }, { "pc": [ 807 ], "errorMessage": "invalid tail pointer for (len+(uint8[32],uint64,(len+utf8[]))[])" }, { "pc": [ 910 ], "errorMessage": "invalid threshold" }, { "pc": [ 742, 818, 1457, 1701, 1979, 2000 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ 4381 ], "errorMessage": "keyreg not allowed" }, { "pc": [ 1126, 2179 ], "errorMessage": "member required" }, { "pc": [ 890 ], "errorMessage": "members required" }, { "pc": [ 4482 ], "errorMessage": "metadataHash must be 0 or 32 bytes" }, { "pc": [ 7438 ], "errorMessage": "monthly limit exceeded" }, { "pc": [ 2317, 2351, 6758, 6903 ], "errorMessage": "must keep at least one active group admin" }, { "pc": [ 1383 ], "errorMessage": "need an active group admin" }, { "pc": [ 5920 ], "errorMessage": "new group starts with one member" }, { "pc": [ 2527, 3512 ], "errorMessage": "not a group member" }, { "pc": [ 6364 ], "errorMessage": "not a member" }, { "pc": [ 1806 ], "errorMessage": "not a tx group" }, { "pc": [ 2496 ], "errorMessage": "not approvable" }, { "pc": [ 2713 ], "errorMessage": "not authorised to cancel" }, { "pc": [ 7053 ], "errorMessage": "not bootstrapped" }, { "pc": [ 2686 ], "errorMessage": "not cancellable" }, { "pc": [ 3543 ], "errorMessage": "not ready to execute" }, { "pc": [ 2406, 6529 ], "errorMessage": "not registered" }, { "pc": [ 2826 ], "errorMessage": "not yet expired" }, { "pc": [ 496, 880, 1296, 1371 ], "errorMessage": "only creator can bootstrap" }, { "pc": [ 1852 ], "errorMessage": "only proposer can append" }, { "pc": [ 3845 ], "errorMessage": "pay not allowed" }, { "pc": [ 2564 ], "errorMessage": "payload changed since review" }, { "pc": [ 7535 ], "errorMessage": "policy admin required" }, { "pc": [ 1837, 2508, 3552 ], "errorMessage": "proposal expired" }, { "pc": [ 1825 ], "errorMessage": "proposal not pending" }, { "pc": [ 2814 ], "errorMessage": "proposal not terminal" }, { "pc": [ 3853 ], "errorMessage": "receiver required" }, { "pc": [ 4557 ], "errorMessage": "rekey not allowed" }, { "pc": [ 4563 ], "errorMessage": "rekey requires group admin privilege" }, { "pc": [ 4570 ], "errorMessage": "rekey target required" }, { "pc": [ 1548, 1761, 3634 ], "errorMessage": "safe paused" }, { "pc": [ 4185 ], "errorMessage": "self-call not allowed" }, { "pc": [ 2171, 2205, 2229, 2258, 2299, 2342 ], "errorMessage": "target group not found" }, { "pc": [ 2093, 2234 ], "errorMessage": "threshold >= 1" }, { "pc": [ 6580 ], "errorMessage": "threshold exceeds members" }, { "pc": [ 3605 ], "errorMessage": "threshold not met" }, { "pc": [ 4278 ], "errorMessage": "too many accounts" }, { "pc": [ 4272 ], "errorMessage": "too many app args" }, { "pc": [ 4283 ], "errorMessage": "too many foreign apps" }, { "pc": [ 4287 ], "errorMessage": "too many foreign assets" }, { "pc": [ 4294 ], "errorMessage": "too many references" }, { "pc": [ 1541 ], "errorMessage": "too many txs" }, { "pc": [ 1901 ], "errorMessage": "too many txs across chunks" }, { "pc": [ 2415 ], "errorMessage": "unknown change type" }, { "pc": [ 4499 ], "errorMessage": "unknown tx type" }, { "pc": [ 6390 ], "errorMessage": "would drop below threshold" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMiAxMDAwMDAwMCAxNjgKICAgIGJ5dGVjYmxvY2sgImciICJhcGdjIiAiIiAweDE1MWY3Yzc1ICJtIiAiZ2NudCIgInAiICJib290IiAibmdpZCIgInIiICJwYXVzZWQiICJ0eGciICJjcmVhdG9yIiAibnBpZCIgMHhkMDcwNTA3YSAweDdjNjA1OWU2IDB4MDAyMiAweDAwMTIgMHgwY2Q3MzU3YyAweDAwMmEgImRwIiAiYSIgMHgwMCAweDA2ODEwMSAibmFtZSIgInZlciIgMHgwMDdhIDB4MDAwYSAweGRlZGQwM2E4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBleHBvcnQgY2xhc3MgQWxnb1NhZmUgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjUKICAgIHB1c2hieXRlc3MgMHg5MTRiYTYzMyAweDFhMGIzMDNhIDB4ZDU1MTU2ODIgMHgwYjI0M2NhNyAweGFjM2E5YTMyIDB4NDQyNDQ1ZjcgMHhkY2VlNDQyNyAweGY0YjQ4NmVlIDB4ZmI3MDg4ZTggMHg3ZjUxZmMyOCAweGRjYWRmZjk2IDB4YjZiN2FlYWQgMHhkMWNjMmJiNiAweDdmZDcyZjUxIDB4ZjljYjRhMzcgMHg2NWFhYTBlZCAweGNiZDczMjQyIDB4NTAzNDE2MTcgMHhmNGZhNTQ0YyAweGIyODU3MmNhIDB4ZDM3ZGZiMjAgLy8gbWV0aG9kICJib290c3RyYXAoc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcEdyb3VwKChzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSwoYWRkcmVzcyx1aW50NjQsc3RyaW5nKVtdLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImJvb3RzdHJhcFJla2V5ZWRBZGRyZXNzKGFkZHJlc3Msc3RyaW5nKXZvaWQiLCBtZXRob2QgImZpbmFsaXplQm9vdHN0cmFwKCl2b2lkIiwgbWV0aG9kICJwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cCh1aW50NjQsKHVpbnQ2NCxieXRlW10pW10sdWludDY0LGJvb2wsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQodWludDY0LHVpbnQ2NCwodWludDY0LGJ5dGVbXSlbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAicHJvcG9zZUFkbWluQ2hhbmdlKHVpbnQ2NCwodWludDY0LHVpbnQ2NCxzdHJpbmcsYWRkcmVzcyx1aW50NjQsc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhcHByb3ZlUHJvcG9zYWwodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZXhlY3V0ZVByb3Bvc2FsKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2FuY2VsUHJvcG9zYWwodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJwcnVuZVByb3Bvc2FsKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZ2V0Q29uZmlnKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxzdHJpbmcpIiwgbWV0aG9kICJnZXRTaWduZXJHcm91cCh1aW50NjQsdWludDY0KShzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRQcm9wb3NhbCh1aW50NjQsdWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldFRyYW5zYWN0aW9uR3JvdXAodWludDY0LHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCxieXRlW10pW10iLCBtZXRob2QgImdldE1lbWJlcih1aW50NjQsYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCxzdHJpbmcsYWRkcmVzcykiLCBtZXRob2QgImlzTWVtYmVyKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NClib29sIiwgbWV0aG9kICJoYXNBcHByb3ZlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpYm9vbCIsIG1ldGhvZCAiZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiaXNSZWtleWVkQWRkcmVzcyhhZGRyZXNzLHVpbnQ2NClib29sIiwgbWV0aG9kICJnZXRSZWtleWVkQWRkcmVzcyhhZGRyZXNzLHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCkiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBib290c3RyYXAgYm9vdHN0cmFwR3JvdXAgYm9vdHN0cmFwUmVrZXllZEFkZHJlc3MgZmluYWxpemVCb290c3RyYXAgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQgcHJvcG9zZUFkbWluQ2hhbmdlIGFwcHJvdmVQcm9wb3NhbCBleGVjdXRlUHJvcG9zYWwgY2FuY2VsUHJvcG9zYWwgcHJ1bmVQcm9wb3NhbCBnZXRDb25maWcgZ2V0U2lnbmVyR3JvdXAgZ2V0UHJvcG9zYWwgZ2V0VHJhbnNhY3Rpb25Hcm91cCBnZXRNZW1iZXIgaXNNZW1iZXIgaGFzQXBwcm92ZWQgZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnQgaXNSZWtleWVkQWRkcmVzcyBnZXRSZWtleWVkQWRkcmVzcwogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gZXhwb3J0IGNsYXNzIEFsZ29TYWZlIGV4dGVuZHMgQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4MTE1NzU2ZGIgLy8gbWV0aG9kICJjcmVhdGVBcHBsaWNhdGlvbihzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZUFwcGxpY2F0aW9uCiAgICBlcnIKCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwoKZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMToKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBlbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDYKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAyMyAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDIzIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5jcmVhdGVBcHBsaWNhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2NgogICAgLy8gcHVibGljIGNyZWF0ZUFwcGxpY2F0aW9uKG5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIG5hbWUgPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiAnbmFtZScgfSkKICAgIGJ5dGVjIDI0IC8vICJuYW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2NwogICAgLy8gdGhpcy5uYW1lLnZhbHVlID0gbmFtZQogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMzCiAgICAvLyBjcmVhdG9yID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdjcmVhdG9yJyB9KQogICAgYnl0ZWMgMTIgLy8gImNyZWF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyB0aGlzLmNyZWF0b3IudmFsdWUgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA3IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM2OQogICAgLy8gdGhpcy5ib290c3RyYXBwZWQudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNQogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDggLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzYKICAgIC8vIG5leHRQcm9wb3NhbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25waWQnIH0pCiAgICBieXRlYyAxMyAvLyAibnBpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzEKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWMgNSAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBwYXVzZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGF1c2VkJyB9KQogICAgYnl0ZWMgMTAgLy8gInBhdXNlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzMKICAgIC8vIHRoaXMucGF1c2VkLnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzkKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiAndmVyJyB9KQogICAgYnl0ZWMgMjUgLy8gInZlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzQKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IENPTlRSQUNUX1ZFUlNJT04KICAgIHB1c2hieXRlcyAiQklBVEVDLUFMR08tU0FGRS12MS44LjAiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzc1CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzYKICAgIC8vIGVtaXQ8U2FmZUNyZWF0ZWQ+KHsgbmFtZSwgY3JlYXRvcjogVHhuLnNlbmRlciB9KQogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlYyAxNiAvLyAweDAwMjIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGUyOWM4YjQ3IC8vIG1ldGhvZCAiU2FmZUNyZWF0ZWQoc3RyaW5nLGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjYKICAgIC8vIHB1YmxpYyBjcmVhdGVBcHBsaWNhdGlvbihuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmJvb3RzdHJhcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozODcKICAgIC8vIHB1YmxpYyBib290c3RyYXAoZ3JvdXBOYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzg4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCAnb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAnKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2NyZWF0b3InIH0pCiAgICBieXRlYyAxMiAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozODgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyA3IC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYm9vdHN0cmFwcGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cENvdW50LnZhbHVlID09PSBVaW50NjQoMCksICdib290c3RyYXBHcm91cCBhbHJlYWR5IHVzZWQ7IGNhbm5vdCBtaXggYm9vdHN0cmFwIHBhdGhzJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA1IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5NAogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9PT0gVWludDY0KDApLCAnYm9vdHN0cmFwR3JvdXAgYWxyZWFkeSB1c2VkOyBjYW5ub3QgbWl4IGJvb3RzdHJhcCBwYXRocycpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIGJvb3RzdHJhcEdyb3VwIGFscmVhZHkgdXNlZDsgY2Fubm90IG1peCBib290c3RyYXAgcGF0aHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozOTYKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozOTcKICAgIC8vIGNvbnN0IGdpZDogdWludDY0ID0gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzUKICAgIC8vIG5leHRHcm91cElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25naWQnIH0pCiAgICBieXRlYyA4IC8vICJuZ2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5NwogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5OS00MTYKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IGdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBVaW50NjQoMSksCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogUFJJVl9BTEwsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBBQ1RfQUxMLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IFVpbnQ2NCgwKSwKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwMQogICAgLy8gdGhyZXNob2xkOiBVaW50NjQoMSksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5OS00MTYKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IGdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBVaW50NjQoMSksCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogUFJJVl9BTEwsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBBQ1RfQUxMLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IFVpbnQ2NCgwKSwKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDUKICAgIC8vIGxpbWl0QXNzZXRJZDogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozOTktNDE2CiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBncm91cE5hbWUsCiAgICAvLyAgIHRocmVzaG9sZDogVWludDY0KDEpLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IFBSSVZfQUxMLAogICAgLy8gICBhbGxvd2VkQWN0aW9uczogQUNUX0FMTCwKICAgIC8vICAgbGltaXRBc3NldElkOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBVaW50NjQoMCksCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyB9CiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwN2EwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDcwMDAwMDAwMDAwMDAwMDNmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdycCkKICAgIGRpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTcKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncnApCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBjb25zdCBtOiBNZW1iZXIgPSB7IGFjY291bnRUeXBlOiBVaW50NjQoMSksIGxhYmVsOiAnY3JlYXRvcicsIGFkZHI6IFR4bi5zZW5kZXIgfQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMTAwMmEKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwNzYzNzI2NTYxNzQ2ZjcyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjAKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBkaWcgMQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyMAogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUobSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDIyCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICB1bmNvdmVyIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBnaWQgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA1IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDUgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM0CiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDcgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI0CiAgICAvLyB0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjYKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyOAogICAgLy8gZW1pdDxHcm91cENyZWF0ZWQ+KHsgZ3JvdXBJZDogZ2lkLCBuYW1lOiBncm91cE5hbWUsIHRocmVzaG9sZDogVWludDY0KDEpIH0pCiAgICBkdXAKICAgIGJ5dGVjIDE3IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJHcm91cENyZWF0ZWQodWludDY0LHN0cmluZyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjkKICAgIC8vIGVtaXQ8TWVtYmVyQWRkZWQ+KHsgZ3JvdXBJZDogZ2lkLCBtZW1iZXI6IFR4bi5zZW5kZXIsIGFjY291bnRUeXBlOiBVaW50NjQoMSkgfSkKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxNCAvLyBtZXRob2QgIk1lbWJlckFkZGVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4NwogICAgLy8gcHVibGljIGJvb3RzdHJhcChncm91cE5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuYm9vdHN0cmFwR3JvdXBbcm91dGluZ10oKSAtPiB2b2lkOgpib290c3RyYXBHcm91cDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0MAogICAgLy8gcHVibGljIGJvb3RzdHJhcEdyb3VwKHNlZWQ6IEdyb3VwU2VlZCwgbWVtYmVyczogTWVtYmVyU2VlZFtdLCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMCBvZiAoKGxlbit1dGY4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgICsKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6R3JvdXBTZWVkCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgpib290c3RyYXBHcm91cF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwR3JvdXAoc2VlZDogR3JvdXBTZWVkLCBtZW1iZXJzOiBNZW1iZXJTZWVkW10sIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB1aW50NjQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfZm9yQDQKICAgIGR1cG4gMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBmb3IgKGxlbisodWludDhbMzJdLHVpbnQ2NCwobGVuK3V0ZjhbXSkpW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMiBvZiAodWludDhbMzJdLHVpbnQ2NCwobGVuK3V0ZjhbXSkpCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCA0NCAvLyA0NAogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGJvb3RzdHJhcEdyb3VwX2Zvcl9oZWFkZXJAMQoKYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwR3JvdXAoc2VlZDogR3JvdXBTZWVkLCBtZW1iZXJzOiBNZW1iZXJTZWVkW10sIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB1aW50NjQgewogICAgZGlnIDMKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6TWVtYmVyU2VlZD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0MQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQyCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkaWcgMTEKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmJvb3RzdHJhcEdyb3VwX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NDQKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnY3JlYXRvcicgfSkKICAgIGJ5dGVjIDEyIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0NAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ1CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM0CiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDcgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ1CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NDcKICAgIC8vIGFzc2VydChtZW1iZXJDb3VudCA+PSBVaW50NjQoMSksICdtZW1iZXJzIHJlcXVpcmVkJykKICAgIGRpZyA0CiAgICBhc3NlcnQgLy8gbWVtYmVycyByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0OAogICAgLy8gYXNzZXJ0KHNlZWQudGhyZXNob2xkID49IFVpbnQ2NCgxKSAmJiBzZWVkLnRocmVzaG9sZCA8PSBtZW1iZXJDb3VudCwgJ2ludmFsaWQgdGhyZXNob2xkJykKICAgIGRpZyA2CiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxMAogICAgYnogYm9vdHN0cmFwR3JvdXBfYm9vbF9mYWxzZUAxMAogICAgZGlnIDgKICAgIGRpZyA1CiAgICA8PQogICAgYnogYm9vdHN0cmFwR3JvdXBfYm9vbF9mYWxzZUAxMAogICAgaW50Y18xIC8vIDEKCmJvb3RzdHJhcEdyb3VwX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ4CiAgICAvLyBhc3NlcnQoc2VlZC50aHJlc2hvbGQgPj0gVWludDY0KDEpICYmIHNlZWQudGhyZXNob2xkIDw9IG1lbWJlckNvdW50LCAnaW52YWxpZCB0aHJlc2hvbGQnKQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGhyZXNob2xkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ5CiAgICAvLyBhc3NlcnQoc2VlZC5hbGxvd2VkQWN0aW9ucyA8PSBBQ1RfQUxMLCAnaW52YWxpZCBhY3Rpb25zJykKICAgIGRpZyA2CiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHB1c2hpbnQgNjMgLy8gNjMKICAgIDw9CiAgICBhc3NlcnQgLy8gaW52YWxpZCBhY3Rpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDUwCiAgICAvLyBhc3NlcnQoc2VlZC5hZG1pblByaXZpbGVnZXMgPD0gUFJJVl9BTEwsICdpbnZhbGlkIHByaXZpbGVnZXMnKQogICAgZGlnIDEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGR1cAogICAgcHVzaGludCA3IC8vIDcKICAgIDw9CiAgICBhc3NlcnQgLy8gaW52YWxpZCBwcml2aWxlZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDUxCiAgICAvLyBhc3NlcnQoc2VlZC5jb29sZG93blJvdW5kcyA8PSBNQVhfQ09PTERPV05fUk9VTkRTLCAnY29vbGRvd24gdG9vIGxhcmdlJykKICAgIGRpZyAyCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gY29vbGRvd24gdG9vIGxhcmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDUzCiAgICAvLyBjb25zdCBub3cgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU0CiAgICAvLyBjb25zdCBnaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dEdyb3VwSWQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NTQKICAgIC8vIGNvbnN0IGdpZDogdWludDY0ID0gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgNwogICAgYnVyeSAxOAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1NwogICAgLy8gbmFtZTogc2VlZC5uYW1lLAogICAgZGlnIDExCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2MgogICAgLy8gbGltaXRBc3NldElkOiBzZWVkLmxpbWl0QXNzZXRJZCwKICAgIGRpZyA1CiAgICBleHRyYWN0IDI2IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjMKICAgIC8vIGRhaWx5TGltaXQ6IHNlZWQuZGFpbHlMaW1pdCwKICAgIGRpZyA2CiAgICBleHRyYWN0IDM0IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjYKICAgIC8vIG1vbnRobHlMaW1pdDogc2VlZC5tb250aGx5TGltaXQsCiAgICB1bmNvdmVyIDcKICAgIGV4dHJhY3QgNDIgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1Ni00NzMKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IHNlZWQubmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBzZWVkLnRocmVzaG9sZCwKICAgIC8vICAgbWVtYmVyQ291bnQsCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogc2VlZC5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBzZWVkLmFsbG93ZWRBY3Rpb25zLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IHNlZWQubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBzZWVkLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IHNlZWQubW9udGhseUxpbWl0LAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBzZWVkLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGJ1cnkgMjQKICAgIGRpZyAxNwogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDI0CiAgICBieXRlYyAyNiAvLyAweDAwN2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDE0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDY0CiAgICAvLyBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ1Ni00NzMKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IHNlZWQubmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBzZWVkLnRocmVzaG9sZCwKICAgIC8vICAgbWVtYmVyQ291bnQsCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogc2VlZC5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBzZWVkLmFsbG93ZWRBY3Rpb25zLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IHNlZWQubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBzZWVkLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IHNlZWQubW9udGhseUxpbWl0LAogICAgLy8gICBtb250aGx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIGNvb2xkb3duUm91bmRzOiBzZWVkLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDcyCiAgICAvLyBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU2LTQ3MwogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogc2VlZC5uYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IHNlZWQudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudCwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBzZWVkLmFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IHNlZWQuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogc2VlZC5saW1pdEFzc2V0SWQsCiAgICAvLyAgIGRhaWx5TGltaXQ6IHNlZWQuZGFpbHlMaW1pdCwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogc2VlZC5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IHNlZWQuY29vbGRvd25Sb3VuZHMsCiAgICAvLyAgIGxhc3RFeGVjdXRpb25Sb3VuZDogVWludDY0KDApLAogICAgLy8gICBtZW1iZXJzaGlwRXBvY2g6IFVpbnQ2NCgwKSwKICAgIC8vICAgYWN0aXZlOiBVaW50NjQoMSksCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3NAogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdycCkKICAgIHN3YXAKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncnApCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3NgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IG1lbWJlckNvdW50OyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKCmJvb3RzdHJhcEdyb3VwX3doaWxlX3RvcEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzYKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBtZW1iZXJDb3VudDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGRpZyA5CiAgICBkaWcgNQogICAgPAogICAgYnogYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfd2hpbGVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzctNDc4CiAgICAvLyBjb25zdCBzZWVkTWVtYmVyID0gY2xvbmUobWVtYmVyc1tpXSkKICAgIC8vIGFzc2VydChzZWVkTWVtYmVyLmFkZHIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ21lbWJlciByZXF1aXJlZCcpCiAgICBkaWcgOQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGRpZyA3CiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyBhc3NlcnQoc2VlZE1lbWJlci5hZGRyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdtZW1iZXIgcmVxdWlyZWQnKQogICAgZHVwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gbWVtYmVyIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDc5CiAgICAvLyBhc3NlcnQoIXRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogc2VlZE1lbWJlci5hZGRyIH0pLmV4aXN0cywgJ2R1cGxpY2F0ZSBtZW1iZXInKQogICAgZGlnIDE0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzkKICAgIC8vIGFzc2VydCghdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBzZWVkTWVtYmVyLmFkZHIgfSkuZXhpc3RzLCAnZHVwbGljYXRlIG1lbWJlcicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGR1cGxpY2F0ZSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODAKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IHNlZWRNZW1iZXIuYWNjb3VudFR5cGUsIGxhYmVsOiBzZWVkTWVtYmVyLmxhYmVsLCBhZGRyOiBzZWVkTWVtYmVyLmFkZHIgfQogICAgZGlnIDMKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgbGVuCiAgICBkaWcgNQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgNAogICAgZXh0cmFjdCAzMiA4CiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBieXRlYyAxOSAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4MQogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBzZWVkTWVtYmVyLmFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZGlnIDIKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBlbWl0PE1lbWJlckFkZGVkPih7IGdyb3VwSWQ6IGdpZCwgbWVtYmVyOiBzZWVkTWVtYmVyLmFkZHIsIGFjY291bnRUeXBlOiBzZWVkTWVtYmVyLmFjY291bnRUeXBlIH0pCiAgICBjb25jYXQKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAiTWVtYmVyQWRkZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIGJvb3RzdHJhcEdyb3VwX3doaWxlX3RvcEAxMgoKYm9vdHN0cmFwR3JvdXBfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg1CiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBkaWcgMTAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBnaWQgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg2CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA1IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4NgogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDUgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg2CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg3CiAgICAvLyBpZiAoKHNlZWQuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKSkgewogICAgZGlnIDcKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBieiBib290c3RyYXBHcm91cF9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg4CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4OAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg4CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmJvb3RzdHJhcEdyb3VwX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDkxCiAgICAvLyBlbWl0PEdyb3VwQ3JlYXRlZD4oeyBncm91cElkOiBnaWQsIG5hbWU6IHNlZWQubmFtZSwgdGhyZXNob2xkOiBzZWVkLnRocmVzaG9sZCB9KQogICAgZGlnIDEyCiAgICBkdXAKICAgIGJ5dGVjIDE3IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBkaWcgMTUKICAgIGNvbmNhdAogICAgZGlnIDE2CiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAiR3JvdXBDcmVhdGVkKHVpbnQ2NCxzdHJpbmcsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwR3JvdXAoc2VlZDogR3JvdXBTZWVkLCBtZW1iZXJzOiBNZW1iZXJTZWVkW10sIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB1aW50NjQgewogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYm9vdHN0cmFwR3JvdXBfYm9vbF9mYWxzZUAxMDoKICAgIGludGNfMCAvLyAwCiAgICBiIGJvb3RzdHJhcEdyb3VwX2Jvb2xfbWVyZ2VAMTEKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmJvb3RzdHJhcFJla2V5ZWRBZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKYm9vdHN0cmFwUmVrZXllZEFkZHJlc3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTAwCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwUmVrZXllZEFkZHJlc3MoYWRkcjogQWNjb3VudCwgbGFiZWw6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnY3JlYXRvcicgfSkKICAgIGJ5dGVjIDEyIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwMQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTAyCiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM0CiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDcgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTAyCiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDMKICAgIC8vIGFzc2VydChhZGRyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdhZGRyZXNzIHJlcXVpcmVkJykKICAgIGRpZyAxCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYWRkcmVzcyByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgOSAvLyAiciIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDQKICAgIC8vIGFzc2VydCghdGhpcy5yZWtleWVkQWRkcmVzc2VzKGFkZHIpLmV4aXN0cywgJ2FscmVhZHkgcmVnaXN0ZXJlZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwNQogICAgLy8gY29uc3QgZW50cnk6IFJla2V5ZWRBZGRyZXNzID0geyBsYWJlbCwgYWRkZWRSb3VuZDogR2xvYmFsLnJvdW5kIH0KICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlYyAyNyAvLyAweDAwMGEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwNgogICAgLy8gdGhpcy5yZWtleWVkQWRkcmVzc2VzKGFkZHIpLnZhbHVlID0gY2xvbmUoZW50cnkpCiAgICBkaWcgMgogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDcKICAgIC8vIGVtaXQ8UmVrZXllZEFkZHJlc3NBZGRlZD4oeyBhZGRyLCBsYWJlbCB9KQogICAgc3dhcAogICAgYnl0ZWMgMTYgLy8gMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjggLy8gbWV0aG9kICJSZWtleWVkQWRkcmVzc0FkZGVkKGFkZHJlc3Msc3RyaW5nKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTAwCiAgICAvLyBwdWJsaWMgYm9vdHN0cmFwUmVrZXllZEFkZHJlc3MoYWRkcjogQWNjb3VudCwgbGFiZWw6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZmluYWxpemVCb290c3RyYXBbcm91dGluZ10oKSAtPiB2b2lkOgpmaW5hbGl6ZUJvb3RzdHJhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTYKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gY3JlYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnY3JlYXRvcicgfSkKICAgIGJ5dGVjIDEyIC8vICJjcmVhdG9yIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuY3JlYXRvci52YWx1ZSwgJ29ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgY3JlYXRvciBjYW4gYm9vdHN0cmFwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE3CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM0CiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDcgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE3CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgYm9vdHN0cmFwcGVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBib290c3RyYXBwZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTgKICAgIC8vIGFzc2VydCh0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID49IFVpbnQ2NCgxKSwgJ25lZWQgYW4gYWN0aXZlIGdyb3VwIGFkbWluJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTgKICAgIC8vIGFzc2VydCh0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID49IFVpbnQ2NCgxKSwgJ25lZWQgYW4gYWN0aXZlIGdyb3VwIGFkbWluJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBhc3NlcnQgLy8gbmVlZCBhbiBhY3RpdmUgZ3JvdXAgYWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgNyAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTkKICAgIC8vIHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTUKICAgIC8vIHB1YmxpYyBmaW5hbGl6ZUJvb3RzdHJhcCgpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM4LTU0NAogICAgLy8gcHVibGljIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKAogICAgLy8gICBncm91cElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZXhlY3V0ZTogYm9vbGVhbiwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM4LTU0NAogICAgLy8gcHVibGljIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKAogICAgLy8gICBncm91cElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZXhlY3V0ZTogYm9vbGVhbiwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyh1aW50NjQsKGxlbit1aW50OFtdKSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDY0LChsZW4rdWludDhbXSkpCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMiAvLyAxMgogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2Zvcl9oZWFkZXJAMQoKcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM4LTU0NAogICAgLy8gcHVibGljIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKAogICAgLy8gICBncm91cElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZXhlY3V0ZTogYm9vbGVhbiwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBkaWcgMwogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpTYWZlVHhuPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgYnVyeSA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnVyeSAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQ1CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDYKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGRpZyAxMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0OAogICAgLy8gYXNzZXJ0KHBheWxvYWQubGVuZ3RoID49IFVpbnQ2NCgxKSwgJ2VtcHR5IHR4IGdyb3VwJykKICAgIGRpZyA0CiAgICBkdXAKICAgIGFzc2VydCAvLyBlbXB0eSB0eCBncm91cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0OQogICAgLy8gYXNzZXJ0KHBheWxvYWQubGVuZ3RoIDw9IE1BWF9HUk9VUF9UWE5TLCAndG9vIG1hbnkgdHhzJykKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgdHhzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTUwCiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBwYXVzZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGF1c2VkJyB9KQogICAgYnl0ZWMgMTAgLy8gInBhdXNlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTAKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBzYWZlIHBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1MQogICAgLy8gdGhpcy5fYXNzZXJ0TWVtYmVyKGdyb3VwSWQpCiAgICBkaWcgNgogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRNZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTIKICAgIC8vIGFzc2VydCh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZS5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIGR1cAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTIKICAgIC8vIGFzc2VydCh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZS5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBhc3NlcnQgLy8gZ3JvdXAgZGlzYWJsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTMKICAgIC8vIGNvbnN0IHBpZCA9IHRoaXMuX25ld1Byb3Bvc2FsKGdyb3VwSWQsIFBUX1RSQU5TQUNUSU9OX0dST1VQLCBleHBpcnlSb3VuZCkKICAgIGludGNfMSAvLyAxCiAgICBkaWcgMTAKICAgIGNhbGxzdWIgX25ld1Byb3Bvc2FsCiAgICBkdXAKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1NAogICAgLy8gdGhpcy5fc3RvcmVQYXlsb2FkR3JvdXAocGlkLCBVaW50NjQoMSksIHBheWxvYWQpCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBkaWcgOAogICAgY2FsbHN1YiBfc3RvcmVQYXlsb2FkR3JvdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTUKICAgIC8vIGNvbnN0IHAgPSBjbG9uZSh0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlKQogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ4CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1NQogICAgLy8gY29uc3QgcCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHBpZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTU2CiAgICAvLyBwLm51bVBheWxvYWRzID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgaXRvYgogICAgcmVwbGFjZTIgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTcKICAgIC8vIHAudG90YWxUeG5zID0gcGF5bG9hZC5sZW5ndGgKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1OAogICAgLy8gdGhpcy5wcm9wb3NhbHMocGlkKS52YWx1ZSA9IGNsb25lKHApCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTU5CiAgICAvLyBpZiAoZXhlY3V0ZSkgewogICAgZGlnIDkKICAgIGJ6IHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2MAogICAgLy8gdGhpcy5fZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwocGlkKQogICAgZGlnIDcKICAgIGNhbGxzdWIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsCgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM4LTU0NAogICAgLy8gcHVibGljIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKAogICAgLy8gICBncm91cElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZXhlY3V0ZTogYm9vbGVhbiwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAxMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkW3JvdXRpbmddKCkgLT4gdm9pZDoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQ6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBieXRlY18yIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODItNTg3CiAgICAvLyBwdWJsaWMgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQoCiAgICAvLyAgIHByb3Bvc2FsSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMAoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4Mi01ODcKICAgIC8vIHB1YmxpYyBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZCgKICAgIC8vICAgcHJvcG9zYWxJZDogdWludDY0LAogICAgLy8gICBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyh1aW50NjQsKGxlbit1aW50OFtdKSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDY0LChsZW4rdWludDhbXSkpCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMiAvLyAxMgogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Zvcl9oZWFkZXJAMQoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTgyLTU4NwogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKAogICAgLy8gICBwcm9wb3NhbElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWRJbmRleDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OlNhZmVUeG4+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODgKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4OQogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZGlnIDEwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTk0CiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBwYXVzZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGF1c2VkJyB9KQogICAgYnl0ZWMgMTAgLy8gInBhdXNlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTQKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBzYWZlIHBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5NQogICAgLy8gYXNzZXJ0KHBheWxvYWRJbmRleCA+PSBVaW50NjQoMikgJiYgcGF5bG9hZEluZGV4IDw9IFVpbnQ2NCg2KSwgJ2ludmFsaWQgc2xvdCcpCiAgICBkaWcgNgogICAgaW50Y18zIC8vIDIKICAgID49CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX2ZhbHNlQDEwCiAgICBkaWcgNgogICAgcHVzaGludCA2IC8vIDYKICAgIDw9CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX2ZhbHNlQDEwCiAgICBpbnRjXzEgLy8gMQoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9tZXJnZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTUKICAgIC8vIGFzc2VydChwYXlsb2FkSW5kZXggPj0gVWludDY0KDIpICYmIHBheWxvYWRJbmRleCA8PSBVaW50NjQoNiksICdpbnZhbGlkIHNsb3QnKQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2xvdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5NgogICAgLy8gYXNzZXJ0KHBheWxvYWQubGVuZ3RoID49IFVpbnQ2NCgxKSwgJ2VtcHR5IHBheWxvYWQnKQogICAgZGlnIDQKICAgIGFzc2VydCAvLyBlbXB0eSBwYXlsb2FkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTk3CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZGlnIDgKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDgKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA2IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTcKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTk4CiAgICAvLyBhc3NlcnQocHJvcG9zYWwucGF5bG9hZFR5cGUgPT09IFBUX1RSQU5TQUNUSU9OX0dST1VQLCAnbm90IGEgdHggZ3JvdXAnKQogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gbm90IGEgdHggZ3JvdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTkKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdwcm9wb3NhbCBub3QgcGVuZGluZycpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxMQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF90cnVlQDEzCiAgICBkaWcgOQogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX2ZhbHNlQDE0CgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX3RydWVAMTM6CiAgICBpbnRjXzEgLy8gMQoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9tZXJnZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTkKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdwcm9wb3NhbCBub3QgcGVuZGluZycpCiAgICBhc3NlcnQgLy8gcHJvcG9zYWwgbm90IHBlbmRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDMKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPD0gcHJvcG9zYWwuZXhwaXJ5Um91bmQsICdwcm9wb3NhbCBleHBpcmVkJykKICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIHByb3Bvc2FsIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDQKICAgIC8vIHRoaXMuX2Fzc2VydE1lbWJlcihwcm9wb3NhbC5ncm91cElkKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2Fzc2VydE1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYwNQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHByb3Bvc2FsLnByb3Bvc2VyLCAnb25seSBwcm9wb3NlciBjYW4gYXBwZW5kJykKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBleHRyYWN0IDQ4IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgcHJvcG9zZXIgY2FuIGFwcGVuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYwNgogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLmFwcHJvdmFsc0NvdW50ID09PSBVaW50NjQoMSksICdjYW5ub3QgbW9kaWZ5IHBheWxvYWQgYWZ0ZXIgaW5kZXBlbmRlbnQgYXBwcm92YWwnKQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gY2Fubm90IG1vZGlmeSBwYXlsb2FkIGFmdGVyIGluZGVwZW5kZW50IGFwcHJvdmFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjA4CiAgICAvLyBjb25zdCBrZXk6IHVpbnQ2NCA9IHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgKICAgIGRpZyA5CiAgICBwdXNoaW50IDcgLy8gNwogICAgKgogICAgZGlnIDgKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDkKICAgIC8vIGxldCBuZXdUb3RhbDogdWludDY0ID0gcHJvcG9zYWwudG90YWxUeG5zCiAgICBzd2FwCiAgICBwdXNoaW50IDEwNCAvLyAxMDQKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjEwCiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1MQogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTEgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjEwCiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjExLTYxMgogICAgLy8gY29uc3QgZXhpc3RpbmcgPSBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkudmFsdWUpCiAgICAvLyBuZXdUb3RhbCA9IG5ld1RvdGFsIC0gZXhpc3RpbmcubGVuZ3RoCiAgICBkaWcgMTMKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTIKICAgIC8vIG5ld1RvdGFsID0gbmV3VG90YWwgLSBleGlzdGluZy5sZW5ndGgKICAgIC0KCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjE0CiAgICAvLyBuZXdUb3RhbCA9IG5ld1RvdGFsICsgcGF5bG9hZC5sZW5ndGgKICAgIGRpZyA1CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjE1CiAgICAvLyBhc3NlcnQobmV3VG90YWwgPD0gTUFYX0dST1VQX1RYTlMsICd0b28gbWFueSB0eHMgYWNyb3NzIGNodW5rcycpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgdHhzIGFjcm9zcyBjaHVua3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MTcKICAgIC8vIHRoaXMuX3N0b3JlUGF5bG9hZEdyb3VwKHByb3Bvc2FsSWQsIHBheWxvYWRJbmRleCwgcGF5bG9hZCkKICAgIGRpZyA5CiAgICBkaWcgOAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkaWcgOQogICAgY2FsbHN1YiBfc3RvcmVQYXlsb2FkR3JvdXAKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyMAogICAgLy8gdXBkYXRlZC50b3RhbFR4bnMgPSBuZXdUb3RhbAogICAgaXRvYgogICAgZGlnIDEzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTIgMTA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjIxCiAgICAvLyB1cGRhdGVkLnBheWxvYWRWZXJzaW9uID0gdXBkYXRlZC5wYXlsb2FkVmVyc2lvbiArIFVpbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDk2IC8vIDk2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDk2CiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjIyCiAgICAvLyBpZiAocGF5bG9hZEluZGV4ID4gcHJvcG9zYWwubnVtUGF5bG9hZHMpIHsKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIGV4dHJhY3RfdWludDY0CiAgICA+CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjIzCiAgICAvLyB1cGRhdGVkLm51bVBheWxvYWRzID0gcGF5bG9hZEluZGV4CiAgICBkaWcgOAogICAgcmVwbGFjZTIgODAKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI1CiAgICAvLyB0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSA9IGNsb25lKHVwZGF0ZWQpCiAgICBkaWcgMTQKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODItNTg3CiAgICAvLyBwdWJsaWMgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQoCiAgICAvLyAgIHByb3Bvc2FsSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfbWVyZ2VAMTUKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX21lcmdlQDExCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5wcm9wb3NlQWRtaW5DaGFuZ2Vbcm91dGluZ10oKSAtPiB2b2lkOgpwcm9wb3NlQWRtaW5DaGFuZ2U6CiAgICBieXRlY18yIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjM0LTYzOQogICAgLy8gcHVibGljIHByb3Bvc2VBZG1pbkNoYW5nZSgKICAgIC8vICAgZ3JvdXBJZDogdWludDY0LAogICAgLy8gICBjaGFuZ2U6IEFkbWluQ2hhbmdlLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBkaWcgMQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMjQgLy8gMTI0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGF0IGluZGV4IDIgb2YgKHVpbnQ2NCx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ4WzMyXSx1aW50NjQsKGxlbit1dGY4W10pLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpCiAgICBkaWcgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyNiAvLyAxMjYKICAgICsKICAgIGRpZyAyCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCB0dXBsZSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCA1IG9mICh1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSx1aW50OFszMl0sdWludDY0LChsZW4rdXRmOFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBkaWcgMwogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFkbWluQ2hhbmdlCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDAKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDEKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDQKICAgIC8vIHRoaXMuX2Fzc2VydE1lbWJlcihncm91cElkKQogICAgZGlnIDMKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0TWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQ1CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDUKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQ1LTY0NgogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIHN3YXAKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQ2CiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBidG9pCiAgICBhc3NlcnQgLy8gZ3JvdXAgZGlzYWJsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NDcKICAgIC8vIHRoaXMuX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZShjaGFuZ2UuY2hhbmdlVHlwZSwgZ3JvdXApCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMyNQogICAgLy8gaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQ1JFQVRFX0dST1VQKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlANgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjYKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkID49IFVpbnQ2NCgxKSwgJ3RocmVzaG9sZCA+PSAxJykKICAgIGRpZyAyCiAgICBkdXAKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gdGhyZXNob2xkID49IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzI3CiAgICAvLyBhc3NlcnQoY2hhbmdlLm1lbWJlckFkZHIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2ZpcnN0IG1lbWJlciByZXF1aXJlZCcpCiAgICBkdXAKICAgIGV4dHJhY3QgMTggMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBmaXJzdCBtZW1iZXIgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzI4CiAgICAvLyBhc3NlcnQoY2hhbmdlLmFsbG93ZWRBY3Rpb25zIDw9IEFDVF9BTEwsICdpbnZhbGlkIGFjdGlvbnMnKQogICAgZHVwCiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA2MyAvLyA2MwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIGFjdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzI5CiAgICAvLyBhc3NlcnQoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyA8PSBQUklWX0FMTCwgJ2ludmFsaWQgcHJpdmlsZWdlcycpCiAgICBkdXAKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDcgLy8gNwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHByaXZpbGVnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzMwCiAgICAvLyBhc3NlcnQoY2hhbmdlLmNvb2xkb3duUm91bmRzIDw9IE1BWF9DT09MRE9XTl9ST1VORFMsICdjb29sZG93biB0b28gbGFyZ2UnKQogICAgcHVzaGludCAxMDggLy8gMTA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50YyA0IC8vIDEwMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIGNvb2xkb3duIHRvbyBsYXJnZQoKcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjUwCiAgICAvLyBjb25zdCBwaWQgPSB0aGlzLl9uZXdQcm9wb3NhbChncm91cElkLCBQVF9BRE1JTiwgZXhwaXJ5Um91bmQpCiAgICBkaWcgMwogICAgcHVzaGludCA1IC8vIDUKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9uZXdQcm9wb3NhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY1MQogICAgLy8gdGhpcy5hZG1pblBheWxvYWRzKHBpZCkudmFsdWUgPSBjbG9uZShjaGFuZ2UpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBhZG1pblBheWxvYWRzID0gQm94TWFwPHVpbnQ2NCwgQWRtaW5DaGFuZ2U+KHsga2V5UHJlZml4OiAnZHAnIH0pCiAgICBieXRlYyAyMCAvLyAiZHAiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjUxCiAgICAvLyB0aGlzLmFkbWluUGF5bG9hZHMocGlkKS52YWx1ZSA9IGNsb25lKGNoYW5nZSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgNAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNC02MzkKICAgIC8vIHB1YmxpYyBwcm9wb3NlQWRtaW5DaGFuZ2UoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgY2hhbmdlOiBBZG1pbkNoYW5nZSwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMzMQogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0FERF9NRU1CRVIpIHsKICAgIGRpZyA0CiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzIKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzMyCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzMKICAgIC8vIGFzc2VydChjaGFuZ2UubWVtYmVyQWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnbWVtYmVyIHJlcXVpcmVkJykKICAgIGR1cAogICAgZXh0cmFjdCAxOCAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIG1lbWJlciByZXF1aXJlZAoKcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMjk6CiAgICBidXJ5IDMKICAgIGIgcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMzAKCnByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzM0CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fUkVNT1ZFX01FTUJFUikgewogICAgZGlnIDQKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzUKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzM1CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyOQoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzM2CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQ0hBTkdFX1RIUkVTSE9MRCkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzcKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzM3CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMzgKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkID49IFVpbnQ2NCgxKSwgJ3RocmVzaG9sZCA+PSAxJykKICAgIGR1cAogICAgcHVzaGludCA2MCAvLyA2MAogICAgZXh0cmFjdF91aW50NjQKICAgIGFzc2VydCAvLyB0aHJlc2hvbGQgPj0gMQogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyOQoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzM5CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BPTElDWSkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDAKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQwCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDEKICAgIC8vIGFzc2VydChjaGFuZ2UuYWxsb3dlZEFjdGlvbnMgPD0gQUNUX0FMTCwgJ2ludmFsaWQgYWN0aW9ucycpCiAgICBkdXAKICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDYzIC8vIDYzCiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgYWN0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDIKICAgIC8vIGFzc2VydChjaGFuZ2UuY29vbGRvd25Sb3VuZHMgPD0gTUFYX0NPT0xET1dOX1JPVU5EUywgJ2Nvb2xkb3duIHRvbyBsYXJnZScpCiAgICBkdXAKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGMgNCAvLyAxMDAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBjb29sZG93biB0b28gbGFyZ2UKICAgIGIgcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMjkKCnByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM0MwogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QUklWSUxFR0VTKSB7CiAgICBkaWcgNAogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM0NAogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGRpZyAyCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDQKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzQ1CiAgICAvLyBhc3NlcnQoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyA8PSBQUklWX0FMTCwgJ2ludmFsaWQgcHJpdmlsZWdlcycpCiAgICBkaWcgMQogICAgcHVzaGludCA2OCAvLyA2OAogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgNyAvLyA3CiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgcHJpdmlsZWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDcKICAgIC8vICF0aGlzLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZSwgY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKSksCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGNhbGxzdWIgX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4KICAgIHBvcAogICAgc3dhcAogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNDYtMTM0OQogICAgLy8gYXNzZXJ0KAogICAgLy8gICAhdGhpcy5fd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2UsIGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkpLAogICAgLy8gICAnbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4nLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIG11c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDI5Cgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTAKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfQUNUSVZFKSB7CiAgICBkaWcgNAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM1MQogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGRpZyAyCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTEKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzUzCiAgICAvLyAhdGhpcy5fd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2UsIGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkpLAogICAgYm94X2dldAogICAgcG9wCiAgICBjYWxsc3ViIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluCiAgICBwb3AKICAgIHN3YXAKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzUyLTEzNTUKICAgIC8vIGFzc2VydCgKICAgIC8vICAgIXRoaXMuX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlLCBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpKSwKICAgIC8vICAgJ211c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBtdXN0IGtlZXAgYXQgbGVhc3Qgb25lIGFjdGl2ZSBncm91cCBhZG1pbgogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyOQoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzU2CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQUREX1JFS0VZRURfQUREUikgewogICAgZGlnIDQKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTcKICAgIC8vIGFzc2VydChjaGFuZ2UubWVtYmVyQWRkciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnYWRkcmVzcyByZXF1aXJlZCcpCiAgICBkaWcgMgogICAgZXh0cmFjdCAxOCAzMgogICAgZHVwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYWRkcmVzcyByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgOSAvLyAiciIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTgKICAgIC8vIGFzc2VydCghdGhpcy5yZWtleWVkQWRkcmVzc2VzKGNoYW5nZS5tZW1iZXJBZGRyKS5leGlzdHMsICdhbHJlYWR5IHJlZ2lzdGVyZWQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSByZWdpc3RlcmVkCgpwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIGRpZyAyCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDI5Cgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNTkKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9SRU1PVkVfUkVLRVlFRF9BRERSKSB7CiAgICBkaWcgNAogICAgcHVzaGludCA5IC8vIDkKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM2MAogICAgLy8gYXNzZXJ0KHRoaXMucmVrZXllZEFkZHJlc3NlcyhjaGFuZ2UubWVtYmVyQWRkcikuZXhpc3RzLCAnbm90IHJlZ2lzdGVyZWQnKQogICAgZGlnIDIKICAgIGV4dHJhY3QgMTggMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTQKICAgIC8vIHJla2V5ZWRBZGRyZXNzZXMgPSBCb3hNYXA8QWNjb3VudCwgUmVrZXllZEFkZHJlc3M+KHsga2V5UHJlZml4OiAncicgfSkKICAgIGJ5dGVjIDkgLy8gInIiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzYwCiAgICAvLyBhc3NlcnQodGhpcy5yZWtleWVkQWRkcmVzc2VzKGNoYW5nZS5tZW1iZXJBZGRyKS5leGlzdHMsICdub3QgcmVnaXN0ZXJlZCcpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgcmVnaXN0ZXJlZAogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyMwoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzYxCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BBVVNFRCkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgID09CiAgICBhc3NlcnQgLy8gdW5rbm93biBjaGFuZ2UgdHlwZQogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuYXBwcm92ZVByb3Bvc2FsW3JvdXRpbmddKCkgLT4gdm9pZDoKYXBwcm92ZVByb3Bvc2FsOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2OQogICAgLy8gcHVibGljIGFwcHJvdmVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGV4cGVjdGVkUGF5bG9hZFZlcnNpb246IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcwCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBhcHByb3ZlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcxCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmFwcHJvdmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjczCiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZGlnIDIKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ4CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3MwogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA3CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3NAogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBhcHByb3ZhYmxlJykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IGFwcHJvdmVQcm9wb3NhbF9ib29sX3RydWVANQogICAgZGlnIDMKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogYXBwcm92ZVByb3Bvc2FsX2Jvb2xfZmFsc2VANgoKYXBwcm92ZVByb3Bvc2FsX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFwcHJvdmVQcm9wb3NhbF9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc0CiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAnbm90IGFwcHJvdmFibGUnKQogICAgYXNzZXJ0IC8vIG5vdCBhcHByb3ZhYmxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc1CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDw9IHByb3Bvc2FsLmV4cGlyeVJvdW5kLCAncHJvcG9zYWwgZXhwaXJlZCcpCiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIHByb3Bvc2FsIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzYKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBwcm9wb3NhbC5ncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc2CiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IGEgZ3JvdXAgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc3CiAgICAvLyBhc3NlcnQoIXRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdhbHJlYWR5IGFwcHJvdmVkJykKICAgIGRpZyA3CiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDkKICAgIC8vIGFwcHJvdmFscyA9IEJveE1hcDx7IHByb3Bvc2FsSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBBcHByb3ZhbD4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgYnl0ZWMgMjEgLy8gImEiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzcKICAgIC8vIGFzc2VydCghdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ2FscmVhZHkgYXBwcm92ZWQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBhcHByb3ZlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzkKICAgIC8vIHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlLm1lbWJlcnNoaXBFcG9jaCA9PT0gcHJvcG9zYWwuZXBvY2hBdENyZWF0aW9uLAogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDg4IC8vIDg4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzgtNjgxCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlLm1lbWJlcnNoaXBFcG9jaCA9PT0gcHJvcG9zYWwuZXBvY2hBdENyZWF0aW9uLAogICAgLy8gICAnZ3JvdXAgbWVtYmVyc2hpcCBjaGFuZ2VkIHNpbmNlIHByb3Bvc2FsIGNyZWF0aW9uJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBncm91cCBtZW1iZXJzaGlwIGNoYW5nZWQgc2luY2UgcHJvcG9zYWwgY3JlYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODIKICAgIC8vIGFzc2VydChwcm9wb3NhbC5wYXlsb2FkVmVyc2lvbiA9PT0gZXhwZWN0ZWRQYXlsb2FkVmVyc2lvbiwgJ3BheWxvYWQgY2hhbmdlZCBzaW5jZSByZXZpZXcnKQogICAgZHVwCiAgICBwdXNoaW50IDk2IC8vIDk2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bG9hZCBjaGFuZ2VkIHNpbmNlIHJldmlldwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4NAogICAgLy8gdGhpcy5fcmVjb3JkQXBwcm92YWwocHJvcG9zYWxJZCwgcHJvcG9zYWwpCiAgICBkaWcgMwogICAgc3dhcAogICAgY2FsbHN1YiBfcmVjb3JkQXBwcm92YWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2OQogICAgLy8gcHVibGljIGFwcHJvdmVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGV4cGVjdGVkUGF5bG9hZFZlcnNpb246IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYXBwcm92ZVByb3Bvc2FsX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIGFwcHJvdmVQcm9wb3NhbF9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmV4ZWN1dGVQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmV4ZWN1dGVQcm9wb3NhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODgKICAgIC8vIHB1YmxpYyBleGVjdXRlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODkKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGV4ZWN1dGVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTAKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTIKICAgIC8vIHRoaXMuX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsKHByb3Bvc2FsSWQpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODgKICAgIC8vIHB1YmxpYyBleGVjdXRlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5jYW5jZWxQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNhbmNlbFByb3Bvc2FsOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgYnl0ZWNfMiAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5NgogICAgLy8gcHVibGljIGNhbmNlbFByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njk3CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBjYW5jZWxQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTgKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKY2FuY2VsUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwMAogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGRpZyAxCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDYgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzAwCiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDYKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzAxCiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAnbm90IGNhbmNlbGxhYmxlJykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IGNhbmNlbFByb3Bvc2FsX2Jvb2xfdHJ1ZUA1CiAgICBkaWcgMgogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBjYW5jZWxQcm9wb3NhbF9ib29sX2ZhbHNlQDYKCmNhbmNlbFByb3Bvc2FsX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmNhbmNlbFByb3Bvc2FsX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDEKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdub3QgY2FuY2VsbGFibGUnKQogICAgYXNzZXJ0IC8vIG5vdCBjYW5jZWxsYWJsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwMgogICAgLy8gY29uc3QgaXNQcm9wb3NlciA9IFR4bi5zZW5kZXIgPT09IHByb3Bvc2FsLnByb3Bvc2VyCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0IDQ4IDMyCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwMwogICAgLy8gY29uc3QgaXNNZW1iZXIgPSB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBwcm9wb3NhbC5ncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cwogICAgc3dhcAogICAgZXh0cmFjdCAwIDgKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NwogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDMKICAgIC8vIGNvbnN0IGlzTWVtYmVyID0gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwNAogICAgLy8gYXNzZXJ0KGlzUHJvcG9zZXIgfHwgaXNNZW1iZXIsICdub3QgYXV0aG9yaXNlZCB0byBjYW5jZWwnKQogICAgfHwKICAgIGFzc2VydCAvLyBub3QgYXV0aG9yaXNlZCB0byBjYW5jZWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDYKICAgIC8vIHByb3Bvc2FsLnN0YXR1cyA9IFNUQVRVU19DQU5DRUxMRUQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzA2LTcwNwogICAgLy8gcHJvcG9zYWwuc3RhdHVzID0gU1RBVFVTX0NBTkNFTExFRAogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUgPSBjbG9uZShwcm9wb3NhbCkKICAgIGRpZyA2CiAgICBpbnRjXzIgLy8gOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwOAogICAgLy8gZW1pdDxQcm9wb3NhbENhbmNlbGxlZD4oeyBwcm9wb3NhbElkIH0pCiAgICBwdXNoYnl0ZXMgMHhhZTJhYmMwNiAvLyBtZXRob2QgIlByb3Bvc2FsQ2FuY2VsbGVkKHVpbnQ2NCkiCiAgICBkaWcgNQogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTYKICAgIC8vIHB1YmxpYyBjYW5jZWxQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNhbmNlbFByb3Bvc2FsX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIGNhbmNlbFByb3Bvc2FsX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUucHJ1bmVQcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBydW5lUHJvcG9zYWw6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18yIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTgKICAgIC8vIHB1YmxpYyBwcnVuZVByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzE5CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcyMAogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjIKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBkaWcgMQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDgKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA2IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjIKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjMKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19FWEVDVVRFRCB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19DQU5DRUxMRUQsICdwcm9wb3NhbCBub3QgdGVybWluYWwnKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNAogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBibnogcHJ1bmVQcm9wb3NhbF9ib29sX3RydWVANQogICAgZGlnIDIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYnogcHJ1bmVQcm9wb3NhbF9ib29sX2ZhbHNlQDYKCnBydW5lUHJvcG9zYWxfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKcHJ1bmVQcm9wb3NhbF9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzIzCiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfRVhFQ1VURUQgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQ0FOQ0VMTEVELCAncHJvcG9zYWwgbm90IHRlcm1pbmFsJykKICAgIGFzc2VydCAvLyBwcm9wb3NhbCBub3QgdGVybWluYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjQKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPiBwcm9wb3NhbC5leHBpcnlSb3VuZCwgJ25vdCB5ZXQgZXhwaXJlZCcpCiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA+CiAgICBhc3NlcnQgLy8gbm90IHlldCBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzI1CiAgICAvLyB0aGlzLl9hc3NlcnRNZW1iZXIocHJvcG9zYWwuZ3JvdXBJZCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9hc3NlcnRNZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjcKICAgIC8vIGlmIChwcm9wb3NhbC5wYXlsb2FkVHlwZSA9PT0gUFRfVFJBTlNBQ1RJT05fR1JPVVApIHsKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IHBydW5lUHJvcG9zYWxfZWxzZV9ib2R5QDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzI4CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IHByb3Bvc2FsLm51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgIGJ1cnkgNAoKcHJ1bmVQcm9wb3NhbF93aGlsZV90b3BAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MjgKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gcHJvcG9zYWwubnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBkaWcgNAogICAgcHVzaGludCA4MCAvLyA4MAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyA0CiAgICA+PQogICAgYnogcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzI5CiAgICAvLyBjb25zdCBrZXk6IHVpbnQ2NCA9IHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwCiAgICBkaWcgMQogICAgcHVzaGludCA3IC8vIDcKICAgICoKICAgIGRpZyA0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzMwCiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1MQogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTEgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzAKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjczMQogICAgLy8gdGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmRlbGV0ZSgpCiAgICBkaWcgNwogICAgYm94X2RlbAogICAgcG9wCgpwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzI4CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IHByb3Bvc2FsLm51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKICAgIGIgcHJ1bmVQcm9wb3NhbF93aGlsZV90b3BAOQoKcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjczNwogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkuZGVsZXRlKCkKICAgIGRpZyA4CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTgKICAgIC8vIHB1YmxpYyBwcnVuZVByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcHJ1bmVQcm9wb3NhbF9lbHNlX2JvZHlAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBhZG1pblBheWxvYWRzID0gQm94TWFwPHVpbnQ2NCwgQWRtaW5DaGFuZ2U+KHsga2V5UHJlZml4OiAnZHAnIH0pCiAgICBieXRlYyAyMCAvLyAiZHAiCiAgICBkaWcgNgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjczNAogICAgLy8gfSBlbHNlIGlmICh0aGlzLmFkbWluUGF5bG9hZHMocHJvcG9zYWxJZCkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjczNQogICAgLy8gdGhpcy5hZG1pblBheWxvYWRzKHByb3Bvc2FsSWQpLmRlbGV0ZSgpCiAgICBkaWcgNgogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxNwoKcHJ1bmVQcm9wb3NhbF9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcnVuZVByb3Bvc2FsX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0Q29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0Q29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0NAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDYKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGdldENvbmZpZ19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDcKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0Q29uZmlnX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTAKICAgIC8vIHRoaXMubmFtZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzMyCiAgICAvLyBuYW1lID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogJ25hbWUnIH0pCiAgICBieXRlYyAyNCAvLyAibmFtZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTAKICAgIC8vIHRoaXMubmFtZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzUxCiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWMgNSAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTEKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzUyCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzUKICAgIC8vIG5leHRHcm91cElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25naWQnIH0pCiAgICBieXRlYyA4IC8vICJuZ2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1MgogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzUzCiAgICAvLyB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzYKICAgIC8vIG5leHRQcm9wb3NhbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25waWQnIH0pCiAgICBieXRlYyAxMyAvLyAibnBpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTMKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1NAogICAgLy8gdGhpcy5wYXVzZWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzOAogICAgLy8gcGF1c2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3BhdXNlZCcgfSkKICAgIGJ5dGVjIDEwIC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzU0CiAgICAvLyB0aGlzLnBhdXNlZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzOQogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICd2ZXInIH0pCiAgICBieXRlYyAyNSAvLyAidmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDktNzU2CiAgICAvLyByZXR1cm4gWwogICAgLy8gICB0aGlzLm5hbWUudmFsdWUsCiAgICAvLyAgIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSwKICAgIC8vICAgdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSwKICAgIC8vICAgdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSwKICAgIC8vICAgdGhpcy5wYXVzZWQudmFsdWUsCiAgICAvLyAgIHRoaXMudmVyc2lvbi52YWx1ZSwKICAgIC8vIF0KICAgIGRpZyA1CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzYgLy8gMzYKICAgICsKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAyNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQ0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldFNpZ25lckdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0U2lnbmVyR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzU5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2MQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0U2lnbmVyR3JvdXBfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzYyCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldFNpZ25lckdyb3VwX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjQKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGRpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2NAogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0UHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRQcm9wb3NhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzY5CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzAKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0UHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc3MgogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDgKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA2IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzcyCiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5nZXRUcmFuc2FjdGlvbkdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0VHJhbnNhY3Rpb25Hcm91cDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzc3CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc3OAogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpnZXRUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODAKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlKQogICAgZGlnIDIKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1MQogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTEgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4MAogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMocHJvcG9zYWxJZCAqIFRYR19LRVlfTVVMVCArIHBheWxvYWRJbmRleCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc3NQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5nZXRNZW1iZXJbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRNZW1iZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzgzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4NQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0TWVtYmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4NgogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpnZXRNZW1iZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQgfSkudmFsdWUpCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NwogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODgKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50IH0pLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuaXNNZW1iZXJbcm91dGluZ10oKSAtPiB2b2lkOgppc01lbWJlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzkzCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBpc01lbWJlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTQKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKaXNNZW1iZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5NgogICAgLy8gcmV0dXJuIHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQgfSkuZXhpc3RzCiAgICBkaWcgMgogICAgaXRvYgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NwogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTYKICAgIC8vIHJldHVybiB0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50IH0pLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzkxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDIyIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuaGFzQXBwcm92ZWRbcm91dGluZ10oKSAtPiB2b2lkOgpoYXNBcHByb3ZlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODAxCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBoYXNBcHByb3ZlZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDIKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKaGFzQXBwcm92ZWRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgwNAogICAgLy8gcmV0dXJuIHRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudCB9KS5leGlzdHMKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ5CiAgICAvLyBhcHByb3ZhbHMgPSBCb3hNYXA8eyBwcm9wb3NhbElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgQXBwcm92YWw+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDIxIC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODA0CiAgICAvLyByZXR1cm4gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50IH0pLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzk5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDIyIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRBY3RpdmVQcml2R3JvdXBDb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODEwCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRBY3RpdmVQcml2R3JvdXBDb3VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MTEKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgxMwogICAgLy8gcmV0dXJuIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MTMKICAgIC8vIHJldHVybiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgwOAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpdG9iCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5pc1Jla2V5ZWRBZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKaXNSZWtleWVkQWRkcmVzczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MTYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODE4CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBpc1Jla2V5ZWRBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgxOQogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0Cgppc1Jla2V5ZWRBZGRyZXNzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTQKICAgIC8vIHJla2V5ZWRBZGRyZXNzZXMgPSBCb3hNYXA8QWNjb3VudCwgUmVrZXllZEFkZHJlc3M+KHsga2V5UHJlZml4OiAncicgfSkKICAgIGJ5dGVjIDkgLy8gInIiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODIxCiAgICAvLyByZXR1cm4gdGhpcy5yZWtleWVkQWRkcmVzc2VzKGFjY291bnQpLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODE2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDIyIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0UmVrZXllZEFkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRSZWtleWVkQWRkcmVzczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODI2CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRSZWtleWVkQWRkcmVzc19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjcKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0UmVrZXllZEFkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgOSAvLyAiciIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjkKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLnJla2V5ZWRBZGRyZXNzZXMoYWNjb3VudCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyNAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYXNzZXJ0TWVtYmVyKGdyb3VwSWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2Fzc2VydE1lbWJlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzYKICAgIC8vIHByaXZhdGUgX2Fzc2VydE1lbWJlcihncm91cElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzNwogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGdyb3VwSWQpLmV4aXN0cywgJ2dyb3VwIG5vdCBmb3VuZCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDYKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzNwogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGdyb3VwSWQpLmV4aXN0cywgJ2dyb3VwIG5vdCBmb3VuZCcpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzgKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM4CiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IGEgZ3JvdXAgbWVtYmVyCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbChwcm9wb3NhbElkOiB1aW50NjQpIC0+IHZvaWQ6Cl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDkKICAgIC8vIHByaXZhdGUgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsKHByb3Bvc2FsSWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzOAogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAzOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1MAogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ4CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODUwCiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODUxCiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdub3QgcmVhZHkgdG8gZXhlY3V0ZScpCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gbm90IHJlYWR5IHRvIGV4ZWN1dGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTIKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPD0gcHJvcG9zYWwuZXhwaXJ5Um91bmQsICdwcm9wb3NhbCBleHBpcmVkJykKICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDEKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIHByb3Bvc2FsIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTQKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMocHJvcG9zYWwuZ3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODU0CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1NC04NTUKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMocHJvcG9zYWwuZ3JvdXBJZCkudmFsdWUpCiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBkdXAKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODU1CiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBidG9pCiAgICBhc3NlcnQgLy8gZ3JvdXAgZGlzYWJsZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjAKICAgIC8vIGNvbnN0IHJlcXVpcmVkVGhyZXNob2xkOiB1aW50NjQgPSBwcm9wb3NhbC50aHJlc2hvbGQgPj0gZ3JvdXAudGhyZXNob2xkID8gcHJvcG9zYWwudGhyZXNob2xkIDogZ3JvdXAudGhyZXNob2xkCiAgICBzd2FwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgPj0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDIKICAgIGZyYW1lX2RpZyA4MwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjEKICAgIC8vIGFzc2VydChwcm9wb3NhbC5hcHByb3ZhbHNDb3VudCA+PSByZXF1aXJlZFRocmVzaG9sZCwgJ3RocmVzaG9sZCBub3QgbWV0JykKICAgIGZyYW1lX2RpZyA4MAogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgYXNzZXJ0IC8vIHRocmVzaG9sZCBub3QgbWV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODY2CiAgICAvLyBhc3NlcnQoZ3JvdXAubWVtYmVyc2hpcEVwb2NoID09PSBwcm9wb3NhbC5lcG9jaEF0Q3JlYXRpb24sICdncm91cCBtZW1iZXJzaGlwIGNoYW5nZWQgc2luY2UgcHJvcG9zYWwgY3JlYXRpb24nKQogICAgZnJhbWVfZGlnIDgxCiAgICBwdXNoaW50IDEwNiAvLyAxMDYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDEKICAgIHB1c2hpbnQgODggLy8gODgKICAgIGV4dHJhY3RfdWludDY0CiAgICA9PQogICAgYXNzZXJ0IC8vIGdyb3VwIG1lbWJlcnNoaXAgY2hhbmdlZCBzaW5jZSBwcm9wb3NhbCBjcmVhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2OAogICAgLy8gaWYgKHByb3Bvc2FsLnBheWxvYWRUeXBlID09PSBQVF9UUkFOU0FDVElPTl9HUk9VUCkgewogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODczCiAgICAvLyBhc3NlcnQodGhpcy5wYXVzZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ3NhZmUgcGF1c2VkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBwYXVzZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGF1c2VkJyB9KQogICAgYnl0ZWMgMTAgLy8gInBhdXNlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NzMKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBzYWZlIHBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4MwogICAgLy8gaWYgKGdyb3VwLmNvb2xkb3duUm91bmRzICE9PSBVaW50NjQoMCkgJiYgZ3JvdXAubGFzdEV4ZWN1dGlvblJvdW5kICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyA4MQogICAgcHVzaGludCA5MCAvLyA5MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjgKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDcKICAgIGZyYW1lX2RpZyA4MQogICAgcHVzaGludCA5OCAvLyA5OAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjkKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODQKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPj0gZ3JvdXAubGFzdEV4ZWN1dGlvblJvdW5kICsgZ3JvdXAuY29vbGRvd25Sb3VuZHMsICdncm91cCBjb29sZG93biBub3QgZWxhcHNlZCcpCiAgICBnbG9iYWwgUm91bmQKICAgIGZyYW1lX2RpZyA2OQogICAgZnJhbWVfZGlnIDY4CiAgICArCiAgICA+PQogICAgYXNzZXJ0IC8vIGdyb3VwIGNvb2xkb3duIG5vdCBlbGFwc2VkCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4NgogICAgLy8gdGhpcy5fZXhlY3V0ZVRyYW5zYWN0aW9uR3JvdXAocHJvcG9zYWxJZCwgcHJvcG9zYWwuZ3JvdXBJZCwgZ3JvdXAsIHByb3Bvc2FsLm51bVBheWxvYWRzKQogICAgZnJhbWVfZGlnIDgwCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSA1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3NAogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBudW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDU3CiAgICBmcmFtZV9kaWcgODIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMwogICAgZnJhbWVfYnVyeSAyNAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEA3MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzQKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTcKICAgIGZyYW1lX2RpZyA1NgogICAgPD0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzUKICAgIC8vIGNvbnN0IGtleTogdWludDY0ID0gcHJvcG9zYWxJZCAqIFRYR19LRVlfTVVMVCArIHAKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA3IC8vIDcKICAgICoKICAgIGZyYW1lX2RpZyA1NwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3NgogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIHRyYW5zYWN0aW9uR3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2FmZVR4bkdyb3VwPih7IGtleVByZWZpeDogJ3R4ZycgfSkKICAgIGJ5dGVjIDExIC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3NgogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9pZl9ib2R5QDcyCiAgICBmcmFtZV9kaWcgMjMKICAgIGZyYW1lX2J1cnkgMjUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzQKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDU3CiAgICBmcmFtZV9kaWcgMjUKICAgIGZyYW1lX2J1cnkgMjMKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEA3MAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2lmX2JvZHlANzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTc3CiAgICAvLyBjb25zdCBwYXlsb2FkID0gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLnZhbHVlKQogICAgZnJhbWVfZGlnIDE2CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDI4CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3OAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNDkKICAgIGZyYW1lX2RpZyAyMwogICAgZnJhbWVfYnVyeSAyNQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEA3MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzctOTc4CiAgICAvLyBjb25zdCBwYXlsb2FkID0gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLnZhbHVlKQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDE2CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTc4CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNDkKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3OS05ODAKICAgIC8vIGNvbnN0IGVudHJ5ID0gY2xvbmUocGF5bG9hZFtpXSkKICAgIC8vIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1BBWU1FTlQpIHsKICAgIGludGNfMyAvLyAyCiAgICBmcmFtZV9kaWcgNDkKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBmcmFtZV9kaWcgMTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5ODAKICAgIC8vIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1BBWU1FTlQpIHsKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2NwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDgzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTgxCiAgICAvLyBjb25zdCB0eCA9IGRlY29kZUFyYzQ8UGF5bWVudFR4bj4oZW50cnkuZGF0YSkKICAgIGZyYW1lX2RpZyAyOAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA0OQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExODEKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfUEFZKSAhPT0gVWludDY0KDApLCAncGF5IG5vdCBhbGxvd2VkJykKICAgIGZyYW1lX2RpZyAyNAogICAgcHVzaGludCAyNiAvLyAyNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gcGF5IG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE4MgogICAgLy8gYXNzZXJ0KHR4LnJlY2VpdmVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdyZWNlaXZlciByZXF1aXJlZCcpCiAgICBkdXAKICAgIGV4dHJhY3QgMzQgMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyByZWNlaXZlciByZXF1aXJlZAogICAgcHVzaGludCA3NCAvLyA3NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExODMKICAgIC8vIGlmICh0eC5oYXNDbG9zZSAhPT0gVWludDY0KDApKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcxCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTg0CiAgICAvLyBhc3NlcnQodHguY2xvc2VSZW1haW5kZXJUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnY2xvc2UgdGFyZ2V0IHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAzCiAgICBleHRyYWN0IDgyIDMyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gY2xvc2UgdGFyZ2V0IHJlcXVpcmVkCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAyMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTg2CiAgICAvLyBsZXQgYW1vdW50OiB1aW50NjQgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQ2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTg3CiAgICAvLyBpZiAoZ3JvdXAubGltaXRBc3NldElkID09PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyA4MgogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA4MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk4OAogICAgLy8gYW1vdW50ID0gdHguaGFzQ2xvc2UgIT09IFVpbnQ2NCgwKSA/IG9wLmJhbGFuY2UodGhpcy5fcmVzb2x2ZVNlbmRlcih0eC5zZW5kZXIpKSA6IHR4LmFtb3VudAogICAgZnJhbWVfZGlnIDcxCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUA4MAogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgMiAzMgogICAgY2FsbHN1YiBfcmVzb2x2ZVNlbmRlcgogICAgYmFsYW5jZQogICAgZnJhbWVfYnVyeSA0NgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAODI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTkwCiAgICAvLyBncm91cCA9IHRoaXMuX2FjY291bnRTcGVuZChncm91cCwgYW1vdW50KQogICAgZnJhbWVfZGlnIDgyCiAgICBmcmFtZV9kaWcgNDYKICAgIGNhbGxzdWIgX2FjY291bnRTcGVuZAogICAgcG9wCiAgICBmcmFtZV9idXJ5IDgyCiAgICBmcmFtZV9kaWcgMjQKICAgIGZyYW1lX2J1cnkgMjUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDExNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzgKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA0OQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNDkKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEA3MwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VAODA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTg4CiAgICAvLyBhbW91bnQgPSB0eC5oYXNDbG9zZSAhPT0gVWludDY0KDApID8gb3AuYmFsYW5jZSh0aGlzLl9yZXNvbHZlU2VuZGVyKHR4LnNlbmRlcikpIDogdHguYW1vdW50CiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCA2NiAvLyA2NgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgNDYKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAODIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAODM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTkxCiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQVNTRVQpIHsKICAgIGZyYW1lX2RpZyA2NwogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDk2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTkyCiAgICAvLyBjb25zdCB0eCA9IGRlY29kZUFyYzQ8QXNzZXRUeG4+KGVudHJ5LmRhdGEpCiAgICBmcmFtZV9kaWcgMjgKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNDkKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTg5CiAgICAvLyBhc3NlcnQoKGdyb3VwLmFsbG93ZWRBY3Rpb25zICYgQUNUX0FYRkVSKSAhPT0gVWludDY0KDApLCAnYXhmZXIgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18zIC8vIDIKICAgICYKICAgIGFzc2VydCAvLyBheGZlciBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTAKICAgIC8vIGFzc2VydCh0eC5hc3NldFJlY2VpdmVyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdhc3NldCByZWNlaXZlciByZXF1aXJlZCcpCiAgICBkdXAKICAgIGV4dHJhY3QgNDIgMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhc3NldCByZWNlaXZlciByZXF1aXJlZAogICAgcHVzaGludCA4MiAvLyA4MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTEKICAgIC8vIGlmICh0eC5oYXNBc3NldENsb3NlICE9PSBVaW50NjQoMCkpIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzEKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDIxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTIKICAgIC8vIGFzc2VydCh0eC5hc3NldENsb3NlVG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2Fzc2V0IGNsb3NlIHRhcmdldCByZXF1aXJlZCcpCiAgICBmcmFtZV9kaWcgOQogICAgZXh0cmFjdCA5MCAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0IGNsb3NlIHRhcmdldCByZXF1aXJlZAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk5NAogICAgLy8gY29uc3QgdHJhY2tlZCA9IGdyb3VwLmxpbWl0QXNzZXRJZCAhPT0gVWludDY0KDApICYmIHR4LnhmZXJBc3NldCA9PT0gZ3JvdXAubGltaXRBc3NldElkCiAgICBmcmFtZV9kaWcgODIKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzYKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX2ZhbHNlQDg5CiAgICBmcmFtZV9kaWcgOQogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyA3NgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX2ZhbHNlQDg5CiAgICBpbnRjXzEgLy8gMQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Jvb2xfbWVyZ2VAOTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTk3CiAgICAvLyBsZXQgYW1vdW50OiB1aW50NjQgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQ3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTk4CiAgICAvLyBpZiAodHJhY2tlZCkgewogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5OTkKICAgIC8vIGlmICh0eC5oYXNBc3NldENsb3NlICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyA3MQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA5MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDAKICAgIC8vIGNvbnN0IFtiYWxdID0gb3AuQXNzZXRIb2xkaW5nLmFzc2V0QmFsYW5jZSh0aGlzLl9yZXNvbHZlU2VuZGVyKHR4LnNlbmRlciksIHR4LnhmZXJBc3NldCkKICAgIGZyYW1lX2RpZyA5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAzMgogICAgY2FsbHN1YiBfcmVzb2x2ZVNlbmRlcgogICAgc3dhcAogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICBmcmFtZV9idXJ5IDQ3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDA2CiAgICAvLyBncm91cCA9IHRoaXMuX2FjY291bnRTcGVuZChncm91cCwgYW1vdW50KQogICAgZnJhbWVfZGlnIDgyCiAgICBmcmFtZV9kaWcgNDcKICAgIGNhbGxzdWIgX2FjY291bnRTcGVuZAogICAgcG9wCiAgICBmcmFtZV9idXJ5IDgyCiAgICBmcmFtZV9kaWcgMjQKICAgIGZyYW1lX2J1cnkgMjUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTE2CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDkzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDMKICAgIC8vIGFtb3VudCA9IHR4LmFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgOQogICAgcHVzaGludCA3NCAvLyA3NAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgNDcKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOTUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX2ZhbHNlQDg5OgogICAgaW50Y18wIC8vIDAKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Jvb2xfbWVyZ2VAOTAKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAOTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAwNwogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0FQUCkgewogICAgZnJhbWVfZGlnIDY3CiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAwOAogICAgLy8gY29uc3QgdHggPSBkZWNvZGVBcmM0PEFwcFR4bj4oZW50cnkuZGF0YSkKICAgIGZyYW1lX2RpZyAyOAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA0OQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE5NwogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9BUFBMKSAhPT0gVWludDY0KDApLCAnYXBwbCBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgMjQKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDQgLy8gNAogICAgJgogICAgYXNzZXJ0IC8vIGFwcGwgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTk4CiAgICAvLyBhc3NlcnQodHguYXBwSWQgIT09IFVpbnQ2NCgwKSwgJ2FwcElkIHJlcXVpcmVkJykgLy8gY3JlYXRlL3VwZGF0ZSBuZWVkIHByb2dyYW1zIGFuZCBhcmUgbm90IHN1cHBvcnRlZCBoZXJlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGFzc2VydCAvLyBhcHBJZCByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMDMKICAgIC8vIGFzc2VydCh0eC5hcHBJZCAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLmlkLCAnc2VsZi1jYWxsIG5vdCBhbGxvd2VkJykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgIT0KICAgIGFzc2VydCAvLyBzZWxmLWNhbGwgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjA0CiAgICAvLyBhc3NlcnQodHgub25Db21wbGV0aW9uIDw9IFVpbnQ2NCg1KSwgJ2ludmFsaWQgb25Db21wbGV0aW9uJykKICAgIHN3YXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8PQogICAgYXNzZXJ0IC8vIGludmFsaWQgb25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIwNQogICAgLy8gYXNzZXJ0KHR4Lm9uQ29tcGxldGlvbiAhPT0gVWludDY0KDQpLCAnYXBwIHVwZGF0ZSBub3Qgc3VwcG9ydGVkJykKICAgIHB1c2hpbnQgNCAvLyA0CiAgICAhPQogICAgYXNzZXJ0IC8vIGFwcCB1cGRhdGUgbm90IHN1cHBvcnRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMDYKICAgIC8vIGNvbnN0IG51bUFyZ3MgPSBVaW50NjQodHguYXBwQXJncy5sZW5ndGgpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjA3CiAgICAvLyBjb25zdCBudW1BY2NvdW50cyA9IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpCiAgICBkaWcgMQogICAgcHVzaGludCAyMCAvLyAyMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMDgKICAgIC8vIGNvbnN0IG51bUFwcHMgPSBVaW50NjQodHguZm9yZWlnbkFwcHMubGVuZ3RoKQogICAgZGlnIDIKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjA5CiAgICAvLyBjb25zdCBudW1Bc3NldHMgPSBVaW50NjQodHguZm9yZWlnbkFzc2V0cy5sZW5ndGgpCiAgICBkaWcgMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIxMAogICAgLy8gYXNzZXJ0KG51bUFyZ3MgPD0gTUFYX0FQUF9BUkdTLCAndG9vIG1hbnkgYXBwIGFyZ3MnKQogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IGFwcCBhcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIxMQogICAgLy8gYXNzZXJ0KG51bUFjY291bnRzIDw9IE1BWF9BUFBfQUNDT1VOVFMsICd0b28gbWFueSBhY2NvdW50cycpCiAgICBkaWcgMgogICAgcHVzaGludCA0IC8vIDQKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgYWNjb3VudHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjEyCiAgICAvLyBhc3NlcnQobnVtQXBwcyA8PSBNQVhfQVBQX0ZPUkVJR05fQVBQUywgJ3RvbyBtYW55IGZvcmVpZ24gYXBwcycpCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgZm9yZWlnbiBhcHBzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIxMwogICAgLy8gYXNzZXJ0KG51bUFzc2V0cyA8PSBNQVhfQVBQX0ZPUkVJR05fQVNTRVRTLCAndG9vIG1hbnkgZm9yZWlnbiBhc3NldHMnKQogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyB0b28gbWFueSBmb3JlaWduIGFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMTQKICAgIC8vIGFzc2VydChudW1BY2NvdW50cyArIG51bUFwcHMgKyBudW1Bc3NldHMgPD0gTUFYX0FQUF9UT1RBTF9SRUZTLCAndG9vIG1hbnkgcmVmZXJlbmNlcycpCiAgICBjb3ZlciAyCiAgICArCiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyB0b28gbWFueSByZWZlcmVuY2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIxNQogICAgLy8gbGV0IHRvdGFsQXJnTGVuID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA2NQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMTYKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBudW1BcmdzOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNTAKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMjEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMTYKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBudW1BcmdzOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDUwCiAgICBmcmFtZV9kaWcgNTUKICAgIDwKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1OQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDIxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMTcKICAgIC8vIHRvdGFsQXJnTGVuID0gdG90YWxBcmdMZW4gKyB0eC5hcHBBcmdzW2ldLmxlbmd0aAogICAgZnJhbWVfZGlnIDEzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDU5CiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyA1MAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBmcmFtZV9kaWcgNjUKICAgICsKICAgIGZyYW1lX2J1cnkgNjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjE2CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbnVtQXJnczsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUwCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMjEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMjE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMTkKICAgIC8vIGFzc2VydCh0b3RhbEFyZ0xlbiA8PSBNQVhfQVBQX1RPVEFMX0FSR19MRU4sICdhcHAgYXJncyB0b3RhbCBsZW5ndGggZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDY1CiAgICBwdXNoaW50IDIwNDggLy8gMjA0OAogICAgPD0KICAgIGFzc2VydCAvLyBhcHAgYXJncyB0b3RhbCBsZW5ndGggZXhjZWVkZWQKICAgIGZyYW1lX2RpZyAyNAogICAgZnJhbWVfYnVyeSAyNQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMTYKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTAwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMTAKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9LRVlSRUcpIHsKICAgIGZyYW1lX2RpZyA2NwogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEwMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMTIKICAgIC8vIGFzc2VydCgoZ3JvdXBJbi5hbGxvd2VkQWN0aW9ucyAmIEFDVF9LRVlSRUcpICE9PSBVaW50NjQoMCksICdrZXlyZWcgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGFzc2VydCAvLyBrZXlyZWcgbm90IGFsbG93ZWQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTE2CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEwMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDEzCiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQUNGRykgewogICAgZnJhbWVfZGlnIDY3CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxNAogICAgLy8gY29uc3QgdHggPSBkZWNvZGVBcmM0PEFzc2V0Q29uZmlnVHhuPihlbnRyeS5kYXRhKQogICAgZnJhbWVfZGlnIDI4CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDQ5CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTIyMwogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9BQ0ZHKSAhPT0gVWludDY0KDApLCAnYWNmZyBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgMjQKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAmCiAgICBhc3NlcnQgLy8gYWNmZyBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMjUKICAgIC8vIHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgwKSB8fCB0eC5tZXRhZGF0YUhhc2gubGVuZ3RoID09PSBVaW50NjQoMzIpLAogICAgZHVwCiAgICBwdXNoaW50IDM4IC8vIDM4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGMgNSAvLyAxNjgKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjIKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX3RydWVAMjA3CiAgICBmcmFtZV9kaWcgNjIKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUAyMDgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX3RydWVAMjA3OgogICAgaW50Y18xIC8vIDEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX21lcmdlQDIwOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjI0LTEyMjcKICAgIC8vIGFzc2VydCgKICAgIC8vICAgdHgubWV0YWRhdGFIYXNoLmxlbmd0aCA9PT0gVWludDY0KDApIHx8IHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgzMiksCiAgICAvLyAgICdtZXRhZGF0YUhhc2ggbXVzdCBiZSAwIG9yIDMyIGJ5dGVzJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBtZXRhZGF0YUhhc2ggbXVzdCBiZSAwIG9yIDMyIGJ5dGVzCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMTI6CiAgICBmcmFtZV9kaWcgMjQKICAgIGZyYW1lX2J1cnkgMjUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTE2CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUAyMDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9tZXJnZUAyMDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMTYKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9SRUtFWSkgewogICAgZnJhbWVfZGlnIDY3CiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydCAvLyB1bmtub3duIHR4IHR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDE3CiAgICAvLyBjb25zdCB0eCA9IGRlY29kZUFyYzQ8UmVrZXlUeG4+KGVudHJ5LmRhdGEpCiAgICBmcmFtZV9kaWcgMjgKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNDkKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzEKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfUkVLRVkpICE9PSBVaW50NjQoMCksICdyZWtleSBub3QgYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgMjQKICAgIGR1cAogICAgcHVzaGludCAyNiAvLyAyNgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgICYKICAgIGFzc2VydCAvLyByZWtleSBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyMzcKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKSwgJ3Jla2V5IHJlcXVpcmVzIGdyb3VwIGFkbWluIHByaXZpbGVnZScpCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyByZWtleSByZXF1aXJlcyBncm91cCBhZG1pbiBwcml2aWxlZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjQxCiAgICAvLyBhc3NlcnQodHgucmVrZXlUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncmVrZXkgdGFyZ2V0IHJlcXVpcmVkJykKICAgIGV4dHJhY3QgMzQgMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyByZWtleSB0YXJnZXQgcmVxdWlyZWQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTEyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjYKICAgIC8vIGdyb3VwLmxhc3RFeGVjdXRpb25Sb3VuZCA9IEdsb2JhbC5yb3VuZAogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgODIKICAgIHN3YXAKICAgIHJlcGxhY2UyIDk4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyNwogICAgLy8gdGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGZyYW1lX2RpZyA4MQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI5CiAgICAvLyBsZXQgdHhJbmRleCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDMwCiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgNTgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMzAKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTgKICAgIGZyYW1lX2RpZyA1NgogICAgPD0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxNDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDMxCiAgICAvLyBjb25zdCBrZXk6IHVpbnQ2NCA9IHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBmcmFtZV9kaWcgNTgKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDMyCiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1MQogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTEgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzMgogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzMwogICAgLy8gY29uc3QgcGF5bG9hZCA9IGNsb25lKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxOAogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyOQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDM0CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1MQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzMy0xMDM0CiAgICAvLyBjb25zdCBwYXlsb2FkID0gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLnZhbHVlKQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDE4CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzNAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDUxCiAgICA+CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDM2CiAgICAvLyBjb25zdCBmaXJzdCA9IHR4SW5kZXggPT09IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIDY2CiAgICAhCiAgICBmcmFtZV9idXJ5IDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzNwogICAgLy8gaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfUEFZTUVOVCkgewogICAgaW50Y18zIC8vIDIKICAgIGZyYW1lX2RpZyA1MQogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyAxOAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcyCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzOAogICAgLy8gdGhpcy5fc3RhZ2VQYXltZW50KGRlY29kZUFyYzQ8UGF5bWVudFR4bj4oZW50cnkuZGF0YSksIGZpcnN0KQogICAgZnJhbWVfZGlnIDI5CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDUxCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4MQogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNDgKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4MgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpKQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDgzCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg0CiAgICAvLyB0aGlzLl9zZXRTZW5kZXJJZlNldCh0eC5zZW5kZXIpCiAgICBkdXAKICAgIGV4dHJhY3QgMiAzMgogICAgY2FsbHN1YiBfc2V0U2VuZGVySWZTZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg1CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFJlY2VpdmVyKHR4LnJlY2VpdmVyKQogICAgZHVwCiAgICBleHRyYWN0IDM0IDMyCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4NgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBbW91bnQodHguYW1vdW50KQogICAgZHVwCiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg3CiAgICAvLyBpZiAodHguaGFzQ2xvc2UgIT09IFVpbnQ2NCgwKSkgb3AuSVR4bkNyZWF0ZS5zZXRDbG9zZVJlbWFpbmRlclRvKHR4LmNsb3NlUmVtYWluZGVyVG8pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTk5CiAgICBmcmFtZV9kaWcgNAogICAgZXh0cmFjdCA4MiAzMgogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxOTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4OAogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBmcmFtZV9kaWcgMzAKICAgIGR1cAogICAgcHVzaGludCAxMTIgLy8gMTEyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNgogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MQogICAgZnJhbWVfZGlnIDM2CiAgICBpdHhuX2ZpZWxkIE5vdGUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDUwCiAgICAvLyB0eEluZGV4ID0gdHhJbmRleCArIFVpbnQ2NCgxKQogICAgZnJhbWVfZGlnIDY2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA2NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMzQKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA1MQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTEKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxMjMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMzkKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BU1NFVCkgewogICAgZnJhbWVfZGlnIDcyCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0MAogICAgLy8gdGhpcy5fc3RhZ2VBc3NldChkZWNvZGVBcmM0PEFzc2V0VHhuPihlbnRyeS5kYXRhKSwgZmlyc3QpCiAgICBmcmFtZV9kaWcgMjkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTEKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDkyCiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA0OAogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDkzCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuQXNzZXRUcmFuc2ZlcikpCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0RmVlKFVpbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTUKICAgIC8vIHRoaXMuX3NldFNlbmRlcklmU2V0KHR4LnNlbmRlcikKICAgIGR1cAogICAgZXh0cmFjdCAyIDMyCiAgICBjYWxsc3ViIF9zZXRTZW5kZXJJZlNldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTYKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0WGZlckFzc2V0KHR4LnhmZXJBc3NldCkKICAgIGR1cAogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5NwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBc3NldFJlY2VpdmVyKHR4LmFzc2V0UmVjZWl2ZXIpCiAgICBkdXAKICAgIGV4dHJhY3QgNDIgMzIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTgKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRBbW91bnQodHguYXNzZXRBbW91bnQpCiAgICBkdXAKICAgIHB1c2hpbnQgNzQgLy8gNzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5OQogICAgLy8gaWYgKHR4Lmhhc0Fzc2V0Q2xvc2UgIT09IFVpbnQ2NCgwKSkgb3AuSVR4bkNyZWF0ZS5zZXRBc3NldENsb3NlVG8odHguYXNzZXRDbG9zZVRvKQogICAgZXh0cmFjdF91aW50NjQKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE5MwogICAgZnJhbWVfZGlnIDUKICAgIGV4dHJhY3QgOTAgMzIKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxOTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwMAogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBmcmFtZV9kaWcgMzAKICAgIGR1cAogICAgcHVzaGludCAxMjAgLy8gMTIwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNwogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MQogICAgZnJhbWVfZGlnIDM3CiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQxCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQxCiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQVBQKSB7CiAgICBmcmFtZV9kaWcgNzIKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQyCiAgICAvLyB0aGlzLl9zdGFnZUFwcENhbGwoZGVjb2RlQXJjNDxBcHBUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE4CiAgICAvLyB0aGlzLl9iZWdpbk9yTmV4dChmaXJzdCkKICAgIGZyYW1lX2RpZyA0OAogICAgY2FsbHN1YiBfYmVnaW5Pck5leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE5CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKSkKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyMAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyMQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHBsaWNhdGlvbklkKHR4LmFwcElkKQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCAxMCAvLyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0T25Db21wbGV0aW9uKHR4Lm9uQ29tcGxldGlvbikKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjMKICAgIC8vIGlmICh0eC5ub3RlICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXROb3RlKEJ5dGVzKHR4Lm5vdGUpKQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDM5CiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMwogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE3NwogICAgZnJhbWVfZGlnIDMzCiAgICBpdHhuX2ZpZWxkIE5vdGUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE3NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI0CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFwcEFyZ3MubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQ5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE3ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI0CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFwcEFyZ3MubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDAKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDQ5CiAgICA+CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjEKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI0LTExMjUKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYXBwQXJncy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgLy8gICBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9uQXJncyh0eC5hcHBBcmdzW2ldKQogICAgZnJhbWVfZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNjEKICAgIGFzc2VydCAvLyBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDQ5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI1CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9uQXJncyh0eC5hcHBBcmdzW2ldKQogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hcHBBcmdzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0OQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE3OAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE4MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI3CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmFjY291bnRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1MgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDEKICAgIGZyYW1lX2RpZyA0MAogICAgc3dhcAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTIKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI3LTExMjgKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYWNjb3VudHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIC8vICAgb3AuSVR4bkNyZWF0ZS5zZXRBY2NvdW50cyh0eC5hY2NvdW50c1tpXSkKICAgIGZyYW1lX2RpZyA3CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDUyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjgKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QWNjb3VudHModHguYWNjb3VudHNbaV0pCiAgICBpdHhuX2ZpZWxkIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTIKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzMAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1MwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzMAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMzAKICAgIGR1cAogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0MgogICAgZnJhbWVfZGlnIDM5CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MwogICAgPgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE4NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzAtMTEzMQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXNzZXRzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICAvLyAgIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRzKHR4LmZvcmVpZ25Bc3NldHNbaV0pCiAgICBmcmFtZV9kaWcgOAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1MwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzEKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRzKHR4LmZvcmVpZ25Bc3NldHNbaV0pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTMwCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25Bc3NldHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUzCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTg0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTg2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzMKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFwcHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDU0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE4NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTMzCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25BcHBzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMzAKICAgIGZyYW1lX2RpZyA0MQogICAgZnJhbWVfZGlnIDQyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTQKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzMtMTEzNAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXBwcy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgLy8gICBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9ucyh0eC5mb3JlaWduQXBwc1tpXSkKICAgIGZyYW1lX2RpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXBwbGljYXRpb25zKHR4LmZvcmVpZ25BcHBzW2ldKQogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzMwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXBwcy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODcKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDMKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9LRVlSRUcpIHsKICAgIGZyYW1lX2RpZyA3MgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDQKICAgIC8vIHRoaXMuX3N0YWdlS2V5UmVnKGRlY29kZUFyYzQ8S2V5UmVnVHhuPihlbnRyeS5kYXRhKSwgZmlyc3QpCiAgICBmcmFtZV9kaWcgMjkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTEKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDExCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzOQogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNDgKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE0MAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLktleVJlZ2lzdHJhdGlvbikpCiAgICBpbnRjXzMgLy8gMgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNDEKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0RmVlKFVpbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQyCiAgICAvLyBpZiAodHgub25saW5lICE9PSBVaW50NjQoMCkpIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQ1CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVQayh0eC52b3RlS2V5KQogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgVm90ZVBLCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE0NgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRTZWxlY3Rpb25Qayh0eC5zZWxlY3Rpb25LZXkpCiAgICBkaWcgMQogICAgcHVzaGludCAxMiAvLyAxMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgaXR4bl9maWVsZCBTZWxlY3Rpb25QSwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNDcKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0U3RhdGVQcm9vZlBrKHR4LnN0YXRlUHJvb2ZLZXkpCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgaXR4bl9maWVsZCBTdGF0ZVByb29mUEsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQ4CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVGaXJzdCh0eC52b3RlRmlyc3QpCiAgICBmcmFtZV9kaWcgMTEKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgVm90ZUZpcnN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE0OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRWb3RlTGFzdCh0eC52b3RlTGFzdCkKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgVm90ZUxhc3QKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTUwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVLZXlEaWx1dGlvbih0eC52b3RlS2V5RGlsdXRpb24pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBWb3RlS2V5RGlsdXRpb24KICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQxCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDEzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQ1CiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQUNGRykgewogICAgZnJhbWVfZGlnIDcyCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0NgogICAgLy8gdGhpcy5fc3RhZ2VBc3NldENvbmZpZyhkZWNvZGVBcmM0PEFzc2V0Q29uZmlnVHhuPihlbnRyeS5kYXRhKSwgZmlyc3QpCiAgICBmcmFtZV9kaWcgMjkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTEKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEyCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1NQogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNDgKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1NgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLkFzc2V0Q29uZmlnKSkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1NwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpbnRjXzMgLy8gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNTgKICAgIC8vIGlmICh0eC5jb25maWdBc3NldCA9PT0gVWludDY0KDApKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDY3CiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxNjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTYxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0VG90YWwodHgudG90YWwpCiAgICBmcmFtZV9kaWcgMTIKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXREZWNpbWFscyh0eC5kZWNpbWFscykKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgcHVzaGludCAyNiAvLyAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjMKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXREZWZhdWx0RnJvemVuKHR4LmRlZmF1bHRGcm96ZW4gIT09IFVpbnQ2NCgwKSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2NAogICAgLy8gaWYgKHR4LnVuaXROYW1lICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldFVuaXROYW1lKEJ5dGVzKHR4LnVuaXROYW1lKSkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDMKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzUKICAgIGJ5dGVjXzIgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjAKICAgIGZyYW1lX2RpZyAzNQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2NQogICAgLy8gaWYgKHR4LmFzc2V0TmFtZSAhPT0gJycpIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXROYW1lKEJ5dGVzKHR4LmFzc2V0TmFtZSkpCiAgICBmcmFtZV9kaWcgMzAKICAgIGR1cAogICAgcHVzaGludCAzNiAvLyAzNgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0NAogICAgZnJhbWVfZGlnIDQzCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM3CiAgICBieXRlY18yIC8vICIiCiAgICAhPQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTYyCiAgICBmcmFtZV9kaWcgMzcKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2NgogICAgLy8gaWYgKHR4LnVybCAhPT0gJycpIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRVcmwoQnl0ZXModHgudXJsKSkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDM4IC8vIDM4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQ1CiAgICBmcmFtZV9kaWcgNDQKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzgKICAgIGJ5dGVjXzIgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjQKICAgIGZyYW1lX2RpZyAzOAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVSTAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTY0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjcKICAgIC8vIGlmICh0eC5tZXRhZGF0YUhhc2gubGVuZ3RoID09PSBVaW50NjQoMzIpKSBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0TWV0YWRhdGFIYXNoKHR4Lm1ldGFkYXRhSGFzaCkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBpbnRjIDUgLy8gMTY4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDQ1CiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMxCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNjcKICAgIGZyYW1lX2RpZyAzMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE1ldGFkYXRhSGFzaAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTY3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNzMKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRNYW5hZ2VyKHR4Lm1hbmFnZXIpCiAgICBmcmFtZV9kaWcgMTIKICAgIGR1cAogICAgZXh0cmFjdCA0MiAzMgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE1hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTc0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0UmVzZXJ2ZSh0eC5yZXNlcnZlKQogICAgZHVwCiAgICBleHRyYWN0IDc0IDMyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0UmVzZXJ2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNzUKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRGcmVlemUodHguZnJlZXplKQogICAgZHVwCiAgICBleHRyYWN0IDEwNiAzMgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldEZyZWV6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNzYKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRDbGF3YmFjayh0eC5jbGF3YmFjaykKICAgIGV4dHJhY3QgMTM4IDMyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0Q2xhd2JhY2sKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTc3CiAgICAvLyBpZiAodHgubm90ZSAhPT0gJycpIG9wLklUeG5DcmVhdGUuc2V0Tm90ZShCeXRlcyh0eC5ub3RlKSkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBpbnRjIDUgLy8gMTY4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMgogICAgYnl0ZWNfMiAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MQogICAgZnJhbWVfZGlnIDMyCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQxCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE2NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTcxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0KHR4LmNvbmZpZ0Fzc2V0KQogICAgZnJhbWVfZGlnIDY3CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE2NwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0NwogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1JFS0VZKSB7CiAgICBmcmFtZV9kaWcgNzIKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0OAogICAgLy8gdGhpcy5fc3RhZ2VSZWtleShkZWNvZGVBcmM0PFJla2V5VHhuPihlbnRyeS5kYXRhKSwgZmlyc3QpCiAgICBmcmFtZV9kaWcgMjkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTEKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMDcKICAgIC8vIHRoaXMuX2JlZ2luT3JOZXh0KGZpcnN0KQogICAgZnJhbWVfZGlnIDQ4CiAgICBjYWxsc3ViIF9iZWdpbk9yTmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMDgKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0VHlwZUVudW0oVWludDY0KFRyYW5zYWN0aW9uVHlwZS5QYXltZW50KSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwOQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExMAogICAgLy8gdGhpcy5fc2V0U2VuZGVySWZTZXQodHguc2VuZGVyKQogICAgZGlnIDEKICAgIGV4dHJhY3QgMiAzMgogICAgZHVwCiAgICBjYWxsc3ViIF9zZXRTZW5kZXJJZlNldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTEKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0UmVjZWl2ZXIodGhpcy5fcmVzb2x2ZVNlbmRlcih0eC5zZW5kZXIpKQogICAgY2FsbHN1YiBfcmVzb2x2ZVNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QW1vdW50KFVpbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTMKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0UmVrZXlUbyh0eC5yZWtleVRvKQogICAgc3dhcAogICAgZXh0cmFjdCAzNCAzMgogICAgaXR4bl9maWVsZCBSZWtleVRvCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExNAogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBkdXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM0CiAgICBieXRlY18yIC8vICIiCiAgICAhPQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQxCiAgICBmcmFtZV9kaWcgMzQKICAgIGl0eG5fZmllbGQgTm90ZQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDMwCiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDU4CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1OAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDEyMAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE0NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDU1CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTQKICAgIC8vIHByb3Bvc2FsLnN0YXR1cyA9IFNUQVRVU19FWEVDVVRFRAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTQtODk1CiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSBTVEFUVVNfRVhFQ1VURUQKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBmcmFtZV9kaWcgNzkKICAgIGludGNfMiAvLyA4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODk2CiAgICAvLyBlbWl0PFByb3Bvc2FsRXhlY3V0ZWQ+KHsgcHJvcG9zYWxJZCB9KQogICAgcHVzaGJ5dGVzIDB4MzVjNjdlZmQgLy8gbWV0aG9kICJQcm9wb3NhbEV4ZWN1dGVkKHVpbnQ2NCkiCiAgICBmcmFtZV9kaWcgNzgKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTIKICAgIC8vIGFkbWluUGF5bG9hZHMgPSBCb3hNYXA8dWludDY0LCBBZG1pbkNoYW5nZT4oeyBrZXlQcmVmaXg6ICdkcCcgfSkKICAgIGJ5dGVjIDIwIC8vICJkcCIKICAgIGZyYW1lX2RpZyA3OAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODkKICAgIC8vIGNvbnN0IGNoYW5nZSA9IGNsb25lKHRoaXMuYWRtaW5QYXlsb2Fkcyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyMAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODktODkwCiAgICAvLyBjb25zdCBjaGFuZ2UgPSBjbG9uZSh0aGlzLmFkbWluUGF5bG9hZHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICAvLyB0aGlzLl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlLmNoYW5nZVR5cGUsIGdyb3VwKQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5MAogICAgLy8gdGhpcy5fYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlKGNoYW5nZS5jaGFuZ2VUeXBlLCBncm91cCkKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3MAogICAgZHVwCiAgICBmcmFtZV9kaWcgODIKICAgIGNhbGxzdWIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3MQogICAgLy8gaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQ1JFQVRFX0dST1VQKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDUwCiAgICAvLyBjb25zdCBub3cgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1MQogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNQogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDggLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1MQogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NTIKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkIDw9IFVpbnQ2NCgxKSwgJ25ldyBncm91cCBzdGFydHMgd2l0aCBvbmUgbWVtYmVyJykKICAgIGZyYW1lX2RpZyAxNwogICAgZHVwCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gbmV3IGdyb3VwIHN0YXJ0cyB3aXRoIG9uZSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDU1CiAgICAvLyBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgZnJhbWVfZGlnIDIwCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCA1OCAvLyA1OAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NTgKICAgIC8vIGFkbWluUHJpdmlsZWdlczogY2hhbmdlLmFkbWluUHJpdmlsZWdlcywKICAgIGRpZyA0CiAgICBwdXNoaW50IDY4IC8vIDY4CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDU5CiAgICAvLyBhbGxvd2VkQWN0aW9uczogY2hhbmdlLmFsbG93ZWRBY3Rpb25zLAogICAgZGlnIDUKICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NjAKICAgIC8vIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIGRpZyA2CiAgICBwdXNoaW50IDg0IC8vIDg0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDYxCiAgICAvLyBkYWlseUxpbWl0OiBjaGFuZ2UuZGFpbHlMaW1pdCwKICAgIGRpZyA3CiAgICBwdXNoaW50IDkyIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDY0CiAgICAvLyBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICBkaWcgOAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDY3CiAgICAvLyBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgZGlnIDkKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1NC0xNDcxCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogY2hhbmdlLmFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IGNoYW5nZS5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBjaGFuZ2UubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBjaGFuZ2UuZGFpbHlMaW1pdCwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogY2hhbmdlLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgZGlnIDYKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGZyYW1lX2J1cnkgMAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTQKICAgIGJ5dGVjIDI2IC8vIDB4MDA3YQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1NwogICAgLy8gbWVtYmVyQ291bnQ6IFVpbnQ2NCgxKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1NC0xNDcxCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogY2hhbmdlLmFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IGNoYW5nZS5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBjaGFuZ2UubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBjaGFuZ2UuZGFpbHlMaW1pdCwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogY2hhbmdlLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NjIKICAgIC8vIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ1NC0xNDcxCiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogY2hhbmdlLmFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IGNoYW5nZS5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBjaGFuZ2UubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBjaGFuZ2UuZGFpbHlMaW1pdCwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogY2hhbmdlLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NzIKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncnApCiAgICBkaWcgNQogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDcyCiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NzQKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlLCBsYWJlbDogY2hhbmdlLm1lbWJlckxhYmVsLCBhZGRyOiBjaGFuZ2UubWVtYmVyQWRkciB9CiAgICBkaWcgNAogICAgcHVzaGludCA1MCAvLyA1MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdW5jb3ZlciA0CiAgICBwdXNoaW50cyAxOCAzMiAvLyAxOCwgMzIKICAgIGJveF9leHRyYWN0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAxNQogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDE5IC8vIDB4MDAyYQogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDc1CiAgICAvLyB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLnZhbHVlID0gY2xvbmUobSkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ3NQogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NzcKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBnaWQgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgOCAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDc3CiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NzgKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDUgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ3OAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDUgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ3OAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gdGhpcy5ncm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NzkKICAgIC8vIGlmICgoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkpIHsKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDgwCiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODAKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18xIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODAKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTUxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODMKICAgIC8vIGVtaXQ8R3JvdXBDcmVhdGVkPih7IGdyb3VwSWQ6IGdpZCwgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkIH0pCiAgICBmcmFtZV9kaWcgMjEKICAgIGJ5dGVjIDE3IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMTQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTggLy8gbWV0aG9kICJHcm91cENyZWF0ZWQodWludDY0LHN0cmluZyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDg0CiAgICAvLyBlbWl0PE1lbWJlckFkZGVkPih7IGdyb3VwSWQ6IGdpZCwgbWVtYmVyOiBjaGFuZ2UubWVtYmVyQWRkciwgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlIH0pCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDE1CiAgICBjb25jYXQKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAiTWVtYmVyQWRkZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3MwogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0FERF9NRU1CRVIpIHsKICAgIGZyYW1lX2RpZyA3MAogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQ4OAogICAgLy8gY29uc3QgZ2lkID0gY2hhbmdlLnRhcmdldEdyb3VwSWQKICAgIGZyYW1lX2RpZyAxNwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODkKICAgIC8vIGFzc2VydCghdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5leGlzdHMsICdhbHJlYWR5IGEgbWVtYmVyJykKICAgIGRpZyAxCiAgICBwdXNoaW50cyAxOCAzMiAvLyAxOCwgMzIKICAgIGJveF9leHRyYWN0CiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0ODkKICAgIC8vIGFzc2VydCghdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5leGlzdHMsICdhbHJlYWR5IGEgbWVtYmVyJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBhIG1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTEKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlLCBsYWJlbDogY2hhbmdlLm1lbWJlckxhYmVsLCBhZGRyOiBjaGFuZ2UubWVtYmVyQWRkciB9CiAgICB1bmNvdmVyIDQKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZnJhbWVfZGlnIDIwCiAgICBkdXAKICAgIHB1c2hpbnQgNTggLy8gNTgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaXRvYgogICAgZGlnIDEKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgYnl0ZWMgMTkgLy8gMHgwMDJhCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDkyCiAgICAvLyB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLnZhbHVlID0gY2xvbmUobSkKICAgIGRpZyAyCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTQtMTQ5NQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCArIFVpbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDk1CiAgICAvLyBncm91cC5tZW1iZXJDb3VudCA9IGdyb3VwLm1lbWJlckNvdW50ICsgVWludDY0KDEpCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0OTQtMTQ5NgogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCArIFVpbnQ2NCgxKQogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgcHVzaGludCAxMCAvLyAxMAogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDk4CiAgICAvLyBlbWl0PE1lbWJlckFkZGVkPih7IGdyb3VwSWQ6IGdpZCwgbWVtYmVyOiBjaGFuZ2UubWVtYmVyQWRkciwgYWNjb3VudFR5cGU6IGNoYW5nZS5tZW1iZXJUeXBlIH0pCiAgICBjb25jYXQKICAgIGJ5dGVjIDE0IC8vIG1ldGhvZCAiTWVtYmVyQWRkZWQodWludDY0LGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM3NQogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1JFTU9WRV9NRU1CRVIpIHsKICAgIGZyYW1lX2RpZyA3MAogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwMgogICAgLy8gY29uc3QgZ2lkID0gY2hhbmdlLnRhcmdldEdyb3VwSWQKICAgIGZyYW1lX2RpZyAxNwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MDMKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IGNoYW5nZS5tZW1iZXJBZGRyIH0pLmV4aXN0cywgJ25vdCBhIG1lbWJlcicpCiAgICBzd2FwCiAgICBwdXNoaW50cyAxOCAzMiAvLyAxOCwgMzIKICAgIGJveF9leHRyYWN0CiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTAzCiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5leGlzdHMsICdub3QgYSBtZW1iZXInKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3QgYSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDYKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTA1CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwNS0xNTA2CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUpCiAgICAvLyBhc3NlcnQoZ3JvdXAubWVtYmVyQ291bnQgLSBVaW50NjQoMSkgPj0gZ3JvdXAudGhyZXNob2xkLCAnd291bGQgZHJvcCBiZWxvdyB0aHJlc2hvbGQnKQogICAgZGlnIDEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MDYKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKSA+PSBncm91cC50aHJlc2hvbGQsICd3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZCcpCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MDUtMTUwNgogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpID49IGdyb3VwLnRocmVzaG9sZCwgJ3dvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkJykKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwNgogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpID49IGdyb3VwLnRocmVzaG9sZCwgJ3dvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkJykKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIHdvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUwOAogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5kZWxldGUoKQogICAgdW5jb3ZlciAzCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNTA5CiAgICAvLyBncm91cC5tZW1iZXJDb3VudCA9IGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpCiAgICBpdG9iCiAgICByZXBsYWNlMiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTMKICAgIC8vIGdyb3VwLm1lbWJlcnNoaXBFcG9jaCA9IGdyb3VwLm1lbWJlcnNoaXBFcG9jaCArIFVpbnQ2NCgxKQogICAgZHVwCiAgICBwdXNoaW50IDEwNiAvLyAxMDYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMTA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTUxNAogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE1MTYKICAgIC8vIGVtaXQ8TWVtYmVyUmVtb3ZlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogY2hhbmdlLm1lbWJlckFkZHIgfSkKICAgIHB1c2hieXRlcyAweDJiMTRjMmMxIC8vIG1ldGhvZCAiTWVtYmVyUmVtb3ZlZCh1aW50NjQsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzcKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9BRERfUkVLRVlFRF9BRERSKSB7CiAgICBmcmFtZV9kaWcgNzAKICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzkKICAgIC8vIGFzc2VydCghdGhpcy5yZWtleWVkQWRkcmVzc2VzKGNoYW5nZS5tZW1iZXJBZGRyKS5leGlzdHMsICdhbHJlYWR5IHJlZ2lzdGVyZWQnKQogICAgZnJhbWVfZGlnIDE3CiAgICBwdXNoaW50cyAxOCAzMiAvLyAxOCwgMzIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzU0CiAgICAvLyByZWtleWVkQWRkcmVzc2VzID0gQm94TWFwPEFjY291bnQsIFJla2V5ZWRBZGRyZXNzPih7IGtleVByZWZpeDogJ3InIH0pCiAgICBieXRlYyA5IC8vICJyIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzNzkKICAgIC8vIGFzc2VydCghdGhpcy5yZWtleWVkQWRkcmVzc2VzKGNoYW5nZS5tZW1iZXJBZGRyKS5leGlzdHMsICdhbHJlYWR5IHJlZ2lzdGVyZWQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzgwCiAgICAvLyBjb25zdCBlbnRyeTogUmVrZXllZEFkZHJlc3MgPSB7IGxhYmVsOiBjaGFuZ2UubWVtYmVyTGFiZWwsIGFkZGVkUm91bmQ6IEdsb2JhbC5yb3VuZCB9CiAgICBmcmFtZV9kaWcgMjAKICAgIGR1cAogICAgcHVzaGludCA1OCAvLyA1OAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWMgMjcgLy8gMHgwMDBhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzgxCiAgICAvLyB0aGlzLnJla2V5ZWRBZGRyZXNzZXMoY2hhbmdlLm1lbWJlckFkZHIpLnZhbHVlID0gY2xvbmUoZW50cnkpCiAgICBkaWcgMgogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzgyCiAgICAvLyBlbWl0PFJla2V5ZWRBZGRyZXNzQWRkZWQ+KHsgYWRkcjogY2hhbmdlLm1lbWJlckFkZHIsIGxhYmVsOiBjaGFuZ2UubWVtYmVyTGFiZWwgfSkKICAgIHN3YXAKICAgIGJ5dGVjIDE2IC8vIDB4MDAyMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDI4IC8vIG1ldGhvZCAiUmVrZXllZEFkZHJlc3NBZGRlZChhZGRyZXNzLHN0cmluZykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzODMKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9SRU1PVkVfUkVLRVlFRF9BRERSKSB7CiAgICBmcmFtZV9kaWcgNzAKICAgIHB1c2hpbnQgOSAvLyA5CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzODQKICAgIC8vIGFzc2VydCh0aGlzLnJla2V5ZWRBZGRyZXNzZXMoY2hhbmdlLm1lbWJlckFkZHIpLmV4aXN0cywgJ25vdCByZWdpc3RlcmVkJykKICAgIGZyYW1lX2RpZyAxNwogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gcmVrZXllZEFkZHJlc3NlcyA9IEJveE1hcDxBY2NvdW50LCBSZWtleWVkQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICdyJyB9KQogICAgYnl0ZWMgOSAvLyAiciIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzg0CiAgICAvLyBhc3NlcnQodGhpcy5yZWtleWVkQWRkcmVzc2VzKGNoYW5nZS5tZW1iZXJBZGRyKS5leGlzdHMsICdub3QgcmVnaXN0ZXJlZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG5vdCByZWdpc3RlcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM4NQogICAgLy8gdGhpcy5yZWtleWVkQWRkcmVzc2VzKGNoYW5nZS5tZW1iZXJBZGRyKS5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM4NgogICAgLy8gZW1pdDxSZWtleWVkQWRkcmVzc1JlbW92ZWQ+KHsgYWRkcjogY2hhbmdlLm1lbWJlckFkZHIgfSkKICAgIHB1c2hieXRlcyAweGRiNGNhNTJhIC8vIG1ldGhvZCAiUmVrZXllZEFkZHJlc3NSZW1vdmVkKGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzg3CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQ0hBTkdFX1RIUkVTSE9MRCkgewogICAgZnJhbWVfZGlnIDcwCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzg4CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxNwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM4OQogICAgLy8gYXNzZXJ0KGNoYW5nZS50aHJlc2hvbGQgPD0gZ3JvdXAubWVtYmVyQ291bnQsICd0aHJlc2hvbGQgZXhjZWVkcyBtZW1iZXJzJykKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2MCAvLyA2MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzg4LTEzODkKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGNoYW5nZS50aHJlc2hvbGQgPD0gZ3JvdXAubWVtYmVyQ291bnQsICd0aHJlc2hvbGQgZXhjZWVkcyBtZW1iZXJzJykKICAgIGRpZyAyCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzg5CiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA8PSBncm91cC5tZW1iZXJDb3VudCwgJ3RocmVzaG9sZCBleGNlZWRzIG1lbWJlcnMnKQogICAgYnRvaQogICAgPD0KICAgIGFzc2VydCAvLyB0aHJlc2hvbGQgZXhjZWVkcyBtZW1iZXJzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5MC0xMzkxCiAgICAvLyBncm91cC50aHJlc2hvbGQgPSBjaGFuZ2UudGhyZXNob2xkCiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGludGNfMyAvLyAyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzOTIKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyAxNSAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzkzCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BPTElDWSkgewogICAgZnJhbWVfZGlnIDcwCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzk0CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxNwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5NAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5NC0xMzk1CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIC8vIGNvbnN0IGFzc2V0Q2hhbmdlZCA9IGdyb3VwLmxpbWl0QXNzZXRJZCAhPT0gY2hhbmdlLmxpbWl0QXNzZXRJZAogICAgc3dhcAogICAgcHVzaGludCAzNCAvLyAzNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5NQogICAgLy8gY29uc3QgYXNzZXRDaGFuZ2VkID0gZ3JvdXAubGltaXRBc3NldElkICE9PSBjaGFuZ2UubGltaXRBc3NldElkCiAgICBidG9pCiAgICBkaWcgMgogICAgcHVzaGludCA4NCAvLyA4NAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzk2CiAgICAvLyBncm91cC5hbGxvd2VkQWN0aW9ucyA9IGNoYW5nZS5hbGxvd2VkQWN0aW9ucwogICAgZGlnIDMKICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzOTcKICAgIC8vIGdyb3VwLmxpbWl0QXNzZXRJZCA9IGNoYW5nZS5saW1pdEFzc2V0SWQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTIgMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzk4CiAgICAvLyBncm91cC5kYWlseUxpbWl0ID0gY2hhbmdlLmRhaWx5TGltaXQKICAgIGRpZyAyCiAgICBwdXNoaW50IDkyIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIHJlcGxhY2UyIDQyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTM5OQogICAgLy8gZ3JvdXAubW9udGhseUxpbWl0ID0gY2hhbmdlLm1vbnRobHlMaW1pdAogICAgZGlnIDIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICByZXBsYWNlMiA2NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDAKICAgIC8vIGdyb3VwLmNvb2xkb3duUm91bmRzID0gY2hhbmdlLmNvb2xkb3duUm91bmRzCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICByZXBsYWNlMiA5MAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDEKICAgIC8vIGlmIChhc3NldENoYW5nZWQpIHsKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDMxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQwMgogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDMKICAgIC8vIGdyb3VwLmRhaWx5VXNhZ2UgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MDQKICAgIC8vIGdyb3VwLmRhaWx5UGVyaW9kU3RhcnQgPSBub3cKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDU4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQwNQogICAgLy8gZ3JvdXAubW9udGhseVVzYWdlID0gVWludDY0KDApCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UyIDc0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQwNgogICAgLy8gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID0gbm93CiAgICBzd2FwCiAgICByZXBsYWNlMiA4MgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMzE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQwOAogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBmcmFtZV9kaWcgMTkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQwOQogICAgLy8gZW1pdDxHcm91cFVwZGF0ZWQ+KHsgZ3JvdXBJZDogY2hhbmdlLnRhcmdldEdyb3VwSWQgfSkKICAgIGJ5dGVjIDE1IC8vIG1ldGhvZCAiR3JvdXBVcGRhdGVkKHVpbnQ2NCkiCiAgICBmcmFtZV9kaWcgMjIKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxMAogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QUklWSUxFR0VTKSB7CiAgICBmcmFtZV9kaWcgNzAKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA0NQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MTEKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIDE3CiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDExCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxNAogICAgLy8gYXNzZXJ0KCF0aGlzLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZSwgZ3JvdXApLCAnbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4nKQogICAgZnJhbWVfZGlnIDIwCiAgICBzd2FwCiAgICBjYWxsc3ViIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMjYKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAyMAogICAgIQogICAgYXNzZXJ0IC8vIG11c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxNQogICAgLy8gY29uc3QgaGFkR3JvdXBQcml2ID0gKGdyb3VwLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBmcmFtZV9idXJ5IDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxNgogICAgLy8gY29uc3Qgd2lsbEhhdmVHcm91cFByaXYgPSAoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGRpZyAxCiAgICBleHRyYWN0IDY4IDgKICAgIGZyYW1lX2J1cnkgMQogICAgc3dhcAogICAgcHVzaGludCA2OCAvLyA2OAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBmcmFtZV9idXJ5IDYzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxNwogICAgLy8gaWYgKGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApICYmIGhhZEdyb3VwUHJpdiAmJiAhd2lsbEhhdmVHcm91cFByaXYpIHsKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3MwogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAzOQogICAgZnJhbWVfZGlnIDYwCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDM5CiAgICBmcmFtZV9kaWcgNjMKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDM5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxOAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDE4CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDE4CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjIKICAgIC8vIGdyb3VwLmFkbWluUHJpdmlsZWdlcyA9IGNoYW5nZS5hZG1pblByaXZpbGVnZXMKICAgIGZyYW1lX2RpZyAyNgogICAgZnJhbWVfZGlnIDEKICAgIHJlcGxhY2UyIDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyMwogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBmcmFtZV9kaWcgMjAKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDIzCiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDI0CiAgICAvLyBlbWl0PEdyb3VwVXBkYXRlZD4oeyBncm91cElkOiBjaGFuZ2UudGFyZ2V0R3JvdXBJZCB9KQogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJHcm91cFVwZGF0ZWQodWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMzk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQxOQogICAgLy8gfSBlbHNlIGlmIChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSAmJiAhaGFkR3JvdXBQcml2ICYmIHdpbGxIYXZlR3JvdXBQcml2KSB7CiAgICBmcmFtZV9kaWcgNzMKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQ0CiAgICBmcmFtZV9kaWcgNjAKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NAogICAgZnJhbWVfZGlnIDYzCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjAKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyMAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyMAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQ0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQ1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjUKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfQUNUSVZFKSB7CiAgICBmcmFtZV9kaWcgNzAKICAgIHB1c2hpbnQgNyAvLyA3CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA1OAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MjYKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIDE3CiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDI2CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyNwogICAgLy8gYXNzZXJ0KCF0aGlzLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZSwgZ3JvdXApLCAnbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4nKQogICAgZnJhbWVfZGlnIDIwCiAgICBzd2FwCiAgICBjYWxsc3ViIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMjcKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAyMAogICAgIQogICAgYXNzZXJ0IC8vIG11c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQyOAogICAgLy8gY29uc3QgaGFzR3JvdXBQcml2ID0gKGdyb3VwLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgNjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDI5CiAgICAvLyBjb25zdCB3YXNBY3RpdmUgPSBncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKQogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSA3NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzAKICAgIC8vIGNvbnN0IHdpbGxCZUFjdGl2ZSA9IGNoYW5nZS5hY3RpdmVGbGFnICE9PSBVaW50NjQoMCkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTE2IC8vIDExNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3NQogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBmcmFtZV9idXJ5IDc3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQzMQogICAgLy8gaWYgKGhhc0dyb3VwUHJpdiAmJiB3YXNBY3RpdmUgJiYgIXdpbGxCZUFjdGl2ZSkgewogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA1MgogICAgZnJhbWVfZGlnIDc0CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDUyCiAgICBmcmFtZV9kaWcgNzUKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDUyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQzMgogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDMyCiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDMyCiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDU3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzYKICAgIC8vIGdyb3VwLmFjdGl2ZSA9IHdpbGxCZUFjdGl2ZSA/IFVpbnQ2NCgxKSA6IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIDc3CiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMjcKICAgIHN3YXAKICAgIHJlcGxhY2UyIDExNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzcKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZnJhbWVfZGlnIDIwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQzNwogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQzOAogICAgLy8gZW1pdDxHcm91cFVwZGF0ZWQ+KHsgZ3JvdXBJZDogY2hhbmdlLnRhcmdldEdyb3VwSWQgfSkKICAgIGJ5dGVjIDE1IC8vIG1ldGhvZCAiR3JvdXBVcGRhdGVkKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDUyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzMKICAgIC8vIH0gZWxzZSBpZiAoaGFzR3JvdXBQcml2ICYmICF3YXNBY3RpdmUgJiYgd2lsbEJlQWN0aXZlKSB7CiAgICBmcmFtZV9kaWcgNjQKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDU3CiAgICBmcmFtZV9kaWcgNzQKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1NwogICAgZnJhbWVfZGlnIDc1CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1NwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0MzQKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQzNAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTQzNAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDU3CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDU4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NDQKICAgIC8vIHRoaXMucGF1c2VkLnZhbHVlID0gY2hhbmdlLmFjdGl2ZUZsYWcgIT09IFVpbnQ2NCgwKSA/IFVpbnQ2NCgxKSA6IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIDE3CiAgICBwdXNoaW50IDExNiAvLyAxMTYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBwYXVzZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGF1c2VkJyB9KQogICAgYnl0ZWMgMTAgLy8gInBhdXNlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxNDQ0CiAgICAvLyB0aGlzLnBhdXNlZC52YWx1ZSA9IGNoYW5nZS5hY3RpdmVGbGFnICE9PSBVaW50NjQoMCkgPyBVaW50NjQoMSkgOiBVaW50NjQoMCkKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjE0NDUKICAgIC8vIGVtaXQ8U2FmZVBhdXNlZD4oeyBwYXVzZWQ6IHRoaXMucGF1c2VkLnZhbHVlIH0pCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHhjNGE3OTI2MyAvLyBtZXRob2QgIlNhZmVQYXVzZWQodWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDI6CiAgICBmcmFtZV9kaWcgODQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX25ld1Byb3Bvc2FsKGdyb3VwSWQ6IHVpbnQ2NCwgcGF5bG9hZFR5cGU6IHVpbnQ2NCwgZXhwaXJ5Um91bmQ6IHVpbnQ2NCkgLT4gdWludDY0OgpfbmV3UHJvcG9zYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTAwCiAgICAvLyBwcml2YXRlIF9uZXdQcm9wb3NhbChncm91cElkOiB1aW50NjQsIHBheWxvYWRUeXBlOiB1aW50NjQsIGV4cGlyeVJvdW5kOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTA1CiAgICAvLyBhc3NlcnQodGhpcy5ib290c3RyYXBwZWQudmFsdWUgPT09IFVpbnQ2NCgxKSwgJ25vdCBib290c3RyYXBwZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgNyAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDUKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDEpLCAnbm90IGJvb3RzdHJhcHBlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gbm90IGJvb3RzdHJhcHBlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwNgogICAgLy8gYXNzZXJ0KGV4cGlyeVJvdW5kID4gR2xvYmFsLnJvdW5kLCAnZXhwaXJ5IG11c3QgYmUgaW4gdGhlIGZ1dHVyZScpCiAgICBmcmFtZV9kaWcgLTEKICAgIGdsb2JhbCBSb3VuZAogICAgPgogICAgYXNzZXJ0IC8vIGV4cGlyeSBtdXN0IGJlIGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDcKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDYKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwOAogICAgLy8gY29uc3QgcGlkOiB1aW50NjQgPSB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzNgogICAgLy8gbmV4dFByb3Bvc2FsSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnBpZCcgfSkKICAgIGJ5dGVjIDEzIC8vICJucGlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwOAogICAgLy8gY29uc3QgcGlkOiB1aW50NjQgPSB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxNQogICAgLy8gdGhyZXNob2xkOiBncm91cC50aHJlc2hvbGQsCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxNwogICAgLy8gcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTE5CiAgICAvLyBlcG9jaEF0Q3JlYXRpb246IGdyb3VwLm1lbWJlcnNoaXBFcG9jaCwKICAgIHVuY292ZXIgMwogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MTIKICAgIC8vIHN0YXR1czogU1RBVFVTX0FDVElWRSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTEwLTkyMgogICAgLy8gY29uc3QgcHJvcG9zYWw6IFByb3Bvc2FsID0gewogICAgLy8gICBncm91cElkLAogICAgLy8gICBzdGF0dXM6IFNUQVRVU19BQ1RJVkUsCiAgICAvLyAgIHBheWxvYWRUeXBlLAogICAgLy8gICBhcHByb3ZhbHNDb3VudDogVWludDY0KDApLAogICAgLy8gICB0aHJlc2hvbGQ6IGdyb3VwLnRocmVzaG9sZCwKICAgIC8vICAgZXhwaXJ5Um91bmQsCiAgICAvLyAgIHByb3Bvc2VyOiBUeG4uc2VuZGVyLAogICAgLy8gICBudW1QYXlsb2FkczogVWludDY0KDApLAogICAgLy8gICBlcG9jaEF0Q3JlYXRpb246IGdyb3VwLm1lbWJlcnNoaXBFcG9jaCwKICAgIC8vICAgcGF5bG9hZFZlcnNpb246IFVpbnQ2NCgxKSwKICAgIC8vICAgdG90YWxUeG5zOiBVaW50NjQoMCksCiAgICAvLyB9CiAgICBpdG9iCiAgICBkaWcgNQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTE0CiAgICAvLyBhcHByb3ZhbHNDb3VudDogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MTAtOTIyCiAgICAvLyBjb25zdCBwcm9wb3NhbDogUHJvcG9zYWwgPSB7CiAgICAvLyAgIGdyb3VwSWQsCiAgICAvLyAgIHN0YXR1czogU1RBVFVTX0FDVElWRSwKICAgIC8vICAgcGF5bG9hZFR5cGUsCiAgICAvLyAgIGFwcHJvdmFsc0NvdW50OiBVaW50NjQoMCksCiAgICAvLyAgIHRocmVzaG9sZDogZ3JvdXAudGhyZXNob2xkLAogICAgLy8gICBleHBpcnlSb3VuZCwKICAgIC8vICAgcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIG51bVBheWxvYWRzOiBVaW50NjQoMCksCiAgICAvLyAgIGVwb2NoQXRDcmVhdGlvbjogZ3JvdXAubWVtYmVyc2hpcEVwb2NoLAogICAgLy8gICBwYXlsb2FkVmVyc2lvbjogVWludDY0KDEpLAogICAgLy8gICB0b3RhbFR4bnM6IFVpbnQ2NCgwKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTIzCiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDYgLy8gInAiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTIzCiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkyNAogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSA9IHBpZCArIFVpbnQ2NCgxKQogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM2CiAgICAvLyBuZXh0UHJvcG9zYWxJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICducGlkJyB9KQogICAgYnl0ZWMgMTMgLy8gIm5waWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTI0CiAgICAvLyB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlID0gcGlkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkyNgogICAgLy8gZW1pdDxQcm9wb3NhbENyZWF0ZWQ+KHsgcHJvcG9zYWxJZDogcGlkLCBncm91cElkLCBwYXlsb2FkVHlwZSwgcHJvcG9zZXI6IFR4bi5zZW5kZXIgfSkKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhiMzUxZDg1NyAvLyBtZXRob2QgIlByb3Bvc2FsQ3JlYXRlZCh1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTMwCiAgICAvLyB0aGlzLl9yZWNvcmRBcHByb3ZhbChwaWQsIHN0b3JlZCkKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjYWxsc3ViIF9yZWNvcmRBcHByb3ZhbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTMxCiAgICAvLyByZXR1cm4gcGlkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9yZWNvcmRBcHByb3ZhbChwcm9wb3NhbElkOiB1aW50NjQsIHByb3Bvc2FsOiBieXRlcykgLT4gYnl0ZXM6Cl9yZWNvcmRBcHByb3ZhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MzUKICAgIC8vIHByaXZhdGUgX3JlY29yZEFwcHJvdmFsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcHJvcG9zYWw6IFByb3Bvc2FsKTogdm9pZCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MzYKICAgIC8vIGNvbnN0IHJlY29yZDogQXBwcm92YWwgPSB7IHNpZ25lcjogVHhuLnNlbmRlciwgcm91bmQ6IEdsb2JhbC5yb3VuZCB9CiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkzNwogICAgLy8gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUocmVjb3JkKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gYXBwcm92YWxzID0gQm94TWFwPHsgcHJvcG9zYWxJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIEFwcHJvdmFsPih7IGtleVByZWZpeDogJ2EnIH0pCiAgICBieXRlYyAyMSAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkzNwogICAgLy8gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUocmVjb3JkKQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0MAogICAgLy8gdXBkYXRlZC5hcHByb3ZhbHNDb3VudCA9IHVwZGF0ZWQuYXBwcm92YWxzQ291bnQgKyBVaW50NjQoMSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHJlcGxhY2UyIDI0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDEKICAgIC8vIGlmICh1cGRhdGVkLmFwcHJvdmFsc0NvdW50ID49IHVwZGF0ZWQudGhyZXNob2xkKSB7CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgID49CiAgICBieiBfcmVjb3JkQXBwcm92YWxfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTQyCiAgICAvLyB1cGRhdGVkLnN0YXR1cyA9IFNUQVRVU19SRUFEWQogICAgaW50Y18zIC8vIDIKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgKCl9yZWNvcmRBcHByb3ZhbF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ4CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNiAvLyAicCIKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0NAogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUgPSBjbG9uZSh1cGRhdGVkKQogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDgKICAgIC8vIHNpZ25lcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDkKICAgIC8vIGFwcHJvdmFsc0NvdW50OiB1cGRhdGVkLmFwcHJvdmFsc0NvdW50LAogICAgc3dhcAogICAgZXh0cmFjdCAyNCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTQ2LTk1MAogICAgLy8gZW1pdDxQcm9wb3NhbEFwcHJvdmVkPih7CiAgICAvLyAgIHByb3Bvc2FsSWQsCiAgICAvLyAgIHNpZ25lcjogVHhuLnNlbmRlciwKICAgIC8vICAgYXBwcm92YWxzQ291bnQ6IHVwZGF0ZWQuYXBwcm92YWxzQ291bnQsCiAgICAvLyB9KQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDk4YjNhYzk0IC8vIG1ldGhvZCAiUHJvcG9zYWxBcHByb3ZlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYmVnaW5Pck5leHQoZmlyc3Q6IHVpbnQ2NCkgLT4gdm9pZDoKX2JlZ2luT3JOZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjQKICAgIC8vIHByaXZhdGUgX2JlZ2luT3JOZXh0KGZpcnN0OiBib29sZWFuKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDY1CiAgICAvLyBpZiAoZmlyc3QpIG9wLklUeG5DcmVhdGUuYmVnaW4oKQogICAgZnJhbWVfZGlnIC0xCiAgICBieiBfYmVnaW5Pck5leHRfZWxzZV9ib2R5QDIKICAgIGl0eG5fYmVnaW4KICAgIHJldHN1YgoKX2JlZ2luT3JOZXh0X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjYKICAgIC8vIGVsc2Ugb3AuSVR4bkNyZWF0ZS5uZXh0KCkKICAgIGl0eG5fbmV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fcmVzb2x2ZVNlbmRlcihzZW5kZXI6IGJ5dGVzKSAtPiBieXRlczoKX3Jlc29sdmVTZW5kZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA3MAogICAgLy8gcHJpdmF0ZSBfcmVzb2x2ZVNlbmRlcihzZW5kZXI6IEFjY291bnQpOiBBY2NvdW50IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNzEKICAgIC8vIHJldHVybiBzZW5kZXIgPT09IEdsb2JhbC56ZXJvQWRkcmVzcyA/IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzIDogc2VuZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IF9yZXNvbHZlU2VuZGVyX3Rlcm5hcnlfZmFsc2VAMgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHJldHN1YgoKX3Jlc29sdmVTZW5kZXJfdGVybmFyeV9mYWxzZUAyOgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA3MQogICAgLy8gcmV0dXJuIHNlbmRlciA9PT0gR2xvYmFsLnplcm9BZGRyZXNzID8gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MgOiBzZW5kZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX3NldFNlbmRlcklmU2V0KHNlbmRlcjogYnl0ZXMpIC0+IHZvaWQ6Cl9zZXRTZW5kZXJJZlNldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDc2CiAgICAvLyBwcml2YXRlIF9zZXRTZW5kZXJJZlNldChzZW5kZXI6IEFjY291bnQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNzcKICAgIC8vIGlmIChzZW5kZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgb3AuSVR4bkNyZWF0ZS5zZXRTZW5kZXIoc2VuZGVyKQogICAgZnJhbWVfZGlnIC0xCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBfc2V0U2VuZGVySWZTZXRfYWZ0ZXJfaWZfZWxzZUAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgU2VuZGVyCgpfc2V0U2VuZGVySWZTZXRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fc3RvcmVQYXlsb2FkR3JvdXAocHJvcG9zYWxJZDogdWludDY0LCBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzOgpfc3RvcmVQYXlsb2FkR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI0NwogICAgLy8gcHJpdmF0ZSBfc3RvcmVQYXlsb2FkR3JvdXAocHJvcG9zYWxJZDogdWludDY0LCBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwgcGF5bG9hZDogU2FmZVR4bkdyb3VwKTogdm9pZCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjQ4CiAgICAvLyBpZiAocGF5bG9hZC5sZW5ndGggPiBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ6IF9zdG9yZVBheWxvYWRHcm91cF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjQ5CiAgICAvLyB0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlID0gY2xvbmUocGF5bG9hZCkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGludCA3IC8vIDcKICAgICoKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM1MQogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgMTEgLy8gInR4ZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNDkKICAgIC8vIHRoaXMudHJhbnNhY3Rpb25Hcm91cHMocHJvcG9zYWxJZCAqIFRYR19LRVlfTVVMVCArIHBheWxvYWRJbmRleCkudmFsdWUgPSBjbG9uZShwYXlsb2FkKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAoKX3N0b3JlUGF5bG9hZEdyb3VwX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYWNjb3VudFNwZW5kKGdyb3VwSW46IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gYnl0ZXMsIGJ5dGVzOgpfYWNjb3VudFNwZW5kOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjAKICAgIC8vIHByaXZhdGUgX2FjY291bnRTcGVuZChncm91cEluOiBTaWduZXJHcm91cCwgYW1vdW50OiB1aW50NjQpOiBTaWduZXJHcm91cCB7CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI2MwogICAgLy8gaWYgKGFtb3VudCA9PT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjQKICAgIC8vIHJldHVybiBncm91cAogICAgZnJhbWVfZGlnIC0yCiAgICBkdXAKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjcKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNjkKICAgIC8vIGlmIChncm91cC5kYWlseUxpbWl0ICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIGJueiBfYWNjb3VudFNwZW5kX2lmX2JvZHlAMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDAKCl9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzgKICAgIC8vIGlmIChncm91cC5tb250aGx5TGltaXQgIT09IFVpbnQ2NCgwKSkgewogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBieiBfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjc5CiAgICAvLyBpZiAobm93IC0gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID49IE1PTlRIX1NFQ09ORFMpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgMjU5MjAwMCAvLyAyNTkyMDAwCiAgICA+PQogICAgYnogX2FjY291bnRTcGVuZF9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjgwCiAgICAvLyBncm91cC5tb250aGx5VXNhZ2UgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmVwbGFjZTIgNzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjgxCiAgICAvLyBncm91cC5tb250aGx5UGVyaW9kU3RhcnQgPSBub3cKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICByZXBsYWNlMiA4MgogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjgzCiAgICAvLyBhc3NlcnQoZ3JvdXAubW9udGhseVVzYWdlICsgYW1vdW50IDw9IGdyb3VwLm1vbnRobHlMaW1pdCwgJ21vbnRobHkgbGltaXQgZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA3NCAvLyA3NAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZGlnIDEKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBtb250aGx5IGxpbWl0IGV4Y2VlZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI4NAogICAgLy8gZ3JvdXAubW9udGhseVVzYWdlID0gZ3JvdXAubW9udGhseVVzYWdlICsgYW1vdW50CiAgICBpdG9iCiAgICByZXBsYWNlMiA3NAogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTI4NwogICAgLy8gcmV0dXJuIGdyb3VwCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgcmV0c3ViCgpfYWNjb3VudFNwZW5kX2lmX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjcwCiAgICAvLyBpZiAobm93IC0gZ3JvdXAuZGFpbHlQZXJpb2RTdGFydCA+PSBEQVlfU0VDT05EUykgewogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgID49CiAgICBibnogX2FjY291bnRTcGVuZF9pZl9ib2R5QDQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjc0CiAgICAvLyBhc3NlcnQoZ3JvdXAuZGFpbHlVc2FnZSArIGFtb3VudCA8PSBncm91cC5kYWlseUxpbWl0LCAnZGFpbHkgbGltaXQgZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA1MCAvLyA1MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZGlnIDEKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBkYWlseSBsaW1pdCBleGNlZWRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzUKICAgIC8vIGdyb3VwLmRhaWx5VXNhZ2UgPSBncm91cC5kYWlseVVzYWdlICsgYW1vdW50CiAgICBpdG9iCiAgICByZXBsYWNlMiA1MAogICAgZnJhbWVfYnVyeSAwCiAgICBiIF9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUA2CgpfYWNjb3VudFNwZW5kX2lmX2JvZHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjcxCiAgICAvLyBncm91cC5kYWlseVVzYWdlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyNzIKICAgIC8vIGdyb3VwLmRhaWx5UGVyaW9kU3RhcnQgPSBub3cKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICByZXBsYWNlMiA1OAogICAgZnJhbWVfYnVyeSAwCiAgICBiIF9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUA1CgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlKGNoYW5nZVR5cGU6IHVpbnQ2NCwgZ3JvdXA6IGJ5dGVzKSAtPiBieXRlczoKX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjk0CiAgICAvLyBwcml2YXRlIF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlVHlwZTogdWludDY0LCBncm91cDogU2lnbmVyR3JvdXApOiB2b2lkIHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyOTUKICAgIC8vIGlmIChjaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BPTElDWSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2VfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjk2CiAgICAvLyBhc3NlcnQoKGdyb3VwLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfUE9MSUNZKSAhPT0gVWludDY0KDApLCAncG9saWN5IGFkbWluIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAyCiAgICAmCiAgICBhc3NlcnQgLy8gcG9saWN5IGFkbWluIHJlcXVpcmVkCgpfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgpfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEyOTgKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGFkbWluIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBhc3NlcnQgLy8gZ3JvdXAgYWRtaW4gcmVxdWlyZWQKICAgIGIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZV9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZTogYnl0ZXMsIGdyb3VwOiBieXRlcykgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6Cl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMDgKICAgIC8vIHByaXZhdGUgX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlOiBBZG1pbkNoYW5nZSwgZ3JvdXA6IFNpZ25lckdyb3VwKTogYm9vbGVhbiB7CiAgICBwcm90byAyIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzA5CiAgICAvLyBjb25zdCBoYXNHcm91cFByaXYgPSAoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9HUk9VUCkgIT09IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzEwCiAgICAvLyBpZiAoIWhhc0dyb3VwUHJpdiB8fCBncm91cC5hY3RpdmUgPT09IFVpbnQ2NCgwKSkgewogICAgYnogX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5faWZfYm9keUAyCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgZXh0cmFjdF91aW50NjQKICAgIGJueiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9hZnRlcl9pZl9lbHNlQDMKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2lmX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzExCiAgICAvLyByZXR1cm4gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzEzCiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfUFJJVklMRUdFUykgewogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTQKICAgIC8vIGNvbnN0IHdpbGxIYXZlR3JvdXBQcml2ID0gKGNoYW5nZS5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTUKICAgIC8vIHJldHVybiAhd2lsbEhhdmVHcm91cFByaXYgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGJueiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDcKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMSAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzE1CiAgICAvLyByZXR1cm4gIXdpbGxIYXZlR3JvdXBQcml2ICYmIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPD0gVWludDY0KDEpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIDw9CiAgICBieiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxNQogICAgLy8gcmV0dXJuICF3aWxsSGF2ZUdyb3VwUHJpdiAmJiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIDw9IFVpbnQ2NCgxKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgcmV0c3ViCgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDgKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMzE3CiAgICAvLyBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfQUNUSVZFKSB7CiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCA3IC8vIDcKICAgID09CiAgICBieiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxOAogICAgLy8gY29uc3Qgd2lsbEJlQWN0aXZlID0gY2hhbmdlLmFjdGl2ZUZsYWcgIT09IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDExNiAvLyAxMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxOQogICAgLy8gcmV0dXJuICF3aWxsQmVBY3RpdmUgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGJueiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX2ZhbHNlQDEzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzEgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTMxOQogICAgLy8gcmV0dXJuICF3aWxsQmVBY3RpdmUgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPD0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VAMTMKICAgIGludGNfMSAvLyAxCgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMTkKICAgIC8vIHJldHVybiAhd2lsbEJlQWN0aXZlICYmIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPD0gVWludDY0KDEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VAMTM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9ib29sX21lcmdlQDE0Cgpfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEzMjEKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAGAAEIAoCt4gSoASYdAWcEYXBnYwAEFR98dQFtBGdjbnQBcARib290BG5naWQBcgZwYXVzZWQDdHhnB2NyZWF0b3IEbnBpZATQcFB6BHxgWeYCACICABIEDNc1fAIAKgJkcAFhAQADBoEBBG5hbWUDdmVyAgB6AgAKBN7dA6gxGRREMRhBAJuCFQSRS6YzBBoLMDoE1VFWggQLJDynBKw6mjIERCRF9wTc7kQnBPS0hu4E+3CI6AR/UfwoBNyt/5YEtreurQTRzCu2BH/XL1EE+ctKNwRlqqDtBMvXMkIEUDQWFwT0+lRMBLKFcsoE0337IDYaAI4VALUBtAPMBDAESwU0BoQIUAjvCRMJkApGCrsK5gsSC00LhQvEDAMMIgxTAIAEEVdW2zYaAI4BADwAigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScXsh4nF7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k2GgFJIlklCEsBFRJEVwIAJxhLAWcnDDEAZycHImcnCCNnJw0jZycFImcnCiJnJxmAF0JJQVRFQy1BTEdPLVNBRkUtdjEuOC4wZykiZzEASwEVFlcGAk8CUCcQTwJQTFCABOKci0dMULAjQzYaAUkiWSUISwEVEkRXAgAxACInDGVEEkQiJwdlRBREIicFZUQURDIHIicIZURLAhUWVwYCTwNQIxYiFk8EFoA6AHoAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAcAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsBUEsCUEsCUExQSwFQSwFQTFBLAVBLAlBLAxYoSwFQSbxITwK/gAoAAAAAAAAAAQAqMQBQgAkAB2NyZWF0b3JQSwExAFAnBExQSbxITL9PAyMIJwhMZyInBWVEIwgnBUxnJwcjZykjZ0knEVBLAlBPA1AnEkxQsDEAUExQJw5MULAjQyJHAipHBDYaAUcCFUsBIllJgToSRE8CTEsCUklOAiJZgTwIEkQ2GgJJIllJTgIlC0xJFUxXAgAiSUsFDEEAM0cCJQtLA0lPAllJSwdJTgQSREsBFVJJFUsBgShZSYEqEkRMUiJZgSwICEUFIwhFAUL/xksDJQhLAxJENhoDSRUkEkQXSUUNIw1BAAZLCyKI/coxACInDGVEEkQiJwdlRBRESwRESwYlW0lFCkEBZksISwUOQQFeI0RLBkmBEltJgT8OREsBgQpbSUULSYEHDkRLAoEyW0khBA5EMgciJwhlTElOB0USREsLVwIASwVXGghLBlciCE8HVyoISwMVFlcGAk8EUElOB0UYSxEWSUUYJxpMUEsOFlBPBhZQTwcWUE8DUE8CUCIWTEsBUE8DFkxLAVBPA1BLAlBMUE8CFlBLAVBMUCMWUExQTBZJRQ8oTFBJvEhMvyJFCksJSwUMQQB5SwlJJQtLA0lOA0xZTCMISUUNSwdLAQlLAxVPAiULSwRMWU8CTVJJVwAgSTIDE0RLDksBUCcESwFQSb1FARRESwOBKFlLBBVLBU4CUlcCAE8EVyAISwEVFlcGAk8CUEsBJxNQTwVQTFBLArxITwJMv1AnDkxQsEL/f0sKIwgnCExnIicFZUQjCCcFTGdLByMaQQAJIillRCMIKUxnSwxJJxFQSw9QSxBQJxJMULArTFCwI0MiQv6fNhoBSRWBIBJENhoCSSJZJQhLARUSRFcCADEAIicMZUQSRCInB2VEFERLATIDE0QnCUsCUEm9RQEURDIGSwIVFlcGAk8DUEwWJxtMUEsBUEsCvEhPAky/TCcQUExQJxxMULAjQzEAIicMZUQSRCInB2VEFEQiKWVERCcHI2cjQyIqRwM2GgFJFSQSRBc2GgJHAiJZSU4CJQtMSRVMVwIAIklLBQxBADJHAiULSwNJTwJZSUsHSU4EEkRLARVSSRVLASRZSYEKEkRMUiJZgQwICEUFIwhFAUL/x0sDJQhLAxJENhoDSRUkEkQXRQk2GgRJFSMSRCJTRQo2GgVJFSQSRBdJRQwjDUEABksKIoj7NEsESUSBEA5EIicKZUQUREsGSYgHjUkWKExQgXIkuhdEI0sKiBVfSUUJSSNLCIgWZUwWSUUOJwZMUEm+RCMWXFBPAiJZFlxov0sJQQAFSweIB2orSwxQsCNDIkcCKkk2GgFJFSQSRBc2GgJHAhUkEkQXNhoDRwIiWUlOAiULTEkVTFcCACJJSwUMQQAyRwIlC0sDSU8CWUlLB0lOBBJESwEVUkkVSwEkWUmBChJETFIiWYEMCAhFBSMIRQFC/8dLAyUISwMSRDYaBEkVJBJEF0lFDCMNQQAGSwoiiPpXIicKZUQUREsGJQ9BALpLBoEGDkEAsiNESwRESwgWJwZMUElFD75MSU4CRQ5ESYEQWyMSRCRbSUULIxJAAAdLCSUSQQB/I0QyBksMSU4CgShbDkRJIluIBmwxAEsBVzAgEkRJgRhbIxJESwmBBwtLCAhMgWhbTBYnC0xQSUUPvUUBQQAHSw0iJboXCUsFCEmBEA5ESwlLCElOA0sJiBUZSBZLDUlPAlxoSYFgWyMIFlxgTgKBUFsNQQAESwhcUEsOTL8jQyJC/34iQv9LKjYaAUkVJBJEFzYaAkcCFUsBgRBZSYF8EkRLAkxLAlIiWYF+CEsCgTpZSUsCEkRPA0xLA1IiWSUICBJENhoDSRUkEkQXNhoESRUkEkQXSSMNQQAFSSKI+TJLA0mIBZoWKExQSb5ETIFyJLoXREsDIltJRQdJTwKIFTxIIxJBAEFLAkmBPFtESVcSIDIDE0RJgUxbgT8OREmBRFuBBw5EgWxbIQQOREsDgQVLA4gTLRYnFEsBUEm8SEsEvytMULAjQ0sEJRJBABpLAklXCAgoTFC9RQFESVcSIDIDE0RFA0L/xEsEgQMSQQAQSwJJVwgIKExQvUUBREL/40sEgQQSQQAVSwJJVwgIKExQvUUBREmBPFtEQv/GSwSBBRJBACBLAklXCAgoTFC9RQFESYFMW4E/DkRJgWxbIQQOREL/nksEgQYSQQAjSwJJVwgIKExQSb1FAURLAYFEW4EHDkS+SIgUdEhMFERC/3NLBIEHEkEAGksCSVcICChMUEm9RQFEvkiIFFJITBREQv9RSwQkEkEAGEsCVxIgSTIDE0QnCUxQvUUBFERLAkL/MksEgQkSQQAQSwJXEiAnCUxQvUUBREL/40sEgQoSREL/2iJJKjYaAUkVJBJEFzYaAkkVJBJEFzYaA0kVJBJEF0kjDUEABUkiiPeWSwIWSUUHJwZMUL5MSU4CRQdEJFtJRQUjEkAAB0sDJRJBAE8jRDIGSwVJTgKBKFsORDEASwFXAAhJTwJQJwRMUL1FAURLBzEAUCcVTFC9RQEURChMUIFqJLoXSwGBWFsSREmBYFtLAxJESwNMiBH+SCNDIkL/rjYaAUkVJBJEFzYaAkkVJBJEF0kjDUEABUkiiPcDSwGIA4YjQyJHAio2GgFJFSQSRBc2GgJJFSQSRBdJIw1BAAVJIoj220sBFklFBicGTFBJRQe+TElOAkUGRCRbSUUEIxJAAAdLAiUSQQAyI0QxAEsESU4CVzAgEkxXAAgxAFAnBExQvUUBEUSBBBZLBiRPAruABK4qvAZLBVCwI0MiQv/LIkcEKkk2GgFJFSQSRBc2GgJJFSQSRBdJIw1BAAVJIoj2XUsBFklFBycGTFBJRQq+TElOAkUHRCRbSUUEgQMSQAAISwKBBBJBAGgjRDIGSwVJTgKBKFsNREkiW4gCj4EQWyMSQQA3I0UESwSBUFtLBA9BACNLAYEHC0sECBYnC0xQSUUJvUUBQQAESwe8SEsDIwhFBEL/0ksIvEgjQycUSwZQSUUIvUUBQf/sSwa8SEL/5SJC/5U2GgFJFSQSRBdJIw1BAAVJIoj1tSInGGVEIicFZUQiJwhlRCInDWVEIicKZUQiJxllREsFFRZXBgJPBlBJFYEkCE8GFoACACRMUE8GFlBPBRZQTwQWUEsDFRZXBgJPBFBPAhZXBgJPAkxQTwJQTFArTFCwI0M2GgFJFSQSRBc2GgJJFSQSRBdJIw1BAAVJIoj1N0sBFihMUL5EK0xQsCNDNhoBSRUkEkQXNhoCSRUkEkQXSSMNQQAFSSKI9QxLARYnBkxQvkQrTFCwI0M2GgFJFSQSRBc2GgJJFSQSRBc2GgNJFSQSRBdJIw1BAAVJIoj010sCgQcLSwIIFicLTFC+RCtMULAjQzYaAUkVJBJEFzYaAkkVgSASRDYaA0kVJBJEF0kjDUEABUkiiPScSwIWSwJQJwRMUL5EK0xQsCNDNhoBSRUkEkQXNhoCSRWBIBJENhoDSRUkEkQXSSMNQQAFSSKI9GRLAhZLAlAnBExQvUUBJxYiTwJUK0xQsCNDNhoBSRUkEkQXNhoCSRWBIBJENhoDSRUkEkQXSSMNQQAFSSKI9CVLAhZLAlAnFUxQvUUBJxYiTwJUK0xQsCNDNhoBSRUkEkQXSSMNQQAFSSKI8/giKWVEFitMULAjQzYaAUkVgSASRDYaAkkVJBJEF0kjDUEABUkiiPPQJwlLAlC9RQEnFiJPAlQrTFCwI0M2GgFJFYEgEkQ2GgJJFSQSRBdJIw1BAAVJIojznycJSwJQvkQrTFCwI0OKAQCL/xYoSwFQvUUBRDEAUCcETFC9RQFEiYoBACJHJipHJov/FkknBkxQSb5MSU8CREkkWyUSRDIGSwGBKFsORElXAAgoTFBJTgJJvkxOA0RJgXIkuhdETIEgW0lPAiUkuhdJTgIPQQ10i1OLUEmBGFtPAg9Ei1GBaiS6F0sBgVhbEkSBEFsjEkEIwSInCmVEFESLUYFaJLoXSYxEQQAWi1GBYiS6F0mMRUEACTIGi0WLRAgPRItQgVBbjDgjjDmLUkmMF4wYizmLOA5BA2+L/4EHC4s5CBYnC0xQSYwQvUUBQAARixeMGYs5IwiMOYsZjBdC/9GLEL5MjBxEIowxixeMGYsQIiW6F4sxDUH/2SWLMQslCIsQSU8CJboXJQgkuhdJjEMjEkEAkYscSVcCAEwiWYsxSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUkmMA4sYgRpbIxpESVciIDIDE0SBSltJjEdBAAmLA1dSIDIDE0QijC6LUoEiW0AAEItHQQAiiwNXAiCIDTpgjC6LUosuiA1xSIxSixiMGYsxIwiMMUL/UosDgUJbjC5C/9+LQyUSQQCoixxJVwIATCJZizFJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwJixiBGlslGkRJVyogMgMTRIFSW0mMR0EACYsJV1ogMgMTRItSgSJbSYxMQQBEiwmBIluLTBJBADkjIowvQQAXi0dBACOLCUlXAiCIDI9MgSJbcABIjC+LUosviAzASIxSixiMGUL/TIsJgUpbjC9C/+UiQv/Ei0OBAxJBAPuLHElXAgBMIlmLMUklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJVwIAixiBGluBBBpESwElW0lEMggTREyBCltJgQUORIEEE0RJgRBZSwGBEllLAk8CSwJSSYwNIllJTgOMN0sBgRRZSwJPAksCUiJZSwKBFllLA08DSwJSIllLA4EYWU8ETwNPAlIiWU8DgRAOREsCgQQOREsBJA5ESSQORE4CCAgkDkQijEEijDKLMos3DEmMO0EAKIsNVwIAiztEizJJTgIlC0sBTFlKWSUIWFcCABWLQQiMQSMIjDJC/82LQYGAEA5EixiMGUL+O4tDgQQSQQALixiBGlskGkRC/iiLQ4EFEkEAZYscSVcCAEwiWYsxSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUlcCAIsYgRpbgRAaREmBJllLASEFWVJXAgAVSYw+QQAIiz6BIBJBAAkjRIsYjBlC/b8iQv/0i0OBBhJEixxJVwIATCJZizFJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSixhJgRpbgSAaRIESWyMaRFciIDIDE0RC/6UyBhaLUkxcYotRSbxITL8ijEIjjDqLOos4DkEE3Yv/gQcLizoIFicLTFBJjBK9RQFBBL6LEr5MjB1EIowzixIiJboXizMNQQSoi0IUjDAlizMLJQiLEklPAiW6FyUIJLoXSYxIIxJBAIyLHUlXAgBMIlmLM0klC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjARJVwIAjB6LMIgJ4SOyECKyAUlXAiCICfFJVyIgsgdJgUJbsgiBSltBAAeLBFdSILIJix5JgXBZSwEVUlcCAEmMJCoTQQAEiySyBYtCIwiMQoszIwiMM0L/SItIJRJBAIeLHUlXAgBMIlmLM0klC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjAVJVwIAjB6LMIgJToEEshAisgFJVwIgiAldSYEiW7IRSVcqILIUSYFKW7ISgVJbQQAHiwVXWiCyFYseSYF4WUsBFVJXAgBJjCUqE0H/aoslsgVC/2OLSIEDEkEBQIsdSVcCAEwiWYszSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUklXAgBJTgKMHoswiAi/gQayECKyAUklW7IYgQpbshlJgRhZSU4CjCdJFUxOAlJXAgBJjCEqE0EABIshsgUijDGLHkmBEFlLAYESWUmMKFJJjAYiWYsxDUmMPUEAJIsGVwIAiz1EizFJTgIlC0sBTFlKWSUIWFcCALIaIwiMMUL/vyKMNIseSYEUWUmMKYsoTFJJjAciWYs0DUEAGYsHVwIAizRJTgKBIAuBIFiyHCMIjDRC/88ijDWLHkmBFllJjCqLJ1JJjAgiWYs1DUEAFosIVwIAizVJTgIkC1uyMCMIjDVC/9MijDaLHospiypSSYwKIlmLNg1B/jGLClcCAIs2SU4CJAtbsjIjCIw2Qv/Yi0iBBBJBAI+LHUlXAgBMIlmLM0klC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjAtJVwIAjB6LMIgHdyWyECKyASVbQf3Kix5JJFlLAYEKWUsCTwJLAlJXAgCyCksBgQxZSwJPAksCUlcCALILSwEVUlcCALI/iwtJgRBbsgxJgRhbsg2BIFuyDkL9hItIgQUSQQEPix1JVwIATCJZizNJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwMSVcCAIweizCIBuCBA7IQIrIBJVtJjENAALuLDEmBCluyIkmBEluyI4EaWyITsiSLHkmBIFlLAYEiWUmMK1JXAgBJjCMqE0EABIsjsiWLHkmBJFlJjCyLK0xSVwIASYwlKhNBAASLJbImix5JgSZZSYwtiyxMUlcCAEmMJioTQQAEiyayJ4seSSEFWYstTFJXAgBJjB8VgSASQQAEix+yKIsMSVcqILIpSVdKILIqSVdqILIrV4ogsiyLHkkhBVlLARVSVwIASYwgKhNB/HuLILIFQvx0i0OyIUL/xItIgQYSQfxlix1JVwIATCJZizNJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSVcCAIswiAXOI7IQIrIBSwFXAiBJiAXciAXIsgcisghMVyIgsiBJgUBZSwEVUlcCAEmMIioTQfv8iyKyBUL79Ys6IwiMOkL7G7OBAxaLTyRPAruABDXGfv2LTlCwiScUi05QSYwRSb5MjBREIiS6F0mMRkmLUogGVUgjEkEBODIHIicIZUSLEUmBPCS6F0kjDkSLFEmBEFlLAYE6WUsCTwJLAlJXAgBLBIFEJLoXSwWBTCS6F0sGgVQkuhdLB4FcJLoXSwiBZCS6F0sJgWwkuhdLBhUWVwYCTwdQSU4IjABPCRZJjA4nGkxQIxZMSwFQSwcWUE8GFlBPBRZQTwQWUCIWTEsBUE8LFkxLAVBPBRZQSwJQTFBPAxZQSwFQTFBMUE8DUEsFFkmMFShLAVBJvEhPAr9LBIEyJLoXSwQVTwVPBU8CUlcCAE8EgwISILpPAhZJTgKMD0sCFRZXBgJPA1BPAicTUEsCUExQTgJQSYwCJwRMUEm8SEy/TCMIJwhMZyInBWVEIwgnBUxnIxpBAAkiKWVEIwgpTGeLFScRUIsOUIsAUCcSTFCwiwKLD1AnDkxQsEL+k4tGJRJBAGuLEUkkSboXSwGDAhIgukwWSUsCUCcESwFQSb1FARRETwSBMiS6F4sUSYE6WUsBFVJXAgBMFksBFRZXBgJPAlBLAScTUE8GUExQSwK8SE8CTL8oTwNQSYEKJLoXIwgWgQpMu1AnDkxQsEL+IYtGgQMSQQBYixFJJEm6F0yDAhIgukwWSU8CUCcESwFQSb1FAUQoTwNQSb5ESwGBCiS6FyMJSwIlJLoXSwEORE8DvEgWXApJgWpbIwgWXGpLAbxIv4AEKxTCwUxQsEL9wYtGJBJBAEqLEYMCEiC6JwlLAVBJvUUBFESLFEmBOllLARVSVwIAMgZLARUWVwYCTwJQTBYnG0xQSwFQSwK8SE8CTL9MJxBQTFAnHExQsEL9cItGgQkSQQAfixGDAhIguicJSwFQSb1FAUS8SIAE20ylKkxQsEL9SYtGgQQSQQAoixFJJEm6FxYoSwFQTwKBPCS6SRdLAoEKJLoXDkQlTLsnD0xQsEL9GYtGgQUSQQB5ixFJJEm6FxZJjBYoTFBJjBNJvkRMgSIkuhdLAoFUJLpJF08CE0sDgUwkuk8DTFwaTwJcIksCgVwkulwqSwKBZCS6XEJPAoFsJLpcWkxBABkyByIWTwJLAVwyTwIWTEsBXDpPAlxKTFxSixNJvEhMvycPixZQsEL8mItGgQYSQQCJixEkSboXFihMUL5EixRMiAMjSU4DjBpJTgOMFBRESYESWyMajDxLAVdECIwBTIFEWyMajD+BcltJjElBADCLPEEAK4s/QAAmIillRCMJKUxnixqLAVwSixRXCAgoSwFQSbxITwK/Jw9MULBC/CKLSUH/3os8QP/Ziz9B/9QiKWVEIwgpTGdC/8iLRoEHEkEAiYsRJEm6FxYoTFC+RIsUTIgCkklOA4wbSU4DjBQUREmBElsjGklOAoxAgXJbjEpMgXRbSYxLIhOMTUEAMotKQQAti0tAACgiKWVEIwkpTGeLTRaLG0xccosUVwgIKEsBUEm8SE8CvycPTFCwQvuRi0BB/9yLSkD/14tLQf/SIillRCMIKUxnQv/GixGBdCS6FyITJwpLAWcWgATEp5JjTFCwQvtbi1RC8omKAwEiJwdlRCMSRIv/MgYNRIv9FihLAVAiJw1lREsBJSS6FzEATwOBaiS6FyMWSwVLAVCL/hZMSwFQIhZMSwFQTwYWUIv/FlBPBVBLAVBPBBZQTwNQTFBLAhYnBksBUEsCv0sDIwgnDUxnMQBMTwVQTwNQTFCABLNR2FdMULBLAUyIAAJIiYoCATEAMgYWUDEAi/4WSU4DTFAnFUxQTL+L/4EYWyMIFov/TFwYRwKBGFtMgSBbD0EABCUWXAgnBosASU4CUE8CSU4CvzEATFcYCE4CUExQgASYs6yUTFCwi/9MiYoBAIv/QQACsYm2iYoBAYv/MgMSQQADMgqJi/+JigEAi/8yAxNBAASL/7IAiYoDAYv/IllBABOL/YEHC4v+CBYnC0xQSbxIi/+/i/+JigICIiqL/0AACIv+SU8DTwOJMgeMAYv+gSpbQABMi/6MAIsAgUJbQQA3iwCBUluLAUwJgYCangEPQQAOIhaLAExcSosBFlxSjACLAEmBSluL/whLAYFCW0sBD0QWXEqMAIsAi/5PA08DiYv+gTpbiwFMCYGAowUPQAAei/6MAIsASYEyW4v/CEsBgSpbSwEPRBZcMowAQv+JIhaL/kxcMosBFlw6jABC/9WKAgGL/oEFEkEAC4v/gRJbJRpEi/+Ji/+BElsjGkRC//KKAgMqi/+BElsjGkEACIv/gXJbQAAIIov+i/9PA4mL/iJbSYwAgQYSQQAfi/6BRFsjGkAAESIpZUQjDkEACCOL/ov/TwOJIkL/9YsAgQcSQQAdi/6BdFtAABEiKWVEIw5BAAgji/6L/08DiSJC//Uii/6L/08DiQ==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "RekeyedAddressAdded", "args": [ { "type": "address", "name": "addr" }, { "type": "string", "name": "label" } ] }, { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "RekeyedAddressRemoved", "args": [ { "type": "address", "name": "addr" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "SafePaused", "args": [ { "type": "uint64", "name": "paused" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] }, { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "templateVariables": {} }