{ "name": "WeeklyGame", "structs": { "Object92DC9662": [ { "name": "lun", "type": "uint64" }, { "name": "mar", "type": "uint64" }, { "name": "mer", "type": "uint64" }, { "name": "gio", "type": "uint64" }, { "name": "ven", "type": "uint64" }, { "name": "sab", "type": "uint64" }, { "name": "dom", "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": "Creates a new session and initializes weekday counters.", "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": "Joins an existing 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 the committed move and updates weekday counters.", "events": [], "recommendations": {} }, { "name": "claimWinnings", "args": [ { "type": "uint64", "name": "sessionID" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Allows an eligible player to claim their winnings.\nUses a pull-based payout pattern.", "events": [], "recommendations": {} }, { "name": "getRequiredMBR", "args": [ { "type": "string", "name": "command" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns the required MBR for the given command.", "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": "WeeklyGame contract.\n\nPlayers choose a weekday.\nThe total pot is split across active days and then among players\nwho selected the same day.", "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": { "days": { "keyType": "uint64", "valueType": "Object92DC9662", "desc": "Weekday counters per session.\nInitialized at session creation time to reserve MBR.", "prefix": "ZGM=" }, "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": [ 431, 790 ], "errorMessage": "Box must have value" }, { "pc": [ 1182 ], "errorMessage": "Command not supported" }, { "pc": [ 381 ], "errorMessage": "Commit phase has ended" }, { "pc": [ 499 ], "errorMessage": "Commit phase is still active" }, { "pc": [ 1120 ], "errorMessage": "Contract already initialized" }, { "pc": [ 556 ], "errorMessage": "Day counters not initialized" }, { "pc": [ 389 ], "errorMessage": "Fee receiver must be the contract" }, { "pc": [ 740 ], "errorMessage": "Game is not finished yet" }, { "pc": [ 375 ], "errorMessage": "Game session has not started yet" }, { "pc": [ 401 ], "errorMessage": "Incorrect participation fee amount" }, { "pc": [ 196 ], "errorMessage": "Insufficient MBR for session and day counters" }, { "pc": [ 692 ], "errorMessage": "Invalid Day: must be between 0 and 6" }, { "pc": [ 535 ], "errorMessage": "Invalid reveal: hash mismatch" }, { "pc": [ 217 ], "errorMessage": "Invalid start time: cannot start in the past" }, { "pc": [ 213 ], "errorMessage": "Invalid timeline: commit end must be before reveal end" }, { "pc": [ 206 ], "errorMessage": "Invalid timeline: start must be before commit end" }, { "pc": [ 191 ], "errorMessage": "MBR payment receiver must be contract" }, { "pc": [ 520 ], "errorMessage": "No commit found for this player or already revealed" }, { "pc": [ 910 ], "errorMessage": "No winnings calculated" }, { "pc": [ 90 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 158 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 1126 ], "errorMessage": "Only creator can initialize" }, { "pc": [ 417 ], "errorMessage": "Player already registered in this session" }, { "pc": [ 762 ], "errorMessage": "Player has not revealed or already claimed" }, { "pc": [ 505 ], "errorMessage": "Reveal phase has ended" }, { "pc": [ 363, 487, 730, 776 ], "errorMessage": "Session does not exist" }, { "pc": [ 222, 1083, 1117 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 331, 466, 1059, 1103 ], "errorMessage": "invalid array length header" }, { "pc": [ 169 ], "errorMessage": "invalid number of bytes for ObjectB555233E" }, { "pc": [ 338, 473, 1066, 1110 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 324, 447, 456, 719 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 179, 351 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDggMgogICAgYnl0ZWNibG9jayAiZ2FtZVR5cGUiICJuZXdHYW1lIiAiZ3MiIDB4MTUxZjdjNzUgInNlc3Npb25JRENvdW50ZXIiICJzYmFsIiAiZGMiICJwY29tIiAicGNobyIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyBnYW1lVHlwZSA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlY18wIC8vICJnYW1lVHlwZSIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBzZXNzaW9uSURDb3VudGVyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWMgNCAvLyAic2Vzc2lvbklEQ291bnRlciIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjI1CiAgICAvLyBleHBvcnQgY2xhc3MgV2Vla2x5R2FtZSBleHRlbmRzIEdhbWVDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4MmM0OWE1Y2YgMHgxMWJiNDE2NyAweDdlNjAwMjNjIDB4NzRiZWY4ODcgMHg5ZTRhM2FlNSAweDU2ODNlZTA4IDB4ZWNmMzM5ZTcgLy8gbWV0aG9kICJjcmVhdGVTZXNzaW9uKCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpLHBheSl1aW50NjQiLCBtZXRob2QgImpvaW5TZXNzaW9uKHVpbnQ2NCxieXRlW10scGF5KXZvaWQiLCBtZXRob2QgInJldmVhbE1vdmUodWludDY0LHVpbnQ2NCxieXRlW10pdm9pZCIsIG1ldGhvZCAiY2xhaW1XaW5uaW5ncyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRSZXF1aXJlZE1CUihzdHJpbmcpdWludDY0IiwgbWV0aG9kICJnZXRHYW1lVHlwZSgpYnl0ZVtdIiwgbWV0aG9kICJpbml0aWFsaXplKHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlU2Vzc2lvbiBqb2luU2Vzc2lvbiByZXZlYWxNb3ZlIGNsYWltV2lubmluZ3MgZ2V0UmVxdWlyZWRNQlIgZ2V0R2FtZVR5cGUgaW5pdGlhbGl6ZQogICAgZXJyCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MjUKICAgIC8vIGV4cG9ydCBjbGFzcyBXZWVrbHlHYW1lIGV4dGVuZHMgR2FtZUNvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AgJiYgY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo6V2Vla2x5R2FtZS5jcmVhdGVTZXNzaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlU2Vzc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MzUKICAgIC8vIHB1YmxpYyBjcmVhdGVTZXNzaW9uKGNvbmZpZzogR2FtZUNvbmZpZywgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuKTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBPYmplY3RCNTU1MjMzRQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjM2CiAgICAvLyBjb25zdCBkYXlzTUJSID0gdGhpcy5nZXRSZXF1aXJlZE1CUignbmV3R2FtZScpCiAgICBieXRlY18xIC8vICJuZXdHYW1lIgogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjpXZWVrbHlHYW1lLmdldFJlcXVpcmVkTUJSCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjM4CiAgICAvLyBhc3NlcnQobWJyUGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdNQlIgcGF5bWVudCByZWNlaXZlciBtdXN0IGJlIGNvbnRyYWN0JykKICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgcmVjZWl2ZXIgbXVzdCBiZSBjb250cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czozOQogICAgLy8gYXNzZXJ0KG1iclBheW1lbnQuYW1vdW50ID49IGRheXNNQlIsICdJbnN1ZmZpY2llbnQgTUJSIGZvciBzZXNzaW9uIGFuZCBkYXkgY291bnRlcnMnKQogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICA8PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBNQlIgZm9yIHNlc3Npb24gYW5kIGRheSBjb3VudGVycwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6OTYKICAgIC8vIGFzc2VydChjb25maWcuc3RhcnRBdCA8IGNvbmZpZy5lbmRDb21taXRBdCwgJ0ludmFsaWQgdGltZWxpbmU6IHN0YXJ0IG11c3QgYmUgYmVmb3JlIGNvbW1pdCBlbmQnKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHRpbWVsaW5lOiBzdGFydCBtdXN0IGJlIGJlZm9yZSBjb21taXQgZW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo5NwogICAgLy8gYXNzZXJ0KGNvbmZpZy5lbmRDb21taXRBdCA8IGNvbmZpZy5lbmRSZXZlYWxBdCwgJ0ludmFsaWQgdGltZWxpbmU6IGNvbW1pdCBlbmQgbXVzdCBiZSBiZWZvcmUgcmV2ZWFsIGVuZCcpCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIDwKICAgIGFzc2VydCAvLyBJbnZhbGlkIHRpbWVsaW5lOiBjb21taXQgZW5kIG11c3QgYmUgYmVmb3JlIHJldmVhbCBlbmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjk4CiAgICAvLyBhc3NlcnQoY29uZmlnLnN0YXJ0QXQgPj0gR2xvYmFsLnJvdW5kLCAnSW52YWxpZCBzdGFydCB0aW1lOiBjYW5ub3Qgc3RhcnQgaW4gdGhlIHBhc3QnKQogICAgZ2xvYmFsIFJvdW5kCiAgICA+PQogICAgYXNzZXJ0IC8vIEludmFsaWQgc3RhcnQgdGltZTogY2Fubm90IHN0YXJ0IGluIHRoZSBwYXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIGNvbnN0IHNlc3Npb25JRCA9IHRoaXMuc2Vzc2lvbklEQ291bnRlci52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBzZXNzaW9uSURDb3VudGVyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWMgNCAvLyAic2Vzc2lvbklEQ291bnRlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gY29uc3Qgc2Vzc2lvbklEID0gdGhpcy5zZXNzaW9uSURDb3VudGVyLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyB0aGlzLmdhbWVTZXNzaW9ucyhzZXNzaW9uSUQpLnZhbHVlID0gY2xvbmUoY29uZmlnKQogICAgZHVwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo2OAogICAgLy8gZ2FtZVNlc3Npb25zID0gQm94TWFwPHVpbnQ2NCwgR2FtZUNvbmZpZz4oeyBrZXlQcmVmaXg6ICdncycgfSkKICAgIGJ5dGVjXzIgLy8gImdzIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyB0aGlzLmdhbWVTZXNzaW9ucyhzZXNzaW9uSUQpLnZhbHVlID0gY2xvbmUoY29uZmlnKQogICAgdW5jb3ZlciAzCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo3MwogICAgLy8gc2Vzc2lvbkJhbGFuY2VzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3NiYWwnIH0pCiAgICBieXRlYyA1IC8vICJzYmFsIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTAzCiAgICAvLyB0aGlzLnNlc3Npb25CYWxhbmNlcyhzZXNzaW9uSUQpLnZhbHVlID0gMAogICAgaW50Y18xIC8vIDAKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjEwNAogICAgLy8gdGhpcy5zZXNzaW9uSURDb3VudGVyLnZhbHVlID0gc2Vzc2lvbklEICsgMQogICAgc3dhcAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBzZXNzaW9uSURDb3VudGVyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWMgNCAvLyAic2Vzc2lvbklEQ291bnRlciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjEwNAogICAgLy8gdGhpcy5zZXNzaW9uSURDb3VudGVyLnZhbHVlID0gc2Vzc2lvbklEICsgMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MzAKICAgIC8vIGRheXMgPSBCb3hNYXA8dWludDY0LCBkYXlzQ291bnQ+KHsga2V5UHJlZml4OiAnZGMnIH0pCiAgICBieXRlYyA2IC8vICJkYyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGNvbnN0IGluaXQ6IGRheXNDb3VudCA9IHsgbHVuOiAwLCBtYXI6IDAsIG1lcjogMCwgZ2lvOiAwLCB2ZW46IDAsIHNhYjogMCwgZG9tOiAwIH0KICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6NDUKICAgIC8vIHRoaXMuZGF5cyhzZXNzaW9uSUQpLnZhbHVlID0gY2xvbmUoaW5pdCkKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MzUKICAgIC8vIHB1YmxpYyBjcmVhdGVTZXNzaW9uKGNvbmZpZzogR2FtZUNvbmZpZywgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuKTogdWludDY0IHsKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjpXZWVrbHlHYW1lLmpvaW5TZXNzaW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKam9pblNlc3Npb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBwdWJsaWMgam9pblNlc3Npb24oc2Vzc2lvbklEOiB1aW50NjQsIGNvbW1pdDogYnl0ZXMsIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQodGhpcy5nYW1lU2Vzc2lvbnMoc2Vzc2lvbklEKS5leGlzdHMsICdTZXNzaW9uIGRvZXMgbm90IGV4aXN0JykKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIGdhbWVTZXNzaW9ucyA9IEJveE1hcDx1aW50NjQsIEdhbWVDb25maWc+KHsga2V5UHJlZml4OiAnZ3MnIH0pCiAgICBieXRlY18yIC8vICJncyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gYXNzZXJ0KHRoaXMuZ2FtZVNlc3Npb25zKHNlc3Npb25JRCkuZXhpc3RzLCAnU2Vzc2lvbiBkb2VzIG5vdCBleGlzdCcpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFNlc3Npb24gZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gY29uc3QgY29uZmlnID0gY2xvbmUodGhpcy5nYW1lU2Vzc2lvbnMoc2Vzc2lvbklEKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyBjb25zdCBjdXJyZW50QmxvY2sgPSBHbG9iYWwucm91bmQKICAgIGdsb2JhbCBSb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyBhc3NlcnQoY3VycmVudEJsb2NrID49IGNvbmZpZy5zdGFydEF0LCAnR2FtZSBzZXNzaW9uIGhhcyBub3Qgc3RhcnRlZCB5ZXQnKQogICAgZGlnIDEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gR2FtZSBzZXNzaW9uIGhhcyBub3Qgc3RhcnRlZCB5ZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gYXNzZXJ0KGN1cnJlbnRCbG9jayA8PSBjb25maWcuZW5kQ29tbWl0QXQsICdDb21taXQgcGhhc2UgaGFzIGVuZGVkJykKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gQ29tbWl0IHBoYXNlIGhhcyBlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTIxCiAgICAvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdGZWUgcmVjZWl2ZXIgbXVzdCBiZSB0aGUgY29udHJhY3QnKQogICAgZGlnIDIKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBGZWUgcmVjZWl2ZXIgbXVzdCBiZSB0aGUgY29udHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gYXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSBjb25maWcucGFydGljaXBhdGlvbiwgJ0luY29ycmVjdCBwYXJ0aWNpcGF0aW9uIGZlZSBhbW91bnQnKQogICAgdW5jb3ZlciAyCiAgICBndHhucyBBbW91bnQKICAgIHN3YXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBJbmNvcnJlY3QgcGFydGljaXBhdGlvbiBmZWUgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIHJldHVybiBzaGEyNTYoaXRvYihzZXNzaW9uSUQpLmNvbmNhdChwbGF5ZXIuYnl0ZXMpKQogICAgZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gY29uc3QgcGxheWVyQWRkciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIHJldHVybiBzaGEyNTYoaXRvYihzZXNzaW9uSUQpLmNvbmNhdChwbGF5ZXIuYnl0ZXMpKQogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBwbGF5ZXJDb21taXQgPSBCb3hNYXA8Ynl0ZXMsIGJ5dGVzPih7IGtleVByZWZpeDogJ3Bjb20nIH0pCiAgICBieXRlYyA3IC8vICJwY29tIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGFzc2VydCghdGhpcy5wbGF5ZXJDb21taXQocGxheWVyS2V5KS5leGlzdHMsICdQbGF5ZXIgYWxyZWFkeSByZWdpc3RlcmVkIGluIHRoaXMgc2Vzc2lvbicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIFBsYXllciBhbHJlYWR5IHJlZ2lzdGVyZWQgaW4gdGhpcyBzZXNzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIHRoaXMucGxheWVyQ29tbWl0KHBsYXllcktleSkudmFsdWUgPSBjb21taXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDMKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjczCiAgICAvLyBzZXNzaW9uQmFsYW5jZXMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAnc2JhbCcgfSkKICAgIGJ5dGVjIDUgLy8gInNiYWwiCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTMwCiAgICAvLyB0aGlzLnNlc3Npb25CYWxhbmNlcyhzZXNzaW9uSUQpLnZhbHVlICs9IHBheW1lbnQuYW1vdW50CiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBidG9pCiAgICB1bmNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6NTMKICAgIC8vIHB1YmxpYyBqb2luU2Vzc2lvbihzZXNzaW9uSUQ6IHVpbnQ2NCwgY29tbWl0OiBieXRlcywgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuKTogdm9pZCB7CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo6V2Vla2x5R2FtZS5yZXZlYWxNb3ZlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmV2ZWFsTW92ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6NjAKICAgIC8vIHB1YmxpYyByZXZlYWxNb3ZlKHNlc3Npb25JZDogdWludDY0LCBjaG9pY2U6IHVpbnQ2NCwgc2FsdDogYnl0ZXMpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTM4CiAgICAvLyBhc3NlcnQodGhpcy5nYW1lU2Vzc2lvbnMoc2Vzc2lvbklEKS5leGlzdHMsICdTZXNzaW9uIGRvZXMgbm90IGV4aXN0JykKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBnYW1lU2Vzc2lvbnMgPSBCb3hNYXA8dWludDY0LCBHYW1lQ29uZmlnPih7IGtleVByZWZpeDogJ2dzJyB9KQogICAgYnl0ZWNfMiAvLyAiZ3MiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxMzgKICAgIC8vIGFzc2VydCh0aGlzLmdhbWVTZXNzaW9ucyhzZXNzaW9uSUQpLmV4aXN0cywgJ1Nlc3Npb24gZG9lcyBub3QgZXhpc3QnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBTZXNzaW9uIGRvZXMgbm90IGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNDAKICAgIC8vIGNvbnN0IGNvbmZpZyA9IGNsb25lKHRoaXMuZ2FtZVNlc3Npb25zKHNlc3Npb25JRCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gY29uc3QgY3VycmVudEJsb2NrID0gR2xvYmFsLnJvdW5kCiAgICBnbG9iYWwgUm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gYXNzZXJ0KGN1cnJlbnRCbG9jayA+IGNvbmZpZy5lbmRDb21taXRBdCwgJ0NvbW1pdCBwaGFzZSBpcyBzdGlsbCBhY3RpdmUnKQogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDEKICAgIDwKICAgIGFzc2VydCAvLyBDb21taXQgcGhhc2UgaXMgc3RpbGwgYWN0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNDQKICAgIC8vIGFzc2VydChjdXJyZW50QmxvY2sgPD0gY29uZmlnLmVuZFJldmVhbEF0LCAnUmV2ZWFsIHBoYXNlIGhhcyBlbmRlZCcpCiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPD0KICAgIGFzc2VydCAvLyBSZXZlYWwgcGhhc2UgaGFzIGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIHJldHVybiBzaGEyNTYoaXRvYihzZXNzaW9uSUQpLmNvbmNhdChwbGF5ZXIuYnl0ZXMpKQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIGNvbnN0IHBsYXllckFkZHIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MjE0CiAgICAvLyByZXR1cm4gc2hhMjU2KGl0b2Ioc2Vzc2lvbklEKS5jb25jYXQocGxheWVyLmJ5dGVzKSkKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gcGxheWVyQ29tbWl0ID0gQm94TWFwPGJ5dGVzLCBieXRlcz4oeyBrZXlQcmVmaXg6ICdwY29tJyB9KQogICAgYnl0ZWMgNyAvLyAicGNvbSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gYXNzZXJ0KHRoaXMucGxheWVyQ29tbWl0KHBsYXllcktleSkuZXhpc3RzLCAnTm8gY29tbWl0IGZvdW5kIGZvciB0aGlzIHBsYXllciBvciBhbHJlYWR5IHJldmVhbGVkJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTm8gY29tbWl0IGZvdW5kIGZvciB0aGlzIHBsYXllciBvciBhbHJlYWR5IHJldmVhbGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGNvbnN0IHN0b3JlZENvbW1pdCA9IHRoaXMucGxheWVyQ29tbWl0KHBsYXllcktleSkudmFsdWUKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNTIKICAgIC8vIGNvbnN0IGNvbXB1dGVkQ29tbWl0ID0gc2hhMjU2KGl0b2IoY2hvaWNlKS5jb25jYXQoc2FsdCkpCiAgICBkaWcgNQogICAgaXRvYgogICAgZHVwCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNTQKICAgIC8vIGFzc2VydChjb21wdXRlZENvbW1pdCA9PT0gc3RvcmVkQ29tbWl0LCAnSW52YWxpZCByZXZlYWw6IGhhc2ggbWlzbWF0Y2gnKQogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcmV2ZWFsOiBoYXNoIG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo2MwogICAgLy8gcGxheWVyQ2hvaWNlID0gQm94TWFwPGJ5dGVzLCB1aW50NjQ+KHsga2V5UHJlZml4OiAncGNobycgfSkKICAgIGJ5dGVjIDggLy8gInBjaG8iCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyB0aGlzLnBsYXllckNob2ljZShwbGF5ZXJLZXkpLnZhbHVlID0gY2hvaWNlCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIHRoaXMucGxheWVyQ29tbWl0KHBsYXllcktleSkuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czozMAogICAgLy8gZGF5cyA9IEJveE1hcDx1aW50NjQsIGRheXNDb3VudD4oeyBrZXlQcmVmaXg6ICdkYycgfSkKICAgIGJ5dGVjIDYgLy8gImRjIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIGNvbnN0IFtjdXJyZW50LCBleGlzdHNdID0gY2xvbmUoZGF5Qm94Lm1heWJlKCkpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjY3CiAgICAvLyBhc3NlcnQoZXhpc3RzLCAnRGF5IGNvdW50ZXJzIG5vdCBpbml0aWFsaXplZCcpCiAgICBhc3NlcnQgLy8gRGF5IGNvdW50ZXJzIG5vdCBpbml0aWFsaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo3MC03MgogICAgLy8gY2FzZSAwOgogICAgLy8gICBjdXJyZW50Lmx1biA9IGN1cnJlbnQubHVuICsgMQogICAgLy8gICBicmVhawogICAgYm56IHJldmVhbE1vdmVfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBjdXJyZW50Lmx1biA9IGN1cnJlbnQubHVuICsgMQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDEKCnJldmVhbE1vdmVfYmxvY2tAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyBkYXlCb3gudmFsdWUgPSBjbG9uZShjdXJyZW50KQogICAgZHVwMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo2MAogICAgLy8gcHVibGljIHJldmVhbE1vdmUoc2Vzc2lvbklkOiB1aW50NjQsIGNob2ljZTogdWludDY0LCBzYWx0OiBieXRlcyk6IHZvaWQgewogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKcmV2ZWFsTW92ZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjczCiAgICAvLyBjYXNlIDE6CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjczLTc1CiAgICAvLyBjYXNlIDE6CiAgICAvLyAgIGN1cnJlbnQubWFyID0gY3VycmVudC5tYXIgKyAxCiAgICAvLyAgIGJyZWFrCiAgICBieiByZXZlYWxNb3ZlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo3NAogICAgLy8gY3VycmVudC5tYXIgPSBjdXJyZW50Lm1hciArIDEKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgOAogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBicmVhawogICAgYiByZXZlYWxNb3ZlX2Jsb2NrQDI0CgpyZXZlYWxNb3ZlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6NzYKICAgIC8vIGNhc2UgMjoKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6NzYtNzgKICAgIC8vIGNhc2UgMjoKICAgIC8vICAgY3VycmVudC5tZXIgPSBjdXJyZW50Lm1lciArIDEKICAgIC8vICAgYnJlYWsKICAgIGJ6IHJldmVhbE1vdmVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gY3VycmVudC5tZXIgPSBjdXJyZW50Lm1lciArIDEKICAgIGR1cG4gMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAxNgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjc4CiAgICAvLyBicmVhawogICAgYiByZXZlYWxNb3ZlX2Jsb2NrQDI0CgpyZXZlYWxNb3ZlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjc5CiAgICAvLyBjYXNlIDM6CiAgICBkaWcgMgogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjc5LTgxCiAgICAvLyBjYXNlIDM6CiAgICAvLyAgIGN1cnJlbnQuZ2lvID0gY3VycmVudC5naW8gKyAxCiAgICAvLyAgIGJyZWFrCiAgICBieiByZXZlYWxNb3ZlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6ODAKICAgIC8vIGN1cnJlbnQuZ2lvID0gY3VycmVudC5naW8gKyAxCiAgICBkdXBuIDIKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMjQKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo4MQogICAgLy8gYnJlYWsKICAgIGIgcmV2ZWFsTW92ZV9ibG9ja0AyNAoKcmV2ZWFsTW92ZV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo4MgogICAgLy8gY2FzZSA0OgogICAgZGlnIDIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo4Mi04NAogICAgLy8gY2FzZSA0OgogICAgLy8gICBjdXJyZW50LnZlbiA9IGN1cnJlbnQudmVuICsgMQogICAgLy8gICBicmVhawogICAgYnogcmV2ZWFsTW92ZV9hZnRlcl9pZl9lbHNlQDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyBjdXJyZW50LnZlbiA9IGN1cnJlbnQudmVuICsgMQogICAgZHVwbiAyCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDMyCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIGJyZWFrCiAgICBiIHJldmVhbE1vdmVfYmxvY2tAMjQKCnJldmVhbE1vdmVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6ODUKICAgIC8vIGNhc2UgNToKICAgIGRpZyAyCiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6ODUtODcKICAgIC8vIGNhc2UgNToKICAgIC8vICAgY3VycmVudC5zYWIgPSBjdXJyZW50LnNhYiArIDEKICAgIC8vICAgYnJlYWsKICAgIGJ6IHJldmVhbE1vdmVfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo4NgogICAgLy8gY3VycmVudC5zYWIgPSBjdXJyZW50LnNhYiArIDEKICAgIGR1cG4gMgogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiA0MAogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyBicmVhawogICAgYiByZXZlYWxNb3ZlX2Jsb2NrQDI0CgpyZXZlYWxNb3ZlX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyBjYXNlIDY6CiAgICBkaWcgMgogICAgcHVzaGludCA2IC8vIDYKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjg4LTkwCiAgICAvLyBjYXNlIDY6CiAgICAvLyAgIGN1cnJlbnQuZG9tID0gY3VycmVudC5kb20gKyAxCiAgICAvLyAgIGJyZWFrCiAgICBhc3NlcnQgLy8gSW52YWxpZCBEYXk6IG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBjdXJyZW50LmRvbSA9IGN1cnJlbnQuZG9tICsgMQogICAgZHVwbiAyCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ4CiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6OTAKICAgIC8vIGJyZWFrCiAgICBiIHJldmVhbE1vdmVfYmxvY2tAMjQKCgovLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjpXZWVrbHlHYW1lLmNsYWltV2lubmluZ3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbVdpbm5pbmdzOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyBwdWJsaWMgY2xhaW1XaW5uaW5ncyhzZXNzaW9uSUQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIHJldHVybiB0aGlzLmdhbWVTZXNzaW9ucyhzZXNzaW9uSUQpLmV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIGdhbWVTZXNzaW9ucyA9IEJveE1hcDx1aW50NjQsIEdhbWVDb25maWc+KHsga2V5UHJlZml4OiAnZ3MnIH0pCiAgICBieXRlY18yIC8vICJncyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gcmV0dXJuIHRoaXMuZ2FtZVNlc3Npb25zKHNlc3Npb25JRCkuZXhpc3RzCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxMDMKICAgIC8vIGFzc2VydCh0aGlzLnNlc3Npb25FeGlzdHMoc2Vzc2lvbklEKSwgJ1Nlc3Npb24gZG9lcyBub3QgZXhpc3QnKQogICAgYXNzZXJ0IC8vIFNlc3Npb24gZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBjb25zdCBjb25maWcgPSBjbG9uZSh0aGlzLmdhbWVTZXNzaW9ucyhzZXNzaW9uSUQpLnZhbHVlKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjEwNgogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA+IGNvbmZpZy5lbmRSZXZlYWxBdCwgJ0dhbWUgaXMgbm90IGZpbmlzaGVkIHlldCcpCiAgICBnbG9iYWwgUm91bmQKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICA+CiAgICBhc3NlcnQgLy8gR2FtZSBpcyBub3QgZmluaXNoZWQgeWV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjEwOAogICAgLy8gY29uc3QgcGxheWVyQWRkciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gcmV0dXJuIHNoYTI1NihpdG9iKHNlc3Npb25JRCkuY29uY2F0KHBsYXllci5ieXRlcykpCiAgICBkaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjYzCiAgICAvLyBwbGF5ZXJDaG9pY2UgPSBCb3hNYXA8Ynl0ZXMsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwY2hvJyB9KQogICAgYnl0ZWMgOCAvLyAicGNobyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gYXNzZXJ0KHRoaXMucGxheWVyQ2hvaWNlKHBsYXllcktleSkuZXhpc3RzLCAnUGxheWVyIGhhcyBub3QgcmV2ZWFsZWQgb3IgYWxyZWFkeSBjbGFpbWVkJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUGxheWVyIGhhcyBub3QgcmV2ZWFsZWQgb3IgYWxyZWFkeSBjbGFpbWVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gY29uc3QgY2hvaWNlID0gdGhpcy5wbGF5ZXJDaG9pY2UocGxheWVyS2V5KS52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo3MwogICAgLy8gc2Vzc2lvbkJhbGFuY2VzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3NiYWwnIH0pCiAgICBieXRlYyA1IC8vICJzYmFsIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTk4CiAgICAvLyBhc3NlcnQodGhpcy5zZXNzaW9uQmFsYW5jZXMoc2Vzc2lvbklEKS5leGlzdHMsICdTZXNzaW9uIGRvZXMgbm90IGV4aXN0JykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gU2Vzc2lvbiBkb2VzIG5vdCBleGlzdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTk5CiAgICAvLyByZXR1cm4gdGhpcy5zZXNzaW9uQmFsYW5jZXMoc2Vzc2lvbklEKS52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjMwCiAgICAvLyBkYXlzID0gQm94TWFwPHVpbnQ2NCwgZGF5c0NvdW50Pih7IGtleVByZWZpeDogJ2RjJyB9KQogICAgYnl0ZWMgNiAvLyAiZGMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTM5CiAgICAvLyBjb25zdCBjb3VudGVycyA9IGNsb25lKHRoaXMuZGF5cyhzZXNzaW9uSUQpLnZhbHVlKQogICAgYm94X2dldAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE0MQogICAgLy8gbGV0IGFjdGl2ZURheXNDb3VudDogdWludDY0ID0gMAogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBpZiAoY291bnRlcnMubHVuID4gMCkgYWN0aXZlRGF5c0NvdW50ICs9IDEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBieiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VANQogICAgaW50Y18wIC8vIDEKICAgIGJ1cnkgMgoKY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE0NAogICAgLy8gaWYgKGNvdW50ZXJzLm1hciA+IDApIGFjdGl2ZURheXNDb3VudCArPSAxCiAgICBkaWcgMgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTUKICAgIGJ6IGNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUA3CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMgoKY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gaWYgKGNvdW50ZXJzLm1lciA+IDApIGFjdGl2ZURheXNDb3VudCArPSAxCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxNAogICAgYnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDkKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTQ2CiAgICAvLyBpZiAoY291bnRlcnMuZ2lvID4gMCkgYWN0aXZlRGF5c0NvdW50ICs9IDEKICAgIGRpZyAyCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEzCiAgICBieiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMTEKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE0NwogICAgLy8gaWYgKGNvdW50ZXJzLnZlbiA+IDApIGFjdGl2ZURheXNDb3VudCArPSAxCiAgICBkaWcgMgogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxMgogICAgYnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDEzCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMgoKY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxNDgKICAgIC8vIGlmIChjb3VudGVycy5zYWIgPiAwKSBhY3RpdmVEYXlzQ291bnQgKz0gMQogICAgZGlnIDIKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGJ6IGNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKCmNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyBpZiAoY291bnRlcnMuZG9tID4gMCkgYWN0aXZlRGF5c0NvdW50ICs9IDEKICAgIGRpZyAyCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDEwCiAgICBieiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMTcKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAyCgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE1MQogICAgLy8gaWYgKGFjdGl2ZURheXNDb3VudCA9PT0gMCkgcmV0dXJuIDAKICAgIGRpZyAxCiAgICBibnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDE5CiAgICBpbnRjXzEgLy8gMAoKY2xhaW1XaW5uaW5nc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6OldlZWtseUdhbWUuY2FsY3VsYXRlUGxheWVyV2luQDM4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIGFzc2VydChwcml6ZUFtb3VudCA+IDAsICdObyB3aW5uaW5ncyBjYWxjdWxhdGVkJykKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIHdpbm5pbmdzIGNhbGN1bGF0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTIxCiAgICAvLyB0aGlzLnBsYXllckNob2ljZShwbGF5ZXJLZXkpLmRlbGV0ZSgpCiAgICBkaWcgNgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjEyMy0xMjkKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBwbGF5ZXJBZGRyLm5hdGl2ZSwKICAgIC8vICAgICBhbW91bnQ6IHByaXplQW1vdW50LAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkaWcgNwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxMjMtMTI4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogcGxheWVyQWRkci5uYXRpdmUsCiAgICAvLyAgICAgYW1vdW50OiBwcml6ZUFtb3VudCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzAgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGZlZTogMCwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxMjMtMTI5CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogcGxheWVyQWRkci5uYXRpdmUsCiAgICAvLyAgICAgYW1vdW50OiBwcml6ZUFtb3VudCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyBwdWJsaWMgY2xhaW1XaW5uaW5ncyhzZXNzaW9uSUQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBpdG9iCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE1MwogICAgLy8gY29uc3QgcG90UGVyRGF5OiB1aW50NjQgPSB0b3RhbFBvdCAvIGFjdGl2ZURheXNDb3VudAogICAgZGlnIDMKICAgIGRpZyAyCiAgICAvCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTU3LTE1OQogICAgLy8gY2FzZSAwOgogICAgLy8gICBwbGF5ZXJzSW5UaGF0RGF5ID0gY291bnRlcnMubHVuCiAgICAvLyAgIGJyZWFrCiAgICBkaWcgNAogICAgYnogY2xhaW1XaW5uaW5nc19ibG9ja0AzNAogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxNjAKICAgIC8vIGNhc2UgMToKICAgIGRpZyA0CiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTYwLTE2MgogICAgLy8gY2FzZSAxOgogICAgLy8gICBwbGF5ZXJzSW5UaGF0RGF5ID0gY291bnRlcnMubWFyCiAgICAvLyAgIGJyZWFrCiAgICBieiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMjMKICAgIGRpZyAxMwogICAgYnVyeSAxCgpjbGFpbVdpbm5pbmdzX2Jsb2NrQDM0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxODIKICAgIC8vIHJldHVybiBwbGF5ZXJzSW5UaGF0RGF5ID09PSAwID8gMCA6IHBvdFBlckRheSAvIHBsYXllcnNJblRoYXREYXkKICAgIGR1cAogICAgYm56IGNsYWltV2lubmluZ3NfdGVybmFyeV9mYWxzZUAzNgogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTE1CiAgICAvLyBjb25zdCBwcml6ZUFtb3VudCA9IHRoaXMuY2FsY3VsYXRlUGxheWVyV2luKHNlc3Npb25JRCwgY2hvaWNlKQogICAgYiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo6V2Vla2x5R2FtZS5jYWxjdWxhdGVQbGF5ZXJXaW5AMzgKCmNsYWltV2lubmluZ3NfdGVybmFyeV9mYWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyByZXR1cm4gcGxheWVyc0luVGhhdERheSA9PT0gMCA/IDAgOiBwb3RQZXJEYXkgLyBwbGF5ZXJzSW5UaGF0RGF5CiAgICBkaWcgNwogICAgZGlnIDEKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTE1CiAgICAvLyBjb25zdCBwcml6ZUFtb3VudCA9IHRoaXMuY2FsY3VsYXRlUGxheWVyV2luKHNlc3Npb25JRCwgY2hvaWNlKQogICAgYiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo6V2Vla2x5R2FtZS5jYWxjdWxhdGVQbGF5ZXJXaW5AMzgKCmNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTYzCiAgICAvLyBjYXNlIDI6CiAgICBkaWcgNAogICAgaW50Y18zIC8vIDIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE2My0xNjUKICAgIC8vIGNhc2UgMjoKICAgIC8vICAgcGxheWVyc0luVGhhdERheSA9IGNvdW50ZXJzLm1lcgogICAgLy8gICBicmVhawogICAgYnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDI1CiAgICBkaWcgMTIKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxNjUKICAgIC8vIGJyZWFrCiAgICBiIGNsYWltV2lubmluZ3NfYmxvY2tAMzQKCmNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBjYXNlIDM6CiAgICBkaWcgNAogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE2Ni0xNjgKICAgIC8vIGNhc2UgMzoKICAgIC8vICAgcGxheWVyc0luVGhhdERheSA9IGNvdW50ZXJzLmdpbwogICAgLy8gICBicmVhawogICAgYnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDI3CiAgICBkaWcgMTEKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxNjgKICAgIC8vIGJyZWFrCiAgICBiIGNsYWltV2lubmluZ3NfYmxvY2tAMzQKCmNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTY5CiAgICAvLyBjYXNlIDQ6CiAgICBkaWcgNAogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE2OS0xNzEKICAgIC8vIGNhc2UgNDoKICAgIC8vICAgcGxheWVyc0luVGhhdERheSA9IGNvdW50ZXJzLnZlbgogICAgLy8gICBicmVhawogICAgYnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDI5CiAgICBkaWcgMTAKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxNzEKICAgIC8vIGJyZWFrCiAgICBiIGNsYWltV2lubmluZ3NfYmxvY2tAMzQKCmNsYWltV2lubmluZ3NfYWZ0ZXJfaWZfZWxzZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBjYXNlIDU6CiAgICBkaWcgNAogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE3Mi0xNzQKICAgIC8vIGNhc2UgNToKICAgIC8vICAgcGxheWVyc0luVGhhdERheSA9IGNvdW50ZXJzLnNhYgogICAgLy8gICBicmVhawogICAgYnogY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDMxCiAgICBkaWcgOQogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gYnJlYWsKICAgIGIgY2xhaW1XaW5uaW5nc19ibG9ja0AzNAoKY2xhaW1XaW5uaW5nc19hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIGNhc2UgNjoKICAgIGRpZyA0CiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTc1LTE3NwogICAgLy8gY2FzZSA2OgogICAgLy8gICBwbGF5ZXJzSW5UaGF0RGF5ID0gY291bnRlcnMuZG9tCiAgICAvLyAgIGJyZWFrCiAgICBieiBjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMzMKICAgIGRpZyA4CiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTc3CiAgICAvLyBicmVhawogICAgYiBjbGFpbVdpbm5pbmdzX2Jsb2NrQDM0CgpjbGFpbVdpbm5pbmdzX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE3OQogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gY29uc3QgcHJpemVBbW91bnQgPSB0aGlzLmNhbGN1bGF0ZVBsYXllcldpbihzZXNzaW9uSUQsIGNob2ljZSkKICAgIGIgY2xhaW1XaW5uaW5nc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6OldlZWtseUdhbWUuY2FsY3VsYXRlUGxheWVyV2luQDM4CgoKLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo6V2Vla2x5R2FtZS5nZXRSZXF1aXJlZE1CUltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFJlcXVpcmVkTUJSOgogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxODgKICAgIC8vIHB1YmxpYyBnZXRSZXF1aXJlZE1CUihjb21tYW5kOiAnbmV3R2FtZScgfCAnam9pbicpOiB1aW50NjQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo6V2Vla2x5R2FtZS5nZXRSZXF1aXJlZE1CUgogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjpHYW1lQ29udHJhY3QuZ2V0R2FtZVR5cGVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRHYW1lVHlwZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjc5CiAgICAvLyByZXR1cm4gdGhpcy5nYW1lVHlwZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyBnYW1lVHlwZSA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlY18wIC8vICJnYW1lVHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjc5CiAgICAvLyByZXR1cm4gdGhpcy5nYW1lVHlwZS52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjc4CiAgICAvLyBwdWJsaWMgZ2V0R2FtZVR5cGUoKTogYnl0ZXMgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo6R2FtZUNvbnRyYWN0LmluaXRpYWxpemVbcm91dGluZ10oKSAtPiB2b2lkOgppbml0aWFsaXplOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIHB1YmxpYyBpbml0aWFsaXplKGdhbWVUeXBlOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo4NwogICAgLy8gYXNzZXJ0KHRoaXMuZ2FtZVR5cGUudmFsdWUubGVuZ3RoID09PSAwLCAnQ29udHJhY3QgYWxyZWFkeSBpbml0aWFsaXplZCcpCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGdhbWVUeXBlID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjXzAgLy8gImdhbWVUeXBlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIGFzc2VydCh0aGlzLmdhbWVUeXBlLnZhbHVlLmxlbmd0aCA9PT0gMCwgJ0NvbnRyYWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGxlbgogICAgIQogICAgYXNzZXJ0IC8vIENvbnRyYWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCAnT25seSBjcmVhdG9yIGNhbiBpbml0aWFsaXplJykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIGluaXRpYWxpemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyBnYW1lVHlwZSA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlY18wIC8vICJnYW1lVHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyB0aGlzLmdhbWVUeXBlLnZhbHVlID0gQnl0ZXMoZ2FtZVR5cGUpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIHB1YmxpYyBpbml0aWFsaXplKGdhbWVUeXBlOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjpXZWVrbHlHYW1lLmdldFJlcXVpcmVkTUJSKGNvbW1hbmQ6IGJ5dGVzKSAtPiB1aW50NjQ6CnNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6OldlZWtseUdhbWUuZ2V0UmVxdWlyZWRNQlI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvd2Vla2x5R2FtZS9jb250cmFjdC5hbGdvLnRzOjE4OAogICAgLy8gcHVibGljIGdldFJlcXVpcmVkTUJSKGNvbW1hbmQ6ICduZXdHYW1lJyB8ICdqb2luJyk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTg5CiAgICAvLyBpZiAoY29tbWFuZCA9PT0gJ25ld0dhbWUnKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzEgLy8gIm5ld0dhbWUiCiAgICA9PQogICAgYnogc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czo6V2Vla2x5R2FtZS5nZXRSZXF1aXJlZE1CUl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyByZXR1cm4gQm94TUJSICsgc3VwZXIuZ2V0UmVxdWlyZWRNQlIoJ25ld0dhbWUnKQogICAgYnl0ZWNfMSAvLyAibmV3R2FtZSIKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6OkdhbWVDb250cmFjdC5nZXRSZXF1aXJlZE1CUgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6MTY1CiAgICAvLyByZXR1cm4gMjUwMCArIDQwMCAqIChrZXlTaXplICsgdmFsdWVTaXplKQogICAgcHVzaGludCAyODkwMCAvLyAyODkwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxOTEKICAgIC8vIHJldHVybiBCb3hNQlIgKyBzdXBlci5nZXRSZXF1aXJlZE1CUignbmV3R2FtZScpCiAgICArCiAgICByZXRzdWIKCnNtYXJ0X2NvbnRyYWN0cy93ZWVrbHlHYW1lL2NvbnRyYWN0LmFsZ28udHM6OldlZWtseUdhbWUuZ2V0UmVxdWlyZWRNQlJfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3dlZWtseUdhbWUvY29udHJhY3QuYWxnby50czoxOTMKICAgIC8vIHJldHVybiBzdXBlci5nZXRSZXF1aXJlZE1CUihjb21tYW5kKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjpHYW1lQ29udHJhY3QuZ2V0UmVxdWlyZWRNQlIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjpHYW1lQ29udHJhY3QuZ2V0UmVxdWlyZWRNQlIoY29tbWFuZDogYnl0ZXMpIC0+IHVpbnQ2NDoKc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6OkdhbWVDb250cmFjdC5nZXRSZXF1aXJlZE1CUjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE3MQogICAgLy8gcHJvdGVjdGVkIGdldFJlcXVpcmVkTUJSKGNvbW1hbmQ6ICduZXdHYW1lJyB8ICdqb2luJyk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gaWYgKGNvbW1hbmQgPT09ICduZXdHYW1lJykgewogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18xIC8vICJuZXdHYW1lIgogICAgPT0KICAgIGJ6IHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjpHYW1lQ29udHJhY3QuZ2V0UmVxdWlyZWRNQlJfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE3NwogICAgLy8gcmV0dXJuIGNvbmZpZ01CUiArIGJhbGFuY2VNQlIKICAgIHB1c2hpbnQgMjk4MDAgLy8gMjk4MDAKICAgIHJldHN1YgoKc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6OkdhbWVDb250cmFjdC5nZXRSZXF1aXJlZE1CUl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE3OAogICAgLy8gfSBlbHNlIGlmIChjb21tYW5kID09PSAnam9pbicpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzICJqb2luIgogICAgPT0KICAgIGFzc2VydCAvLyBDb21tYW5kIG5vdCBzdXBwb3J0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE2NQogICAgLy8gcmV0dXJuIDI1MDAgKyA0MDAgKiAoa2V5U2l6ZSArIHZhbHVlU2l6ZSkKICAgIHB1c2hpbnQgMjk3MDAgLy8gMjk3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gcmV0dXJuIHRoaXMuZ2V0Qm94TUJSKDM2LCAzMikKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAQAIAiYJCGdhbWVUeXBlB25ld0dhbWUCZ3MEFR98dRBzZXNzaW9uSURDb3VudGVyBHNiYWwCZGMEcGNvbQRwY2hvMRhAAAgogABnJwQjZzEbQQBAMRkURDEYRIIHBCxJpc8EEbtBZwR+YAI8BHS++IcEnko65QRWg+4IBOzzOec2GgCOBwALAKcBIgIuA4gDogO0ADEZFDEYFBBEIkM2GgFJFYEgEkQxFiIJSTgQIhJEKYgDtEsBOAcyChJETDgIDkRJI1tLASRbSgxESwKBEFsMRDIGD0QjJwRlREkWKksBUE8DvycFSwFQIxa/TCIIJwRMZycGSwFQgDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL8rTFCwIkM2GgFJFSQSRBc2GgJJI1klCEsBFRJEVwIAMRYiCUk4ECISRE8CFipLAVBJvUUBRL5IMgZLASNbSwEOREsBJFsOREsCOAcyChJETwI4CEyBGFtLARJESwExAFABJwdMUEm9RQEUREm8SE8DvycFTwJQSb5EF08CCBa/IkM2GgFJFSQSRBc2GgJJFSQSRBdJTwI2GgNJI1klCEsBFRJEVwIATBYqSwFQSb1FAUS+SDIGSwEkW0sBDERMgRBbDkRJMQBQAScHSwFQSb1FAURJvkhLBRZJTwZQAU8CEkQnCE8DUEy/vEgnBkxQSU4CvkxOAkRAAA9HAiNbIggWXABFAUq/IkNLAiISQQAORwIkWyIIFlwIRQFC/+dLAiUSQQAPRwKBEFsiCBZcEEUBQv/RSwKBAxJBAA9HAoEYWyIIFlwYRQFC/7pLAoEEEkEAD0cCgSBbIggWXCBFAUL/o0sCgQUSQQAPRwKBKFsiCBZcKEUBQv+MSwKBBhJERwKBMFsiCBZcMEUBQv93gABHBjYaAUkVJBJEFxYqSwFQSb1FAUS+SDIGTIEQWw1EMQBJTgJLAUxQAScITFBJTgJJvUUBRL5IF0wnBUsBUEm9RQFEvkgXTCcGTFC+TElPAkQjTCNbSUEAAyJFAksCJFtJRQ9BAAZLASIIRQJLAoEQW0lFDkEABksBIghFAksCgRhbSUUNQQAGSwEiCEUCSwKBIFtJRQxBAAZLASIIRQJLAoEoW0lFC0EABksBIghFAksCgTBbSUUKQQAGSwEiCEUCSwFAAB0jSURLBrxIsUmyCEsHsgcishAjsgGzFitMULAiQ0sDSwIKRQhLBEEAC0sEIhJBABRLDUUBSUAABCNC/8VLB0sBCkL/vUsEJRJBAAdLDEUBQv/iSwSBAxJBAAdLC0UBQv/TSwSBBBJBAAdLCkUBQv/ESwSBBRJBAAdLCUUBQv+1SwSBBhJBAAdLCEUBQv+mI0L/bzYaAUkjWSUISwEVEkRXAgCIADsWK0xQsCJDIyhlREkVFlcGAkxQK0xQsCJDNhoBSSNZJQhLARUSRFcCACMoZUQVFEQxADIJEkQoTGciQ4oBAYv/KRJBAAopiAAMgeThAQiJi/+IAAGJigEBi/8pEkEABYHo6AGJi/+ABGpvaW4SRIGE6AGJ", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }