{ "name": "GuessGame", "structs": { "Object0B783EB4": [ { "name": "sum", "type": "uint64" }, { "name": "count", "type": "uint64" } ], "ObjectB555233E": [ { "name": "startAt", "type": "uint64" }, { "name": "endCommitAt", "type": "uint64" }, { "name": "endRevealAt", "type": "uint64" }, { "name": "participation", "type": "uint64" } ] }, "methods": [ { "name": "createSession", "args": [ { "type": "(uint64,uint64,uint64,uint64)", "struct": "ObjectB555233E", "name": "config" }, { "type": "pay", "name": "mbrPayment" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Initializes a new game session and allocates storage for counters.\nValidates that the MBR payment covers the large frequency blob.", "events": [], "recommendations": {} }, { "name": "joinSession", "args": [ { "type": "uint64", "name": "sessionID" }, { "type": "byte[]", "name": "commit" }, { "type": "pay", "name": "payment" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Allows a player to join the session.", "events": [], "recommendations": {} }, { "name": "revealMove", "args": [ { "type": "uint64", "name": "sessionID" }, { "type": "uint64", "name": "choice" }, { "type": "byte[]", "name": "salt" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Reveals a player's move and updates global game statistics.\nChoice must be between 0 and 100.", "events": [], "recommendations": {} }, { "name": "claimWinnings", "args": [ { "type": "uint64", "name": "sessionID" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Calculates the winner and distributes the prize using the Pull pattern.\nUses ensureBudget to guarantee sufficient opcodes for the calculation loop.", "events": [], "recommendations": {} }, { "name": "getRequiredMBR", "args": [ { "type": "string", "name": "command" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Calculates the required Minimum Balance Requirement (MBR) for storage allocation.", "events": [], "recommendations": {} }, { "name": "getGameType", "args": [], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns contract identification info.", "events": [], "recommendations": {} }, { "name": "initialize", "args": [ { "type": "string", "name": "gameType" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Sets the game type. Immutable once set.\nCan only be called by the creator.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "Implementation of the \"Guess 2/3 of the Average\" game.\n\nGame Mechanics:\n- Players choose a number between 0 and 100.\n- The system calculates the average of all choices.\n- The Target is defined as 2/3 of that average.\n- The winner is the player whose number is closest to the Target.\n- In case of a tie, the pot is split equally among the winners.", "networks": {}, "state": { "schema": { "global": { "ints": 1, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "gameType": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Z2FtZVR5cGU=", "desc": "Contract type identifier (e.g., 'RPS', 'GUESS').\nUsed for CLI validation." }, "sessionIDCounter": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c2Vzc2lvbklEQ291bnRlcg==", "desc": "Global counter for generating unique session IDs." } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "stats": { "keyType": "uint64", "valueType": "Object0B783EB4", "desc": "Stores global session statistics required to calculate the average.\nKey: SessionID", "prefix": "c3Q=" }, "frequency": { "keyType": "uint64", "valueType": "AVMBytes", "desc": "Compressed frequency map storing player choices.\nStructure: A single byte blob of 808 bytes (101 uint64s).\nIndex 'i' (0-100) holds the count of players who chose 'i'.\nKey: SessionID", "prefix": "ZnI=" }, "playerCommit": { "keyType": "AVMBytes", "valueType": "AVMBytes", "desc": "Storage for player commits.\nKey: Hash(sessionID + playerAddress) OR Hash(sessionID + round + playerAddress)\nValue: Hash(choice + salt) [32 bytes]", "prefix": "cGNvbQ==" }, "playerChoice": { "keyType": "AVMBytes", "valueType": "uint64", "desc": "Storage for revealed choices.\nKey: Hash(sessionID + playerAddress) OR Hash(sessionID + round + playerAddress)\nValue: Player Choice [8 bytes]", "prefix": "cGNobw==" }, "gameSessions": { "keyType": "uint64", "valueType": "ObjectB555233E", "desc": "Configuration storage for each active session.", "prefix": "Z3M=" }, "sessionBalances": { "keyType": "uint64", "valueType": "uint64", "desc": "Tracks the total pot (collected participation fees) for a specific session.", "prefix": "c2JhbA==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 412, 544, 572, 700, 761 ], "errorMessage": "Box must have value" }, { "pc": [ 464 ], "errorMessage": "Choice must be between 0 and 100" }, { "pc": [ 1090 ], "errorMessage": "Command not supported" }, { "pc": [ 362 ], "errorMessage": "Commit phase has ended" }, { "pc": [ 488 ], "errorMessage": "Commit phase is still active" }, { "pc": [ 1028 ], "errorMessage": "Contract already initialized" }, { "pc": [ 370 ], "errorMessage": "Fee receiver must be the contract" }, { "pc": [ 661 ], "errorMessage": "Game is not finished yet" }, { "pc": [ 356 ], "errorMessage": "Game session has not started yet" }, { "pc": [ 382 ], "errorMessage": "Incorrect participation fee amount" }, { "pc": [ 203 ], "errorMessage": "Insufficient MBR for session and counters" }, { "pc": [ 527 ], "errorMessage": "Invalid reveal: hash mismatch" }, { "pc": [ 224 ], "errorMessage": "Invalid start time: cannot start in the past" }, { "pc": [ 220 ], "errorMessage": "Invalid timeline: commit end must be before reveal end" }, { "pc": [ 213 ], "errorMessage": "Invalid timeline: start must be before commit end" }, { "pc": [ 198 ], "errorMessage": "MBR payment receiver must be contract" }, { "pc": [ 509 ], "errorMessage": "No commit found for this player or already revealed" }, { "pc": [ 97 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 165 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 1034 ], "errorMessage": "Only creator can initialize" }, { "pc": [ 398 ], "errorMessage": "Player already registered in this session" }, { "pc": [ 683 ], "errorMessage": "Player has not revealed or already claimed" }, { "pc": [ 494 ], "errorMessage": "Reveal phase has ended" }, { "pc": [ 344, 476, 651, 913 ], "errorMessage": "Session does not exist" }, { "pc": [ 711 ], "errorMessage": "You did not win or no pot available" }, { "pc": [ 229, 991, 1025 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 312, 445, 967, 1011 ], "errorMessage": "invalid array length header" }, { "pc": [ 176 ], "errorMessage": "invalid number of bytes for ObjectB555233E" }, { "pc": [ 319, 452, 974, 1018 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 305, 428, 437, 603 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 186, 332 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMgogICAgYnl0ZWNibG9jayAiZ2FtZVR5cGUiICJuZXdHYW1lIiAiZ3MiIDB4MTUxZjdjNzUgInNlc3Npb25JRENvdW50ZXIiICJzYmFsIiAic3QiICJmciIgInBjb20iICJwY2hvIiAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGdhbWVUeXBlID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjXzAgLy8gImdhbWVUeXBlIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHNlc3Npb25JRENvdW50ZXIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlYyA0IC8vICJzZXNzaW9uSURDb3VudGVyIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czozNQogICAgLy8gZXhwb3J0IGNsYXNzIEd1ZXNzR2FtZSBleHRlbmRzIEdhbWVDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MmM0OWE1Y2YgMHgxMWJiNDE2NyAweDdlNjAwMjNjIDB4NzRiZWY4ODcgMHg5ZTRhM2FlNSAweDU2ODNlZTA4IDB4ZWNmMzM5ZTcgLy8gbWV0aG9kICJjcmVhdGVTZXNzaW9uKCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLHBheSl1aW50NjQiLCBtZXRob2QgImpvaW5TZXNzaW9uKHVpbnQ2NCxieXRlW10scGF5KXZvaWQiLCBtZXRob2QgInJldmVhbE1vdmUodWludDY0LHVpbnQ2NCxieXRlW10pdm9pZCIsIG1ldGhvZCAiY2xhaW1XaW5uaW5ncyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRSZXF1aXJlZE1CUihzdHJpbmcpdWludDY0IiwgbWV0aG9kICJnZXRHYW1lVHlwZSgpYnl0ZVtdIiwgbWV0aG9kICJpbml0aWFsaXplKHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlU2Vzc2lvbiBqb2luU2Vzc2lvbiByZXZlYWxNb3ZlIGNsYWltV2lubmluZ3MgZ2V0UmVxdWlyZWRNQlIgZ2V0R2FtZVR5cGUgaW5pdGlhbGl6ZQogICAgZXJyCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czozNQogICAgLy8gZXhwb3J0IGNsYXNzIEd1ZXNzR2FtZSBleHRlbmRzIEdhbWVDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo6R3Vlc3NHYW1lLmNyZWF0ZVNlc3Npb25bcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVTZXNzaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBwdWJsaWMgY3JlYXRlU2Vzc2lvbihjb25maWc6IEdhbWVDb25maWcsIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bik6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgT2JqZWN0QjU1NTIzM0UKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjU1CiAgICAvLyBjb25zdCByZXF1aXJlZE1CUiA9IHRoaXMuZ2V0UmVxdWlyZWRNQlIoJ25ld0dhbWUnKQogICAgYnl0ZWNfMSAvLyAibmV3R2FtZSIKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjpHdWVzc0dhbWUuZ2V0UmVxdWlyZWRNQlIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo1NwogICAgLy8gYXNzZXJ0KG1iclBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCAnTUJSIHBheW1lbnQgcmVjZWl2ZXIgbXVzdCBiZSBjb250cmFjdCcpCiAgICBkaWcgMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE1CUiBwYXltZW50IHJlY2VpdmVyIG11c3QgYmUgY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo1OAogICAgLy8gYXNzZXJ0KG1iclBheW1lbnQuYW1vdW50ID49IHJlcXVpcmVkTUJSLCAnSW5zdWZmaWNpZW50IE1CUiBmb3Igc2Vzc2lvbiBhbmQgY291bnRlcnMnKQogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBNQlIgZm9yIHNlc3Npb24gYW5kIGNvdW50ZXJzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo5NgogICAgLy8gYXNzZXJ0KGNvbmZpZy5zdGFydEF0IDwgY29uZmlnLmVuZENvbW1pdEF0LCAnSW52YWxpZCB0aW1lbGluZTogc3RhcnQgbXVzdCBiZSBiZWZvcmUgY29tbWl0IGVuZCcpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwMgogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgdGltZWxpbmU6IHN0YXJ0IG11c3QgYmUgYmVmb3JlIGNvbW1pdCBlbmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjk3CiAgICAvLyBhc3NlcnQoY29uZmlnLmVuZENvbW1pdEF0IDwgY29uZmlnLmVuZFJldmVhbEF0LCAnSW52YWxpZCB0aW1lbGluZTogY29tbWl0IGVuZCBtdXN0IGJlIGJlZm9yZSByZXZlYWwgZW5kJykKICAgIGRpZyAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPAogICAgYXNzZXJ0IC8vIEludmFsaWQgdGltZWxpbmU6IGNvbW1pdCBlbmQgbXVzdCBiZSBiZWZvcmUgcmV2ZWFsIGVuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIGFzc2VydChjb25maWcuc3RhcnRBdCA+PSBHbG9iYWwucm91bmQsICdJbnZhbGlkIHN0YXJ0IHRpbWU6IGNhbm5vdCBzdGFydCBpbiB0aGUgcGFzdCcpCiAgICBnbG9iYWwgUm91bmQKICAgID49CiAgICBhc3NlcnQgLy8gSW52YWxpZCBzdGFydCB0aW1lOiBjYW5ub3Qgc3RhcnQgaW4gdGhlIHBhc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gY29uc3Qgc2Vzc2lvbklEID0gdGhpcy5zZXNzaW9uSURDb3VudGVyLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHNlc3Npb25JRENvdW50ZXIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlYyA0IC8vICJzZXNzaW9uSURDb3VudGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTAwCiAgICAvLyBjb25zdCBzZXNzaW9uSUQgPSB0aGlzLnNlc3Npb25JRENvdW50ZXIudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIHRoaXMuZ2FtZVNlc3Npb25zKHNlc3Npb25JRCkudmFsdWUgPSBjbG9uZShjb25maWcpCiAgICBkdXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBnYW1lU2Vzc2lvbnMgPSBCb3hNYXA8dWludDY0LCBHYW1lQ29uZmlnPih7IGtleVByZWZpeDogJ2dzJyB9KQogICAgYnl0ZWNfMiAvLyAiZ3MiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIHRoaXMuZ2FtZVNlc3Npb25zKHNlc3Npb25JRCkudmFsdWUgPSBjbG9uZShjb25maWcpCiAgICB1bmNvdmVyIDMKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjczCiAgICAvLyBzZXNzaW9uQmFsYW5jZXMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnc2JhbCcgfSkKICAgIGJ5dGVjIDUgLy8gInNiYWwiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMDMKICAgIC8vIHRoaXMuc2Vzc2lvbkJhbGFuY2VzKHNlc3Npb25JRCkudmFsdWUgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyB0aGlzLnNlc3Npb25JRENvdW50ZXIudmFsdWUgPSBzZXNzaW9uSUQgKyAxCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHNlc3Npb25JRENvdW50ZXIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlYyA0IC8vICJzZXNzaW9uSURDb3VudGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyB0aGlzLnNlc3Npb25JRENvdW50ZXIudmFsdWUgPSBzZXNzaW9uSUQgKyAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjQwCiAgICAvLyBzdGF0cyA9IEJveE1hcDx1aW50NjQsIEdhbWVTdGF0cz4oeyBrZXlQcmVmaXg6ICdzdCcgfSkKICAgIGJ5dGVjIDYgLy8gInN0IgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjYyCiAgICAvLyB0aGlzLnN0YXRzKHNlc3Npb25JRCkudmFsdWUgPSB7IHN1bTogMCwgY291bnQ6IDAgfQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy5mcmVxdWVuY3koc2Vzc2lvbklEKS52YWx1ZSA9IG9wLmJ6ZXJvKDgwOCkKICAgIHB1c2hpbnQgODA4IC8vIDgwOAogICAgYnplcm8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo0OAogICAgLy8gZnJlcXVlbmN5ID0gQm94TWFwPHVpbnQ2NCwgYnl0ZXM+KHsga2V5UHJlZml4OiAnZnInIH0pCiAgICBieXRlYyA3IC8vICJmciIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy5mcmVxdWVuY3koc2Vzc2lvbklEKS52YWx1ZSA9IG9wLmJ6ZXJvKDgwOCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIHB1YmxpYyBjcmVhdGVTZXNzaW9uKGNvbmZpZzogR2FtZUNvbmZpZywgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuKTogdWludDY0IHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6Okd1ZXNzR2FtZS5qb2luU2Vzc2lvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmpvaW5TZXNzaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjczCiAgICAvLyBwdWJsaWMgam9pblNlc3Npb24oc2Vzc2lvbklEOiB1aW50NjQsIGNvbW1pdDogYnl0ZXMsIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQodGhpcy5nYW1lU2Vzc2lvbnMoc2Vzc2lvbklEKS5leGlzdHMsICdTZXNzaW9uIGRvZXMgbm90IGV4aXN0JykKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIGdhbWVTZXNzaW9ucyA9IEJveE1hcDx1aW50NjQsIEdhbWVDb25maWc+KHsga2V5UHJlZml4OiAnZ3MnIH0pCiAgICBieXRlY18yIC8vICJncyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gYXNzZXJ0KHRoaXMuZ2FtZVNlc3Npb25zKHNlc3Npb25JRCkuZXhpc3RzLCAnU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFNlc3Npb24gZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gY29uc3QgY29uZmlnID0gY2xvbmUodGhpcy5nYW1lU2Vzc2lvbnMoc2Vzc2lvbklEKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyBjb25zdCBjdXJyZW50QmxvY2sgPSBHbG9iYWwucm91bmQKICAgIGdsb2JhbCBSb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyBhc3NlcnQoY3VycmVudEJsb2NrID49IGNvbmZpZy5zdGFydEF0LCAnR2FtZSBzZXNzaW9uIGhhcyBub3Qgc3RhcnRlZCB5ZXQnKQogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gR2FtZSBzZXNzaW9uIGhhcyBub3Qgc3RhcnRlZCB5ZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gYXNzZXJ0KGN1cnJlbnRCbG9jayA8PSBjb25maWcuZW5kQ29tbWl0QXQsICdDb21taXQgcGhhc2UgaGFzIGVuZGVkJykKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gQ29tbWl0IHBoYXNlIGhhcyBlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTIxCiAgICAvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdGZWUgcmVjZWl2ZXIgbXVzdCBiZSB0aGUgY29udHJhY3QnKQogICAgZGlnIDIKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBGZWUgcmVjZWl2ZXIgbXVzdCBiZSB0aGUgY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSBjb25maWcucGFydGljaXBhdGlvbiwgJ0luY29ycmVjdCBwYXJ0aWNpcGF0aW9uIGZlZSBhbW91bnQnKQogICAgdW5jb3ZlciAyCiAgICBndHhucyBBbW91bnQKICAgIHN3YXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbmNvcnJlY3QgcGFydGljaXBhdGlvbiBmZWUgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIHJldHVybiBzaGEyNTYoaXRvYihzZXNzaW9uSUQpLmNvbmNhdChwbGF5ZXIuYnl0ZXMpKQogICAgZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gY29uc3QgcGxheWVyQWRkciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIHJldHVybiBzaGEyNTYoaXRvYihzZXNzaW9uSUQpLmNvbmNhdChwbGF5ZXIuYnl0ZXMpKQogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBwbGF5ZXJDb21taXQgPSBCb3hNYXA8Ynl0ZXMsIGJ5dGVzPih7IGtleVByZWZpeDogJ3Bjb20nIH0pCiAgICBieXRlYyA4IC8vICJwY29tIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGFzc2VydCghdGhpcy5wbGF5ZXJDb21taXQocGxheWVyS2V5KS5leGlzdHMsICdQbGF5ZXIgYWxyZWFkeSByZWdpc3RlcmVkIGluIHRoaXMgc2Vzc2lvbicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIFBsYXllciBhbHJlYWR5IHJlZ2lzdGVyZWQgaW4gdGhpcyBzZXNzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIHRoaXMucGxheWVyQ29tbWl0KHBsYXllcktleSkudmFsdWUgPSBjb21taXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDMKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjczCiAgICAvLyBzZXNzaW9uQmFsYW5jZXMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnc2JhbCcgfSkKICAgIGJ5dGVjIDUgLy8gInNiYWwiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyB0aGlzLnNlc3Npb25CYWxhbmNlcyhzZXNzaW9uSUQpLnZhbHVlICs9IHBheW1lbnQuYW1vdW50CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo3MwogICAgLy8gcHVibGljIGpvaW5TZXNzaW9uKHNlc3Npb25JRDogdWludDY0LCBjb21taXQ6IGJ5dGVzLCBwYXltZW50OiBndHhuLlBheW1lbnRUeG4pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6Okd1ZXNzR2FtZS5yZXZlYWxNb3ZlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmV2ZWFsTW92ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo4MQogICAgLy8gcHVibGljIHJldmVhbE1vdmUoc2Vzc2lvbklEOiB1aW50NjQsIGNob2ljZTogdWludDY0LCBzYWx0OiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyBhc3NlcnQoY2hvaWNlID49IDAgJiYgY2hvaWNlIDw9IDEwMCwgJ0Nob2ljZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwJykKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPD0KICAgIGJ6IHJldmVhbE1vdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKcmV2ZWFsTW92ZV9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6ODIKICAgIC8vIGFzc2VydChjaG9pY2UgPj0gMCAmJiBjaG9pY2UgPD0gMTAwLCAnQ2hvaWNlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAnKQogICAgYXNzZXJ0IC8vIENob2ljZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMzgKICAgIC8vIGFzc2VydCh0aGlzLmdhbWVTZXNzaW9ucyhzZXNzaW9uSUQpLmV4aXN0cywgJ1Nlc3Npb24gZG9lcyBub3QgZXhpc3QnKQogICAgZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBnYW1lU2Vzc2lvbnMgPSBCb3hNYXA8dWludDY0LCBHYW1lQ29uZmlnPih7IGtleVByZWZpeDogJ2dzJyB9KQogICAgYnl0ZWNfMiAvLyAiZ3MiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMzgKICAgIC8vIGFzc2VydCh0aGlzLmdhbWVTZXNzaW9ucyhzZXNzaW9uSUQpLmV4aXN0cywgJ1Nlc3Npb24gZG9lcyBub3QgZXhpc3QnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBTZXNzaW9uIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNDAKICAgIC8vIGNvbnN0IGNvbmZpZyA9IGNsb25lKHRoaXMuZ2FtZVNlc3Npb25zKHNlc3Npb25JRCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gY29uc3QgY3VycmVudEJsb2NrID0gR2xvYmFsLnJvdW5kCiAgICBnbG9iYWwgUm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gYXNzZXJ0KGN1cnJlbnRCbG9jayA+IGNvbmZpZy5lbmRDb21taXRBdCwgJ0NvbW1pdCBwaGFzZSBpcyBzdGlsbCBhY3RpdmUnKQogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIDwKICAgIGFzc2VydCAvLyBDb21taXQgcGhhc2UgaXMgc3RpbGwgYWN0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNDQKICAgIC8vIGFzc2VydChjdXJyZW50QmxvY2sgPD0gY29uZmlnLmVuZFJldmVhbEF0LCAnUmV2ZWFsIHBoYXNlIGhhcyBlbmRlZCcpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBSZXZlYWwgcGhhc2UgaGFzIGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIHJldHVybiBzaGEyNTYoaXRvYihzZXNzaW9uSUQpLmNvbmNhdChwbGF5ZXIuYnl0ZXMpKQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIGNvbnN0IHBsYXllckFkZHIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MjE0CiAgICAvLyByZXR1cm4gc2hhMjU2KGl0b2Ioc2Vzc2lvbklEKS5jb25jYXQocGxheWVyLmJ5dGVzKSkKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gcGxheWVyQ29tbWl0ID0gQm94TWFwPGJ5dGVzLCBieXRlcz4oeyBrZXlQcmVmaXg6ICdwY29tJyB9KQogICAgYnl0ZWMgOCAvLyAicGNvbSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gYXNzZXJ0KHRoaXMucGxheWVyQ29tbWl0KHBsYXllcktleSkuZXhpc3RzLCAnTm8gY29tbWl0IGZvdW5kIGZvciB0aGlzIHBsYXllciBvciBhbHJlYWR5IHJldmVhbGVkJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTm8gY29tbWl0IGZvdW5kIGZvciB0aGlzIHBsYXllciBvciBhbHJlYWR5IHJldmVhbGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGNvbnN0IHN0b3JlZENvbW1pdCA9IHRoaXMucGxheWVyQ29tbWl0KHBsYXllcktleSkudmFsdWUKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNTIKICAgIC8vIGNvbnN0IGNvbXB1dGVkQ29tbWl0ID0gc2hhMjU2KGl0b2IoY2hvaWNlKS5jb25jYXQoc2FsdCkpCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciA0CiAgICBpdG9iCiAgICBkdXAKICAgIGRpZyA3CiAgICBjb25jYXQKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTU0CiAgICAvLyBhc3NlcnQoY29tcHV0ZWRDb21taXQgPT09IHN0b3JlZENvbW1pdCwgJ0ludmFsaWQgcmV2ZWFsOiBoYXNoIG1pc21hdGNoJykKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHJldmVhbDogaGFzaCBtaXNtYXRjaAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIHBsYXllckNob2ljZSA9IEJveE1hcDxieXRlcywgdWludDY0Pih7IGtleVByZWZpeDogJ3BjaG8nIH0pCiAgICBieXRlYyA5IC8vICJwY2hvIgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE1NgogICAgLy8gdGhpcy5wbGF5ZXJDaG9pY2UocGxheWVyS2V5KS52YWx1ZSA9IGNob2ljZQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTU3CiAgICAvLyB0aGlzLnBsYXllckNvbW1pdChwbGF5ZXJLZXkpLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo0MAogICAgLy8gc3RhdHMgPSBCb3hNYXA8dWludDY0LCBHYW1lU3RhdHM+KHsga2V5UHJlZml4OiAnc3QnIH0pCiAgICBieXRlYyA2IC8vICJzdCIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo4NwogICAgLy8gY29uc3QgY3VycmVudFN0YXRzID0gY2xvbmUodGhpcy5zdGF0cyhzZXNzaW9uSUQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyBjdXJyZW50U3RhdHMuc3VtICs9IGNob2ljZQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAzCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6ODkKICAgIC8vIGN1cnJlbnRTdGF0cy5jb3VudCArPSAxCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gdGhpcy5zdGF0cyhzZXNzaW9uSUQpLnZhbHVlID0gY2xvbmUoY3VycmVudFN0YXRzKQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjk0CiAgICAvLyBjb25zdCBvZmZzZXQ6IHVpbnQ2NCA9IGNob2ljZSAqIDgKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6NDgKICAgIC8vIGZyZXF1ZW5jeSA9IEJveE1hcDx1aW50NjQsIGJ5dGVzPih7IGtleVByZWZpeDogJ2ZyJyB9KQogICAgYnl0ZWMgNyAvLyAiZnIiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjk2CiAgICAvLyBjb25zdCBjdXJyZW50Q291bnQgPSBvcC5leHRyYWN0VWludDY0KGJveC52YWx1ZSwgb2Zmc2V0KQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZGlnIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6OTcKICAgIC8vIGNvbnN0IG5ld0NvdW50OiB1aW50NjQgPSBjdXJyZW50Q291bnQgKyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gYm94LnJlcGxhY2Uob2Zmc2V0LCBvcC5pdG9iKG5ld0NvdW50KSkKICAgIGl0b2IKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6ODEKICAgIC8vIHB1YmxpYyByZXZlYWxNb3ZlKHNlc3Npb25JRDogdWludDY0LCBjaG9pY2U6IHVpbnQ2NCwgc2FsdDogYnl0ZXMpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJldmVhbE1vdmVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2ZWFsTW92ZV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6Okd1ZXNzR2FtZS5jbGFpbVdpbm5pbmdzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1XaW5uaW5nczoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjEwNwogICAgLy8gcHVibGljIGNsYWltV2lubmluZ3Moc2Vzc2lvbklEOiB1aW50NjQpOiB1aW50NjQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQoKY2xhaW1XaW5uaW5nc193aGlsZV90b3BAMjoKICAgIHB1c2hpbnQgMTQxMCAvLyAxNDEwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBjbGFpbVdpbm5pbmdzX2FmdGVyX3doaWxlQDcKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAxMCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDEwIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGNsYWltV2lubmluZ3Nfd2hpbGVfdG9wQDIKCmNsYWltV2lubmluZ3NfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gcmV0dXJuIHRoaXMuZ2FtZVNlc3Npb25zKHNlc3Npb25JRCkuZXhpc3RzCiAgICBkdXAKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIGdhbWVTZXNzaW9ucyA9IEJveE1hcDx1aW50NjQsIEdhbWVDb25maWc+KHsga2V5UHJlZml4OiAnZ3MnIH0pCiAgICBieXRlY18yIC8vICJncyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gcmV0dXJuIHRoaXMuZ2FtZVNlc3Npb25zKHNlc3Npb25JRCkuZXhpc3RzCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjEwOQogICAgLy8gYXNzZXJ0KHRoaXMuc2Vzc2lvbkV4aXN0cyhzZXNzaW9uSUQpLCAnU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCcpCiAgICBhc3NlcnQgLy8gU2Vzc2lvbiBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gY29uc3QgY29uZmlnID0gY2xvbmUodGhpcy5nYW1lU2Vzc2lvbnMoc2Vzc2lvbklEKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgY3VycmVudFRpbWUgPSBHbG9iYWwucm91bmQKICAgIGdsb2JhbCBSb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gYXNzZXJ0KGN1cnJlbnRUaW1lID4gY29uZmlnLmVuZFJldmVhbEF0LCAnR2FtZSBpcyBub3QgZmluaXNoZWQgeWV0JykKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICA+CiAgICBhc3NlcnQgLy8gR2FtZSBpcyBub3QgZmluaXNoZWQgeWV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyBjb25zdCBwbGF5ZXJBZGRyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgYnVyeSAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MjE0CiAgICAvLyByZXR1cm4gc2hhMjU2KGl0b2Ioc2Vzc2lvbklEKS5jb25jYXQocGxheWVyLmJ5dGVzKSkKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHNoYTI1NgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIHBsYXllckNob2ljZSA9IEJveE1hcDxieXRlcywgdWludDY0Pih7IGtleVByZWZpeDogJ3BjaG8nIH0pCiAgICBieXRlYyA5IC8vICJwY2hvIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIGFzc2VydCh0aGlzLnBsYXllckNob2ljZShwbGF5ZXJLZXkpLmV4aXN0cywgJ1BsYXllciBoYXMgbm90IHJldmVhbGVkIG9yIGFscmVhZHkgY2xhaW1lZCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFBsYXllciBoYXMgbm90IHJldmVhbGVkIG9yIGFscmVhZHkgY2xhaW1lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjEyMQogICAgLy8gY29uc3QgbXlDaG9pY2UgPSB0aGlzLnBsYXllckNob2ljZShwbGF5ZXJLZXkpLnZhbHVlCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGJ0b2kKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjQwCiAgICAvLyBzdGF0cyA9IEJveE1hcDx1aW50NjQsIEdhbWVTdGF0cz4oeyBrZXlQcmVmaXg6ICdzdCcgfSkKICAgIGJ5dGVjIDYgLy8gInN0IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyBjb25zdCBzdGF0cyA9IGNsb25lKHRoaXMuc3RhdHMoc2Vzc2lvbklEKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGlmIChzdGF0cy5jb3VudCA9PT0gMCkgcmV0dXJuIDAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDQKICAgIGJueiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMTMKICAgIGludGNfMCAvLyAwCgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjpHdWVzc0dhbWUuY2FsY3VsYXRlUGxheWVyV2luQDQwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gYXNzZXJ0KHByaXplQW1vdW50ID4gMCwgJ1lvdSBkaWQgbm90IHdpbiBvciBubyBwb3QgYXZhaWxhYmxlJykKICAgIGR1cAogICAgYXNzZXJ0IC8vIFlvdSBkaWQgbm90IHdpbiBvciBubyBwb3QgYXZhaWxhYmxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyB0aGlzLnBsYXllckNob2ljZShwbGF5ZXJLZXkpLmRlbGV0ZSgpCiAgICBkaWcgMTgKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjEyOS0xMzUKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBwbGF5ZXJBZGRyLm5hdGl2ZSwKICAgIC8vICAgICBhbW91bnQ6IHByaXplQW1vdW50LAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkaWcgMTUKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoxMjktMTM0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogcGxheWVyQWRkci5uYXRpdmUsCiAgICAvLyAgICAgYW1vdW50OiBwcml6ZUFtb3VudCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjEzMwogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTI5LTEzNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHBsYXllckFkZHIubmF0aXZlLAogICAgLy8gICAgIGFtb3VudDogcHJpemVBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBwdWJsaWMgY2xhaW1XaW5uaW5ncyhzZXNzaW9uSUQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBpdG9iCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTU1CiAgICAvLyBjb25zdCB0YXJnZXQ6IHVpbnQ2NCA9IChzdGF0cy5zdW0gKiAyKSAvIChzdGF0cy5jb3VudCAqIDMpCiAgICBkaWcgMTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBwdXNoaW50IDMgLy8gMwogICAgKgogICAgLwogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6NDgKICAgIC8vIGZyZXF1ZW5jeSA9IEJveE1hcDx1aW50NjQsIGJ5dGVzPih7IGtleVByZWZpeDogJ2ZyJyB9KQogICAgYnl0ZWMgNyAvLyAiZnIiCiAgICBkaWcgMTcKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE1NwogICAgLy8gY29uc3QgZnJlcUJsb2IgPSB0aGlzLmZyZXF1ZW5jeShzZXNzaW9uSUQpLnZhbHVlCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDE3CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8gbGV0IHdpbm5pbmdEaXN0YW5jZTogdWludDY0ID0gMTAxIC8vIFNlbnRpbmVsIHZhbHVlID4gbWF4IHBvc3NpYmxlIGRpc3RhbmNlICgxMDApCiAgICBwdXNoaW50IDEwMSAvLyAxMDEKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE1OQogICAgLy8gbGV0IHRvdGFsV2lubmVyczogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gZm9yIChsZXQgZGlzdDogdWludDY0ID0gMDsgZGlzdCA8PSAxMDA7IGRpc3QrKykgewogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTEKCmNsYWltV2lubmluZ3Nfd2hpbGVfdG9wQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gZm9yIChsZXQgZGlzdDogdWludDY0ID0gMDsgZGlzdCA8PSAxMDA7IGRpc3QrKykgewogICAgZGlnIDEwCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIDw9CiAgICBieiBjbGFpbVdpbm5pbmdzX2Jsb2NrQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTYzCiAgICAvLyBsZXQgZm91bmQgPSBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGlmICh0YXJnZXQgPj0gZGlzdCkgewogICAgZGlnIDUKICAgIGRpZyAxMQogICAgPj0KICAgIGJ6IGNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE2NwogICAgLy8gY29uc3QgbG93VmFsOiB1aW50NjQgPSB0YXJnZXQgLSBkaXN0CiAgICBkaWcgNQogICAgZGlnIDExCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTY4CiAgICAvLyBjb25zdCBjb3VudExvdyA9IG9wLmV4dHJhY3RVaW50NjQoZnJlcUJsb2IsIGxvd1ZhbCAqIDgpCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZGlnIDE2CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTY5CiAgICAvLyBpZiAoY291bnRMb3cgPiAwKSB7CiAgICBieiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoxNzAKICAgIC8vIHRvdGFsV2lubmVycyArPSBjb3VudExvdwogICAgZGlnIDMKICAgIGRpZyAxMgogICAgKwogICAgYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTcxCiAgICAvLyBmb3VuZCA9IHRydWUKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDEwCgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTc3CiAgICAvLyBpZiAoZGlzdCA+IDAgJiYgdGFyZ2V0ICsgZGlzdCA8PSAxMDApIHsKICAgIGRpZyAxMAogICAgYnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDI0CiAgICBkaWcgNQogICAgZGlnIDExCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPD0KICAgIGJ6IGNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE3OQogICAgLy8gY29uc3QgY291bnRIaWdoID0gb3AuZXh0cmFjdFVpbnQ2NChmcmVxQmxvYiwgaGlnaFZhbCAqIDgpCiAgICBkaWcgOAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGRpZyAxNgogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gaWYgKGNvdW50SGlnaCA+IDApIHsKICAgIGJ6IGNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE4MQogICAgLy8gdG90YWxXaW5uZXJzICs9IGNvdW50SGlnaAogICAgZGlnIDMKICAgIGRpZyAxMwogICAgKwogICAgYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyBmb3VuZCA9IHRydWUKICAgIGludGNfMSAvLyAxCiAgICBidXJ5IDEwCgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTg2CiAgICAvLyBpZiAoZm91bmQpIHsKICAgIGRpZyA5CiAgICBieiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMjYKICAgIGRpZyAxMAogICAgYnVyeSAyCgpjbGFpbVdpbm5pbmdzX2Jsb2NrQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gbGV0IGlzV2lubmVyID0gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIGlmIChteUNob2ljZSA8PSB0YXJnZXQpIHsKICAgIGRpZyA2CiAgICBkaWcgNgogICAgPD0KICAgIGJ6IGNsYWltV2lubmluZ3NfZWxzZV9ib2R5QDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBpZiAodGFyZ2V0IC0gbXlDaG9pY2UgPT09IHdpbm5pbmdEaXN0YW5jZSkgaXNXaW5uZXIgPSB0cnVlCiAgICBkaWcgNQogICAgZGlnIDcKICAgIC0KICAgIGRpZyAyCiAgICA9PQogICAgYnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDM1CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSA4CgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMzU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MjAwCiAgICAvLyBpZiAoIWlzV2lubmVyKSByZXR1cm4gMAogICAgZGlnIDcKICAgIGJueiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMzcKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTIyCiAgICAvLyBjb25zdCBwcml6ZUFtb3VudCA9IHRoaXMuY2FsY3VsYXRlUGxheWVyV2luKHNlc3Npb25JRCwgbXlDaG9pY2UpCiAgICBiIGNsYWltV2lubmluZ3NfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6Okd1ZXNzR2FtZS5jYWxjdWxhdGVQbGF5ZXJXaW5ANDAKCmNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAzNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjczCiAgICAvLyBzZXNzaW9uQmFsYW5jZXMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnc2JhbCcgfSkKICAgIGJ5dGVjIDUgLy8gInNiYWwiCiAgICBkaWcgMTcKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTk4CiAgICAvLyBhc3NlcnQodGhpcy5zZXNzaW9uQmFsYW5jZXMoc2Vzc2lvbklEKS5leGlzdHMsICdTZXNzaW9uIGRvZXMgbm90IGV4aXN0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gU2Vzc2lvbiBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTk5CiAgICAvLyByZXR1cm4gdGhpcy5zZXNzaW9uQmFsYW5jZXMoc2Vzc2lvbklEKS52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICBidG9pCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoyMDQKICAgIC8vIGlmICh0b3RhbFdpbm5lcnMgPT09IDApIHJldHVybiAwCiAgICBkaWcgMwogICAgYm56IGNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAzOQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIGNvbnN0IHByaXplQW1vdW50ID0gdGhpcy5jYWxjdWxhdGVQbGF5ZXJXaW4oc2Vzc2lvbklELCBteUNob2ljZSkKICAgIGIgY2xhaW1XaW5uaW5nc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo6R3Vlc3NHYW1lLmNhbGN1bGF0ZVBsYXllcldpbkA0MAoKY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gcmV0dXJuIHRvdGFsUG90IC8gdG90YWxXaW5uZXJzCiAgICBkaWcgNAogICAgZGlnIDQKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIGNvbnN0IHByaXplQW1vdW50ID0gdGhpcy5jYWxjdWxhdGVQbGF5ZXJXaW4oc2Vzc2lvbklELCBteUNob2ljZSkKICAgIGIgY2xhaW1XaW5uaW5nc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo6R3Vlc3NHYW1lLmNhbGN1bGF0ZVBsYXllcldpbkA0MAoKY2xhaW1XaW5uaW5nc19lbHNlX2JvZHlAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTk3CiAgICAvLyBpZiAobXlDaG9pY2UgLSB0YXJnZXQgPT09IHdpbm5pbmdEaXN0YW5jZSkgaXNXaW5uZXIgPSB0cnVlCiAgICBkaWcgNgogICAgZGlnIDYKICAgIC0KICAgIGRpZyAyCiAgICA9PQogICAgYnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDM1CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSA4CiAgICBiIGNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAzNQoKY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gZm9yIChsZXQgZGlzdDogdWludDY0ID0gMDsgZGlzdCA8PSAxMDA7IGRpc3QrKykgewogICAgZGlnIDEwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxMQogICAgYiBjbGFpbVdpbm5pbmdzX3doaWxlX3RvcEAxNAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo6R3Vlc3NHYW1lLmdldFJlcXVpcmVkTUJSW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0UmVxdWlyZWRNQlI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6MjEyCiAgICAvLyBwdWJsaWMgZ2V0UmVxdWlyZWRNQlIoY29tbWFuZDogJ25ld0dhbWUnIHwgJ2pvaW4nKTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo6R3Vlc3NHYW1lLmdldFJlcXVpcmVkTUJSCiAgICBpdG9iCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6OkdhbWVDb250cmFjdC5nZXRHYW1lVHlwZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEdhbWVUeXBlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NzkKICAgIC8vIHJldHVybiB0aGlzLmdhbWVUeXBlLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGdhbWVUeXBlID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjXzAgLy8gImdhbWVUeXBlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NzkKICAgIC8vIHJldHVybiB0aGlzLmdhbWVUeXBlLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NzgKICAgIC8vIHB1YmxpYyBnZXRHYW1lVHlwZSgpOiBieXRlcyB7CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjpHYW1lQ29udHJhY3QuaW5pdGlhbGl6ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmluaXRpYWxpemU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo4NgogICAgLy8gcHVibGljIGluaXRpYWxpemUoZ2FtZVR5cGU6IHN0cmluZyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyBhc3NlcnQodGhpcy5nYW1lVHlwZS52YWx1ZS5sZW5ndGggPT09IDAsICdDb250cmFjdCBhbHJlYWR5IGluaXRpYWxpemVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo0NAogICAgLy8gZ2FtZVR5cGUgPSBHbG9iYWxTdGF0ZTxieXRlcz4oeyBpbml0aWFsVmFsdWU6IEJ5dGVzKCcnKSB9KQogICAgYnl0ZWNfMCAvLyAiZ2FtZVR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo4NwogICAgLy8gYXNzZXJ0KHRoaXMuZ2FtZVR5cGUudmFsdWUubGVuZ3RoID09PSAwLCAnQ29udHJhY3QgYWxyZWFkeSBpbml0aWFsaXplZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgbGVuCiAgICAhCiAgICBhc3NlcnQgLy8gQ29udHJhY3QgYWxyZWFkeSBpbml0aWFsaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsICdPbmx5IGNyZWF0b3IgY2FuIGluaXRpYWxpemUnKQogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gaW5pdGlhbGl6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGdhbWVUeXBlID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjXzAgLy8gImdhbWVUeXBlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6ODkKICAgIC8vIHRoaXMuZ2FtZVR5cGUudmFsdWUgPSBCeXRlcyhnYW1lVHlwZSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo4NgogICAgLy8gcHVibGljIGluaXRpYWxpemUoZ2FtZVR5cGU6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo6R3Vlc3NHYW1lLmdldFJlcXVpcmVkTUJSKGNvbW1hbmQ6IGJ5dGVzKSAtPiB1aW50NjQ6CnNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czo6R3Vlc3NHYW1lLmdldFJlcXVpcmVkTUJSOgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjIxMgogICAgLy8gcHVibGljIGdldFJlcXVpcmVkTUJSKGNvbW1hbmQ6ICduZXdHYW1lJyB8ICdqb2luJyk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIGlmIChjb21tYW5kID09PSAnbmV3R2FtZScpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWNfMSAvLyAibmV3R2FtZSIKICAgID09CiAgICBieiBzbWFydF9jb250cmFjdHMvZ3Vlc3NHYW1lL2NvbnRyYWN0LmFsZ28udHM6Okd1ZXNzR2FtZS5nZXRSZXF1aXJlZE1CUl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9ndWVzc0dhbWUvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIHJldHVybiBzdGF0c01CUiArIGZyZXFNQlIgKyBzdXBlci5nZXRSZXF1aXJlZE1CUignbmV3R2FtZScpCiAgICBieXRlY18xIC8vICJuZXdHYW1lIgogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo6R2FtZUNvbnRyYWN0LmdldFJlcXVpcmVkTUJSCiAgICBwdXNoaW50IDM0MTAwMCAvLyAzNDEwMDAKICAgICsKICAgIHJldHN1YgoKc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjpHdWVzc0dhbWUuZ2V0UmVxdWlyZWRNQlJfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2d1ZXNzR2FtZS9jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gcmV0dXJuIHN1cGVyLmdldFJlcXVpcmVkTUJSKGNvbW1hbmQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6OkdhbWVDb250cmFjdC5nZXRSZXF1aXJlZE1CUgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6OkdhbWVDb250cmFjdC5nZXRSZXF1aXJlZE1CUihjb21tYW5kOiBieXRlcykgLT4gdWludDY0OgpzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo6R2FtZUNvbnRyYWN0LmdldFJlcXVpcmVkTUJSOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTcxCiAgICAvLyBwcm90ZWN0ZWQgZ2V0UmVxdWlyZWRNQlIoY29tbWFuZDogJ25ld0dhbWUnIHwgJ2pvaW4nKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBpZiAoY29tbWFuZCA9PT0gJ25ld0dhbWUnKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzEgLy8gIm5ld0dhbWUiCiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6OkdhbWVDb250cmFjdC5nZXRSZXF1aXJlZE1CUl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTc3CiAgICAvLyByZXR1cm4gY29uZmlnTUJSICsgYmFsYW5jZU1CUgogICAgcHVzaGludCAyOTgwMCAvLyAyOTgwMAogICAgcmV0c3ViCgpzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo6R2FtZUNvbnRyYWN0LmdldFJlcXVpcmVkTUJSX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTc4CiAgICAvLyB9IGVsc2UgaWYgKGNvbW1hbmQgPT09ICdqb2luJykgewogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgImpvaW4iCiAgICA9PQogICAgYXNzZXJ0IC8vIENvbW1hbmQgbm90IHN1cHBvcnRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTY1CiAgICAvLyByZXR1cm4gMjUwMCArIDQwMCAqIChrZXlTaXplICsgdmFsdWVTaXplKQogICAgcHVzaGludCAyOTcwMCAvLyAyOTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTgwCiAgICAvLyByZXR1cm4gdGhpcy5nZXRCb3hNQlIoMzYsIDMyKQogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAAEIAiYLCGdhbWVUeXBlB25ld0dhbWUCZ3MEFR98dRBzZXNzaW9uSURDb3VudGVyBHNiYWwCc3QCZnIEcGNvbQRwY2hvAwaBATEYQAAIKIAAZycEImcxG0EAQDEZFEQxGESCBwQsSaXPBBG7QWcEfmACPAR0vviHBJ5KOuUEVoPuCATs8znnNhoAjgcACwCNAQgBsAMlAz8DUQAxGRQxGBQQRCNDNhoBSRWBIBJEMRYjCUk4ECMSRCmIA1FLATgHMgoSREw4CA5ESSJbSwEkW0oMREsCgRBbDEQyBg9EIicEZURJFipLAVBPA78nBUsBUCIWv0wjCCcETGcnBksBUIAQAAAAAAAAAAAAAAAAAAAAAL+BqAavJwdLAlBJvEhMvytMULAjQzYaAUkVJBJEFzYaAkkiWSUISwEVEkRXAgAxFiMJSTgQIxJETwIWKksBUEm9RQFEvkgyBksBIltLAQ5ESwEkWw5ESwI4BzIKEkRPAjgITIEYW0sBEkRLATEAUAEnCExQSb1FARRESbxITwO/JwVPAlBJvkQXTwIIFr8jQzYaAUkVJBJEFzYaAkkVJBJEF0k2GgNJIlklCEsBFRJEVwIATIFkDkEAeiNESwIWKksBUEm9RQFEvkgyBksBJFtLAQxETIEQWw5ESTEAUAEnCEsBUEm9RQFESb5ISwVJTgQWSUsHUAFPAhJEJwlPA1BMv7xIJwZLAlBJvkRJIltLAwgWXABJJFsjCBZcCL8kCycHTwJQSb5ESwJbIwgWTE4CuyNDIkL/gyJHBIAARws2GgFJFSQSRBeBggsyDA1BABixgQayEIEFshknCrIeJwqyHyKyAbNC/99JFklFEipLAVBJvUUBRL5IMgZMgRBbDUQxAElFEUsBTFABJwlMUElFFEm9RQFEvkgXRQgnBkxQvkxJTgJFEEQkW0lFBEAAHSJJREsSvEixSbIISw+yByOyECKyAbMWK0xQsCNDSw0iWyULSwOBAwsKRQYnB0sRUL5MRRFEgWVFAiJFBCJFC0sKgWQOQQBaIkUKSwVLCw9BABtLBUsLCSQLSxBMW0lFDUEACksDSwwIRQQjRQpLCkEAJksFSwsISUUKgWQOQQAYSwgkC0sQTFtJRQ5BAApLA0sNCEUEI0UKSwlBAFdLCkUCIkUISwZLBg5BADdLBUsHCUsCEkEAAyNFCEsHQAAEIkL/PicFSxFQSb1FAUS+SBdFBUsDQAAEIkL/JksESwQKQv8eSwZLBglLAhJB/8wjRQhC/8ZLCiMIRQtC/0I2GgFJIlklCEsBFRJEVwIAiAA7FitMULAjQyIoZURJFRZXBgJMUCtMULAjQzYaAUkiWSUISwEVEkRXAgAiKGVEFRREMQAyCRJEKExnI0OKAQGL/ykSQQAKKYgADIGI6BQIiYv/iAABiYoBAYv/KRJBAAWB6OgBiYv/gARqb2luEkSBhOgBiQ==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }