gitextract_2jn2wipu/ ├── .github/ │ ├── copilot-instructions.md │ ├── pull_request_template.md │ └── workflows/ │ ├── ci.yml │ └── deploy.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .prettierignore ├── .prettierrc.json ├── CLAUDE.md ├── LICENSE ├── README.md ├── build/ │ ├── client.ts │ ├── engine-wasm.ts │ ├── env.ts │ ├── index.ts │ ├── plugins.ts │ ├── server.ts │ └── views.ts ├── dev-utils/ │ ├── ICN_METADATA_TRANSLATIONS.md │ ├── REDESIGN/ │ │ ├── design.md │ │ ├── runner_setup.md │ │ ├── stack.md │ │ └── todo.md │ ├── SKELETON.css │ ├── SKELETON.html │ ├── live-game-persistence.md │ ├── pieces/ │ │ ├── spritesheet 512/ │ │ │ └── How to create spritesheet.md │ │ └── svg/ │ │ └── Converting PNG to SVG.md │ ├── post_processing_effects/ │ │ ├── posterize/ │ │ │ ├── PosterizePass.ts │ │ │ └── fragment.glsl │ │ ├── radial_distortion/ │ │ │ ├── RadialDistortionPass.ts │ │ │ └── fragment.glsl │ │ └── rolling_hills/ │ │ ├── RollingHillsPass.ts │ │ └── fragment.glsl │ ├── readme.md │ ├── scripts/ │ │ ├── PatreonAPI.ts │ │ ├── audio/ │ │ │ └── processors/ │ │ │ └── bitcrusher/ │ │ │ ├── BitcrusherNode.ts │ │ │ └── BitcrusherProcessor.ts │ │ ├── clientEventDispatcher.ts │ │ ├── events.ts │ │ ├── gl-matrix.js │ │ ├── icn-regex-matching.ts │ │ ├── meshSimplification.ts │ │ ├── positionnormalizer/ │ │ │ ├── moveexpander.ts │ │ │ ├── normalizertester.ts │ │ │ ├── positioncompressor.ts │ │ │ ├── positioncompressorplusintersections.ts │ │ │ └── unusedpositionnormalizermethods.ts │ │ └── vertexdatatotexture.ts │ ├── shaders/ │ │ ├── texture/ │ │ │ ├── instanced/ │ │ │ │ └── tint/ │ │ │ │ ├── fragment.glsl │ │ │ │ └── vertex.glsl │ │ │ └── tint/ │ │ │ ├── fragment.glsl │ │ │ └── vertex.glsl │ │ └── voronoi/ │ │ └── fragment.glsl │ ├── sounds/ │ │ └── SoundscapeGenerator.html │ └── spritesheet_generator/ │ ├── spritesheet.ts │ └── spritesheetGenerator.ts ├── docs/ │ ├── COPYING.md │ ├── GRAPHICS.md │ ├── GUIDELINES.md │ ├── NAVIGATING.md │ ├── SETUP.md │ └── TRANSLATIONS.md ├── ecosystem.config.cjs ├── eslint.config.js ├── nodemon.json ├── package.json ├── scripts/ │ ├── add-file-paths.ts │ ├── generate-translation-types.ts │ ├── optimize-images.ts │ ├── organize-imports.ts │ └── readme.md ├── src/ │ ├── client/ │ │ ├── css/ │ │ │ ├── 404.css │ │ │ ├── admin.css │ │ │ ├── createaccount.css │ │ │ ├── credits.css │ │ │ ├── footer.css │ │ │ ├── guide.css │ │ │ ├── header.css │ │ │ ├── icnvalidator.css │ │ │ ├── index.css │ │ │ ├── leaderboard.css │ │ │ ├── login.css │ │ │ ├── member.css │ │ │ ├── news.css │ │ │ ├── play.css │ │ │ └── termsofservice.css │ │ ├── img/ │ │ │ ├── badges/ │ │ │ │ ├── checkmate-badge-bronze.avif │ │ │ │ ├── checkmate-badge-gold.avif │ │ │ │ └── checkmate-badge-silver.avif │ │ │ ├── blank_board.avif │ │ │ ├── game/ │ │ │ │ └── guide/ │ │ │ │ ├── arrowindicators.avif │ │ │ │ ├── fairy/ │ │ │ │ │ ├── amazon.avif │ │ │ │ │ ├── archbishop.avif │ │ │ │ │ ├── centaur.avif │ │ │ │ │ ├── chancellor.avif │ │ │ │ │ ├── guard.avif │ │ │ │ │ ├── hawk.avif │ │ │ │ │ ├── huygen.avif │ │ │ │ │ ├── knightrider.avif │ │ │ │ │ ├── obstacle.avif │ │ │ │ │ ├── rose.avif │ │ │ │ │ └── void.avif │ │ │ │ ├── kingrookfork.avif │ │ │ │ └── promotionlines.avif │ │ │ ├── king_w.avif │ │ │ ├── logo/ │ │ │ │ ├── dark-theme.avif │ │ │ │ └── light-theme.avif │ │ │ ├── member_default.avif │ │ │ └── queen_w.avif │ │ ├── scripts/ │ │ │ ├── cjs/ │ │ │ │ └── game/ │ │ │ │ └── htmlscript.ts │ │ │ └── esm/ │ │ │ ├── audio/ │ │ │ │ ├── AudioEffects.ts │ │ │ │ ├── AudioManager.ts │ │ │ │ ├── AudioUtils.ts │ │ │ │ ├── LFOFactory.ts │ │ │ │ ├── SoundLayer.ts │ │ │ │ ├── SoundscapePlayer.ts │ │ │ │ └── processors/ │ │ │ │ ├── downsampler/ │ │ │ │ │ ├── DownsamplerNode.ts │ │ │ │ │ └── DownsamplerProcessor.ts │ │ │ │ └── worklet-types.ts │ │ │ ├── chess/ │ │ │ │ └── rendering/ │ │ │ │ ├── checkerboardgenerator.ts │ │ │ │ ├── imagecache.ts │ │ │ │ ├── svgcache.ts │ │ │ │ └── texturecache.ts │ │ │ ├── components/ │ │ │ │ └── header/ │ │ │ │ ├── currpage-greyer.ts │ │ │ │ ├── dropdowns/ │ │ │ │ │ ├── appearancedropdown.ts │ │ │ │ │ ├── gameplaydropdown.ts │ │ │ │ │ ├── languagedropdown.ts │ │ │ │ │ ├── legalmovedropdown.ts │ │ │ │ │ ├── perspectivedropdown.ts │ │ │ │ │ └── sounddropdown.ts │ │ │ │ ├── faviconselector.ts │ │ │ │ ├── header.ts │ │ │ │ ├── news-notification.ts │ │ │ │ ├── pingmeter.ts │ │ │ │ ├── preferences.ts │ │ │ │ ├── settings.ts │ │ │ │ └── spacing.ts │ │ │ ├── game/ │ │ │ │ ├── GameBus.ts │ │ │ │ ├── boardeditor/ │ │ │ │ │ ├── actions/ │ │ │ │ │ │ ├── eactions.ts │ │ │ │ │ │ ├── eautosave.ts │ │ │ │ │ │ ├── ecloud.ts │ │ │ │ │ │ ├── editorSavesAPI.ts │ │ │ │ │ │ └── esave.ts │ │ │ │ │ ├── boardeditor.ts │ │ │ │ │ ├── eclipboard.ts │ │ │ │ │ ├── edithistory.ts │ │ │ │ │ ├── editortypes.ts │ │ │ │ │ ├── egamerules.ts │ │ │ │ │ └── tools/ │ │ │ │ │ ├── drawingtool.ts │ │ │ │ │ ├── etoolmanager.ts │ │ │ │ │ ├── normaltool.ts │ │ │ │ │ └── selection/ │ │ │ │ │ ├── scursor.ts │ │ │ │ │ ├── sdrag.ts │ │ │ │ │ ├── selectiontool.ts │ │ │ │ │ ├── sfill.ts │ │ │ │ │ ├── stoolgraphics.ts │ │ │ │ │ └── stransformations.ts │ │ │ │ ├── chess/ │ │ │ │ │ ├── checkmatepractice.ts │ │ │ │ │ ├── clientmetadatautil.ts │ │ │ │ │ ├── copygame.ts │ │ │ │ │ ├── engines/ │ │ │ │ │ │ ├── engine.ts │ │ │ │ │ │ ├── engineCheckmatePractice.ts │ │ │ │ │ │ ├── enginecards/ │ │ │ │ │ │ │ └── hydrochess_card.ts │ │ │ │ │ │ └── hydrochess.ts │ │ │ │ │ ├── game.ts │ │ │ │ │ ├── gamecompressor.ts │ │ │ │ │ ├── gamecompressor.unit.test.ts │ │ │ │ │ ├── gameformulator.ts │ │ │ │ │ ├── gameloader.ts │ │ │ │ │ ├── gameslot.ts │ │ │ │ │ ├── graphicalchanges.ts │ │ │ │ │ ├── movesequence.ts │ │ │ │ │ ├── pastegame.ts │ │ │ │ │ ├── premoves.ts │ │ │ │ │ └── selection.ts │ │ │ │ ├── config.ts │ │ │ │ ├── gui/ │ │ │ │ │ ├── boardeditor/ │ │ │ │ │ │ ├── actions/ │ │ │ │ │ │ │ ├── guiclearposition.ts │ │ │ │ │ │ │ ├── guigamerules.ts │ │ │ │ │ │ │ ├── guiresetposition.ts │ │ │ │ │ │ │ ├── guistartenginegame.ts │ │ │ │ │ │ │ ├── guistartlocalgame.ts │ │ │ │ │ │ │ └── loadposition/ │ │ │ │ │ │ │ ├── guiloadposition.ts │ │ │ │ │ │ │ ├── guiloadpositionmodal.ts │ │ │ │ │ │ │ └── guiloadpositionsavelist.ts │ │ │ │ │ │ ├── guiboardeditor.ts │ │ │ │ │ │ ├── guifloatingwindow.ts │ │ │ │ │ │ ├── guipalette.ts │ │ │ │ │ │ ├── guipositionheader.ts │ │ │ │ │ │ └── guitoolbar.ts │ │ │ │ │ ├── gui.ts │ │ │ │ │ ├── guiclock.ts │ │ │ │ │ ├── guidrawoffer.ts │ │ │ │ │ ├── guigameinfo.ts │ │ │ │ │ ├── guiloading.ts │ │ │ │ │ ├── guinavigation.ts │ │ │ │ │ ├── guipause.ts │ │ │ │ │ ├── guiplay.ts │ │ │ │ │ ├── guipractice.ts │ │ │ │ │ ├── guipromotion.ts │ │ │ │ │ ├── guititle.ts │ │ │ │ │ ├── loadingscreen.ts │ │ │ │ │ ├── stats.ts │ │ │ │ │ ├── style.ts │ │ │ │ │ └── toast.ts │ │ │ │ ├── input.ts │ │ │ │ ├── main.ts │ │ │ │ ├── misc/ │ │ │ │ │ ├── controls.ts │ │ │ │ │ ├── enginegame.ts │ │ │ │ │ ├── gamesound.ts │ │ │ │ │ ├── invites.ts │ │ │ │ │ ├── keybinds.ts │ │ │ │ │ ├── loadbalancer.ts │ │ │ │ │ ├── onlinegame/ │ │ │ │ │ │ ├── afk.ts │ │ │ │ │ │ ├── disconnect.ts │ │ │ │ │ │ ├── drawoffers.ts │ │ │ │ │ │ ├── movesendreceive.ts │ │ │ │ │ │ ├── onlinegame.ts │ │ │ │ │ │ ├── onlinegamerouter.ts │ │ │ │ │ │ ├── resyncer.ts │ │ │ │ │ │ └── tabnameflash.ts │ │ │ │ │ └── space.ts │ │ │ │ ├── rendering/ │ │ │ │ │ ├── ColorFlowRenderer.ts │ │ │ │ │ ├── WaterRipples.ts │ │ │ │ │ ├── animation.ts │ │ │ │ │ ├── area.ts │ │ │ │ │ ├── arrows/ │ │ │ │ │ │ ├── arrowlegalmovehighlights.ts │ │ │ │ │ │ ├── arrows.ts │ │ │ │ │ │ ├── arrowscalculator.ts │ │ │ │ │ │ ├── arrowsgraphics.ts │ │ │ │ │ │ └── arrowshifts.ts │ │ │ │ │ ├── boarddrag.ts │ │ │ │ │ ├── boardpos.ts │ │ │ │ │ ├── boardtiles.ts │ │ │ │ │ ├── border.ts │ │ │ │ │ ├── camera.ts │ │ │ │ │ ├── coordinates.ts │ │ │ │ │ ├── dragging/ │ │ │ │ │ │ ├── draganimation.ts │ │ │ │ │ │ ├── dragarrows.ts │ │ │ │ │ │ └── droparrows.ts │ │ │ │ │ ├── effect_zone/ │ │ │ │ │ │ ├── EffectZoneManager.ts │ │ │ │ │ │ ├── soundscapes/ │ │ │ │ │ │ │ ├── IridescenceSoundscape.ts │ │ │ │ │ │ │ └── UndercurrentSoundscape.ts │ │ │ │ │ │ └── zones/ │ │ │ │ │ │ ├── AshfallVocsZone.ts │ │ │ │ │ │ ├── ContortionFieldZone.ts │ │ │ │ │ │ ├── DustyWastesZone.ts │ │ │ │ │ │ ├── EchoRiftZone.ts │ │ │ │ │ │ ├── EmberVergeZone.ts │ │ │ │ │ │ ├── IridescenceZone.ts │ │ │ │ │ │ ├── OceanZone.ts │ │ │ │ │ │ ├── SpectralEdgeZone.ts │ │ │ │ │ │ ├── StaticZone.ts │ │ │ │ │ │ ├── TheBeginningZone.ts │ │ │ │ │ │ └── UndercurrentZone.ts │ │ │ │ │ ├── frameratelimiter.ts │ │ │ │ │ ├── frametracker.ts │ │ │ │ │ ├── gl-matrix.js │ │ │ │ │ ├── highlights/ │ │ │ │ │ │ ├── annotations/ │ │ │ │ │ │ │ ├── annotations.ts │ │ │ │ │ │ │ ├── drawarrows.ts │ │ │ │ │ │ │ ├── drawrays.ts │ │ │ │ │ │ │ └── drawsquares.ts │ │ │ │ │ │ ├── checkhighlight.ts │ │ │ │ │ │ ├── highlightline.ts │ │ │ │ │ │ ├── highlights.ts │ │ │ │ │ │ ├── legalmovehighlights.ts │ │ │ │ │ │ ├── legalmovemodel.ts │ │ │ │ │ │ ├── movehints.ts │ │ │ │ │ │ ├── selectedpiecehighlightline.ts │ │ │ │ │ │ ├── snapping.ts │ │ │ │ │ │ ├── specialrighthighlights.ts │ │ │ │ │ │ └── squarerendering.ts │ │ │ │ │ ├── instancedshapes.ts │ │ │ │ │ ├── meshes.ts │ │ │ │ │ ├── miniimage.ts │ │ │ │ │ ├── perspective.ts │ │ │ │ │ ├── piecemodels.ts │ │ │ │ │ ├── pieces.ts │ │ │ │ │ ├── primitives.ts │ │ │ │ │ ├── promotionlines.ts │ │ │ │ │ ├── screenshake.ts │ │ │ │ │ ├── starfield.ts │ │ │ │ │ ├── text/ │ │ │ │ │ │ ├── glyphatlas.ts │ │ │ │ │ │ └── textrenderer.ts │ │ │ │ │ ├── transitions/ │ │ │ │ │ │ └── Transition.ts │ │ │ │ │ └── webgl.ts │ │ │ │ └── websocket/ │ │ │ │ ├── socketclose.ts │ │ │ │ ├── socketman.ts │ │ │ │ ├── socketmessages.ts │ │ │ │ ├── socketrouter.ts │ │ │ │ ├── socketschemas.ts │ │ │ │ └── socketsubs.ts │ │ │ ├── util/ │ │ │ │ ├── ImageLoader.ts │ │ │ │ ├── IndexedDB.ts │ │ │ │ ├── LocalStorage.ts │ │ │ │ ├── PerlinNoise.ts │ │ │ │ ├── compression.ts │ │ │ │ ├── docutil.ts │ │ │ │ ├── httputils.ts │ │ │ │ ├── indexeddb.unit.test.ts │ │ │ │ ├── mouse.ts │ │ │ │ ├── pingManager.ts │ │ │ │ ├── splines.ts │ │ │ │ ├── svgtoimageconverter.ts │ │ │ │ ├── thread.ts │ │ │ │ ├── tooltips.ts │ │ │ │ ├── usernamecontainer.ts │ │ │ │ └── validatorama.ts │ │ │ ├── views/ │ │ │ │ ├── admin.ts │ │ │ │ ├── createaccount.ts │ │ │ │ ├── guide.ts │ │ │ │ ├── icnvalidator.ts │ │ │ │ ├── index.ts │ │ │ │ ├── leaderboard.ts │ │ │ │ ├── login.ts │ │ │ │ ├── member.ts │ │ │ │ ├── news.ts │ │ │ │ └── resetpassword.ts │ │ │ ├── webgl/ │ │ │ │ ├── BufferUtil.ts │ │ │ │ ├── ProgramManager.ts │ │ │ │ ├── Renderable.ts │ │ │ │ ├── ShaderProgram.ts │ │ │ │ ├── TextureLoader.ts │ │ │ │ ├── maskedDraw.ts │ │ │ │ └── post_processing/ │ │ │ │ ├── PostProcessingPipeline.ts │ │ │ │ └── passes/ │ │ │ │ ├── ColorGradePass.ts │ │ │ │ ├── GlitchPass.ts │ │ │ │ ├── HeatWavePass.ts │ │ │ │ ├── PassThroughPass.ts │ │ │ │ ├── SineWavePass.ts │ │ │ │ ├── VignettePass.ts │ │ │ │ ├── VoronoiDistortionPass.ts │ │ │ │ ├── WaterPass.ts │ │ │ │ └── WaterRipplePass.ts │ │ │ └── workers/ │ │ │ └── icnvalidator.worker.ts │ │ ├── shaders/ │ │ │ ├── arrow_images/ │ │ │ │ ├── fragment.glsl │ │ │ │ └── vertex.glsl │ │ │ ├── arrows/ │ │ │ │ └── vertex.glsl │ │ │ ├── board_uber_shader/ │ │ │ │ ├── fragment.glsl │ │ │ │ └── vertex.glsl │ │ │ ├── color/ │ │ │ │ ├── fragment.glsl │ │ │ │ ├── instanced/ │ │ │ │ │ └── vertex.glsl │ │ │ │ └── vertex.glsl │ │ │ ├── color_grade/ │ │ │ │ └── fragment.glsl │ │ │ ├── color_texture/ │ │ │ │ ├── fragment.glsl │ │ │ │ └── vertex.glsl │ │ │ ├── fullscreen_colorflow/ │ │ │ │ └── fragment.glsl │ │ │ ├── glitch/ │ │ │ │ └── fragment.glsl │ │ │ ├── heat_wave/ │ │ │ │ └── fragment.glsl │ │ │ ├── highlights/ │ │ │ │ └── vertex.glsl │ │ │ ├── mini_images/ │ │ │ │ ├── fragment.glsl │ │ │ │ └── vertex.glsl │ │ │ ├── post_pass/ │ │ │ │ ├── fragment.glsl │ │ │ │ └── vertex.glsl │ │ │ ├── sine_wave/ │ │ │ │ └── fragment.glsl │ │ │ ├── starfield/ │ │ │ │ └── vertex.glsl │ │ │ ├── texture/ │ │ │ │ ├── fragment.glsl │ │ │ │ ├── instanced/ │ │ │ │ │ └── vertex.glsl │ │ │ │ └── vertex.glsl │ │ │ ├── vignette/ │ │ │ │ └── fragment.glsl │ │ │ ├── voronoi_distortion/ │ │ │ │ └── fragment.glsl │ │ │ ├── water/ │ │ │ │ └── fragment.glsl │ │ │ └── water_ripple/ │ │ │ └── fragment.glsl │ │ ├── sounds/ │ │ │ └── spritesheet/ │ │ │ ├── note.txt │ │ │ └── soundspritesheet.opus │ │ └── views/ │ │ ├── admin.ejs │ │ ├── components/ │ │ │ ├── footer.ejs │ │ │ └── header.ejs │ │ ├── createaccount.ejs │ │ ├── credits.ejs │ │ ├── errors/ │ │ │ ├── 400.ejs │ │ │ ├── 401.ejs │ │ │ ├── 404.ejs │ │ │ ├── 409.ejs │ │ │ └── 500.ejs │ │ ├── guide.ejs │ │ ├── icnvalidator.html │ │ ├── index.ejs │ │ ├── leaderboard.ejs │ │ ├── login.ejs │ │ ├── member.ejs │ │ ├── news.ejs │ │ ├── play.ejs │ │ ├── resetpassword.ejs │ │ └── termsofservice.ejs │ ├── server/ │ │ ├── api/ │ │ │ ├── AdminPanel.ts │ │ │ ├── EditorSavesAPI.int.test.ts │ │ │ ├── EditorSavesAPI.ts │ │ │ ├── GitHub.ts │ │ │ ├── LeaderboardAPI.ts │ │ │ ├── MemberAPI.ts │ │ │ ├── NewsAPI.ts │ │ │ ├── PracticeProgress.int.test.ts │ │ │ ├── PracticeProgress.ts │ │ │ ├── Prefs.int.test.ts │ │ │ └── Prefs.ts │ │ ├── app.ts │ │ ├── config/ │ │ │ ├── certOptions.ts │ │ │ ├── dateLocales.ts │ │ │ ├── generateCert.ts │ │ │ ├── i18n.ts │ │ │ ├── paths.ts │ │ │ ├── setupDev.ts │ │ │ └── translationLoader.ts │ │ ├── controllers/ │ │ │ ├── authController.ts │ │ │ ├── authRatelimiter.ts │ │ │ ├── authenticationTokens/ │ │ │ │ ├── accessTokenIssuer.ts │ │ │ │ ├── sessionManager.ts │ │ │ │ ├── tokenSigner.ts │ │ │ │ └── tokenValidator.ts │ │ │ ├── awsWebhook.ts │ │ │ ├── browserIDManager.ts │ │ │ ├── createAccountController.ts │ │ │ ├── createAccountController.unit.test.ts │ │ │ ├── deleteAccountController.ts │ │ │ ├── deployController.ts │ │ │ ├── emailController.ts │ │ │ ├── loginController.int.test.ts │ │ │ ├── loginController.ts │ │ │ ├── logoutController.ts │ │ │ ├── passwordResetController.ts │ │ │ ├── roles.ts │ │ │ └── verifyAccountController.ts │ │ ├── database/ │ │ │ ├── backupManager.ts │ │ │ ├── blacklistManager.ts │ │ │ ├── cleanupTasks.ts │ │ │ ├── database.ts │ │ │ ├── databaseTables.ts │ │ │ ├── editorSavesManager.ts │ │ │ ├── gamesManager.ts │ │ │ ├── leaderboardsManager.ts │ │ │ ├── liveGamesManager.ts │ │ │ ├── livePlayerGamesManager.ts │ │ │ ├── memberManager.ts │ │ │ ├── playerGamesManager.ts │ │ │ ├── ratingAbuseManager.ts │ │ │ └── refreshTokenManager.ts │ │ ├── game/ │ │ │ ├── gamemanager/ │ │ │ │ ├── abortresigngame.ts │ │ │ │ ├── activeplayers.ts │ │ │ │ ├── afkdisconnect.ts │ │ │ │ ├── cheatreport.ts │ │ │ │ ├── drawoffers.ts │ │ │ │ ├── gamecount.ts │ │ │ │ ├── gamelogger.ts │ │ │ │ ├── gamemanager.ts │ │ │ │ ├── gamerouter.ts │ │ │ │ ├── gameutility.ts │ │ │ │ ├── joingame.ts │ │ │ │ ├── liveGameRestore.ts │ │ │ │ ├── liveGameValues.ts │ │ │ │ ├── movesubmission.ts │ │ │ │ ├── onAFK.ts │ │ │ │ ├── onOfferDraw.ts │ │ │ │ ├── pastereport.ts │ │ │ │ ├── ratingabuse.ts │ │ │ │ ├── ratingcalculation.ts │ │ │ │ └── resync.ts │ │ │ ├── invitesmanager/ │ │ │ │ ├── acceptinvite.ts │ │ │ │ ├── cancelinvite.ts │ │ │ │ ├── createinvite.ts │ │ │ │ ├── invitesmanager.ts │ │ │ │ ├── invitesrouter.ts │ │ │ │ ├── invitessubscribers.ts │ │ │ │ └── inviteutility.ts │ │ │ ├── servermetadatautil.ts │ │ │ ├── statlogger.ts │ │ │ └── timecontrol.ts │ │ ├── middleware/ │ │ │ ├── banned.ts │ │ │ ├── errorHandler.ts │ │ │ ├── logEvents.ts │ │ │ ├── middleware.ts │ │ │ ├── rateLimit.ts │ │ │ ├── rateLimiters.ts │ │ │ ├── secureRedirect.ts │ │ │ ├── send404.ts │ │ │ └── verifyJWT.ts │ │ ├── routes/ │ │ │ └── root.ts │ │ ├── server.ts │ │ ├── socket/ │ │ │ ├── closeSocket.ts │ │ │ ├── echoTracker.ts │ │ │ ├── generalrouter.ts │ │ │ ├── openSocket.ts │ │ │ ├── receiveSocketMessage.ts │ │ │ ├── sendSocketMessage.ts │ │ │ ├── socketManager.ts │ │ │ ├── socketRouter.ts │ │ │ ├── socketServer.ts │ │ │ └── socketUtility.ts │ │ ├── types.ts │ │ └── utility/ │ │ ├── IP.ts │ │ ├── errorGuard.ts │ │ ├── generateDependancyGraph.ts │ │ ├── lockFile.ts │ │ ├── mailer.ts │ │ ├── newsUtil.ts │ │ ├── startupLogger.ts │ │ ├── translate.ts │ │ ├── urlUtils.ts │ │ └── zodlogger.ts │ ├── shared/ │ │ ├── chess/ │ │ │ ├── logic/ │ │ │ │ ├── boardchanges.ts │ │ │ │ ├── checkdetection.ts │ │ │ │ ├── checkmate.ts │ │ │ │ ├── checkresolver.ts │ │ │ │ ├── clock.ts │ │ │ │ ├── fourdimensionalmoves.ts │ │ │ │ ├── gamefile.ts │ │ │ │ ├── icn/ │ │ │ │ │ ├── icncommentutils.ts │ │ │ │ │ └── icnconverter.ts │ │ │ │ ├── initvariant.ts │ │ │ │ ├── insufficientmaterial.ts │ │ │ │ ├── legalmoves.ts │ │ │ │ ├── movepiece.ts │ │ │ │ ├── movesets.ts │ │ │ │ ├── movevalidation.ts │ │ │ │ ├── organizedpieces.ts │ │ │ │ ├── repetition.ts │ │ │ │ ├── specialdetect.ts │ │ │ │ ├── specialmove.ts │ │ │ │ ├── state.ts │ │ │ │ └── wincondition.ts │ │ │ ├── util/ │ │ │ │ ├── bdcoords.ts │ │ │ │ ├── boardutil.ts │ │ │ │ ├── clockutil.ts │ │ │ │ ├── coordutil.ts │ │ │ │ ├── gamefileutility.ts │ │ │ │ ├── gamerules.ts │ │ │ │ ├── metadatautil.ts │ │ │ │ ├── moveutil.ts │ │ │ │ ├── typeutil.ts │ │ │ │ ├── validcheckmates.ts │ │ │ │ └── winconutil.ts │ │ │ └── variants/ │ │ │ ├── fourdimensionalgenerator.ts │ │ │ ├── omega3generator.ts │ │ │ ├── omega4generator.ts │ │ │ ├── servervalidation.ts │ │ │ ├── validleaderboard.ts │ │ │ ├── variant.ts │ │ │ └── variantdictionary.ts │ │ ├── components/ │ │ │ └── header/ │ │ │ ├── pieceThemes.ts │ │ │ └── themes.ts │ │ ├── game_version.ts │ │ ├── types.ts │ │ └── util/ │ │ ├── EventBus.ts │ │ ├── editorutil.ts │ │ ├── isprime.ts │ │ ├── jsutil.ts │ │ ├── math/ │ │ │ ├── bimath.ts │ │ │ ├── bounds.ts │ │ │ ├── geometry.ts │ │ │ ├── math.ts │ │ │ └── vectors.ts │ │ ├── timeutil.ts │ │ ├── tokenConfig.ts │ │ ├── uuid.ts │ │ ├── validators.ts │ │ └── wsutil.ts │ ├── tests/ │ │ ├── integrationUtils.ts │ │ ├── testRequest.ts │ │ └── tests-setup.ts │ └── types/ │ ├── globals.d.ts │ ├── shaders.d.ts │ └── translations.ts ├── translation/ │ ├── changes.json │ ├── de-DE.toml │ ├── el-GR.toml │ ├── en-US.toml │ ├── es-ES.toml │ ├── fi-FI.toml │ ├── fr-FR.toml │ ├── news/ │ │ ├── en-US/ │ │ │ ├── 2024-01-29.md │ │ │ ├── 2024-05-14.md │ │ │ ├── 2024-05-24.md │ │ │ ├── 2024-05-27.md │ │ │ ├── 2024-07-09.md │ │ │ ├── 2024-07-13.md │ │ │ ├── 2024-07-22.md │ │ │ ├── 2024-08-01.md │ │ │ ├── 2024-09-11.md │ │ │ ├── 2024-11-22.md │ │ │ ├── 2025-03-12.md │ │ │ ├── 2025-03-17.md │ │ │ ├── 2025-05-21.md │ │ │ ├── 2025-06-16.md │ │ │ ├── 2025-11-28.md │ │ │ ├── 2026-01-08.md │ │ │ ├── 2026-03-09.md │ │ │ └── 2026-04-24.md │ │ ├── es-ES/ │ │ │ ├── 2024-01-29.md │ │ │ ├── 2024-05-14.md │ │ │ ├── 2024-05-24.md │ │ │ ├── 2024-05-27.md │ │ │ ├── 2024-07-09.md │ │ │ ├── 2024-07-13.md │ │ │ ├── 2024-07-22.md │ │ │ ├── 2024-08-01.md │ │ │ ├── 2024-09-11.md │ │ │ ├── 2024-11-22.md │ │ │ ├── 2025-03-12.md │ │ │ ├── 2025-03-17.md │ │ │ ├── 2025-05-21.md │ │ │ ├── 2025-06-16.md │ │ │ └── 2025-11-28.md │ │ ├── fi-FI/ │ │ │ ├── 2026-01-08.md │ │ │ ├── 2026-03-09.md │ │ │ └── 2026-04-24.md │ │ ├── fr-FR/ │ │ │ ├── 2024-01-29.md │ │ │ ├── 2024-05-14.md │ │ │ ├── 2024-05-24.md │ │ │ ├── 2024-05-27.md │ │ │ ├── 2024-07-09.md │ │ │ ├── 2024-07-13.md │ │ │ ├── 2024-07-22.md │ │ │ ├── 2024-08-01.md │ │ │ ├── 2024-09-11.md │ │ │ ├── 2024-11-22.md │ │ │ ├── 2025-03-12.md │ │ │ ├── 2025-03-17.md │ │ │ ├── 2025-05-21.md │ │ │ ├── 2025-06-16.md │ │ │ ├── 2025-11-28.md │ │ │ ├── 2026-01-08.md │ │ │ └── 2026-03-09.md │ │ ├── pl-PL/ │ │ │ ├── 2024-01-29.md │ │ │ ├── 2024-05-14.md │ │ │ ├── 2024-05-24.md │ │ │ ├── 2024-05-27.md │ │ │ ├── 2024-07-09.md │ │ │ ├── 2024-07-13.md │ │ │ ├── 2024-07-22.md │ │ │ ├── 2024-08-01.md │ │ │ └── 2024-09-11.md │ │ ├── pt-BR/ │ │ │ ├── 2024-01-29.md │ │ │ ├── 2024-05-14.md │ │ │ ├── 2024-05-24.md │ │ │ ├── 2024-05-27.md │ │ │ ├── 2024-07-09.md │ │ │ ├── 2024-07-13.md │ │ │ ├── 2024-07-22.md │ │ │ ├── 2024-08-01.md │ │ │ └── 2024-09-11.md │ │ ├── zh-CN/ │ │ │ ├── 2024-01-29.md │ │ │ ├── 2024-05-14.md │ │ │ ├── 2024-05-24.md │ │ │ ├── 2024-05-27.md │ │ │ ├── 2024-07-09.md │ │ │ ├── 2024-07-13.md │ │ │ ├── 2024-07-22.md │ │ │ ├── 2024-08-01.md │ │ │ └── 2024-09-11.md │ │ └── zh-TW/ │ │ ├── 2024-01-29.md │ │ ├── 2024-05-14.md │ │ ├── 2024-05-24.md │ │ ├── 2024-05-27.md │ │ ├── 2024-07-09.md │ │ ├── 2024-07-13.md │ │ ├── 2024-07-22.md │ │ ├── 2024-08-01.md │ │ └── 2024-09-11.md │ ├── pl-PL.toml │ ├── pt-BR.toml │ ├── ru-RU.toml │ ├── zh-CN.toml │ └── zh-TW.toml ├── tsconfig.json └── vitest.config.ts