{ "name": "NftMarketplace", "structs": { "Listing": [ { "name": "seller", "type": "address" }, { "name": "price", "type": "uint64" }, { "name": "isActive", "type": "bool" } ], "ListingKey": [ { "name": "seller", "type": "address" }, { "name": "assetId", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Initialize the marketplace with the creator as admin", "events": [], "recommendations": {} }, { "name": "optInToAsset", "args": [ { "type": "pay", "name": "mbrPay", "desc": "Payment to cover the 0.1 ALGO asset MBR" }, { "type": "uint64", "name": "asset", "desc": "The NFT asset to opt into" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Opt the application into an NFT asset so it can receive transfers", "events": [], "recommendations": {} }, { "name": "listNft", "args": [ { "type": "pay", "name": "mbrPay", "desc": "Payment to cover box storage MBR" }, { "type": "axfer", "name": "nftXfer", "desc": "Asset transfer of the NFT to the contract" }, { "type": "uint64", "name": "price", "desc": "Sale price in microALGO" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "List an NFT for sale on the marketplace", "events": [], "recommendations": {} }, { "name": "buyNft", "args": [ { "type": "pay", "name": "payment", "desc": "Payment for the NFT purchase" }, { "type": "address", "name": "seller", "desc": "The seller's account" }, { "type": "uint64", "name": "asset", "desc": "The NFT asset to purchase" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Buy an NFT from the marketplace", "events": [], "recommendations": {} }, { "name": "cancelListing", "args": [ { "type": "uint64", "name": "asset", "desc": "The NFT asset to reclaim" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cancel a listing and reclaim the NFT", "events": [], "recommendations": {} }, { "name": "updatePrice", "args": [ { "type": "uint64", "name": "asset", "desc": "The NFT asset to update price for" }, { "type": "uint64", "name": "newPrice", "desc": "The new price in microALGO" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update the price of an existing listing", "events": [], "recommendations": {} }, { "name": "withdrawCommission", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin withdraws collected commission", "events": [], "recommendations": {} }, { "name": "getListing", "args": [ { "type": "address", "name": "seller", "desc": "The seller's account" }, { "type": "uint64", "name": "assetId", "desc": "The NFT asset ID" } ], "returns": { "type": "(address,uint64,bool)", "struct": "Listing", "desc": "The listing details" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get listing information (readonly)", "events": [], "recommendations": {} }, { "name": "listingExists", "args": [ { "type": "address", "name": "seller", "desc": "The seller's account" }, { "type": "uint64", "name": "assetId", "desc": "The NFT asset ID" } ], "returns": { "type": "bool", "desc": "True if listing exists" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Check if a listing exists", "events": [], "recommendations": {} }, { "name": "getCollectedCommission", "args": [], "returns": { "type": "uint64", "desc": "The total commission collected" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get the collected commission amount", "events": [], "recommendations": {} }, { "name": "getAdmin", "args": [], "returns": { "type": "address", "desc": "The admin account" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get the admin address", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 2, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "admin": { "keyType": "AVMString", "valueType": "address", "key": "YWRtaW4=" }, "collectedCommission": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y29sbGVjdGVkQ29tbWlzc2lvbg==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "listings": { "keyType": "ListingKey", "valueType": "Listing", "prefix": "bA==" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 409 ], "errorMessage": "Cannot buy your own NFT" }, { "pc": [ 302 ], "errorMessage": "Listing already exists" }, { "pc": [ 357, 491, 574, 666 ], "errorMessage": "Listing does not exist" }, { "pc": [ 366, 592 ], "errorMessage": "Listing is not active" }, { "pc": [ 262 ], "errorMessage": "MBR payment insufficient for box storage" }, { "pc": [ 254 ], "errorMessage": "MBR payment must be to app" }, { "pc": [ 277 ], "errorMessage": "Must transfer exactly 1 NFT" }, { "pc": [ 270 ], "errorMessage": "NFT must be sent to app" }, { "pc": [ 285 ], "errorMessage": "NFT sender must be caller" }, { "pc": [ 617 ], "errorMessage": "No commission to withdraw" }, { "pc": [ 56 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 611 ], "errorMessage": "Only admin can withdraw commission" }, { "pc": [ 501 ], "errorMessage": "Only seller can cancel listing" }, { "pc": [ 586 ], "errorMessage": "Only seller can update price" }, { "pc": [ 403 ], "errorMessage": "Payment insufficient" }, { "pc": [ 186, 395 ], "errorMessage": "Payment must be to app" }, { "pc": [ 195 ], "errorMessage": "Payment must cover asset MBR" }, { "pc": [ 246, 560 ], "errorMessage": "Price must be positive" }, { "pc": [ 374 ], "errorMessage": "Seller mismatch" }, { "pc": [ 446, 609, 615, 625, 717, 728 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 334, 647, 683 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 177, 243, 342, 476, 548, 557, 655, 691 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 235 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 169, 225, 325 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDggNCAzNTMwMAogICAgYnl0ZWNibG9jayAiY29sbGVjdGVkQ29tbWlzc2lvbiIgImwiICJhZG1pbiIgMHgxNTFmN2M3NQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBjb2xsZWN0ZWRDb21taXNzaW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18wIC8vICJjb2xsZWN0ZWRDb21taXNzaW9uIgogICAgaW50Y18xIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo0My00NAogICAgLy8gQGNvbnRyYWN0KHsgc3RhdGVUb3RhbHM6IHsgZ2xvYmFsVWludHM6IDIsIGdsb2JhbEJ5dGVzOiAxIH0gfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBOZnRNYXJrZXRwbGFjZSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxNgogICAgcHVzaGJ5dGVzcyAweDY5NTc1YjQwIDB4MjdiMzNlYzUgMHhmMGJjNzY3YyAweGI2MzlkNGJjIDB4OTI1MjU5MzcgMHgzNjZjNDk1MCAweDllNmExMGE2IDB4MTFiNDFiYTYgMHgxYzM1NTM2NiAweGFjOGIyNGRlIC8vIG1ldGhvZCAib3B0SW5Ub0Fzc2V0KHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAibGlzdE5mdChwYXksYXhmZXIsdWludDY0KXZvaWQiLCBtZXRob2QgImJ1eU5mdChwYXksYWRkcmVzcyx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2FuY2VsTGlzdGluZyh1aW50NjQpdm9pZCIsIG1ldGhvZCAidXBkYXRlUHJpY2UodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhd0NvbW1pc3Npb24oKXZvaWQiLCBtZXRob2QgImdldExpc3RpbmcoYWRkcmVzcyx1aW50NjQpKGFkZHJlc3MsdWludDY0LGJvb2wpIiwgbWV0aG9kICJsaXN0aW5nRXhpc3RzKGFkZHJlc3MsdWludDY0KWJvb2wiLCBtZXRob2QgImdldENvbGxlY3RlZENvbW1pc3Npb24oKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0QWRtaW4oKWFkZHJlc3MiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBvcHRJblRvQXNzZXQgbGlzdE5mdCBidXlOZnQgY2FuY2VsTGlzdGluZyB1cGRhdGVQcmljZSB3aXRoZHJhd0NvbW1pc3Npb24gZ2V0TGlzdGluZyBsaXN0aW5nRXhpc3RzIGdldENvbGxlY3RlZENvbW1pc3Npb24gZ2V0QWRtaW4KICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo0My00NAogICAgLy8gQGNvbnRyYWN0KHsgc3RhdGVUb3RhbHM6IHsgZ2xvYmFsVWludHM6IDIsIGdsb2JhbEJ5dGVzOiAxIH0gfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBOZnRNYXJrZXRwbGFjZSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweGI4NDQ3YjM2IC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVBcHBsaWNhdGlvbgogICAgZXJyCgoKLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjpOZnRNYXJrZXRwbGFjZS5jcmVhdGVBcHBsaWNhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCkKICAgIGJ5dGVjXzIgLy8gImFkbWluIgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjU4CiAgICAvLyB0aGlzLmFkbWluLnZhbHVlID0gVHhuLnNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo1NwogICAgLy8gY3JlYXRlQXBwbGljYXRpb24oKTogdm9pZCB7CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjpOZnRNYXJrZXRwbGFjZS5vcHRJblRvQXNzZXRbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJblRvQXNzZXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIG9wdEluVG9Bc3NldChtYnJQYXk6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo2OAogICAgLy8gYXNzZXJ0KG1iclBheS5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdQYXltZW50IG11c3QgYmUgdG8gYXBwJykKICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRvIGFwcAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBhc3NlcnQobWJyUGF5LmFtb3VudCA+PSAxMDBfMDAwLCAnUGF5bWVudCBtdXN0IGNvdmVyIGFzc2V0IE1CUicpCiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMTAwMDAwIC8vIDEwMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgY292ZXIgYXNzZXQgTUJSCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6NzItNzkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo3NAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjc2CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6NzItNzgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gZmVlOiAwLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6NzItNzkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIG9wdEluVG9Bc3NldChtYnJQYXk6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjpOZnRNYXJrZXRwbGFjZS5saXN0TmZ0W3JvdXRpbmddKCkgLT4gdm9pZDoKbGlzdE5mdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo4OAogICAgLy8gbGlzdE5mdChtYnJQYXk6IGd0eG4uUGF5bWVudFR4biwgbmZ0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLCBwcmljZTogdWludDY0KTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgcHVzaGludCAyIC8vIDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gYXNzZXJ0KHByaWNlID4gMCwgJ1ByaWNlIG11c3QgYmUgcG9zaXRpdmUnKQogICAgZHVwCiAgICBhc3NlcnQgLy8gUHJpY2UgbXVzdCBiZSBwb3NpdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjkzCiAgICAvLyBhc3NlcnQobWJyUGF5LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgJ01CUiBwYXltZW50IG11c3QgYmUgdG8gYXBwJykKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgbXVzdCBiZSB0byBhcHAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gYXNzZXJ0KG1iclBheS5hbW91bnQgPj0gQk9YX01CUiwgJ01CUiBwYXltZW50IGluc3VmZmljaWVudCBmb3IgYm94IHN0b3JhZ2UnKQogICAgdW5jb3ZlciAyCiAgICBndHhucyBBbW91bnQKICAgIGludGMgNCAvLyAzNTMwMAogICAgPj0KICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBpbnN1ZmZpY2llbnQgZm9yIGJveCBzdG9yYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6OTcKICAgIC8vIGFzc2VydChuZnRYZmVyLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCAnTkZUIG11c3QgYmUgc2VudCB0byBhcHAnKQogICAgZGlnIDEKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5GVCBtdXN0IGJlIHNlbnQgdG8gYXBwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIGFzc2VydChuZnRYZmVyLmFzc2V0QW1vdW50ID09PSBVaW50NjQoMSksICdNdXN0IHRyYW5zZmVyIGV4YWN0bHkgMSBORlQnKQogICAgZGlnIDEKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBNdXN0IHRyYW5zZmVyIGV4YWN0bHkgMSBORlQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo5OQogICAgLy8gYXNzZXJ0KG5mdFhmZXIuc2VuZGVyID09PSBUeG4uc2VuZGVyLCAnTkZUIHNlbmRlciBtdXN0IGJlIGNhbGxlcicpCiAgICBkaWcgMQogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5GVCBzZW5kZXIgbXVzdCBiZSBjYWxsZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxMDEKICAgIC8vIGNvbnN0IGFzc2V0ID0gbmZ0WGZlci54ZmVyQXNzZXQKICAgIHN3YXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gY29uc3QgbGlzdGluZ0tleTogTGlzdGluZ0tleSA9IHsgc2VsbGVyOiBUeG4uc2VuZGVyLCBhc3NldElkOiBhc3NldC5pZCB9CiAgICB0eG4gU2VuZGVyCiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo1MgogICAgLy8gbGlzdGluZ3MgPSBCb3hNYXA8TGlzdGluZ0tleSwgTGlzdGluZz4oeyBrZXlQcmVmaXg6ICdsJyB9KQogICAgYnl0ZWNfMSAvLyAibCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjEwNQogICAgLy8gYXNzZXJ0KCF0aGlzLmxpc3RpbmdzKGxpc3RpbmdLZXkpLmV4aXN0cywgJ0xpc3RpbmcgYWxyZWFkeSBleGlzdHMnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBMaXN0aW5nIGFscmVhZHkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTA5CiAgICAvLyBzZWxsZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTA4LTExMgogICAgLy8gdGhpcy5saXN0aW5ncyhsaXN0aW5nS2V5KS52YWx1ZSA9IHsKICAgIC8vICAgc2VsbGVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBwcmljZTogcHJpY2UsCiAgICAvLyAgIGlzQWN0aXZlOiB0cnVlLAogICAgLy8gfQogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDgwCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo4OAogICAgLy8gbGlzdE5mdChtYnJQYXk6IGd0eG4uUGF5bWVudFR4biwgbmZ0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLCBwcmljZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjpOZnRNYXJrZXRwbGFjZS5idXlOZnRbcm91dGluZ10oKSAtPiB2b2lkOgpidXlOZnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTIxCiAgICAvLyBidXlOZnQocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBzZWxsZXI6IEFjY291bnQsIGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTIyCiAgICAvLyBjb25zdCBsaXN0aW5nS2V5OiBMaXN0aW5nS2V5ID0geyBzZWxsZXI6IHNlbGxlciwgYXNzZXRJZDogYXNzZXQuaWQgfQogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGxpc3RpbmdzID0gQm94TWFwPExpc3RpbmdLZXksIExpc3Rpbmc+KHsga2V5UHJlZml4OiAnbCcgfSkKICAgIGJ5dGVjXzEgLy8gImwiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGFzc2VydCh0aGlzLmxpc3RpbmdzKGxpc3RpbmdLZXkpLmV4aXN0cywgJ0xpc3RpbmcgZG9lcyBub3QgZXhpc3QnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBMaXN0aW5nIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyBjb25zdCBsaXN0aW5nID0gY2xvbmUodGhpcy5saXN0aW5ncyhsaXN0aW5nS2V5KS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyBhc3NlcnQobGlzdGluZy5pc0FjdGl2ZSwgJ0xpc3RpbmcgaXMgbm90IGFjdGl2ZScpCiAgICBkdXAKICAgIHB1c2hpbnQgMzIwIC8vIDMyMAogICAgZ2V0Yml0CiAgICBhc3NlcnQgLy8gTGlzdGluZyBpcyBub3QgYWN0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBhc3NlcnQobGlzdGluZy5zZWxsZXIgPT09IHNlbGxlciwgJ1NlbGxlciBtaXNtYXRjaCcpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDQKICAgID09CiAgICBhc3NlcnQgLy8gU2VsbGVyIG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyBjb25zdCBwcmljZSA9IGxpc3RpbmcucHJpY2UKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyBjb25zdCBjb21taXNzaW9uOiB1aW50NjQgPSAocHJpY2UgKiBVaW50NjQoQ09NTUlTU0lPTl9OVU1FUkFUT1IpKSAvIFVpbnQ2NChDT01NSVNTSU9OX0RFTk9NSU5BVE9SKQogICAgZHVwCiAgICBwdXNoaW50IDI1IC8vIDI1CiAgICAqCiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjEzMwogICAgLy8gY29uc3Qgc2VsbGVyUHJvY2VlZHM6IHVpbnQ2NCA9IHByaWNlIC0gY29tbWlzc2lvbgogICAgZHVwMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gYXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCAnUGF5bWVudCBtdXN0IGJlIHRvIGFwcCcpCiAgICBkaWcgNgogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBiZSB0byBhcHAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxMzcKICAgIC8vIGFzc2VydChwYXltZW50LmFtb3VudCA+PSBwcmljZSwgJ1BheW1lbnQgaW5zdWZmaWNpZW50JykKICAgIHVuY292ZXIgNgogICAgZ3R4bnMgQW1vdW50CiAgICB1bmNvdmVyIDMKICAgID49CiAgICBhc3NlcnQgLy8gUGF5bWVudCBpbnN1ZmZpY2llbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxNDAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyICE9PSBzZWxsZXIsICdDYW5ub3QgYnV5IHlvdXIgb3duIE5GVCcpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgNQogICAgIT0KICAgIGFzc2VydCAvLyBDYW5ub3QgYnV5IHlvdXIgb3duIE5GVAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE0My0xNTAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldEFtb3VudDogMSwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGFzc2V0QW1vdW50OiAxLAogICAgaW50Y18wIC8vIDEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHVuY292ZXIgNAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE0My0xNDkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldCwKICAgIC8vICAgICBhc3NldEFtb3VudDogMSwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE0OAogICAgLy8gZmVlOiAwLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTQzLTE1MAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAxLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE1My0xNTkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBzZWxsZXIsCiAgICAvLyAgICAgYW1vdW50OiBzZWxsZXJQcm9jZWVkcywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTUzLTE1OAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHNlbGxlciwKICAgIC8vICAgICBhbW91bnQ6IHNlbGxlclByb2NlZWRzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTU3CiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxNTMtMTU5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogc2VsbGVyLAogICAgLy8gICAgIGFtb3VudDogc2VsbGVyUHJvY2VlZHMsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyB0aGlzLmNvbGxlY3RlZENvbW1pc3Npb24udmFsdWUgPSB0aGlzLmNvbGxlY3RlZENvbW1pc3Npb24udmFsdWUgKyBjb21taXNzaW9uCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBjb2xsZWN0ZWRDb21taXNzaW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18wIC8vICJjb2xsZWN0ZWRDb21taXNzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gdGhpcy5jb2xsZWN0ZWRDb21taXNzaW9uLnZhbHVlID0gdGhpcy5jb2xsZWN0ZWRDb21taXNzaW9uLnZhbHVlICsgY29tbWlzc2lvbgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo0OQogICAgLy8gY29sbGVjdGVkQ29tbWlzc2lvbiA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWNfMCAvLyAiY29sbGVjdGVkQ29tbWlzc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxNjIKICAgIC8vIHRoaXMuY29sbGVjdGVkQ29tbWlzc2lvbi52YWx1ZSA9IHRoaXMuY29sbGVjdGVkQ29tbWlzc2lvbi52YWx1ZSArIGNvbW1pc3Npb24KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTY1CiAgICAvLyB0aGlzLmxpc3RpbmdzKGxpc3RpbmdLZXkpLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxNjgtMTc0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogc2VsbGVyLAogICAgLy8gICAgIGFtb3VudDogQk9YX01CUiwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE3MQogICAgLy8gYW1vdW50OiBCT1hfTUJSLAogICAgaW50YyA0IC8vIDM1MzAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE2OC0xNzMKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBzZWxsZXIsCiAgICAvLyAgICAgYW1vdW50OiBCT1hfTUJSLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxNjgtMTc0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogc2VsbGVyLAogICAgLy8gICAgIGFtb3VudDogQk9YX01CUiwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxMjEKICAgIC8vIGJ1eU5mdChwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIHNlbGxlcjogQWNjb3VudCwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjpOZnRNYXJrZXRwbGFjZS5jYW5jZWxMaXN0aW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKY2FuY2VsTGlzdGluZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxODEKICAgIC8vIGNhbmNlbExpc3RpbmcoYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBjb25zdCBsaXN0aW5nS2V5OiBMaXN0aW5nS2V5ID0geyBzZWxsZXI6IFR4bi5zZW5kZXIsIGFzc2V0SWQ6IGFzc2V0LmlkIH0KICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo1MgogICAgLy8gbGlzdGluZ3MgPSBCb3hNYXA8TGlzdGluZ0tleSwgTGlzdGluZz4oeyBrZXlQcmVmaXg6ICdsJyB9KQogICAgYnl0ZWNfMSAvLyAibCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gYXNzZXJ0KHRoaXMubGlzdGluZ3MobGlzdGluZ0tleSkuZXhpc3RzLCAnTGlzdGluZyBkb2VzIG5vdCBleGlzdCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIExpc3RpbmcgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxODYKICAgIC8vIGNvbnN0IGxpc3RpbmcgPSBjbG9uZSh0aGlzLmxpc3RpbmdzKGxpc3RpbmdLZXkpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxODcKICAgIC8vIGFzc2VydChsaXN0aW5nLnNlbGxlciA9PT0gVHhuLnNlbmRlciwgJ09ubHkgc2VsbGVyIGNhbiBjYW5jZWwgbGlzdGluZycpCiAgICBleHRyYWN0IDAgMzIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBzZWxsZXIgY2FuIGNhbmNlbCBsaXN0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTkwLTE5NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAxLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTkyCiAgICAvLyBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gYXNzZXRBbW91bnQ6IDEsCiAgICBpbnRjXzAgLy8gMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTkwLTE5NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0LAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAxLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoxOTAtMTk3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDEsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjAwCiAgICAvLyB0aGlzLmxpc3RpbmdzKGxpc3RpbmdLZXkpLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyMDMtMjA5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IEJPWF9NQlIsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyMDUKICAgIC8vIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gYW1vdW50OiBCT1hfTUJSLAogICAgaW50YyA0IC8vIDM1MzAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjIwMy0yMDgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogQk9YX01CUiwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzAgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjIwNwogICAgLy8gZmVlOiAwLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjAzLTIwOQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBCT1hfTUJSLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjE4MQogICAgLy8gY2FuY2VsTGlzdGluZyhhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6Ok5mdE1hcmtldHBsYWNlLnVwZGF0ZVByaWNlW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlUHJpY2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyB1cGRhdGVQcmljZShhc3NldDogQXNzZXQsIG5ld1ByaWNlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyMTgKICAgIC8vIGFzc2VydChuZXdQcmljZSA+IDAsICdQcmljZSBtdXN0IGJlIHBvc2l0aXZlJykKICAgIGR1cAogICAgYXNzZXJ0IC8vIFByaWNlIG11c3QgYmUgcG9zaXRpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIGNvbnN0IGxpc3RpbmdLZXk6IExpc3RpbmdLZXkgPSB7IHNlbGxlcjogVHhuLnNlbmRlciwgYXNzZXRJZDogYXNzZXQuaWQgfQogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo1MgogICAgLy8gbGlzdGluZ3MgPSBCb3hNYXA8TGlzdGluZ0tleSwgTGlzdGluZz4oeyBrZXlQcmVmaXg6ICdsJyB9KQogICAgYnl0ZWNfMSAvLyAibCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjIyMwogICAgLy8gYXNzZXJ0KHRoaXMubGlzdGluZ3MobGlzdGluZ0tleSkuZXhpc3RzLCAnTGlzdGluZyBkb2VzIG5vdCBleGlzdCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIExpc3RpbmcgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyMjQKICAgIC8vIGNvbnN0IGxpc3RpbmcgPSBjbG9uZSh0aGlzLmxpc3RpbmdzKGxpc3RpbmdLZXkpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyMjUKICAgIC8vIGFzc2VydChsaXN0aW5nLnNlbGxlciA9PT0gVHhuLnNlbmRlciwgJ09ubHkgc2VsbGVyIGNhbiB1cGRhdGUgcHJpY2UnKQogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIGR1cAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHNlbGxlciBjYW4gdXBkYXRlIHByaWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjI2CiAgICAvLyBhc3NlcnQobGlzdGluZy5pc0FjdGl2ZSwgJ0xpc3RpbmcgaXMgbm90IGFjdGl2ZScpCiAgICBzd2FwCiAgICBwdXNoaW50IDMyMCAvLyAzMjAKICAgIGdldGJpdAogICAgYXNzZXJ0IC8vIExpc3RpbmcgaXMgbm90IGFjdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjIyOS0yMzMKICAgIC8vIHRoaXMubGlzdGluZ3MobGlzdGluZ0tleSkudmFsdWUgPSB7CiAgICAvLyAgIHNlbGxlcjogbGlzdGluZy5zZWxsZXIsCiAgICAvLyAgIHByaWNlOiBuZXdQcmljZSwKICAgIC8vICAgaXNBY3RpdmU6IHRydWUsCiAgICAvLyB9CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjIxNwogICAgLy8gdXBkYXRlUHJpY2UoYXNzZXQ6IEFzc2V0LCBuZXdQcmljZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjpOZnRNYXJrZXRwbGFjZS53aXRoZHJhd0NvbW1pc3Npb25bcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoZHJhd0NvbW1pc3Npb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjQxCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ09ubHkgYWRtaW4gY2FuIHdpdGhkcmF3IGNvbW1pc3Npb24nKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo0NgogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpCiAgICBieXRlY18yIC8vICJhZG1pbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyNDEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCAnT25seSBhZG1pbiBjYW4gd2l0aGRyYXcgY29tbWlzc2lvbicpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGFkbWluIGNhbiB3aXRoZHJhdyBjb21taXNzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBjb25zdCBjb21taXNzaW9uID0gdGhpcy5jb2xsZWN0ZWRDb21taXNzaW9uLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBjb2xsZWN0ZWRDb21taXNzaW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18wIC8vICJjb2xsZWN0ZWRDb21taXNzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjI0MwogICAgLy8gY29uc3QgY29tbWlzc2lvbiA9IHRoaXMuY29sbGVjdGVkQ29tbWlzc2lvbi52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyNDQKICAgIC8vIGFzc2VydChjb21taXNzaW9uID4gMCwgJ05vIGNvbW1pc3Npb24gdG8gd2l0aGRyYXcnKQogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gY29tbWlzc2lvbiB0byB3aXRoZHJhdwogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBjb2xsZWN0ZWRDb21taXNzaW9uID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18wIC8vICJjb2xsZWN0ZWRDb21taXNzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gdGhpcy5jb2xsZWN0ZWRDb21taXNzaW9uLnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyNTAtMjU2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5hZG1pbi52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IGNvbW1pc3Npb24sCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFkbWluLnZhbHVlLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo0NgogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpCiAgICBieXRlY18yIC8vICJhZG1pbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIHJlY2VpdmVyOiB0aGlzLmFkbWluLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjUwLTI1NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHRoaXMuYWRtaW4udmFsdWUsCiAgICAvLyAgICAgYW1vdW50OiBjb21taXNzaW9uLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjU0CiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyNTAtMjU2CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogdGhpcy5hZG1pbi52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ6IGNvbW1pc3Npb24sCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjM5CiAgICAvLyB3aXRoZHJhd0NvbW1pc3Npb24oKTogdm9pZCB7CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjpOZnRNYXJrZXRwbGFjZS5nZXRMaXN0aW5nW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0TGlzdGluZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyNjUtMjY2CiAgICAvLyBAcmVhZG9ubHkKICAgIC8vIGdldExpc3Rpbmcoc2VsbGVyOiBBY2NvdW50LCBhc3NldElkOiB1aW50NjQpOiBMaXN0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyNjcKICAgIC8vIGNvbnN0IGxpc3RpbmdLZXk6IExpc3RpbmdLZXkgPSB7IHNlbGxlcjogc2VsbGVyLCBhc3NldElkOiBhc3NldElkIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBsaXN0aW5ncyA9IEJveE1hcDxMaXN0aW5nS2V5LCBMaXN0aW5nPih7IGtleVByZWZpeDogJ2wnIH0pCiAgICBieXRlY18xIC8vICJsIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjY4CiAgICAvLyBhc3NlcnQodGhpcy5saXN0aW5ncyhsaXN0aW5nS2V5KS5leGlzdHMsICdMaXN0aW5nIGRvZXMgbm90IGV4aXN0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTGlzdGluZyBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjI2OQogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMubGlzdGluZ3MobGlzdGluZ0tleSkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyNjUtMjY2CiAgICAvLyBAcmVhZG9ubHkKICAgIC8vIGdldExpc3Rpbmcoc2VsbGVyOiBBY2NvdW50LCBhc3NldElkOiB1aW50NjQpOiBMaXN0aW5nIHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6Ok5mdE1hcmtldHBsYWNlLmxpc3RpbmdFeGlzdHNbcm91dGluZ10oKSAtPiB2b2lkOgpsaXN0aW5nRXhpc3RzOgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjI3OC0yNzkKICAgIC8vIEByZWFkb25seQogICAgLy8gbGlzdGluZ0V4aXN0cyhzZWxsZXI6IEFjY291bnQsIGFzc2V0SWQ6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gY29uc3QgbGlzdGluZ0tleTogTGlzdGluZ0tleSA9IHsgc2VsbGVyOiBzZWxsZXIsIGFzc2V0SWQ6IGFzc2V0SWQgfQogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGxpc3RpbmdzID0gQm94TWFwPExpc3RpbmdLZXksIExpc3Rpbmc+KHsga2V5UHJlZml4OiAnbCcgfSkKICAgIGJ5dGVjXzEgLy8gImwiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyODEKICAgIC8vIHJldHVybiB0aGlzLmxpc3RpbmdzKGxpc3RpbmdLZXkpLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6Mjc4LTI3OQogICAgLy8gQHJlYWRvbmx5CiAgICAvLyBsaXN0aW5nRXhpc3RzKHNlbGxlcjogQWNjb3VudCwgYXNzZXRJZDogdWludDY0KTogYm9vbGVhbiB7CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjpOZnRNYXJrZXRwbGFjZS5nZXRDb2xsZWN0ZWRDb21taXNzaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0Q29sbGVjdGVkQ29tbWlzc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyOTAKICAgIC8vIHJldHVybiB0aGlzLmNvbGxlY3RlZENvbW1pc3Npb24udmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIGNvbGxlY3RlZENvbW1pc3Npb24gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjXzAgLy8gImNvbGxlY3RlZENvbW1pc3Npb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6MjkwCiAgICAvLyByZXR1cm4gdGhpcy5jb2xsZWN0ZWRDb21taXNzaW9uLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjI4OC0yODkKICAgIC8vIEByZWFkb25seQogICAgLy8gZ2V0Q29sbGVjdGVkQ29tbWlzc2lvbigpOiB1aW50NjQgewogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czo6TmZ0TWFya2V0cGxhY2UuZ2V0QWRtaW5bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRBZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9uZnRfbWFya2V0cGxhY2UvY29udHJhY3QuYWxnby50czoyOTkKICAgIC8vIHJldHVybiB0aGlzLmFkbWluLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCkKICAgIGJ5dGVjXzIgLy8gImFkbWluIgogICAgLy8gc21hcnRfY29udHJhY3RzL25mdF9tYXJrZXRwbGFjZS9jb250cmFjdC5hbGdvLnRzOjI5OQogICAgLy8gcmV0dXJuIHRoaXMuYWRtaW4udmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbmZ0X21hcmtldHBsYWNlL2NvbnRyYWN0LmFsZ28udHM6Mjk3LTI5OAogICAgLy8gQHJlYWRvbmx5CiAgICAvLyBnZXRBZG1pbigpOiBBY2NvdW50IHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAQAIBOSTAiYEE2NvbGxlY3RlZENvbW1pc3Npb24BbAVhZG1pbgQVH3x1MRhAAAMoI2cxGRREMRhBAE6CCgRpV1tABCezPsUE8Lx2fAS2OdS8BJJSWTcENmxJUASeahCmBBG0G6YEHDVTZgSsiyTeNhoAjgoAFQBMALEBSgGSAdEB9AIYAj8CSgCABLhEezY2GgCOAQABACoxAGciQzEWIglJOBAiEkQ2GgFJFSQSRBdLATgHMgoSREw4CIGgjQYPRLEyCiOyErIUshElshAjsgGzIkMxFoECCUk4ECISRDEWIglJOBAlEkQ2GgFJFSQSRBdJREsCOAcyChJETwI4CCEED0RLATgUMgoSREsBOBIiEkRLATgAMQASREw4ETEATBZQKUxQSb1FARREMQBPAhZQgAGAUL8iQzEWIglJOBAiEkQ2GgFJFYEgEkQ2GgJJFSQSRBdJFksCTFApTFBJvUUBREm+SEmBwAJTRElXACBLBBJEgSBbSYEZC4HoBwpKCUsGOAcyChJETwY4CE8DD0QxAEsFE0SxMQAishJPBLIRshQlshAjsgGzsbIISwKyByKyECOyAbMjKGVECChMZ7xIsSEEsgiyByKyECOyAbMiQzYaAUkVJBJEFzEASwEWUClMUEm9RQFESb5IVwAgMQASRLExACKyEk8CshGyFCWyECOyAbO8SLExACEEsgiyByKyECOyAbMiQzYaAUkVJBJEFzYaAkkVJBJEF0lEMQBPAhZQKUxQSb1FAURJvkhJVwAgSTEAEkRMgcACU0RPAhZQgAGAUL8iQzEAIyplRBJEIyhlRElEKCNnsSMqZUSyB7IIIrIQI7IBsyJDNhoBSRWBIBJENhoCSRUkEkQXFlApTFBJvUUBRL5IK0xQsCJDNhoBSRWBIBJENhoCSRUkEkQXFlApTFC9RQGAAQAjTwJUK0xQsCJDIyhlRBYrTFCwIkMjKmVEK0xQsCJD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }