{"version":3,"file":"bundle.js","mappings":"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SAAUC,QAAShL,KAAKsJ,YAAc,kBACvG,gBAAoB,SAAU,CAAE,cAAe,cAAe5J,UAAW,eAAgBqL,KAAM,SAAUC,QAAShL,KAAK0J,uBAAyBxB,EAAwB,UAAY,eACpL,gBAAoB,SAAU,CAAE,cAAe,OAAQxI,UAAW,eAAgBqL,KAAM,SAAUC,QAAShL,KAAK+J,iBAAmB,UACnJ,EACAtF,EAAK5N,UAAU6U,kBAAoB,WAC/BC,SAASC,iBAAiB,UAAW5L,KAAKuJ,sBAC9C,EACA9E,EAAK5N,UAAUgV,qBAAuB,WAClC,IAAI7H,EAAKhE,KAAK8G,MAAOoB,EAAwBlE,EAAGkE,sBAAuBC,EAAkBnE,EAAGmE,gBAC5FE,aAAaH,GACbG,aAAaF,GACbwD,SAASG,oBAAoB,UAAW9L,KAAKuJ,sBACjD,EACO9E,CACX,CApfyB,CAofvB,aK1WF,SACIgB,cAPgB,SAAUrH,EAAW2E,GAAW,MAAO,CACvD/D,GAAI+D,EACJjI,EAAGwC,KAAKC,OAAOa,EAAY,GAAK,GAChCM,EAAG,EACH1G,EAAG,EACH,EAGA+G,UA/CYnI,OAAOmV,YAAYnV,OAAOoV,QArKzB,CACbC,EAAG,CACC,CACI,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,SAGRC,EAAG,CACC,CACI,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,SAGR5Q,EAAG,CACC,CACI,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,SAGR6Q,EAAG,CACC,CACI,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,SAGRC,EAAG,CACC,CACI,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,SAGRC,EAAG,CACC,CACI,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,SAGRC,EAAG,CACC,CACI,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,QACD,CACC,OACA,OACA,OACA,WAOPzR,KAAI,SAAUmJ,GACf,IAAIuC,EAvL8B,SAAUvO,EAAGN,GAC/C,IAAIwB,EAAsB,mBAAXC,QAAyBnB,EAAEmB,OAAOC,UACjD,IAAKF,EAAG,OAAOlB,EACf,IAAmBqB,EAAYC,EAA3BrD,EAAIiD,EAAEnC,KAAKiB,GAAOY,EAAK,GAC3B,IACI,WAAc,IAANlB,GAAgBA,KAAM,MAAQ2B,EAAIpD,EAAEsD,QAAQC,MAAMZ,EAAGtC,KAAK+C,EAAEI,MAQxE,CANA,MAAOC,GAASJ,EAAI,CAAEI,MAAOA,EAAS,CACtC,QACI,IACQL,IAAMA,EAAEG,OAASN,EAAIjD,EAAU,SAAIiD,EAAEnC,KAAKd,EAElB,CAAhC,QAAU,GAAIqD,EAAG,MAAMA,EAAEI,KAAO,CACpC,CACA,OAAOd,CACX,CAwKa,CAAOoL,EAAI,GACpB,MAAO,CAD2BuC,EAAG,GAAcA,EAAG,GAI7C1L,KAAI,SAAU0R,GACf,IAAInN,EAAOoN,IACPC,GAAO,IACPvN,EAAOsN,IACPE,GAAO,IAkBPnN,EAhBUgN,EAAO1R,KAAI,SAAU8R,EAAWjO,GAC1C,IAAIgF,EAAM,EAUV,OATAiJ,EAAU1T,MAAM,IAAIoB,SAAQ,SAAUY,EAAKH,GAC3B,MAARG,IACAyI,GAAO,GAAK5I,EACZsE,EAAO9B,KAAKsP,IAAIxN,EAAMtE,GACtB2R,EAAOnP,KAAKuP,IAAIJ,EAAM3R,EAAI,GAC1BoE,EAAO5B,KAAKsP,IAAI1N,EAAMR,GACtBgO,EAAOpP,KAAKuP,IAAIH,EAAMhO,EAAI,GAElC,IACOgF,CACX,IAImB5K,MAAMoG,EAAMwN,GAAM7R,KAAI,SAAU6I,GAAO,OAAOA,GAAOtE,CAAM,IAC9E,MAAO,CACHA,KAAMA,EACNF,KAAMA,EACNI,KAAMmN,EAAOrN,EACbC,KAAMqN,EAAOxN,EACbK,KAAMA,EAEd,IAER,MCtNA,SAAiB,gBAAoB,EAAM,CAAEtB,IAAK,EAAGwK,cAAe,GAAIvK,eAAgB,EAAwBC,UAAW,GAAIC,UAAW,KAAQuN,SAASmB,cAAc","sources":["webpack://hatetris/./node_modules/classnames/index.js","webpack://hatetris/webpack/bootstrap","webpack://hatetris/webpack/runtime/compat get default export","webpack://hatetris/webpack/runtime/define property getters","webpack://hatetris/webpack/runtime/hasOwnProperty shorthand","webpack://hatetris/external var \"React\"","webpack://hatetris/external var \"ReactDOM\"","webpack://hatetris/./src/enemy-ais/hatetris-ai.ts","webpack://hatetris/./src/enemy-ais/hatetris-mild.ts","webpack://hatetris/./src/enemy-ais/brzustowski.ts","webpack://hatetris/./src/replay-codecs/hex.ts","webpack://hatetris/./node_modules/base65536/src/index.js","webpack://hatetris/./src/replay-codecs/uint8Array.ts","webpack://hatetris/./src/replay-codecs/run-length.ts","webpack://hatetris/./node_modules/base2048/src/index.js","webpack://hatetris/./src/replay-codecs/hatetris-replay-codec.ts","webpack://hatetris/./src/replay-codecs/base2048.ts","webpack://hatetris/./src/replay-codecs/raw.ts","webpack://hatetris/./src/replay-codecs/base65536.ts","webpack://hatetris/./src/components/Game/Game.tsx","webpack://hatetris/./src/components/Well/Well.tsx","webpack://hatetris/./src/components/Game/logic.ts","webpack://hatetris/./src/enemy-ais/lovetris-ai.ts","webpack://hatetris/./src/enemy-ais/burgiel.ts","webpack://hatetris/./src/rotation-systems/hatetris-rotation-system.ts","webpack://hatetris/./src/index.tsx"],"sourcesContent":["/*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString === Object.prototype.toString) {\n\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","const __WEBPACK_NAMESPACE_OBJECT__ = React;","const __WEBPACK_NAMESPACE_OBJECT__ = ReactDOM;","'use strict';\r\nvar __read = (this && this.__read) || function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n};\r\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n};\r\n// S = worst for the player, T = best\r\nvar worstPieces = 'SZOILJT'.split('');\r\n// Pick the worst piece which could be put into this well.\r\n// Rating is the row where the highest blue appears, or `wellDepth` if the well is empty.\r\n// For the player, higher is better because it indicates a lower stack.\r\n// For the AI, lower is better\r\nexport var hatetrisAi = function (currentCoreState, currentAiState, getNextCoreStates) {\r\n if (currentAiState === undefined) {\r\n currentAiState = new Set();\r\n }\r\n var nextAiState = new Set(__spreadArray(__spreadArray([], __read(currentAiState), false), [\r\n JSON.stringify(currentCoreState.well)\r\n ], false));\r\n var evaluations = worstPieces\r\n .map(function (pieceId, pieceRanking) {\r\n var nextCoreStates = getNextCoreStates(currentCoreState, pieceId);\r\n // Yes, test against `nextAiState` because what if the current width\r\n // is 4 and the candidate piece is an I which, if placed, leads back into\r\n // the current well?\r\n var leadsIntoCycle = Number(nextCoreStates.some(function (nextCoreState) {\r\n return nextAiState.has(JSON.stringify(nextCoreState.well));\r\n }));\r\n var highestPeak = -Infinity;\r\n nextCoreStates.forEach(function (nextCoreState) {\r\n var rating = nextCoreState.well.findIndex(function (row) { return row !== 0; });\r\n if (rating === -1) {\r\n // Well is completely empty after placing this piece in this location\r\n rating = nextCoreState.well.length;\r\n }\r\n if (rating > highestPeak) {\r\n highestPeak = rating;\r\n }\r\n });\r\n return {\r\n pieceId: pieceId,\r\n leadsIntoCycle: leadsIntoCycle,\r\n highestPeak: highestPeak,\r\n pieceRanking: pieceRanking\r\n };\r\n });\r\n evaluations.sort(function (a, b) {\r\n // Always prefer a piece which does NOT potentially lead into a previously\r\n // seen well.\r\n return (a.leadsIntoCycle - b.leadsIntoCycle) ||\r\n // Otherwise, whichever piece gives the highest peak (lower number = higher peak)\r\n (a.highestPeak - b.highestPeak) ||\r\n // Tie breaker is piece ID rating\r\n (a.pieceRanking - b.pieceRanking);\r\n });\r\n var pieceId = evaluations[0].pieceId;\r\n return [\r\n pieceId,\r\n nextAiState\r\n ];\r\n};\r\n","// HATETRIS as it was prior to June 2021 - without the loop prevention logic\r\n// S = worst for the player, T = best\r\nvar worstPieces = 'SZOILJT'.split('');\r\n// Pick the worst piece which could be put into this well.\r\n// Rating is the row where the highest blue appears, or `wellDepth` if the well is empty.\r\n// For the player, higher is better because it indicates a lower stack.\r\n// For the AI, lower is better\r\nexport var hatetrisMildAi = function (currentCoreState, currentAiState, getNextCoreStates) {\r\n var evaluations = worstPieces\r\n .map(function (pieceId, pieceRanking) {\r\n var nextCoreStates = getNextCoreStates(currentCoreState, pieceId);\r\n var highestPeak = -Infinity;\r\n nextCoreStates.forEach(function (nextCoreState) {\r\n var rating = nextCoreState.well.findIndex(function (row) { return row !== 0; });\r\n if (rating === -1) {\r\n // Well is completely empty after placing this piece in this location\r\n rating = nextCoreState.well.length;\r\n }\r\n if (rating > highestPeak) {\r\n highestPeak = rating;\r\n }\r\n });\r\n return {\r\n pieceId: pieceId,\r\n highestPeak: highestPeak,\r\n pieceRanking: pieceRanking\r\n };\r\n });\r\n evaluations.sort(function (a, b) {\r\n // Prefer whichever piece gives the highest peak (lower number = higher peak)\r\n return (a.highestPeak - b.highestPeak) ||\r\n // Tie breaker is piece ID rating\r\n (a.pieceRanking - b.pieceRanking);\r\n });\r\n return evaluations[0].pieceId;\r\n};\r\n","/*\r\n This is an implementation of \"Algorithm 2\" from John Brzustowski's 1992 paper\r\n \"Can You Win At Tetris?\" .\r\n\r\n \"\"\"\r\n 1. Send left kink and display left kink until a cycle is detected.\r\n 2. Send one left kink and display right kink.\r\n 3. Send right kink and display right kink until a cycle is detected.\r\n 4. Send one right kink and display left kink.\r\n 5. Go to step 1.\r\n \"\"\"\r\n\r\n Here \"left kink\" means an S piece and \"right kink\" is a Z piece. Note: HATETRIS has no\r\n \"display\" (preview) piece, but nevertheless this behaviour is preserved in the algorithm below.\r\n\r\n On the topic of of detecting a cycle, the paper suggests creating a list of all of\r\n the states visited and adds,\r\n\r\n \"\"\"\r\n Each time you enter step 1 or 2, the machine empties the list.\r\n \"\"\"\r\n\r\n We believe this is a typographical error and Brzustowski intended to write \"steps 1 or 3\".\r\n\r\n This implementation intentionally avoids some fairly obvious optimisations, to make it more\r\n clear that it adheres to the original algorithm.\r\n*/\r\nvar __read = (this && this.__read) || function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n};\r\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n};\r\nexport var brzAi = function (currentCoreState, currentAiState, getNextCoreStates) {\r\n if (currentAiState === undefined) {\r\n currentAiState = {\r\n step: 1,\r\n displayPiece: 'S',\r\n seenWells: []\r\n };\r\n }\r\n var nextAiState;\r\n if (currentAiState.step === 1) {\r\n var cycleDetected = currentAiState.seenWells.some(function (seenWell) {\r\n return seenWell.every(function (row, y) {\r\n return row === currentCoreState.well[y];\r\n });\r\n });\r\n if (cycleDetected) {\r\n // Jump to next step\r\n nextAiState = {\r\n step: 2,\r\n displayPiece: 'Z',\r\n seenWells: __spreadArray(__spreadArray([], __read(currentAiState.seenWells), false), [\r\n currentCoreState.well\r\n ], false)\r\n };\r\n }\r\n else {\r\n // Stay on this step\r\n nextAiState = {\r\n step: 1,\r\n displayPiece: 'S',\r\n seenWells: __spreadArray(__spreadArray([], __read(currentAiState.seenWells), false), [\r\n currentCoreState.well\r\n ], false)\r\n };\r\n }\r\n }\r\n else if (currentAiState.step === 2) {\r\n nextAiState = {\r\n step: 3,\r\n displayPiece: 'Z',\r\n seenWells: []\r\n };\r\n }\r\n else if (currentAiState.step === 3) {\r\n var cycleDetected = currentAiState.seenWells.some(function (seenWell) {\r\n return seenWell.every(function (row, y) {\r\n return row === currentCoreState.well[y];\r\n });\r\n });\r\n if (cycleDetected) {\r\n // Jump to next step\r\n nextAiState = {\r\n step: 4,\r\n displayPiece: 'S',\r\n seenWells: __spreadArray(__spreadArray([], __read(currentAiState.seenWells), false), [\r\n currentCoreState.well\r\n ], false)\r\n };\r\n }\r\n else {\r\n // Stay on this step\r\n nextAiState = {\r\n step: 3,\r\n displayPiece: 'Z',\r\n seenWells: __spreadArray(__spreadArray([], __read(currentAiState.seenWells), false), [\r\n currentCoreState.well\r\n ], false)\r\n };\r\n }\r\n }\r\n else {\r\n // Step 4\r\n nextAiState = {\r\n step: 1,\r\n displayPiece: 'S',\r\n seenWells: []\r\n };\r\n }\r\n return [currentAiState.displayPiece, nextAiState];\r\n};\r\n","/**\r\n Old hex-mode replays.\r\n*/\r\n'use strict';\r\nvar hexChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'];\r\nvar forwardLookup = {\r\n L: { L: '0', R: '1', D: '2', U: '3' },\r\n R: { L: '4', R: '5', D: '6', U: '7' },\r\n D: { L: '8', R: '9', D: 'A', U: 'B' },\r\n U: { L: 'C', R: 'D', D: 'E', U: 'F' }\r\n};\r\nvar reverseLookup = {\r\n 0: ['L', 'L'],\r\n 1: ['L', 'R'],\r\n 2: ['L', 'D'],\r\n 3: ['L', 'U'],\r\n 4: ['R', 'L'],\r\n 5: ['R', 'R'],\r\n 6: ['R', 'D'],\r\n 7: ['R', 'U'],\r\n 8: ['D', 'L'],\r\n 9: ['D', 'R'],\r\n A: ['D', 'D'],\r\n B: ['D', 'U'],\r\n C: ['U', 'L'],\r\n D: ['U', 'R'],\r\n E: ['U', 'D'],\r\n F: ['U', 'U']\r\n};\r\n/**\r\n Convert an array of moves into a replay\r\n*/\r\nvar encode = function (inputMoves) { return inputMoves\r\n .map(function (move1, i) {\r\n if (i % 2 === 1) {\r\n return '';\r\n }\r\n // trailing unpaired move behaves as if an extra \"D\" was appended\r\n var move2 = i + 1 in inputMoves ? inputMoves[i + 1] : 'D';\r\n return forwardLookup[move1][move2];\r\n})\r\n .join('')\r\n .replace(/(....)/g, '$1 '); };\r\n/**\r\n Convert a string back into an array of moves\r\n*/\r\nvar decode = function (string) { return string\r\n .split('')\r\n .map(function (chr) { return hexChars.includes(chr) ? reverseLookup[chr] : []; })\r\n .flat(); };\r\nexport default { encode: encode, decode: decode };\r\n","/**\r\n * Routines for converting binary data into text data which can be sent safely\r\n * through 'Unicode-clean' text systems without information being lost. Analogous\r\n * to Base64 with a significantly larger character repertoire enabling the\r\n * encoding of 2.00 bytes per character (for comparison, Base64 manages 0.75 bytes\r\n * per character).\r\n */\r\n\r\n'use strict'\r\n\r\n// Z is a number, usually a uint16 but sometimes a uint8\r\n\r\nconst BITS_PER_CHAR = 16 // Base65536 is an 16-bit encoding\r\nconst BITS_PER_BYTE = 8\r\n\r\n// Compressed representation of inclusive-exclusive ranges of characters used in this encoding.\r\nconst pairStrings = [\r\n '㐀䳿一黿ꄀꏿꔀꗿ𐘀𐛿𒀀𒋿𓀀𓏿𔐀𔗿𖠀𖧿𠀀𨗿',\r\n 'ᔀᗿ'\r\n]\r\n\r\n// Decompression\r\nconst lookupE = {}\r\nconst lookupD = {}\r\npairStrings.forEach((pairString, r) => {\r\n const numZBits = BITS_PER_CHAR - BITS_PER_BYTE * r // 0 -> 16, 1 -> 8\r\n lookupE[numZBits] = {}\r\n let z2 = 0\r\n pairString.match(/../gu).forEach(pair => {\r\n const [first, last] = [...pair].map(x => x.codePointAt(0))\r\n for (let codePoint = first; codePoint <= last; codePoint++) {\r\n const chr = String.fromCodePoint(codePoint)\r\n\r\n // SPECIAL CASE: flip the bytes around, because Base65536 was constructed to take the bytes\r\n // in the wrong order originally\r\n const z = numZBits === BITS_PER_CHAR ? 256 * (z2 % 256) + (z2 >> 8) : z2\r\n lookupE[numZBits][z] = chr\r\n lookupD[chr] = [numZBits, z]\r\n z2++\r\n }\r\n })\r\n})\r\n\r\nconst encode = uint8Array => {\r\n const length = uint8Array.length\r\n\r\n let str = ''\r\n let z = 0\r\n let numZBits = 0\r\n\r\n for (let i = 0; i < length; i++) {\r\n const uint8 = uint8Array[i]\r\n\r\n // Take most significant bit first\r\n for (let j = BITS_PER_BYTE - 1; j >= 0; j--) {\r\n const bit = (uint8 >> j) & 1\r\n\r\n z = (z << 1) + bit\r\n numZBits++\r\n\r\n if (numZBits === BITS_PER_CHAR) {\r\n str += lookupE[numZBits][z]\r\n z = 0\r\n numZBits = 0\r\n }\r\n }\r\n }\r\n\r\n if (numZBits !== 0) {\r\n // Final bits require special treatment.\r\n while (!(numZBits in lookupE)) {\r\n z = (z << 1) + 1\r\n numZBits++\r\n }\r\n\r\n str += lookupE[numZBits][z]\r\n }\r\n\r\n return str\r\n}\r\n\r\nconst decode = str => {\r\n const length = str.length\r\n\r\n // This length is a guess. There's a chance we allocate one more byte here\r\n // than we actually need. But we can count and slice it off later\r\n const uint8Array = new Uint8Array(Math.floor(length * BITS_PER_CHAR / BITS_PER_BYTE))\r\n let numUint8s = 0\r\n let uint8 = 0\r\n let numUint8Bits = 0\r\n let shouldBeNoMoreChars = false\r\n\r\n for (const chr of str) {\r\n if (shouldBeNoMoreChars) {\r\n throw new Error('Secondary character found before end of input')\r\n }\r\n\r\n if (!(chr in lookupD)) {\r\n throw new Error(`Unrecognised Base65536 character: ${chr}`)\r\n }\r\n\r\n const [numZBits, z] = lookupD[chr]\r\n\r\n // Take most significant bit first\r\n for (let j = numZBits - 1; j >= 0; j--) {\r\n const bit = (z >> j) & 1\r\n\r\n uint8 = (uint8 << 1) + bit\r\n numUint8Bits++\r\n\r\n if (numUint8Bits === BITS_PER_BYTE) {\r\n uint8Array[numUint8s] = uint8\r\n numUint8s++\r\n uint8 = 0\r\n numUint8Bits = 0\r\n }\r\n }\r\n\r\n if (numZBits !== BITS_PER_CHAR) {\r\n shouldBeNoMoreChars = true\r\n }\r\n }\r\n\r\n // Final padding bits! Requires special consideration!\r\n // Remember how we always pad with 1s?\r\n // Note: there could be 0 such bits, check still works though\r\n if (uint8 !== ((1 << numUint8Bits) - 1)) {\r\n throw new Error('Padding mismatch')\r\n }\r\n\r\n return new Uint8Array(uint8Array.buffer, 0, numUint8s)\r\n}\r\n\r\nexport { encode, decode }\r\n","import runLength from './run-length';\r\nvar forwardEntryLookup = {\r\n L: 0,\r\n R: 4,\r\n D: 8,\r\n U: 12\r\n};\r\nvar forwardLengthLookup = {\r\n 1: 0,\r\n 2: 1,\r\n 3: 2,\r\n 4: 3\r\n};\r\nvar reverseEntryLookup = {\r\n 0: 'L',\r\n 4: 'R',\r\n 8: 'D',\r\n 12: 'U'\r\n};\r\nvar reverseNumberLookup = {\r\n 0: 1,\r\n 1: 2,\r\n 2: 3,\r\n 3: 4\r\n};\r\n/**\r\n Convert an array of key strokes into a Uint8Array using RLE\r\n*/\r\nexport var encode = function (keys) {\r\n var rle = runLength.encode(keys, 4);\r\n var nybbles = rle.map(function (run) { return (forwardEntryLookup[run.entry] +\r\n forwardLengthLookup[run.length]); });\r\n // Can't have an odd number of nybbles. This would break in mid-byte!\r\n // This is an extra 'L' on the end\r\n if (nybbles.length % 2 === 1) {\r\n nybbles.push(0);\r\n }\r\n var octets = [];\r\n for (var i = 0; i < nybbles.length; i += 2) {\r\n octets.push((nybbles[i] << 4) +\r\n (nybbles[i + 1] << 0));\r\n }\r\n return new Uint8Array(octets);\r\n};\r\n/**\r\n Convert an RLE'd Uint8Array back into a list of keystrokes\r\n*/\r\nexport var decode = function (uint8Array) {\r\n var octets = [];\r\n for (var i = 0; i < uint8Array.length; i++) {\r\n octets.push(uint8Array[i]);\r\n }\r\n // Extract two 4-bit numbers\r\n var nybbles = [];\r\n octets.forEach(function (octet) {\r\n nybbles.push((octet & 240) >> 4);\r\n nybbles.push((octet & 15) >> 0);\r\n });\r\n var rle = nybbles.map(function (nybble) { return ({\r\n entry: reverseEntryLookup[nybble & 12],\r\n length: reverseNumberLookup[nybble & 3]\r\n }); });\r\n return runLength.decode(rle);\r\n};\r\n","'use strict';\r\nvar encode = function (arr, maxRunLength) {\r\n var runs = [];\r\n arr.forEach(function (entry) {\r\n if (runs.length - 1 in runs &&\r\n runs[runs.length - 1].entry === entry &&\r\n runs[runs.length - 1].length < maxRunLength) {\r\n runs[runs.length - 1].length++;\r\n }\r\n else {\r\n runs.push({\r\n entry: entry,\r\n length: 1\r\n });\r\n }\r\n });\r\n return runs;\r\n};\r\nvar decode = function (runs) {\r\n return runs.flatMap(function (run) { return Array(run.length).fill(run.entry); });\r\n};\r\nexport default { encode: encode, decode: decode };\r\n","/**\r\n Base2048 is a binary-to-text encoding optimised for transmitting data\r\n through Twitter.\r\n*/\r\n\r\n// Z is a number, usually a uint11 but sometimes a uint3\r\n\r\nconst BITS_PER_CHAR = 11 // Base2048 is an 11-bit encoding\r\nconst BITS_PER_BYTE = 8\r\n\r\n// Compressed representation of inclusive ranges of characters used in this encoding.\r\nconst pairStrings = [\r\n '89AZazÆÆÐÐØØÞßææððøøþþĐđĦħııĸĸŁłŊŋŒœŦŧƀƟƢƮƱǃǝǝǤǥǶǷȜȝȠȥȴʯͰͳͶͷͻͽͿͿΑΡΣΩαωϏϏϗϯϳϳϷϸϺϿЂЂЄІЈЋЏИКикяђђєіјћџѵѸҁҊӀӃӏӔӕӘәӠӡӨөӶӷӺԯԱՖաֆאתװײؠءاؿفي٠٩ٮٯٱٴٹڿہہۃےەەۮۼۿۿܐܐܒܯݍޥޱޱ߀ߪࠀࠕࡀࡘࡠࡪࢠࢴࢶࢽऄनपरलळवहऽऽॐॐॠॡ०९ॲঀঅঌএঐওনপরললশহঽঽৎৎৠৡ০ৱ৴৹ৼৼਅਊਏਐਓਨਪਰਲਲਵਵਸਹੜੜ੦੯ੲੴઅઍએઑઓનપરલળવહઽઽૐૐૠૡ૦૯ૹૹଅଌଏଐଓନପରଲଳଵହଽଽୟୡ୦୯ୱ୷ஃஃஅஊஎஐஒஓககஙசஜஜஞடணதநபமஹௐௐ௦௲అఌఎఐఒనపహఽఽౘౚౠౡ౦౯౸౾ಀಀಅಌಎಐಒನಪಳವಹಽಽೞೞೠೡ೦೯ೱೲഅഌഎഐഒഺഽഽൎൎൔൖ൘ൡ൦൸ൺൿඅඖකනඳරලලවෆ෦෯กะาาเๅ๐๙ກຂຄຄງຈຊຊຍຍດທນຟມຣລລວວສຫອະາາຽຽເໄ໐໙ໞໟༀༀ༠༳ཀགངཇཉཌཎདནབམཛཝཨཪཬྈྌကဥဧဪဿ၉ၐၕ',\r\n '07'\r\n]\r\n\r\nconst lookupE = {}\r\nconst lookupD = {}\r\npairStrings.forEach((pairString, r) => {\r\n // Decompression\r\n const encodeRepertoire = []\r\n pairString.match(/../gu).forEach(pair => {\r\n const first = pair.codePointAt(0)\r\n const last = pair.codePointAt(1)\r\n for (let codePoint = first; codePoint <= last; codePoint++) {\r\n encodeRepertoire.push(String.fromCodePoint(codePoint))\r\n }\r\n })\r\n\r\n const numZBits = BITS_PER_CHAR - BITS_PER_BYTE * r // 0 -> 11, 1 -> 3\r\n lookupE[numZBits] = encodeRepertoire\r\n encodeRepertoire.forEach((chr, z) => {\r\n lookupD[chr] = [numZBits, z]\r\n })\r\n})\r\n\r\nexport const encode = uint8Array => {\r\n const length = uint8Array.length\r\n\r\n let str = ''\r\n let z = 0\r\n let numZBits = 0\r\n\r\n for (let i = 0; i < length; i++) {\r\n const uint8 = uint8Array[i]\r\n\r\n // Take most significant bit first\r\n for (let j = BITS_PER_BYTE - 1; j >= 0; j--) {\r\n const bit = (uint8 >> j) & 1\r\n\r\n z = (z << 1) + bit\r\n numZBits++\r\n\r\n if (numZBits === BITS_PER_CHAR) {\r\n str += lookupE[numZBits][z]\r\n z = 0\r\n numZBits = 0\r\n }\r\n }\r\n }\r\n\r\n if (numZBits !== 0) {\r\n // Final bits require special treatment.\r\n\r\n // byte = bbbcccccccc, numBits = 11, padBits = 0\r\n // byte = bbcccccccc, numBits = 10, padBits = 1\r\n // byte = bcccccccc, numBits = 9, padBits = 2\r\n // byte = cccccccc, numBits = 8, padBits = 3\r\n // byte = ccccccc, numBits = 7, padBits = 4\r\n // byte = cccccc, numBits = 6, padBits = 5\r\n // byte = ccccc, numBits = 5, padBits = 6\r\n // byte = cccc, numBits = 4, padBits = 7\r\n // => Pad `byte` out to 11 bits using 1s, then encode as normal (repertoire 0)\r\n\r\n // byte = ccc, numBits = 3, padBits = 0\r\n // byte = cc, numBits = 2, padBits = 1\r\n // byte = c, numBits = 1, padBits = 2\r\n // => Pad `byte` out to 3 bits using 1s, then encode specially (repertoire 1)\r\n\r\n while (!(numZBits in lookupE)) {\r\n z = (z << 1) + 1\r\n numZBits++\r\n }\r\n\r\n str += lookupE[numZBits][z]\r\n }\r\n\r\n return str\r\n}\r\n\r\nexport const decode = str => {\r\n const length = str.length\r\n\r\n // This length is a guess. There's a chance we allocate one more byte here\r\n // than we actually need. But we can count and slice it off later\r\n const uint8Array = new Uint8Array(Math.floor(length * BITS_PER_CHAR / BITS_PER_BYTE))\r\n let numUint8s = 0\r\n let uint8 = 0\r\n let numUint8Bits = 0\r\n\r\n for (let i = 0; i < length; i++) {\r\n const chr = str.charAt(i)\r\n\r\n if (!(chr in lookupD)) {\r\n throw new Error(`Unrecognised Base2048 character: ${chr}`)\r\n }\r\n\r\n const [numZBits, z] = lookupD[chr]\r\n\r\n if (numZBits !== BITS_PER_CHAR && i !== length - 1) {\r\n throw new Error('Secondary character found before end of input at position ' + String(i))\r\n }\r\n\r\n // Take most significant bit first\r\n for (let j = numZBits - 1; j >= 0; j--) {\r\n const bit = (z >> j) & 1\r\n\r\n uint8 = (uint8 << 1) + bit\r\n numUint8Bits++\r\n\r\n if (numUint8Bits === BITS_PER_BYTE) {\r\n uint8Array[numUint8s] = uint8\r\n numUint8s++\r\n uint8 = 0\r\n numUint8Bits = 0\r\n }\r\n }\r\n }\r\n\r\n // Final padding bits! Requires special consideration!\r\n // Remember how we always pad with 1s?\r\n // Note: there could be 0 such bits, check still works though\r\n if (uint8 !== ((1 << numUint8Bits) - 1)) {\r\n throw new Error('Padding mismatch')\r\n }\r\n\r\n return new Uint8Array(uint8Array.buffer, 0, numUint8s)\r\n}\r\n","/**\r\n Replay handling. This codec is a combination of three other codecs\r\n*/\r\nimport * as raw from './raw';\r\nimport hex from './hex';\r\nimport * as base65536 from './base65536';\r\nimport * as base2048 from './base2048';\r\n/**\r\n Convert an array of moves into a replay\r\n*/\r\n// const encode = (moves: string[]): string => hex.encode(moves)\r\n// const encode = (moves: string[]): string => base65536.encode(moves)\r\nvar encode = function (moves) { return base2048.encode(moves); };\r\n/**\r\n Convert a string back into an array of moves\r\n*/\r\nvar decode = function (string) {\r\n string = string.trim();\r\n if (/^[ULDR]+$/.test(string)) {\r\n return raw.decode(string);\r\n }\r\n if (/^[0123456789ABCDEF# ]+$/.test(string)) {\r\n return hex.decode(string);\r\n }\r\n try {\r\n return base65536.decode(string);\r\n }\r\n catch (e) {\r\n // not Base65536, no problem\r\n }\r\n return base2048.decode(string);\r\n};\r\nexport default { encode: encode, decode: decode };\r\n","/**\r\n New new Base2048 replays!\r\n*/\r\nimport * as base2048 from 'base2048';\r\nimport * as uint8Array from './uint8Array';\r\nexport var encode = function (keys) {\r\n return base2048.encode(uint8Array.encode(keys));\r\n};\r\nexport var decode = function (string) {\r\n return uint8Array.decode(base2048.decode(string));\r\n};\r\n","/**\r\n Raw ULDRs\r\n*/\r\nexport var encode = function (inputMoves) { return inputMoves.join(''); };\r\nexport var decode = function (string) { return string.split(''); };\r\n","/**\r\n New Base65536 replays.\r\n*/\r\nimport * as base65536 from 'base65536';\r\nimport * as uint8Array from './uint8Array';\r\nexport var encode = function (keys) {\r\n return base65536.encode(uint8Array.encode(keys));\r\n};\r\nexport var decode = function (string) {\r\n return uint8Array.decode(base65536.decode(string));\r\n};\r\n","/**\r\n HATETRIS instance builder\r\n*/\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = function (d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n return function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nimport './Game.css';\r\nimport * as React from 'react';\r\nimport { hatetrisAi } from '../../enemy-ais/hatetris-ai';\r\nimport { hatetrisMildAi } from '../../enemy-ais/hatetris-mild';\r\nimport { lovetrisAi } from '../../enemy-ais/lovetris-ai';\r\nimport { brzAi } from '../../enemy-ais/brzustowski';\r\nimport { burgAi } from '../../enemy-ais/burgiel';\r\nimport hatetrisReplayCodec from '../../replay-codecs/hatetris-replay-codec';\r\nimport { Well } from '../Well/Well';\r\nimport { getLogic } from './logic';\r\nvar minWidth = 4;\r\nexport var hatetris = {\r\n shortDescription: 'HATETRIS',\r\n buttonDescription: 'HATETRIS, the original and worst',\r\n ai: hatetrisAi\r\n};\r\nexport var hatetrisMild = {\r\n shortDescription: (React.createElement(\"a\", { href: 'https://github.com/qntm/hatetris#hatetris-mild' }, \"HATETRIS Mild\")),\r\n buttonDescription: 'HATETRIS without loop-prevention',\r\n ai: hatetrisMildAi\r\n};\r\nexport var lovetris = {\r\n shortDescription: '❤️',\r\n buttonDescription: 'all 4x1 pieces, all the time',\r\n ai: lovetrisAi\r\n};\r\nexport var brz = {\r\n shortDescription: (React.createElement(\"a\", { href: 'https://open.library.ubc.ca/media/download/pdf/831/1.0079748/1' }, \"Brzustowski\")),\r\n buttonDescription: 'Brzustowski (1992)',\r\n ai: brzAi\r\n};\r\nvar burg = {\r\n shortDescription: (React.createElement(\"a\", { href: 'https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.55.8562&rep=rep1&type=pdf' }, \"Burgiel\")),\r\n buttonDescription: 'Burgiel (1997)',\r\n ai: burgAi\r\n};\r\nvar enemies = [hatetris, hatetrisMild, lovetris, brz, burg];\r\nvar Game = /** @class */ (function (_super) {\r\n __extends(Game, _super);\r\n function Game(props) {\r\n var _this = _super.call(this, props) || this;\r\n _this.logic = getLogic(_this.props);\r\n _this.handleClickStart = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, replayCopiedTimeoutId, replayTimeoutId, firstWellState, error_1;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = this.state, replayCopiedTimeoutId = _a.replayCopiedTimeoutId, replayTimeoutId = _a.replayTimeoutId;\r\n // there may be a replay in progress, this\r\n // must be killed\r\n clearTimeout(replayTimeoutId);\r\n clearTimeout(replayCopiedTimeoutId);\r\n _b.label = 1;\r\n case 1:\r\n _b.trys.push([1, 3, , 4]);\r\n return [4 /*yield*/, this.getFirstWellState()];\r\n case 2:\r\n firstWellState = _b.sent();\r\n return [3 /*break*/, 4];\r\n case 3:\r\n error_1 = _b.sent();\r\n console.error(error_1);\r\n this.setState({\r\n error: {\r\n interpretation: 'Caught this exception while trying to generate the first piece using your custom enemy AI. Game abandoned.',\r\n real: error_1.message,\r\n dismissable: true\r\n }\r\n });\r\n return [2 /*return*/];\r\n case 4:\r\n // clear the field and get ready for a new game\r\n this.setState({\r\n mode: 'PLAYING',\r\n wellStateId: 0,\r\n wellStates: [firstWellState],\r\n replay: [],\r\n replayCopiedTimeoutId: undefined,\r\n replayTimeoutId: undefined\r\n });\r\n return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n _this.handleClickSelectAi = function () {\r\n _this.setState({\r\n mode: 'SELECT_AI'\r\n });\r\n };\r\n _this.handleClickReplay = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var replayTimeout, replayTimeoutId, string, replay, firstWellState, error_2, wellStateId, mode;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n replayTimeout = this.props.replayTimeout;\r\n replayTimeoutId = this.state.replayTimeoutId;\r\n // there may be a replay in progress, this\r\n // must be killed\r\n clearTimeout(replayTimeoutId);\r\n string = window.prompt('Paste replay string...');\r\n if (string === null) {\r\n return [2 /*return*/];\r\n }\r\n replay = hatetrisReplayCodec.decode(string);\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 3, , 4]);\r\n return [4 /*yield*/, this.getFirstWellState()];\r\n case 2:\r\n firstWellState = _a.sent();\r\n return [3 /*break*/, 4];\r\n case 3:\r\n error_2 = _a.sent();\r\n console.error(error_2);\r\n this.setState({\r\n error: {\r\n interpretation: 'Caught this exception while trying to generate the first piece using your custom enemy AI. Game abandoned.',\r\n real: error_2.message,\r\n dismissable: true\r\n }\r\n });\r\n return [2 /*return*/];\r\n case 4:\r\n wellStateId = 0;\r\n replayTimeoutId = wellStateId in replay\r\n ? setTimeout(this.handleReplayTimeout, replayTimeout)\r\n : undefined;\r\n mode = wellStateId in replay ? 'REPLAYING' : 'PLAYING';\r\n // GO.\r\n this.setState({\r\n mode: mode,\r\n wellStateId: wellStateId,\r\n wellStates: [firstWellState],\r\n replay: replay,\r\n replayTimeoutId: replayTimeoutId\r\n });\r\n return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n _this.handleReplayTimeout = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var replayTimeout, _a, mode, replay, wellStateId, nextReplayTimeoutId;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n replayTimeout = this.props.replayTimeout;\r\n _a = this.state, mode = _a.mode, replay = _a.replay, wellStateId = _a.wellStateId;\r\n if (!(mode === 'REPLAYING')) return [3 /*break*/, 2];\r\n return [4 /*yield*/, this.handleRedo()];\r\n case 1:\r\n _b.sent();\r\n if (wellStateId + 1 in replay) {\r\n nextReplayTimeoutId = setTimeout(this.handleReplayTimeout, replayTimeout);\r\n }\r\n return [3 /*break*/, 3];\r\n case 2:\r\n console.warn('Ignoring input replay step because mode is', mode);\r\n _b.label = 3;\r\n case 3:\r\n this.setState({\r\n replayTimeoutId: nextReplayTimeoutId\r\n });\r\n return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n _this.handleLeft = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var mode;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n mode = this.state.mode;\r\n if (!(mode === 'PLAYING')) return [3 /*break*/, 2];\r\n return [4 /*yield*/, this.handleMove('L')];\r\n case 1:\r\n _a.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n console.warn('Ignoring event L because mode is', mode);\r\n _a.label = 3;\r\n case 3: return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n _this.handleRight = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var mode;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n mode = this.state.mode;\r\n if (!(mode === 'PLAYING')) return [3 /*break*/, 2];\r\n return [4 /*yield*/, this.handleMove('R')];\r\n case 1:\r\n _a.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n console.warn('Ignoring event R because mode is', mode);\r\n _a.label = 3;\r\n case 3: return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n _this.handleDown = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var mode;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n mode = this.state.mode;\r\n if (!(mode === 'PLAYING')) return [3 /*break*/, 2];\r\n return [4 /*yield*/, this.handleMove('D')];\r\n case 1:\r\n _a.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n console.warn('Ignoring event D because mode is', mode);\r\n _a.label = 3;\r\n case 3: return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n _this.handleUp = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var mode;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n mode = this.state.mode;\r\n if (!(mode === 'PLAYING')) return [3 /*break*/, 2];\r\n return [4 /*yield*/, this.handleMove('U')];\r\n case 1:\r\n _a.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n console.warn('Ignoring event U because mode is', mode);\r\n _a.label = 3;\r\n case 3: return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n _this.handleUndo = function () {\r\n var _a = _this.state, replayTimeoutId = _a.replayTimeoutId, wellStateId = _a.wellStateId, wellStates = _a.wellStates;\r\n // There may be a replay in progress, this\r\n // must be killed\r\n clearTimeout(replayTimeoutId);\r\n _this.setState({\r\n replayTimeoutId: undefined\r\n });\r\n var nextWellStateId = wellStateId - 1;\r\n if (nextWellStateId in wellStates) {\r\n _this.setState({\r\n mode: 'PLAYING',\r\n wellStateId: nextWellStateId\r\n });\r\n }\r\n else {\r\n console.warn('Ignoring undo event because start of history has been reached');\r\n }\r\n };\r\n _this.handleRedo = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var _a, mode, replay, wellStateId;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = this.state, mode = _a.mode, replay = _a.replay, wellStateId = _a.wellStateId;\r\n if (!(mode === 'PLAYING' || mode === 'REPLAYING')) return [3 /*break*/, 4];\r\n if (!(wellStateId in replay)) return [3 /*break*/, 2];\r\n return [4 /*yield*/, this.handleMove(replay[wellStateId])];\r\n case 1:\r\n _b.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n console.warn('Ignoring redo event because end of history has been reached');\r\n _b.label = 3;\r\n case 3: return [3 /*break*/, 5];\r\n case 4:\r\n console.warn('Ignoring redo event because mode is', mode);\r\n _b.label = 5;\r\n case 5: return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n _this.handleDocumentKeyDown = function (event) { return __awaiter(_this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!(event.key === 'Left' || event.key === 'ArrowLeft')) return [3 /*break*/, 2];\r\n return [4 /*yield*/, this.handleLeft()];\r\n case 1:\r\n _a.sent();\r\n _a.label = 2;\r\n case 2:\r\n if (!(event.key === 'Right' || event.key === 'ArrowRight')) return [3 /*break*/, 4];\r\n return [4 /*yield*/, this.handleRight()];\r\n case 3:\r\n _a.sent();\r\n _a.label = 4;\r\n case 4:\r\n if (!(event.key === 'Down' || event.key === 'ArrowDown')) return [3 /*break*/, 6];\r\n return [4 /*yield*/, this.handleDown()];\r\n case 5:\r\n _a.sent();\r\n _a.label = 6;\r\n case 6:\r\n if (!(event.key === 'Up' || event.key === 'ArrowUp')) return [3 /*break*/, 8];\r\n return [4 /*yield*/, this.handleUp()];\r\n case 7:\r\n _a.sent();\r\n _a.label = 8;\r\n case 8:\r\n if (event.key === 'z' && event.ctrlKey === true) {\r\n this.handleUndo();\r\n }\r\n if (!(event.key === 'y' && event.ctrlKey === true)) return [3 /*break*/, 10];\r\n return [4 /*yield*/, this.handleRedo()];\r\n case 9:\r\n _a.sent();\r\n _a.label = 10;\r\n case 10: return [2 /*return*/];\r\n }\r\n });\r\n }); };\r\n _this.handleClickCopyReplay = function () {\r\n var replay = _this.state.replay;\r\n return navigator.clipboard.writeText(hatetrisReplayCodec.encode(replay))\r\n .then(function () {\r\n var replayCopiedTimeoutId = setTimeout(_this.handleCopiedTimeout, 3000);\r\n _this.setState({\r\n replayCopiedTimeoutId: replayCopiedTimeoutId\r\n });\r\n });\r\n };\r\n _this.handleCopiedTimeout = function () {\r\n _this.setState({\r\n replayCopiedTimeoutId: undefined\r\n });\r\n };\r\n _this.handleClickDone = function () {\r\n _this.setState({\r\n mode: 'INITIAL'\r\n });\r\n };\r\n _this.handleClickEnemy = function (enemy) {\r\n _this.setState({\r\n displayEnemy: true,\r\n enemy: enemy,\r\n mode: 'INITIAL'\r\n });\r\n };\r\n _this.handleClickCustomEnemy = function () {\r\n _this.setState({\r\n mode: 'PASTE'\r\n });\r\n };\r\n _this.handleCancelCustomEnemy = function () {\r\n _this.setState({\r\n mode: 'SELECT_AI'\r\n });\r\n };\r\n _this.handleCustomAiChange = function (event) {\r\n _this.setState({\r\n customAiCode: event.target.value\r\n });\r\n };\r\n _this.handleSubmitCustomEnemy = function () {\r\n var customAiCode = _this.state.customAiCode;\r\n var ai;\r\n try {\r\n // eslint-disable-next-line no-new-func\r\n ai = Function(\"\\n \\\"use strict\\\"\\n return (\".concat(customAiCode, \")\\n \"))();\r\n }\r\n catch (error) {\r\n console.error(error);\r\n _this.setState({\r\n error: {\r\n interpretation: 'Caught this exception while trying to evaluate your custom AI JavaScript.',\r\n real: error.message,\r\n dismissable: true\r\n }\r\n });\r\n return;\r\n }\r\n _this.handleClickEnemy({\r\n shortDescription: 'custom',\r\n buttonDescription: 'this is never actually used',\r\n ai: ai\r\n });\r\n };\r\n _this.handleClickDismissError = function () {\r\n _this.setState({\r\n error: null\r\n });\r\n };\r\n var _a = _this.props, rotationSystem = _a.rotationSystem, bar = _a.bar, wellDepth = _a.wellDepth, wellWidth = _a.wellWidth;\r\n var error;\r\n if (Object.keys(rotationSystem.rotations).length < 1) {\r\n error = Error('Have to have at least one piece!');\r\n }\r\n if (wellDepth < bar) {\r\n error = Error(\"Can't have well with depth \" + String(wellDepth) + ' less than bar at ' + String(bar));\r\n }\r\n if (wellWidth < minWidth) {\r\n error = Error(\"Can't have well with width \" + String(wellWidth) + ' less than ' + String(minWidth));\r\n }\r\n _this.state = {\r\n error: error\r\n ? {\r\n interpretation: 'Caught this exception while trying to start HATETRIS. Application halted.',\r\n real: error.message,\r\n dismissable: false\r\n }\r\n : null,\r\n displayEnemy: false,\r\n enemy: hatetris,\r\n customAiCode: '',\r\n mode: 'INITIAL',\r\n wellStateId: -1,\r\n wellStates: [],\r\n replay: [],\r\n replayCopiedTimeoutId: undefined,\r\n replayTimeoutId: undefined\r\n };\r\n return _this;\r\n }\r\n Game.prototype.getFirstWellState = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, this.logic.getFirstWellState(this.state)];\r\n case 1: return [2 /*return*/, _a.sent()];\r\n }\r\n });\r\n });\r\n };\r\n Game.prototype.handleMove = function (move) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var _a;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = this.setState;\r\n return [4 /*yield*/, this.logic.handleMove(this.state, move)];\r\n case 1:\r\n _a.apply(this, [_b.sent()]);\r\n return [2 /*return*/];\r\n }\r\n });\r\n });\r\n };\r\n Game.prototype.render = function () {\r\n var _this = this;\r\n var _a = this.props, bar = _a.bar, rotationSystem = _a.rotationSystem, wellDepth = _a.wellDepth, wellWidth = _a.wellWidth;\r\n var _b = this.state, customAiCode = _b.customAiCode, displayEnemy = _b.displayEnemy, enemy = _b.enemy, error = _b.error, mode = _b.mode, replay = _b.replay, replayCopiedTimeoutId = _b.replayCopiedTimeoutId, wellStateId = _b.wellStateId, wellStates = _b.wellStates;\r\n var wellState = wellStateId === -1 ? null : wellStates[wellStateId];\r\n var score = wellState && wellState.core.score;\r\n if (error !== null) {\r\n return (React.createElement(\"div\", { className: 'game' },\r\n React.createElement(\"h2\", { style: { fontWeight: 'bold', fontSize: '150%' } }, \"Error\"),\r\n React.createElement(\"p\", { \"data-testid\": 'error-real' },\r\n React.createElement(\"code\", { style: { fontFamily: 'monospace' } }, error.real)),\r\n React.createElement(\"p\", { \"data-testid\": 'error-interpretation' }, error.interpretation),\r\n error.dismissable && (React.createElement(React.Fragment, null,\r\n React.createElement(\"h3\", { style: { fontWeight: 'bold' } }, \"To fix this\"),\r\n React.createElement(\"p\", null, \"Check your browser console for more information. Use this information to fix your AI code and submit it again. Or, use one of the preset AIs instead.\"),\r\n React.createElement(\"p\", null,\r\n React.createElement(\"button\", { \"data-testid\": 'dismiss-error', className: 'game__button', type: 'button', onClick: this.handleClickDismissError }, \"OK\")))),\r\n !error.dismissable && (React.createElement(React.Fragment, null,\r\n React.createElement(\"h3\", { style: { fontWeight: 'bold' } }, \"To fix this\"),\r\n React.createElement(\"p\", null, \"Report this problem to qntm.\")))));\r\n }\r\n return (React.createElement(\"div\", { className: 'game' },\r\n React.createElement(\"div\", { className: 'game__top' },\r\n React.createElement(\"div\", { className: 'game__topleft' },\r\n React.createElement(Well, { bar: bar, rotationSystem: rotationSystem, wellDepth: wellDepth, wellWidth: wellWidth, wellState: wellState })),\r\n React.createElement(\"div\", { className: 'game__topright' },\r\n React.createElement(\"p\", { className: 'game__paragraph' },\r\n \"you're playing \",\r\n React.createElement(\"b\", null, \"HATETRIS\"),\r\n \" by qntm\"),\r\n displayEnemy && (React.createElement(\"p\", { \"data-testid\": 'enemy-short', className: 'game__paragraph' },\r\n \"AI: \",\r\n enemy.shortDescription)),\r\n score !== null && (React.createElement(\"p\", { \"data-testid\": 'score', className: 'game__paragraph' },\r\n \"score: \",\r\n score)),\r\n React.createElement(\"div\", { className: 'game__spacer' }),\r\n React.createElement(\"p\", { className: 'game__paragraph' },\r\n React.createElement(\"a\", { href: 'http://qntm.org/hatetris' }, \"about\")),\r\n React.createElement(\"p\", { className: 'game__paragraph' },\r\n React.createElement(\"a\", { href: 'https://github.com/qntm/hatetris' }, \"source code\")),\r\n React.createElement(\"p\", { className: 'game__paragraph' },\r\n \"replays encoded using \",\r\n React.createElement(\"a\", { href: 'https://github.com/qntm/base2048' }, \"Base2048\")))),\r\n mode === 'INITIAL' && (React.createElement(\"div\", { className: 'game__bottom' },\r\n React.createElement(\"button\", { \"data-testid\": 'start-button', className: 'game__button', type: 'button', onClick: this.handleClickStart }, \"start new game\"),\r\n React.createElement(\"div\", { className: 'game__paragraph', style: { display: 'flex', gap: '10px' } },\r\n React.createElement(\"button\", { \"data-testid\": 'replay-button', className: 'game__button', type: 'button', onClick: this.handleClickReplay }, \"show a replay\"),\r\n React.createElement(\"button\", { \"data-testid\": 'select-ai', className: 'game__button', type: 'button', onClick: this.handleClickSelectAi }, \"select AI\")))),\r\n mode === 'SELECT_AI' && (React.createElement(\"div\", { className: 'game__bottom game__bottom--select-ai' },\r\n React.createElement(\"p\", null, \"Select AI:\"),\r\n enemies.map(function (enemy) { return (React.createElement(\"button\", { \"data-testid\": 'enemy', className: 'game__button', key: enemy.buttonDescription, type: 'button', onClick: function () { return _this.handleClickEnemy(enemy); } }, enemy.buttonDescription)); }),\r\n React.createElement(\"button\", { \"data-testid\": 'custom-enemy', className: 'game__button', type: 'button', onClick: this.handleClickCustomEnemy }, \"use custom AI\"))),\r\n mode === 'PASTE' && (React.createElement(\"div\", { className: 'game__bottom' },\r\n React.createElement(\"p\", null, \"Enter custom code:\"),\r\n React.createElement(\"div\", null,\r\n React.createElement(\"textarea\", { autoFocus: true, style: { width: '100%' }, onChange: this.handleCustomAiChange, \"data-testid\": 'ai-textarea', defaultValue: customAiCode })),\r\n React.createElement(\"div\", { style: { display: 'flex', gap: '10px' } },\r\n React.createElement(\"p\", { style: { flex: '1 1 100%' } },\r\n React.createElement(\"a\", { href: \"https://github.com/qntm/hatetris#writing-a-custom-ai\" }, \"how to write a custom AI\")),\r\n React.createElement(\"button\", { \"data-testid\": 'cancel-custom-enemy', className: 'game__button', type: 'button', onClick: this.handleCancelCustomEnemy }, \"cancel\"),\r\n React.createElement(\"button\", { \"data-testid\": 'submit-custom-enemy', className: 'game__button', type: 'button', onClick: this.handleSubmitCustomEnemy }, \"go\")))),\r\n mode === 'PLAYING' && (React.createElement(\"div\", { className: 'game__bottom' },\r\n React.createElement(\"div\", { style: { display: 'flex', gap: '10px' } },\r\n React.createElement(\"button\", { className: 'game__button', disabled: !(wellStateId - 1 in wellStates), type: 'button', onClick: this.handleUndo, title: 'Press Ctrl+Z to undo' }, \"\\u21B6\"),\r\n React.createElement(\"button\", { className: 'game__button', type: 'button', onClick: this.handleUp, title: 'Press Up to rotate' }, \"\\u27F3\"),\r\n React.createElement(\"button\", { className: 'game__button', disabled: !(wellStateId + 1 in wellStates), type: 'button', onClick: this.handleRedo, title: 'Press Ctrl+Y to redo' }, \"\\u21B7\")),\r\n React.createElement(\"div\", { style: { display: 'flex', gap: '10px' } },\r\n React.createElement(\"button\", { className: 'game__button', type: 'button', onClick: this.handleLeft, title: 'Press Left to move left' }, \"\\u2190\"),\r\n React.createElement(\"button\", { \"data-testid\": 'down', className: 'game__button', type: 'button', onClick: this.handleDown, title: 'Press Down to move down' }, \"\\u2193\"),\r\n React.createElement(\"button\", { className: 'game__button', type: 'button', onClick: this.handleRight, title: 'Press Right to move right' }, \"\\u2192\")))),\r\n mode === 'REPLAYING' && (React.createElement(\"div\", { \"data-testid\": 'bottom', className: 'game__bottom' }, \"replaying...\")),\r\n mode === 'GAME_OVER' && (React.createElement(\"div\", { \"data-testid\": 'bottom', className: 'game__bottom' },\r\n React.createElement(\"div\", null, \"replay of last game:\"),\r\n React.createElement(\"div\", { \"data-testid\": 'replay-out', className: 'game__replay-out' }, hatetrisReplayCodec.encode(replay)),\r\n React.createElement(\"div\", { style: { display: 'flex', gap: '10px' } },\r\n React.createElement(\"button\", { className: 'game__button', type: 'button', onClick: this.handleUndo }, \"undo last move\"),\r\n React.createElement(\"button\", { \"data-testid\": 'copy-replay', className: 'game__button', type: 'button', onClick: this.handleClickCopyReplay }, replayCopiedTimeoutId ? 'copied!' : 'copy replay'),\r\n React.createElement(\"button\", { \"data-testid\": 'done', className: 'game__button', type: 'button', onClick: this.handleClickDone }, \"done\"))))));\r\n };\r\n Game.prototype.componentDidMount = function () {\r\n document.addEventListener('keydown', this.handleDocumentKeyDown);\r\n };\r\n Game.prototype.componentWillUnmount = function () {\r\n var _a = this.state, replayCopiedTimeoutId = _a.replayCopiedTimeoutId, replayTimeoutId = _a.replayTimeoutId;\r\n clearTimeout(replayCopiedTimeoutId);\r\n clearTimeout(replayTimeoutId);\r\n document.removeEventListener('keydown', this.handleDocumentKeyDown);\r\n };\r\n return Game;\r\n}(React.Component));\r\nexport default Game;\r\n","'use strict';\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\nimport './Well.css';\r\nexport var Well = function (props) {\r\n var bar = props.bar, rotationSystem = props.rotationSystem, wellDepth = props.wellDepth, wellWidth = props.wellWidth, wellState = props.wellState;\r\n var well = wellState && wellState.core.well;\r\n var piece = wellState && wellState.piece;\r\n var cellses = [];\r\n for (var y = 0; y < wellDepth; y++) {\r\n var cells = [];\r\n for (var x = 0; x < wellWidth; x++) {\r\n var landed = well !== null && (well[y] & (1 << x)) !== 0;\r\n var live = void 0;\r\n if (piece === null) {\r\n live = false;\r\n }\r\n else {\r\n var orientation_1 = rotationSystem.rotations[piece.id][piece.o];\r\n var y2 = y - piece.y - orientation_1.yMin;\r\n var x2 = x - piece.x - orientation_1.xMin;\r\n live = (y2 >= 0 && y2 < orientation_1.yDim &&\r\n x2 >= 0 && x2 < orientation_1.xDim &&\r\n (orientation_1.rows[y2] & (1 << x2)) !== 0);\r\n }\r\n cells.push({ landed: landed, live: live });\r\n }\r\n cellses.push(cells);\r\n }\r\n return (React.createElement(\"table\", null,\r\n React.createElement(\"tbody\", null, cellses.map(function (cells, y) { return (React.createElement(\"tr\", { key: y }, cells.map(function (cell, x) { return (React.createElement(\"td\", { key: x, \"data-testid\": classnames({\r\n well__cell: true,\r\n 'well__cell--bar': y === bar,\r\n 'well__cell--landed': cell.landed,\r\n 'well__cell--live': cell.live\r\n }), className: classnames({\r\n well__cell: true,\r\n 'well__cell--bar': y === bar,\r\n 'well__cell--landed': cell.landed,\r\n 'well__cell--live': cell.live\r\n }) })); }))); }))));\r\n};\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __read = (this && this.__read) || function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n};\r\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n};\r\nvar moves = ['L', 'R', 'D', 'U'];\r\nvar pieceIds = ['I', 'J', 'L', 'O', 'S', 'T', 'Z'];\r\nexport var getLogic = function (_a) {\r\n var bar = _a.bar, rotationSystem = _a.rotationSystem, wellDepth = _a.wellDepth, wellWidth = _a.wellWidth;\r\n /**\r\n Generate a unique integer to describe the position and orientation of this piece.\r\n `x` varies between -3 and (`wellWidth` - 1) inclusive, so range = `wellWidth` + 3\r\n `y` varies between 0 and (`wellDepth` + 2) inclusive, so range = `wellDepth` + 3\r\n `o` varies between 0 and 3 inclusive, so range = 4\r\n */\r\n var getHashCode = function (piece) {\r\n return (piece.x * (wellDepth + 3) + piece.y) * 4 + piece.o;\r\n };\r\n /**\r\n Input {wellState, piece} and a move, return\r\n the new {wellState, piece}.\r\n */\r\n var getNextState = function (wellState, move) {\r\n var nextWell = wellState.core.well;\r\n var nextScore = wellState.core.score;\r\n var nextAiState = wellState.ai;\r\n var nextPiece = __assign({}, wellState.piece);\r\n // apply transform\r\n if (move === 'L') {\r\n nextPiece.x--;\r\n }\r\n if (move === 'R') {\r\n nextPiece.x++;\r\n }\r\n if (move === 'D') {\r\n nextPiece.y++;\r\n }\r\n if (move === 'U') {\r\n nextPiece.o = (nextPiece.o + 1) % 4;\r\n }\r\n var orientation = rotationSystem.rotations[nextPiece.id][nextPiece.o];\r\n var xActual = nextPiece.x + orientation.xMin;\r\n var yActual = nextPiece.y + orientation.yMin;\r\n if (xActual < 0 || // off left side\r\n xActual + orientation.xDim > wellWidth || // off right side\r\n yActual < 0 || // off top (??)\r\n yActual + orientation.yDim > wellDepth || // off bottom\r\n orientation.rows.some(function (row, y) {\r\n return wellState.core.well[yActual + y] & (row << xActual);\r\n }) // obstruction\r\n ) {\r\n if (move === 'D') {\r\n // Lock piece\r\n nextWell = wellState.core.well.slice();\r\n var orientation_1 = rotationSystem.rotations[wellState.piece.id][wellState.piece.o];\r\n // this is the top left point in the bounding box of this orientation of this piece\r\n var xActual_1 = wellState.piece.x + orientation_1.xMin;\r\n var yActual_1 = wellState.piece.y + orientation_1.yMin;\r\n // row by row bitwise line alteration\r\n for (var row = 0; row < orientation_1.yDim; row++) {\r\n // can't negative bit-shift, but alas X can be negative\r\n nextWell[yActual_1 + row] |= (orientation_1.rows[row] << xActual_1);\r\n }\r\n // check for complete lines now\r\n // NOTE: completed lines don't count if you've lost\r\n for (var row = 0; row < orientation_1.yDim; row++) {\r\n if (yActual_1 >= bar &&\r\n nextWell[yActual_1 + row] === (1 << wellWidth) - 1) {\r\n // move all lines above this point down\r\n for (var k = yActual_1 + row; k > 1; k--) {\r\n nextWell[k] = nextWell[k - 1];\r\n }\r\n // insert a new blank line at the top\r\n // though of course the top line will always be blank anyway\r\n nextWell[0] = 0;\r\n nextScore++;\r\n }\r\n }\r\n nextPiece = null;\r\n }\r\n else {\r\n // No move\r\n nextPiece = wellState.piece;\r\n }\r\n }\r\n return {\r\n core: {\r\n well: nextWell,\r\n score: nextScore\r\n },\r\n ai: nextAiState,\r\n piece: nextPiece\r\n };\r\n };\r\n /**\r\n Given a well and a piece ID, find all possible places where it could land\r\n and return the array of \"possible future\" states. All of these states\r\n will have `null` `piece` because the piece is landed; some will have\r\n a positive `score`.\r\n */\r\n var getNextCoreStates = function (core, pieceId) {\r\n var piece = rotationSystem.placeNewPiece(wellWidth, pieceId);\r\n // move the piece down to a lower position before we have to\r\n // start pathfinding for it\r\n // move through empty rows\r\n while (piece.y + 4 < wellDepth && // piece is above the bottom\r\n core.well[piece.y + 4] === 0 // nothing immediately below it\r\n ) {\r\n piece = getNextState({\r\n core: core,\r\n ai: undefined,\r\n piece: piece\r\n }, 'D').piece;\r\n }\r\n var piecePositions = [piece];\r\n var seen = new Set();\r\n seen.add(getHashCode(piece));\r\n var possibleFutures = [];\r\n // A simple `forEach` won't work here because we are appending to the list as we go\r\n var i = 0;\r\n while (i < piecePositions.length) {\r\n piece = piecePositions[i];\r\n // apply all possible moves\r\n moves.forEach(function (move) {\r\n var nextState = getNextState({\r\n core: core,\r\n ai: undefined,\r\n piece: piece\r\n }, move);\r\n var newPiece = nextState.piece;\r\n if (newPiece === null) {\r\n // piece locked? better add that to the list\r\n // do NOT check locations, they aren't significant here\r\n possibleFutures.push(nextState.core);\r\n }\r\n else {\r\n // transform succeeded?\r\n // new location? append to list\r\n // check locations, they are significant\r\n var newHashCode = getHashCode(newPiece);\r\n if (!seen.has(newHashCode)) {\r\n piecePositions.push(newPiece);\r\n seen.add(newHashCode);\r\n }\r\n }\r\n });\r\n i++;\r\n }\r\n return possibleFutures;\r\n };\r\n var validateAiResult = function (enemy, coreState, aiState) { return __awaiter(void 0, void 0, void 0, function () {\r\n var aiResult, _a, unsafePieceId, nextAiState;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0: return [4 /*yield*/, enemy.ai(coreState, aiState, getNextCoreStates)];\r\n case 1:\r\n aiResult = _b.sent();\r\n _a = __read(Array.isArray(aiResult)\r\n ? aiResult\r\n : [aiResult, aiState], 2), unsafePieceId = _a[0], nextAiState = _a[1];\r\n if (pieceIds.includes(unsafePieceId)) {\r\n return [2 /*return*/, [unsafePieceId, nextAiState]];\r\n }\r\n throw Error(\"Bad piece ID: \".concat(unsafePieceId));\r\n }\r\n });\r\n }); };\r\n var getFirstWellState = function (_a) {\r\n var enemy = _a.enemy;\r\n return __awaiter(void 0, void 0, void 0, function () {\r\n var firstCoreState, _b, firstPieceId, firstAiState;\r\n return __generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0:\r\n firstCoreState = {\r\n well: Array(wellDepth).fill(0),\r\n score: 0\r\n };\r\n return [4 /*yield*/, validateAiResult(enemy, firstCoreState, undefined)];\r\n case 1:\r\n _b = __read.apply(void 0, [_c.sent(), 2]), firstPieceId = _b[0], firstAiState = _b[1];\r\n return [2 /*return*/, {\r\n core: firstCoreState,\r\n ai: firstAiState,\r\n piece: rotationSystem.placeNewPiece(wellWidth, firstPieceId)\r\n }];\r\n }\r\n });\r\n });\r\n };\r\n /**\r\n Accepts the input of a move and attempts to apply that\r\n transform to the live piece in the live well.\r\n Returns the new state. Technically the new state could be partial but to\r\n satisfy the compiler make it whole\r\n */\r\n var handleMove = function (state, move) { return __awaiter(void 0, void 0, void 0, function () {\r\n var enemy, mode, replay, wellStateId, wellStates, nextWellStateId, nextReplay, nextWellStates, nextWellState_1, nextWellState, gameIsOver, nextMode, pieceId, aiState, error_1;\r\n var _a;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n enemy = state.enemy, mode = state.mode, replay = state.replay, wellStateId = state.wellStateId, wellStates = state.wellStates;\r\n nextWellStateId = wellStateId + 1;\r\n if (wellStateId in replay && move === replay[wellStateId]) {\r\n nextReplay = replay;\r\n nextWellStates = wellStates;\r\n }\r\n else {\r\n // Push the new move\r\n nextReplay = replay.slice(0, wellStateId).concat([move]);\r\n // And truncate the future\r\n nextWellStates = wellStates.slice(0, wellStateId + 1);\r\n }\r\n if (!(nextWellStateId in nextWellStates)) {\r\n nextWellState_1 = getNextState(nextWellStates[wellStateId], move);\r\n nextWellStates = __spreadArray(__spreadArray([], __read(nextWellStates), false), [nextWellState_1], false);\r\n }\r\n nextWellState = nextWellStates[nextWellStateId];\r\n gameIsOver = nextWellState.core.well[bar - 1] !== 0;\r\n nextMode = gameIsOver ? 'GAME_OVER' : mode;\r\n if (!(nextWellState.piece === null && nextMode !== 'GAME_OVER')) return [3 /*break*/, 5];\r\n pieceId = void 0;\r\n aiState = void 0;\r\n _b.label = 1;\r\n case 1:\r\n _b.trys.push([1, 3, , 4]);\r\n return [4 /*yield*/, validateAiResult(enemy, nextWellState.core, nextWellState.ai)];\r\n case 2:\r\n // TODO: `nextWellState.core.well` should be more complex and contain colour\r\n // information, whereas the well passed to the AI should be a simple\r\n // array of integers\r\n _a = __read.apply(void 0, [_b.sent(), 2]), pieceId = _a[0], aiState = _a[1];\r\n return [3 /*break*/, 4];\r\n case 3:\r\n error_1 = _b.sent();\r\n console.error(error_1);\r\n return [2 /*return*/, __assign(__assign({}, state), { error: {\r\n interpretation: 'Caught this exception while trying to generate a new piece using your custom AI. Game halted.',\r\n real: error_1.message,\r\n dismissable: true\r\n } })];\r\n case 4:\r\n nextWellState.ai = aiState;\r\n nextWellState.piece = rotationSystem.placeNewPiece(wellWidth, pieceId);\r\n _b.label = 5;\r\n case 5: return [2 /*return*/, __assign(__assign({}, state), { mode: nextMode, wellStateId: nextWellStateId, wellStates: nextWellStates, replay: nextReplay })];\r\n }\r\n });\r\n }); };\r\n return {\r\n getFirstWellState: getFirstWellState,\r\n getNextCoreStates: getNextCoreStates,\r\n handleMove: handleMove\r\n };\r\n};\r\n","// Just for the sake of example, make this async\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nexport var lovetrisAi = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {\r\n return [2 /*return*/, 'I'];\r\n}); }); };\r\n","/*\r\n This is an implementation of the algorithm proposed by Heidi Burgiel in her 1997 paper\r\n \"How To Lose At Tetris\"\r\n .\r\n\r\n \"\"\"\r\n The Tetris game consisting of only Z-tetrominoes alternating orientation will always end\r\n before 70,000 tetrominoes have been played.\r\n \"\"\"\r\n\r\n Here \"Z-tetromino\" is a generic term for S and Z pieces, where a \"left-handed Z-tetromino\" is a\r\n Z piece and a \"right-handed Z tetromino\" is an S piece.\r\n\r\n Burgiel's paper proves that this AI eventually defeats the player before 70,000 pieces have been\r\n played (i.e. before 28,000 lines have been made), regardless of what actions the player takes\r\n and despite the fact that the AI pays no attention to the current state of the well when deciding\r\n which piece to send next.\r\n*/\r\nexport var burgAi = function (currentCoreState, currentAiState, getNextCoreStates) {\r\n if (currentAiState === undefined) {\r\n currentAiState = 'S';\r\n }\r\n return [currentAiState, currentAiState === 'S' ? 'Z' : 'S'];\r\n};\r\n","/**\r\n The HATETRIS rotation system\r\n*/\r\nvar __read = (this && this.__read) || function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n};\r\nvar unmodified = {\r\n I: [\r\n [\r\n '....',\r\n '####',\r\n '....',\r\n '....'\r\n ], [\r\n '..#.',\r\n '..#.',\r\n '..#.',\r\n '..#.'\r\n ], [\r\n '....',\r\n '....',\r\n '####',\r\n '....'\r\n ], [\r\n '.#..',\r\n '.#..',\r\n '.#..',\r\n '.#..'\r\n ]\r\n ],\r\n J: [\r\n [\r\n '....',\r\n '.##.',\r\n '.#..',\r\n '.#..'\r\n ], [\r\n '....',\r\n '###.',\r\n '..#.',\r\n '....'\r\n ], [\r\n '..#.',\r\n '..#.',\r\n '.##.',\r\n '....'\r\n ], [\r\n '....',\r\n '.#..',\r\n '.###',\r\n '....'\r\n ]\r\n ],\r\n L: [\r\n [\r\n '....',\r\n '.###',\r\n '.#..',\r\n '....'\r\n ], [\r\n '....',\r\n '.##.',\r\n '..#.',\r\n '..#.'\r\n ], [\r\n '....',\r\n '..#.',\r\n '###.',\r\n '....'\r\n ], [\r\n '.#..',\r\n '.#..',\r\n '.##.',\r\n '....'\r\n ]\r\n ],\r\n O: [\r\n [\r\n '....',\r\n '.##.',\r\n '.##.',\r\n '....'\r\n ], [\r\n '....',\r\n '.##.',\r\n '.##.',\r\n '....'\r\n ], [\r\n '....',\r\n '.##.',\r\n '.##.',\r\n '....'\r\n ], [\r\n '....',\r\n '.##.',\r\n '.##.',\r\n '....'\r\n ]\r\n ],\r\n S: [\r\n [\r\n '....',\r\n '..##',\r\n '.##.',\r\n '....'\r\n ], [\r\n '....',\r\n '.#..',\r\n '.##.',\r\n '..#.'\r\n ], [\r\n '....',\r\n '.##.',\r\n '##..',\r\n '....'\r\n ], [\r\n '.#..',\r\n '.##.',\r\n '..#.',\r\n '....'\r\n ]\r\n ],\r\n T: [\r\n [\r\n '....',\r\n '.###',\r\n '..#.',\r\n '....'\r\n ], [\r\n '....',\r\n '..#.',\r\n '.##.',\r\n '..#.'\r\n ], [\r\n '....',\r\n '.#..',\r\n '###.',\r\n '....'\r\n ], [\r\n '.#..',\r\n '.##.',\r\n '.#..',\r\n '....'\r\n ]\r\n ],\r\n Z: [\r\n [\r\n '....',\r\n '.##.',\r\n '..##',\r\n '....'\r\n ], [\r\n '....',\r\n '..#.',\r\n '.##.',\r\n '.#..'\r\n ], [\r\n '....',\r\n '##..',\r\n '.##.',\r\n '....'\r\n ], [\r\n '..#.',\r\n '.##.',\r\n '.#..',\r\n '....'\r\n ]\r\n ]\r\n};\r\n// Note that the order here is significant,\r\n// the least convenient piece is placed first.\r\nvar rotations = Object.fromEntries(Object.entries(unmodified)\r\n .map(function (_a) {\r\n var _b = __read(_a, 2), pieceId = _b[0], visuals = _b[1];\r\n return [\r\n pieceId,\r\n visuals\r\n .map(function (visual) {\r\n var xMin = Infinity; // leftmost extent (0, 1, 2 or 3)\r\n var xMax = -Infinity; // rightmost extent (1, 2, 3 or 4)\r\n var yMin = Infinity; // topmost extent (0, 1, 2 or 3)\r\n var yMax = -Infinity; // bottommost extent (1, 2, 3 or 4)\r\n // binary representation of the bits on each row\r\n var allRows = visual.map(function (visualRow, y) {\r\n var row = 0;\r\n visualRow.split('').forEach(function (chr, x) {\r\n if (chr === '#') {\r\n row += 1 << x;\r\n xMin = Math.min(xMin, x);\r\n xMax = Math.max(xMax, x + 1);\r\n yMin = Math.min(yMin, y);\r\n yMax = Math.max(yMax, y + 1);\r\n }\r\n });\r\n return row;\r\n });\r\n // truncate top rows\r\n // truncate bottom rows\r\n // shift right as many times as necessary\r\n var rows = allRows.slice(yMin, yMax).map(function (row) { return row >> xMin; });\r\n return {\r\n xMin: xMin,\r\n yMin: yMin,\r\n xDim: xMax - xMin,\r\n yDim: yMax - yMin,\r\n rows: rows\r\n };\r\n })\r\n ];\r\n}));\r\nvar placeNewPiece = function (wellWidth, pieceId) { return ({\r\n id: pieceId,\r\n x: Math.floor((wellWidth - 4) / 2),\r\n y: 0,\r\n o: 0\r\n}); };\r\nexport default {\r\n placeNewPiece: placeNewPiece,\r\n rotations: rotations\r\n};\r\n","/**\r\n HATETRIS\r\n*/\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport Game from './components/Game/Game';\r\nimport hatetrisRotationSystem from './rotation-systems/hatetris-rotation-system';\r\nReactDOM.render((React.createElement(Game, { bar: 4, replayTimeout: 50, rotationSystem: hatetrisRotationSystem, wellDepth: 20, wellWidth: 10 })), document.querySelector('.index__root'));\r\n"],"names":["hasOwn","hasOwnProperty","classNames","classes","i","arguments","length","arg","argType","push","Array","isArray","inner","apply","toString","Object","prototype","key","call","join","module","exports","default","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","React","ReactDOM","__spreadArray","to","from","pack","ar","l","slice","concat","worstPieces","split","m","Symbol","iterator","r","e","next","done","value","error","hexChars","reverseLookup","A","B","C","D","E","F","lookupE","lookupD","forEach","pairString","numZBits","z2","match","pair","first","last","map","x","codePointAt","codePoint","chr","String","fromCodePoint","z","forwardEntryLookup","L","R","U","forwardLengthLookup","reverseEntryLookup","reverseNumberLookup","uint8Array","octets","nybbles","octet","rle","nybble","entry","flatMap","run","fill","encodeRepertoire","moves","str","uint8","j","keys","arr","maxRunLength","runs","Uint8Array","string","trim","test","includes","flat","hex","Math","floor","numUint8s","numUint8Bits","shouldBeNoMoreChars","Error","buffer","charAt","extendStatics","Well","props","bar","rotationSystem","wellDepth","wellWidth","wellState","well","core","piece","cellses","y","cells","landed","live","orientation_1","rotations","id","y2","yMin","x2","xMin","yDim","xDim","rows","cell","well__cell","className","__assign","assign","t","s","p","this","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","rejected","result","then","body","f","g","_","label","sent","trys","ops","verb","v","op","TypeError","pop","pieceIds","__extends","b","setPrototypeOf","__proto__","__","constructor","create","hatetris","shortDescription","buttonDescription","ai","currentCoreState","currentAiState","getNextCoreStates","Set","nextAiState","__read","JSON","stringify","evaluations","pieceId","pieceRanking","nextCoreStates","leadsIntoCycle","Number","some","nextCoreState","has","highestPeak","rating","findIndex","row","sort","hatetrisMild","href","lovetris","__generator","_a","brz","displayPiece","seenWells","seenWell","every","burg","enemies","_super","Game","_this","logic","getHashCode","getNextState","move","nextWell","nextScore","score","nextPiece","orientation","xActual","yActual","xActual_1","yActual_1","k","placeNewPiece","piecePositions","seen","add","possibleFutures","nextState","newPiece","newHashCode","validateAiResult","enemy","coreState","aiState","aiResult","unsafePieceId","_b","getFirstWellState","firstCoreState","firstPieceId","firstAiState","_c","handleMove","state","mode","replay","wellStateId","wellStates","nextWellStateId","nextReplay","nextWellStates","nextWellState_1","nextWellState","gameIsOver","nextMode","error_1","console","interpretation","real","message","dismissable","getLogic","handleClickStart","replayCopiedTimeoutId","replayTimeoutId","firstWellState","clearTimeout","setState","handleClickSelectAi","handleClickReplay","replayTimeout","error_2","window","prompt","setTimeout","handleReplayTimeout","nextReplayTimeoutId","handleRedo","warn","handleLeft","handleRight","handleDown","handleUp","handleUndo","handleDocumentKeyDown","event","ctrlKey","handleClickCopyReplay","navigator","clipboard","writeText","handleCopiedTimeout","handleClickDone","handleClickEnemy","displayEnemy","handleClickCustomEnemy","handleCancelCustomEnemy","handleCustomAiChange","customAiCode","target","handleSubmitCustomEnemy","Function","handleClickDismissError","render","style","fontWeight","fontSize","fontFamily","type","onClick","display","gap","autoFocus","width","onChange","defaultValue","flex","disabled","title","componentDidMount","document","addEventListener","componentWillUnmount","removeEventListener","fromEntries","entries","I","J","O","S","T","Z","visual","Infinity","xMax","yMax","visualRow","min","max","querySelector"],"sourceRoot":""}