{ "name": "Arc1643", "structs": { "ApprovalStruct": [ { "name": "approvalAmount", "type": "uint256" }, { "name": "owner", "type": "address" }, { "name": "spender", "type": "address" } ], "arc1410_HoldingPartitionsPaginatedKey": [ { "name": "holder", "type": "address" }, { "name": "page", "type": "uint64" } ], "arc1410_OperatorKey": [ { "name": "holder", "type": "address" }, { "name": "operator", "type": "address" }, { "name": "partition", "type": "address" } ], "arc1410_OperatorPortionKey": [ { "name": "holder", "type": "address" }, { "name": "operator", "type": "address" }, { "name": "partition", "type": "address" } ], "arc1410_PartitionKey": [ { "name": "holder", "type": "address" }, { "name": "partition", "type": "address" } ], "arc1410_can_transfer_by_partition_return": [ { "name": "code", "type": "byte" }, { "name": "status", "type": "string" }, { "name": "receiverPartition", "type": "address" } ], "arc1410_partition_issue": [ { "name": "to", "type": "address" }, { "name": "partition", "type": "address" }, { "name": "amount", "type": "uint256" }, { "name": "data", "type": "byte[]" } ], "arc1410_partition_redeem": [ { "name": "from", "type": "address" }, { "name": "partition", "type": "address" }, { "name": "amount", "type": "uint256" }, { "name": "data", "type": "byte[]" } ], "arc1410_partition_transfer": [ { "name": "from", "type": "address" }, { "name": "to", "type": "address" }, { "name": "partition", "type": "address" }, { "name": "amount", "type": "uint256" }, { "name": "data", "type": "byte[]" } ], "arc1594_issue_event": [ { "name": "to", "type": "address" }, { "name": "amount", "type": "uint256" }, { "name": "data", "type": "byte[]" } ], "arc1594_redeem_event": [ { "name": "from", "type": "address" }, { "name": "amount", "type": "uint256" }, { "name": "data", "type": "byte[]" } ], "arc1643_document_record": [ { "name": "uri", "type": "string" }, { "name": "hash", "type": "byte[]" }, { "name": "timestamp", "type": "uint64" } ], "arc1643_document_removed_event": [ { "name": "name", "type": "byte[]" }, { "name": "uri", "type": "string" }, { "name": "hash", "type": "byte[]" } ], "arc1643_document_updated_event": [ { "name": "name", "type": "byte[]" }, { "name": "uri", "type": "string" }, { "name": "hash", "type": "byte[]" } ] }, "methods": [ { "name": "arc1643_set_document", "args": [ { "type": "byte[]", "name": "name" }, { "type": "string", "name": "uri" }, { "type": "byte[]", "name": "hash" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "DocumentUpdated", "args": [ { "type": "(byte[],string,byte[])", "name": "0", "struct": "arc1643_document_updated_event" } ] } ], "recommendations": {} }, { "name": "arc1643_get_document", "args": [ { "type": "byte[]", "name": "name" } ], "returns": { "type": "(string,byte[],uint64)", "struct": "arc1643_document_record" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "arc1643_remove_document", "args": [ { "type": "byte[]", "name": "name" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "DocumentRemoved", "args": [ { "type": "(byte[],string,byte[])", "name": "0", "struct": "arc1643_document_removed_event" } ] } ], "recommendations": {} }, { "name": "arc1643_get_all_documents", "args": [], "returns": { "type": "byte[][]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "arc1594_set_issuable", "args": [ { "type": "bool", "name": "flag" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "arc1594_issue", "args": [ { "type": "address", "name": "to" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "Issue", "args": [ { "type": "(address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_issue" } ] }, { "name": "Issue", "args": [ { "type": "(address,uint256,byte[])", "name": "0", "struct": "arc1594_issue_event" } ] } ], "recommendations": {} }, { "name": "arc1594_redeemFrom", "args": [ { "type": "address", "name": "from" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "Redeem", "args": [ { "type": "(address,uint256,byte[])", "name": "0", "struct": "arc1594_redeem_event" } ] } ], "recommendations": {} }, { "name": "arc1594_redeem", "args": [ { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "Redeem", "args": [ { "type": "(address,uint256,byte[])", "name": "0", "struct": "arc1594_redeem_event" } ] } ], "recommendations": {} }, { "name": "arc1594_transfer_with_data", "args": [ { "type": "address", "name": "to" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "Transfer", "args": [ { "type": "(address,address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_transfer" } ] }, { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc1594_transfer_from_with_data", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "arc200_Approval", "args": [ { "type": "address", "name": "owner" }, { "type": "address", "name": "spender" }, { "type": "uint256", "name": "value" } ] }, { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc1594_is_issuable", "args": [], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "arc1410_balance_of_partition", "args": [ { "type": "address", "name": "holder" }, { "type": "address", "name": "partition" } ], "returns": { "type": "uint256" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "arc200_transfer", "args": [ { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "Transfer", "args": [ { "type": "(address,address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_transfer" } ] }, { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc1410_transfer_by_partition", "args": [ { "type": "address", "name": "partition" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "address" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Transfer an amount of tokens from partition to receiver. Sender must be msg.sender or authorized operator.", "events": [ { "name": "Transfer", "args": [ { "type": "(address,address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_transfer" } ] } ], "recommendations": {} }, { "name": "arc1410_partitions_of", "args": [ { "type": "address", "name": "holder" }, { "type": "uint64", "name": "page" } ], "returns": { "type": "address[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "arc1410_is_operator", "args": [ { "type": "address", "name": "holder" }, { "type": "address", "name": "operator" }, { "type": "address", "name": "partition" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "arc1410_authorize_operator", "args": [ { "type": "address", "name": "holder" }, { "type": "address", "name": "operator" }, { "type": "address", "name": "partition" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "arc1410_revoke_operator", "args": [ { "type": "address", "name": "holder" }, { "type": "address", "name": "operator" }, { "type": "address", "name": "partition" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "arc1410_operator_transfer_by_partition", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "partition" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "address" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "Transfer", "args": [ { "type": "(address,address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_transfer" } ] } ], "recommendations": {} }, { "name": "arc1410_can_transfer_by_partition", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "partition" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "(byte,string,address)", "struct": "arc1410_can_transfer_by_partition_return" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "arc1410_authorize_operator_by_portion", "args": [ { "type": "address", "name": "holder" }, { "type": "address", "name": "operator" }, { "type": "address", "name": "partition" }, { "type": "uint256", "name": "amount" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "arc1410_is_operator_by_portion", "args": [ { "type": "address", "name": "holder" }, { "type": "address", "name": "operator" }, { "type": "address", "name": "partition" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "arc1410_issue_by_partition", "args": [ { "type": "address", "name": "to" }, { "type": "address", "name": "partition" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "Issue", "args": [ { "type": "(address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_issue" } ] } ], "recommendations": {} }, { "name": "arc1410_redeem_by_partition", "args": [ { "type": "address", "name": "partition" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "Redeem", "args": [ { "type": "(address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_redeem" } ] } ], "recommendations": {} }, { "name": "arc1410_operator_redeem_by_partition", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "partition" }, { "type": "uint256", "name": "amount" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "Redeem", "args": [ { "type": "(address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_redeem" } ] } ], "recommendations": {} }, { "name": "bootstrap", "args": [ { "type": "byte[]", "name": "name" }, { "type": "byte[]", "name": "symbol" }, { "type": "uint8", "name": "decimals" }, { "type": "uint256", "name": "totalSupply" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_name", "args": [], "returns": { "type": "byte[32]", "desc": "The name of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the name of the token", "events": [], "recommendations": {} }, { "name": "arc200_symbol", "args": [], "returns": { "type": "byte[8]", "desc": "The symbol of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the symbol of the token", "events": [], "recommendations": {} }, { "name": "arc200_decimals", "args": [], "returns": { "type": "uint8", "desc": "The decimals of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the decimals of the token", "events": [], "recommendations": {} }, { "name": "arc200_totalSupply", "args": [], "returns": { "type": "uint256", "desc": "The total supply of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the total supply of the token", "events": [], "recommendations": {} }, { "name": "arc200_balanceOf", "args": [ { "type": "address", "name": "owner", "desc": "The address of the owner of the token" } ], "returns": { "type": "uint256", "desc": "The current balance of the holder of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the current balance of the owner of the token", "events": [], "recommendations": {} }, { "name": "arc200_transferFrom", "args": [ { "type": "address", "name": "from", "desc": "The source of the transfer" }, { "type": "address", "name": "to", "desc": "The destination of the transfer" }, { "type": "uint256", "name": "value", "desc": "Amount of tokens to transfer" } ], "returns": { "type": "bool", "desc": "Success" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Transfers tokens from source to destination as approved spender", "events": [ { "name": "arc200_Approval", "args": [ { "type": "address", "name": "owner" }, { "type": "address", "name": "spender" }, { "type": "uint256", "name": "value" } ] }, { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_approve", "args": [ { "type": "address", "name": "spender", "desc": "Who is allowed to take tokens on owner's behalf" }, { "type": "uint256", "name": "value", "desc": "Amount of tokens to be taken by spender" } ], "returns": { "type": "bool", "desc": "Success" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Approve spender for a token", "events": [ { "name": "arc200_Approval", "args": [ { "type": "address", "name": "owner" }, { "type": "address", "name": "spender" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_allowance", "args": [ { "type": "address", "name": "owner", "desc": "Owner's account" }, { "type": "address", "name": "spender", "desc": "Who is allowed to take tokens on owner's behalf" } ], "returns": { "type": "uint256", "desc": "The remaining allowance" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the current allowance of the spender of the tokens of the owner", "events": [], "recommendations": {} }, { "name": "arc88_owner", "args": [], "returns": { "type": "address" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "arc88_is_owner", "args": [ { "type": "address", "name": "query" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "arc88_initialize_owner", "args": [ { "type": "address", "name": "new_owner" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Explicit initialization override (creation group recommended). Fails if already initialized.", "events": [], "recommendations": {} }, { "name": "arc88_transfer_ownership", "args": [ { "type": "address", "name": "new_owner" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "arc88_OwnershipTransferred", "args": [ { "type": "address", "name": "previous_owner" }, { "type": "address", "name": "new_owner" } ] } ], "recommendations": {} }, { "name": "arc88_renounce_ownership", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "arc88_OwnershipRenounced", "args": [ { "type": "address", "name": "previous_owner" } ] } ], "recommendations": {} }, { "name": "arc88_transfer_ownership_request", "args": [ { "type": "address", "name": "pending" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "arc88_OwnershipTransferRequested", "args": [ { "type": "address", "name": "previous_owner" }, { "type": "address", "name": "pending_owner" } ] } ], "recommendations": {} }, { "name": "arc88_accept_ownership", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "arc88_OwnershipTransferAccepted", "args": [ { "type": "address", "name": "previous_owner" }, { "type": "address", "name": "new_owner" } ] }, { "name": "arc88_OwnershipTransferred", "args": [ { "type": "address", "name": "previous_owner" }, { "type": "address", "name": "new_owner" } ] } ], "recommendations": {} }, { "name": "arc88_cancel_ownership_request", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 8 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "arc1594_issuable": { "keyType": "AVMString", "valueType": "bool", "key": "YXJjMTU5NF9pc3M=" }, "name": { "keyType": "AVMString", "valueType": "byte[]", "key": "bg==", "desc": "Name of the asset. Max 32 bytes" }, "symbol": { "keyType": "AVMString", "valueType": "byte[]", "key": "cw==", "desc": "Symbol of the asset. Max 8 bytes" }, "decimals": { "keyType": "AVMString", "valueType": "uint8", "key": "ZA==", "desc": "Decimals of the asset. Recommended is 6 decimal places." }, "totalSupply": { "keyType": "AVMString", "valueType": "uint256", "key": "dA==", "desc": "Minted supply" }, "owner": { "keyType": "AVMString", "valueType": "address", "key": "YXJjODhfbw==" }, "pendingOwner": { "keyType": "AVMString", "valueType": "address", "key": "YXJjODhfcG8=" }, "initialized": { "keyType": "AVMString", "valueType": "byte", "key": "YXJjODhfb2k=" } }, "local": {}, "box": { "documentKeys": { "keyType": "AVMString", "valueType": "byte[][]", "key": "YXJjMTY0M19kb2Nz" } } }, "maps": { "global": {}, "local": {}, "box": { "documents": { "keyType": "byte[]", "valueType": "arc1643_document_record", "prefix": "YXJjMTY0M19kb2M=" }, "partitions": { "keyType": "arc1410_PartitionKey", "valueType": "uint256", "prefix": "YXJjMTQxMF9w" }, "holderPartitionsCurrentPage": { "keyType": "address", "valueType": "uint64", "prefix": "YXJjMTQxMF9ocF9w" }, "holderPartitionsAddresses": { "keyType": "arc1410_HoldingPartitionsPaginatedKey", "valueType": "address[]", "prefix": "YXJjMTQxMF9ocF9h" }, "operators": { "keyType": "arc1410_OperatorKey", "valueType": "byte", "prefix": "YXJjMTQxMF9vcA==" }, "operatorPortionAllowances": { "keyType": "arc1410_OperatorPortionKey", "valueType": "uint256", "prefix": "YXJjMTQxMF9vcGE=" }, "balances": { "keyType": "address", "valueType": "uint256", "prefix": "Yg==" }, "approvals": { "keyType": "byte[32]", "valueType": "ApprovalStruct", "prefix": "YQ==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1626, 1679, 1699, 1778, 1927, 1940, 2030, 2043, 2146, 2227, 2276, 2308, 2432, 2574, 2769, 2954, 3017, 3075, 3090, 3207, 3296, 3379, 3444, 3482, 3568, 3575, 3605, 3618, 3726, 3773, 3780, 3813, 3826, 4112, 4244 ], "errorMessage": "Box must have value" }, { "pc": [ 3043, 4245 ], "errorMessage": "Index access is out of bounds" }, { "pc": [ 3613, 3821 ], "errorMessage": "Insufficient balance" }, { "pc": [ 4133 ], "errorMessage": "Insufficient balance at the sender account" }, { "pc": [ 3572, 3777 ], "errorMessage": "Insufficient partition balance" }, { "pc": [ 3182, 3411, 3549 ], "errorMessage": "Invalid amount" }, { "pc": [ 3899 ], "errorMessage": "Name of the asset must be longer or equal to 1 character" }, { "pc": [ 3902 ], "errorMessage": "Name of the asset must be shorter or equal to 32 characters" }, { "pc": [ 2459, 3753 ], "errorMessage": "Not authorized operator" }, { "pc": [ 524, 536, 548, 563, 575, 590, 605, 624, 640, 662, 684, 709, 728, 744, 760, 776, 792, 820, 844, 865, 889, 914, 938, 969, 1000, 1021, 1042, 1067, 1089, 1117, 1139, 1161, 1177, 1205, 1230, 1248, 1269, 1290, 1305, 1321, 1336, 1355 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ 3891 ], "errorMessage": "Only deployer of this smart contract can call bootstrap method" }, { "pc": [ 2333 ], "errorMessage": "Only holder can authorize" }, { "pc": [ 3318 ], "errorMessage": "Only holder can authorize portion" }, { "pc": [ 2358 ], "errorMessage": "Only holder can revoke" }, { "pc": [ 3565, 3770 ], "errorMessage": "Partition balance missing" }, { "pc": [ 2437, 3731 ], "errorMessage": "Portion allowance exceeded" }, { "pc": [ 3910 ], "errorMessage": "Symbol of the asset must be longer or equal to 1 character" }, { "pc": [ 3914 ], "errorMessage": "Symbol of the asset must be shorter or equal to 8 characters" }, { "pc": [ 3921 ], "errorMessage": "This method can be called only once" }, { "pc": [ 4408 ], "errorMessage": "already_initialized" }, { "pc": [ 1381 ], "errorMessage": "can only call when creating" }, { "pc": [ 527, 539, 551, 566, 578, 593, 608, 627, 643, 665, 687, 712, 731, 747, 763, 779, 795, 823, 847, 868, 892, 917, 941, 972, 1003, 1024, 1045, 1070, 1092, 1120, 1142, 1164, 1180, 1208, 1233, 1251, 1272, 1293, 1308, 1324, 1339, 1358 ], "errorMessage": "can only call when not creating" }, { "pc": [ 1828, 1962, 2065, 2131, 3501, 3637, 3845, 3974, 3989, 4005, 4010, 4309, 4338, 4360, 4372, 4399, 4439, 4450, 4472, 4478, 4503, 4524, 4537, 4567, 4575, 4610 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 1512 ], "errorMessage": "empty_name" }, { "pc": [ 4037 ], "errorMessage": "insufficient approval" }, { "pc": [ 1935, 2038 ], "errorMessage": "insufficient_balance" }, { "pc": [ 3982, 3998, 4214 ], "errorMessage": "invalid size" }, { "pc": [ 1814, 1909, 2015 ], "errorMessage": "invalid_amount" }, { "pc": [ 1837 ], "errorMessage": "issuance_disabled" }, { "pc": [ 1903 ], "errorMessage": "not_auth" }, { "pc": [ 1677, 1696 ], "errorMessage": "not_found" }, { "pc": [ 4441, 4474, 4505, 4612 ], "errorMessage": "not_owner" }, { "pc": [ 4560, 4571 ], "errorMessage": "not_pending_owner" }, { "pc": [ 1500, 1789, 3405 ], "errorMessage": "only_owner" }, { "pc": [ 1948, 1970, 2051, 2073, 2448, 3215, 3304, 3452, 3490, 3509, 3583, 3626, 3645, 3742, 3788, 3834, 3853, 4045, 4151, 4174 ], "errorMessage": "overflow" }, { "pc": [ 4528 ], "errorMessage": "pending_transfer_exists" }, { "pc": [ 4413, 4446, 4510 ], "errorMessage": "zero_address_not_allowed" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDMyIDIKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgImFyYzg4X28iICJ0IiAweDAwMDIgImIiICJhcmMxNDEwX3AiICJhcmMxNjQzX2RvY3MiIDB4ODAgImFyYzg4X3BvIiAweDAwICJhcmM4OF9vaSIgImFyYzE0MTBfb3BhIiAweDAwMDAgImFyYzE1OTRfaXNzIiAiYXJjMTQxMF9ocF9hIiAiYXJjMTQxMF9vcCIgImFyYzE2NDNfZG9jIiAweDAwNDIgMHgwMSAweDAwMDEgMHgwMDYyIDB4MDAwNiAweGQ3ZmM0YTk4IDB4MDAwMDAwMDAwMDAwMDAwMCAweDVjMjdiNGZjIDB4Nzk4M2MzNWMgMHg0MzU1ZDJhZAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A0OQogICAgcHVzaGJ5dGVzcyAweDExY2IzNmY1IDB4YjE2ZDdhOGMgMHhhN2NiMzQ4MiAweGVjYjYzNmM4IDB4NjViMTY4MmEgMHgwMTMwNTk5YiAweDE0MmI1ZmNiIDB4Zjg4MzhlYjkgMHgzMTg4MmJmYSAweGE5Y2NhMTZmIDB4MjY2NTk3YzAgMHgzNWY4MTM1ZiAweGRhNzAyNWI5IDB4M2YyNTY3MTMgMHg5NWI0ZjllMyAweDgwY2M0OWFiIDB4MDc5NjIxNjUgMHhlNzg5NjFkYSAweGZkOTQ4MGQ3IDB4YjFiMWQ2OWEgMHhjMWJlZDc4OSAweDNiZmUxODMzIDB4NTk5Y2QxYTUgMHg2ZGU5NDE2NiAweDI4ZjAyM2Q3IDB4OTc1MzgyZTIgMHg2NTdkMTNlYyAweGI2YWUxYTI1IDB4ODRlYzEzZDUgMHhlYzk5NjA0MSAweDgyZTU3M2M0IDB4NGE5NjhmOGYgMHhiNTQyMjEyNSAweGJiYjMxOWYzIDB4MDcwMjY1NGUgMHhkMDE1NzI0ZSAweDAyOWZlY2MwIDB4NzM0OTMzNGUgMHhkYjdjODJlZiAweGZkMmMyYzZlIDB4NDJhNWYwNjUgMHhhZDRmNjhlYSAvLyBtZXRob2QgImFyYzE2NDNfc2V0X2RvY3VtZW50KGJ5dGVbXSxzdHJpbmcsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFyYzE2NDNfZ2V0X2RvY3VtZW50KGJ5dGVbXSkoc3RyaW5nLGJ5dGVbXSx1aW50NjQpIiwgbWV0aG9kICJhcmMxNjQzX3JlbW92ZV9kb2N1bWVudChieXRlW10pdm9pZCIsIG1ldGhvZCAiYXJjMTY0M19nZXRfYWxsX2RvY3VtZW50cygpYnl0ZVtdW10iLCBtZXRob2QgImFyYzE1OTRfc2V0X2lzc3VhYmxlKGJvb2wpdm9pZCIsIG1ldGhvZCAiYXJjMTU5NF9pc3N1ZShhZGRyZXNzLHVpbnQyNTYsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFyYzE1OTRfcmVkZWVtRnJvbShhZGRyZXNzLHVpbnQyNTYsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFyYzE1OTRfcmVkZWVtKHVpbnQyNTYsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFyYzE1OTRfdHJhbnNmZXJfd2l0aF9kYXRhKGFkZHJlc3MsdWludDI1NixieXRlW10pYm9vbCIsIG1ldGhvZCAiYXJjMTU5NF90cmFuc2Zlcl9mcm9tX3dpdGhfZGF0YShhZGRyZXNzLGFkZHJlc3MsdWludDI1NixieXRlW10pYm9vbCIsIG1ldGhvZCAiYXJjMTU5NF9pc19pc3N1YWJsZSgpYm9vbCIsIG1ldGhvZCAiYXJjMTQxMF9iYWxhbmNlX29mX3BhcnRpdGlvbihhZGRyZXNzLGFkZHJlc3MpdWludDI1NiIsIG1ldGhvZCAiYXJjMjAwX3RyYW5zZmVyKGFkZHJlc3MsdWludDI1Nilib29sIiwgbWV0aG9kICJhcmMxNDEwX3RyYW5zZmVyX2J5X3BhcnRpdGlvbihhZGRyZXNzLGFkZHJlc3MsdWludDI1NixieXRlW10pYWRkcmVzcyIsIG1ldGhvZCAiYXJjMTQxMF9wYXJ0aXRpb25zX29mKGFkZHJlc3MsdWludDY0KWFkZHJlc3NbXSIsIG1ldGhvZCAiYXJjMTQxMF9pc19vcGVyYXRvcihhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcylib29sIiwgbWV0aG9kICJhcmMxNDEwX2F1dGhvcml6ZV9vcGVyYXRvcihhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJhcmMxNDEwX3Jldm9rZV9vcGVyYXRvcihhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJhcmMxNDEwX29wZXJhdG9yX3RyYW5zZmVyX2J5X3BhcnRpdGlvbihhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2LGJ5dGVbXSlhZGRyZXNzIiwgbWV0aG9kICJhcmMxNDEwX2Nhbl90cmFuc2Zlcl9ieV9wYXJ0aXRpb24oYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsdWludDI1NixieXRlW10pKGJ5dGUsc3RyaW5nLGFkZHJlc3MpIiwgbWV0aG9kICJhcmMxNDEwX2F1dGhvcml6ZV9vcGVyYXRvcl9ieV9wb3J0aW9uKGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLHVpbnQyNTYpdm9pZCIsIG1ldGhvZCAiYXJjMTQxMF9pc19vcGVyYXRvcl9ieV9wb3J0aW9uKGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzKWJvb2wiLCBtZXRob2QgImFyYzE0MTBfaXNzdWVfYnlfcGFydGl0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2LGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhcmMxNDEwX3JlZGVlbV9ieV9wYXJ0aXRpb24oYWRkcmVzcyx1aW50MjU2LGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhcmMxNDEwX29wZXJhdG9yX3JlZGVlbV9ieV9wYXJ0aXRpb24oYWRkcmVzcyxhZGRyZXNzLHVpbnQyNTYsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcChieXRlW10sYnl0ZVtdLHVpbnQ4LHVpbnQyNTYpYm9vbCIsIG1ldGhvZCAiYXJjMjAwX25hbWUoKWJ5dGVbMzJdIiwgbWV0aG9kICJhcmMyMDBfc3ltYm9sKClieXRlWzhdIiwgbWV0aG9kICJhcmMyMDBfZGVjaW1hbHMoKXVpbnQ4IiwgbWV0aG9kICJhcmMyMDBfdG90YWxTdXBwbHkoKXVpbnQyNTYiLCBtZXRob2QgImFyYzIwMF9iYWxhbmNlT2YoYWRkcmVzcyl1aW50MjU2IiwgbWV0aG9kICJhcmMyMDBfdHJhbnNmZXJGcm9tKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2KWJvb2wiLCBtZXRob2QgImFyYzIwMF9hcHByb3ZlKGFkZHJlc3MsdWludDI1Nilib29sIiwgbWV0aG9kICJhcmMyMDBfYWxsb3dhbmNlKGFkZHJlc3MsYWRkcmVzcyl1aW50MjU2IiwgbWV0aG9kICJhcmM4OF9vd25lcigpYWRkcmVzcyIsIG1ldGhvZCAiYXJjODhfaXNfb3duZXIoYWRkcmVzcylib29sIiwgbWV0aG9kICJhcmM4OF9pbml0aWFsaXplX293bmVyKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXJjODhfdHJhbnNmZXJfb3duZXJzaGlwKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXJjODhfcmVub3VuY2Vfb3duZXJzaGlwKCl2b2lkIiwgbWV0aG9kICJhcmM4OF90cmFuc2Zlcl9vd25lcnNoaXBfcmVxdWVzdChhZGRyZXNzKXZvaWQiLCBtZXRob2QgImFyYzg4X2FjY2VwdF9vd25lcnNoaXAoKXZvaWQiLCBtZXRob2QgImFyYzg4X2NhbmNlbF9vd25lcnNoaXBfcmVxdWVzdCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXJjMTY0M19zZXRfZG9jdW1lbnRfcm91dGVANSBtYWluX2FyYzE2NDNfZ2V0X2RvY3VtZW50X3JvdXRlQDYgbWFpbl9hcmMxNjQzX3JlbW92ZV9kb2N1bWVudF9yb3V0ZUA3IG1haW5fYXJjMTY0M19nZXRfYWxsX2RvY3VtZW50c19yb3V0ZUA4IG1haW5fYXJjMTU5NF9zZXRfaXNzdWFibGVfcm91dGVAOSBtYWluX2FyYzE1OTRfaXNzdWVfcm91dGVAMTAgbWFpbl9hcmMxNTk0X3JlZGVlbUZyb21fcm91dGVAMTEgbWFpbl9hcmMxNTk0X3JlZGVlbV9yb3V0ZUAxMiBtYWluX2FyYzE1OTRfdHJhbnNmZXJfd2l0aF9kYXRhX3JvdXRlQDEzIG1haW5fYXJjMTU5NF90cmFuc2Zlcl9mcm9tX3dpdGhfZGF0YV9yb3V0ZUAxNCBtYWluX2FyYzE1OTRfaXNfaXNzdWFibGVfcm91dGVAMTUgbWFpbl9hcmMxNDEwX2JhbGFuY2Vfb2ZfcGFydGl0aW9uX3JvdXRlQDE2IG1haW5fYXJjMjAwX3RyYW5zZmVyX3JvdXRlQDE3IG1haW5fYXJjMTQxMF90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fcm91dGVAMTggbWFpbl9hcmMxNDEwX3BhcnRpdGlvbnNfb2Zfcm91dGVAMTkgbWFpbl9hcmMxNDEwX2lzX29wZXJhdG9yX3JvdXRlQDIwIG1haW5fYXJjMTQxMF9hdXRob3JpemVfb3BlcmF0b3Jfcm91dGVAMjEgbWFpbl9hcmMxNDEwX3Jldm9rZV9vcGVyYXRvcl9yb3V0ZUAyMiBtYWluX2FyYzE0MTBfb3BlcmF0b3JfdHJhbnNmZXJfYnlfcGFydGl0aW9uX3JvdXRlQDIzIG1haW5fYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uX3JvdXRlQDI0IG1haW5fYXJjMTQxMF9hdXRob3JpemVfb3BlcmF0b3JfYnlfcG9ydGlvbl9yb3V0ZUAyNSBtYWluX2FyYzE0MTBfaXNfb3BlcmF0b3JfYnlfcG9ydGlvbl9yb3V0ZUAyNiBtYWluX2FyYzE0MTBfaXNzdWVfYnlfcGFydGl0aW9uX3JvdXRlQDI3IG1haW5fYXJjMTQxMF9yZWRlZW1fYnlfcGFydGl0aW9uX3JvdXRlQDI4IG1haW5fYXJjMTQxMF9vcGVyYXRvcl9yZWRlZW1fYnlfcGFydGl0aW9uX3JvdXRlQDI5IG1haW5fYm9vdHN0cmFwX3JvdXRlQDMwIG1haW5fYXJjMjAwX25hbWVfcm91dGVAMzEgbWFpbl9hcmMyMDBfc3ltYm9sX3JvdXRlQDMyIG1haW5fYXJjMjAwX2RlY2ltYWxzX3JvdXRlQDMzIG1haW5fYXJjMjAwX3RvdGFsU3VwcGx5X3JvdXRlQDM0IG1haW5fYXJjMjAwX2JhbGFuY2VPZl9yb3V0ZUAzNSBtYWluX2FyYzIwMF90cmFuc2ZlckZyb21fcm91dGVAMzYgbWFpbl9hcmMyMDBfYXBwcm92ZV9yb3V0ZUAzNyBtYWluX2FyYzIwMF9hbGxvd2FuY2Vfcm91dGVAMzggbWFpbl9hcmM4OF9vd25lcl9yb3V0ZUAzOSBtYWluX2FyYzg4X2lzX293bmVyX3JvdXRlQDQwIG1haW5fYXJjODhfaW5pdGlhbGl6ZV9vd25lcl9yb3V0ZUA0MSBtYWluX2FyYzg4X3RyYW5zZmVyX293bmVyc2hpcF9yb3V0ZUA0MiBtYWluX2FyYzg4X3Jlbm91bmNlX293bmVyc2hpcF9yb3V0ZUA0MyBtYWluX2FyYzg4X3RyYW5zZmVyX293bmVyc2hpcF9yZXF1ZXN0X3JvdXRlQDQ0IG1haW5fYXJjODhfYWNjZXB0X293bmVyc2hpcF9yb3V0ZUA0NSBtYWluX2FyYzg4X2NhbmNlbF9vd25lcnNoaXBfcmVxdWVzdF9yb3V0ZUA0NgoKbWFpbl9hZnRlcl9pZl9lbHNlQDUzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fYXJjODhfY2FuY2VsX293bmVyc2hpcF9yZXF1ZXN0X3JvdXRlQDQ2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzg4X2NhbmNlbF9vd25lcnNoaXBfcmVxdWVzdAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM4OF9hY2NlcHRfb3duZXJzaGlwX3JvdXRlQDQ1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjODhfYWNjZXB0X293bmVyc2hpcAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM4OF90cmFuc2Zlcl9vd25lcnNoaXBfcmVxdWVzdF9yb3V0ZUA0NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMTY0MyBleHRlbmRzIEFyYzE1OTQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6NzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzg4X3RyYW5zZmVyX293bmVyc2hpcF9yZXF1ZXN0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzg4X3Jlbm91bmNlX293bmVyc2hpcF9yb3V0ZUA0MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzg4X3Jlbm91bmNlX293bmVyc2hpcAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM4OF90cmFuc2Zlcl9vd25lcnNoaXBfcm91dGVANDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhcmM4OF90cmFuc2Zlcl9vd25lcnNoaXAKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjODhfaW5pdGlhbGl6ZV9vd25lcl9yb3V0ZUA0MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMTY0MyBleHRlbmRzIEFyYzE1OTQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzg4X2luaXRpYWxpemVfb3duZXIKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjODhfaXNfb3duZXJfcm91dGVANDA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBhcmM4OF9pc19vd25lcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM4OF9vd25lcl9yb3V0ZUAzOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzg4X293bmVyCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzIwMF9hbGxvd2FuY2Vfcm91dGVAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMTY0MyBleHRlbmRzIEFyYzE1OTQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjE3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgYXJjMjAwX2FsbG93YW5jZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMyMDBfYXBwcm92ZV9yb3V0ZUAzNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhcmMyMDBfYXBwcm92ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMyMDBfdHJhbnNmZXJGcm9tX3JvdXRlQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjE0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzIwMF90cmFuc2ZlckZyb20KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMjAwX2JhbGFuY2VPZl9yb3V0ZUAzNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBhcmMyMDBfYmFsYW5jZU9mCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzIwMF90b3RhbFN1cHBseV9yb3V0ZUAzNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjMjAwX3RvdGFsU3VwcGx5CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzIwMF9kZWNpbWFsc19yb3V0ZUAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjMjAwX2RlY2ltYWxzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzIwMF9zeW1ib2xfcm91dGVAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6OTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjMjAwX3N5bWJvbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMyMDBfbmFtZV9yb3V0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBhcmMyMDBfbmFtZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9ib290c3RyYXBfcm91dGVAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGJvb3RzdHJhcAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMxNDEwX29wZXJhdG9yX3JlZGVlbV9ieV9wYXJ0aXRpb25fcm91dGVAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhcmMxNDEwX29wZXJhdG9yX3JlZGVlbV9ieV9wYXJ0aXRpb24KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTQxMF9yZWRlZW1fYnlfcGFydGl0aW9uX3JvdXRlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXJjMTQxMF9yZWRlZW1fYnlfcGFydGl0aW9uCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzE0MTBfaXNzdWVfYnlfcGFydGl0aW9uX3JvdXRlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXJjMTQxMF9pc3N1ZV9ieV9wYXJ0aXRpb24KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTQxMF9pc19vcGVyYXRvcl9ieV9wb3J0aW9uX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgYXJjMTQxMF9pc19vcGVyYXRvcl9ieV9wb3J0aW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzE0MTBfYXV0aG9yaXplX29wZXJhdG9yX2J5X3BvcnRpb25fcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhcmMxNDEwX2F1dGhvcml6ZV9vcGVyYXRvcl9ieV9wb3J0aW9uCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMTY0MyBleHRlbmRzIEFyYzE1OTQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMxNDEwX29wZXJhdG9yX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMTY0MyBleHRlbmRzIEFyYzE1OTQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzE0MTBfb3BlcmF0b3JfdHJhbnNmZXJfYnlfcGFydGl0aW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzE0MTBfcmV2b2tlX29wZXJhdG9yX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjEzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXJjMTQxMF9yZXZva2Vfb3BlcmF0b3IKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTQxMF9hdXRob3JpemVfb3BlcmF0b3Jfcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjEyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhcmMxNDEwX2F1dGhvcml6ZV9vcGVyYXRvcgogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMxNDEwX2lzX29wZXJhdG9yX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgYXJjMTQxMF9pc19vcGVyYXRvcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMxNDEwX3BhcnRpdGlvbnNfb2Zfcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjEwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhcmMxNDEwX3BhcnRpdGlvbnNfb2YKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTQxMF90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMTY0MyBleHRlbmRzIEFyYzE1OTQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXJjMTQxMF90cmFuc2Zlcl9ieV9wYXJ0aXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMjAwX3RyYW5zZmVyX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzIwMF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMxNDEwX2JhbGFuY2Vfb2ZfcGFydGl0aW9uX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGFyYzE0MTBfYmFsYW5jZV9vZl9wYXJ0aXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTU5NF9pc19pc3N1YWJsZV9yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXJjMTU5NF9pc19pc3N1YWJsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMxNTk0X3RyYW5zZmVyX2Zyb21fd2l0aF9kYXRhX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzE1OTRfdHJhbnNmZXJfZnJvbV93aXRoX2RhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTU5NF90cmFuc2Zlcl93aXRoX2RhdGFfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMTY0MyBleHRlbmRzIEFyYzE1OTQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXJjMTU5NF90cmFuc2Zlcl93aXRoX2RhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTU5NF9yZWRlZW1fcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMTY0MyBleHRlbmRzIEFyYzE1OTQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXJjMTU5NF9yZWRlZW0KICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTU5NF9yZWRlZW1Gcm9tX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzE1OTRfcmVkZWVtRnJvbQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMxNTk0X2lzc3VlX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czozNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFyYzE1OTRfaXNzdWUKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTU5NF9zZXRfaXNzdWFibGVfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhcmMxNTk0X3NldF9pc3N1YWJsZQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMxNjQzX2dldF9hbGxfZG9jdW1lbnRzX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzE2NDNfZ2V0X2FsbF9kb2N1bWVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYXJjMTY0M19yZW1vdmVfZG9jdW1lbnRfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjQKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMxNjQzIGV4dGVuZHMgQXJjMTU5NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhcmMxNjQzX3JlbW92ZV9kb2N1bWVudAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmMxNjQzX2dldF9kb2N1bWVudF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGFyYzE2NDNfZ2V0X2RvY3VtZW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2FyYzE2NDNfc2V0X2RvY3VtZW50X3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI0CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMTY0MyBleHRlbmRzIEFyYzE1OTQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czozNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXJjMTY0M19zZXRfZG9jdW1lbnQKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDQ5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNAogICAgLy8gZXhwb3J0IGNsYXNzIEFyYzE2NDMgZXh0ZW5kcyBBcmMxNTk0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VANTMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZChhcnJheTogYnl0ZXMsIG5ld19pdGVtc19ieXRlczogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzMgLy8gMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGJ6ZXJvCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9kaWcgLTMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9mb3JfaGVhZGVyQDI6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWRfYWZ0ZXJfZm9yQDUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9ieXRlX2xlbmd0aF9oZWFkX2Zvcl9oZWFkZXJAMgoKZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZF9hZnRlcl9mb3JANToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6OkFyYzE2NDMuX29ubHlPd25lcigpIC0+IHZvaWQ6Cl9vbmx5T3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjMwCiAgICAvLyBhc3NlcnQodGhpcy5hcmM4OF9pc19vd25lcihuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpKS5uYXRpdmUgPT09IHRydWUsICdvbmx5X293bmVyJykKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgYXJjODhfaXNfb3duZXIKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHlfb3duZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6OkFyYzE2NDMuYXJjMTY0M19zZXRfZG9jdW1lbnQobmFtZTogYnl0ZXMsIHVyaTogYnl0ZXMsIGhhc2g6IGJ5dGVzKSAtPiB2b2lkOgphcmMxNjQzX3NldF9kb2N1bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MzQtMzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMTY0M19zZXRfZG9jdW1lbnQobmFtZTogYXJjNC5EeW5hbWljQnl0ZXMsIHVyaTogYXJjNC5TdHIsIGhhc2g6IGFyYzQuRHluYW1pY0J5dGVzKTogdm9pZCB7CiAgICBwcm90byAzIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MzYKICAgIC8vIHRoaXMuX29ubHlPd25lcigpCiAgICBjYWxsc3ViIF9vbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MzcKICAgIC8vIGFzc2VydChuYW1lLmJ5dGVzLmxlbmd0aCA+IDAsICdlbXB0eV9uYW1lJykKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBkdXAKICAgIGFzc2VydCAvLyBlbXB0eV9uYW1lCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjM4CiAgICAvLyBjb25zdCByZWMgPSBuZXcgYXJjMTY0M19kb2N1bWVudF9yZWNvcmQoeyB1cmksIGhhc2gsIHRpbWVzdGFtcDogbmV3IGFyYzQuVWludE42NChHbG9iYWwucm91bmQpIH0pCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDBjCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI2CiAgICAvLyBwdWJsaWMgZG9jdW1lbnRzID0gQm94TWFwPGFyYzQuRHluYW1pY0J5dGVzLCBhcmMxNjQzX2RvY3VtZW50X3JlY29yZD4oeyBrZXlQcmVmaXg6ICdhcmMxNjQzX2RvYycgfSkKICAgIGJ5dGVjIDE3IC8vICJhcmMxNjQzX2RvYyIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjM5CiAgICAvLyB0aGlzLmRvY3VtZW50cyhuYW1lKS52YWx1ZSA9IHJlYy5jb3B5KCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI3CiAgICAvLyBwdWJsaWMgZG9jdW1lbnRLZXlzID0gQm94PGFyYzQuRHluYW1pY0J5dGVzW10+KHsga2V5OiAnYXJjMTY0M19kb2NzJyB9KQogICAgYnl0ZWMgNyAvLyAiYXJjMTY0M19kb2NzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czo0MAogICAgLy8gaWYgKCF0aGlzLmRvY3VtZW50S2V5cy5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFyYzE2NDNfc2V0X2RvY3VtZW50X2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjQxCiAgICAvLyB0aGlzLmRvY3VtZW50S2V5cy52YWx1ZSA9IFtuYW1lXQogICAgYnl0ZWMgMTMgLy8gMHgwMDAwCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2J5dGVfbGVuZ3RoX2hlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjcKICAgIC8vIHB1YmxpYyBkb2N1bWVudEtleXMgPSBCb3g8YXJjNC5EeW5hbWljQnl0ZXNbXT4oeyBrZXk6ICdhcmMxNjQzX2RvY3MnIH0pCiAgICBieXRlYyA3IC8vICJhcmMxNjQzX2RvY3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjQxCiAgICAvLyB0aGlzLmRvY3VtZW50S2V5cy52YWx1ZSA9IFtuYW1lXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI3CiAgICAvLyBwdWJsaWMgZG9jdW1lbnRLZXlzID0gQm94PGFyYzQuRHluYW1pY0J5dGVzW10+KHsga2V5OiAnYXJjMTY0M19kb2NzJyB9KQogICAgYnl0ZWMgNyAvLyAiYXJjMTY0M19kb2NzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czo0MQogICAgLy8gdGhpcy5kb2N1bWVudEtleXMudmFsdWUgPSBbbmFtZV0KICAgIHN3YXAKICAgIGJveF9wdXQKCmFyYzE2NDNfc2V0X2RvY3VtZW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NDUKICAgIC8vIGVtaXQoJ0RvY3VtZW50VXBkYXRlZCcsIG5ldyBhcmMxNjQzX2RvY3VtZW50X3VwZGF0ZWRfZXZlbnQoeyBuYW1lLCB1cmksIGhhc2ggfSkpCiAgICBwdXNoaW50IDYgLy8gNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjIDIyIC8vIDB4MDAwNgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MmRjMDNjMzYgLy8gbWV0aG9kICJEb2N1bWVudFVwZGF0ZWQoKGJ5dGVbXSxzdHJpbmcsYnl0ZVtdKSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgphcmMxNjQzX3NldF9kb2N1bWVudF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjcKICAgIC8vIHB1YmxpYyBkb2N1bWVudEtleXMgPSBCb3g8YXJjNC5EeW5hbWljQnl0ZXNbXT4oeyBrZXk6ICdhcmMxNjQzX2RvY3MnIH0pCiAgICBieXRlYyA3IC8vICJhcmMxNjQzX2RvY3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjQzCiAgICAvLyB0aGlzLmRvY3VtZW50S2V5cy52YWx1ZSA9IFsuLi50aGlzLmRvY3VtZW50S2V5cy52YWx1ZSwgbmFtZV0KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBieXRlYyAxMyAvLyAweDAwMDAKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIHN3YXAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfYnl0ZV9sZW5ndGhfaGVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNwogICAgLy8gcHVibGljIGRvY3VtZW50S2V5cyA9IEJveDxhcmM0LkR5bmFtaWNCeXRlc1tdPih7IGtleTogJ2FyYzE2NDNfZG9jcycgfSkKICAgIGJ5dGVjIDcgLy8gImFyYzE2NDNfZG9jcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NDMKICAgIC8vIHRoaXMuZG9jdW1lbnRLZXlzLnZhbHVlID0gWy4uLnRoaXMuZG9jdW1lbnRLZXlzLnZhbHVlLCBuYW1lXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI3CiAgICAvLyBwdWJsaWMgZG9jdW1lbnRLZXlzID0gQm94PGFyYzQuRHluYW1pY0J5dGVzW10+KHsga2V5OiAnYXJjMTY0M19kb2NzJyB9KQogICAgYnl0ZWMgNyAvLyAiYXJjMTY0M19kb2NzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czo0MwogICAgLy8gdGhpcy5kb2N1bWVudEtleXMudmFsdWUgPSBbLi4udGhpcy5kb2N1bWVudEtleXMudmFsdWUsIG5hbWVdCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIGFyYzE2NDNfc2V0X2RvY3VtZW50X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6OkFyYzE2NDMuYXJjMTY0M19nZXRfZG9jdW1lbnQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgphcmMxNjQzX2dldF9kb2N1bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NDgtNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBwdWJsaWMgYXJjMTY0M19nZXRfZG9jdW1lbnQobmFtZTogYXJjNC5EeW5hbWljQnl0ZXMpOiBhcmMxNjQzX2RvY3VtZW50X3JlY29yZCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6MjYKICAgIC8vIHB1YmxpYyBkb2N1bWVudHMgPSBCb3hNYXA8YXJjNC5EeW5hbWljQnl0ZXMsIGFyYzE2NDNfZG9jdW1lbnRfcmVjb3JkPih7IGtleVByZWZpeDogJ2FyYzE2NDNfZG9jJyB9KQogICAgYnl0ZWMgMTcgLy8gImFyYzE2NDNfZG9jIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NTAKICAgIC8vIGFzc2VydCh0aGlzLmRvY3VtZW50cyhuYW1lKS5leGlzdHMsICdub3RfZm91bmQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBub3RfZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NTEKICAgIC8vIHJldHVybiB0aGlzLmRvY3VtZW50cyhuYW1lKS52YWx1ZS5jb3B5KCkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjpBcmMxNjQzLmFyYzE2NDNfcmVtb3ZlX2RvY3VtZW50KG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgphcmMxNjQzX3JlbW92ZV9kb2N1bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NTQtNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMTY0M19yZW1vdmVfZG9jdW1lbnQobmFtZTogYXJjNC5EeW5hbWljQnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czo1NgogICAgLy8gdGhpcy5fb25seU93bmVyKCkKICAgIGNhbGxzdWIgX29ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czoyNgogICAgLy8gcHVibGljIGRvY3VtZW50cyA9IEJveE1hcDxhcmM0LkR5bmFtaWNCeXRlcywgYXJjMTY0M19kb2N1bWVudF9yZWNvcmQ+KHsga2V5UHJlZml4OiAnYXJjMTY0M19kb2MnIH0pCiAgICBieXRlYyAxNyAvLyAiYXJjMTY0M19kb2MiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czo1NwogICAgLy8gYXNzZXJ0KHRoaXMuZG9jdW1lbnRzKG5hbWUpLmV4aXN0cywgJ25vdF9mb3VuZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG5vdF9mb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czo1OAogICAgLy8gY29uc3QgcHJpb3IgPSB0aGlzLmRvY3VtZW50cyhuYW1lKS52YWx1ZS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NTkKICAgIC8vIHRoaXMuZG9jdW1lbnRzKG5hbWUpLmRlbGV0ZSgpCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNjQzLmFsZ28udHM6NjIKICAgIC8vIGVtaXQoJ0RvY3VtZW50UmVtb3ZlZCcsIG5ldyBhcmMxNjQzX2RvY3VtZW50X3JlbW92ZWRfZXZlbnQoeyBuYW1lLCB1cmk6IHByaW9yLnVyaSwgaGFzaDogcHJpb3IuaGFzaCB9KSkKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIHB1c2hpbnQgNiAvLyA2CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlYyAyMiAvLyAweDAwMDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4YWU3YTRmYTAgLy8gbWV0aG9kICJEb2N1bWVudFJlbW92ZWQoKGJ5dGVbXSxzdHJpbmcsYnl0ZVtdKSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czo6QXJjMTY0My5hcmMxNjQzX2dldF9hbGxfZG9jdW1lbnRzKCkgLT4gYnl0ZXM6CmFyYzE2NDNfZ2V0X2FsbF9kb2N1bWVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTY0My5hbGdvLnRzOjI3CiAgICAvLyBwdWJsaWMgZG9jdW1lbnRLZXlzID0gQm94PGFyYzQuRHluYW1pY0J5dGVzW10+KHsga2V5OiAnYXJjMTY0M19kb2NzJyB9KQogICAgYnl0ZWMgNyAvLyAiYXJjMTY0M19kb2NzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE2NDMuYWxnby50czo2OQogICAgLy8gcmV0dXJuIHRoaXMuZG9jdW1lbnRLZXlzLnZhbHVlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo6QXJjMTU5NC5fb25seU93bmVyKCkgLT4gdm9pZDoKc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo6QXJjMTU5NC5fb25seU93bmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czoyMgogICAgLy8gYXNzZXJ0KHRoaXMuYXJjODhfaXNfb3duZXIobmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSkubmF0aXZlID09PSB0cnVlLCAnb25seV9vd25lcicpCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGFyYzg4X2lzX293bmVyCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5X293bmVyCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjpBcmMxNTk0LmFyYzE1OTRfc2V0X2lzc3VhYmxlKGZsYWc6IGJ5dGVzKSAtPiB2b2lkOgphcmMxNTk0X3NldF9pc3N1YWJsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6MjctMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMTU5NF9zZXRfaXNzdWFibGUoZmxhZzogYXJjNC5Cb29sKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6MjkKICAgIC8vIHRoaXMuX29ubHlPd25lcigpCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6OkFyYzE1OTQuX29ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czoxNAogICAgLy8gcHVibGljIGFyYzE1OTRfaXNzdWFibGUgPSBHbG9iYWxTdGF0ZTxhcmM0LkJvb2w+KHsga2V5OiAnYXJjMTU5NF9pc3MnIH0pIC8vIFRydWUgPSBpc3N1YWJsZQogICAgYnl0ZWMgMTQgLy8gImFyYzE1OTRfaXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czozMAogICAgLy8gdGhpcy5hcmMxNTk0X2lzc3VhYmxlLnZhbHVlID0gZmxhZwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo6QXJjMTU5NC5hcmMxNTk0X2lzc3VlKHRvOiBieXRlcywgYW1vdW50OiBieXRlcywgZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFyYzE1OTRfaXNzdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjM0LTM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIGFyYzE1OTRfaXNzdWUodG86IGFyYzQuQWRkcmVzcywgYW1vdW50OiBhcmM0LlVpbnROMjU2LCBkYXRhOiBhcmM0LkR5bmFtaWNCeXRlcyk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjM2CiAgICAvLyB0aGlzLl9vbmx5T3duZXIoKQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjpBcmMxNTk0Ll9vbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6MzcKICAgIC8vIGFzc2VydChhbW91bnQubmF0aXZlID4gMG4sICdpbnZhbGlkX2Ftb3VudCcpCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hieXRlcyAweAogICAgYj4KICAgIGFzc2VydCAvLyBpbnZhbGlkX2Ftb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czoxNAogICAgLy8gcHVibGljIGFyYzE1OTRfaXNzdWFibGUgPSBHbG9iYWxTdGF0ZTxhcmM0LkJvb2w+KHsga2V5OiAnYXJjMTU5NF9pc3MnIH0pIC8vIFRydWUgPSBpc3N1YWJsZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJhcmMxNTk0X2lzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6MzgKICAgIC8vIGFzc2VydCh0aGlzLmFyYzE1OTRfaXNzdWFibGUuaGFzVmFsdWUgJiYgdGhpcy5hcmMxNTk0X2lzc3VhYmxlLnZhbHVlLm5hdGl2ZSA9PT0gdHJ1ZSwgJ2lzc3VhbmNlX2Rpc2FibGVkJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGJ6IGFyYzE1OTRfaXNzdWVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjE0CiAgICAvLyBwdWJsaWMgYXJjMTU5NF9pc3N1YWJsZSA9IEdsb2JhbFN0YXRlPGFyYzQuQm9vbD4oeyBrZXk6ICdhcmMxNTk0X2lzcycgfSkgLy8gVHJ1ZSA9IGlzc3VhYmxlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTQgLy8gImFyYzE1OTRfaXNzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjM4CiAgICAvLyBhc3NlcnQodGhpcy5hcmMxNTk0X2lzc3VhYmxlLmhhc1ZhbHVlICYmIHRoaXMuYXJjMTU5NF9pc3N1YWJsZS52YWx1ZS5uYXRpdmUgPT09IHRydWUsICdpc3N1YW5jZV9kaXNhYmxlZCcpCiAgICBnZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogYXJjMTU5NF9pc3N1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgphcmMxNTk0X2lzc3VlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6MzgKICAgIC8vIGFzc2VydCh0aGlzLmFyYzE1OTRfaXNzdWFibGUuaGFzVmFsdWUgJiYgdGhpcy5hcmMxNTk0X2lzc3VhYmxlLnZhbHVlLm5hdGl2ZSA9PT0gdHJ1ZSwgJ2lzc3VhbmNlX2Rpc2FibGVkJykKICAgIGFzc2VydCAvLyBpc3N1YW5jZV9kaXNhYmxlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo0MAogICAgLy8gdGhpcy5hcmMxNDEwX2lzc3VlX2J5X3BhcnRpdGlvbih0bywgbmV3IGFyYzQuQWRkcmVzcygpLCBhbW91bnQsIGRhdGEpCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjXzEgLy8gYWRkciBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhcmMxNDEwX2lzc3VlX2J5X3BhcnRpdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo0MQogICAgLy8gZW1pdCgnSXNzdWUnLCBuZXcgYXJjMTU5NF9pc3N1ZV9ldmVudCh7IHRvLCBhbW91bnQsIGRhdGEgfSkpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBieXRlYyAxOCAvLyAweDAwNDIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGYyZTk5OGFmIC8vIG1ldGhvZCAiSXNzdWUoKGFkZHJlc3MsdWludDI1NixieXRlW10pKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCmFyYzE1OTRfaXNzdWVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgYXJjMTU5NF9pc3N1ZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjpBcmMxNTk0LmFyYzE1OTRfcmVkZWVtRnJvbShmcm9tOiBieXRlcywgYW1vdW50OiBieXRlcywgZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFyYzE1OTRfcmVkZWVtRnJvbToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6NDQtNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMTU5NF9yZWRlZW1Gcm9tKGZyb206IGFyYzQuQWRkcmVzcywgYW1vdW50OiBhcmM0LlVpbnROMjU2LCBkYXRhOiBhcmM0LkR5bmFtaWNCeXRlcyk6IHZvaWQgewogICAgcHJvdG8gMyAwCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo0NgogICAgLy8gY29uc3Qgc2VuZGVyID0gbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjQ3CiAgICAvLyBhc3NlcnQoc2VuZGVyID09PSBmcm9tIHx8IHRoaXMuYXJjODhfaXNfb3duZXIoc2VuZGVyKS5uYXRpdmUgPT09IHRydWUsICdub3RfYXV0aCcpCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBibnogYXJjMTU5NF9yZWRlZW1Gcm9tX2Jvb2xfdHJ1ZUAyCiAgICBmcmFtZV9kaWcgMQogICAgY2FsbHN1YiBhcmM4OF9pc19vd25lcgogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiBhcmMxNTk0X3JlZGVlbUZyb21fYm9vbF9mYWxzZUAzCgphcmMxNTk0X3JlZGVlbUZyb21fYm9vbF90cnVlQDI6CiAgICBpbnRjXzAgLy8gMQoKYXJjMTU5NF9yZWRlZW1Gcm9tX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6NDcKICAgIC8vIGFzc2VydChzZW5kZXIgPT09IGZyb20gfHwgdGhpcy5hcmM4OF9pc19vd25lcihzZW5kZXIpLm5hdGl2ZSA9PT0gdHJ1ZSwgJ25vdF9hdXRoJykKICAgIGFzc2VydCAvLyBub3RfYXV0aAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo0OAogICAgLy8gYXNzZXJ0KGFtb3VudC5uYXRpdmUgPiAwbiwgJ2ludmFsaWRfYW1vdW50JykKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGJ5dGVzIDB4CiAgICBiPgogICAgYXNzZXJ0IC8vIGludmFsaWRfYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTMKICAgIC8vIHB1YmxpYyBiYWxhbmNlcyA9IEJveE1hcDxBZGRyZXNzLCBVaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdiJyB9KQogICAgYnl0ZWMgNSAvLyAiYiIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo0OQogICAgLy8gYXNzZXJ0KHRoaXMuYmFsYW5jZXMoZnJvbSkuZXhpc3RzICYmIHRoaXMuYmFsYW5jZXMoZnJvbSkudmFsdWUubmF0aXZlID49IGFtb3VudC5uYXRpdmUsICdpbnN1ZmZpY2llbnRfYmFsYW5jZScpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFyYzE1OTRfcmVkZWVtRnJvbV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0yCiAgICBiPj0KICAgIGJ6IGFyYzE1OTRfcmVkZWVtRnJvbV9ib29sX2ZhbHNlQDcKICAgIGludGNfMCAvLyAxCgphcmMxNTk0X3JlZGVlbUZyb21fYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo0OQogICAgLy8gYXNzZXJ0KHRoaXMuYmFsYW5jZXMoZnJvbSkuZXhpc3RzICYmIHRoaXMuYmFsYW5jZXMoZnJvbSkudmFsdWUubmF0aXZlID49IGFtb3VudC5uYXRpdmUsICdpbnN1ZmZpY2llbnRfYmFsYW5jZScpCiAgICBhc3NlcnQgLy8gaW5zdWZmaWNpZW50X2JhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6NTAKICAgIC8vIHRoaXMuYmFsYW5jZXMoZnJvbSkudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1Nih0aGlzLmJhbGFuY2VzKGZyb20pLnZhbHVlLm5hdGl2ZSAtIGFtb3VudC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0yCiAgICBiLQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDMyCiAgICBiemVybwogICAgc3dhcAogICAgZGlnIDEKICAgIGJ8CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1MQogICAgLy8gcHVibGljIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8VWludE4yNTY+KHsga2V5OiAndCcgfSkKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJ0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6NTEKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1Nih0aGlzLnRvdGFsU3VwcGx5LnZhbHVlLm5hdGl2ZSAtIGFtb3VudC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBifAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjUxCiAgICAvLyBwdWJsaWMgdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTxVaW50TjI1Nj4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMyAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6NTEKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1Nih0aGlzLnRvdGFsU3VwcGx5LnZhbHVlLm5hdGl2ZSAtIGFtb3VudC5uYXRpdmUpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo1MgogICAgLy8gZW1pdCgnUmVkZWVtJywgbmV3IGFyYzE1OTRfcmVkZWVtX2V2ZW50KHsgZnJvbSwgYW1vdW50LCBkYXRhIH0pKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYnl0ZWMgMTggLy8gMHgwMDQyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA0IC8vIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAyMyAvLyBtZXRob2QgIlJlZGVlbSgoYWRkcmVzcyx1aW50MjU2LGJ5dGVbXSkpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKYXJjMTU5NF9yZWRlZW1Gcm9tX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMSAvLyAwCiAgICBiIGFyYzE1OTRfcmVkZWVtRnJvbV9ib29sX21lcmdlQDgKCmFyYzE1OTRfcmVkZWVtRnJvbV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzEgLy8gMAogICAgYiBhcmMxNTk0X3JlZGVlbUZyb21fYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo6QXJjMTU5NC5hcmMxNTk0X3JlZGVlbShhbW91bnQ6IGJ5dGVzLCBkYXRhOiBieXRlcykgLT4gdm9pZDoKYXJjMTU5NF9yZWRlZW06CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjU1LTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIGFyYzE1OTRfcmVkZWVtKGFtb3VudDogYXJjNC5VaW50TjI1NiwgZGF0YTogYXJjNC5EeW5hbWljQnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo1NwogICAgLy8gY29uc3QgZnJvbSA9IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo1OAogICAgLy8gYXNzZXJ0KGFtb3VudC5uYXRpdmUgPiAwbiwgJ2ludmFsaWRfYW1vdW50JykKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGJ5dGVzIDB4CiAgICBiPgogICAgYXNzZXJ0IC8vIGludmFsaWRfYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTMKICAgIC8vIHB1YmxpYyBiYWxhbmNlcyA9IEJveE1hcDxBZGRyZXNzLCBVaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdiJyB9KQogICAgYnl0ZWMgNSAvLyAiYiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjU5CiAgICAvLyBhc3NlcnQodGhpcy5iYWxhbmNlcyhmcm9tKS5leGlzdHMgJiYgdGhpcy5iYWxhbmNlcyhmcm9tKS52YWx1ZS5uYXRpdmUgPj0gYW1vdW50Lm5hdGl2ZSwgJ2luc3VmZmljaWVudF9iYWxhbmNlJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjMTU5NF9yZWRlZW1fYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgYj49CiAgICBieiBhcmMxNTk0X3JlZGVlbV9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgphcmMxNTk0X3JlZGVlbV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjU5CiAgICAvLyBhc3NlcnQodGhpcy5iYWxhbmNlcyhmcm9tKS5leGlzdHMgJiYgdGhpcy5iYWxhbmNlcyhmcm9tKS52YWx1ZS5uYXRpdmUgPj0gYW1vdW50Lm5hdGl2ZSwgJ2luc3VmZmljaWVudF9iYWxhbmNlJykKICAgIGFzc2VydCAvLyBpbnN1ZmZpY2llbnRfYmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo2MAogICAgLy8gdGhpcy5iYWxhbmNlcyhmcm9tKS52YWx1ZSA9IG5ldyBhcmM0LlVpbnROMjU2KHRoaXMuYmFsYW5jZXMoZnJvbSkudmFsdWUubmF0aXZlIC0gYW1vdW50Lm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTIKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gMzIKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBkaWcgMQogICAgYnwKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjUxCiAgICAvLyBwdWJsaWMgdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTxVaW50TjI1Nj4oeyBrZXk6ICd0JyB9KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gInQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo2MQogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSA9IG5ldyBhcmM0LlVpbnROMjU2KHRoaXMudG90YWxTdXBwbHkudmFsdWUubmF0aXZlIC0gYW1vdW50Lm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgYi0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGJ8CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTEKICAgIC8vIHB1YmxpYyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPFVpbnROMjU2Pih7IGtleTogJ3QnIH0pCiAgICBieXRlY18zIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo2MQogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSA9IG5ldyBhcmM0LlVpbnROMjU2KHRoaXMudG90YWxTdXBwbHkudmFsdWUubmF0aXZlIC0gYW1vdW50Lm5hdGl2ZSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjYyCiAgICAvLyBlbWl0KCdSZWRlZW0nLCBuZXcgYXJjMTU5NF9yZWRlZW1fZXZlbnQoeyBmcm9tLCBhbW91bnQsIGRhdGEgfSkpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDE4IC8vIDB4MDA0MgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjMgLy8gbWV0aG9kICJSZWRlZW0oKGFkZHJlc3MsdWludDI1NixieXRlW10pKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCmFyYzE1OTRfcmVkZWVtX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIGFyYzE1OTRfcmVkZWVtX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6OkFyYzE1OTQuYXJjMTU5NF90cmFuc2Zlcl93aXRoX2RhdGEodG86IGJ5dGVzLCBhbW91bnQ6IGJ5dGVzLCBkYXRhOiBieXRlcykgLT4gYnl0ZXM6CmFyYzE1OTRfdHJhbnNmZXJfd2l0aF9kYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyBhcmMxNTk0X3RyYW5zZmVyX3dpdGhfZGF0YSh0bzogYXJjNC5BZGRyZXNzLCBhbW91bnQ6IGFyYzQuVWludE4yNTYsIGRhdGE6IGFyYzQuRHluYW1pY0J5dGVzKTogYXJjNC5Cb29sIHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo2OQogICAgLy8gY29uc3QgcmVzID0gdGhpcy5hcmMyMDBfdHJhbnNmZXIodG8sIGFtb3VudCkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFyYzIwMF90cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo3MQogICAgLy8gcmV0dXJuIHJlcwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo6QXJjMTU5NC5hcmMxNTk0X3RyYW5zZmVyX2Zyb21fd2l0aF9kYXRhKGZyb206IGJ5dGVzLCB0bzogYnl0ZXMsIGFtb3VudDogYnl0ZXMsIGRhdGE6IGJ5dGVzKSAtPiBieXRlczoKYXJjMTU5NF90cmFuc2Zlcl9mcm9tX3dpdGhfZGF0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6NzQtODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMTU5NF90cmFuc2Zlcl9mcm9tX3dpdGhfZGF0YSgKICAgIC8vICAgZnJvbTogYXJjNC5BZGRyZXNzLAogICAgLy8gICB0bzogYXJjNC5BZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IGFyYzQuVWludE4yNTYsCiAgICAvLyAgIGRhdGE6IGFyYzQuRHluYW1pY0J5dGVzLAogICAgLy8gKTogYXJjNC5Cb29sIHsKICAgIHByb3RvIDQgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czo4MQogICAgLy8gY29uc3QgcmVzID0gdGhpcy5hcmMyMDBfdHJhbnNmZXJGcm9tKGZyb20sIHRvLCBhbW91bnQpCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFyYzIwMF90cmFuc2ZlckZyb20KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6ODIKICAgIC8vIHJldHVybiByZXMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNTk0LmFsZ28udHM6OkFyYzE1OTQuYXJjMTU5NF9pc19pc3N1YWJsZSgpIC0+IGJ5dGVzOgphcmMxNTk0X2lzX2lzc3VhYmxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE1OTQuYWxnby50czoxNAogICAgLy8gcHVibGljIGFyYzE1OTRfaXNzdWFibGUgPSBHbG9iYWxTdGF0ZTxhcmM0LkJvb2w+KHsga2V5OiAnYXJjMTU5NF9pc3MnIH0pIC8vIFRydWUgPSBpc3N1YWJsZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJhcmMxNTk0X2lzcyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTU5NC5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gdGhpcy5hcmMxNTk0X2lzc3VhYmxlLnZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjpBcmMxNDEwLmFyYzE0MTBfYmFsYW5jZV9vZl9wYXJ0aXRpb24oaG9sZGVyOiBieXRlcywgcGFydGl0aW9uOiBieXRlcykgLT4gYnl0ZXM6CmFyYzE0MTBfYmFsYW5jZV9vZl9wYXJ0aXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjY5LTcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gcHVibGljIGFyYzE0MTBfYmFsYW5jZV9vZl9wYXJ0aXRpb24oaG9sZGVyOiBhcmM0LkFkZHJlc3MsIHBhcnRpdGlvbjogYXJjNC5BZGRyZXNzKTogYXJjNC5VaW50TjI1NiB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NzEtNzQKICAgIC8vIGNvbnN0IGtleSA9IG5ldyBhcmMxNDEwX1BhcnRpdGlvbktleSh7CiAgICAvLyAgIGhvbGRlcjogaG9sZGVyLAogICAgLy8gICBwYXJ0aXRpb246IHBhcnRpdGlvbiwKICAgIC8vIH0pCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjU3CiAgICAvLyBwdWJsaWMgcGFydGl0aW9ucyA9IEJveE1hcDxhcmMxNDEwX1BhcnRpdGlvbktleSwgYXJjNC5VaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdhcmMxNDEwX3AnIH0pCiAgICBieXRlYyA2IC8vICJhcmMxNDEwX3AiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NzUKICAgIC8vIHJldHVybiB0aGlzLnBhcnRpdGlvbnMoa2V5KS52YWx1ZQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuYXJjMjAwX3RyYW5zZmVyKHRvOiBieXRlcywgdmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKYXJjMjAwX3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo3OC03OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyBvdmVycmlkZSBhcmMyMDBfdHJhbnNmZXIodG86IGFyYzQuQWRkcmVzcywgdmFsdWU6IGFyYzQuVWludE4yNTYpOiBhcmM0LkJvb2wgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjgxCiAgICAvLyBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo4MgogICAgLy8gbmV3IGFyYzQuQWRkcmVzcygpLAogICAgYnl0ZWNfMSAvLyBhZGRyIEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6ODAtODcKICAgIC8vIHRoaXMuX3RyYW5zZmVyX3BhcnRpdGlvbigKICAgIC8vICAgbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgbmV3IGFyYzQuQWRkcmVzcygpLAogICAgLy8gICB0bywKICAgIC8vICAgbmV3IGFyYzQuQWRkcmVzcygpLAogICAgLy8gICB2YWx1ZSwKICAgIC8vICAgbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6ODQKICAgIC8vIG5ldyBhcmM0LkFkZHJlc3MoKSwKICAgIGJ5dGVjXzEgLy8gYWRkciBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjgwLTg3CiAgICAvLyB0aGlzLl90cmFuc2Zlcl9wYXJ0aXRpb24oCiAgICAvLyAgIG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgIG5ldyBhcmM0LkFkZHJlc3MoKSwKICAgIC8vICAgdG8sCiAgICAvLyAgIG5ldyBhcmM0LkFkZHJlc3MoKSwKICAgIC8vICAgdmFsdWUsCiAgICAvLyAgIG5ldyBhcmM0LkR5bmFtaWNCeXRlcygpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjg2CiAgICAvLyBuZXcgYXJjNC5EeW5hbWljQnl0ZXMoKSwKICAgIGJ5dGVjIDEzIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo4MC04NwogICAgLy8gdGhpcy5fdHJhbnNmZXJfcGFydGl0aW9uKAogICAgLy8gICBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICBuZXcgYXJjNC5BZGRyZXNzKCksCiAgICAvLyAgIHRvLAogICAgLy8gICBuZXcgYXJjNC5BZGRyZXNzKCksCiAgICAvLyAgIHZhbHVlLAogICAgLy8gICBuZXcgYXJjNC5EeW5hbWljQnl0ZXMoKSwKICAgIC8vICkKICAgIGNhbGxzdWIgX3RyYW5zZmVyX3BhcnRpdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo4OAogICAgLy8gcmV0dXJuIHRoaXMuX3RyYW5zZmVyKG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksIHRvLCB2YWx1ZSkKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF90cmFuc2ZlcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo6QXJjMTQxMC5hcmMxNDEwX3RyYW5zZmVyX2J5X3BhcnRpdGlvbihwYXJ0aXRpb246IGJ5dGVzLCB0bzogYnl0ZXMsIGFtb3VudDogYnl0ZXMsIGRhdGE6IGJ5dGVzKSAtPiBieXRlczoKYXJjMTQxMF90cmFuc2Zlcl9ieV9wYXJ0aXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjkzLTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIGFyYzE0MTBfdHJhbnNmZXJfYnlfcGFydGl0aW9uKAogICAgLy8gICBwYXJ0aXRpb246IGFyYzQuQWRkcmVzcywKICAgIC8vICAgdG86IGFyYzQuQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBhcmM0LlVpbnROMjU2LAogICAgLy8gICBkYXRhOiBhcmM0LkR5bmFtaWNCeXRlcywKICAgIC8vICk6IGFyYzQuQWRkcmVzcyB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTAwCiAgICAvLyBjb25zdCBzZW5kZXIgPSBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjEwMgogICAgLy8gbGV0IHJlY2VpdmVyUGFydGl0aW9uID0gdGhpcy5fcmVjZWl2ZXJQYXJ0aXRpb24odG8sIHBhcnRpdGlvbikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC00CiAgICBjYWxsc3ViIF9yZWNlaXZlclBhcnRpdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMDMKICAgIC8vIHRoaXMuX3RyYW5zZmVyX3BhcnRpdGlvbihzZW5kZXIsIHBhcnRpdGlvbiwgdG8sIHJlY2VpdmVyUGFydGl0aW9uLCBhbW91bnQsIGRhdGEpCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMwogICAgZGlnIDMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF90cmFuc2Zlcl9wYXJ0aXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTA0CiAgICAvLyByZXR1cm4gcmVjZWl2ZXJQYXJ0aXRpb24KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuYXJjMTQxMF9wYXJ0aXRpb25zX29mKGhvbGRlcjogYnl0ZXMsIHBhZ2U6IGJ5dGVzKSAtPiBieXRlczoKYXJjMTQxMF9wYXJ0aXRpb25zX29mOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMDctMTA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIGFyYzE0MTBfcGFydGl0aW9uc19vZihob2xkZXI6IGFyYzQuQWRkcmVzcywgcGFnZTogYXJjNC5VaW50TjY0KTogYXJjNC5BZGRyZXNzW10gewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjEwOQogICAgLy8gY29uc3Qga2V5ID0gbmV3IGFyYzE0MTBfSG9sZGluZ1BhcnRpdGlvbnNQYWdpbmF0ZWRLZXkoeyBob2xkZXI6IGhvbGRlciwgcGFnZTogcGFnZSB9KQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo2MAogICAgLy8ga2V5UHJlZml4OiAnYXJjMTQxMF9ocF9hJywKICAgIGJ5dGVjIDE1IC8vICJhcmMxNDEwX2hwX2EiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMTAKICAgIC8vIGlmICghdGhpcy5ob2xkZXJQYXJ0aXRpb25zQWRkcmVzc2VzKGtleSkuZXhpc3RzKSByZXR1cm4gW10KICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFyYzE0MTBfcGFydGl0aW9uc19vZl9hZnRlcl9pZl9lbHNlQDIKICAgIGJ5dGVjIDEzIC8vIDB4MDAwMAogICAgc3dhcAogICAgcmV0c3ViCgphcmMxNDEwX3BhcnRpdGlvbnNfb2ZfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMTEKICAgIC8vIHJldHVybiB0aGlzLmhvbGRlclBhcnRpdGlvbnNBZGRyZXNzZXMoa2V5KS52YWx1ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjpBcmMxNDEwLmFyYzE0MTBfaXNfb3BlcmF0b3IoaG9sZGVyOiBieXRlcywgb3BlcmF0b3I6IGJ5dGVzLCBwYXJ0aXRpb246IGJ5dGVzKSAtPiBieXRlczoKYXJjMTQxMF9pc19vcGVyYXRvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTE0LTExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIHB1YmxpYyBhcmMxNDEwX2lzX29wZXJhdG9yKGhvbGRlcjogYXJjNC5BZGRyZXNzLCBvcGVyYXRvcjogYXJjNC5BZGRyZXNzLCBwYXJ0aXRpb246IGFyYzQuQWRkcmVzcyk6IGFyYzQuQm9vbCB7CiAgICBwcm90byAzIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTE2CiAgICAvLyBpZiAob3BlcmF0b3IgPT09IGhvbGRlcikgcmV0dXJuIG5ldyBhcmM0LkJvb2wodHJ1ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYnogYXJjMTQxMF9pc19vcGVyYXRvcl9hZnRlcl9pZl9lbHNlQDIKICAgIGJ5dGVjIDggLy8gMHg4MAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFyYzE0MTBfaXNfb3BlcmF0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMTcKICAgIC8vIGNvbnN0IHNwZWNpZmljID0gbmV3IGFyYzE0MTBfT3BlcmF0b3JLZXkoeyBob2xkZXI6IGhvbGRlciwgb3BlcmF0b3I6IG9wZXJhdG9yLCBwYXJ0aXRpb246IHBhcnRpdGlvbiB9KQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjYyCiAgICAvLyBwdWJsaWMgb3BlcmF0b3JzID0gQm94TWFwPGFyYzE0MTBfT3BlcmF0b3JLZXksIGFyYzQuQnl0ZT4oeyBrZXlQcmVmaXg6ICdhcmMxNDEwX29wJyB9KSAvLyB2YWx1ZSA9IDEgYXV0aG9yaXplZAogICAgYnl0ZWMgMTYgLy8gImFyYzE0MTBfb3AiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjExOAogICAgLy8gaWYgKHRoaXMub3BlcmF0b3JzKHNwZWNpZmljKS5leGlzdHMgJiYgdGhpcy5vcGVyYXRvcnMoc3BlY2lmaWMpLnZhbHVlLm5hdGl2ZSA9PT0gMSkgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmMxNDEwX2lzX29wZXJhdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IGFyYzE0MTBfaXNfb3BlcmF0b3JfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjExOQogICAgLy8gcmV0dXJuIG5ldyBhcmM0LkJvb2wodHJ1ZSkKICAgIGJ5dGVjIDggLy8gMHg4MAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFyYzE0MTBfaXNfb3BlcmF0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMjEKICAgIC8vIGNvbnN0IGdsb2JhbEtleSA9IG5ldyBhcmMxNDEwX09wZXJhdG9yS2V5KHsgaG9sZGVyOiBob2xkZXIsIG9wZXJhdG9yOiBvcGVyYXRvciwgcGFydGl0aW9uOiBuZXcgYXJjNC5BZGRyZXNzKCkgfSkKICAgIGZyYW1lX2RpZyAwCiAgICBieXRlY18xIC8vIGFkZHIgQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjYyCiAgICAvLyBwdWJsaWMgb3BlcmF0b3JzID0gQm94TWFwPGFyYzE0MTBfT3BlcmF0b3JLZXksIGFyYzQuQnl0ZT4oeyBrZXlQcmVmaXg6ICdhcmMxNDEwX29wJyB9KSAvLyB2YWx1ZSA9IDEgYXV0aG9yaXplZAogICAgYnl0ZWMgMTYgLy8gImFyYzE0MTBfb3AiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjEyMgogICAgLy8gaWYgKHRoaXMub3BlcmF0b3JzKGdsb2JhbEtleSkuZXhpc3RzICYmIHRoaXMub3BlcmF0b3JzKGdsb2JhbEtleSkudmFsdWUubmF0aXZlID09PSAxKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFyYzE0MTBfaXNfb3BlcmF0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogYXJjMTQxMF9pc19vcGVyYXRvcl9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTIzCiAgICAvLyByZXR1cm4gbmV3IGFyYzQuQm9vbCh0cnVlKQogICAgYnl0ZWMgOCAvLyAweDgwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXJjMTQxMF9pc19vcGVyYXRvcl9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjEyNQogICAgLy8gcmV0dXJuIG5ldyBhcmM0LkJvb2woZmFsc2UpCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuYXJjMTQxMF9hdXRob3JpemVfb3BlcmF0b3IoaG9sZGVyOiBieXRlcywgb3BlcmF0b3I6IGJ5dGVzLCBwYXJ0aXRpb246IGJ5dGVzKSAtPiB2b2lkOgphcmMxNDEwX2F1dGhvcml6ZV9vcGVyYXRvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTI4LTEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyBhcmMxNDEwX2F1dGhvcml6ZV9vcGVyYXRvcihob2xkZXI6IGFyYzQuQWRkcmVzcywgb3BlcmF0b3I6IGFyYzQuQWRkcmVzcywgcGFydGl0aW9uOiBhcmM0LkFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDMgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMzAKICAgIC8vIGFzc2VydChuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpID09PSBob2xkZXIsICdPbmx5IGhvbGRlciBjYW4gYXV0aG9yaXplJykKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGhvbGRlciBjYW4gYXV0aG9yaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjEzMQogICAgLy8gY29uc3Qga2V5ID0gbmV3IGFyYzE0MTBfT3BlcmF0b3JLZXkoeyBob2xkZXI6IGhvbGRlciwgb3BlcmF0b3I6IG9wZXJhdG9yLCBwYXJ0aXRpb246IHBhcnRpdGlvbiB9KQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NjIKICAgIC8vIHB1YmxpYyBvcGVyYXRvcnMgPSBCb3hNYXA8YXJjMTQxMF9PcGVyYXRvcktleSwgYXJjNC5CeXRlPih7IGtleVByZWZpeDogJ2FyYzE0MTBfb3AnIH0pIC8vIHZhbHVlID0gMSBhdXRob3JpemVkCiAgICBieXRlYyAxNiAvLyAiYXJjMTQxMF9vcCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMzIKICAgIC8vIHRoaXMub3BlcmF0b3JzKGtleSkudmFsdWUgPSBuZXcgYXJjNC5CeXRlKDEpCiAgICBieXRlYyAxOSAvLyAweDAxCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjpBcmMxNDEwLmFyYzE0MTBfcmV2b2tlX29wZXJhdG9yKGhvbGRlcjogYnl0ZXMsIG9wZXJhdG9yOiBieXRlcywgcGFydGl0aW9uOiBieXRlcykgLT4gdm9pZDoKYXJjMTQxMF9yZXZva2Vfb3BlcmF0b3I6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjEzNS0xMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMTQxMF9yZXZva2Vfb3BlcmF0b3IoaG9sZGVyOiBhcmM0LkFkZHJlc3MsIG9wZXJhdG9yOiBhcmM0LkFkZHJlc3MsIHBhcnRpdGlvbjogYXJjNC5BZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAzIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTM3CiAgICAvLyBhc3NlcnQobmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSA9PT0gaG9sZGVyLCAnT25seSBob2xkZXIgY2FuIHJldm9rZScpCiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBob2xkZXIgY2FuIHJldm9rZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMzgKICAgIC8vIGNvbnN0IGtleSA9IG5ldyBhcmMxNDEwX09wZXJhdG9yS2V5KHsgaG9sZGVyOiBob2xkZXIsIG9wZXJhdG9yOiBvcGVyYXRvciwgcGFydGl0aW9uOiBwYXJ0aXRpb24gfSkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjYyCiAgICAvLyBwdWJsaWMgb3BlcmF0b3JzID0gQm94TWFwPGFyYzE0MTBfT3BlcmF0b3JLZXksIGFyYzQuQnl0ZT4oeyBrZXlQcmVmaXg6ICdhcmMxNDEwX29wJyB9KSAvLyB2YWx1ZSA9IDEgYXV0aG9yaXplZAogICAgYnl0ZWMgMTYgLy8gImFyYzE0MTBfb3AiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxMzkKICAgIC8vIGlmICh0aGlzLm9wZXJhdG9ycyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmMxNDEwX3Jldm9rZV9vcGVyYXRvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLm9wZXJhdG9ycyhrZXkpLmRlbGV0ZSgpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2RlbAogICAgcG9wCgphcmMxNDEwX3Jldm9rZV9vcGVyYXRvcl9hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjpBcmMxNDEwLmFyYzE0MTBfb3BlcmF0b3JfdHJhbnNmZXJfYnlfcGFydGl0aW9uKGZyb206IGJ5dGVzLCBwYXJ0aXRpb246IGJ5dGVzLCB0bzogYnl0ZXMsIGFtb3VudDogYnl0ZXMsIGRhdGE6IGJ5dGVzKSAtPiBieXRlczoKYXJjMTQxMF9vcGVyYXRvcl90cmFuc2Zlcl9ieV9wYXJ0aXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjE0NC0xNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMTQxMF9vcGVyYXRvcl90cmFuc2Zlcl9ieV9wYXJ0aXRpb24oCiAgICAvLyAgIGZyb206IGFyYzQuQWRkcmVzcywKICAgIC8vICAgcGFydGl0aW9uOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgIHRvOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogYXJjNC5VaW50TjI1NiwKICAgIC8vICAgZGF0YTogYXJjNC5EeW5hbWljQnl0ZXMsCiAgICAvLyApOiBhcmM0LkFkZHJlc3MgewogICAgcHJvdG8gNSAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxNTIKICAgIC8vIGNvbnN0IHNlbmRlciA9IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTU0CiAgICAvLyBsZXQgYXV0aG9yaXplZCA9IHRoaXMuYXJjMTQxMF9pc19vcGVyYXRvcihmcm9tLCBzZW5kZXIsIHBhcnRpdGlvbikubmF0aXZlID09PSB0cnVlCiAgICBmcmFtZV9kaWcgLTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTUyCiAgICAvLyBjb25zdCBzZW5kZXIgPSBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjE1NAogICAgLy8gbGV0IGF1dGhvcml6ZWQgPSB0aGlzLmFyYzE0MTBfaXNfb3BlcmF0b3IoZnJvbSwgc2VuZGVyLCBwYXJ0aXRpb24pLm5hdGl2ZSA9PT0gdHJ1ZQogICAgZnJhbWVfZGlnIC00CiAgICBjYWxsc3ViIGFyYzE0MTBfaXNfb3BlcmF0b3IKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjE1NgogICAgLy8gaWYgKCFhdXRob3JpemVkKSB7CiAgICBibnogYXJjMTQxMF9vcGVyYXRvcl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjE1OAogICAgLy8gY29uc3QgcEtleSA9IG5ldyBhcmMxNDEwX09wZXJhdG9yUG9ydGlvbktleSh7IGhvbGRlcjogZnJvbSwgb3BlcmF0b3I6IHNlbmRlciwgcGFydGl0aW9uIH0pCiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjYzCiAgICAvLyBwdWJsaWMgb3BlcmF0b3JQb3J0aW9uQWxsb3dhbmNlcyA9IEJveE1hcDxhcmMxNDEwX09wZXJhdG9yUG9ydGlvbktleSwgYXJjNC5VaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdhcmMxNDEwX29wYScgfSkKICAgIGJ5dGVjIDEyIC8vICJhcmMxNDEwX29wYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTU5CiAgICAvLyBpZiAodGhpcy5vcGVyYXRvclBvcnRpb25BbGxvd2FuY2VzKHBLZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmMxNDEwX29wZXJhdG9yX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTYwCiAgICAvLyBjb25zdCByZW1haW5pbmcgPSB0aGlzLm9wZXJhdG9yUG9ydGlvbkFsbG93YW5jZXMocEtleSkudmFsdWUKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjE2MQogICAgLy8gYXNzZXJ0KHJlbWFpbmluZy5uYXRpdmUgPj0gYW1vdW50Lm5hdGl2ZSwgJ1BvcnRpb24gYWxsb3dhbmNlIGV4Y2VlZGVkJykKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICBiPj0KICAgIGFzc2VydCAvLyBQb3J0aW9uIGFsbG93YW5jZSBleGNlZWRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxNjIKICAgIC8vIGF1dGhvcml6ZWQgPSB0cnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjE2NQogICAgLy8gdGhpcy5vcGVyYXRvclBvcnRpb25BbGxvd2FuY2VzKHBLZXkpLnZhbHVlID0gbmV3IGFyYzQuVWludE4yNTYocmVtYWluaW5nLm5hdGl2ZSAtIGFtb3VudC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgYm94X3B1dAoKYXJjMTQxMF9vcGVyYXRvcl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMwoKYXJjMTQxMF9vcGVyYXRvcl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgZnJhbWVfZGlnIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTY4CiAgICAvLyBhc3NlcnQoYXV0aG9yaXplZCwgJ05vdCBhdXRob3JpemVkIG9wZXJhdG9yJykKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZCBvcGVyYXRvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxNjkKICAgIC8vIGxldCByZWNlaXZlclBhcnRpdGlvbiA9IHRoaXMuX3JlY2VpdmVyUGFydGl0aW9uKHRvLCBwYXJ0aXRpb24pCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtNAogICAgY2FsbHN1YiBfcmVjZWl2ZXJQYXJ0aXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTcwCiAgICAvLyB0aGlzLl90cmFuc2Zlcl9wYXJ0aXRpb24oZnJvbSwgcGFydGl0aW9uLCB0bywgcmVjZWl2ZXJQYXJ0aXRpb24sIGFtb3VudCwgZGF0YSkKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfdHJhbnNmZXJfcGFydGl0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjE3MQogICAgLy8gcmV0dXJuIHJlY2VpdmVyUGFydGl0aW9uCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uKGZyb206IGJ5dGVzLCBwYXJ0aXRpb246IGJ5dGVzLCB0bzogYnl0ZXMsIGFtb3VudDogYnl0ZXMsIGRhdGE6IGJ5dGVzKSAtPiBieXRlczoKYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxNzQtMTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIGFyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbigKICAgIC8vICAgZnJvbTogYXJjNC5BZGRyZXNzLAogICAgLy8gICBwYXJ0aXRpb246IGFyYzQuQWRkcmVzcywKICAgIC8vICAgdG86IGFyYzQuQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBhcmM0LlVpbnROMjU2LAogICAgLy8gICBkYXRhOiBhcmM0LkR5bmFtaWNCeXRlcywKICAgIC8vICk6IGFyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9yZXR1cm4gewogICAgcHJvdG8gNSAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNTEKICAgIC8vIHJldHVybiB0aGlzLnBhcnRpdGlvbnMobmV3IGFyYzE0MTBfUGFydGl0aW9uS2V5KHsgaG9sZGVyOiBob2xkZXIsIHBhcnRpdGlvbjogcGFydGl0aW9uIH0pKS5leGlzdHMKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NTcKICAgIC8vIHB1YmxpYyBwYXJ0aXRpb25zID0gQm94TWFwPGFyYzE0MTBfUGFydGl0aW9uS2V5LCBhcmM0LlVpbnROMjU2Pih7IGtleVByZWZpeDogJ2FyYzE0MTBfcCcgfSkKICAgIGJ5dGVjIDYgLy8gImFyYzE0MTBfcCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI1MQogICAgLy8gcmV0dXJuIHRoaXMucGFydGl0aW9ucyhuZXcgYXJjMTQxMF9QYXJ0aXRpb25LZXkoeyBob2xkZXI6IGhvbGRlciwgcGFydGl0aW9uOiBwYXJ0aXRpb24gfSkpLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjE4MgogICAgLy8gaWYgKCF0aGlzLl92YWxpZFBhcnRpdGlvbihmcm9tLCBwYXJ0aXRpb24pKSB7CiAgICBibnogYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxODMtMTg3CiAgICAvLyByZXR1cm4gbmV3IGFyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9yZXR1cm4oewogICAgLy8gICBjb2RlOiBuZXcgYXJjNC5CeXRlKDB4NTApLAogICAgLy8gICBzdGF0dXM6IG5ldyBhcmM0LlN0cignUGFydGl0aW9uIG5vdCBleGlzdHMnKSwKICAgIC8vICAgcmVjZWl2ZXJQYXJ0aXRpb246IG5ldyBhcmM0LkFkZHJlc3MoKSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgYmFzZTMyKEtBQUNHQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLRkFZTFNPUlVYSTJMUE5ZUUc0MzNVRUJTWFEyTFRPUlpRKQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5wYXJ0aXRpb25zKG5ldyBhcmMxNDEwX1BhcnRpdGlvbktleSh7IGhvbGRlcjogZnJvbSwgcGFydGl0aW9uOiBwYXJ0aXRpb24gfSkpLnZhbHVlLm5hdGl2ZSA8IGFtb3VudC5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0yCiAgICBiPAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxODktMTkxCiAgICAvLyBpZiAoCiAgICAvLyAgIHRoaXMucGFydGl0aW9ucyhuZXcgYXJjMTQxMF9QYXJ0aXRpb25LZXkoeyBob2xkZXI6IGZyb20sIHBhcnRpdGlvbjogcGFydGl0aW9uIH0pKS52YWx1ZS5uYXRpdmUgPCBhbW91bnQubmF0aXZlCiAgICAvLyApIHsKICAgIGJ6IGFyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MTkyLTE5NgogICAgLy8gcmV0dXJuIG5ldyBhcmMxNDEwX2Nhbl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fcmV0dXJuKHsKICAgIC8vICAgY29kZTogbmV3IGFyYzQuQnl0ZSgweDUyKSwKICAgIC8vICAgc3RhdHVzOiBuZXcgYXJjNC5TdHIoJ0luc3VmZmljaWVudCBiYWxhbmNlJyksCiAgICAvLyAgIHJlY2VpdmVyUGFydGl0aW9uOiBuZXcgYXJjNC5BZGRyZXNzKCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIGJhc2UzMihLSUFDR0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBS0VTM1RUT1ZUR00yTERORlNXNDVCQU1KUVdZWUxPTU5TUSkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphcmMxNDEwX2Nhbl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoxOTkKICAgIC8vIGlmICh0byA9PT0gbmV3IGFyYzQuQWRkcmVzcygpKSB7CiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjXzEgLy8gYWRkciBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRCiAgICA9PQogICAgYnogYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyMDAtMjA0CiAgICAvLyByZXR1cm4gbmV3IGFyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9yZXR1cm4oewogICAgLy8gICBjb2RlOiBuZXcgYXJjNC5CeXRlKDB4NTcpLAogICAgLy8gICBzdGF0dXM6IG5ldyBhcmM0LlN0cignSW52YWxpZCByZWNlaXZlcicpLAogICAgLy8gICByZWNlaXZlclBhcnRpdGlvbjogbmV3IGFyYzQuQWRkcmVzcygpLAogICAgLy8gfSkKICAgIHB1c2hieXRlcyBiYXNlMzIoSzRBQ0dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlFUzNUV01GV0dTWkJBT0pTV0daTEpPWlNYRSkKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphcmMxNDEwX2Nhbl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyMDgKICAgIC8vIGNvbnN0IHNlbmRlckFkZHIgPSBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyMDkKICAgIC8vIGlmIChzZW5kZXJBZGRyICE9PSBmcm9tKSB7CiAgICBmcmFtZV9kaWcgLTUKICAgICE9CiAgICBieiBhcmMxNDEwX2Nhbl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyMTAKICAgIC8vIGxldCBhdXRob3JpemVkID0gdGhpcy5hcmMxNDEwX2lzX29wZXJhdG9yKGZyb20sIHNlbmRlckFkZHIsIHBhcnRpdGlvbikubmF0aXZlID09PSB0cnVlCiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTQKICAgIGNhbGxzdWIgYXJjMTQxMF9pc19vcGVyYXRvcgogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjExCiAgICAvLyBpZiAoIWF1dGhvcml6ZWQpIHsKICAgIGJueiBhcmMxNDEwX2Nhbl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyMTIKICAgIC8vIGNvbnN0IHBLZXkgPSBuZXcgYXJjMTQxMF9PcGVyYXRvclBvcnRpb25LZXkoeyBob2xkZXI6IGZyb20sIG9wZXJhdG9yOiBzZW5kZXJBZGRyLCBwYXJ0aXRpb24gfSkKICAgIGZyYW1lX2RpZyAtNQogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NjMKICAgIC8vIHB1YmxpYyBvcGVyYXRvclBvcnRpb25BbGxvd2FuY2VzID0gQm94TWFwPGFyYzE0MTBfT3BlcmF0b3JQb3J0aW9uS2V5LCBhcmM0LlVpbnROMjU2Pih7IGtleVByZWZpeDogJ2FyYzE0MTBfb3BhJyB9KQogICAgYnl0ZWMgMTIgLy8gImFyYzE0MTBfb3BhIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyMTMKICAgIC8vIGlmICh0aGlzLm9wZXJhdG9yUG9ydGlvbkFsbG93YW5jZXMocEtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDMKICAgIGJ6IGFyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjIxNAogICAgLy8gY29uc3QgcmVtYWluaW5nID0gdGhpcy5vcGVyYXRvclBvcnRpb25BbGxvd2FuY2VzKHBLZXkpLnZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjE1CiAgICAvLyBpZiAocmVtYWluaW5nLm5hdGl2ZSA+PSBhbW91bnQubmF0aXZlKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGI+PQogICAgYnogYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjE2CiAgICAvLyBhdXRob3JpemVkID0gdHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGZyYW1lX2J1cnkgMgoKYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCgphcmMxNDEwX2Nhbl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjIyMAogICAgLy8gaWYgKCFhdXRob3JpemVkKSB7CiAgICBibnogYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjIxLTIyNQogICAgLy8gcmV0dXJuIG5ldyBhcmMxNDEwX2Nhbl90cmFuc2Zlcl9ieV9wYXJ0aXRpb25fcmV0dXJuKHsKICAgIC8vICAgY29kZTogbmV3IGFyYzQuQnl0ZSgweDU4KSwKICAgIC8vICAgc3RhdHVzOiBuZXcgYXJjNC5TdHIoJ09wZXJhdG9yIG5vdCBhdXRob3JpemVkJyksCiAgICAvLyAgIHJlY2VpdmVyUGFydGl0aW9uOiBuZXcgYXJjNC5BZGRyZXNzKCksCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIGJhc2UzMihMQUFDR0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTFU2NERGT0pRWEkzM1NFQlhHNjVCQU1GMlhJMkRQT0pVWFVaTEUpCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjIyOQogICAgLy8gbGV0IHJlY2VpdmVyUGFydGl0aW9uID0gdGhpcy5fcmVjZWl2ZXJQYXJ0aXRpb24odG8sIHBhcnRpdGlvbikKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC00CiAgICBjYWxsc3ViIF9yZWNlaXZlclBhcnRpdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyMzEtMjM1CiAgICAvLyByZXR1cm4gbmV3IGFyYzE0MTBfY2FuX3RyYW5zZmVyX2J5X3BhcnRpdGlvbl9yZXR1cm4oewogICAgLy8gICBjb2RlOiBuZXcgYXJjNC5CeXRlKDB4NTEpLAogICAgLy8gICBzdGF0dXM6IG5ldyBhcmM0LlN0cignU3VjY2VzcycpLAogICAgLy8gICByZWNlaXZlclBhcnRpdGlvbjogcmVjZWl2ZXJQYXJ0aXRpb24sCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4NTEwMDIzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjMzCiAgICAvLyBzdGF0dXM6IG5ldyBhcmM0LlN0cignU3VjY2VzcycpLAogICAgcHVzaGJ5dGVzIDB4MDAwNzUzNzU2MzYzNjU3MzczCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjIzMS0yMzUKICAgIC8vIHJldHVybiBuZXcgYXJjMTQxMF9jYW5fdHJhbnNmZXJfYnlfcGFydGl0aW9uX3JldHVybih7CiAgICAvLyAgIGNvZGU6IG5ldyBhcmM0LkJ5dGUoMHg1MSksCiAgICAvLyAgIHN0YXR1czogbmV3IGFyYzQuU3RyKCdTdWNjZXNzJyksCiAgICAvLyAgIHJlY2VpdmVyUGFydGl0aW9uOiByZWNlaXZlclBhcnRpdGlvbiwKICAgIC8vIH0pCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo6QXJjMTQxMC5fcmVjZWl2ZXJQYXJ0aXRpb24ocmVjZWl2ZXI6IGJ5dGVzLCBwYXJ0aXRpb246IGJ5dGVzKSAtPiBieXRlczoKX3JlY2VpdmVyUGFydGl0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNDMKICAgIC8vIHByb3RlY3RlZCBfcmVjZWl2ZXJQYXJ0aXRpb24ocmVjZWl2ZXI6IGFyYzQuQWRkcmVzcywgcGFydGl0aW9uOiBhcmM0LkFkZHJlc3MpOiBhcmM0LkFkZHJlc3MgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI0NAogICAgLy8gbGV0IHJlY2VpdmVyUGFydGl0aW9uID0gbmV3IGFyYzQuQWRkcmVzcygpCiAgICBieXRlY18xIC8vIGFkZHIgQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNDUKICAgIC8vIGlmICh0aGlzLnBhcnRpdGlvbnMobmV3IGFyYzE0MTBfUGFydGl0aW9uS2V5KHsgaG9sZGVyOiByZWNlaXZlciwgcGFydGl0aW9uOiBwYXJ0aXRpb24gfSkpLmV4aXN0cykgewogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo1NwogICAgLy8gcHVibGljIHBhcnRpdGlvbnMgPSBCb3hNYXA8YXJjMTQxMF9QYXJ0aXRpb25LZXksIGFyYzQuVWludE4yNTY+KHsga2V5UHJlZml4OiAnYXJjMTQxMF9wJyB9KQogICAgYnl0ZWMgNiAvLyAiYXJjMTQxMF9wIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI0NQogICAgLy8gaWYgKHRoaXMucGFydGl0aW9ucyhuZXcgYXJjMTQxMF9QYXJ0aXRpb25LZXkoeyBob2xkZXI6IHJlY2VpdmVyLCBwYXJ0aXRpb246IHBhcnRpdGlvbiB9KSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IF9yZWNlaXZlclBhcnRpdGlvbl9hZnRlcl9pZl9lbHNlQDIKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCgpfcmVjZWl2ZXJQYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNDgKICAgIC8vIHJldHVybiByZWNlaXZlclBhcnRpdGlvbgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuX2FkZF9wYXJ0aWNpcGF0aW9uX3RvX2hvbGRlcihob2xkZXI6IGJ5dGVzLCBwYXJ0aWNpcGF0aW9uOiBieXRlcykgLT4gdm9pZDoKX2FkZF9wYXJ0aWNpcGF0aW9uX3RvX2hvbGRlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjY0CiAgICAvLyBwcm90ZWN0ZWQgX2FkZF9wYXJ0aWNpcGF0aW9uX3RvX2hvbGRlcihob2xkZXI6IGFyYzQuQWRkcmVzcywgcGFydGljaXBhdGlvbjogYXJjNC5BZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjU4CiAgICAvLyBwdWJsaWMgaG9sZGVyUGFydGl0aW9uc0N1cnJlbnRQYWdlID0gQm94TWFwPGFyYzQuQWRkcmVzcywgYXJjNC5VaW50TjY0Pih7IGtleVByZWZpeDogJ2FyYzE0MTBfaHBfcCcgfSkKICAgIHB1c2hieXRlcyAiYXJjMTQxMF9ocF9wIgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNjYKICAgIC8vIGlmICghdGhpcy5ob2xkZXJQYXJ0aXRpb25zQ3VycmVudFBhZ2UoaG9sZGVyKS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IF9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXJfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI2NwogICAgLy8gdGhpcy5ob2xkZXJQYXJ0aXRpb25zQ3VycmVudFBhZ2UoaG9sZGVyKS52YWx1ZSA9IHBhZ2UKICAgIGZyYW1lX2RpZyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNjUKICAgIC8vIGxldCBwYWdlID0gbmV3IGFyYzQuVWludE42NCgwKQogICAgYnl0ZWMgMjQgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI2NwogICAgLy8gdGhpcy5ob2xkZXJQYXJ0aXRpb25zQ3VycmVudFBhZ2UoaG9sZGVyKS52YWx1ZSA9IHBhZ2UKICAgIGJveF9wdXQKCl9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXJfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNjkKICAgIC8vIGNvbnN0IGxhc3RQYWdlID0gdGhpcy5ob2xkZXJQYXJ0aXRpb25zQ3VycmVudFBhZ2UoaG9sZGVyKS52YWx1ZQogICAgZnJhbWVfZGlnIDEwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI3MAogICAgLy8gbGV0IGZvdW5kID0gZmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjY1CiAgICAvLyBsZXQgcGFnZSA9IG5ldyBhcmM0LlVpbnRONjQoMCkKICAgIGJ5dGVjIDI0IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNzEKICAgIC8vIGZvciAobGV0IGN1clBhZ2UgPSBwYWdlOyBjdXJQYWdlLm5hdGl2ZSA8IGxhc3RQYWdlLm5hdGl2ZTsgY3VyUGFnZSA9IG5ldyBhcmM0LlVpbnRONjQoY3VyUGFnZS5uYXRpdmUgKyAxKSkgewogICAgZnJhbWVfYnVyeSAxCgpfYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyX3doaWxlX3RvcEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNzEKICAgIC8vIGZvciAobGV0IGN1clBhZ2UgPSBwYWdlOyBjdXJQYWdlLm5hdGl2ZSA8IGxhc3RQYWdlLm5hdGl2ZTsgY3VyUGFnZSA9IG5ldyBhcmM0LlVpbnRONjQoY3VyUGFnZS5uYXRpdmUgKyAxKSkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBmcmFtZV9kaWcgMgogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIDwKICAgIGJ6IF9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXJfYmxvY2tAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjcyLTI3NQogICAgLy8gY29uc3QgcGFnaW5hdGVkS2V5ID0gbmV3IGFyYzE0MTBfSG9sZGluZ1BhcnRpdGlvbnNQYWdpbmF0ZWRLZXkoewogICAgLy8gICBob2xkZXI6IGhvbGRlciwKICAgIC8vICAgcGFnZTogY3VyUGFnZSwKICAgIC8vIH0pCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NjAKICAgIC8vIGtleVByZWZpeDogJ2FyYzE0MTBfaHBfYScsCiAgICBieXRlYyAxNSAvLyAiYXJjMTQxMF9ocF9hIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNzYKICAgIC8vIGlmICghdGhpcy5ob2xkZXJQYXJ0aXRpb25zQWRkcmVzc2VzKHBhZ2luYXRlZEtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBfYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNzcKICAgIC8vIHRoaXMuaG9sZGVyUGFydGl0aW9uc0FkZHJlc3NlcyhwYWdpbmF0ZWRLZXkpLnZhbHVlID0gW3BhcnRpY2lwYXRpb25dCiAgICBieXRlYyAyMCAvLyAweDAwMDEKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKCl9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXJfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyODAKICAgIC8vIGlmICh0aGlzLmNvbnRhaW5zQWRkcmVzcyh0aGlzLmhvbGRlclBhcnRpdGlvbnNBZGRyZXNzZXMocGFnaW5hdGVkS2V5KS52YWx1ZSwgcGFydGljaXBhdGlvbikpIHsKICAgIGZyYW1lX2RpZyA0CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjU0CiAgICAvLyBmb3IgKGNvbnN0IHYgb2YgYSkgewogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMSAvLyAwCiAgICBmcmFtZV9idXJ5IDcKCl9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXJfZm9yX2hlYWRlckAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjU0CiAgICAvLyBmb3IgKGNvbnN0IHYgb2YgYSkgewogICAgZnJhbWVfZGlnIDcKICAgIGZyYW1lX2RpZyA1CiAgICA8CiAgICBieiBfYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyX2FmdGVyX2ZvckAyMQogICAgZnJhbWVfZGlnIDAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNwogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNTUKICAgIC8vIGlmICh2ID09PSB4KSByZXR1cm4gdHJ1ZQogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYnogX2FkZF9wYXJ0aWNpcGF0aW9uX3RvX2hvbGRlcl9hZnRlcl9pZl9lbHNlQDIwCiAgICBpbnRjXzAgLy8gMQoKX2FkZF9wYXJ0aWNpcGF0aW9uX3RvX2hvbGRlcl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuY29udGFpbnNBZGRyZXNzQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyODAKICAgIC8vIGlmICh0aGlzLmNvbnRhaW5zQWRkcmVzcyh0aGlzLmhvbGRlclBhcnRpdGlvbnNBZGRyZXNzZXMocGFnaW5hdGVkS2V5KS52YWx1ZSwgcGFydGljaXBhdGlvbikpIHsKICAgIGJ6IF9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXJfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI4MQogICAgLy8gZm91bmQgPSB0cnVlCiAgICBpbnRjXzAgLy8gMQogICAgZnJhbWVfYnVyeSA2CgpfYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyX2Jsb2NrQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyODUKICAgIC8vIGlmICghZm91bmQpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBibnogX2FkZF9wYXJ0aWNpcGF0aW9uX3RvX2hvbGRlcl9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI4Ni0yODkKICAgIC8vIGNvbnN0IHBhZ2luYXRlZEtleSA9IG5ldyBhcmMxNDEwX0hvbGRpbmdQYXJ0aXRpb25zUGFnaW5hdGVkS2V5KHsKICAgIC8vICAgaG9sZGVyOiBob2xkZXIsCiAgICAvLyAgIHBhZ2U6IGxhc3RQYWdlLAogICAgLy8gfSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo2MAogICAgLy8ga2V5UHJlZml4OiAnYXJjMTQxMF9ocF9hJywKICAgIGJ5dGVjIDE1IC8vICJhcmMxNDEwX2hwX2EiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI5MAogICAgLy8gY29uc3QgaXRlbXNDb3VudCA9IG5ldyBhcmM0LlVpbnRONjQodGhpcy5ob2xkZXJQYXJ0aXRpb25zQWRkcmVzc2VzKHBhZ2luYXRlZEtleSkudmFsdWUubGVuZ3RoKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyOTEKICAgIC8vIGlmIChpdGVtc0NvdW50Lm5hdGl2ZSA8IDEwKSB7CiAgICBidG9pCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICA8CiAgICBieiBfYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyX2Vsc2VfYm9keUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyOTQKICAgIC8vIC4uLnRoaXMuaG9sZGVyUGFydGl0aW9uc0FkZHJlc3NlcyhwYWdpbmF0ZWRLZXkpLnZhbHVlLAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjkzLTI5NgogICAgLy8gdGhpcy5ob2xkZXJQYXJ0aXRpb25zQWRkcmVzc2VzKHBhZ2luYXRlZEtleSkudmFsdWUgPSBbCiAgICAvLyAgIC4uLnRoaXMuaG9sZGVyUGFydGl0aW9uc0FkZHJlc3NlcyhwYWdpbmF0ZWRLZXkpLnZhbHVlLAogICAgLy8gICBwYXJ0aWNpcGF0aW9uLAogICAgLy8gXQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6Mjk1CiAgICAvLyBwYXJ0aWNpcGF0aW9uLAogICAgYnl0ZWMgMjAgLy8gMHgwMDAxCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyOTMtMjk2CiAgICAvLyB0aGlzLmhvbGRlclBhcnRpdGlvbnNBZGRyZXNzZXMocGFnaW5hdGVkS2V5KS52YWx1ZSA9IFsKICAgIC8vICAgLi4udGhpcy5ob2xkZXJQYXJ0aXRpb25zQWRkcmVzc2VzKHBhZ2luYXRlZEtleSkudmFsdWUsCiAgICAvLyAgIHBhcnRpY2lwYXRpb24sCiAgICAvLyBdCiAgICBleHRyYWN0IDIgMAogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICAvCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CgpfYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICByZXRzdWIKCl9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXJfZWxzZV9ib2R5QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyOTgKICAgIC8vIGNvbnN0IG5ld0xhc3RQYWdlID0gbmV3IGFyYzQuVWludE42NChsYXN0UGFnZS5uYXRpdmUgKyAxKQogICAgZnJhbWVfZGlnIDkKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI5OQogICAgLy8gdGhpcy5ob2xkZXJQYXJ0aXRpb25zQ3VycmVudFBhZ2UoaG9sZGVyKS52YWx1ZSA9IG5ld0xhc3RQYWdlCiAgICBmcmFtZV9kaWcgMTAKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjMwMC0zMDMKICAgIC8vIGNvbnN0IG5ld1BhZ2luYXRlZEtleSA9IG5ldyBhcmMxNDEwX0hvbGRpbmdQYXJ0aXRpb25zUGFnaW5hdGVkS2V5KHsKICAgIC8vICAgaG9sZGVyOiBob2xkZXIsCiAgICAvLyAgIHBhZ2U6IG5ld0xhc3RQYWdlLAogICAgLy8gfSkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjMwNAogICAgLy8gdGhpcy5ob2xkZXJQYXJ0aXRpb25zQWRkcmVzc2VzKG5ld1BhZ2luYXRlZEtleSkudmFsdWUgPSBbcGFydGljaXBhdGlvbl0KICAgIGJ5dGVjIDIwIC8vIDB4MDAwMQogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NjAKICAgIC8vIGtleVByZWZpeDogJ2FyYzE0MTBfaHBfYScsCiAgICBieXRlYyAxNSAvLyAiYXJjMTQxMF9ocF9hIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzA0CiAgICAvLyB0aGlzLmhvbGRlclBhcnRpdGlvbnNBZGRyZXNzZXMobmV3UGFnaW5hdGVkS2V5KS52YWx1ZSA9IFtwYXJ0aWNpcGF0aW9uXQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKX2FkZF9wYXJ0aWNpcGF0aW9uX3RvX2hvbGRlcl9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjI3MQogICAgLy8gZm9yIChsZXQgY3VyUGFnZSA9IHBhZ2U7IGN1clBhZ2UubmF0aXZlIDwgbGFzdFBhZ2UubmF0aXZlOyBjdXJQYWdlID0gbmV3IGFyYzQuVWludE42NChjdXJQYWdlLm5hdGl2ZSArIDEpKSB7CiAgICBmcmFtZV9kaWcgOAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMQogICAgYiBfYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyX3doaWxlX3RvcEAzCgpfYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICBmcmFtZV9kaWcgNwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNwogICAgYiBfYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyX2Zvcl9oZWFkZXJAMTcKCl9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXJfYWZ0ZXJfZm9yQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czoyNTcKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MjgwCiAgICAvLyBpZiAodGhpcy5jb250YWluc0FkZHJlc3ModGhpcy5ob2xkZXJQYXJ0aXRpb25zQWRkcmVzc2VzKHBhZ2luYXRlZEtleSkudmFsdWUsIHBhcnRpY2lwYXRpb24pKSB7CiAgICBiIF9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjpBcmMxNDEwLmNvbnRhaW5zQWRkcmVzc0AyMgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuX3RyYW5zZmVyX3BhcnRpdGlvbihmcm9tOiBieXRlcywgZnJvbVBhcnRpdGlvbjogYnl0ZXMsIHRvOiBieXRlcywgdG9QYXJ0aXRpb246IGJ5dGVzLCBhbW91bnQ6IGJ5dGVzLCBkYXRhOiBieXRlcykgLT4gdm9pZDoKX3RyYW5zZmVyX3BhcnRpdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzE4LTMyNQogICAgLy8gcHJvdGVjdGVkIF90cmFuc2Zlcl9wYXJ0aXRpb24oCiAgICAvLyAgIGZyb206IGFyYzQuQWRkcmVzcywKICAgIC8vICAgZnJvbVBhcnRpdGlvbjogYXJjNC5BZGRyZXNzLAogICAgLy8gICB0bzogYXJjNC5BZGRyZXNzLAogICAgLy8gICB0b1BhcnRpdGlvbjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IGFyYzQuVWludE4yNTYsCiAgICAvLyAgIGRhdGE6IGFyYzQuRHluYW1pY0J5dGVzLAogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA2IDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzI2CiAgICAvLyBhc3NlcnQoYW1vdW50Lm5hdGl2ZSA+IDAsICdJbnZhbGlkIGFtb3VudCcpCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hieXRlcyAweAogICAgYj4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozMjgKICAgIC8vIGNvbnN0IGZyb21LZXkgPSBuZXcgYXJjMTQxMF9QYXJ0aXRpb25LZXkoeyBob2xkZXI6IGZyb20sIHBhcnRpdGlvbjogZnJvbVBhcnRpdGlvbiB9KQogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo1NwogICAgLy8gcHVibGljIHBhcnRpdGlvbnMgPSBCb3hNYXA8YXJjMTQxMF9QYXJ0aXRpb25LZXksIGFyYzQuVWludE4yNTY+KHsga2V5UHJlZml4OiAnYXJjMTQxMF9wJyB9KQogICAgYnl0ZWMgNiAvLyAiYXJjMTQxMF9wIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzI5CiAgICAvLyBpZiAoIXRoaXMucGFydGl0aW9ucyhmcm9tS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IF90cmFuc2Zlcl9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjMzMAogICAgLy8gdGhpcy5wYXJ0aXRpb25zKGZyb21LZXkpLnZhbHVlID0gbmV3IGFyYzQuVWludE4yNTYoMCkKICAgIGZyYW1lX2RpZyAyCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYm94X3B1dAoKX3RyYW5zZmVyX3BhcnRpdGlvbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjMzMgogICAgLy8gdGhpcy5wYXJ0aXRpb25zKGZyb21LZXkpLnZhbHVlID0gbmV3IGFyYzQuVWludE4yNTYodGhpcy5wYXJ0aXRpb25zKGZyb21LZXkpLnZhbHVlLm5hdGl2ZSAtIGFtb3VudC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0yCiAgICBiLQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDMyCiAgICBiemVybwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ8CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjMzNy0zNDMKICAgIC8vIG5ldyBhcmMxNDEwX3BhcnRpdGlvbl90cmFuc2Zlcih7CiAgICAvLyAgIGZyb206IGZyb20sCiAgICAvLyAgIHRvOiB0bywKICAgIC8vICAgcGFydGl0aW9uOiBmcm9tUGFydGl0aW9uLAogICAgLy8gICBhbW91bnQ6IGFtb3VudCwKICAgIC8vICAgZGF0YTogZGF0YSwKICAgIC8vIH0pLAogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDgyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjMzNS0zNDQKICAgIC8vIGVtaXQoCiAgICAvLyAgICdUcmFuc2ZlcicsCiAgICAvLyAgIG5ldyBhcmMxNDEwX3BhcnRpdGlvbl90cmFuc2Zlcih7CiAgICAvLyAgICAgZnJvbTogZnJvbSwKICAgIC8vICAgICB0bzogdG8sCiAgICAvLyAgICAgcGFydGl0aW9uOiBmcm9tUGFydGl0aW9uLAogICAgLy8gICAgIGFtb3VudDogYW1vdW50LAogICAgLy8gICAgIGRhdGE6IGRhdGEsCiAgICAvLyAgIH0pLAogICAgLy8gKQogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MjA2Yjc5NDAgLy8gbWV0aG9kICJUcmFuc2ZlcigoYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsdWludDI1NixieXRlW10pKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM0NwogICAgLy8gaWYgKHRvUGFydGl0aW9uICE9PSBmcm9tUGFydGl0aW9uKSB7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtNQogICAgIT0KICAgIGJ6IF90cmFuc2Zlcl9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM0OAogICAgLy8gdGhpcy5fYWRkX3BhcnRpY2lwYXRpb25fdG9faG9sZGVyKHRvLCB0b1BhcnRpdGlvbikKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIF9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXIKCl90cmFuc2Zlcl9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozNTIKICAgIC8vIGNvbnN0IHRvS2V5ID0gbmV3IGFyYzE0MTBfUGFydGl0aW9uS2V5KHsgaG9sZGVyOiB0bywgcGFydGl0aW9uOiB0b1BhcnRpdGlvbiB9KQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo1NwogICAgLy8gcHVibGljIHBhcnRpdGlvbnMgPSBCb3hNYXA8YXJjMTQxMF9QYXJ0aXRpb25LZXksIGFyYzQuVWludE4yNTY+KHsga2V5UHJlZml4OiAnYXJjMTQxMF9wJyB9KQogICAgYnl0ZWMgNiAvLyAiYXJjMTQxMF9wIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozNTMKICAgIC8vIGlmICghdGhpcy5wYXJ0aXRpb25zKHRvS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IF90cmFuc2Zlcl9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM1NAogICAgLy8gdGhpcy5wYXJ0aXRpb25zKHRvS2V5KS52YWx1ZSA9IG5ldyBhcmM0LlVpbnROMjU2KDApCiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGJveF9wdXQKCl90cmFuc2Zlcl9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozNTYKICAgIC8vIHRoaXMucGFydGl0aW9ucyh0b0tleSkudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1Nih0aGlzLnBhcnRpdGlvbnModG9LZXkpLnZhbHVlLm5hdGl2ZSArIGFtb3VudC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0yCiAgICBiKwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZnJhbWVfZGlnIDAKICAgIGJ8CiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjpBcmMxNDEwLmFyYzE0MTBfYXV0aG9yaXplX29wZXJhdG9yX2J5X3BvcnRpb24oaG9sZGVyOiBieXRlcywgb3BlcmF0b3I6IGJ5dGVzLCBwYXJ0aXRpb246IGJ5dGVzLCBhbW91bnQ6IGJ5dGVzKSAtPiB2b2lkOgphcmMxNDEwX2F1dGhvcml6ZV9vcGVyYXRvcl9ieV9wb3J0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozNTktMzY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIGFyYzE0MTBfYXV0aG9yaXplX29wZXJhdG9yX2J5X3BvcnRpb24oCiAgICAvLyAgIGhvbGRlcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBvcGVyYXRvcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBwYXJ0aXRpb246IGFyYzQuQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBhcmM0LlVpbnROMjU2LAogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA0IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzY2CiAgICAvLyBhc3NlcnQobmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSA9PT0gaG9sZGVyLCAnT25seSBob2xkZXIgY2FuIGF1dGhvcml6ZSBwb3J0aW9uJykKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtNAogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGhvbGRlciBjYW4gYXV0aG9yaXplIHBvcnRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzY3CiAgICAvLyBjb25zdCBrZXkgPSBuZXcgYXJjMTQxMF9PcGVyYXRvclBvcnRpb25LZXkoeyBob2xkZXIsIG9wZXJhdG9yLCBwYXJ0aXRpb24gfSkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjYzCiAgICAvLyBwdWJsaWMgb3BlcmF0b3JQb3J0aW9uQWxsb3dhbmNlcyA9IEJveE1hcDxhcmMxNDEwX09wZXJhdG9yUG9ydGlvbktleSwgYXJjNC5VaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdhcmMxNDEwX29wYScgfSkKICAgIGJ5dGVjIDEyIC8vICJhcmMxNDEwX29wYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozNjgKICAgIC8vIHRoaXMub3BlcmF0b3JQb3J0aW9uQWxsb3dhbmNlcyhrZXkpLnZhbHVlID0gYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuYXJjMTQxMF9pc19vcGVyYXRvcl9ieV9wb3J0aW9uKGhvbGRlcjogYnl0ZXMsIG9wZXJhdG9yOiBieXRlcywgcGFydGl0aW9uOiBieXRlcykgLT4gYnl0ZXM6CmFyYzE0MTBfaXNfb3BlcmF0b3JfYnlfcG9ydGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzcxLTM3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIHB1YmxpYyBhcmMxNDEwX2lzX29wZXJhdG9yX2J5X3BvcnRpb24oCiAgICAvLyAgIGhvbGRlcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBvcGVyYXRvcjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBwYXJ0aXRpb246IGFyYzQuQWRkcmVzcywKICAgIC8vICk6IGFyYzQuQm9vbCB7CiAgICBwcm90byAzIDEKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM3NwogICAgLy8gaWYgKG9wZXJhdG9yID09PSBob2xkZXIpIHJldHVybiBuZXcgYXJjNC5Cb29sKHRydWUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGJ6IGFyYzE0MTBfaXNfb3BlcmF0b3JfYnlfcG9ydGlvbl9hZnRlcl9pZl9lbHNlQDIKICAgIGJ5dGVjIDggLy8gMHg4MAogICAgc3dhcAogICAgcmV0c3ViCgphcmMxNDEwX2lzX29wZXJhdG9yX2J5X3BvcnRpb25fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozNzgKICAgIC8vIGNvbnN0IGtleSA9IG5ldyBhcmMxNDEwX09wZXJhdG9yUG9ydGlvbktleSh7IGhvbGRlciwgb3BlcmF0b3IsIHBhcnRpdGlvbiB9KQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NjMKICAgIC8vIHB1YmxpYyBvcGVyYXRvclBvcnRpb25BbGxvd2FuY2VzID0gQm94TWFwPGFyYzE0MTBfT3BlcmF0b3JQb3J0aW9uS2V5LCBhcmM0LlVpbnROMjU2Pih7IGtleVByZWZpeDogJ2FyYzE0MTBfb3BhJyB9KQogICAgYnl0ZWMgMTIgLy8gImFyYzE0MTBfb3BhIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozNzkKICAgIC8vIGlmICghdGhpcy5vcGVyYXRvclBvcnRpb25BbGxvd2FuY2VzKGtleSkuZXhpc3RzKSByZXR1cm4gbmV3IGFyYzQuQm9vbChmYWxzZSkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGFyYzE0MTBfaXNfb3BlcmF0b3JfYnlfcG9ydGlvbl9hZnRlcl9pZl9lbHNlQDQKICAgIGJ5dGVjIDEwIC8vIDB4MDAKICAgIHN3YXAKICAgIHJldHN1YgoKYXJjMTQxMF9pc19vcGVyYXRvcl9ieV9wb3J0aW9uX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzgwCiAgICAvLyByZXR1cm4gbmV3IGFyYzQuQm9vbCh0aGlzLm9wZXJhdG9yUG9ydGlvbkFsbG93YW5jZXMoa2V5KS52YWx1ZS5uYXRpdmUgPiAwKQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI+CiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuYXJjMTQxMF9pc3N1ZV9ieV9wYXJ0aXRpb24odG86IGJ5dGVzLCBwYXJ0aXRpb246IGJ5dGVzLCBhbW91bnQ6IGJ5dGVzLCBkYXRhOiBieXRlcykgLT4gdm9pZDoKYXJjMTQxMF9pc3N1ZV9ieV9wYXJ0aXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM4My0zODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMTQxMF9pc3N1ZV9ieV9wYXJ0aXRpb24oCiAgICAvLyAgIHRvOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgIHBhcnRpdGlvbjogYXJjNC5BZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IGFyYzQuVWludE4yNTYsCiAgICAvLyAgIGRhdGE6IGFyYzQuRHluYW1pY0J5dGVzLAogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA0IDAKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzkwCiAgICAvLyBhc3NlcnQodGhpcy5hcmM4OF9pc19vd25lcihuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpKS5uYXRpdmUgPT09IHRydWUsICdvbmx5X293bmVyJykKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgYXJjODhfaXNfb3duZXIKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHlfb3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6MzkxCiAgICAvLyBhc3NlcnQoYW1vdW50Lm5hdGl2ZSA+IDAsICdJbnZhbGlkIGFtb3VudCcpCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hieXRlcyAweAogICAgYj4KICAgIGFzc2VydCAvLyBJbnZhbGlkIGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czozOTMKICAgIC8vIGNvbnN0IHRvS2V5ID0gbmV3IGFyYzE0MTBfUGFydGl0aW9uS2V5KHsgaG9sZGVyOiB0bywgcGFydGl0aW9uIH0pCiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NTcKICAgIC8vIHB1YmxpYyBwYXJ0aXRpb25zID0gQm94TWFwPGFyYzE0MTBfUGFydGl0aW9uS2V5LCBhcmM0LlVpbnROMjU2Pih7IGtleVByZWZpeDogJ2FyYzE0MTBfcCcgfSkKICAgIGJ5dGVjIDYgLy8gImFyYzE0MTBfcCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM5NAogICAgLy8gaWYgKCF0aGlzLnBhcnRpdGlvbnModG9LZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogYXJjMTQxMF9pc3N1ZV9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjM5NQogICAgLy8gdGhpcy5wYXJ0aXRpb25zKHRvS2V5KS52YWx1ZSA9IG5ldyBhcmM0LlVpbnROMjU2KDApCiAgICBmcmFtZV9kaWcgMwogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6Mzk2CiAgICAvLyB0aGlzLl9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXIodG8sIHBhcnRpdGlvbikKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIF9hZGRfcGFydGljaXBhdGlvbl90b19ob2xkZXIKCmFyYzE0MTBfaXNzdWVfYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6Mzk4CiAgICAvLyB0aGlzLnBhcnRpdGlvbnModG9LZXkpLnZhbHVlID0gbmV3IGFyYzQuVWludE4yNTYodGhpcy5wYXJ0aXRpb25zKHRvS2V5KS52YWx1ZS5uYXRpdmUgKyBhbW91bnQubmF0aXZlKQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgYisKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyAzMgogICAgYnplcm8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBifAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjUzCiAgICAvLyBwdWJsaWMgYmFsYW5jZXMgPSBCb3hNYXA8QWRkcmVzcywgVWludE4yNTY+KHsga2V5UHJlZml4OiAnYicgfSkKICAgIGJ5dGVjIDUgLy8gImIiCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDAwCiAgICAvLyBpZiAoIXRoaXMuYmFsYW5jZXModG8pLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogYXJjMTQxMF9pc3N1ZV9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQwMQogICAgLy8gdGhpcy5iYWxhbmNlcyh0bykudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1NigwKQogICAgZnJhbWVfZGlnIDEKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBib3hfcHV0CgphcmMxNDEwX2lzc3VlX2J5X3BhcnRpdGlvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQwMwogICAgLy8gdGhpcy5iYWxhbmNlcyh0bykudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1Nih0aGlzLmJhbGFuY2VzKHRvKS52YWx1ZS5uYXRpdmUgKyBhbW91bnQubmF0aXZlKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgYisKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ8CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTEKICAgIC8vIHB1YmxpYyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPFVpbnROMjU2Pih7IGtleTogJ3QnIH0pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAidCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQwNAogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSA9IG5ldyBhcmM0LlVpbnROMjU2KHRoaXMudG90YWxTdXBwbHkudmFsdWUubmF0aXZlICsgYW1vdW50Lm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgYisKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGJ8CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTEKICAgIC8vIHB1YmxpYyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPFVpbnROMjU2Pih7IGtleTogJ3QnIH0pCiAgICBieXRlY18zIC8vICJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MDQKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1Nih0aGlzLnRvdGFsU3VwcGx5LnZhbHVlLm5hdGl2ZSArIGFtb3VudC5uYXRpdmUpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MDUKICAgIC8vIGVtaXQoJ0lzc3VlJywgbmV3IGFyYzE0MTBfcGFydGl0aW9uX2lzc3VlKHsgdG8sIHBhcnRpdGlvbiwgYW1vdW50LCBkYXRhIH0pKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBieXRlYyAyMSAvLyAweDAwNjIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGZhNDQzYjFiIC8vIG1ldGhvZCAiSXNzdWUoKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2LGJ5dGVbXSkpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6OkFyYzE0MTAuYXJjMTQxMF9yZWRlZW1fYnlfcGFydGl0aW9uKHBhcnRpdGlvbjogYnl0ZXMsIGFtb3VudDogYnl0ZXMsIGRhdGE6IGJ5dGVzKSAtPiB2b2lkOgphcmMxNDEwX3JlZGVlbV9ieV9wYXJ0aXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQwOC00MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMTQxMF9yZWRlZW1fYnlfcGFydGl0aW9uKHBhcnRpdGlvbjogYXJjNC5BZGRyZXNzLCBhbW91bnQ6IGFyYzQuVWludE4yNTYsIGRhdGE6IGFyYzQuRHluYW1pY0J5dGVzKTogdm9pZCB7CiAgICBwcm90byAzIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDEwCiAgICAvLyBjb25zdCBmcm9tID0gbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MTEKICAgIC8vIGFzc2VydChhbW91bnQubmF0aXZlID4gMCwgJ0ludmFsaWQgYW1vdW50JykKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGJ5dGVzIDB4CiAgICBiPgogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQxMgogICAgLy8gY29uc3QgZnJvbUtleSA9IG5ldyBhcmMxNDEwX1BhcnRpdGlvbktleSh7IGhvbGRlcjogZnJvbSwgcGFydGl0aW9uIH0pCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NTcKICAgIC8vIHB1YmxpYyBwYXJ0aXRpb25zID0gQm94TWFwPGFyYzE0MTBfUGFydGl0aW9uS2V5LCBhcmM0LlVpbnROMjU2Pih7IGtleVByZWZpeDogJ2FyYzE0MTBfcCcgfSkKICAgIGJ5dGVjIDYgLy8gImFyYzE0MTBfcCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MTMKICAgIC8vIGFzc2VydCh0aGlzLnBhcnRpdGlvbnMoZnJvbUtleSkuZXhpc3RzLCAnUGFydGl0aW9uIGJhbGFuY2UgbWlzc2luZycpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFBhcnRpdGlvbiBiYWxhbmNlIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDE0CiAgICAvLyBhc3NlcnQodGhpcy5wYXJ0aXRpb25zKGZyb21LZXkpLnZhbHVlLm5hdGl2ZSA+PSBhbW91bnQubmF0aXZlLCAnSW5zdWZmaWNpZW50IHBhcnRpdGlvbiBiYWxhbmNlJykKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgYj49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHBhcnRpdGlvbiBiYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQxNQogICAgLy8gdGhpcy5wYXJ0aXRpb25zKGZyb21LZXkpLnZhbHVlID0gbmV3IGFyYzQuVWludE4yNTYodGhpcy5wYXJ0aXRpb25zKGZyb21LZXkpLnZhbHVlLm5hdGl2ZSAtIGFtb3VudC5uYXRpdmUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTIKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gMzIKICAgIGJ6ZXJvCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGJ8CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTMKICAgIC8vIHB1YmxpYyBiYWxhbmNlcyA9IEJveE1hcDxBZGRyZXNzLCBVaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdiJyB9KQogICAgYnl0ZWMgNSAvLyAiYiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQxNwogICAgLy8gYXNzZXJ0KHRoaXMuYmFsYW5jZXMoZnJvbSkuZXhpc3RzICYmIHRoaXMuYmFsYW5jZXMoZnJvbSkudmFsdWUubmF0aXZlID49IGFtb3VudC5uYXRpdmUsICdJbnN1ZmZpY2llbnQgYmFsYW5jZScpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGFyYzE0MTBfcmVkZWVtX2J5X3BhcnRpdGlvbl9ib29sX2ZhbHNlQDMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0yCiAgICBiPj0KICAgIGJ6IGFyYzE0MTBfcmVkZWVtX2J5X3BhcnRpdGlvbl9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgphcmMxNDEwX3JlZGVlbV9ieV9wYXJ0aXRpb25fYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MTcKICAgIC8vIGFzc2VydCh0aGlzLmJhbGFuY2VzKGZyb20pLmV4aXN0cyAmJiB0aGlzLmJhbGFuY2VzKGZyb20pLnZhbHVlLm5hdGl2ZSA+PSBhbW91bnQubmF0aXZlLCAnSW5zdWZmaWNpZW50IGJhbGFuY2UnKQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBiYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQxOAogICAgLy8gdGhpcy5iYWxhbmNlcyhmcm9tKS52YWx1ZSA9IG5ldyBhcmM0LlVpbnROMjU2KHRoaXMuYmFsYW5jZXMoZnJvbSkudmFsdWUubmF0aXZlIC0gYW1vdW50Lm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTIKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBifAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjUxCiAgICAvLyBwdWJsaWMgdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTxVaW50TjI1Nj4oeyBrZXk6ICd0JyB9KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzMgLy8gInQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MTkKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1Nih0aGlzLnRvdGFsU3VwcGx5LnZhbHVlLm5hdGl2ZSAtIGFtb3VudC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBifAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjUxCiAgICAvLyBwdWJsaWMgdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTxVaW50TjI1Nj4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMyAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDE5CiAgICAvLyB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlID0gbmV3IGFyYzQuVWludE4yNTYodGhpcy50b3RhbFN1cHBseS52YWx1ZS5uYXRpdmUgLSBhbW91bnQubmF0aXZlKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDIwCiAgICAvLyBlbWl0KCdSZWRlZW0nLCBuZXcgYXJjMTQxMF9wYXJ0aXRpb25fcmVkZWVtKHsgZnJvbSwgcGFydGl0aW9uLCBhbW91bnQsIGRhdGEgfSkpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjIDIxIC8vIDB4MDA2MgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgNCAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMjUgLy8gbWV0aG9kICJSZWRlZW0oKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2LGJ5dGVbXSkpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKYXJjMTQxMF9yZWRlZW1fYnlfcGFydGl0aW9uX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMSAvLyAwCiAgICBiIGFyYzE0MTBfcmVkZWVtX2J5X3BhcnRpdGlvbl9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjpBcmMxNDEwLmFyYzE0MTBfb3BlcmF0b3JfcmVkZWVtX2J5X3BhcnRpdGlvbihmcm9tOiBieXRlcywgcGFydGl0aW9uOiBieXRlcywgYW1vdW50OiBieXRlcywgZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFyYzE0MTBfb3BlcmF0b3JfcmVkZWVtX2J5X3BhcnRpdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDIzLTQyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyBhcmMxNDEwX29wZXJhdG9yX3JlZGVlbV9ieV9wYXJ0aXRpb24oCiAgICAvLyAgIGZyb206IGFyYzQuQWRkcmVzcywKICAgIC8vICAgcGFydGl0aW9uOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogYXJjNC5VaW50TjI1NiwKICAgIC8vICAgZGF0YTogYXJjNC5EeW5hbWljQnl0ZXMsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDQgMAogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MzAKICAgIC8vIGNvbnN0IHNlbmRlciA9IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDMyCiAgICAvLyBsZXQgYXV0aG9yaXplZCA9IHRoaXMuYXJjMTQxMF9pc19vcGVyYXRvcihmcm9tLCBzZW5kZXIsIHBhcnRpdGlvbikubmF0aXZlID09PSB0cnVlCiAgICBmcmFtZV9kaWcgLTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDMwCiAgICAvLyBjb25zdCBzZW5kZXIgPSBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQzMgogICAgLy8gbGV0IGF1dGhvcml6ZWQgPSB0aGlzLmFyYzE0MTBfaXNfb3BlcmF0b3IoZnJvbSwgc2VuZGVyLCBwYXJ0aXRpb24pLm5hdGl2ZSA9PT0gdHJ1ZQogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIGFyYzE0MTBfaXNfb3BlcmF0b3IKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQzMwogICAgLy8gaWYgKCFhdXRob3JpemVkKSB7CiAgICBibnogYXJjMTQxMF9vcGVyYXRvcl9yZWRlZW1fYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MzQKICAgIC8vIGNvbnN0IHBLZXkgPSBuZXcgYXJjMTQxMF9PcGVyYXRvclBvcnRpb25LZXkoeyBob2xkZXI6IGZyb20sIG9wZXJhdG9yOiBzZW5kZXIsIHBhcnRpdGlvbiB9KQogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo2MwogICAgLy8gcHVibGljIG9wZXJhdG9yUG9ydGlvbkFsbG93YW5jZXMgPSBCb3hNYXA8YXJjMTQxMF9PcGVyYXRvclBvcnRpb25LZXksIGFyYzQuVWludE4yNTY+KHsga2V5UHJlZml4OiAnYXJjMTQxMF9vcGEnIH0pCiAgICBieXRlYyAxMiAvLyAiYXJjMTQxMF9vcGEiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQzNQogICAgLy8gaWYgKHRoaXMub3BlcmF0b3JQb3J0aW9uQWxsb3dhbmNlcyhwS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYXJjMTQxMF9vcGVyYXRvcl9yZWRlZW1fYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0MzYKICAgIC8vIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMub3BlcmF0b3JQb3J0aW9uQWxsb3dhbmNlcyhwS2V5KS52YWx1ZQogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDM3CiAgICAvLyBhc3NlcnQocmVtYWluaW5nLm5hdGl2ZSA+PSBhbW91bnQubmF0aXZlLCAnUG9ydGlvbiBhbGxvd2FuY2UgZXhjZWVkZWQnKQogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGI+PQogICAgYXNzZXJ0IC8vIFBvcnRpb24gYWxsb3dhbmNlIGV4Y2VlZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQzOAogICAgLy8gYXV0aG9yaXplZCA9IHRydWUKICAgIGludGNfMCAvLyAxCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDM5CiAgICAvLyB0aGlzLm9wZXJhdG9yUG9ydGlvbkFsbG93YW5jZXMocEtleSkudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1NihyZW1haW5pbmcubmF0aXZlIC0gYW1vdW50Lm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgYi0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICBib3hfcHV0CgphcmMxNDEwX29wZXJhdG9yX3JlZGVlbV9ieV9wYXJ0aXRpb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2J1cnkgNgoKYXJjMTQxMF9vcGVyYXRvcl9yZWRlZW1fYnlfcGFydGl0aW9uX2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQ0MgogICAgLy8gYXNzZXJ0KGF1dGhvcml6ZWQsICdOb3QgYXV0aG9yaXplZCBvcGVyYXRvcicpCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQgb3BlcmF0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDQ0CiAgICAvLyBjb25zdCBmcm9tS2V5ID0gbmV3IGFyYzE0MTBfUGFydGl0aW9uS2V5KHsgaG9sZGVyOiBmcm9tLCBwYXJ0aXRpb24gfSkKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjU3CiAgICAvLyBwdWJsaWMgcGFydGl0aW9ucyA9IEJveE1hcDxhcmMxNDEwX1BhcnRpdGlvbktleSwgYXJjNC5VaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdhcmMxNDEwX3AnIH0pCiAgICBieXRlYyA2IC8vICJhcmMxNDEwX3AiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDQ1CiAgICAvLyBhc3NlcnQodGhpcy5wYXJ0aXRpb25zKGZyb21LZXkpLmV4aXN0cywgJ1BhcnRpdGlvbiBiYWxhbmNlIG1pc3NpbmcnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBQYXJ0aXRpb24gYmFsYW5jZSBtaXNzaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQ0NgogICAgLy8gYXNzZXJ0KHRoaXMucGFydGl0aW9ucyhmcm9tS2V5KS52YWx1ZS5uYXRpdmUgPj0gYW1vdW50Lm5hdGl2ZSwgJ0luc3VmZmljaWVudCBwYXJ0aXRpb24gYmFsYW5jZScpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTIKICAgIGI+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBwYXJ0aXRpb24gYmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0NDcKICAgIC8vIHRoaXMucGFydGl0aW9ucyhmcm9tS2V5KS52YWx1ZSA9IG5ldyBhcmM0LlVpbnROMjU2KHRoaXMucGFydGl0aW9ucyhmcm9tS2V5KS52YWx1ZS5uYXRpdmUgLSBhbW91bnQubmF0aXZlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0yCiAgICBiLQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDMyCiAgICBiemVybwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJ8CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTMKICAgIC8vIHB1YmxpYyBiYWxhbmNlcyA9IEJveE1hcDxBZGRyZXNzLCBVaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdiJyB9KQogICAgYnl0ZWMgNSAvLyAiYiIKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0NDgKICAgIC8vIGFzc2VydCh0aGlzLmJhbGFuY2VzKGZyb20pLmV4aXN0cyAmJiB0aGlzLmJhbGFuY2VzKGZyb20pLnZhbHVlLm5hdGl2ZSA+PSBhbW91bnQubmF0aXZlLCAnSW5zdWZmaWNpZW50IGJhbGFuY2UnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBhcmMxNDEwX29wZXJhdG9yX3JlZGVlbV9ieV9wYXJ0aXRpb25fYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgYj49CiAgICBieiBhcmMxNDEwX29wZXJhdG9yX3JlZGVlbV9ieV9wYXJ0aXRpb25fYm9vbF9mYWxzZUA3CiAgICBpbnRjXzAgLy8gMQoKYXJjMTQxMF9vcGVyYXRvcl9yZWRlZW1fYnlfcGFydGl0aW9uX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDQ4CiAgICAvLyBhc3NlcnQodGhpcy5iYWxhbmNlcyhmcm9tKS5leGlzdHMgJiYgdGhpcy5iYWxhbmNlcyhmcm9tKS52YWx1ZS5uYXRpdmUgPj0gYW1vdW50Lm5hdGl2ZSwgJ0luc3VmZmljaWVudCBiYWxhbmNlJykKICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgYmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzE0MTAuYWxnby50czo0NDkKICAgIC8vIHRoaXMuYmFsYW5jZXMoZnJvbSkudmFsdWUgPSBuZXcgYXJjNC5VaW50TjI1Nih0aGlzLmJhbGFuY2VzKGZyb20pLnZhbHVlLm5hdGl2ZSAtIGFtb3VudC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZnJhbWVfZGlnIC0yCiAgICBiLQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgYnwKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1MQogICAgLy8gcHVibGljIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8VWludE4yNTY+KHsga2V5OiAndCcgfSkKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJ0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMxNDEwLmFsZ28udHM6NDUwCiAgICAvLyB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlID0gbmV3IGFyYzQuVWludE4yNTYodGhpcy50b3RhbFN1cHBseS52YWx1ZS5uYXRpdmUgLSBhbW91bnQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0yCiAgICBiLQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgYnwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1MQogICAgLy8gcHVibGljIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8VWludE4yNTY+KHsga2V5OiAndCcgfSkKICAgIGJ5dGVjXzMgLy8gInQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQ1MAogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSA9IG5ldyBhcmM0LlVpbnROMjU2KHRoaXMudG90YWxTdXBwbHkudmFsdWUubmF0aXZlIC0gYW1vdW50Lm5hdGl2ZSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMTQxMC5hbGdvLnRzOjQ1MQogICAgLy8gZW1pdCgnUmVkZWVtJywgbmV3IGFyYzE0MTBfcGFydGl0aW9uX3JlZGVlbSh7IGZyb20sIHBhcnRpdGlvbiwgYW1vdW50LCBkYXRhIH0pKQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBieXRlYyAyMSAvLyAweDAwNjIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJ5dGVjIDQgLy8gMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiUmVkZWVtKChhZGRyZXNzLGFkZHJlc3MsdWludDI1NixieXRlW10pKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCmFyYzE0MTBfb3BlcmF0b3JfcmVkZWVtX2J5X3BhcnRpdGlvbl9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzEgLy8gMAogICAgYiBhcmMxNDEwX29wZXJhdG9yX3JlZGVlbV9ieV9wYXJ0aXRpb25fYm9vbF9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuYm9vdHN0cmFwKG5hbWU6IGJ5dGVzLCBzeW1ib2w6IGJ5dGVzLCBkZWNpbWFsczogYnl0ZXMsIHRvdGFsU3VwcGx5OiBieXRlcykgLT4gYnl0ZXM6CmJvb3RzdHJhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyBib290c3RyYXAobmFtZTogRHluYW1pY0J5dGVzLCBzeW1ib2w6IER5bmFtaWNCeXRlcywgZGVjaW1hbHM6IFVpbnROOCwgdG90YWxTdXBwbHk6IFVpbnROMjU2KTogQm9vbCB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcywgJ09ubHkgZGVwbG95ZXIgb2YgdGhpcyBzbWFydCBjb250cmFjdCBjYW4gY2FsbCBib290c3RyYXAgbWV0aG9kJykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGRlcGxveWVyIG9mIHRoaXMgc21hcnQgY29udHJhY3QgY2FuIGNhbGwgYm9vdHN0cmFwIG1ldGhvZAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjU5CiAgICAvLyBhc3NlcnQobmFtZS5uYXRpdmUubGVuZ3RoID4gMCwgJ05hbWUgb2YgdGhlIGFzc2V0IG11c3QgYmUgbG9uZ2VyIG9yIGVxdWFsIHRvIDEgY2hhcmFjdGVyJykKICAgIGZyYW1lX2RpZyAtNAogICAgZXh0cmFjdCAyIDAKICAgIGxlbgogICAgZHVwCiAgICBhc3NlcnQgLy8gTmFtZSBvZiB0aGUgYXNzZXQgbXVzdCBiZSBsb25nZXIgb3IgZXF1YWwgdG8gMSBjaGFyYWN0ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo2MAogICAgLy8gYXNzZXJ0KG5hbWUubmF0aXZlLmxlbmd0aCA8PSAzMiwgJ05hbWUgb2YgdGhlIGFzc2V0IG11c3QgYmUgc2hvcnRlciBvciBlcXVhbCB0byAzMiBjaGFyYWN0ZXJzJykKICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBOYW1lIG9mIHRoZSBhc3NldCBtdXN0IGJlIHNob3J0ZXIgb3IgZXF1YWwgdG8gMzIgY2hhcmFjdGVycwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjYxCiAgICAvLyBhc3NlcnQoc3ltYm9sLm5hdGl2ZS5sZW5ndGggPiAwLCAnU3ltYm9sIG9mIHRoZSBhc3NldCBtdXN0IGJlIGxvbmdlciBvciBlcXVhbCB0byAxIGNoYXJhY3RlcicpCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMiAwCiAgICBsZW4KICAgIGR1cAogICAgYXNzZXJ0IC8vIFN5bWJvbCBvZiB0aGUgYXNzZXQgbXVzdCBiZSBsb25nZXIgb3IgZXF1YWwgdG8gMSBjaGFyYWN0ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo2MgogICAgLy8gYXNzZXJ0KHN5bWJvbC5uYXRpdmUubGVuZ3RoIDw9IDgsICdTeW1ib2wgb2YgdGhlIGFzc2V0IG11c3QgYmUgc2hvcnRlciBvciBlcXVhbCB0byA4IGNoYXJhY3RlcnMnKQogICAgcHVzaGludCA4IC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gU3ltYm9sIG9mIHRoZSBhc3NldCBtdXN0IGJlIHNob3J0ZXIgb3IgZXF1YWwgdG8gOCBjaGFyYWN0ZXJzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTEKICAgIC8vIHB1YmxpYyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPFVpbnROMjU2Pih7IGtleTogJ3QnIH0pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMyAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo2MwogICAgLy8gYXNzZXJ0KCF0aGlzLnRvdGFsU3VwcGx5Lmhhc1ZhbHVlLCAnVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgb25seSBvbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MzkKICAgIC8vIHB1YmxpYyBuYW1lID0gR2xvYmFsU3RhdGU8RHluYW1pY0J5dGVzPih7IGtleTogJ24nIH0pCiAgICBwdXNoYnl0ZXMgIm4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NjUKICAgIC8vIHRoaXMubmFtZS52YWx1ZSA9IG5hbWUKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo0MwogICAgLy8gcHVibGljIHN5bWJvbCA9IEdsb2JhbFN0YXRlPER5bmFtaWNCeXRlcz4oeyBrZXk6ICdzJyB9KQogICAgcHVzaGJ5dGVzICJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjY2CiAgICAvLyB0aGlzLnN5bWJvbC52YWx1ZSA9IHN5bWJvbAogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjUxCiAgICAvLyBwdWJsaWMgdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTxVaW50TjI1Nj4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMyAvLyAidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo2NwogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSA9IHRvdGFsU3VwcGx5CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NDcKICAgIC8vIHB1YmxpYyBkZWNpbWFscyA9IEdsb2JhbFN0YXRlPFVpbnROOD4oeyBrZXk6ICdkJyB9KQogICAgcHVzaGJ5dGVzICJkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjY4CiAgICAvLyB0aGlzLmRlY2ltYWxzLnZhbHVlID0gZGVjaW1hbHMKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo2OQogICAgLy8gY29uc3Qgc2VuZGVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1MwogICAgLy8gcHVibGljIGJhbGFuY2VzID0gQm94TWFwPEFkZHJlc3MsIFVpbnROMjU2Pih7IGtleVByZWZpeDogJ2InIH0pCiAgICBieXRlYyA1IC8vICJiIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjcxCiAgICAvLyB0aGlzLmJhbGFuY2VzKHNlbmRlcikudmFsdWUgPSB0b3RhbFN1cHBseQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NzMKICAgIC8vIGVtaXQobmV3IGFyYzIwMF9UcmFuc2Zlcih7IGZyb206IG5ldyBBZGRyZXNzKEdsb2JhbC56ZXJvQWRkcmVzcyksIHRvOiBzZW5kZXIsIHZhbHVlOiB0b3RhbFN1cHBseSB9KSkKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYnl0ZWMgMjYgLy8gbWV0aG9kICJhcmMyMDBfVHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQyNTYpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo3NAogICAgLy8gcmV0dXJuIG5ldyBCb29sKHRydWUpCiAgICBieXRlYyA4IC8vIDB4ODAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo6QXJjMjAwLmFyYzIwMF9uYW1lKCkgLT4gYnl0ZXM6CmFyYzIwMF9uYW1lOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjM5CiAgICAvLyBwdWJsaWMgbmFtZSA9IEdsb2JhbFN0YXRlPER5bmFtaWNCeXRlcz4oeyBrZXk6ICduJyB9KQogICAgaW50Y18xIC8vIDAKICAgIHB1c2hieXRlcyAibiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6ODQKICAgIC8vIHJldHVybiBuZXcgU3RhdGljQnl0ZXM8MzI+KHRoaXMubmFtZS52YWx1ZS5uYXRpdmUpCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHNpemUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo6QXJjMjAwLmFyYzIwMF9zeW1ib2woKSAtPiBieXRlczoKYXJjMjAwX3N5bWJvbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo0MwogICAgLy8gcHVibGljIHN5bWJvbCA9IEdsb2JhbFN0YXRlPER5bmFtaWNCeXRlcz4oeyBrZXk6ICdzJyB9KQogICAgaW50Y18xIC8vIDAKICAgIHB1c2hieXRlcyAicyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6OTQKICAgIC8vIHJldHVybiBuZXcgU3RhdGljQnl0ZXM8OD4odGhpcy5zeW1ib2wudmFsdWUubmF0aXZlKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHNpemUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo6QXJjMjAwLmFyYzIwMF9kZWNpbWFscygpIC0+IGJ5dGVzOgphcmMyMDBfZGVjaW1hbHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NDcKICAgIC8vIHB1YmxpYyBkZWNpbWFscyA9IEdsb2JhbFN0YXRlPFVpbnROOD4oeyBrZXk6ICdkJyB9KQogICAgaW50Y18xIC8vIDAKICAgIHB1c2hieXRlcyAiZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTA0CiAgICAvLyByZXR1cm4gdGhpcy5kZWNpbWFscy52YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuYXJjMjAwX3RvdGFsU3VwcGx5KCkgLT4gYnl0ZXM6CmFyYzIwMF90b3RhbFN1cHBseToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1MQogICAgLy8gcHVibGljIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8VWludE4yNTY+KHsga2V5OiAndCcgfSkKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18zIC8vICJ0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxMTQKICAgIC8vIHJldHVybiB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6OkFyYzIwMC5hcmMyMDBfYmFsYW5jZU9mKG93bmVyOiBieXRlcykgLT4gYnl0ZXM6CmFyYzIwMF9iYWxhbmNlT2Y6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTIzLTEyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIHB1YmxpYyBhcmMyMDBfYmFsYW5jZU9mKG93bmVyOiBBZGRyZXNzKTogYXJjNC5VaW50TjI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxMjUKICAgIC8vIHJldHVybiB0aGlzLl9iYWxhbmNlT2Yob3duZXIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2JhbGFuY2VPZgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuYXJjMjAwX3RyYW5zZmVyRnJvbShmcm9tOiBieXRlcywgdG86IGJ5dGVzLCB2YWx1ZTogYnl0ZXMpIC0+IGJ5dGVzOgphcmMyMDBfdHJhbnNmZXJGcm9tOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjE0OC0xNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgYXJjMjAwX3RyYW5zZmVyRnJvbShmcm9tOiBBZGRyZXNzLCB0bzogQWRkcmVzcywgdmFsdWU6IGFyYzQuVWludE4yNTYpOiBhcmM0LkJvb2wgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTUwCiAgICAvLyBjb25zdCBzcGVuZGVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxNTEKICAgIC8vIGNvbnN0IHNwZW5kZXJfYWxsb3dhbmNlID0gdGhpcy5fYWxsb3dhbmNlKGZyb20sIHNwZW5kZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9hbGxvd2FuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxNTIKICAgIC8vIGFzc2VydChzcGVuZGVyX2FsbG93YW5jZS5uYXRpdmUgPj0gdmFsdWUubmF0aXZlLCAnaW5zdWZmaWNpZW50IGFwcHJvdmFsJykKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGFzc2VydCAvLyBpbnN1ZmZpY2llbnQgYXBwcm92YWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxNTMKICAgIC8vIGNvbnN0IG5ld19zcGVuZGVyX2FsbG93YW5jZSA9IG5ldyBVaW50TjI1NihzcGVuZGVyX2FsbG93YW5jZS5uYXRpdmUgLSB2YWx1ZS5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjE1NAogICAgLy8gdGhpcy5fYXBwcm92ZShmcm9tLCBzcGVuZGVyLCBuZXdfc3BlbmRlcl9hbGxvd2FuY2UpCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2FwcHJvdmUKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjE1NQogICAgLy8gcmV0dXJuIHRoaXMuX3RyYW5zZmVyKGZyb20sIHRvLCB2YWx1ZSkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX3RyYW5zZmVyCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6OkFyYzIwMC5hcmMyMDBfYXBwcm92ZShzcGVuZGVyOiBieXRlcywgdmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKYXJjMjAwX2FwcHJvdmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTY1LTE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyBhcmMyMDBfYXBwcm92ZShzcGVuZGVyOiBBZGRyZXNzLCB2YWx1ZTogYXJjNC5VaW50TjI1Nik6IEJvb2wgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTY3CiAgICAvLyBjb25zdCBvd25lciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTY4CiAgICAvLyByZXR1cm4gdGhpcy5fYXBwcm92ZShvd25lciwgc3BlbmRlciwgdmFsdWUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfYXBwcm92ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuYXJjMjAwX2FsbG93YW5jZShvd25lcjogYnl0ZXMsIHNwZW5kZXI6IGJ5dGVzKSAtPiBieXRlczoKYXJjMjAwX2FsbG93YW5jZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxNzctMTc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gcHVibGljIGFyYzIwMF9hbGxvd2FuY2Uob3duZXI6IEFkZHJlc3MsIHNwZW5kZXI6IEFkZHJlc3MpOiBhcmM0LlVpbnROMjU2IHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjE3OQogICAgLy8gcmV0dXJuIHRoaXMuX2FsbG93YW5jZShvd25lciwgc3BlbmRlcikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9hbGxvd2FuY2UKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo6QXJjMjAwLl9iYWxhbmNlT2Yob3duZXI6IGJ5dGVzKSAtPiBieXRlczoKX2JhbGFuY2VPZjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxODIKICAgIC8vIHByb3RlY3RlZCBfYmFsYW5jZU9mKG93bmVyOiBBZGRyZXNzKTogVWludE4yNTYgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6NTMKICAgIC8vIHB1YmxpYyBiYWxhbmNlcyA9IEJveE1hcDxBZGRyZXNzLCBVaW50TjI1Nj4oeyBrZXlQcmVmaXg6ICdiJyB9KQogICAgYnl0ZWMgNSAvLyAiYiIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxODMKICAgIC8vIGlmICghdGhpcy5iYWxhbmNlcyhvd25lcikuZXhpc3RzKSByZXR1cm4gbmV3IFVpbnROMjU2KDApCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBfYmFsYW5jZU9mX2FmdGVyX2lmX2Vsc2VAMgogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIHJldHN1YgoKX2JhbGFuY2VPZl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTg0CiAgICAvLyByZXR1cm4gdGhpcy5iYWxhbmNlcyhvd25lcikudmFsdWUKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuX3RyYW5zZmVyKHNlbmRlcjogYnl0ZXMsIHJlY2lwaWVudDogYnl0ZXMsIGFtb3VudDogYnl0ZXMpIC0+IGJ5dGVzOgpfdHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTg3CiAgICAvLyBwcm90ZWN0ZWQgX3RyYW5zZmVyKHNlbmRlcjogQWRkcmVzcywgcmVjaXBpZW50OiBBZGRyZXNzLCBhbW91bnQ6IFVpbnROMjU2KTogQm9vbCB7CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxODgKICAgIC8vIGNvbnN0IHNlbmRlcl9iYWxhbmNlID0gdGhpcy5fYmFsYW5jZU9mKHNlbmRlcikKICAgIGZyYW1lX2RpZyAtMwogICAgY2FsbHN1YiBfYmFsYW5jZU9mCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxODkKICAgIC8vIGNvbnN0IHJlY2lwaWVudF9iYWxhbmNlID0gdGhpcy5fYmFsYW5jZU9mKHJlY2lwaWVudCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfYmFsYW5jZU9mCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTkwCiAgICAvLyBhc3NlcnQoc2VuZGVyX2JhbGFuY2UubmF0aXZlID49IGFtb3VudC5uYXRpdmUsICdJbnN1ZmZpY2llbnQgYmFsYW5jZSBhdCB0aGUgc2VuZGVyIGFjY291bnQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgYmFsYW5jZSBhdCB0aGUgc2VuZGVyIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxOTIKICAgIC8vIGlmIChzZW5kZXIgIT09IHJlY2lwaWVudCkgewogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgICE9CiAgICBieiBfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLmJhbGFuY2VzKHNlbmRlcikudmFsdWUgPSBuZXcgVWludE4yNTYoc2VuZGVyX2JhbGFuY2UubmF0aXZlIC0gYW1vdW50Lm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gMzIKICAgIGJ6ZXJvCiAgICBzd2FwCiAgICBkaWcgMQogICAgYnwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1MwogICAgLy8gcHVibGljIGJhbGFuY2VzID0gQm94TWFwPEFkZHJlc3MsIFVpbnROMjU2Pih7IGtleVByZWZpeDogJ2InIH0pCiAgICBieXRlYyA1IC8vICJiIgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxOTQKICAgIC8vIHRoaXMuYmFsYW5jZXMoc2VuZGVyKS52YWx1ZSA9IG5ldyBVaW50TjI1NihzZW5kZXJfYmFsYW5jZS5uYXRpdmUgLSBhbW91bnQubmF0aXZlKQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjE5NQogICAgLy8gdGhpcy5iYWxhbmNlcyhyZWNpcGllbnQpLnZhbHVlID0gbmV3IFVpbnROMjU2KHJlY2lwaWVudF9iYWxhbmNlLm5hdGl2ZSArIGFtb3VudC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICBiKwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgYnwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1MwogICAgLy8gcHVibGljIGJhbGFuY2VzID0gQm94TWFwPEFkZHJlc3MsIFVpbnROMjU2Pih7IGtleVByZWZpeDogJ2InIH0pCiAgICBieXRlYyA1IC8vICJiIgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxOTUKICAgIC8vIHRoaXMuYmFsYW5jZXMocmVjaXBpZW50KS52YWx1ZSA9IG5ldyBVaW50TjI1NihyZWNpcGllbnRfYmFsYW5jZS5uYXRpdmUgKyBhbW91bnQubmF0aXZlKQogICAgc3dhcAogICAgYm94X3B1dAoKX3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoxOTcKICAgIC8vIGVtaXQobmV3IGFyYzIwMF9UcmFuc2Zlcih7IGZyb206IHNlbmRlciwgdG86IHJlY2lwaWVudCwgdmFsdWU6IGFtb3VudCB9KSkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyAyNiAvLyBtZXRob2QgImFyYzIwMF9UcmFuc2ZlcihhZGRyZXNzLGFkZHJlc3MsdWludDI1NikiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjE5OAogICAgLy8gcmV0dXJuIG5ldyBCb29sKHRydWUpCiAgICBieXRlYyA4IC8vIDB4ODAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuX2FwcHJvdmFsS2V5KG93bmVyOiBieXRlcywgc3BlbmRlcjogYnl0ZXMpIC0+IGJ5dGVzOgpfYXBwcm92YWxLZXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MjAwCiAgICAvLyBwcm90ZWN0ZWQgX2FwcHJvdmFsS2V5KG93bmVyOiBBZGRyZXNzLCBzcGVuZGVyOiBBZGRyZXNzKTogU3RhdGljQnl0ZXM8MzI+IHsKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjIwMQogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4ob3Auc2hhMjU2KG9wLmNvbmNhdChvd25lci5ieXRlcywgc3BlbmRlci5ieXRlcykpKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjpBcmMyMDAuX2FsbG93YW5jZShvd25lcjogYnl0ZXMsIHNwZW5kZXI6IGJ5dGVzKSAtPiBieXRlczoKX2FsbG93YW5jZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoyMDQKICAgIC8vIHByb3RlY3RlZCBfYWxsb3dhbmNlKG93bmVyOiBBZGRyZXNzLCBzcGVuZGVyOiBBZGRyZXNzKTogVWludE4yNTYgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MjA1CiAgICAvLyBjb25zdCBrZXkgPSB0aGlzLl9hcHByb3ZhbEtleShvd25lciwgc3BlbmRlcikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9hcHByb3ZhbEtleQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjU1CiAgICAvLyBwdWJsaWMgYXBwcm92YWxzID0gQm94TWFwPFN0YXRpY0J5dGVzPDMyPiwgQXBwcm92YWxTdHJ1Y3Q+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIHB1c2hieXRlcyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MjA2CiAgICAvLyBpZiAoIXRoaXMuYXBwcm92YWxzKGtleSkuZXhpc3RzKSByZXR1cm4gbmV3IFVpbnROMjU2KDApCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBfYWxsb3dhbmNlX2FmdGVyX2lmX2Vsc2VAMgogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIHJldHN1YgoKX2FsbG93YW5jZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MjA3CiAgICAvLyByZXR1cm4gdGhpcy5hcHByb3ZhbHMoa2V5KS52YWx1ZS5hcHByb3ZhbEFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6OkFyYzIwMC5fYXBwcm92ZShvd25lcjogYnl0ZXMsIHNwZW5kZXI6IGJ5dGVzLCBhbW91bnQ6IGJ5dGVzKSAtPiBieXRlczoKX2FwcHJvdmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MjEwCiAgICAvLyBwcm90ZWN0ZWQgX2FwcHJvdmUob3duZXI6IEFkZHJlc3MsIHNwZW5kZXI6IEFkZHJlc3MsIGFtb3VudDogVWludE4yNTYpOiBCb29sIHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjIxMQogICAgLy8gY29uc3Qga2V5ID0gdGhpcy5fYXBwcm92YWxLZXkob3duZXIsIHNwZW5kZXIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfYXBwcm92YWxLZXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czoyMTItMjE2CiAgICAvLyBjb25zdCBhcHByb3ZhbEJveDogQXBwcm92YWxTdHJ1Y3QgPSBuZXcgQXBwcm92YWxTdHJ1Y3QoewogICAgLy8gICBhcHByb3ZhbEFtb3VudDogYW1vdW50LAogICAgLy8gICBvd25lcjogb3duZXIsCiAgICAvLyAgIHNwZW5kZXI6IHNwZW5kZXIsCiAgICAvLyB9KQogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmMyMDAuYWxnby50czo1NQogICAgLy8gcHVibGljIGFwcHJvdmFscyA9IEJveE1hcDxTdGF0aWNCeXRlczwzMj4sIEFwcHJvdmFsU3RydWN0Pih7IGtleVByZWZpeDogJ2EnIH0pCiAgICBwdXNoYnl0ZXMgImEiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjIxNwogICAgLy8gdGhpcy5hcHByb3ZhbHMoa2V5KS52YWx1ZSA9IGFwcHJvdmFsQm94LmNvcHkoKQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzIwMC5hbGdvLnRzOjIxOAogICAgLy8gZW1pdChuZXcgYXJjMjAwX0FwcHJvdmFsKHsgb3duZXI6IG93bmVyLCBzcGVuZGVyOiBzcGVuZGVyLCB2YWx1ZTogYW1vdW50IH0pKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE5NjlmODY1IC8vIG1ldGhvZCAiYXJjMjAwX0FwcHJvdmFsKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjMjAwLmFsZ28udHM6MjE5CiAgICAvLyByZXR1cm4gbmV3IEJvb2wodHJ1ZSkKICAgIGJ5dGVjIDggLy8gMHg4MAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6OkFyYzg4Ll9lbnN1cmVEZWZhdWx0T3duZXIoKSAtPiB2b2lkOgpfZW5zdXJlRGVmYXVsdE93bmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTkKICAgIC8vIHB1YmxpYyBpbml0aWFsaXplZCA9IEdsb2JhbFN0YXRlPGFyYzQuQnl0ZT4oeyBrZXk6ICdhcmM4OF9vaScgfSkgLy8gMSBpZiBpbml0aWFsaXplZCAoZXhwbGljaXQgb3IgaW1wbGljaXQpCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWMgMTEgLy8gImFyYzg4X29pIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MjcKICAgIC8vIGlmICghdGhpcy5pbml0aWFsaXplZC5oYXNWYWx1ZSB8fCB0aGlzLmluaXRpYWxpemVkLnZhbHVlLm5hdGl2ZSA9PT0gMCkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYnogX2Vuc3VyZURlZmF1bHRPd25lcl9pZl9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjE5CiAgICAvLyBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBHbG9iYWxTdGF0ZTxhcmM0LkJ5dGU+KHsga2V5OiAnYXJjODhfb2knIH0pIC8vIDEgaWYgaW5pdGlhbGl6ZWQgKGV4cGxpY2l0IG9yIGltcGxpY2l0KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDExIC8vICJhcmM4OF9vaSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoyNwogICAgLy8gaWYgKCF0aGlzLmluaXRpYWxpemVkLmhhc1ZhbHVlIHx8IHRoaXMuaW5pdGlhbGl6ZWQudmFsdWUubmF0aXZlID09PSAwKSB7CiAgICBidG9pCiAgICBibnogX2Vuc3VyZURlZmF1bHRPd25lcl9hZnRlcl9pZl9lbHNlQDUKCl9lbnN1cmVEZWZhdWx0T3duZXJfaWZfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTcKICAgIC8vIHB1YmxpYyBvd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9vJyB9KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFyYzg4X28iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoyOAogICAgLy8gaWYgKCF0aGlzLm93bmVyLmhhc1ZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICBibnogX2Vuc3VyZURlZmF1bHRPd25lcl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjE3CiAgICAvLyBwdWJsaWMgb3duZXIgPSBHbG9iYWxTdGF0ZTxhcmM0LkFkZHJlc3M+KHsga2V5OiAnYXJjODhfbycgfSkKICAgIGJ5dGVjXzIgLy8gImFyYzg4X28iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoyOQogICAgLy8gdGhpcy5vd25lci52YWx1ZSA9IG5ldyBhcmM0LkFkZHJlc3MoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAoKX2Vuc3VyZURlZmF1bHRPd25lcl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxOQogICAgLy8gcHVibGljIGluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8YXJjNC5CeXRlPih7IGtleTogJ2FyYzg4X29pJyB9KSAvLyAxIGlmIGluaXRpYWxpemVkIChleHBsaWNpdCBvciBpbXBsaWNpdCkKICAgIGJ5dGVjIDExIC8vICJhcmM4OF9vaSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjMxCiAgICAvLyB0aGlzLmluaXRpYWxpemVkLnZhbHVlID0gbmV3IGFyYzQuQnl0ZSgxKQogICAgYnl0ZWMgMTkgLy8gMHgwMQogICAgYXBwX2dsb2JhbF9wdXQKCl9lbnN1cmVEZWZhdWx0T3duZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6OkFyYzg4LmFyYzg4X293bmVyKCkgLT4gYnl0ZXM6CmFyYzg4X293bmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MzcKICAgIC8vIHRoaXMuX2Vuc3VyZURlZmF1bHRPd25lcigpCiAgICBjYWxsc3ViIF9lbnN1cmVEZWZhdWx0T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjE3CiAgICAvLyBwdWJsaWMgb3duZXIgPSBHbG9iYWxTdGF0ZTxhcmM0LkFkZHJlc3M+KHsga2V5OiAnYXJjODhfbycgfSkKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18yIC8vICJhcmM4OF9vIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjM4CiAgICAvLyByZXR1cm4gdGhpcy5vd25lci52YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6OkFyYzg4LmFyYzg4X2lzX293bmVyKHF1ZXJ5OiBieXRlcykgLT4gYnl0ZXM6CmFyYzg4X2lzX293bmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6NDEtNDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBwdWJsaWMgYXJjODhfaXNfb3duZXIocXVlcnk6IGFyYzQuQWRkcmVzcyk6IGFyYzQuQm9vbCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjQzCiAgICAvLyB0aGlzLl9lbnN1cmVEZWZhdWx0T3duZXIoKQogICAgY2FsbHN1YiBfZW5zdXJlRGVmYXVsdE93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxNwogICAgLy8gcHVibGljIG93bmVyID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogJ2FyYzg4X28nIH0pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXJjODhfbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjQ0CiAgICAvLyBpZiAoIXRoaXMub3duZXIuaGFzVmFsdWUpIHJldHVybiBuZXcgYXJjNC5Cb29sKGZhbHNlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYm56IGFyYzg4X2lzX293bmVyX2FmdGVyX2lmX2Vsc2VAMgogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgcmV0c3ViCgphcmM4OF9pc19vd25lcl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxNwogICAgLy8gcHVibGljIG93bmVyID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogJ2FyYzg4X28nIH0pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXJjODhfbyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo0NQogICAgLy8gaWYgKHRoaXMub3duZXIudmFsdWUgPT09IG5ldyBhcmM0LkFkZHJlc3MoKSkgcmV0dXJuIG5ldyBhcmM0LkJvb2woZmFsc2UpCiAgICBieXRlY18xIC8vIGFkZHIgQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUQogICAgPT0KICAgIGJ6IGFyYzg4X2lzX293bmVyX2FmdGVyX2lmX2Vsc2VANAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgcmV0c3ViCgphcmM4OF9pc19vd25lcl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxNwogICAgLy8gcHVibGljIG93bmVyID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogJ2FyYzg4X28nIH0pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXJjODhfbyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo0NgogICAgLy8gcmV0dXJuIG5ldyBhcmM0LkJvb2wodGhpcy5vd25lci52YWx1ZSA9PT0gcXVlcnkpCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjpBcmM4OC5hcmM4OF9pbml0aWFsaXplX293bmVyKG5ld19vd25lcjogYnl0ZXMpIC0+IHZvaWQ6CmFyYzg4X2luaXRpYWxpemVfb3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo1MC01MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyBhcmM4OF9pbml0aWFsaXplX293bmVyKG5ld19vd25lcjogYXJjNC5BZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjE5CiAgICAvLyBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBHbG9iYWxTdGF0ZTxhcmM0LkJ5dGU+KHsga2V5OiAnYXJjODhfb2knIH0pIC8vIDEgaWYgaW5pdGlhbGl6ZWQgKGV4cGxpY2l0IG9yIGltcGxpY2l0KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDExIC8vICJhcmM4OF9vaSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjUyCiAgICAvLyBhc3NlcnQoISh0aGlzLmluaXRpYWxpemVkLmhhc1ZhbHVlICYmIHRoaXMuaW5pdGlhbGl6ZWQudmFsdWUubmF0aXZlID09PSAxKSwgJ2FscmVhZHlfaW5pdGlhbGl6ZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYnogYXJjODhfaW5pdGlhbGl6ZV9vd25lcl9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjE5CiAgICAvLyBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBHbG9iYWxTdGF0ZTxhcmM0LkJ5dGU+KHsga2V5OiAnYXJjODhfb2knIH0pIC8vIDEgaWYgaW5pdGlhbGl6ZWQgKGV4cGxpY2l0IG9yIGltcGxpY2l0KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDExIC8vICJhcmM4OF9vaSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo1MgogICAgLy8gYXNzZXJ0KCEodGhpcy5pbml0aWFsaXplZC5oYXNWYWx1ZSAmJiB0aGlzLmluaXRpYWxpemVkLnZhbHVlLm5hdGl2ZSA9PT0gMSksICdhbHJlYWR5X2luaXRpYWxpemVkJykKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogYXJjODhfaW5pdGlhbGl6ZV9vd25lcl9ib29sX2ZhbHNlQDMKICAgIGludGNfMCAvLyAxCgphcmM4OF9pbml0aWFsaXplX293bmVyX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjUyCiAgICAvLyBhc3NlcnQoISh0aGlzLmluaXRpYWxpemVkLmhhc1ZhbHVlICYmIHRoaXMuaW5pdGlhbGl6ZWQudmFsdWUubmF0aXZlID09PSAxKSwgJ2FscmVhZHlfaW5pdGlhbGl6ZWQnKQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHlfaW5pdGlhbGl6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjUzCiAgICAvLyBhc3NlcnQobmV3X293bmVyICE9PSBuZXcgYXJjNC5BZGRyZXNzKCksICd6ZXJvX2FkZHJlc3Nfbm90X2FsbG93ZWQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18xIC8vIGFkZHIgQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUQogICAgIT0KICAgIGFzc2VydCAvLyB6ZXJvX2FkZHJlc3Nfbm90X2FsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjE3CiAgICAvLyBwdWJsaWMgb3duZXIgPSBHbG9iYWxTdGF0ZTxhcmM0LkFkZHJlc3M+KHsga2V5OiAnYXJjODhfbycgfSkKICAgIGJ5dGVjXzIgLy8gImFyYzg4X28iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo1NAogICAgLy8gdGhpcy5vd25lci52YWx1ZSA9IG5ld19vd25lcgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTkKICAgIC8vIHB1YmxpYyBpbml0aWFsaXplZCA9IEdsb2JhbFN0YXRlPGFyYzQuQnl0ZT4oeyBrZXk6ICdhcmM4OF9vaScgfSkgLy8gMSBpZiBpbml0aWFsaXplZCAoZXhwbGljaXQgb3IgaW1wbGljaXQpCiAgICBieXRlYyAxMSAvLyAiYXJjODhfb2kiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo1NQogICAgLy8gdGhpcy5pbml0aWFsaXplZC52YWx1ZSA9IG5ldyBhcmM0LkJ5dGUoMSkKICAgIGJ5dGVjIDE5IC8vIDB4MDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFyYzg4X2luaXRpYWxpemVfb3duZXJfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgYXJjODhfaW5pdGlhbGl6ZV9vd25lcl9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo6QXJjODguYXJjODhfdHJhbnNmZXJfb3duZXJzaGlwKG5ld19vd25lcjogYnl0ZXMpIC0+IHZvaWQ6CmFyYzg4X3RyYW5zZmVyX293bmVyc2hpcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjU4LTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIGFyYzg4X3RyYW5zZmVyX293bmVyc2hpcChuZXdfb3duZXI6IGFyYzQuQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo2MAogICAgLy8gdGhpcy5fZW5zdXJlRGVmYXVsdE93bmVyKCkKICAgIGNhbGxzdWIgX2Vuc3VyZURlZmF1bHRPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6NjEKICAgIC8vIGFzc2VydChuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpID09PSB0aGlzLm93bmVyLnZhbHVlLCAnbm90X293bmVyJykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjE3CiAgICAvLyBwdWJsaWMgb3duZXIgPSBHbG9iYWxTdGF0ZTxhcmM0LkFkZHJlc3M+KHsga2V5OiAnYXJjODhfbycgfSkKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18yIC8vICJhcmM4OF9vIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjYxCiAgICAvLyBhc3NlcnQobmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSA9PT0gdGhpcy5vd25lci52YWx1ZSwgJ25vdF9vd25lcicpCiAgICA9PQogICAgYXNzZXJ0IC8vIG5vdF9vd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6NjIKICAgIC8vIGFzc2VydChuZXdfb3duZXIgIT09IG5ldyBhcmM0LkFkZHJlc3MoKSwgJ3plcm9fYWRkcmVzc19ub3RfYWxsb3dlZCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzEgLy8gYWRkciBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRCiAgICAhPQogICAgYXNzZXJ0IC8vIHplcm9fYWRkcmVzc19ub3RfYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTcKICAgIC8vIHB1YmxpYyBvd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9vJyB9KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFyYzg4X28iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMiAvLyAiYXJjODhfbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjY0CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gbmV3X293bmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo2NQogICAgLy8gZW1pdChuZXcgYXJjODhfT3duZXJzaGlwVHJhbnNmZXJyZWQoeyBwcmV2aW91c19vd25lcjogcHJldmlvdXMsIG5ld19vd25lciB9KSkKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyAyNyAvLyBtZXRob2QgImFyYzg4X093bmVyc2hpcFRyYW5zZmVycmVkKGFkZHJlc3MsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6OkFyYzg4LmFyYzg4X3Jlbm91bmNlX293bmVyc2hpcCgpIC0+IHZvaWQ6CmFyYzg4X3Jlbm91bmNlX293bmVyc2hpcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjcwCiAgICAvLyB0aGlzLl9lbnN1cmVEZWZhdWx0T3duZXIoKQogICAgY2FsbHN1YiBfZW5zdXJlRGVmYXVsdE93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo3MQogICAgLy8gYXNzZXJ0KG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikgPT09IHRoaXMub3duZXIudmFsdWUsICdub3Rfb3duZXInKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTcKICAgIC8vIHB1YmxpYyBvd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9vJyB9KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFyYzg4X28iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6NzEKICAgIC8vIGFzc2VydChuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpID09PSB0aGlzLm93bmVyLnZhbHVlLCAnbm90X293bmVyJykKICAgID09CiAgICBhc3NlcnQgLy8gbm90X293bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxNwogICAgLy8gcHVibGljIG93bmVyID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogJ2FyYzg4X28nIH0pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXJjODhfbyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18yIC8vICJhcmM4OF9vIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6NzMKICAgIC8vIHRoaXMub3duZXIudmFsdWUgPSBuZXcgYXJjNC5BZGRyZXNzKCkKICAgIGJ5dGVjXzEgLy8gYWRkciBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6NzQKICAgIC8vIGVtaXQobmV3IGFyYzg4X093bmVyc2hpcFJlbm91bmNlZCh7IHByZXZpb3VzX293bmVyOiBwcmV2aW91cyB9KSkKICAgIHB1c2hieXRlcyAweDM0NmFhMTY2IC8vIG1ldGhvZCAiYXJjODhfT3duZXJzaGlwUmVub3VuY2VkKGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjpBcmM4OC5hcmM4OF90cmFuc2Zlcl9vd25lcnNoaXBfcmVxdWVzdChwZW5kaW5nOiBieXRlcykgLT4gdm9pZDoKYXJjODhfdHJhbnNmZXJfb3duZXJzaGlwX3JlcXVlc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo3OC03OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyBhcmM4OF90cmFuc2Zlcl9vd25lcnNoaXBfcmVxdWVzdChwZW5kaW5nOiBhcmM0LkFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6ODAKICAgIC8vIHRoaXMuX2Vuc3VyZURlZmF1bHRPd25lcigpCiAgICBjYWxsc3ViIF9lbnN1cmVEZWZhdWx0T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjgxCiAgICAvLyBhc3NlcnQobmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSA9PT0gdGhpcy5vd25lci52YWx1ZSwgJ25vdF9vd25lcicpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxNwogICAgLy8gcHVibGljIG93bmVyID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogJ2FyYzg4X28nIH0pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXJjODhfbyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo4MQogICAgLy8gYXNzZXJ0KG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikgPT09IHRoaXMub3duZXIudmFsdWUsICdub3Rfb3duZXInKQogICAgPT0KICAgIGFzc2VydCAvLyBub3Rfb3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjgyCiAgICAvLyBhc3NlcnQocGVuZGluZyAhPT0gbmV3IGFyYzQuQWRkcmVzcygpLCAnemVyb19hZGRyZXNzX25vdF9hbGxvd2VkJykKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWNfMSAvLyBhZGRyIEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EKICAgICE9CiAgICBhc3NlcnQgLy8gemVyb19hZGRyZXNzX25vdF9hbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxOAogICAgLy8gcHVibGljIHBlbmRpbmdPd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9wbycgfSkgLy8gb3B0aW9uYWwgdHdvLXN0ZXAKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhcmM4OF9wbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjgzCiAgICAvLyBpZiAodGhpcy5wZW5kaW5nT3duZXIuaGFzVmFsdWUgJiYgdGhpcy5wZW5kaW5nT3duZXIudmFsdWUgIT09IG5ldyBhcmM0LkFkZHJlc3MoKSkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYnogYXJjODhfdHJhbnNmZXJfb3duZXJzaGlwX3JlcXVlc3RfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxOAogICAgLy8gcHVibGljIHBlbmRpbmdPd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9wbycgfSkgLy8gb3B0aW9uYWwgdHdvLXN0ZXAKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhcmM4OF9wbyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo4MwogICAgLy8gaWYgKHRoaXMucGVuZGluZ093bmVyLmhhc1ZhbHVlICYmIHRoaXMucGVuZGluZ093bmVyLnZhbHVlICE9PSBuZXcgYXJjNC5BZGRyZXNzKCkpIHsKICAgIGJ5dGVjXzEgLy8gYWRkciBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRCiAgICAhPQogICAgIQogICAgYXNzZXJ0IC8vIHBlbmRpbmdfdHJhbnNmZXJfZXhpc3RzCgphcmM4OF90cmFuc2Zlcl9vd25lcnNoaXBfcmVxdWVzdF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxOAogICAgLy8gcHVibGljIHBlbmRpbmdPd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9wbycgfSkgLy8gb3B0aW9uYWwgdHdvLXN0ZXAKICAgIGJ5dGVjIDkgLy8gImFyYzg4X3BvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6ODYKICAgIC8vIHRoaXMucGVuZGluZ093bmVyLnZhbHVlID0gcGVuZGluZwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTcKICAgIC8vIHB1YmxpYyBvd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9vJyB9KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFyYzg4X28iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6ODcKICAgIC8vIGVtaXQobmV3IGFyYzg4X093bmVyc2hpcFRyYW5zZmVyUmVxdWVzdGVkKHsgcHJldmlvdXNfb3duZXI6IHRoaXMub3duZXIudmFsdWUsIHBlbmRpbmdfb3duZXI6IHBlbmRpbmcgfSkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTZiZjFmOTEgLy8gbWV0aG9kICJhcmM4OF9Pd25lcnNoaXBUcmFuc2ZlclJlcXVlc3RlZChhZGRyZXNzLGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjpBcmM4OC5hcmM4OF9hY2NlcHRfb3duZXJzaGlwKCkgLT4gdm9pZDoKYXJjODhfYWNjZXB0X293bmVyc2hpcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjkyCiAgICAvLyB0aGlzLl9lbnN1cmVEZWZhdWx0T3duZXIoKQogICAgY2FsbHN1YiBfZW5zdXJlRGVmYXVsdE93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxOAogICAgLy8gcHVibGljIHBlbmRpbmdPd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9wbycgfSkgLy8gb3B0aW9uYWwgdHdvLXN0ZXAKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhcmM4OF9wbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjkzCiAgICAvLyBhc3NlcnQodGhpcy5wZW5kaW5nT3duZXIuaGFzVmFsdWUsICdub3RfcGVuZGluZ19vd25lcicpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90X3BlbmRpbmdfb3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjk0CiAgICAvLyBjb25zdCBzZW5kZXIgPSBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxOAogICAgLy8gcHVibGljIHBlbmRpbmdPd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9wbycgfSkgLy8gb3B0aW9uYWwgdHdvLXN0ZXAKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA5IC8vICJhcmM4OF9wbyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo5NQogICAgLy8gYXNzZXJ0KHNlbmRlciA9PT0gdGhpcy5wZW5kaW5nT3duZXIudmFsdWUsICdub3RfcGVuZGluZ19vd25lcicpCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBub3RfcGVuZGluZ19vd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTcKICAgIC8vIHB1YmxpYyBvd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9vJyB9KQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFyYzg4X28iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMiAvLyAiYXJjODhfbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjk3CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gc2VuZGVyCiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjE4CiAgICAvLyBwdWJsaWMgcGVuZGluZ093bmVyID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogJ2FyYzg4X3BvJyB9KSAvLyBvcHRpb25hbCB0d28tc3RlcAogICAgYnl0ZWMgOSAvLyAiYXJjODhfcG8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czo5OAogICAgLy8gdGhpcy5wZW5kaW5nT3duZXIudmFsdWUgPSBuZXcgYXJjNC5BZGRyZXNzKCkKICAgIGJ5dGVjXzEgLy8gYWRkciBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWTVIRktRCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6OTkKICAgIC8vIGVtaXQobmV3IGFyYzg4X093bmVyc2hpcFRyYW5zZmVyQWNjZXB0ZWQoeyBwcmV2aW91c19vd25lcjogcHJldmlvdXMsIG5ld19vd25lcjogc2VuZGVyIH0pKQogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhmN2UzNmIzNyAvLyBtZXRob2QgImFyYzg4X093bmVyc2hpcFRyYW5zZmVyQWNjZXB0ZWQoYWRkcmVzcyxhZGRyZXNzKSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTAwCiAgICAvLyBlbWl0KG5ldyBhcmM4OF9Pd25lcnNoaXBUcmFuc2ZlcnJlZCh7IHByZXZpb3VzX293bmVyOiBwcmV2aW91cywgbmV3X293bmVyOiBzZW5kZXIgfSkpCiAgICBieXRlYyAyNyAvLyBtZXRob2QgImFyYzg4X093bmVyc2hpcFRyYW5zZmVycmVkKGFkZHJlc3MsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6OkFyYzg4LmFyYzg4X2NhbmNlbF9vd25lcnNoaXBfcmVxdWVzdCgpIC0+IHZvaWQ6CmFyYzg4X2NhbmNlbF9vd25lcnNoaXBfcmVxdWVzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zZWN1cml0eV90b2tlbi9hcmM4OC5hbGdvLnRzOjEwNQogICAgLy8gdGhpcy5fZW5zdXJlRGVmYXVsdE93bmVyKCkKICAgIGNhbGxzdWIgX2Vuc3VyZURlZmF1bHRPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTA2CiAgICAvLyBhc3NlcnQobmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSA9PT0gdGhpcy5vd25lci52YWx1ZSwgJ25vdF9vd25lcicpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxNwogICAgLy8gcHVibGljIG93bmVyID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogJ2FyYzg4X28nIH0pCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXJjODhfbyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxMDYKICAgIC8vIGFzc2VydChuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpID09PSB0aGlzLm93bmVyLnZhbHVlLCAnbm90X293bmVyJykKICAgID09CiAgICBhc3NlcnQgLy8gbm90X293bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc2VjdXJpdHlfdG9rZW4vYXJjODguYWxnby50czoxOAogICAgLy8gcHVibGljIHBlbmRpbmdPd25lciA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICdhcmM4OF9wbycgfSkgLy8gb3B0aW9uYWwgdHdvLXN0ZXAKICAgIGJ5dGVjIDkgLy8gImFyYzg4X3BvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3NlY3VyaXR5X3Rva2VuL2FyYzg4LmFsZ28udHM6MTA3CiAgICAvLyB0aGlzLnBlbmRpbmdPd25lci52YWx1ZSA9IG5ldyBhcmM0LkFkZHJlc3MoKQogICAgYnl0ZWNfMSAvLyBhZGRyIEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiAEAQAgAiYcBBUffHUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYXJjODhfbwF0AgACAWIJYXJjMTQxMF9wDGFyYzE2NDNfZG9jcwGACGFyYzg4X3BvAQAIYXJjODhfb2kLYXJjMTQxMF9vcGECAAALYXJjMTU5NF9pc3MMYXJjMTQxMF9ocF9hCmFyYzE0MTBfb3ALYXJjMTY0M19kb2MCAEIBAQIAAQIAYgIABgTX/EqYCAAAAAAAAAAABFwntPwEeYPDXARDVdKtMRtBBIOCKgQRyzb1BLFteowEp8s0ggTstjbIBGWxaCoEATBZmwQUK1/LBPiDjrkEMYgr+gSpzKFvBCZll8AENfgTXwTacCW5BD8lZxMElbT54wSAzEmrBAeWIWUE54lh2gT9lIDXBLGx1poEwb7XiQQ7/hgzBFmc0aUEbelBZgQo8CPXBJdTguIEZX0T7AS2rholBITsE9UE7JlgQQSC5XPEBEqWj48EtUIhJQS7sxnzBAcCZU4E0BVyTgQCn+zABHNJM04E23yC7wT9LCxuBEKl8GUErU9o6jYaAI4qA0EDLgMfAw8DAALrAtYCxAKrAo8CfwJpAlMCNwIhAggB8wHeAb8BoAGIAW8BVwFCASoBDgD+AO4A3gDOALsAogCMAHYAZgBTAEQANQApABoADgACI0MxGRREMRhEiA/nIkMxGRREMRhEiA+oIkMxGRREMRhENhoBiA9eIkMxGRREMRhEiA82IkMxGRREMRhENhoBiA8DIkMxGRREMRhENhoBiA7HIkMxGRREMRhENhoBiA6NKExQsCJDMRkURDEYRIgOdShMULAiQzEZFEQxGEQ2GgE2GgKIDWMoTFCwIkMxGRREMRhENhoBNhoCiA1AKExQsCJDMRkURDEYRDYaATYaAjYaA4gM+ShMULAiQzEZFEQxGEQ2GgGIDN0oTFCwIkMxGRREMRhEiAzIKExQsCJDMRkURDEYRIgMsShMULAiQzEZFEQxGESIDJEoTFCwIkMxGRREMRhEiAxyKExQsCJDMRkURDEYRDYaATYaAjYaAzYaBIgMAChMULAiQzEZFEQxGEQ2GgE2GgI2GgM2GgSICxQiQzEZFEQxGEQ2GgE2GgI2GgOICnciQzEZFEQxGEQ2GgE2GgI2GgM2GgSICcsiQzEZFEQxGEQ2GgE2GgI2GgOICX4oTFCwIkMxGRREMRhENhoBNhoCNhoDNhoEiAlJIkMxGRREMRhENhoBNhoCNhoDNhoENhoFiAX1KExQsCJDMRkURDEYRDYaATYaAjYaAzYaBDYaBYgFcChMULAiQzEZFEQxGEQ2GgE2GgI2GgOIBTYiQzEZFEQxGEQ2GgE2GgI2GgOIBQgiQzEZFEQxGEQ2GgE2GgI2GgOIBJQoTFCwIkMxGRREMRhENhoBNhoCiARhKExQsCJDMRkURDEYRDYaATYaAjYaAzYaBIgEKihMULAiQzEZFEQxGEQ2GgE2GgKIA/ooTFCwIkMxGRREMRhENhoBNhoCiAPVKExQsCJDMRkURDEYRIgDvyhMULAiQzEZFEQxGEQ2GgE2GgI2GgM2GgSIA5YoTFCwIkMxGRREMRhENhoBNhoCNhoDiANyKExQsCJDMRkURDEYRDYaATYaAogC+SJDMRkURDEYRDYaATYaAjYaA4gCZSJDMRkURDEYRDYaATYaAjYaA4gCBiJDMRkURDEYRDYaAYgB6yJDMRkURDEYRIgBzyhMULAiQzEZFEQxGEQ2GgGIAV4iQzEZFEQxGEQ2GgGIAT8oTFCwIkMxGRREMRhENhoBNhoCNhoDiACDIkMxGUD8pTEYFEQiQ4oDAYv9I1lJi/8ITCULJQhLARZXBgJOAov9JUsCUov/JQuvUIv9FYv9TwNPAlJQi/5QTCULSSNMiwOLAgxBACOLBEkWVwYCiwGLA0lOBE8CXUmMAUsBWSUICIwEJQiMA0L/1YsAiwFQjACJMQCICxwjUyISRImKAwCI/++L/RVJRDIGFov+FUlOAoEMCBZXBgKAAgAMTFBMUIv+UIv/UCcRi/1QSbxITL8nB71FAUAAPicNi/0iiP9HJwe8SCcHTL+BBosACEkWVwYCJxZMUEyLAQgWVwYCUIv9UIv+UIv/UCcETFCABC3APDZMULCJJwe+RCcNi/0iiP8FSSNZTFcCAEsBJQtLARVSTIj+8icHvEgnB0y/Qv+oigEBJxGL/1BJvUUBRL5EiYoBAIj/PCcRi/9QSb1FAURJvkRMvEhJI1lLASVZSwJPAksCUksCFU8DTwNPAlKL/xWBBghJFlcGAicWTFBLAxVPAggWVwYCUIv/UE8CUExQJwRMUIAErnpPoExQsIknB75EiTEAiAn7I1MiEkSJigEAiP/vJw6L/2eJigMAiP/ji/6AAKVEIycOZUUBQQAxIycOZUQjUyISQQAlIkSL/SmL/ov/iAYHi/2L/lAnElCL/1AnBExQgATy6ZivTFCwiSNC/9iKAwAjMQBJi/0SQAAMiwGICY0jUyISQQBiIkSL/oAApUQnBYv9UEmMAL1FAUEASIsAvkSL/qdBAD4iRIsASb5Ei/6hSRUkDkQkr0xLAatPAky/IytlRIv+oUkVJA5EqytMZ4v9i/5QJxJQi/9QJwRMUCcXTFCwiSNC/78jQv+bigIAMQBJi/6AAKVEJwVMUEm9RQFBAEiLAb5Ei/6nQQA+IkSLAUm+RIv+oUkVJA5EJK9MSwGrTwJMvyMrZUSL/qFJFSQORKsrTGeLAIv+UCcSUIv/UCcETFAnF0xQsIkjQv+/igMBi/2L/ogAI4mKBAGL/Iv9i/6IB2eJIycOZUSJigIBi/6L/1AnBkxQvkSJigIBMQApi/4pi/8nDYgD8DEAi/6L/4gHlomKBAExAIv9i/yIArhMi/yL/UsDi/6L/4gDzImKAgGL/ov/UCcPTFBJvUUBQAAEJw1MiYsAvkRMiYoDASNHAov+i/0SQQAFJwiMAImL/Yv+UEmMAIv/UCcQTFBJjAG9RQFBAA+LAb5EFyISQQAFJwiMAImLAClQJxBMUEmMAr1FAUEAD4sCvkQXIhJBAAUnCIwAiScKjACJigMAMQCL/RJEi/2L/lCL/1AnEExQJxO/iYoDADEAi/0SRIv9i/5Qi/9QJxBMUEm9RQFBAASLALxIiYoFASMxAIv7MQCL/Ij/WCNTIhJHAkAAMov7iwFQi/xQJwxMUEmMAL1FAUEAGYsASb5ESYv+p0QijAKL/qFJFSQORCSvq7+LAowDiwNEi/2L/IgBn4v7i/yL/UsDi/6L/4gCsowAiYoFASNJgABJi/uL/FAnBkxQSb1FAUAAPoA5UAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFBhcnRpdGlvbiBub3QgZXhpc3RzjACJiwS+RIv+pEEAPoA5UgAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEluc3VmZmljaWVudCBiYWxhbmNljACJi/0pEkEAOoA1VwAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEludmFsaWQgcmVjZWl2ZXKMAIkxAEmMAIv7E0EAhov7iwCL/Ij+DiNTIhJJjAJJjANAACqL+4sAUIv8UCcMTFBJjAG9RQGLAowDQQARiwG+RIv+p0EAAyKMAosCjAOLA0AAQYA8WAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF09wZXJhdG9yIG5vdCBhdXRob3JpemVkjACJi/2L/IgAFoADUQAjTFCACQAHU3VjY2Vzc1CMAImKAgEpi/6L/1AnBkxQvUUBQQAEi/+MAIsATImKAgAjRwSAAEcEgAxhcmMxNDEwX2hwX3CL/lBJvUUBQAAFiwonGL+LCr5MjAJEI4wGJxiMAYsBF0mMCIsCF0mMCQxBAE+L/osBUCcPTFBJjAS9RQFAAAwnFIv/UIsESbxITL+LBL5MSU4CjABEI1mMBSOMB4sHiwUMQQCHiwBXAgCLByQLJFiL/xJBAG0iQQBfIowGiwZAADiL/osCUCcPTFBJjAO+RCNZFheBCgxBACGLA0m+RFcCACcUi/9QVwIAUEkVJAoWVwYCTFBLAbxIv4mLCSIIFosKSwG/i/5MUCcUi/9QJw9PAlBJvEhMv4mLCCIIFowBQv87iwciCIwHQv9xI0L/h4oGACNJi/6AAKVEi/qL+1AnBkxQSb1FAUAABIsCKb+LAkm+RIv+oUkVJA5EJK9JjACrv4v6i/xQi/tQi/5QgAIAglCL/1AnBExQgAQga3lATFCwi/2L+xNBAAeL/Iv9iP6Xi/yL/VAnBkxQSYwBvUUBQAAEiwEpv4sBSb5Ei/6gSRUkDkSLAKu/iYoEADEAi/wSRIv8i/1Qi/5QJwxMUIv/v4mKAwEji/6L/RJBAAQnCEyJi/2L/lCL/1AnDExQSYwAvUUBQAAEJwpMiYsAvkSAAKUnCiNPAlRMiYoEACNJMQCIA6sjUyISRIv+gAClRIv8i/1QSScGTFBJvUUBQAALiwMpv4v8i/2I/e2LA0m+RIv+oEkVJA5EJK9JjACrvycFi/xQSYwBvUUBQAAEiwEpv4sBSb5Ei/6gSRUkDkSLAElOA6u/IytlRIv+oEkVJA5EqytMZ4sCi/5QJxVQi/9QJwRMUIAE+kQ7G0xQsImKAwAxAIv+gAClREmL/VBJTgInBkxQSb1FAURJvkSL/qdESb5Ei/6hSRUkDkQkr0lOBKu/JwVMUEm9RQFBAEWLAr5Ei/6nQQA7IkSLAkm+RIv+oUkVJA5EiwFJTgOrvyMrZUSL/qFJFSQORKsrTGeLAIv+UCcVUIv/UCcETFAnGUxQsIkjQv/CigQAI0cDMQCL/DEAi/2I+kojUyISRwJAADKL/IsEUIv9UCcMTFBJjAO9RQFBABmLA0m+REmL/qdEIowFi/6hSRUkDkQkr6u/iwWMBosGRIv8i/1QSYwBJwZMUEm9RQFESb5Ei/6nREm+RIv+oUkVJA5EJK9JjACrvycFi/xQSYwCvUUBQQBFiwK+RIv+p0EAOyJEiwJJvkSL/qFJFSQORIsASU4Dq78jK2VEi/6hSRUkDkSrK0xniwGL/lAnFVCL/1AnBExQJxlMULCJI0L/wooEATEAMgkSRIv8VwIAFUlEJA5Ei/1XAgAVSUSBCA5EIytlRQEURIABbov8Z4ABc4v9ZyuL/2eAAWSL/mcxACcFSwFQi/+/MgNMUIv/UCcaTFCwJwiJI4ABbmVEVwIASRUkEkSJI4ABc2VEVwIASRWBCBJEiSOAAWRlRIkjK2VEiYoBAYv/iABHiYoDATEAi/1LAYgAt0mL/6dEi/+hSRUkDkQkr6uL/U4CiADCSIv9i/6L/4gAMYmKAgExAIv+i/+IAKuJigIBi/6L/4gAfomKAQEnBYv/UEm9RQFAAAMpTImLAL5ETImKAwGL/Yj/4EmL/oj/2kyL/6dEi/2L/hNBACmLAIv/oUkVJA5EJK9MSwGrJwWL/VBMv4sBi/+gSRUkDkSrJwWL/lBMv4v9i/5Qi/9QJxpMULAnCIwAiYoCAYv+i/9QAUkVJBJEiYoCAYv+i/+I/+eAAWFMUEm9RQFAAAMpTImLAL5EVwAgTImKAwGL/Yv+iP/Fi/+L/VCL/lCAAWFPAlBMv4v9i/5Qi/9QgAQZafhlTFCwJwiJIycLZUUBQQAJIycLZUQXQAARIyplRQFAAAQqMglnJwsnE2eJiP/ZIyplRImKAQGI/84jKmVFAUAAAycKiSMqZUQpEkEAAycKiSMqZUSL/xInCiNPAlSJigEAIycLZUUBQQAdIycLZUQXIhJBABIiFESL/ykTRCqL/2cnCycTZ4kjQv/rigEAiP92MQAjKmVEEkSL/ykTRCMqZUQqi/9ni/9QJxtMULCJiP9VMQAjKmVEEkQjKmVEKilngAQ0aqFmTFCwiYoBAIj/NjEAIyplRBJEi/8pE0QjJwllRQFBAAkjJwllRCkTFEQnCYv/ZyMqZUSL/1CABBa/H5FMULCJiP7+IycJZUUBRDEAIycJZURLARJEIyplRCpLAmcnCSlnTFCABPfjazdLAVCwJxtMULCJiP7LMQAjKmVEEkQnCSlniQ==", "clear": "CoEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 4, "minor": 7, "patch": 0 } }, "events": [ { "name": "DocumentUpdated", "args": [ { "type": "(byte[],string,byte[])", "name": "0", "struct": "arc1643_document_updated_event" } ] }, { "name": "DocumentRemoved", "args": [ { "type": "(byte[],string,byte[])", "name": "0", "struct": "arc1643_document_removed_event" } ] }, { "name": "Issue", "args": [ { "type": "(address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_issue" } ] }, { "name": "Issue", "args": [ { "type": "(address,uint256,byte[])", "name": "0", "struct": "arc1594_issue_event" } ] }, { "name": "Redeem", "args": [ { "type": "(address,uint256,byte[])", "name": "0", "struct": "arc1594_redeem_event" } ] }, { "name": "Transfer", "args": [ { "type": "(address,address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_transfer" } ] }, { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] }, { "name": "arc200_Approval", "args": [ { "type": "address", "name": "owner" }, { "type": "address", "name": "spender" }, { "type": "uint256", "name": "value" } ] }, { "name": "Redeem", "args": [ { "type": "(address,address,uint256,byte[])", "name": "0", "struct": "arc1410_partition_redeem" } ] }, { "name": "arc88_OwnershipTransferred", "args": [ { "type": "address", "name": "previous_owner" }, { "type": "address", "name": "new_owner" } ] }, { "name": "arc88_OwnershipRenounced", "args": [ { "type": "address", "name": "previous_owner" } ] }, { "name": "arc88_OwnershipTransferRequested", "args": [ { "type": "address", "name": "previous_owner" }, { "type": "address", "name": "pending_owner" } ] }, { "name": "arc88_OwnershipTransferAccepted", "args": [ { "type": "address", "name": "previous_owner" }, { "type": "address", "name": "new_owner" } ] } ], "templateVariables": {} }