{ "name": "ConstantProductAMM", "structs": {}, "methods": [ { "name": "set_governor", "args": [ { "type": "address", "name": "new_governor" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "sets the governor of the contract, may only be called by the current governor", "events": [], "recommendations": {} }, { "name": "bootstrap", "args": [ { "type": "pay", "name": "seed", "desc": "Initial Payment transaction to the app account so it can opt in to assets and create pool token." }, { "type": "asset", "name": "a_asset", "desc": "One of the two assets this pool should allow swapping between." }, { "type": "asset", "name": "b_asset", "desc": "The other of the two assets this pool should allow swapping between." } ], "returns": { "type": "uint64", "desc": "The asset id of the pool token created." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "bootstraps the contract by opting into the assets and creating the pool token.\nNote this method will fail if it is attempted more than once on the same contract since the assets and pool token application state values are marked as static and cannot be overridden.", "events": [], "recommendations": {} }, { "name": "mint", "args": [ { "type": "axfer", "name": "a_xfer", "desc": "Asset Transfer Transaction of asset A as a deposit to the pool in exchange for pool tokens." }, { "type": "axfer", "name": "b_xfer", "desc": "Asset Transfer Transaction of asset B as a deposit to the pool in exchange for pool tokens." }, { "type": "asset", "name": "pool_asset", "desc": "The asset ID of the pool token so that we may distribute it.", "defaultValue": { "source": "global", "data": "cG9vbF90b2tlbg==", "type": "AVMString" } }, { "type": "asset", "name": "a_asset", "desc": "The asset ID of the Asset A so that we may inspect our balance.", "defaultValue": { "source": "global", "data": "YXNzZXRfYQ==", "type": "AVMString" } }, { "type": "asset", "name": "b_asset", "desc": "The asset ID of the Asset B so that we may inspect our balance.", "defaultValue": { "source": "global", "data": "YXNzZXRfYg==", "type": "AVMString" } } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "mint pool tokens given some amount of asset A and asset B.\nGiven some amount of Asset A and Asset B in the transfers, mint some number of pool tokens commensurate with the pools current balance and circulating supply of pool tokens.", "events": [], "recommendations": {} }, { "name": "burn", "args": [ { "type": "axfer", "name": "pool_xfer", "desc": "Asset Transfer Transaction of the pool token for the amount the sender wishes to redeem" }, { "type": "asset", "name": "pool_asset", "desc": "Asset ID of the pool token so we may inspect balance.", "defaultValue": { "source": "global", "data": "cG9vbF90b2tlbg==", "type": "AVMString" } }, { "type": "asset", "name": "a_asset", "desc": "Asset ID of Asset A so we may inspect balance and distribute it", "defaultValue": { "source": "global", "data": "YXNzZXRfYQ==", "type": "AVMString" } }, { "type": "asset", "name": "b_asset", "desc": "Asset ID of Asset B so we may inspect balance and distribute it", "defaultValue": { "source": "global", "data": "YXNzZXRfYg==", "type": "AVMString" } } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "burn pool tokens to get back some amount of asset A and asset B", "events": [], "recommendations": {} }, { "name": "swap", "args": [ { "type": "axfer", "name": "swap_xfer", "desc": "Asset Transfer Transaction of either Asset A or Asset B" }, { "type": "asset", "name": "a_asset", "desc": "Asset ID of asset A so we may inspect balance and possibly transfer it", "defaultValue": { "source": "global", "data": "YXNzZXRfYQ==", "type": "AVMString" } }, { "type": "asset", "name": "b_asset", "desc": "Asset ID of asset B so we may inspect balance and possibly transfer it", "defaultValue": { "source": "global", "data": "YXNzZXRfYg==", "type": "AVMString" } } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Swap some amount of either asset A or asset B for the other", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 4, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "asset_a": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXNzZXRfYQ==" }, "asset_b": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXNzZXRfYg==" }, "governor": { "keyType": "AVMString", "valueType": "address", "key": "Z292ZXJub3I=" }, "pool_token": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cG9vbF90b2tlbg==" }, "ratio": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmF0aW8=" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 948 ], "errorMessage": "Only the account set in global_state.governor may call this method" }, { "pc": [ 958, 968, 978 ], "errorMessage": "account opted into asset" }, { "pc": [ 247, 482, 505, 702, 839 ], "errorMessage": "amount minimum not met" }, { "pc": [ 220 ], "errorMessage": "application has already been bootstrapped" }, { "pc": [ 431, 473, 680, 821 ], "errorMessage": "asset a incorrect" }, { "pc": [ 250 ], "errorMessage": "asset a must be less than asset b" }, { "pc": [ 441, 498, 688, 831 ], "errorMessage": "asset b incorrect" }, { "pc": [ 266, 282 ], "errorMessage": "asset exists" }, { "pc": [ 858 ], "errorMessage": "asset id incorrect" }, { "pc": [ 421, 672, 710 ], "errorMessage": "asset pool incorrect" }, { "pc": [ 417, 666, 811 ], "errorMessage": "bootstrap method needs to be called first" }, { "pc": [ 263, 323, 425, 676, 753, 815, 921, 965 ], "errorMessage": "check self.asset_a exists" }, { "pc": [ 334, 435, 684, 764, 825, 870, 975 ], "errorMessage": "check self.asset_b exists" }, { "pc": [ 946 ], "errorMessage": "check self.governor exists" }, { "pc": [ 218, 345, 415, 550, 664, 810, 955 ], "errorMessage": "check self.pool_token exists" }, { "pc": [ 229 ], "errorMessage": "group size not 2" }, { "pc": [ 174 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 200, 211, 386, 397, 408, 635, 646, 657, 792, 803 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ 237, 465, 490, 696 ], "errorMessage": "receiver not app address" }, { "pc": [ 544, 897 ], "errorMessage": "send amount too low" }, { "pc": [ 449, 457, 717, 847 ], "errorMessage": "sender invalid" }, { "pc": [ 368, 378, 627, 784 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 192 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMTAwMCA0IDEwMDAwMDAwMDAwCiAgICBieXRlY2Jsb2NrICJhc3NldF9hIiAiYXNzZXRfYiIgInBvb2xfdG9rZW4iICJnb3Zlcm5vciIgInJhdGlvIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBBCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBBc3NldCgpCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQtMzUKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIGFzc2V0IEIKICAgIC8vIHNlbGYuYXNzZXRfYiA9IEFzc2V0KCkKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBUaGUgY3VycmVudCBnb3Zlcm5vciBvZiB0aGlzIGNvbnRyYWN0LCBhbGxvd2VkIHRvIGRvIGFkbWluIHR5cGUgYWN0aW9ucwogICAgLy8gc2VsZi5nb3Zlcm5vciA9IFR4bi5zZW5kZXIKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozOC0zOQogICAgLy8gIyBUaGUgYXNzZXQgaWQgb2YgdGhlIFBvb2wgVG9rZW4sIHVzZWQgdG8gdHJhY2sgc2hhcmUgb2YgcG9vbCB0aGUgaG9sZGVyIG1heSByZWNvdmVyCiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBBc3NldCgpCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDAtNDEKICAgIC8vICMgVGhlIHJhdGlvIGJldHdlZW4gYXNzZXRzIChBKlNjYWxlL0IpCiAgICAvLyBzZWxmLnJhdGlvID0gVUludDY0KDApCiAgICBieXRlYyA0IC8vICJyYXRpbyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGRkYzRjYjRhIDB4NmI1OWQ5NjUgMHg1Y2JmMWUyZCAweDE0MzZjMmFjIDB4NGE4OGUwNTUgLy8gbWV0aG9kICJzZXRfZ292ZXJub3IoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJib290c3RyYXAocGF5LGFzc2V0LGFzc2V0KXVpbnQ2NCIsIG1ldGhvZCAibWludChheGZlcixheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJidXJuKGF4ZmVyLGFzc2V0LGFzc2V0LGFzc2V0KXZvaWQiLCBtZXRob2QgInN3YXAoYXhmZXIsYXNzZXQsYXNzZXQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHNldF9nb3Zlcm5vciBib290c3RyYXAgbWludCBidXJuIHN3YXAKICAgIGVycgoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAxNDoKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LmRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRvX2Fzc2V0X3RyYW5zZmVyOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1OS0zNjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZG9fYXNzZXRfdHJhbnNmZXIoKiwgcmVjZWl2ZXI6IEFjY291bnQsIGFzc2V0OiBBc3NldCwgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozNjEtMzY1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM2MQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18zIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGFtbS9jb250cmFjdC5weTozNjEtMzY1CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc2V0X2dvdmVybm9yW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2dvdmVybm9yOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBzZWxmLl9jaGVja19pc19nb3Zlcm5vcigpCiAgICBjYWxsc3ViIF9jaGVja19pc19nb3Zlcm5vcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBzZWxmLmdvdmVybm9yID0gbmV3X2dvdmVybm9yCiAgICBieXRlY18zIC8vICJnb3Zlcm5vciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5ib290c3RyYXBbcm91dGluZ10oKSAtPiB2b2lkOgpib290c3RyYXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weTo2NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnBvb2xfdG9rZW4sICJhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGJvb3RzdHJhcHBlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weTo2NwogICAgLy8gc2VsZi5fY2hlY2tfaXNfZ292ZXJub3IoKQogICAgY2FsbHN1YiBfY2hlY2tfaXNfZ292ZXJub3IKICAgIC8vIGFtbS9jb250cmFjdC5weTo2OAogICAgLy8gYXNzZXJ0IEdsb2JhbC5ncm91cF9zaXplID09IDIsICJncm91cCBzaXplIG5vdCAyIgogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGdyb3VwIHNpemUgbm90IDIKICAgIC8vIGFtbS9jb250cmFjdC5weTo2OQogICAgLy8gYXNzZXJ0IHNlZWQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzEKICAgIC8vIGFzc2VydCBzZWVkLmFtb3VudCA+PSAzMDBfMDAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIgICMgMC4zIEFsZ29zCiAgICB1bmNvdmVyIDIKICAgIGd0eG5zIEFtb3VudAogICAgcHVzaGludCAzMDAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBhc3NlcnQgYV9hc3NldC5pZCA8IGJfYXNzZXQuaWQsICJhc3NldCBhIG11c3QgYmUgbGVzcyB0aGFuIGFzc2V0IGIiCiAgICBkdXAyCiAgICA8CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBtdXN0IGJlIGxlc3MgdGhhbiBhc3NldCBiCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzMKICAgIC8vIHNlbGYuYXNzZXRfYSA9IGFfYXNzZXQKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzQKICAgIC8vIHNlbGYuYXNzZXRfYiA9IGJfYXNzZXQKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzQtMjgyCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGFtbS9jb250cmFjdC5weToyNzUKICAgIC8vIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIHB1c2hieXRlcyAweDQ0NTA1NDJkCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDJkCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgY29uY2F0CiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc5CiAgICAvLyBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0UmVzZXJ2ZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE1hbmFnZXIKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzgKICAgIC8vIGRlY2ltYWxzPTMsCiAgICBwdXNoaW50IDMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NwogICAgLy8gdG90YWw9VE9UQUxfU1VQUExZLAogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzYKICAgIC8vIHVuaXRfbmFtZT1iImRidCIsCiAgICBwdXNoYnl0ZXMgMHg2NDYyNzQKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzQKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc0LTI4MgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBzZWxmLl9jcmVhdGVfcG9vbF90b2tlbigpCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NC0yODMKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXNzZXQKICAgIGl0eG4gQ3JlYXRlZEFzc2V0SUQKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NQogICAgLy8gc2VsZi5wb29sX3Rva2VuID0gc2VsZi5fY3JlYXRlX3Bvb2xfdG9rZW4oKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFtbS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5fZG9fb3B0X2luKHNlbGYuYXNzZXRfYSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg5CiAgICAvLyByZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToyODgtMjkyCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICByZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0PWFzc2V0LAogICAgLy8gICAgIGFtb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBzd2FwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjkxCiAgICAvLyBhbW91bnQ9VUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyODgtMjkyCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICByZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0PWFzc2V0LAogICAgLy8gICAgIGFtb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzgKICAgIC8vIHNlbGYuX2RvX29wdF9pbihzZWxmLmFzc2V0X2IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4OQogICAgLy8gcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg4LTI5MgogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldD1hc3NldCwKICAgIC8vICAgICBhbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgc3dhcAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg4LTI5MgogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldD1hc3NldCwKICAgIC8vICAgICBhbW91bnQ9VUludDY0KDApLAogICAgLy8gKQogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyByZXR1cm4gc2VsZi5wb29sX3Rva2VuLmlkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0ubWludFtyb3V0aW5nXSgpIC0+IHZvaWQ6Cm1pbnQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6ODEtODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjU2CiAgICAvLyBhc3NlcnQgc2VsZi5wb29sX3Rva2VuLCAiYm9vdHN0cmFwIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gYm9vdHN0cmFwIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTQtMTE1CiAgICAvLyAjIHdlbGwtZm9ybWVkIG1pbnQKICAgIC8vIGFzc2VydCBwb29sX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgYV94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBkaWcgMwogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE5CiAgICAvLyBhc3NlcnQgYl94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBkaWcgMgogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTIzCiAgICAvLyBhX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZGlnIDMKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyMS0xMjQKICAgIC8vICMgdmFsaWQgYXNzZXQgYSB4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGFfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gYXNzZXJ0IGFfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYuYXNzZXRfYSwgImFzc2V0IGEgaW5jb3JyZWN0IgogICAgZGlnIDMKICAgIGd0eG5zIFhmZXJBc3NldAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTI2CiAgICAvLyBhc3NlcnQgYV94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgdW5jb3ZlciAyCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTMwCiAgICAvLyBiX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZGlnIDIKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyOC0xMzEKICAgIC8vICMgdmFsaWQgYXNzZXQgYiB4ZmVyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGJfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgZGlnIDIKICAgIGd0eG5zIFhmZXJBc3NldAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTMzCiAgICAvLyBhc3NlcnQgYl94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgc3dhcAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzYKICAgIC8vIHBvb2xfYmFsYW5jZT1zZWxmLl9jdXJyZW50X3Bvb2xfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9wb29sX2JhbGFuY2UKICAgIHN3YXAKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzcKICAgIC8vIGFfYmFsYW5jZT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gYl9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgY292ZXIgMwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gaXNfaW5pdGlhbF9taW50ID0gYV9iYWxhbmNlID09IGFfYW1vdW50IGFuZCBiX2JhbGFuY2UgPT0gYl9hbW91bnQKICAgID09CiAgICBieiBtaW50X2Jvb2xfZmFsc2VANAogICAgZGlnIDEKICAgIGRpZyA1CiAgICA9PQogICAgYnogbWludF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgptaW50X2Jvb2xfbWVyZ2VANToKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzUKICAgIC8vIGlmIGlzX2luaXRpYWxfbWludDoKICAgIGJ6IG1pbnRfYWZ0ZXJfaWZfZWxzZUA3CiAgICBwb3BuIDMKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzYKICAgIC8vIHJldHVybiBvcC5zcXJ0KGFfYW1vdW50ICogYl9hbW91bnQpIC0gU0NBTEUKICAgICoKICAgIHNxcnQKICAgIGludGNfMiAvLyAxMDAwCiAgICAtCgptaW50X2FmdGVyX2lubGluZWRfZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19taW50QDEwOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0MgogICAgLy8gYXNzZXJ0IHRvX21pbnQgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDQtMTQ1CiAgICAvLyAjIG1pbnQgdG9rZW5zCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLnBvb2xfdG9rZW4sIGFtb3VudD10b19taW50KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gICAgIHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptaW50X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzcKICAgIC8vIGlzc3VlZCA9IFRPVEFMX1NVUFBMWSAtIHBvb2xfYmFsYW5jZQogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICBzd2FwCiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM4CiAgICAvLyBhX3JhdGlvID0gU0NBTEUgKiBhX2Ftb3VudCAvLyAoYV9iYWxhbmNlIC0gYV9hbW91bnQpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgdW5jb3ZlciA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgICoKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICAtCiAgICAvCiAgICBkdXAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzkKICAgIC8vIGJfcmF0aW8gPSBTQ0FMRSAqIGJfYW1vdW50IC8vIChiX2JhbGFuY2UgLSBiX2Ftb3VudCkKICAgIGludGNfMiAvLyAxMDAwCiAgICB1bmNvdmVyIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgKgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDIKICAgIC0KICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0MAogICAgLy8gaWYgYV9yYXRpbyA8IGJfcmF0aW86CiAgICA8CiAgICBieiBtaW50X2Vsc2VfYm9keUA5CiAgICBwb3AKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDEKICAgIC8vIHJldHVybiBhX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNS0xNDEKICAgIC8vIHRvX21pbnQgPSB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICBwb29sX2JhbGFuY2U9c2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2JhbGFuY2U9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBiX2JhbGFuY2U9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2Ftb3VudD1hX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gICAgIGJfYW1vdW50PWJfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyApCiAgICBiIG1pbnRfYWZ0ZXJfaW5saW5lZF9leGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX21pbnRAMTAKCm1pbnRfZWxzZV9ib2R5QDk6CiAgICBidXJ5IDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDMKICAgIC8vIHJldHVybiBiX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICAqCiAgICBpbnRjXzIgLy8gMTAwMAogICAgLwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzNS0xNDEKICAgIC8vIHRvX21pbnQgPSB0b2tlbnNfdG9fbWludCgKICAgIC8vICAgICBwb29sX2JhbGFuY2U9c2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2JhbGFuY2U9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBiX2JhbGFuY2U9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhX2Ftb3VudD1hX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gICAgIGJfYW1vdW50PWJfeGZlci5hc3NldF9hbW91bnQsCiAgICAvLyApCiAgICBiIG1pbnRfYWZ0ZXJfaW5saW5lZF9leGFtcGxlcy5hbW0uY29udHJhY3QudG9rZW5zX3RvX21pbnRAMTAKCm1pbnRfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgbWludF9ib29sX21lcmdlQDUKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmJ1cm5bcm91dGluZ10oKSAtPiB2b2lkOgpidXJuOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0OC0xNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyAgICAgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IiwKICAgIC8vICkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTYKICAgIC8vIGFzc2VydCBzZWxmLnBvb2xfdG9rZW4sICJib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydCAvLyBib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IHBvb2xfYXNzZXQgPT0gc2VsZi5wb29sX3Rva2VuLCAiYXNzZXQgcG9vbCBpbmNvcnJlY3QiCiAgICB1bmNvdmVyIDMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc1CiAgICAvLyBhc3NlcnQgYV9hc3NldCA9PSBzZWxmLmFzc2V0X2EsICJhc3NldCBhIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzYKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3OQogICAgLy8gcG9vbF94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGRpZyAxCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxNzgtMTgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHBvb2xfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAicmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzIgogICAgYXNzZXJ0IC8vIHJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gYXNzZXJ0IHBvb2xfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGRpZyAxCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gYXNzZXJ0IHBvb2xfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgZGlnIDIKICAgIGd0eG5zIFhmZXJBc3NldAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgzCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBzd2FwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxODUtMTg3CiAgICAvLyAjIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBpc3N1ZWQKICAgIC8vICMgIWltcG9ydGFudDogdGhpcyBoYXBwZW5zIHByaW9yIHRvIHJlY2VpdmluZyB0aGUgY3VycmVudCBheGZlciBvZiBwb29sIHRva2VucwogICAgLy8gcG9vbF9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9wb29sX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9wb29sX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxOTAKICAgIC8vIHN1cHBseT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDgKICAgIC8vIGlzc3VlZCA9IFRPVEFMX1NVUFBMWSAtIHBvb2xfYmFsYW5jZSAtIGFtb3VudAogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGRpZyAyCiAgICAtCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ5CiAgICAvLyByZXR1cm4gc3VwcGx5ICogYW1vdW50IC8vIGlzc3VlZAogICAgc3dhcAogICAgZGlnIDIKICAgICoKICAgIGRpZyAxCiAgICAvCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTk1CiAgICAvLyBzdXBwbHk9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQ5CiAgICAvLyByZXR1cm4gc3VwcGx5ICogYW1vdW50IC8vIGlzc3VlZAogICAgdW5jb3ZlciAzCiAgICAqCiAgICB1bmNvdmVyIDIKICAgIC8KICAgIC8vIGFtbS9jb250cmFjdC5weToxOTktMjAwCiAgICAvLyAjIFNlbmQgYmFjayBjb21tZW5zdXJhdGUgYW10IG9mIGEKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PXNlbGYuYXNzZXRfYSwgYW1vdW50PWFfYW10KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwMi0yMDMKICAgIC8vICMgU2VuZCBiYWNrIGNvbW1lbnN1cmF0ZSBhbXQgb2YgYgogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIocmVjZWl2ZXI9VHhuLnNlbmRlciwgYXNzZXQ9c2VsZi5hc3NldF9iLCBhbW91bnQ9Yl9hbXQpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA0CiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ4LTE1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICAgICByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiLAogICAgLy8gKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc3dhcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA2LTIxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gICAgIHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIsCiAgICAvLyApCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTYKICAgIC8vIGFzc2VydCBzZWxmLnBvb2xfdG9rZW4sICJib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICBhc3NlcnQgLy8gYm9vdHN0cmFwIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBhX2Fzc2V0ID09IHNlbGYuYXNzZXRfYSwgImFzc2V0IGEgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjkKICAgIC8vIGFzc2VydCBiX2Fzc2V0ID09IHNlbGYuYXNzZXRfYiwgImFzc2V0IGIgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzEKICAgIC8vIGFzc2VydCBzd2FwX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBkaWcgMgogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgY292ZXIgNAogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzIKICAgIC8vIGFzc2VydCBzd2FwX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGRpZyAyCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzQKICAgIC8vIG1hdGNoIHN3YXBfeGZlci54ZmVyX2Fzc2V0OgogICAgdW5jb3ZlciAyCiAgICBndHhucyBYZmVyQXNzZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzQtMjQ0CiAgICAvLyBtYXRjaCBzd2FwX3hmZXIueGZlcl9hc3NldDoKICAgIC8vICAgICBjYXNlIHNlbGYuYXNzZXRfYToKICAgIC8vICAgICAgICAgaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2EKICAgIC8vICAgICBjYXNlIHNlbGYuYXNzZXRfYjoKICAgIC8vICAgICAgICAgaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2IKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIGFzc2VydCBGYWxzZSwgImFzc2V0IGlkIGluY29ycmVjdCIKICAgIG1hdGNoIHN3YXBfc3dpdGNoX2Nhc2VfMEAyIHN3YXBfc3dpdGNoX2Nhc2VfMUAzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ0CiAgICAvLyBhc3NlcnQgRmFsc2UsICJhc3NldCBpZCBpbmNvcnJlY3QiCiAgICBlcnIgLy8gYXNzZXQgaWQgaW5jb3JyZWN0Cgpzd2FwX3N3aXRjaF9jYXNlXzFAMzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDAKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICBzd2FwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQxCiAgICAvLyBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIHN3YXAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDIKICAgIC8vIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKCnN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA1OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1NAogICAgLy8gaW5fdG90YWwgPSBTQ0FMRSAqIChpbl9zdXBwbHkgLSBpbl9hbW91bnQpICsgKGluX2Ftb3VudCAqIEZBQ1RPUikKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC0KICAgIGludGNfMiAvLyAxMDAwCiAgICAqCiAgICBzd2FwCiAgICBwdXNoaW50IDk5NQogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgICsKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTUKICAgIC8vIG91dF90b3RhbCA9IGluX2Ftb3VudCAqIEZBQ1RPUiAqIG91dF9zdXBwbHkKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgKgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gcmV0dXJuIG91dF90b3RhbCAvLyBpbl90b3RhbAogICAgc3dhcAogICAgLwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gYXNzZXJ0IHRvX3N3YXAgPiAwLCAic2VuZCBhbW91bnQgdG9vIGxvdyIKICAgIGR1cAogICAgYXNzZXJ0IC8vIHNlbmQgYW1vdW50IHRvbyBsb3cKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTEKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PW91dF9hc3NldCwgYW1vdW50PXRvX3N3YXApCiAgICB0eG4gU2VuZGVyCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIGRvX2Fzc2V0X3RyYW5zZmVyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjUyCiAgICAvLyBzZWxmLl91cGRhdGVfcmF0aW8oKQogICAgY2FsbHN1YiBfdXBkYXRlX3JhdGlvCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjA2LTIxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gICAgIHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzd2FwX3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzYKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICBzd2FwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjM3CiAgICAvLyBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIHN3YXAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzgKICAgIC8vIG91dF9hc3NldCA9IHNlbGYuYXNzZXRfYQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGIgc3dhcF9zd2l0Y2hfY2FzZV9uZXh0QDUKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl91cGRhdGVfcmF0aW8oKSAtPiB2b2lkOgpfdXBkYXRlX3JhdGlvOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gYV9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyNjEKICAgIC8vIGJfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjYzCiAgICAvLyBzZWxmLnJhdGlvID0gYV9iYWxhbmNlICogU0NBTEUgLy8gYl9iYWxhbmNlCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMTAwMAogICAgKgogICAgc3dhcAogICAgLwogICAgYnl0ZWMgNCAvLyAicmF0aW8iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfaXNfZ292ZXJub3IoKSAtPiB2b2lkOgpfY2hlY2tfaXNfZ292ZXJub3I6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY4CiAgICAvLyBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnb3Zlcm5vciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nb3Zlcm5vciBleGlzdHMKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjY3LTI2OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBUeG4uc2VuZGVyID09IHNlbGYuZ292ZXJub3IKICAgIC8vICksICJPbmx5IHRoZSBhY2NvdW50IHNldCBpbiBnbG9iYWxfc3RhdGUuZ292ZXJub3IgbWF5IGNhbGwgdGhpcyBtZXRob2QiCiAgICBhc3NlcnQgLy8gT25seSB0aGUgYWNjb3VudCBzZXQgaW4gZ2xvYmFsX3N0YXRlLmdvdmVybm9yIG1heSBjYWxsIHRoaXMgbWV0aG9kCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jdXJyZW50X3Bvb2xfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKX2N1cnJlbnRfcG9vbF9iYWxhbmNlOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gcmV0dXJuIHNlbGYucG9vbF90b2tlbi5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3VycmVudF9hX2JhbGFuY2UoKSAtPiB1aW50NjQ6Cl9jdXJyZW50X2FfYmFsYW5jZToKICAgIC8vIGFtbS9jb250cmFjdC5weTozMDAKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X2EuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfYl9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9iX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzA0CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9iLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAHoBwSAyK+gJSYFB2Fzc2V0X2EHYXNzZXRfYgpwb29sX3Rva2VuCGdvdmVybm9yBXJhdGlvMRhAABEoImcpImcrMQBnKiJnJwQiZzEbQQAyMRkURDEYRIIFBN3Ey0oEa1nZZQRcvx4tBBQ2wqwESojgVTYaAI4FACEAMgDhAeUCggAxGRQxGBQQQ4oDALGL/bIUi/+yEov+shElshAisgGziTYaAUkVgSASRIgC+ytMZyNDMRYjCUk4ECMSRDYaAUkVIxJEF8AwNhoCSRUjEkQXwDAiKmVEFESIAs0yBIECEkRLAjgHMgoSRE8COAiB4KcSD0RKDEQoTwJnKUsBZ7EiKGVEcQNEgAREUFQtTFCAAS1QTHEDRFAyCkmyKrIpgQOyIyEEsiKAA2RidLIlsiaBA7IQIrIBsyq0PGciKGVEMgpMIoj/QyIpZUQyCkwiiP84IiplRBaABBUffHVMULAjQzEWgQIJSTgQJRJEMRYjCUk4ECUSRDYaAUkVIxJEF8AwNhoCSRUjEkQXwDA2GgNJFSMSRBfAMCIqZURJRE8DEkQiKGVETwJLARJEIillRE8CSwESREsDOAAxABJESwI4ADEAEkRLAzgUMgoSREsDOBFPAhJETwI4EklOA0lESwI4FDIKEkRLAjgRTwISREw4EklOA0SIAblMiAG/SU4DiAHDTgMSQQBZSwFLBRJBAFEjQQAYRgMLkiQJSUQxACIqZURPAoj+YogBbiNDIQRMCSRPBElOAgtPBE8CCQpJJE8FSU4CC08FTwIJCklOAgxBAAdICyQKQv/BRQELJApC/7kiQv+sMRYjCUk4ECUSRDYaAUkVIxJEF8AwNhoCSRUjEkQXwDA2GgNJFSMSRBfAMCIqZURJRE8DSwESRCIoZURPAxJEIillRE8CEkRLATgUMgoSREsBOBJJREsCOBFPAhJETDgAMQASRIgA5YgA7CEETwIJSwIJTEsCC0sBCogA5E8DC08CCjEAIihlRE8DiP2XMQAiKWVETwKI/YyIAJgjQzEWIwlJOBAlEkQ2GgFJFSMSRBfAMDYaAkkVIxJEF8AwIiplREQiKGVETwJLARJEIillRE8CSwESREsCOBJJTgRESwI4ADEAEkRPAjgRjgIANAABAIgAYkyIAGhMIillRE8DTwJJTgIJJAtMgeMHC0xLAQhMTwMLTApJRDEATgKI/QWIABEjQ4gAOUyIACtMIihlREL/yogAIIgAJ0wkC0wKJwRMZ4kxACIrZUQSRIkyCiIqZURwAESJMgoiKGVEcABEiTIKIillRHAARIk=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 99, "minor": 99, "patch": 99 } }, "events": [], "templateVariables": {} }