From d9834367e0a516057cc25f0ee1f2567986f47827 Mon Sep 17 00:00:00 2001 From: Zee Date: Tue, 28 Nov 2023 16:44:18 +0200 Subject: [PATCH 001/233] Begin the Prewrite --- .prettierrc | 3 +- gamePlayer/index.html | 511 +------- gamePlayer/package.json | 40 +- gamePlayer/postcss.config.js | 6 + gamePlayer/public/iconBigAlt.png | Bin 0 -> 493 bytes gamePlayer/src/NCCTK.less | 846 ------------- gamePlayer/src/allAttemptsDialog.ts | 103 -- gamePlayer/src/app.tsx | 12 + gamePlayer/src/artSetSpecials.ts | 433 ------- gamePlayer/src/cc2ArtSet.ts | 960 --------------- gamePlayer/src/components/Sidebar/index.tsx | 41 + .../components/Sidebar}/tabIcons/clock.svg | 0 .../components/Sidebar}/tabIcons/floppy.svg | 0 .../components/Sidebar}/tabIcons/info.svg | 0 .../components/Sidebar}/tabIcons/leaf.svg | 0 .../components/Sidebar}/tabIcons/level.svg | 0 .../components/Sidebar}/tabIcons/tools.svg | 0 gamePlayer/src/configPath.ts | 53 - gamePlayer/src/const.ts | 35 - .../src/{extraTypes.d.ts => extra-types.d.ts} | 1 + gamePlayer/src/fileLoaders.ts | 98 -- gamePlayer/src/gliderbotSets.ts | 214 ---- gamePlayer/src/index.css | 19 + gamePlayer/src/index.ts | 87 -- gamePlayer/src/levelList.ts | 47 - gamePlayer/src/levelLoading.ts | 115 -- gamePlayer/src/levels/NotCC.c2m | Bin 1792 -> 0 bytes gamePlayer/src/levels/tilesetPreview.c2m | Bin 180 -> 0 bytes gamePlayer/src/main-ssg.tsx | 6 + gamePlayer/src/main.tsx | 4 + gamePlayer/src/pager.ts | 245 ---- gamePlayer/src/pages/SetSelectorPage.tsx | 34 + gamePlayer/src/pages/basePlayer.ts | 250 ---- gamePlayer/src/pages/exaPlayer.ts | 479 -------- gamePlayer/src/pages/levelPlayer.ts | 406 ------- gamePlayer/src/pages/loading.ts | 154 --- gamePlayer/src/pages/setSelector.ts | 323 ----- gamePlayer/src/railroad.ts | 38 - gamePlayer/src/renderer.ts | 537 --------- gamePlayer/src/reportGenerator.ts | 253 ---- gamePlayer/src/saveData.localStorage.ts | 204 ---- gamePlayer/src/saveData.neutralino.ts | 223 ---- gamePlayer/src/saveData.ts | 42 - gamePlayer/src/scoresApi.ts | 127 -- gamePlayer/src/settings.ts | 153 --- gamePlayer/src/sfx.ts | 91 -- gamePlayer/src/sidebar.ts | 336 ------ gamePlayer/src/simpleDialogs.ts | 60 - gamePlayer/src/solutionTooltip.ts | 131 -- gamePlayer/src/themes.ts | 58 - gamePlayer/src/tilesets/cga16.png | Bin 6793 -> 0 bytes gamePlayer/src/tilesets/index.ts | 262 ---- gamePlayer/src/tilesets/sources/README.md | 15 - gamePlayer/src/tilesets/sources/bolt.blend | Bin 1188708 -> 0 bytes gamePlayer/src/tilesets/sources/cga16.ase | Bin 6941 -> 0 bytes gamePlayer/src/tilesets/sources/hook.blend | Bin 1192304 -> 0 bytes gamePlayer/src/tilesets/tworld.png | Bin 259692 -> 0 bytes gamePlayer/src/utils.ts | 257 ---- gamePlayer/tailwind.config.js | 8 + gamePlayer/tsconfig.json | 26 +- gamePlayer/vite.config.ts | 32 +- package.json | 7 +- pnpm-lock.yaml | 1057 +++++++++++++---- 63 files changed, 1062 insertions(+), 8380 deletions(-) create mode 100644 gamePlayer/postcss.config.js create mode 100644 gamePlayer/public/iconBigAlt.png delete mode 100644 gamePlayer/src/NCCTK.less delete mode 100644 gamePlayer/src/allAttemptsDialog.ts create mode 100644 gamePlayer/src/app.tsx delete mode 100644 gamePlayer/src/artSetSpecials.ts delete mode 100644 gamePlayer/src/cc2ArtSet.ts create mode 100644 gamePlayer/src/components/Sidebar/index.tsx rename gamePlayer/{public => src/components/Sidebar}/tabIcons/clock.svg (100%) rename gamePlayer/{public => src/components/Sidebar}/tabIcons/floppy.svg (100%) rename gamePlayer/{public => src/components/Sidebar}/tabIcons/info.svg (100%) rename gamePlayer/{public => src/components/Sidebar}/tabIcons/leaf.svg (100%) rename gamePlayer/{public => src/components/Sidebar}/tabIcons/level.svg (100%) rename gamePlayer/{public => src/components/Sidebar}/tabIcons/tools.svg (100%) delete mode 100644 gamePlayer/src/configPath.ts delete mode 100644 gamePlayer/src/const.ts rename gamePlayer/src/{extraTypes.d.ts => extra-types.d.ts} (66%) delete mode 100644 gamePlayer/src/fileLoaders.ts delete mode 100644 gamePlayer/src/gliderbotSets.ts create mode 100644 gamePlayer/src/index.css delete mode 100644 gamePlayer/src/index.ts delete mode 100644 gamePlayer/src/levelList.ts delete mode 100644 gamePlayer/src/levelLoading.ts delete mode 100644 gamePlayer/src/levels/NotCC.c2m delete mode 100644 gamePlayer/src/levels/tilesetPreview.c2m create mode 100644 gamePlayer/src/main-ssg.tsx create mode 100644 gamePlayer/src/main.tsx delete mode 100644 gamePlayer/src/pager.ts create mode 100644 gamePlayer/src/pages/SetSelectorPage.tsx delete mode 100644 gamePlayer/src/pages/basePlayer.ts delete mode 100644 gamePlayer/src/pages/exaPlayer.ts delete mode 100644 gamePlayer/src/pages/levelPlayer.ts delete mode 100644 gamePlayer/src/pages/loading.ts delete mode 100644 gamePlayer/src/pages/setSelector.ts delete mode 100644 gamePlayer/src/railroad.ts delete mode 100644 gamePlayer/src/renderer.ts delete mode 100644 gamePlayer/src/reportGenerator.ts delete mode 100644 gamePlayer/src/saveData.localStorage.ts delete mode 100644 gamePlayer/src/saveData.neutralino.ts delete mode 100644 gamePlayer/src/saveData.ts delete mode 100644 gamePlayer/src/scoresApi.ts delete mode 100644 gamePlayer/src/settings.ts delete mode 100644 gamePlayer/src/sfx.ts delete mode 100644 gamePlayer/src/sidebar.ts delete mode 100644 gamePlayer/src/simpleDialogs.ts delete mode 100644 gamePlayer/src/solutionTooltip.ts delete mode 100644 gamePlayer/src/themes.ts delete mode 100644 gamePlayer/src/tilesets/cga16.png delete mode 100644 gamePlayer/src/tilesets/index.ts delete mode 100644 gamePlayer/src/tilesets/sources/README.md delete mode 100644 gamePlayer/src/tilesets/sources/bolt.blend delete mode 100644 gamePlayer/src/tilesets/sources/cga16.ase delete mode 100644 gamePlayer/src/tilesets/sources/hook.blend delete mode 100644 gamePlayer/src/tilesets/tworld.png delete mode 100644 gamePlayer/src/utils.ts create mode 100644 gamePlayer/tailwind.config.js diff --git a/.prettierrc b/.prettierrc index 41889ed6..4e6e3cdd 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,5 +2,6 @@ "arrowParens": "avoid", "semi": false, "singleQuote": false, - "trailingComma": "es5" + "trailingComma": "es5", + "plugins": ["prettier-plugin-tailwindcss"] } diff --git a/gamePlayer/index.html b/gamePlayer/index.html index 4783abd5..aedc1683 100644 --- a/gamePlayer/index.html +++ b/gamePlayer/index.html @@ -4,7 +4,6 @@ - NotCC + NotCC - - - - - -
-
Level list
-
- - - - - - - - - - - -
#LevelBest timeBest score
-
-
- -
-
-
- -
-
Score report generator
-
Fetching scoreboard data...
-
- Something went wrong: -
-
- -
-
scores:
-
-
NotCC git-%VITE_VERSION%
-
-
-
- - -
-
-
- -
-
Alert!
-
Alert body
-
-
-
- - - -
-
All attempts
-
-
- - -
-
-
- -
-
Theme select
-
- - - - - -
-
- - -
-
-
- - -
-
Tileset select
-
- - - - - - - - - - - - - - - -
SelectedPreviewInfo
- -
-
-
- - -
-
-
- -
-
Settings
-
-

Visuals

- - - - - - - CGA17000 - - -

Glitches

- - -

- There are a couple of glitches which are not allowed in competitive - play, which are called non-legal glitches. If this option is - enabled, an attempt to use a non-legal glitch will fail the level. -

- - -

- Simultaneous character movement is a non-legal glitch where two - characters can be moved at the same by pressing the character switch - and a direction key at the same time. If this option is enabled, - pressing the character switch key will let go of all other input - keys, preventing the simultaneous character movement glitch. -

-

Score

- - -

- The - https://scores.bitbusters.club - user ID. Required for score report generation.
How to obtain: - Look for the number in your player page URL. For example, If your - user page is at https://scores.bitbusters.club/players/75, your - optimizer ID is 75. -

-

ExaCC

- - -

- The integer part of the time left can be rounded in different ways, - depending on the wanted interpretation. Avaliable rounding modes: -

-
    -
  • - floor — Equivalent to the amount of time until the game is lost - via time out. Represents how the game internally tracks time left, - but the shown value must be ceiled in one's head to know the - in-game time. -
  • -
  • - floor + 1 — Resembles how time works in Lynx and mostly matches - in-game time, but is inaccurate when the decimal is .00. -
  • -
  • - ceil — Always matches in-game time, but no longer always - decreases. Displayed time will jump from x.05 to (x-1).00 to - (x-1).95. -
  • -
-
-
- - -
-
-
- -
-
About NotCC
-
-

NotCC

-

- NotCC is an - open-source - accurate CC2 emulator.

- Made by - G lander. -

-

Thanks to:

-
    -
  • - The Chip's Challenge community, residing at - The Bit Busters Club. Also, more specifically: -
  • -
  • - eevee, for creating - the first CC2 emulator, - Lexy's Labyrinth, which NotCC heavily borrowed (and still borrows) from. -
  • -
  • - Markus O., - Bacorn, - and - Sickly, for creating and maintaining SuperCC, the optimization tool - ExaCC is heavily inspired by. -
  • -
  • - Zrax, for - creating a very helpful suite of CC tools, appropriately called - CCTools. -
  • -
  • - Anders Kaseorg and Kawaiiprincess, for creating and porting to CC2 - (respectively) the bundled Tile World tileset. -
  • -
  • - Sharpeye, for finding a bug with ExaCC auto-scaling and being one of the - first people to use ExaCC for optimization. -
  • -
  • - Tyler Sontag, for creating the very, very helpful resident Discord - bot, - Gliderbot. -
  • -
  • - IHNN, for providing details and feedback on non-legal glitches and - their prevention. -
  • -
-

- Last change: %VITE_LAST_COMMIT_INFO%.
- Built at %VITE_BUILD_TIME%. -

-
-
- -
-
-
- -
-
Non-free set
-
-

- The set you are trying to load is non-free, and cannot be legally - accessed from the Gliderbot set repository. If you don't have it, - you can - but it on Steam here. -

-

- If you have a copy of the set, load it into NotCC with the Load - directory option below. -

-
-
- - -
-
-
-
-

Loading, standy...

-
-
-
- -
-
-

You won!!

-
- - - -
-
-
-

You died...

-

You ran out of time...

-
- -
-
-
-

Paused

-
-

Did you know?

- You can submit fun facts for this box by contacting ʐ̈ MANNNNNNN - via the - Chip's Challenge Bit Busters Club Discord Server. -
-
- -
-
-
-

LEVEL NAME

-
-
-

Stop! You've violated the law!

-
- The following glitch has occured: - -
-
- -
-
-
-

Congratulations!

-
- You have finished this set. You can try getting better scores, or - go for another set! -
-
- - -
-
-
-
-
-
Chips:
- 12 -
Time left:
- 120s -
Bonus points:
- 4200 -
- -
-
-
-
-
- -
-
-
-
-
Chips:
- 12 -
Time left:
- 120s -
Bonus points:
- 4200 -
Total score:
- 0 -
- -
-
-
- -
-
-
-
-
- -

NotCC

-

A scoreboard-legal Chip's Challenge 2® emulator.

-
-
-

Load external files:

- - -
- - -
- - + +
+ diff --git a/gamePlayer/package.json b/gamePlayer/package.json index e3b396ea..4c3a625d 100644 --- a/gamePlayer/package.json +++ b/gamePlayer/package.json @@ -1,42 +1,48 @@ { "name": "@notcc/player", "private": true, - "version": "0.2.0", + "version": "2.0.0", "scripts": { - "dev": "vite --force", - "build": "tsc && vite build --force", - "build-desktop": "VITE_BUILD_TYPE=desktop pnpm build", - "preview": "vite preview" + "dev": "vite", + "build:ssg": "vite build -c vite.config.js --ssr src/main-ssg.tsx --outDir dist/ssg", + "build": "rm -rf dist && tsc && pnpm build:ssg && vite build && rm -r dist/ssg", + "build:desktop": "VITE_BUILD_TYPE=desktop pnpm build" }, "repository": { "type": "git", "url": "git+https://github.com/TheGLander/NotCC.git" }, "author": "G lander", - "license": "MIT", + "license": "GPL-3.0-or-later", "bugs": { "url": "https://github.com/TheGLander/NotCC/issues" }, "homepage": "https://github.com/TheGLander/NotCC#readme", + "type": "module", "devDependencies": { "@neutralinojs/lib": "^3.12.0", "@notcc/logic": "workspace:^", - "@types/clone": "^2.1.3", - "@types/is-hotkey": "^0.1.8", - "@types/path-browserify": "^1.0.1", - "base64-js": "^1.5.1", - "dialog-polyfill": "^0.5.6", + "@preact/preset-vite": "^2.6.0", + "@types/clone": "^2.1.4", + "@types/is-hotkey": "^0.1.9", + "@types/node": "^15.14.9", + "@types/path-browserify": "^1.0.2", + "autoprefixer": "^10.4.16", + "clone": "^2.1.2", "fast-printf": "^1.6.9", "fflate": "^0.7.4", "is-hotkey": "^0.2.0", - "less": "^4.2.0", + "jotai": "^2.5.1", "lz-string": "^1.5.0", "path-browserify": "^1.0.1", - "typescript": "^4.9.5", + "postcss": "^8.4.31", + "preact": "^10.19.2", + "preact-render-to-string": "^6.3.1", + "react": "npm:@preact/compat", + "react-dom": "npm:@preact/compat", + "tailwind-merge": "^2.0.0", + "tailwindcss": "^3.3.5", + "typescript": "^5.2.2", "vite": "^4.5.0" - }, - "type": "module", - "dependencies": { - "clone": "^2.1.2" } } diff --git a/gamePlayer/postcss.config.js b/gamePlayer/postcss.config.js new file mode 100644 index 00000000..2e7af2b7 --- /dev/null +++ b/gamePlayer/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/gamePlayer/public/iconBigAlt.png b/gamePlayer/public/iconBigAlt.png new file mode 100644 index 0000000000000000000000000000000000000000..46d56a5fa039ca7d5b6447fab8d460ea4d4563af GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=7>k44ofy`glX(f`BnS9}xB_V< z1rt{dn>0(q{xIwNg=#k!q`f;l>-Q(KnNI_<_8FK@$@9+C5As$qvaz(cFEL1Hiq3nO zJo|tA*(axO|M~y_|LnEfTk6^~v$7(?g36q_))*Px3{SpZy{mt^S699P(EOj3HxB_R z#gZVuUp!WZ0jV`OC9dUy7(wU2))YyQ5rl#}Ddj0M#}`%AAVJyJjSW6s+B zDvXS>j8g)Q0&L!Ee$D>h#>&ESrJ+g;Xp@b`sdcs6+tfVsTs5=Bhgn{H=;|s+%c1?9~aCp4- tdgHPJ2M24WtLAeVbrTpFYt3J * { - padding: 1em; - cursor: pointer; - &:hover, - &:focus-visible { - background: var(--secondary-bg); - } - .firstLine, - &.failed { - display: flex; - gap: 1em; - flex-direction: row; - .expandTriangle { - margin-right: -0.5em; - } - .time { - margin-left: auto; - font-size: 0.75em; - align-self: center; - } - } - &.successful .extraInfo { - padding-top: 0.5em; - display: none; - &.showExtra { - display: block; - } - } - } - &:empty::before { - padding-left: 1em; - padding-top: 0.5em; - padding-bottom: 0.5em; - content: "No attempts yet!"; - } -} - -#scoreReportGenDialog { - section { - display: none; - } - &[stage="default"] section.default-stage { - display: initial; - } - &[stage="loading"] section.loading-stage { - display: initial; - } - &[stage="eror"] section.error-stage { - display: initial; - } - #reportText { - display: flex; - flex-direction: column; - font-family: monospace; - .disabled { - text-decoration: line-through; - } - #linesPoint { - display: contents; - input[type="checkbox"] { - margin-right: 0.5em; - } - } - } -} - -.preferences { - display: grid; - grid: auto-flow / auto auto; - gap: 0.5em; - margin-right: 1em; - margin-bottom: 1em; - h3, - p { - grid-column-end: span 2; - margin-top: 0.3em; - margin-bottom: 0.3em; - &:first-child { - margin-top: 0.75em; - } - } - p, - ul { - font-size: 0.8em; - } - p { - width: 70%; - } -} - -button.themeButton { - .colorCalculations(); - padding: 0.2em; - .themeCircle { - width: 1.3em; - height: 1.3em; - border-radius: 50%; - background: var(--background-gradient); - border: solid 0.25em var(--text-color); - } -} - -.closedPage { - display: none !important; -} - -button { - --button-high-color: hsl(var(--theme-color-huesat) 40%); - --button-low-color: hsl(var(--theme-color-huesat) 33%); - color: var(--text-color); - padding: 0 0.4em; - border-width: 2px; - border-style: solid; - border-color: var(--button-high-color) var(--button-low-color) - var(--button-low-color) var(--button-high-color); - border-radius: 2px; - background-image: linear-gradient( - to bottom, - var(--button-high-color), - var(--button-low-color) - ); - &:enabled { - &:hover { - --button-high-color: hsl(var(--theme-color-huesat) 45%); - --button-low-color: hsl(var(--theme-color-huesat) 38%); - } - &:active { - --button-high-color: hsl(var(--theme-color-huesat) 30%); - --button-low-color: hsl(var(--theme-color-huesat) 23%); - } - } - &:disabled { - --button-high-color: hsl(var(--theme-color-huesat) 20%); - --button-low-color: hsl(var(--theme-color-huesat) 13%); - color: var(--text-color-disabled); - } - user-select: none; -} - -/* Tooltip */ - -.tooltipRoot { - width: fit-content; - transform-origin: 10px 10px; - display: flex; - opacity: 0.9; - animation: openTooltip 0.75s cubic-bezier(0.2, 0, 0.2, 1) forwards; - position: absolute; - left: 110%; - top: 35%; - z-index: 100; - user-select: none; - - .tooltipBox { - .container(); - flex-shrink: 0; - backdrop-filter: blur(3px); - } - .tooltipTriangle { - width: 0; - height: 0; - backdrop-filter: blur(3px); - - display: inline-block; - border: solid 10px transparent; - border-right: solid 10px var(--general-bg); - position: relative; - top: 5px; - margin-right: -1px; - } -} - -@keyframes openTooltip { - from { - transform: scale(40%); - opacity: 0; - } - - 50% { - opacity: 0.9; - } - - 100% { - opacity: 0.9; - transform: scale(100%); - } -} -@keyframes closeTooltip { - from { - opacity: 0.9; - transform: scale(100%); - } - - 50% { - opacity: 0; - } - - to { - opacity: 0; - transform: scale(40%); - } -} -.buttonTooltipBox { - display: flex; - flex-direction: column; - row-gap: 0.5em; - - hr { - margin: 0; - } - - .buttonTooltipRow { - display: flex; - flex-direction: row; - padding: 0.2em 0.5em; - border-radius: 3px; - &:focus-visible { - outline: none; - } - &:not([data-disabled]) { - cursor: pointer; - &:hover, - &:focus-visible { - background: var(--secondary-bg); - } - } - &[data-disabled] { - color: var(--text-color-disabled); - } - - .buttonTooltipKey { - padding-left: 2em; - margin-left: auto; - padding-bottom: 0.2em; - } - } -} -/* Copied wholesale from https://github.com/eevee/lexys-labyrinth/ */ -kbd { - padding: 0 0.25em; - border: 1px solid currentColor; - border-radius: 0.25em; - box-shadow: 0 2px 0 currentColor; - text-align: center; - text-transform: uppercase; - width: fit-content; -} - -/* The sidebar */ - -.sidebar { - border-radius: 0px; - padding: 0; - width: 8em; - height: 100%; - display: flex; - flex-direction: column; - .sidebarButton { - margin: 1em; - display: flex; - position: relative; - img, - .levelIconContainer { - width: 80%; - user-select: none; - margin: auto; - display: block; - cursor: pointer; - } - // The level button, which has a dynamic number in it - .levelIconContainer { - position: relative; - img { - width: 100%; - } - #levelIconText { - position: absolute; - top: 25%; - height: 35%; - left: 12%; - width: 75%; - font-size: 2em; - color: var(--icon-color); - text-align: center; - user-select: none; - pointer-events: none; - line-height: 1.2; - } - } - } - - .bottomButton { - margin-top: auto; - } -} - -#loadingPage { - width: fit-content; - height: fit-content; - margin: auto; - p { - font-style: italic; - } -} - -/* The game player */ - -.playerPage { - --base-tile-size: 32px; - --tile-scale: 2; - --tile-size: calc(var(--base-tile-size) * var(--tile-scale)); - --quarter-tile: calc(var(--tile-size) / 4); - .stats { - grid-area: stats; - display: grid; - grid-template-columns: auto auto; - grid-template-rows: repeat(auto-fill, 1em); - gap: var(--quarter-tile); - padding: var(--quarter-tile); - padding-bottom: 0; - font-size: 1.2em; - white-space: nowrap; - output { - text-align: right; - } - } - .viewportArea { - grid-area: viewport; - position: relative; - width: calc(var(--tile-size) * var(--level-camera-width)); - height: calc(var(--tile-size) * var(--level-camera-height)); - } - .viewportCanvas { - width: 100%; - height: 100%; - } - .inventoryCanvas { - grid-area: inventory; - margin: auto; - width: calc(var(--tile-size) * 4); - height: calc(var(--tile-size) * 2); - background-color: azure; - } -} - -#levelPlayerPage { - padding: var(--quarter-tile); - border-radius: 5px; - margin: auto; - display: grid; - gap: var(--quarter-tile); - grid-template: - "viewport stats" min-content - "viewport inventory" min-content - "viewport hint" 1fr - / min-content min-content; - &.solutionPlayback { - background: repeating-linear-gradient( - 45deg, - transparent 0%, - transparent 10%, - #ff0b 10%, - #ff0b 20% - ), - var(--general-bg); - } - #hintBox { - grid-area: hint; - background-color: var(--secondary-bg); - padding: 0.5em 0.5em; - } -} - -canvas { - image-rendering: optimizeSpeed; - image-rendering: -moz-crisp-edges; - image-rendering: -webkit-crisp-edges; - image-rendering: pixelated; - image-rendering: crisp-edges; -} - -/* Viewport overlay */ - -#levelViewportOverlay { - width: 100%; - height: 100%; - position: absolute; - top: 0; - display: grid; - gap: 0px 0px; - grid-template: - ". . ." var(--tile-size) - ". top ." var(--tile-size) - ". . ." 0.5fr - ". middle ." 1fr - ". . ." 0.5fr - ". bottom ." calc(var(--tile-size) * 1.5) - ". . ." calc(var(--tile-size) * 0.75) - / 0.15fr 2.7fr 0.15fr; - h3.deathOnly, - h3.timeoutOnly { - display: none; - } - &[data-game-state="won"] { - background-image: radial-gradient(#4406, #660d); - #overlayWinContents { - display: contents; - } - } - &[data-game-state="timeout"] { - background-image: radial-gradient(#0084, #0088); - #overlayLoseContents { - display: contents; - h3.timeoutOnly { - display: initial; - } - } - } - &[data-game-state="death"] { - background-image: radial-gradient(#1004, #2008); - #overlayLoseContents { - display: contents; - h3.deathOnly { - display: initial; - } - } - } - &[data-paused] { - background: var(--general-bg); - #overlayPauseContents { - display: contents; - .container { - background: var(--secondary-bg); - } - h4 { - margin-top: 0.3em; - margin-bottom: 0.7em; - } - } - } - &[data-preplay] { - background-image: radial-gradient(#0002, #0004); - #overlayPreplayContents { - display: contents; - } - } - &[data-nonlegal] { - background-image: repeating-conic-gradient(#0005 0%, #0008 5%, #0005 10%), - radial-gradient(transparent, black); - #overlayNonlegalContents { - display: contents; - } - } - &[data-gz] { - background-image: radial-gradient(transparent, var(--general-bg) 70%), - repeating-radial-gradient(#f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00 30%); - background-position-x: 50%; - background-position-y: 80%; - background-size: 200% 200%; - - #overlayGzContents { - display: contents; - } - } - > * { - display: none; - h3 { - grid-area: top; - text-align: center; - font-size: 300%; - margin: 0; - text-shadow: black 1px 0px 10px; - } - .statsContainer { - grid-area: middle; - padding: var(--quarter-tile); - &.small { - width: fit-content; - height: fit-content; - justify-self: center; - } - } - .buttonContainer { - box-sizing: border-box; - justify-content: stretch; - grid-area: bottom; - gap: var(--quarter-tile); - padding: var(--quarter-tile); - height: 100%; - display: flex; - flex-direction: row; - button { - flex: 1; - font-size: 120%; - } - } - } -} - -#exaPlayerPage { - display: grid; - margin: auto; - gap: var(--quarter-tile); - grid-template: - "viewport info" auto - "viewport moves" 1fr - / min-content min-content; - .infoContainer { - grid-area: info; - display: flex; - flex-direction: row; - gap: var(--tile-size); - width: calc(16 * var(--tile-size)); - box-sizing: border-box; - padding: calc(2 * var(--quarter-tile)); - } - .viewportContainer { - grid-area: viewport; - padding: calc(2 * var(--quarter-tile)); - } - .movesContainer { - height: 0; - min-height: 100%; - box-sizing: border-box; - .movesArea { - .container(); - overflow-y: auto; - width: 100%; - height: 100%; - resize: none; - border: 0; - padding: 0; - background-color: var(--secondary-bg); - font-family: monospace; - overflow-wrap: anywhere; - line-break: anywhere; - } - grid-area: moves; - } -} - -/* Set selector (stub) */ - -#setSelectorPage { - overflow-y: auto; - flex: 1; - padding: 1em; - display: flex; - flex-direction: column; - align-items: center; - header { - width: fit-content; - margin-top: 1em; - margin-bottom: 1em; - display: grid; - grid: - "image title " - "image tagline"; - gap: 0 1em; - img { - grid-area: image; - } - h1, - p { - margin: 0; - height: 1em; - line-height: 0.9; - } - h1 { - grid-area: title; - font-weight: normal; - font-size: 8em; - } - p { - grid-area: tagline; - justify-self: center; - font-size: 1.07em; - } - } - - #fileLoaderBar { - width: 100%; - align-self: center; - box-sizing: border-box; - display: grid; - grid: - "text text" min-content - "file dirs" 1fr - / 1fr 1fr; - p { - grid-area: text; - margin: 0; - margin-bottom: 0.25em; - font-size: 1.5em; - } - button { - height: 4em; - } - gap: 0 0.5em; - } - #setList { - display: grid; - justify-content: center; - width: 90%; - gap: 1em; - grid: auto-flow / repeat( - auto-fit, - calc(var(--standard-tile-size) * 10 + 0.75em * 2) - ); - li { - list-style: none; - height: fit-content; - .setThumbnail { - width: calc(var(--standard-tile-size) * var(--camera-width)); - height: calc(var(--standard-tile-size) * var(--camera-height)); - margin: auto; - canvas, - img { - width: 100%; - height: 100%; - object-fit: contain; - } - } - cursor: pointer; - &:hover, - &:focus-visible { - background: var(--secondary-bg); - } - } - } -} diff --git a/gamePlayer/src/allAttemptsDialog.ts b/gamePlayer/src/allAttemptsDialog.ts deleted file mode 100644 index d214c782..00000000 --- a/gamePlayer/src/allAttemptsDialog.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { metricsFromAttempt, protoTimeToMs } from "@notcc/logic" -import { protobuf } from "@notcc/logic" -import { Pager } from "./pager" -import { instanciateTemplate } from "./utils" - -const allAttemptsDialog = - document.querySelector("#allAttemptsDialog")! -// const verifyAllButton = -// allAttemptsDialog.querySelector("#verifyAllButton")! -const successulTemplate = allAttemptsDialog.querySelector( - "#successfulAttemptTemplate" -)! -const failedTemplate = allAttemptsDialog.querySelector( - "#failedAttemptTemplate" -)! - -function glitchToString(glitch: protobuf.IGlitchInfo): string { - return `${ - protobuf.GlitchInfo.KnownGlitches[glitch.glitchKind!] - } (${glitch.location!.x!}, ${glitch.location!.y!}) at ${Math.ceil( - protoTimeToMs(glitch.happensAt!) / 1000 - )}s` -} - -export function openAllAttemptsDialog(pager: Pager): void { - const set = pager.loadedSet - if (set === null) return - const attempts = set.seenLevels[set.currentLevel].levelInfo.attempts ?? [] - const root = allAttemptsDialog.querySelector("section")! - // Nuke all current data - root.textContent = "" - for (const attempt of attempts) { - const isSuccessful = !!attempt.solution - const attEl = instanciateTemplate( - isSuccessful ? successulTemplate : failedTemplate - ) - const startTimeEl = attEl.querySelector(".startTime"), - endTimeEl = attEl.querySelector(".endTime"), - metricsEl = attEl.querySelector(".metrics"), - failReasonEl = attEl.querySelector(".failReason"), - expandTriangleEl = attEl.querySelector(".expandTriangle"), - replayButton = attEl.querySelector(".replayButton"), - extraInfoEl = attEl.querySelector(".extraInfo"), - realTimeEl = attEl.querySelector(".realTime"), - glitchListEl = attEl.querySelector(".glitchList") - - if (startTimeEl && attempt.attemptStart) { - const startTime = new Date(protoTimeToMs(attempt.attemptStart)) - startTimeEl.textContent = startTime.toLocaleString() || "???" - } - if (endTimeEl && attempt.attemptStart && attempt.attemptLength) { - const endTime = new Date( - protoTimeToMs(attempt.attemptStart) + - protoTimeToMs(attempt.attemptLength) - ) - endTimeEl.textContent = endTime.toLocaleString() || "???" - } - if (metricsEl && attempt.solution?.outcome) { - const metrics = metricsFromAttempt( - set.currentLevel, - attempt.solution?.outcome - ) - metricsEl.textContent = `${Math.ceil(metrics.timeLeft)}s / ${ - metrics.points - }pts` - if (realTimeEl) { - realTimeEl.textContent = metrics.realTime.toFixed(2) - } - } - if (expandTriangleEl && extraInfoEl) { - attEl.addEventListener("click", () => { - const showExtra = expandTriangleEl.classList.toggle("open") - extraInfoEl.classList.toggle("showExtra", showExtra) - }) - } - if (replayButton) { - if (attempt.solution) { - replayButton.addEventListener("click", ev => { - ev.preventDefault() - ev.stopPropagation() - pager.loadSolution(attempt.solution!) - allAttemptsDialog.close() - }) - } else { - replayButton.disabled = true - } - } - if (failReasonEl && attempt.failReason) { - failReasonEl.textContent = attempt.failReason - } - if (glitchListEl && attempt.solution?.usedGlitches) { - for (const glitch of attempt.solution.usedGlitches) { - const li = document.createElement("li") - li.textContent = glitchToString(glitch) - glitchListEl.appendChild(li) - } - } - - attEl.tabIndex = 0 - root.appendChild(attEl) - } - allAttemptsDialog.showModal() -} diff --git a/gamePlayer/src/app.tsx b/gamePlayer/src/app.tsx new file mode 100644 index 00000000..4c07b1a2 --- /dev/null +++ b/gamePlayer/src/app.tsx @@ -0,0 +1,12 @@ +import "./index.css" +import { Sidebar } from "./components/Sidebar" +import { SetSelectorPage } from "./pages/SetSelectorPage" + +export function App() { + return ( +
+ + +
+ ) +} diff --git a/gamePlayer/src/artSetSpecials.ts b/gamePlayer/src/artSetSpecials.ts deleted file mode 100644 index 58072c73..00000000 --- a/gamePlayer/src/artSetSpecials.ts +++ /dev/null @@ -1,433 +0,0 @@ -import { - Actor, - Animation, - BonusFlag, - CloneMachine, - CounterGate, - CustomFloor, - CustomWall, - Direction, - DirectionalBlock, - FlameJet, - InvisibleWall, - LitTNT, - Playable, - Railroad, - Rover, - ThinWall, - Tile, - Trap, - VoodooTile, - WireOverlapMode, -} from "@notcc/logic" -import { registerSpecialFunction, registerStateFunction } from "./const" -import { Art, Frame, Position, Size, SpecialArt, ctxToDir } from "./renderer" - -function bitfieldToDirs(bitfield: number): Direction[] { - const directions: Direction[] = [] - for (let dir = Direction.UP; dir <= Direction.LEFT; dir += 1) { - if ((bitfield & (1 << dir)) !== 0) { - directions.push(dir) - } - } - return directions -} - -function getPlayableState(actor: Playable): string { - const inWater = actor.tile.findActor(actor => - actor.getCompleteTags("tags").includes("water") - ) - if (inWater) return "water" - if (actor.playerBonked) return "bump" - return "normal" -} - -registerStateFunction("chip", getPlayableState) -registerStateFunction("melinda", getPlayableState) -registerStateFunction("invisibleWall", actor => - actor.animationLeft > 0 ? "touched" : "default" -) -registerStateFunction("bonusFlag", actor => actor.customData) -registerStateFunction("customWall", actor => actor.customData) -registerStateFunction("customFloor", actor => actor.customData) -registerStateFunction("tntLit", actor => - Math.floor((actor.lifeLeft / 253) * 4).toString() -) -registerStateFunction("flameJet", actor => actor.customData) - -interface FreeformWiresSpecialArt extends SpecialArt { - base: Frame - overlap: Frame - overlapCross: Frame -} - -registerSpecialFunction( - "freeform wires", - function (ctx, art) { - const spArt = art as FreeformWiresSpecialArt - const pos = Array.isArray(ctx.actor) - ? ctx.actor - : ctx.actor instanceof Tile - ? ctx.actor.position - : ctx.actor.tile.position - const wires = Array.isArray(ctx.actor) ? 0 : ctx.actor.wires - const wireTunnels = Array.isArray(ctx.actor) ? 0 : ctx.actor.wireTunnels - this.tileBlit(ctx, pos, spArt.base) - // If we don't have anything else to draw, don't draw the overlay - // TODO Wire tunnels are drawn on top of everything else, so maybe they - // don't cause the base to be drawn? - if (wires === 0 && wireTunnels === 0) { - return - } - if (ctx.actor.level.hideWires) { - return - } - const crossWires = - (ctx.actor.wireOverlapMode === WireOverlapMode.CROSS && - ctx.actor.wires === 0b1111) || - ctx.actor.wireOverlapMode === WireOverlapMode.ALWAYS_CROSS - if (crossWires) { - this.drawWireBase( - ctx, - pos, - wires & 0b0101, - (ctx.actor.poweredWires & 0b0101) !== 0 - ) - this.drawWireBase( - ctx, - pos, - wires & 0b1010, - (ctx.actor.poweredWires & 0b1010) !== 0 - ) - } else { - this.drawWireBase(ctx, pos, wires, ctx.actor.poweredWires !== 0) - } - this.tileBlit(ctx, pos, crossWires ? spArt.overlapCross : spArt.overlap) - this.drawCompositionalSides( - ctx, - pos, - this.tileset.art.wireTunnel, - 0.25, - bitfieldToDirs(wireTunnels) - ) - } -) -interface ArrowsSpecialArt extends SpecialArt { - UP: Frame - RIGHT: Frame - DOWN: Frame - LEFT: Frame - CENTER: Frame -} - -registerSpecialFunction( - "arrows", - function (ctx, art) { - const spArt = art as ArrowsSpecialArt - const pos = this.getPosition(ctx) - const directions = - "legalDirections" in ctx.actor - ? ctx.actor.legalDirections - : ctx.actor.cloneArrows - this.drawCompositionalSides(ctx, pos, spArt, 0.25, directions) - this.tileBlit(ctx, [pos[0] + 0.25, pos[1] + 0.25], spArt.CENTER, [0.5, 0.5]) - } -) - -interface ScrollingSpecialArt extends SpecialArt { - duration: number - UP: [Frame, Frame] - DOWN: [Frame, Frame] - RIGHT: [Frame, Frame] - LEFT: [Frame, Frame] -} - -registerSpecialFunction("scrolling", function (ctx, art) { - const spArt = art as ScrollingSpecialArt - const offsetMult = (ctx.ticks / spArt.duration) % 1 - const baseFrames = spArt[ctxToDir(ctx)] - const offset: Frame = [ - baseFrames[1][0] - baseFrames[0][0], - baseFrames[1][1] - baseFrames[0][1], - ] - const frame: Frame = [ - baseFrames[0][0] + offset[0] * offsetMult, - baseFrames[0][1] + offset[1] * offsetMult, - ] - const pos = this.getPosition(ctx) - this.tileBlit(ctx, pos, frame) -}) - -interface FuseSpecialArt extends SpecialArt { - duration: number - frames: Frame[] -} - -registerSpecialFunction("fuse", function (ctx, art) { - const spArt = art as FuseSpecialArt - const frameN = Math.floor( - spArt.frames.length * ((ctx.ticks / spArt.duration) % 1) - ) - const pos = this.getPosition(ctx) - this.tileBlit(ctx, [pos[0] + 0.5, pos[1]], spArt.frames[frameN], [0.5, 0.5]) -}) - -interface PerspectiveSpecialArt extends SpecialArt { - somethingUnderneathOnly?: boolean - default: Art - revealed: Art -} - -registerSpecialFunction("perspective", function (ctx, art) { - const spArt = art as PerspectiveSpecialArt - let perspective = ctx.actor.level.getPerspective() - if (perspective && spArt.somethingUnderneathOnly) { - perspective = - !!ctx.actor.tile.findActor(actor => actor.layer < ctx.actor.layer) || - ctx.actor.tile.wires !== 0 - } - this.drawArt(ctx, perspective ? spArt.revealed : spArt.default) -}) - -// TODO letters - -interface ThinWallsSpecialArt extends SpecialArt { - UP: Frame - RIGHT: Frame - DOWN: Frame - LEFT: Frame -} -registerSpecialFunction("thin walls", function (ctx, art) { - const spArt = art as ThinWallsSpecialArt - const pos = this.getPosition(ctx) - - this.drawCompositionalSides( - ctx, - pos, - spArt, - 0.5, - bitfieldToDirs(ctx.actor.allowedDirections) - ) -}) - -registerStateFunction("thinWall", actor => - actor.getCompleteTags("tags").includes("canopy") ? "canopy" : "nothing" -) - -registerStateFunction("blueWall", actor => actor.customData) -registerStateFunction("greenWall", actor => - actor.customData === "fake" && - actor.tile.findActor(iterActor => iterActor.layer > actor.layer) - ? "stepped" - : actor.customData -) -registerStateFunction("toggleWall", actor => actor.customData) -registerStateFunction("holdWall", actor => actor.customData) -registerStateFunction("trap", actor => (actor.isOpen ? "open" : "closed")) -registerStateFunction("teleportRed", actor => - !actor.wired || actor.poweredWires !== 0 ? "on" : "off" -) - -// Note: We also check for `wires` here, unlike in the logic. -// This is intentional, this discrepency is also in CC2 -registerStateFunction("transmogrifier", actor => - actor.wires !== 0 && actor.wired && !actor.poweredWires ? "off" : "on" -) -registerStateFunction("toggleSwitch", actor => actor.customData) - -interface StretchSpecialArt extends SpecialArt { - idle: Art - vertical: Frame[] - horizontal: Frame[] -} - -registerSpecialFunction("stretch", function (ctx, art) { - const spArt = art as StretchSpecialArt - if (ctx.actor.cooldown === 0) { - this.drawArt(ctx, spArt.idle) - return - } - // Use the base position, not the visual, the frames themselves provide the offset - const pos = ctx.actor.tile.position - let frames: Frame[] - let framesReversed: boolean - const dir = ctx.actor.direction - let offset: Position = [0, 0] - let cropSize: Size - if (dir === Direction.UP) { - frames = spArt.vertical - framesReversed = true - cropSize = [1, 2] - } else if (dir === Direction.RIGHT) { - frames = spArt.horizontal - framesReversed = false - offset = [-1, 0] - cropSize = [2, 1] - } else if (dir === Direction.DOWN) { - frames = spArt.vertical - framesReversed = false - offset = [0, -1] - cropSize = [1, 2] - } else { - // Direction.LEFT - frames = spArt.horizontal - framesReversed = true - cropSize = [2, 1] - } - let progress = 1 - ctx.actor.cooldown / ctx.actor.currentMoveSpeed! - if (framesReversed) { - progress = 1 - progress - } - const frame = frames[Math.floor(progress * frames.length)] - this.tileBlit(ctx, [pos[0] + offset[0], pos[1] + offset[1]], frame, cropSize) -}) - -registerSpecialFunction("voodoo", function (ctx) { - if (ctx.actor.tileOffset === null) return - const pos = this.getPosition(ctx) - const frame: Frame = [ - ctx.actor.tileOffset % 0x10, - Math.floor(ctx.actor.tileOffset / 0x10), - ] - this.tileBlit(ctx, pos, frame) -}) - -interface RailroadSpecialArt extends SpecialArt { - toggleMark: Frame - wood: Record - rail: Record - toggleRail: Record -} - -registerSpecialFunction("railroad", function (ctx, art) { - const spArt = art as RailroadSpecialArt - const pos = this.getPosition(ctx) - for (const dir of ctx.actor.baseRedirects) { - this.tileBlit(ctx, pos, spArt.wood[dir]) - } - for (const dir of ctx.actor.baseRedirects) { - if (ctx.actor.isSwitch) { - if (dir === ctx.actor.activeTrack) continue - this.tileBlit(ctx, pos, spArt.toggleRail[dir]) - } else { - this.tileBlit(ctx, pos, spArt.rail[dir]) - } - } - if ( - ctx.actor.isSwitch && - ctx.actor.baseRedirects.includes(ctx.actor.activeTrack) - ) { - this.tileBlit(ctx, pos, spArt.rail[ctx.actor.activeTrack]) - } - if (ctx.actor.isSwitch) { - this.tileBlit(ctx, pos, spArt.toggleMark) - } -}) - -registerStateFunction("rover", actor => actor.emulatedMonster) - -interface RoverAntennaSpecialArt extends SpecialArt { - UP: Frame - RIGHT: Frame - DOWN: Frame - LEFT: Frame -} - -registerSpecialFunction("rover antenna", function (ctx, art) { - const spArt = art as RoverAntennaSpecialArt - const pos = this.getPosition(ctx) - const frame = spArt[ctxToDir(ctx)] - this.tileBlit(ctx, [pos[0] + 0.25, pos[1] + 0.25], frame, [0.5, 0.5]) -}) - -registerSpecialFunction("letters", function (ctx) { - const pos = this.getPosition(ctx) - // A space doesn't render anything - if (ctx.actor.customData === " ") return - const frame = this.tileset.art.letters[ctx.actor.customData] - this.tileBlit(ctx, [pos[0] + 0.25, pos[1] + 0.25], frame, [0.5, 0.5]) -}) - -registerStateFunction("greenBomb", actor => actor.customData) - -interface CounterSpecialArt extends SpecialArt { - 0: Frame - 1: Frame - 2: Frame - 3: Frame - 4: Frame - 5: Frame - 6: Frame - 7: Frame - 8: Frame - 9: Frame - "-": Frame - "": Frame -} - -registerSpecialFunction("counter", function (ctx, art) { - const spArt = art as CounterSpecialArt - const pos = this.getPosition(ctx) - this.tileBlit( - ctx, - [pos[0] + 0.125, pos[1]], - spArt[ctx.actor.memory as unknown as "0"], - [0.75, 1] - ) -}) - -interface LogicGateSpecialArt extends SpecialArt { - UP: Frame - RIGHT: Frame - DOWN: Frame - LEFT: Frame -} - -function rotateWires(wires: number, dir: Direction): number { - return ((wires << dir) | (wires >> (4 - dir))) & 0b1111 -} - -registerSpecialFunction("logic gate", function (ctx, art) { - if (ctx.actor.level.hideWires) { - this.drawFloor(ctx, ctx.actor.tile) - return - } - const spArt = art as LogicGateSpecialArt - const pos = this.getPosition(ctx) - const poweredWires = ctx.actor.wires & ctx.actor.poweredWires - // Figure out which wires correspond to the which gate parts. - const gateHead = rotateWires(0b0001, ctx.actor.direction) - const gateRight = rotateWires(0b0010, ctx.actor.direction) - const gateBack = rotateWires(0b0100, ctx.actor.direction) - const gateLeft = rotateWires(0b1000, ctx.actor.direction) - - // Blit left and right as if they are also connected to the back, - // to have the bends in some tilesets - // Draw the left side first, the right one has control over the middle - this.drawWireBase( - ctx, - pos, - gateLeft | gateBack, - (gateLeft & poweredWires) !== 0 - ) - this.drawWireBase( - ctx, - pos, - gateRight | gateBack, - (gateRight & poweredWires) !== 0 - ) - - // And last, draw the output - this.drawWireBase(ctx, pos, gateHead, (poweredWires & gateHead) !== 0) - // Now, just draw the base - this.tileBlit(ctx, pos, spArt[ctxToDir(ctx)]) -}) - -function animationStateFunction(actor: Animation): string { - return Math.floor( - (1 - actor.animationCooldown / actor.animationLength) * 4 - ).toString() -} - -registerStateFunction("splashAnim", animationStateFunction) -registerStateFunction("explosionAnim", animationStateFunction) diff --git a/gamePlayer/src/cc2ArtSet.ts b/gamePlayer/src/cc2ArtSet.ts deleted file mode 100644 index c2eeee92..00000000 --- a/gamePlayer/src/cc2ArtSet.ts +++ /dev/null @@ -1,960 +0,0 @@ -import { ArtSet, frange } from "./renderer" - -export const cc2ArtSet: ArtSet = { - floor: { - type: "special", - specialType: "freeform wires", - base: [0, 2], - overlap: [8, 26], - overlapCross: [10, 26], - }, - currentPlayerMarker: [6, 6], - wireBase: [0, 2], - wire: [ - [13, 26], - [15, 26], - ], - wireTunnel: { - type: "directic", - UP: [14, 11], - RIGHT: [14.75, 11], - DOWN: [14, 11.75], - LEFT: [14, 11], - }, - letters: { - "0": [8, 0], - "1": [8.5, 0], - "2": [9, 0], - "3": [9.5, 0], - "4": [10, 0], - "5": [10.5, 0], - "6": [11, 0], - "7": [11.5, 0], - "8": [12, 0], - "9": [12.5, 0], - "!": [0.5, 0], - '"': [1, 0], - "#": [1.5, 0], - $: [2, 0], - "%": [2.5, 0], - "&": [3, 0], - "'": [3.5, 0], - "(": [4, 0], - ")": [4.5, 0], - "*": [5, 0], - "+": [5.5, 0], - ",": [6, 0], - "-": [6.5, 0], - ".": [7, 0], - "/": [7.5, 0], - ":": [13, 0], - ";": [13.5, 0], - "<": [14, 0], - "=": [14.5, 0], - ">": [15, 0], - "?": [15.5, 0], - "@": [0, 0.5], - A: [0.5, 0.5], - B: [1, 0.5], - C: [1.5, 0.5], - D: [2, 0.5], - E: [2.5, 0.5], - F: [3, 0.5], - G: [3.5, 0.5], - H: [4, 0.5], - I: [4.5, 0.5], - J: [5, 0.5], - K: [5.5, 0.5], - L: [6, 0.5], - M: [6.5, 0.5], - N: [7, 0.5], - O: [7.5, 0.5], - P: [8, 0.5], - Q: [8.5, 0.5], - R: [9, 0.5], - S: [9.5, 0.5], - T: [10, 0.5], - U: [10.5, 0.5], - V: [11, 0.5], - W: [11.5, 0.5], - X: [12, 0.5], - Y: [12.5, 0.5], - Z: [13, 0.5], - "[": [13.5, 0.5], - "\\": [14, 0.5], - "]": [14.5, 0.5], - "^": [15, 0.5], - _: [15.5, 0.5], - UP: [14, 31], - RIGHT: [14.5, 31], - DOWN: [15, 31], - LEFT: [15.5, 31], - }, - artMap: { - chip: { - type: "state", - - normal: { - type: "directional", - duration: "steps", - UP: frange([0, 22], [7, 22]), - RIGHT: frange([8, 22], [15, 22]), - DOWN: frange([0, 23], [7, 23]), - LEFT: frange([8, 23], [15, 23]), - }, - water: { - type: "directional", - duration: "steps", - UP: [ - [0, 24], - [1, 24], - ], - RIGHT: [ - [2, 24], - [3, 24], - ], - DOWN: [ - [4, 24], - [5, 24], - ], - LEFT: [ - [6, 24], - [7, 24], - ], - }, - bump: { - type: "directic", - UP: [8, 24], - RIGHT: [9, 24], - DOWN: [10, 24], - LEFT: [11, 24], - }, - }, - melinda: { - type: "state", - normal: { - type: "directional", - duration: "steps", - UP: frange([0, 27], [7, 27]), - RIGHT: frange([8, 27], [15, 27]), - DOWN: frange([0, 28], [7, 28]), - LEFT: frange([8, 28], [15, 28]), - }, - water: { - type: "directional", - duration: "steps", - UP: [ - [0, 29], - [1, 29], - ], - RIGHT: [ - [2, 29], - [3, 29], - ], - DOWN: [ - [4, 29], - [5, 29], - ], - LEFT: [ - [6, 29], - [7, 29], - ], - }, - bump: { - type: "directic", - UP: [8, 29], - RIGHT: [9, 29], - DOWN: [10, 29], - LEFT: [11, 29], - }, - }, - fire: { - type: "animated", - duration: 20, - frames: frange([12, 29], [15, 29]), - }, - keyRed: [4, 1], - keyBlue: [5, 1], - keyYellow: [6, 1], - keyGreen: [7, 1], - - blueWall: { - type: "state", - real: [0, 10], - fake: { - type: "special", - specialType: "perspective", - default: [0, 10], - revealed: [10, 31], - }, - }, - invisibleWall: { - type: "special", - specialType: "perspective", - default: { type: "state", default: [0, 2], touched: [1, 2] }, - revealed: [9, 31], - }, - appearingWall: { - type: "special", - specialType: "perspective", - default: [0, 2], - revealed: [11, 31], - }, - doorRed: [0, 1], - doorBlue: [1, 1], - doorYellow: [2, 1], - doorGreen: [3, 1], - - dirtBlock: { - type: "special", - specialType: "perspective", - somethingUnderneathOnly: true, - default: [8, 1], - revealed: [9, 1], - }, - ice: [10, 1], - iceCorner: { - type: "directic", - UP: [13, 1], - RIGHT: [11, 1], - DOWN: [12, 1], - LEFT: [14, 1], - }, - cloneMachine: { - type: "overlay", - bottom: [15, 1], - top: { - type: "special", - specialType: "arrows", - UP: [8, 31], - RIGHT: [8.75, 31], - DOWN: [8, 31.75], - LEFT: [8, 31], - CENTER: [8.25, 31.25], - }, - }, - letterTile: { - type: "overlay", - bottom: [2, 2], - top: { type: "special", specialType: "letters" }, - }, - wall: [1, 2], - thiefTool: [3, 2], - thiefKey: [15, 21], - echipGate: [4, 2], - hint: [5, 2], - bomb: { - type: "overlay", - bottom: [5, 4], - top: { - type: "special", - specialType: "fuse", - duration: 16, - frames: [ - [7, 4], - [7.5, 4], - [7, 4.5], - [7.5, 4.5], - ], - }, - }, - greenBomb: { - type: "state", - bomb: { - type: "overlay", - bottom: [6, 4], - top: { - type: "special", - specialType: "fuse", - duration: 16, - frames: [ - [7, 4], - [7.5, 4], - [7, 4.5], - [7.5, 4.5], - ], - }, - }, - echip: [9, 3], - }, - exit: { type: "animated", duration: 16, frames: frange([6, 2], [9, 2]) }, - iceBlock: { - type: "special", - specialType: "perspective", - somethingUnderneathOnly: true, - default: [10, 2], - revealed: [11, 2], - }, - bonusFlag: { - type: "state", - 1000: [12, 2], - 100: [13, 2], - 10: [14, 2], - "*2": [15, 2], - }, - customFloor: { - type: "state", - green: [8, 4], - pink: [9, 4], - yellow: [10, 4], - blue: [11, 4], - }, - customWall: { - type: "state", - green: [12, 4], - pink: [13, 4], - yellow: [14, 4], - blue: [15, 4], - }, - echip: [11, 3], - echipPlus: [11, 3], - tnt: [0, 4], - tntLit: { - type: "state", - 0: [0, 4], - 1: [1, 4], - 2: [2, 4], - 3: [3, 4], - 4: [4, 4], - }, - explosionAnim: { - type: "state", - 0: [0, 5], - 1: [1, 5], - 2: [2, 5], - 3: [3, 5], - }, - splashAnim: { - type: "state", - 0: [4, 5], - 1: [5, 5], - 2: [6, 5], - 3: [7, 5], - }, - flameJet: { - type: "state", - off: [8, 5], - on: { type: "animated", duration: 12, frames: frange([9, 5], [11, 5]) }, - }, - ant: { - type: "directional", - duration: "steps", - UP: frange([0, 7], [3, 7]), - RIGHT: frange([4, 7], [7, 7]), - DOWN: frange([8, 7], [11, 7]), - LEFT: frange([12, 7], [15, 7]), - }, - centipede: { - type: "directional", - duration: "steps", - UP: frange([0, 12], [2, 12]), - RIGHT: frange([3, 12], [5, 12]), - DOWN: frange([6, 12], [8, 12]), - LEFT: frange([9, 12], [11, 12]), - }, - foil: [12, 12], - turtle: { - type: "overlay", - bottom: { - type: "animated", - duration: 20, - frames: frange([12, 24], [15, 24]), - }, - top: { - type: "animated", - duration: 256, - randomizedFrame: true, - frames: frange([13, 12], [15, 12]), - }, - }, - glider: { - type: "directional", - duration: 8, - UP: [ - [8, 8], - [9, 8], - ], - RIGHT: [ - [10, 8], - [11, 8], - ], - DOWN: [ - [12, 8], - [13, 8], - ], - LEFT: [ - [14, 8], - [15, 8], - ], - }, - fireball: { - type: "animated", - duration: 4, - frames: frange([12, 9], [15, 9]), - }, - steelWall: { - type: "special", - specialType: "freeform wires", - base: [15, 10], - overlap: [9, 26], - overlapCross: [11, 26], - }, - teethBlue: { - type: "directional", - duration: "steps", - baseFrame: 1, - UP: [ - [1, 17], - [0, 17], - ], - RIGHT: [ - [3, 17], - [2, 17], - ], - DOWN: [ - [1, 17], - [0, 17], - ], - LEFT: [ - [5, 17], - [4, 17], - ], - }, - bowlingBall: [6, 17], - bowlingBallRolling: { - type: "animated", - duration: "steps", - frames: [ - [6, 17], - [6, 17], - [7, 17], - [7, 17], - ], - }, - forceFloor: { - type: "special", - specialType: "scrolling", - duration: 24, - UP: [ - [0, 19], - [0, 20], - ], - DOWN: [ - [1, 20], - [1, 19], - ], - RIGHT: [ - [3, 19], - [2, 19], - ], - LEFT: [ - [2, 20], - [3, 20], - ], - }, - forceFloorRandom: { - type: "animated", - // Unaligned with CC2, but come on - duration: 24, - frames: frange([0, 21], [7, 21]), - }, - dirt: [4, 31], - popupWall: [8, 10], - gravel: [9, 10], - ball: { - type: "animated", - duration: "steps", - baseFrame: 2, - frames: [ - [10, 10], - [11, 10], - [12, 10], - [13, 10], - [14, 10], - [13, 10], - [12, 10], - [11, 10], - ], - }, - transmogrifier: { - type: "state", - on: { - type: "animated", - duration: 16, - frames: frange([12, 19], [15, 19]), - }, - off: [12, 19], - }, - water: { - type: "animated", - duration: 20, - frames: frange([12, 24], [15, 24]), - }, - thinWall: { - type: "overlay", - bottom: { - type: "special", - specialType: "thin walls", - UP: [1, 10], - DOWN: [1, 10.5], - LEFT: [2, 10], - RIGHT: [2.5, 10], - }, - top: { - type: "state", - canopy: { - type: "special", - specialType: "perspective", - default: [14, 3], - revealed: [15, 3], - }, - nothing: null, - }, - }, - teleportBlue: { - type: "wires", - alwaysShowTop: true, - top: { - type: "animated", - duration: 16, - frames: frange([4, 10], [7, 10]), - }, - }, - teleportRed: { - type: "wires", - alwaysShowTop: true, - top: { - type: "state", - on: { - type: "animated", - duration: 16, - frames: frange([4, 20], [7, 20]), - }, - off: [4, 20], - }, - }, - teleportGreen: { - type: "animated", - duration: 16, - frames: frange([4, 19], [7, 19]), - }, - teleportYellow: { - type: "animated", - duration: 16, - frames: frange([8, 19], [11, 19]), - }, - tankYellow: { - type: "directional", - duration: 32, - UP: [ - [8, 17], - [9, 17], - ], - RIGHT: [ - [10, 17], - [11, 17], - ], - DOWN: [ - [12, 17], - [13, 17], - ], - LEFT: [ - [14, 17], - [15, 17], - ], - }, - secretEye: [11, 18], - slime: { - type: "animated", - duration: 60, - frames: frange([8, 20], [15, 20]), - }, - - bootWater: [0, 6], - bootFire: [1, 6], - bootIce: [2, 6], - bootForceFloor: [3, 6], - bootDirt: [4, 6], - bootSpeed: [13, 3], - - bribe: [12, 3], - lightningBolt: [5, 6], - toggleWall: { - type: "overlay", - bottom: { - type: "animated", - duration: 16, - frames: frange([0, 9], [3, 9]), - }, - top: { type: "state", off: null, on: [8, 9] }, - }, - holdWall: { - type: "overlay", - bottom: { - type: "animated", - duration: 16, - frames: frange([4, 9], [7, 9]), - }, - top: { type: "state", off: null, on: [8, 9] }, - }, - trap: { type: "state", closed: [9, 9], open: [10, 9] }, - mirrorChip: { - type: "overlay", - bottom: [7, 6], - top: { - type: "directional", - duration: "steps", - UP: frange([0, 22], [7, 22]), - RIGHT: frange([8, 22], [15, 22]), - DOWN: frange([0, 23], [7, 23]), - LEFT: frange([8, 23], [15, 23]), - }, - }, - mirrorMelinda: { - type: "overlay", - bottom: [7, 6], - top: { - type: "directional", - duration: "steps", - UP: frange([0, 27], [7, 27]), - RIGHT: frange([8, 27], [15, 27]), - DOWN: frange([0, 28], [7, 28]), - LEFT: frange([8, 28], [15, 28]), - }, - }, - buttonBlue: [8, 6], - buttonGreen: [9, 6], - buttonRed: [10, 6], - buttonBrown: [11, 6], - buttonPurple: { type: "wires", top: [12, 6] }, - buttonBlack: { type: "wires", top: [13, 6] }, - buttonOrange: [14, 6], - complexButtonYellow: [15, 6], - buttonGray: [11, 9], - - teethRed: { - type: "directional", - duration: "steps", - baseFrame: 1, - UP: [ - [0, 11], - [1, 11], - [2, 11], - [1, 11], - ], - RIGHT: [ - [3, 11], - [4, 11], - [5, 11], - [4, 11], - ], - DOWN: [ - [0, 11], - [1, 11], - [2, 11], - [1, 11], - ], - LEFT: [ - [6, 11], - [7, 11], - [8, 11], - [7, 11], - ], - }, - swivel: { - type: "overlay", - bottom: [13, 11], - top: { - type: "directic", - UP: [11, 11], - RIGHT: [12, 11], - DOWN: [9, 11], - LEFT: [10, 11], - }, - }, - tankBlue: { - type: "directional", - duration: 32, - UP: [ - [0, 8], - [1, 8], - ], - RIGHT: [ - [2, 8], - [3, 8], - ], - DOWN: [ - [4, 8], - [5, 8], - ], - LEFT: [ - [6, 8], - [7, 8], - ], - }, - walker: { - type: "special", - specialType: "stretch", - idle: [0, 13], - vertical: frange([1, 13], [7, 13]), - horizontal: [ - [8, 13], - [10, 13], - [12, 13], - [14, 13], - [8, 14], - [10, 14], - [12, 14], - ], - }, - helmet: [0, 14], - blob: { - type: "special", - specialType: "stretch", - idle: [0, 15], - vertical: frange([1, 15], [7, 15]), - horizontal: [ - [8, 15], - [10, 15], - [12, 15], - [14, 15], - [8, 16], - [10, 16], - [12, 16], - ], - }, - floorMimic: { - type: "special", - specialType: "perspective", - default: [0, 2], - revealed: [14, 16], - }, - greenWall: { - type: "state", - real: [12, 5], - stepped: [13, 5], - fake: { - type: "special", - specialType: "perspective", - default: [12, 5], - revealed: [13, 5], - }, - }, - noSign: [14, 5], - directionalBlock: { - type: "overlay", - bottom: [15, 5], - top: { - type: "special", - specialType: "arrows", - UP: [3, 10], - RIGHT: [3.75, 10], - DOWN: [3, 10.75], - LEFT: [3, 10], - CENTER: [3.25, 10.25], - }, - }, - - voodooTile: { type: "special", specialType: "voodoo" }, - noMelindaSign: [5, 31], - noChipSign: [6, 31], - hook: [7, 31], - railroad: { - type: "overlay", - bottom: [9, 10], - top: { - type: "special", - specialType: "railroad", - wood: { - UR: [0, 30], - DR: [1, 30], - DL: [2, 30], - UL: [3, 30], - LR: [4, 30], - UD: [5, 30], - }, - rail: { - UR: [13, 30], - DR: [14, 30], - DL: [15, 30], - UL: [0, 31], - LR: [1, 31], - UD: [2, 31], - }, - toggleRail: { - UR: [7, 30], - DR: [8, 30], - DL: [9, 30], - UL: [10, 30], - LR: [11, 30], - UD: [12, 30], - }, - toggleMark: [6, 30], - }, - }, - railroadSign: [3, 31], - rover: { - type: "overlay", - bottom: { - type: "state", - teethRed: { - type: "animated", - duration: 16, - frames: [ - [0, 18], - [8, 18], - ], - }, - teethBlue: { - type: "animated", - duration: 15, - frames: [ - [0, 18], - [9, 18], - ], - }, - ball: { - type: "animated", - duration: 16, - frames: [ - [0, 18], - [4, 18], - ], - }, - walker: { - type: "animated", - duration: 16, - frames: [ - [8, 18], - [9, 18], - ], - }, - glider: { - type: "animated", - duration: 32, - frames: frange([0, 18], [7, 18]), - }, - centipede: { - type: "animated", - duration: 16, - frames: frange([0, 18], [7, 18]), - }, - fireball: { - type: "animated", - duration: 32, - frames: frange([7, 18], [0, 18]), - }, - ant: { - type: "animated", - duration: 16, - frames: frange([7, 18], [0, 18]), - }, - }, - top: { - type: "special", - specialType: "rover antenna", - UP: [10, 18], - RIGHT: [10.5, 18], - LEFT: [10, 18.5], - DOWN: [10.5, 18.5], - }, - }, - ghost: { - type: "directic", - UP: [12, 18], - RIGHT: [13, 18], - DOWN: [14, 18], - LEFT: [15, 18], - }, - toggleSwitch: { - type: "wires", - alwaysShowTop: true, - base: [14, 21], - top: { type: "state", off: [12, 21], on: [13, 21] }, - }, - timePenalty: [15, 11], - timeBonus: [15, 14], - timeToggle: [14, 14], - counterGate: { - type: "wires", - top: { - type: "overlay", - bottom: [14, 26], - top: { - type: "special", - specialType: "counter", - 0: [0, 3], - 1: [0.75, 3], - 2: [1.5, 3], - 3: [2.25, 3], - 4: [3, 3], - 5: [3.75, 3], - 6: [4.5, 3], - 7: [5.25, 3], - 8: [6, 3], - 9: [6.75, 3], - "-": [7.5, 3], - "": [8.25, 3], - }, - }, - }, - notGate: { - type: "wires", - top: { - type: "directic", - UP: [0, 25], - RIGHT: [1, 25], - DOWN: [2, 25], - LEFT: [3, 25], - }, - }, - andGate: { - type: "special", - specialType: "logic gate", - UP: [4, 25], - RIGHT: [5, 25], - DOWN: [6, 25], - LEFT: [7, 25], - }, - orGate: { - type: "special", - specialType: "logic gate", - UP: [8, 25], - RIGHT: [9, 25], - DOWN: [10, 25], - LEFT: [11, 25], - }, - xorGate: { - type: "special", - specialType: "logic gate", - UP: [12, 25], - RIGHT: [13, 25], - DOWN: [14, 25], - LEFT: [15, 25], - }, - latchGate: { - type: "special", - specialType: "logic gate", - UP: [0, 26], - RIGHT: [1, 26], - DOWN: [2, 26], - LEFT: [3, 26], - }, - latchGateMirror: { - type: "special", - specialType: "logic gate", - UP: [8, 21], - RIGHT: [9, 21], - DOWN: [10, 21], - LEFT: [11, 21], - }, - nandGate: { - type: "special", - specialType: "logic gate", - UP: [4, 26], - RIGHT: [5, 26], - DOWN: [6, 26], - LEFT: [7, 26], - }, - }, -} diff --git a/gamePlayer/src/components/Sidebar/index.tsx b/gamePlayer/src/components/Sidebar/index.tsx new file mode 100644 index 00000000..9171ec4c --- /dev/null +++ b/gamePlayer/src/components/Sidebar/index.tsx @@ -0,0 +1,41 @@ +import { ComponentChildren } from "preact" +import leafIcon from "./tabIcons/leaf.svg" +import levelIcon from "./tabIcons/level.svg" +import floppyIcon from "./tabIcons/floppy.svg" +import clockIcon from "./tabIcons/clock.svg" +import toolsIcon from "./tabIcons/tools.svg" +import infoIcon from "./tabIcons/info.svg" + +function SidebarButton( + props: { icon: string } | { children: ComponentChildren } +) { + return ( +
+ {"icon" in props ? ( + + ) : ( + props.children + )} +
+ ) +} + +export function Sidebar() { + return ( +
+ + {/* TODO dynamic icon */} + + + + + + +
+ ) +} diff --git a/gamePlayer/public/tabIcons/clock.svg b/gamePlayer/src/components/Sidebar/tabIcons/clock.svg similarity index 100% rename from gamePlayer/public/tabIcons/clock.svg rename to gamePlayer/src/components/Sidebar/tabIcons/clock.svg diff --git a/gamePlayer/public/tabIcons/floppy.svg b/gamePlayer/src/components/Sidebar/tabIcons/floppy.svg similarity index 100% rename from gamePlayer/public/tabIcons/floppy.svg rename to gamePlayer/src/components/Sidebar/tabIcons/floppy.svg diff --git a/gamePlayer/public/tabIcons/info.svg b/gamePlayer/src/components/Sidebar/tabIcons/info.svg similarity index 100% rename from gamePlayer/public/tabIcons/info.svg rename to gamePlayer/src/components/Sidebar/tabIcons/info.svg diff --git a/gamePlayer/public/tabIcons/leaf.svg b/gamePlayer/src/components/Sidebar/tabIcons/leaf.svg similarity index 100% rename from gamePlayer/public/tabIcons/leaf.svg rename to gamePlayer/src/components/Sidebar/tabIcons/leaf.svg diff --git a/gamePlayer/public/tabIcons/level.svg b/gamePlayer/src/components/Sidebar/tabIcons/level.svg similarity index 100% rename from gamePlayer/public/tabIcons/level.svg rename to gamePlayer/src/components/Sidebar/tabIcons/level.svg diff --git a/gamePlayer/public/tabIcons/tools.svg b/gamePlayer/src/components/Sidebar/tabIcons/tools.svg similarity index 100% rename from gamePlayer/public/tabIcons/tools.svg rename to gamePlayer/src/components/Sidebar/tabIcons/tools.svg diff --git a/gamePlayer/src/configPath.ts b/gamePlayer/src/configPath.ts deleted file mode 100644 index a5680046..00000000 --- a/gamePlayer/src/configPath.ts +++ /dev/null @@ -1,53 +0,0 @@ -// A straight port of `application-config-path`, but for Neutralino - -import { os } from "@neutralinojs/lib" -import path from "path-browserify" - -let configPath: string | null = null - -async function darwin(name: string) { - return path.join( - await os.getEnv("HOME"), - "Library", - "Application Support", - name - ) -} - -async function xdg(name: string) { - if (await os.getEnv("XDG_DATA_HOME")) { - return path.join(await os.getEnv("XDG_DATA_HOME"), name) - } - - return path.join(await os.getEnv("HOME"), ".local", "share", name) -} - -async function win32(name: string) { - if (await os.getEnv("APPDATA")) { - return path.join(await os.getEnv("APPDATA"), name) - } - return path.join(await os.getEnv("USERPROFILE"), "AppData", "Roaming", name) -} - -export async function applicationConfigPath(name: string): Promise { - if (typeof name !== "string") { - throw new TypeError("`name` must be string") - } - - if (configPath !== null) return configPath - - switch ((globalThis as any).NL_OS.toLowerCase()) { - case "darwin": - configPath = await darwin(name) - break - case "linux": - configPath = await xdg(name) - break - case "windows": - configPath = await win32(name) - break - default: - throw new Error("Platform not supported") - } - return configPath -} diff --git a/gamePlayer/src/const.ts b/gamePlayer/src/const.ts deleted file mode 100644 index 84f7dd71..00000000 --- a/gamePlayer/src/const.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Renderer, ArtContext, SpecialArt } from "./renderer" -import { Actor } from "@notcc/logic" -import { Page } from "./pager" - -export const stateFuncs: Record string> = {} - -export function registerStateFunction( - id: string, - func: (actor: T) => string -): void { - stateFuncs[id] = func as (typeof stateFuncs)[string] -} - -export const specialFuncs: Record< - string, - (this: Renderer, ctx: ArtContext, art: SpecialArt) => void -> = {} - -export function registerSpecialFunction( - id: string, - func: ( - this: Renderer, - ctx: ArtContext & { actor: T }, - art: SpecialArt - ) => void -): void { - specialFuncs[id] = func as (typeof specialFuncs)[string] -} - -export const pages: Record = {} -export function registerPage(page: Page): void { - if (page.pagePath !== null) { - pages[page.pagePath] = page - } -} diff --git a/gamePlayer/src/extraTypes.d.ts b/gamePlayer/src/extra-types.d.ts similarity index 66% rename from gamePlayer/src/extraTypes.d.ts rename to gamePlayer/src/extra-types.d.ts index a1ef6b8e..22bf9560 100644 --- a/gamePlayer/src/extraTypes.d.ts +++ b/gamePlayer/src/extra-types.d.ts @@ -1,3 +1,4 @@ +/// declare module "*.c2m" { const content: string export default content diff --git a/gamePlayer/src/fileLoaders.ts b/gamePlayer/src/fileLoaders.ts deleted file mode 100644 index 084880b1..00000000 --- a/gamePlayer/src/fileLoaders.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { LevelSetLoaderFunction } from "@notcc/logic" -import { AsyncUnzipOptions, Unzipped, unzip, unzipSync } from "fflate" -import { join, normalize } from "path-browserify" - -function getFilePath(file: File): string { - return file.webkitRelativePath ?? file.name -} - -function unzipAsync( - zipData: ArrayBuffer, - options?: AsyncUnzipOptions -): Promise { - return new Promise((res, rej) => { - unzip(new Uint8Array(zipData), options ?? {}, (err, data) => { - if (err) { - rej(err) - } else { - res(data) - } - }) - }) -} - -async function unzipFileAsync( - zipData: ArrayBuffer, - fileName: string -): Promise { - const unzipped = await unzipAsync(zipData, { - filter: zipInfo => zipInfo.name.toLowerCase() === fileName.toLowerCase(), - }) - const unzippedData = Object.values(unzipped) - if (unzippedData.length < 1) - throw new Error(`No such file ${fileName} in the zip archive.`) - return unzippedData[0] -} - -export function buildZipIndex(zipData: ArrayBuffer): string[] { - const filePaths: string[] = [] - // Use the filter property to collect info about the files, but we don't care - // about the contents, for now - unzipSync(new Uint8Array(zipData), { - filter: zipInfo => { - filePaths.push(zipInfo.name.toLowerCase()) - return false - }, - }) - return filePaths -} - -export function makeZipFileLoader( - zipData: ArrayBuffer -): LevelSetLoaderFunction { - // This is Latin-1 - const decoder = new TextDecoder("iso-8859-1") - return async (path: string, binary: boolean) => { - const fileData = await unzipFileAsync(zipData, path.toLowerCase()) - if (binary) return fileData.buffer - return decoder.decode(fileData) - } -} - -export function makeFileListFileLoader( - fileList: File[] -): LevelSetLoaderFunction { - // This is Latin-1 - const decoder = new TextDecoder("iso-8859-1") - const files: Record = {} - for (const file of fileList) { - files[getFilePath(file).toLowerCase()] = file - } - return async (path: string, binary: boolean) => { - const fileData = await files[path.toLowerCase()].arrayBuffer() - if (binary) return fileData - return decoder.decode(fileData) - } -} - -export function makeHttpFileLoader(url: string): LevelSetLoaderFunction { - return async (path: string, binary: boolean) => { - const fileData = await fetch(`${url}${path}`) - if (binary) return await fileData.arrayBuffer() - return await fileData.text() - } -} - -export function buildFileListIndex(fileList: File[]): string[] { - return fileList.map(file => getFilePath(file)) -} - -export function makeLoaderWithPrefix( - prefix: string, - loader: LevelSetLoaderFunction -): LevelSetLoaderFunction { - return (path: string, binary: boolean) => { - const joinedPath = normalize(join(prefix, path)) - return loader(joinedPath, binary) - } -} diff --git a/gamePlayer/src/gliderbotSets.ts b/gamePlayer/src/gliderbotSets.ts deleted file mode 100644 index 510b268d..00000000 --- a/gamePlayer/src/gliderbotSets.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { - findScriptName, - LevelSetLoaderFunction, - parseScriptMetadata, - ScriptMetadata, -} from "@notcc/logic" -import { basename, join } from "path-browserify" -import { makeHttpFileLoader } from "./fileLoaders" - -const censoredSetNames: string[] = ["CC1STEAM", "steamcc1", "cc1cropped", "cc2"] - -// Some important sets (CC2LP1, CCLP ports) don't have set metadata as of writing, -// so inject our own metadata to put them near the top -const subsituteSetMetadata: Record = { - cc2lp1: { - title: "Chips Challenge 2 Level Pack 1", - by: "The Community", - description: - "Chip's Challenge 2 Level Pack 1 is the first community level pack for Chip's Challenge 2. It contains 200 levels created by and voted on by fans. Read about it at https://bitbusters.club/cc2lp1", - difficulty: 4, - listingPriority: "top", - }, - "cclp1-cc2": { - title: "Chips Challenge Level Pack 1 (Steam)", - by: "The Community", - difficulty: 3, - description: - "Chip's Challenge Level Pack 1 is a beginner-friendly level pack for Chip's Challenge. This is the port of CCLP1 to the Steam ruleset. May be incomplete.", - listingPriority: "top", - }, - "CCLP4-CC2": { - title: "Chips Challenge Level Pack 4 (Steam)", - by: "The Community", - difficulty: 4, - description: - "Chip's Challenge Level Pack 4 is the community's fourth level pack for Chip's Challenge. This is the port of CCLP4 to the Steam ruleset. May be incomplete.", - listingPriority: "top", - }, -} - -const listingRegex = /.+<\/a>\s+(.+:..)/g -const gliderbotWebsite = "https://bitbusters.club/gliderbot/sets/cc2/" - -export interface GliderbotSet { - metadata: ScriptMetadata - previewImage: string | null - mainScript: string - rootDirectory: string - ident: string - lastChanged: Date - loaderFunction: LevelSetLoaderFunction -} - -function getMetadataPriority(set: GliderbotSet): number { - let priority = 0 - if (set.metadata.listingPriority === "top") priority += 100 - if (set.metadata.listingPriority === "bottom") priority -= 100 - // Unlisted sets should be sorted out by getGbSets - if (set.metadata.description !== undefined) priority += 2 - else if (set.previewImage !== null) priority += 1 - return priority -} - -export function metadataComparator(a: GliderbotSet, b: GliderbotSet): number { - return getMetadataPriority(a) - getMetadataPriority(b) -} - -class NginxNode { - lastEdited?: Date - constructor( - public parent: NginxDirectory | null = null, - public name: string - ) {} - getPath(): string { - if (!this.parent) return this.name - return join(this.parent.getPath(), this.name) - } -} - -class NginxFile extends NginxNode { - async download(binary: false): Promise - async download(binary: true): Promise - async download(binary: boolean): Promise { - const fileRes = await fetch(`${gliderbotWebsite}/${this.getPath()}`) - if (binary) { - return await fileRes.arrayBuffer() - } else { - return await fileRes.text() - } - } -} - -class NginxDirectory extends NginxNode { - constructor( - parent: NginxDirectory | null, - name: string, - public contents: Record = {} - ) { - super(parent, name) - } - findNode(pathStr: string): NginxNode { - const parsedPath = /^(.+)\/(.*)/.exec(pathStr) - const dirName = parsedPath?.[1] ?? null - const nodeName = parsedPath?.[2] ?? pathStr - if (dirName === null || dirName[1] === ".") { - const node = this.contents[nodeName.toLowerCase()] - if (node === undefined) - throw new Error( - `No such file or directory ${nodeName} in ${this.getPath()}` - ) - // We're looking for a node in this directory - return node - } - const node = this.contents[`${dirName.toLowerCase()}/`] - if (node === undefined) - throw new Error(`No such directory ${dirName} in ${this.getPath()}`) - if (!(node instanceof NginxDirectory)) - throw new Error(`${dirName} in ${this.getPath()} is not a directory.`) - return node.findNode(nodeName) - } -} - -export function makeNginxHttpFileLoader( - url: string, - dir: NginxDirectory -): LevelSetLoaderFunction { - const httpLoader = makeHttpFileLoader(url) - return (path: string, binary: boolean) => { - // Note that `path` and `node.getPath()` won't always be the same - `path` might have the wrong casitivy - // `findNode` correctly resolves it, and so `node.getPath()` will always have the correct casitivy - const node = dir.findNode(path) - const correctPath = node.getPath() - return httpLoader(correctPath, binary) - } -} - -async function scanNginxIndex( - dirPath: string, - parent?: NginxDirectory -): Promise { - const indexRes = await fetch( - `${gliderbotWebsite}/${parent ? join(parent.getPath(), dirPath) : dirPath}` - ) - if (!indexRes.ok) throw new Error(indexRes.statusText) - const pageData = await indexRes.text() - const directory = new NginxDirectory(parent ?? null, basename(dirPath)) - const childPromises: Promise[] = [] - // eslint-disable-next-line no-constant-condition - while (true) { - const match = listingRegex.exec(pageData) - if (!match) break - const entryName = decodeURIComponent(match[1]) - const lastEdited = new Date(match[2]) - if (entryName.endsWith("/")) { - if (censoredSetNames.includes(entryName.slice(0, -1))) continue - // This is a directory - childPromises.push( - scanNginxIndex(entryName, directory).then(ent => { - ent.lastEdited = lastEdited - directory.contents[entryName.toLowerCase()] = ent - }) - ) - } else { - const file = new NginxFile(directory, entryName) - file.lastEdited = lastEdited - directory.contents[entryName.toLowerCase()] = file - } - } - await Promise.all(childPromises) - return directory -} - -async function findGbSet(dir: NginxDirectory): Promise { - for (const file of Object.values(dir.contents)) { - if (!(file instanceof NginxFile)) continue - if (!file.name.endsWith(".c2g")) continue - const scriptText = await file.download(false) - const scriptTitle = findScriptName(scriptText) - // A c2g file without a title. Could possibly be a `chain`-able helper script - if (!scriptTitle) continue - const metadata = - subsituteSetMetadata[dir.name] ?? parseScriptMetadata(scriptText) - return { - mainScript: file.name, - metadata, - previewImage: - "preview.png" in dir.contents ? dir.contents["preview.png"].name : null, - lastChanged: dir.lastEdited!, - rootDirectory: `${gliderbotWebsite}${dir.getPath()}/`, - ident: dir.name, - loaderFunction: makeNginxHttpFileLoader(gliderbotWebsite, dir), - } - } - return null -} - -export async function getGbSets(): Promise { - const rootIndex = await scanNginxIndex(".") - const setPromises: Promise[] = [] - for (const setDir of Object.values(rootIndex.contents)) { - if (!(setDir instanceof NginxDirectory)) continue - setPromises.push(findGbSet(setDir)) - } - return (await Promise.all(setPromises)).filter( - (set): set is GliderbotSet => - set !== null && set.metadata.listingPriority !== "unlisted" - ) -} - -export async function lookupGbSet(name: string): Promise { - if (censoredSetNames.includes(name)) return null - const localIndex = await scanNginxIndex(name) - return await findGbSet(localIndex) -} diff --git a/gamePlayer/src/index.css b/gamePlayer/src/index.css new file mode 100644 index 00000000..84637c1d --- /dev/null +++ b/gamePlayer/src/index.css @@ -0,0 +1,19 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + body { + width: 100vw; + height: 100vh; + } + #app { + display: contents; + } +} + +@layer components { + .box { + @apply rounded-md bg-blue-900 p-2 shadow-lg; + } +} diff --git a/gamePlayer/src/index.ts b/gamePlayer/src/index.ts deleted file mode 100644 index 466e2556..00000000 --- a/gamePlayer/src/index.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { - onLevelDecisionTick, - createLevelFromData, - onLevelAfterTick, - onLevelStart, -} from "@notcc/logic" -import { Direction } from "@notcc/logic" -import { parseC2M } from "@notcc/logic" -import { actorDB, keyNameList } from "@notcc/logic" -import { parseNCCS, writeNCCS } from "@notcc/logic" -import { ScriptRunner } from "@notcc/logic" -import { Actor } from "@notcc/logic" -import { Item } from "@notcc/logic" - -import "@notcc/logic" - -import { Pager } from "./pager" -import { generateShortcutListener, generateTabButtons } from "./sidebar" - -import { loadSetInfo, saveSetInfo } from "./saveData" -import { KeyListener } from "./utils" -import { openTilesetSelectortDialog } from "./tilesets" -import { showAlert } from "./simpleDialogs" -import { openNotccUrl } from "./pages/loading" - -import "dialog-polyfill/dialog-polyfill.css" -import dialogPolyfill from "dialog-polyfill" - -for (const dialog of Array.from(document.querySelectorAll("dialog"))) { - dialogPolyfill.registerDialog(dialog) -} - -import "./NCCTK.less" - -const pager = new Pager() - -window.addEventListener("popstate", () => { - openNotccUrl(pager) -}) - -generateTabButtons(pager) -new KeyListener(generateShortcutListener(pager)) - -function errorHandler(ev: ErrorEvent | PromiseRejectionEvent) { - let errorInfoText: string - if (ev instanceof ErrorEvent) { - errorInfoText = `${ev.message} -at ${ev.lineno}:${ev.colno} -in ${ev.filename}` - } else { - errorInfoText = `Promise rejected! Reason: ${ev.reason}` - } - - showAlert(`Yikes! Something went wrong... -Error info: ${errorInfoText}`) -} - -window.addEventListener("error", errorHandler) -window.addEventListener("unhandledrejection", errorHandler) - -// We export it like this so the global values are always updated -const exportObject = { - /* get level(): LevelState { - return setPlayer.pulseManager.level - }, */ - parseC2M, - parseNCCS, - writeNCCS, - ScriptRunner, - Direction, - actorDB, - //setPlayer, - keyNameList, - onLevelDecisionTick, - onLevelAfterTick, - onLevelStart, - createLevelFromData, - Actor, - Item, - //setColorScheme, - pager, - loadSolution: loadSetInfo, - saveSolution: saveSetInfo, - openTilesetSelectortDialog, -} - -;(globalThis as any).NotCC = exportObject diff --git a/gamePlayer/src/levelList.ts b/gamePlayer/src/levelList.ts deleted file mode 100644 index f216e335..00000000 --- a/gamePlayer/src/levelList.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { findBestMetrics } from "@notcc/logic" -import { Pager } from "./pager" -import { openScoreReportGenDialog } from "./reportGenerator" -import { makeTd, resetListeners } from "./utils" - -const levelListDialog = - document.querySelector("#levelListDialog")! -export function openLevelListDialog(pager: Pager): void { - const set = pager.loadedSet - if (set === null) return - resetListeners(levelListDialog) - const sortedLevels = Object.values(set.seenLevels) - .map(record => record.levelInfo) - .sort((a, b) => (a.levelNumber ?? 0) - (b.levelNumber ?? 0)) - const tableBody = levelListDialog.querySelector("tbody")! - // Nuke all current data - tableBody.textContent = "" - for (const levelRecord of sortedLevels) { - const row = document.createElement("tr") - const levelN = levelRecord.levelNumber ?? 0 - const metrics = findBestMetrics(levelRecord) - row.appendChild(makeTd(levelN.toString(), "levelN")) - row.appendChild(makeTd(levelRecord.title ?? "[An untitled level]")) - row.appendChild( - makeTd( - metrics.timeLeft === undefined ? "-" : Math.ceil(metrics.timeLeft) + "s" - ) - ) - row.appendChild( - makeTd(metrics.points === undefined ? "-" : metrics.points.toString()) - ) - row.addEventListener("click", async () => { - await pager.goToLevel(levelN) - await pager.reloadLevel() - levelListDialog.close() - }) - row.tabIndex = 0 - tableBody.appendChild(row) - } - const generateReportButton = document.querySelector( - "#generateReportButton" - )! - generateReportButton.addEventListener("click", () => { - openScoreReportGenDialog(pager) - }) - levelListDialog.showModal() -} diff --git a/gamePlayer/src/levelLoading.ts b/gamePlayer/src/levelLoading.ts deleted file mode 100644 index dd7f0577..00000000 --- a/gamePlayer/src/levelLoading.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { - LevelData, - LevelSet, - LevelSetLoaderFunction, - findScriptName, -} from "@notcc/logic" -import { levelPlayerPage } from "./pages/levelPlayer" -import { Pager } from "./pager" -import { basename, dirname } from "path-browserify" -import { - buildFileListIndex, - makeFileListFileLoader, - makeLoaderWithPrefix, -} from "./fileLoaders" -import { loadSetInfo, showDirectotyPrompt } from "./saveData" -import { getNonFreeSetId } from "./pages/loading" -interface DirEntry { - path: string - data: string -} - -export async function findEntryFilePath( - loaderFunction: LevelSetLoaderFunction, - fileIndex: string[] -): Promise { - // Use `loaderFunction` and `rootIndex` to figure out which files are entry - // scripts (have the header closed string) - const c2gFileNames = fileIndex.filter(path => path.endsWith(".c2g")) - const c2gDirEntPromises = c2gFileNames.map>(async path => { - const scriptData = (await loaderFunction(path, false)) as string - return { path, data: scriptData } - }) - const maybeC2gFiles = await Promise.all(c2gDirEntPromises) - const c2gFiles = maybeC2gFiles.filter( - ent => findScriptName(ent.data) !== null - ) - - if (c2gFiles.length > 1) { - c2gFiles.sort((a, b) => a.path.length - b.path.length) - - console.warn( - "There appear to be multiple entry script files. Picking the one with the shortest path..." - ) - } - if (c2gFiles.length < 1) - throw new Error( - "This ZIP archive doesn't contain a script. Are you sure this is the correct file?" - ) - return c2gFiles[0].path -} - -export function openLevel(pager: Pager, level: LevelData): void { - pager.loadedLevel = level - pager.loadedSet = null - pager.loadedSetIdent = null - pager.updateShownLevelNumber() - pager.openPage(levelPlayerPage) -} -export async function loadSet( - pager: Pager, - loaderFunction: LevelSetLoaderFunction, - scriptFile: string, - noOpenPage: boolean = false -): Promise { - const filePrefix = dirname(scriptFile) - // If the zip file has the entry script in a subdirectory instead of the zip - // root, prefix all file paths with the entry file - if (filePrefix !== ".") { - loaderFunction = makeLoaderWithPrefix(filePrefix, loaderFunction) - scriptFile = basename(scriptFile) - } - - const scriptData = (await loaderFunction(scriptFile, false)) as string - const scriptTitle = findScriptName(scriptData)! - - const setInfo = await loadSetInfo(scriptTitle).catch(() => null) - - let set: LevelSet - - if (setInfo !== null) { - set = await LevelSet.constructAsync(setInfo, loaderFunction) - } else { - set = await LevelSet.constructAsync(scriptFile, loaderFunction) - } - - const nonFreeSetId = getNonFreeSetId(set.scriptRunner.state.scriptTitle!) - if (nonFreeSetId !== null) { - pager.loadedSetIdent = nonFreeSetId - } - - pager.loadedSet = set - const record = await set.getCurrentRecord() - pager.loadedLevel = record.levelData! - - // Oh, this set doesn't have levels... - if (pager.loadedLevel === null) - throw new Error( - "This set doesn't have levels, or the saved set info is broken." - ) - - if (!noOpenPage) { - pager.openPage(levelPlayerPage) - pager.updateShownLevelNumber() - } -} - -export async function loadDirSet(): Promise<[LevelSetLoaderFunction, string]> { - const files = await showDirectotyPrompt("Load levelset directory") - const fileLoader = makeFileListFileLoader(files) - const scriptPath = await findEntryFilePath( - fileLoader, - buildFileListIndex(files) - ) - return [fileLoader, scriptPath] -} diff --git a/gamePlayer/src/levels/NotCC.c2m b/gamePlayer/src/levels/NotCC.c2m deleted file mode 100644 index 9c547f5a6583d1b5d28f36bd3fb7b6cfb55ad80c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1792 zcmZ8iYit}>6`t?j@$AgL;v}SQEHO-+gp|awoo!<0<=6TVyKy}xa;Rz>mrcCE(R%RO z>)s7^ypGGgcOUk&YN|pjRRSc0@&|!b;2$s1Aff^)l?p$Qco(D=Rgn-aM5y6x3xBvX zS2J_ZcfND(Ip>}k7)U+J48!O$CPyd7cG27T;>y5)chp;%&w2}4kzFwQFHVj)Bsu3T zWIi{ST{g!3$)PeWOb?7*9Qt%3`dD`1@?wznRu&Uc&-;L2Un2TH>7$v?U&?x;hZYvR zAd~wqX~Da)ycl>HT3ozRw^hh`g`obK&n&MLJTl~6UdUVxNS0Zt1D3Og3SOaZ=0gt` z7MHW$d}cml_!E=koZR^-jEVk%^NwX04>^rT_dj3^fyQCF09Rrs0vpMo5p<)yy}hkX zddf@+o&)#tRryX9FgCT>;v|31oE+vGhxXy@)h+PBxJAtD?4eZqFilguSZFD zV_5wv;kv8B^9A!yaLbiFm{IBKHN^DO`c>V7HQkGZ`c~ZZ7u_|&nZou}9}^LM4=2=D z(JbF*(YUhFRDBuk64k$}jUB}~=DRfN8|s@86`}e#SW2GN@!EUnsr-vV(i0)JRLXVL zZT-)PZKp7I%9VdnZ|m2=6{onbuz9XJ9or@%3&N~iYZUgNZDXzvdyP344|3IyL-H;^ zh12p*V+eu#r#R(+o^-3*4*X)4`NH(oMC`-h+B3jT{hmDs_Ye~_IKS}n+$|LHg>G{P= zYJ$9VDf{I%;(Al=CJXPNReza{JR%2?lkYz;;1{oPUpPKRlAvg2gzl)ltY1rfP`a%F zYoW5?D$Nc*qTfCc`YBcTxQ}3(RuA)x^PhP`fpLoD9QolRGqH;ikdMt4Wkj z@Y415Rl=;7)~nx*t>yBaY!CT~iS2ZBp71Ol+M%t}>K%=SQi)utfVr;x19p|)Ol-15 z7_RQ+1T-S*E}oJ1Yo;ZhpAlc0xoOG2*;CWgQ&Rz(mhZ|R$mPuZ5^iHV8H= z;_@wS%@!)3wdiou8K^y}H}q>C6@yFS;*ywH5<^SCXX+hi2ZTL~W#Fd16)!T+zsidF zgH)h$*r_*9oCf;0FIZyVl5m%_MZGO8B61{pf^t5HJ;I!oFQP1;WdgNfc9rR|>eqJ{ zCtG|$y*O~LBfxbuFd4`LFGx}Px zlND{xCz?3Xn0hvPt~k-)XMrnx>s4wMSKw^_ZtK=o7Ph>9e&}(pk^T+;KZeE!z53dJ E0647aBme*a diff --git a/gamePlayer/src/levels/tilesetPreview.c2m b/gamePlayer/src/levels/tilesetPreview.c2m deleted file mode 100644 index d658dda87f25d12a0f5a7185bcea5914c8fae208..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmZ>EHu7a+U|=w32=NT@;Q+D%ic-rmQ_C3~Lqj|`fqZv`oW#78)FKA|fDk`spa2jA zI68ZW0qH&lVJn2uj*GL5cusx`RtDlPk GNCW^iHXjiH diff --git a/gamePlayer/src/main-ssg.tsx b/gamePlayer/src/main-ssg.tsx new file mode 100644 index 00000000..588b2512 --- /dev/null +++ b/gamePlayer/src/main-ssg.tsx @@ -0,0 +1,6 @@ +import { renderToString } from "preact-render-to-string" +import { App } from "./app" + +export function renderSsgString(): string { + return renderToString() +} diff --git a/gamePlayer/src/main.tsx b/gamePlayer/src/main.tsx new file mode 100644 index 00000000..2da399a5 --- /dev/null +++ b/gamePlayer/src/main.tsx @@ -0,0 +1,4 @@ +import { hydrate } from "preact" +import { App } from "./app" + +hydrate(, document.querySelector("#app")!) diff --git a/gamePlayer/src/pager.ts b/gamePlayer/src/pager.ts deleted file mode 100644 index 3bfdcdff..00000000 --- a/gamePlayer/src/pager.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { LevelData, LevelSet, MapInterruptResponse } from "@notcc/logic" -import { loadingPage } from "./pages/loading" -import { Tileset } from "./renderer" -import { setSidebarLevelN } from "./sidebar" -import { protobuf } from "@notcc/logic" -import { loadSettings, saveSetInfo, saveSettings } from "./saveData" -import { Settings, defaultSettings } from "./settings" -import clone from "clone" -import { ThemeColors, applyTheme } from "./themes" -import { updatePagerTileset } from "./tilesets" - -export interface Page { - pageId: string - pagePath: string | null - requiresLoaded: "none" | "set" | "level" - setupInitialized?: boolean - setupPage?: (pager: Pager, page: HTMLElement) => void - open?: (pager: Pager, page: HTMLElement) => void - close?: (pager: Pager, page: HTMLElement) => void - updateTileset?: (pager: Pager) => void - showInterlude?: (pager: Pager, text: string) => Promise - showGz?: (pager: Pager) => void - loadLevel?: (page: Pager) => void - loadSolution?: (pager: Pager, sol: protobuf.ISolutionInfo) => Promise - updateSettings?: (pager: Pager) => void - setNavigationInfo?: ( - pager: Pager, - subpage: string, - queryParams: Record - ) => void -} - -export class Pager { - currentPage!: Page - loadedSet: LevelSet | null = null - loadedSetIdent: string | null = null - loadedLevel: LevelData | null = null - tileset: Tileset | null = null - settings: Settings = clone(defaultSettings) - constructor() { - this._initPage(loadingPage) - } - _initPage(page: Page): void { - if (page.requiresLoaded === "set" && !this.loadedSet) - throw new Error("Page requires a set to be loaded before opening it.") - if (page.requiresLoaded === "level" && !this.loadedLevel) - throw new Error("Page requires a level to be loaded before opening it.") - const pageElement = document.getElementById(page.pageId) - if (!pageElement) { - throw new Error(`Can't find the page element for "${page.pageId}".`) - } - pageElement.classList.remove("closedPage") - if (!page.setupInitialized) { - page.setupPage?.(this, pageElement) - page.setupInitialized = true - } - this.currentPage = page - if (page !== loadingPage) { - this.updatePageUrl() - } - page.open?.(this, pageElement) - } - openPage(newPage: Page): void { - const oldPageElement = document.getElementById(this.currentPage.pageId)! - this.currentPage.close?.(this, oldPageElement) - oldPageElement.classList.add("closedPage") - this._initPage(newPage) - } - getLevelNumber(): number | "not in set" | "not in level" { - if (this.loadedSet) return this.loadedSet.currentLevel - if (this.loadedLevel) return "not in set" - return "not in level" - } - updateShownLevelNumber(): void { - const levelN = this.getLevelNumber() - let levelText: string - if (typeof levelN === "number") { - levelText = levelN.toString() - } else if (levelN === "not in set") { - levelText = "X" - } else { - levelText = "?" - } - setSidebarLevelN(levelText) - } - async loadNextLevel(action: MapInterruptResponse): Promise { - if (!this.loadedSet) - throw new Error("Can't load the next level of a set without a set.") - const currentRecord = this.loadedSet.seenLevels[this.loadedSet.currentLevel] - - this.loadedSet.lastLevelResult = action - const newRecord = await this.loadedSet.getNextRecord() - // TODO Only show unique text - if (currentRecord && currentRecord.levelInfo.epilogueText) { - await this.currentPage.showInterlude?.( - this, - currentRecord.levelInfo.epilogueText - ) - } - if (newRecord && newRecord.levelInfo.prologueText) { - await this.currentPage.showInterlude?.( - this, - newRecord.levelInfo.prologueText - ) - } - this.loadedLevel = newRecord - ? newRecord.levelData! - : currentRecord.levelData! - this.updateShownLevelNumber() - if (!newRecord) { - this.currentPage.showGz?.(this) - } else { - await this.writeSaveData() - } - } - async loadPreviousLevel(): Promise { - if (!this.loadedSet) - throw new Error("Can't load the previous level of a set without a set.") - - const newRecord = await this.loadedSet.getPreviousRecord() - // This is the first level of the set - if (!newRecord) { - return - } - - this.loadedLevel = newRecord.levelData! - this.updateShownLevelNumber() - await this.writeSaveData() - } - async goToLevel(newLevelN: number): Promise { - if (!this.loadedSet) - throw new Error("Can't load the previous level of a set without a set.") - - const newRecord = await this.loadedSet.goToLevel(newLevelN) - // This is the first level of the set - if (!newRecord) { - return - } - - this.loadedLevel = newRecord.levelData! - this.updateShownLevelNumber() - await this.writeSaveData() - } - /** - * Resets the current level, complete with rerunning the script - */ - async resetLevel(): Promise { - if (this.loadedSet) { - await this.loadNextLevel({ type: "retry" }) - } - await this.reloadLevel() - } - /** - * Reload level by asking the current page to re-make the `loadedLevel`. - */ - async reloadLevel(): Promise { - this.currentPage.loadLevel?.(this) - } - saveAttempt(attempt: protobuf.IAttemptInfo): void | Promise { - if (!this.loadedSet) return - const levelInfo = - this.loadedSet.seenLevels[this.loadedSet.currentLevel]?.levelInfo - if (!levelInfo) - throw new Error("The current level doesn't have a level record, somehow.") - - levelInfo.attempts ??= [] - levelInfo.attempts.push(attempt) - return this.writeSaveData() - } - async writeSaveData(): Promise { - if (!this.loadedSet) return - const scriptState = this.loadedSet.scriptRunner.state - const scriptTitle = scriptState.scriptTitle - if (!scriptTitle) - throw new Error("The loaded set does not have an identifier set.") - - await saveSetInfo(this.loadedSet.toSetInfo(), scriptTitle) - } - async loadSolution(sol: protobuf.ISolutionInfo): Promise { - if (!this.currentPage.loadSolution) - throw new Error("Current page doesn't support solution playback.") - await this.currentPage.loadSolution(this, sol) - } - setTheme(theme: ThemeColors): void { - applyTheme(document.body, theme) - } - updateTheme(): void { - this.setTheme(this.settings.mainTheme) - } - async reloadSettings(): Promise { - this.updateTheme() - await updatePagerTileset(this) - this.currentPage.updateSettings?.(this) - } - async saveSettings(newSettings: Settings): Promise { - this.settings = newSettings - await saveSettings(this.settings) - await this.reloadSettings() - } - async loadSettings(): Promise { - this.settings = await loadSettings() - this.settings = { ...defaultSettings, ...this.settings } - this.reloadSettings() - } - updatingPageUrl = false - determinePageUrl(subpage: string, queryParams: Record): URL { - const newUrl = new URL(location.toString()) - const page = this.currentPage - if (page.pagePath === null) { - newUrl.hash = "" - newUrl.search = "" - return newUrl - } - let hash = `#/${page.pagePath}` - if (page.requiresLoaded === "set" || page.requiresLoaded === "level") { - let setName = this.loadedSetIdent - if (setName === null) { - setName = this.loadedSet !== null ? "*prompt-set" : "*prompt-level" - } - hash += `/${setName}` - } - if (page.requiresLoaded === "level") { - hash += `/${this.loadedSet?.currentLevel ?? 1}` - } - if (subpage !== "") { - hash += `/${subpage}` - } - newUrl.hash = hash - if (Object.keys(queryParams).length !== 0) { - newUrl.search = `?${new URLSearchParams(queryParams)}` - } else { - newUrl.search = "" - } - return newUrl - } - updatePageUrl( - subpage: string = "", - queryParams: Record = {} - ) { - const newLocation = this.determinePageUrl(subpage, queryParams) - this.updatingPageUrl = true - history.pushState(null, "", newLocation) - this.updatingPageUrl = false - } -} diff --git a/gamePlayer/src/pages/SetSelectorPage.tsx b/gamePlayer/src/pages/SetSelectorPage.tsx new file mode 100644 index 00000000..c8d28ad3 --- /dev/null +++ b/gamePlayer/src/pages/SetSelectorPage.tsx @@ -0,0 +1,34 @@ +import { atom, useAtom } from "jotai" + +const altLogoAtom = atom(false) + +function Header() { + const [altLogo, setAltLogo] = useAtom(altLogoAtom) + return ( +
+ setAltLogo(val => !val)} + draggable={false} + /> +
+

+ NotCC +

+

+ A scoreboard-legal Chip's Challenge 2® emulator. +

+
+
+ ) +} + +export function SetSelectorPage() { + return ( +
+
+
Todo!
+
+ ) +} diff --git a/gamePlayer/src/pages/basePlayer.ts b/gamePlayer/src/pages/basePlayer.ts deleted file mode 100644 index 9de44044..00000000 --- a/gamePlayer/src/pages/basePlayer.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { - actorDB, - createLevelFromData, - GameState, - Item, - KeyInputs, - Layer, - LevelState, -} from "@notcc/logic" -import { Pager } from "../pager" -import { Renderer } from "../renderer" -import { protobuf } from "@notcc/logic" - -// TODO Smart TV inputs -// TODO Customizable inputs in general -export const keyToInputMap: Record = { - ArrowUp: "up", - ArrowRight: "right", - ArrowDown: "down", - ArrowLeft: "left", - KeyZ: "drop", - KeyX: "rotateInv", - KeyC: "switchPlayable", -} - -export function isValidKey(code: string): boolean { - return code in keyToInputMap -} - -export function isValidStartKey(code: string): boolean { - return isValidKey(code) || code === "Space" -} - -export interface TextOutputs { - chips: HTMLElement - time: HTMLElement - bonusPoints: HTMLElement -} - -const KnownGlitches = protobuf.GlitchInfo.KnownGlitches -export const glitchNames: Record = { - [KnownGlitches.INVALID]: "???", - [KnownGlitches.DESPAWN]: "Despawn", - [KnownGlitches.SIMULTANEOUS_CHARACTER_MOVEMENT]: - "Simultaneous character movement", - [KnownGlitches.DYNAMITE_EXPLOSION_SNEAKING]: "Dynamite explosion sneaking", -} - -export const nonLegalGlitches: protobuf.GlitchInfo.KnownGlitches[] = [ - KnownGlitches.SIMULTANEOUS_CHARACTER_MOVEMENT, - KnownGlitches.DYNAMITE_EXPLOSION_SNEAKING, -] - -export const playerPageBase = { - requiresLoaded: "level" as const, - basePage: null as HTMLElement | null, - textOutputs: null as TextOutputs | null, - renderer: null as Renderer | null, - viewportArea: null as HTMLElement | null, - setupPage(pager: Pager, page: HTMLElement): void { - if (pager.tileset === null) throw new Error("Tileset required") - this.basePage = page - const viewportCanvas = - page.querySelector(".viewportCanvas")! - const inventoryCanvas = - page.querySelector(".inventoryCanvas")! - this.renderer = new Renderer(pager.tileset, viewportCanvas, inventoryCanvas) - this.textOutputs = { - chips: page.querySelector(".chipsText")!, - time: page.querySelector(".timeLeftText")!, - bonusPoints: page.querySelector(".bonusPointsText")!, - } - if ( - !this.textOutputs.chips || - !this.textOutputs.time || - !this.textOutputs.bonusPoints - ) - throw new Error("Could not find the text output elements.") - this.viewportArea = page.querySelector(".viewportArea") - window.addEventListener("resize", () => { - this.updateTileScale() - }) - }, - currentLevel: null as LevelState | null, - loadLevel(pager: Pager): void { - pager.updatePageUrl() - const level = pager.loadedLevel - if (!level) throw new Error("No level to load") - if (!this.renderer) throw new Error("No renderer set") - - this.currentLevel = createLevelFromData(level) - this.initScriptLevelState(pager) - this.renderer.level = this.currentLevel - this.renderer.cameraSize = this.currentLevel.cameraType - // Internal viewport size (unaffected by scale, but depends on the camera size) - this.renderer.updateTileSize() - // Tile scale, automatically make things bigger if the page size allows - this.updateTileScale() - // External viewport camera size, affected by eg. the legal player overlays - this.updateViewportCameraSize() - this.updateTextOutputs() - }, - initScriptLevelState(pager: Pager) { - const state = pager.loadedSet?.scriptRunner.getMapInitState() - const level = this.currentLevel - if (!state || !level) return - if (state.timeLeft !== undefined) { - level.timeLeft = state.timeLeft * 60 - } - let player = level.selectedPlayable - if (state.playableEnterN !== undefined) { - player = level.playables[state.playableEnterN] - for (const removedPlayer of level.playables) { - if (removedPlayer !== player) { - removedPlayer.destroy(null, null) - } - } - player.respawn() - level.gameState = GameState.PLAYING - } - function giveItem(id: string) { - if (!player) return - const tile = level!.field[0][0] - const ogItems = [...tile[Layer.ITEM]] - for (const ogItem of ogItems) { - ogItem.despawn() - } - const item = new actorDB[id](level!, [0, 0]) as Item - item.pickup(player) - for (const ogItem of ogItems) { - ogItem.respawn() - } - } - if (!player) return - for (const [color, n] of Object.entries(state.inventoryKeys ?? {})) { - const id = `key${color[0].toUpperCase()}${color.substring(1)}` - giveItem(id) - const ent = player.inventory.keys[id] - ent.amount = n - } - for (const id of state.inventoryTools ?? []) { - giveItem(id!) - } - }, - extraTileScale: [0, 0] as [number, number], - determineTileScale(): number { - if (!this.renderer || !this.renderer.cameraSize) - throw new Error("Can't determine the tile scale without the renderer.") - - const bodySize = document.body.getBoundingClientRect() - let availableWidth = bodySize.width, - // eslint-disable-next-line prefer-const - availableHeight = bodySize.height - - const tileSize = this.renderer.tileset.tileSize - - const sidebarWidth = document - .querySelector(".sidebar")! - .getBoundingClientRect().width - - availableWidth -= sidebarWidth - - const playerTWidth = - this.renderer.cameraSize.width + this.extraTileScale[0], - playerTHeight = this.renderer.cameraSize.height + this.extraTileScale[1] - const playerBaseWidth = playerTWidth * tileSize, - playerBaseHeight = playerTHeight * tileSize - - let scale = Math.min( - availableWidth / playerBaseWidth, - availableHeight / playerBaseHeight - ) - scale *= 0.95 - if (scale < 0.25) { - // If we can't fit the camera at *quarter scale*, just do whatever fits - } else if (scale < 1) { - // Snap to nearest quarter if we can't fit the camera - scale = scale - (scale % 0.25) - } else { - scale = Math.floor(scale) - } - return scale - }, - updateTileScale(): void { - const page = this.basePage - page!.style.setProperty( - "--tile-scale", - this.determineTileScale().toString() - ) - this.updateRender() - }, - updateViewportCameraSize(): void { - if (!this.viewportArea) throw new Error("Viewport missing") - if (!this.currentLevel) throw new Error("Current level missing") - this.viewportArea.style.setProperty( - "--level-camera-width", - this.renderer!.cameraSize!.width.toString() - ) - this.viewportArea.style.setProperty( - "--level-camera-height", - this.renderer!.cameraSize!.height.toString() - ) - }, - updateTextOutputs(): void { - if (!this.textOutputs) return - this.textOutputs.chips.textContent = this.currentLevel!.chipsLeft.toString() - this.textOutputs.bonusPoints.textContent = - this.currentLevel!.bonusPoints.toString() - const currentTime = this.currentLevel!.timeLeft - this.textOutputs.time.textContent = `${ - this.currentLevel!.timeFrozen ? "❄" : "" - }${Math.ceil(currentTime / 60)}s` - }, - getInput(): KeyInputs { - throw new Error("Sorry for the antipattern, but please implement this!") - }, - updateLogic(): void { - const level = this.currentLevel - if (level === null) - throw new Error("Can't update the level without a level.") - level.gameInput = this.getInput() - level.tick() - this.updateTextOutputs() - }, - updateRender(): void { - this.renderer!.frame() - }, - preventNonLegalGlitches: true, - preventSimultaneousMovement: true, - updateSettings(pager: Pager): void { - if (!pager.tileset) - throw new Error("Can't update the tileset without a tileset.") - if (!this.renderer) - throw new Error("Can't update the tileset without a renderer.") - const page = this.basePage - if (!page) - throw new Error("Can't update the tileset wihout being opened first.") - - this.renderer.tileset = pager.tileset - this.renderer.updateTileSize() - page.style.setProperty( - "--base-tile-size", - `${pager.tileset.tileSize.toString()}px` - ) - this.updateTileScale() - this.preventNonLegalGlitches = pager.settings.preventNonLegalGlitches - this.preventSimultaneousMovement = - pager.settings.preventSimultaneousMovement - }, -} diff --git a/gamePlayer/src/pages/exaPlayer.ts b/gamePlayer/src/pages/exaPlayer.ts deleted file mode 100644 index 544f43cf..00000000 --- a/gamePlayer/src/pages/exaPlayer.ts +++ /dev/null @@ -1,479 +0,0 @@ -import { - calculateLevelPoints, - GameState, - InputProvider, - KeyInputs, - keyInputToChar, - LevelState, - makeEmptyInputs, - Route, - RouteFileInputProvider, - secondaryActions, - protobuf, - SolutionInfoInputProvider, - Direction, -} from "@notcc/logic" -import clone from "clone" -import { Pager } from "../pager" -import { showAlert } from "../simpleDialogs" -import { showLoadPrompt, showSavePrompt } from "../saveData" -import { KeyListener, sleep, TimeoutTimer } from "../utils" -import { isValidStartKey, keyToInputMap, playerPageBase } from "./basePlayer" -import { registerPage } from "../const" -import { getRRRoutes, identifyRRPack } from "../railroad" -import { ExaIntegerTimeRounding } from "../settings" - -// Wait for a tick for diagonal inputs -const AUTO_DIAGONALS_TIMEOUT = 1 / 20 - -// Make a snapshot every second -const LEVEL_SNAPSHOT_PERIOD = 60 - -interface LevelSnapshot { - level: LevelState -} - -// TODO move this to @notcc/logic maybe? -function cloneLevel(level: LevelState): LevelState { - // Don't clone the static level data - // TODO Maybe don't always have a copy of the whole level map in the level state? - // What's it doing there, anyways? - const levelData = level.levelData - delete level.levelData - const inputProvider = level.inputProvider - delete level.inputProvider - const newLevel = clone(level, true) - newLevel.levelData = levelData - newLevel.inputProvider = inputProvider - level.levelData = levelData - level.inputProvider = inputProvider - return newLevel -} - -const integerFormatters: Record< - ExaIntegerTimeRounding, - (time: number) => number -> = { - floor: time => Math.floor(time), - "floor + 1": time => Math.floor(time) + 1, - ceil: time => Math.ceil(time), -} - -const subtickStrings = ["", "⅓", "⅔"] - -export const exaPlayerPage = { - ...playerPageBase, - pagePath: "exa", - pageId: "exaPlayerPage", - recordedMovesArea: null as HTMLSpanElement | null, - composingPreviewArea: null as HTMLSpanElement | null, - levelN: -1, - setupPage(pager: Pager, page: HTMLElement): void { - playerPageBase.setupPage.call(this, pager, page) - this.recordedMovesArea = - page.querySelector(".recordedMoves") - this.composingPreviewArea = - page.querySelector(".composingPreview") - this.totalScoreText = - page.querySelector(".totalScoreText") - }, - loadLevel(pager: Pager, initIp?: InputProvider): void { - playerPageBase.loadLevel.call(this, pager) - const level = this.currentLevel - if (level === null) - throw new Error("The player page base didn't set the level correctly") - level.forcedPerspective = true - this.renderer!.cameraSize = { - width: Math.min(level.width, 32), - height: Math.min(level.height, 32), - screens: 1, - } - this.recordedMoves = [] - this.visualMoves = [] - this.areMovesPlayerInput = [] - const localIp = new RouteFileInputProvider(this.recordedMoves) - level.inputProvider = initIp ?? localIp - while (level.subtick !== 1) { - level.tick() - } - this.updateTextOutputs() - this.snapshots = [ - { - level: cloneLevel(this.currentLevel!), - }, - ] - this.currentLevel!.inputProvider = localIp - this.levelN = pager.loadedSet?.currentLevel ?? 0 - this.renderer!.updateTileSize() - // Tile scale, automatically make things bigger if the page size allows - this.updateTileScale() - // External viewport camera size, affected by eg. the legal player overlays - this.updateViewportCameraSize() - // Advance the game by two subtics, so that we can input immediately - this.updateRender() - this.updateRecordedMovesArea() - this.updateTextOutputs() - }, - doTick(level: LevelState): void { - level.tick() - if (level.gameState !== GameState.PLAYING) return - level.tick() - if (level.gameState !== GameState.PLAYING) return - level.tick() - }, - getRouteTicks(): number { - return ( - this.currentLevel!.currentTick + - (this.currentLevel!.subtick === 2 ? 1 : 0) - ) - }, - updateRecordedMovesArea(): void { - this.recordedMovesArea!.textContent = this.visualMoves - .slice(0, this.getRouteTicks()) - .join("") - }, - totalScoreText: null as HTMLOutputElement | null, - updateTextOutputs(): void { - playerPageBase.updateTextOutputs.call(this) - const time = this.currentLevel!.timeLeft - const integerFormatter = integerFormatters[this.integerTimeRounding] - const timeFrozen = this.currentLevel!.timeFrozen ? "❄" : "" - const timeInteger = integerFormatter(time / 60) - const timeDecimal = (Math.floor((time % 60) / 3) * 5) - .toString() - .padStart(2, "0") - const timeSubtick = time % 3 - this.textOutputs!.time.textContent = `${timeFrozen}${timeInteger}.${timeDecimal}${subtickStrings[timeSubtick]}s` - - this.totalScoreText!.textContent = calculateLevelPoints( - this.levelN, - Math.ceil(time / 60), - this.currentLevel!.bonusPoints - ).toString() - }, - applyInput(): void { - const level = this.currentLevel! - do { - this.doTick(level) - this.autoAddSnapshot() - } while ( - level.gameState === GameState.PLAYING && - level.selectedPlayable!.cooldown > 0 - ) - }, - // An alternative version of `updateLogic` which operates on ticks instead of subticks - // We don't use the native `updateLogic`. - appendInput(input: KeyInputs): void { - const level = this.currentLevel! - const couldMoveFirstTick = level.selectedPlayable!.getCanMove() - - this.cropToMovePosition() - - const moves: string[] = [] - const addMove = (char: string) => { - this.recordedMoves.push(char) - moves.push(char) - } - - addMove( - couldMoveFirstTick - ? keyInputToChar(input, false) - : keyInputToChar(input, false, true) + "-" - ) - let ticksApplied = 0 - - do { - if (ticksApplied > 0) { - addMove("-") - } - this.doTick(level) - ticksApplied += 1 - this.autoAddSnapshot() - } while ( - level.gameState === GameState.PLAYING && - level.selectedPlayable!.cooldown > 0 - ) - if (moves.length === 4 && couldMoveFirstTick) { - this.visualMoves.push(keyInputToChar(input, true), "", "", "") - } else { - this.visualMoves.push(...moves) - } - this.areMovesPlayerInput.push( - true, - ...new Array(moves.length - 1).fill(false) - ) - this.updateRender() - }, - // Automatically skip in time until *something* can be done - autoSkip(): void { - const level = this.currentLevel! - while ( - level.gameState === GameState.PLAYING && - !level.selectedPlayable!.canDoAnything() - ) { - this.appendInput(makeEmptyInputs()) - } - this.updateRecordedMovesArea() - this.updateTextOutputs() - this.updateRender() - }, - snapshots: [] as LevelSnapshot[], - autoAddSnapshot(): void { - const level = this.currentLevel - if (level === null) throw new Error("Current level must be set") - const currentTime = level!.currentTick * 3 + level!.subtick - const lastSnapshot = this.snapshots[this.snapshots.length - 1] - const lastSnapshotTime = - lastSnapshot.level.currentTick * 3 + lastSnapshot.level.subtick - - if (currentTime - lastSnapshotTime < LEVEL_SNAPSHOT_PERIOD) return - this.snapshots.push({ - level: cloneLevel(level), - }) - }, - seekTo(newPosition: number, snapToMove = true): void { - let targetPosition: number - if (snapToMove) { - targetPosition = this.areMovesPlayerInput.lastIndexOf(true, newPosition) - } else { - targetPosition = newPosition - } - // There will always be the snapshot of the initial level, so don't worry about the non-null assertion - const closestSnapshot = [...this.snapshots] - .reverse() - .find(snap => snap.level.currentTick <= targetPosition)! - this.currentLevel = cloneLevel(closestSnapshot.level) - const level = this.currentLevel - this.renderer!.level = this.currentLevel - while (targetPosition > level.currentTick) { - this.doTick(level) - } - this.updateRecordedMovesArea() - this.updateRender() - this.updateTextOutputs() - }, - undo(): void { - const level = this.currentLevel! - if (level.currentTick <= 0) return - this.seekTo(this.getRouteTicks() - 1) - }, - redo(): void { - const level = this.currentLevel - if (level === null) throw new Error("Current level required") - if (level.currentTick >= this.recordedMoves.length) return - this.applyInput() - this.updateRecordedMovesArea() - this.updateTextOutputs() - this.updateRender() - }, - // TODO Use a single struct instead Python-esqe billion arrays? - recordedMoves: [] as string[], - visualMoves: [] as string[], - areMovesPlayerInput: [] as boolean[], - cropToMovePosition(): void { - const movePos = this.getRouteTicks() - this.recordedMoves.splice(movePos) - this.visualMoves.splice(movePos) - this.areMovesPlayerInput.splice(movePos) - this.snapshots = this.snapshots.filter( - snap => snap.level.currentTick <= movePos - ) - }, - async transcribeInputs(ip: InputProvider) { - const level = this.currentLevel! - let moveCount = 0 - while (!ip.outOfInput(level)) { - this.appendInput(ip.getInput(level)) - if (level.gameState !== GameState.PLAYING) break - moveCount += 1 - if (moveCount % 100 === 0) { - this.updateRecordedMovesArea() - this.updateRender() - this.updateTextOutputs() - // Have a breather every 100 moves - await sleep(0) - } - } - this.updateRecordedMovesArea() - this.updateRender() - this.updateTextOutputs() - }, - async loadSolution(pager: Pager, sol: protobuf.ISolutionInfo) { - const ip = new SolutionInfoInputProvider(sol) - this.loadLevel(pager, ip) - await this.transcribeInputs(ip) - }, - async importRoute(pager: Pager): Promise { - const file = ( - await showLoadPrompt("Import route", { - filters: [{ extensions: ["json", "route"], name: "Route file" }], - }) - )[0] - const routeData = await file.text() - const route: Route = JSON.parse(routeData) - if (route.Rule === undefined) { - showAlert("This doesn't seem like a route file") - return - } - if (route.Rule === "LYNX" || route.Rule === "MS") { - await showAlert( - "Warning: Adapting a Lynx or MS route to Steam. Best effort, so don't expect it to work..." - ) - } else if (route.Rule !== "STEAM") { - showAlert("Unknown ruleset") - return - } - const ip = new RouteFileInputProvider(route) - this.loadLevel(pager, ip) - // TODO compare route.For metadata - await this.transcribeInputs(ip) - }, - async exportRoute(pager: Pager): Promise { - const level = this.snapshots[0].level - const levelN = pager.getLevelNumber() - const levelTitle = pager.loadedLevel!.name - if (levelN === "not in level") throw new Error("Can't be happening") - const route: Route = { - Rule: "STEAM", - Encode: "UTF-8", - Moves: this.recordedMoves.join(""), - ExportApp: "ExaCC", - For: - levelN === "not in set" - ? { LevelName: levelTitle } - : { - LevelName: levelTitle, - LevelNumber: levelN, - Set: pager.loadedSet!.scriptRunner.state.scriptTitle!, - }, - Blobmod: level.blobPrngValue, - // When importing and exporting, convert RFF direction to be a string enum value, - // to keep compat with SuperCC - "Initial Slide": Direction[ - this.snapshots[0].level.randomForceFloorDirection - ] as unknown as Direction, - } - const routeString = JSON.stringify(route) - const routeBin = new TextEncoder().encode(routeString) - await showSavePrompt(routeBin, "Save route", { - filters: [{ extensions: ["route"], name: "Route file" }], - defaultPath: `./${levelTitle}.route`, - }) - }, - currentInput: makeEmptyInputs(), - keyListener: null as KeyListener | null, - autoDiagonalsTimer: null as TimeoutTimer | null, - updateCompositingPreview(): void { - this.composingPreviewArea!.textContent = keyInputToChar( - this.currentInput, - false, - true - ) - }, - commitCurrentInput(): void { - this.autoDiagonalsTimer = null - this.appendInput(this.currentInput) - this.updateRecordedMovesArea() - this.updateRender() - this.updateTextOutputs() - this.currentInput = makeEmptyInputs() - this.updateCompositingPreview() - }, - setupKeyListener(): void { - this.keyListener = new KeyListener(ev => { - if (!isValidStartKey(ev.code)) return - if (this.currentLevel?.gameState !== GameState.PLAYING) return - let inputType = keyToInputMap[ev.code] - if (inputType in this.currentInput) { - inputType = inputType as keyof KeyInputs - // Holding a cardinal direction should always move in that direction, so thus we shouldn't be able - // to flip if that input is actually gonna be a part of the keyinputs. - if ( - inputType === "up" || - inputType === "right" || - inputType === "down" || - inputType === "left" - ) { - this.currentInput[inputType] = true - } else { - this.currentInput[inputType] = !this.currentInput[inputType] - } - } - if ( - !secondaryActions.includes(inputType) && - this.autoDiagonalsTimer === null - ) { - this.autoDiagonalsTimer = new TimeoutTimer( - () => this.commitCurrentInput(), - AUTO_DIAGONALS_TIMEOUT - ) - } - this.updateCompositingPreview() - }) - }, - open(pager: Pager): void { - if (!pager.loadedLevel) - throw new Error("Cannot open the level player page with a level to play.") - this.loadLevel(pager) - this.updateSettings(pager) - this.updateRender() - this.setupKeyListener() - }, - integerTimeRounding: "ceil" as ExaIntegerTimeRounding, - updateSettings(pager: Pager): void { - playerPageBase.updateSettings.call(this, pager) - this.integerTimeRounding = pager.settings.exaIntegerTimeRounding - this.updateTextOutputs() - }, - close(): void { - this.keyListener?.remove() - this.keyListener = null - this.autoDiagonalsTimer?.cancel() - this.autoDiagonalsTimer = null - }, - extraTileScale: [ - 0.5 + // Padding - // Camera - 0.5 + // Padding - 0.25 + // Gap - 16, // Stats - 0.5 + // Padding - // Camera - 0.5, // Padding - ] as [number, number], - async setNavigationInfo( - pager: Pager, - _subpage: string, - queryParams: Record - ) { - const solutionId = queryParams["load-solution"] - if (!solutionId) return - const setName = pager.loadedSet?.scriptRunner.state.scriptTitle! - const packName = setName ? identifyRRPack(setName) : null - const level = pager.loadedLevel! - - let ip: InputProvider | undefined - - if (solutionId === "builtin") { - ip = - level.associatedSolution && - new SolutionInfoInputProvider(level.associatedSolution) - } else if (packName !== null && solutionId.startsWith("railroad-")) { - const railroadId = solutionId.slice("railroad-".length) - const levels = await getRRRoutes(packName) - const rrRoute = levels - .find(lvl => lvl.title.toLowerCase() === level.name?.toLowerCase()) - ?.routes.find(route => route.id === railroadId) - if (rrRoute) { - ip = new RouteFileInputProvider(rrRoute.moves) - } - } - - if (ip) { - this.loadLevel(pager, ip) - await this.transcribeInputs(ip) - } - }, -} - -registerPage(exaPlayerPage) diff --git a/gamePlayer/src/pages/levelPlayer.ts b/gamePlayer/src/pages/levelPlayer.ts deleted file mode 100644 index 48634ba0..00000000 --- a/gamePlayer/src/pages/levelPlayer.ts +++ /dev/null @@ -1,406 +0,0 @@ -import { - AttemptTracker, - GameState, - KeyInputs, - ScriptLegalInventoryTool, - protobuf, - SolutionInfoInputProvider, -} from "@notcc/logic" -import { Pager } from "../pager" -import { - AnimationTimer, - IntervalTimer, - KeyListener, - setAttributeExistence, - AutoRepeatKeyListener, - AutoRepeatKeyState, -} from "../utils" -import { setSelectorPage } from "./setSelector" -import { AudioSfxManager } from "../sfx" -import { - isValidKey, - isValidStartKey, - keyToInputMap, - playerPageBase, - glitchNames, - nonLegalGlitches, -} from "./basePlayer" -import { - makeChoiceDialog, - showAlert, - waitForDialogSubmit, -} from "../simpleDialogs" -import { registerPage } from "../const" - -interface OverlayButtons { - restart: HTMLElement - nonLegalRestart: HTMLElement - nextLevel: HTMLElement - scores: HTMLElement - explodeJupiter: HTMLElement - unpause: HTMLElement - gzLeveList: HTMLElement - gzSetSelector: HTMLElement -} - -export const levelPlayerPage = { - ...playerPageBase, - pagePath: "play", - pageId: "levelPlayerPage", - keyListener: null as AutoRepeatKeyListener | null, - // Binding HTML stuff - overlayButtons: null as OverlayButtons | null, - gameOverlay: null as HTMLElement | null, - overlayLevelName: null as HTMLElement | null, - viewportArea: null as HTMLElement | null, - hintBox: null as HTMLElement | null, - nonLegalGlitchName: null as HTMLElement | null, - setupPage(pager: Pager, page: HTMLElement): void { - playerPageBase.setupPage.call(this, pager, page) - this.basePage = page - this.overlayButtons = { - restart: page.querySelector("#restartButton")!, - nonLegalRestart: page.querySelector("#nonLegalRestartButton")!, - explodeJupiter: page.querySelector("#explodeJupiterButton")!, - nextLevel: page.querySelector("#nextLevelButton")!, - scores: page.querySelector("#scoresButton")!, - unpause: page.querySelector("#unpauseButton")!, - gzLeveList: page.querySelector("#gzLevelListButton")!, - gzSetSelector: page.querySelector("#gzSetSelectorButton")!, - } - - if ( - !this.overlayButtons.scores || - !this.overlayButtons.explodeJupiter || - !this.overlayButtons.restart || - !this.overlayButtons.nonLegalRestart || - !this.overlayButtons.nextLevel || - !this.overlayButtons.unpause || - !this.overlayButtons.gzLeveList || - !this.overlayButtons.gzSetSelector - ) - throw new Error("Could not find the completion button elements.") - this.overlayButtons.nextLevel.addEventListener("click", () => { - this.openNextLevel(pager) - }) - this.overlayButtons.restart.addEventListener("click", async () => { - pager.resetLevel() - }) - this.overlayButtons.nonLegalRestart.addEventListener("click", async () => { - pager.resetLevel() - }) - this.overlayButtons.unpause.addEventListener("click", async () => { - this.togglePaused() - }) - this.gameOverlay = page.querySelector("#levelViewportOverlay")! - this.overlayLevelName = page.querySelector("#overlayLevelName") - this.hintBox = page.querySelector("#hintBox") - this.nonLegalGlitchName = page.querySelector( - "#nonLegalGlitchName" - ) - this.submitAttempt = this.submitAttemptUnbound.bind(this, pager) - this.sfxManager = new AudioSfxManager() - // TODO Pre-fetch sfx and sfx customization - this.sfxManager.fetchDefaultSounds("./defoSfx") - }, - // Setting up level state and the game state machine - // Load -> - // -> Preplay -> - // -> Play .. (one of:) - // -> Pause -> Play - // -> Win -> Load or Preplay - // -> Lose -> Preplay - gameState: GameState.PLAYING, - isPaused: false, - isPreplay: false, - isGz: false, - isNonLegal: false, - preplayKeyListener: null as KeyListener | null, - sfxManager: null as AudioSfxManager | null, - loadLevel(pager: Pager): void { - playerPageBase.loadLevel.call(this, pager) - this.basePage!.classList.remove("solutionPlayback") - if (pager.loadedSet?.inPostGame) return - if (this.renderer === null || this.currentLevel === null) - throw new Error( - "Looks like the base player page didn't set the level correctly." - ) - - this.currentLevel.sfxManager = this.sfxManager - this.sfxManager?.stopAllSfx() - this.gameState = GameState.PLAYING - this.isPaused = false - this.isGz = false - this.isPreplay = true - this.isNonLegal = false - this.updateOverlayState() - this.preplayKeyListener?.remove() - this.preplayKeyListener = new KeyListener((ev: KeyboardEvent) => { - if (isValidStartKey(ev.code)) { - ev.preventDefault() - ev.stopPropagation() - this.endPreplay() - } - }) - if (this.overlayLevelName) { - const levelN = pager.getLevelNumber() - this.overlayLevelName.textContent = `${ - levelN !== "not in set" ? `#${levelN}: ` : "" - }${pager.loadedLevel!.name ?? "Unnamed level"}` - } - this.attemptTracker = new AttemptTracker( - this.currentLevel.blobPrngValue, - this.currentLevel.randomForceFloorDirection, - pager.loadedSet?.scriptRunner.state - ) - this.currentLevel.onGlitch = glitch => { - if (!this.preventNonLegalGlitches) return - if (glitch.glitchKind && nonLegalGlitches.includes(glitch.glitchKind)) { - this.isNonLegal = true - this.nonLegalGlitchName!.textContent = glitchNames[glitch.glitchKind] - this.updateOverlayState() - this.findCurrentMainButton()?.focus() - } - } - }, - updateOverlayState(): void { - this.gameOverlay!.setAttribute( - "data-game-state", - GameState[this.gameState].toLowerCase() - ) - setAttributeExistence(this.gameOverlay!, "data-paused", this.isPaused) - setAttributeExistence(this.gameOverlay!, "data-preplay", this.isPreplay) - setAttributeExistence(this.gameOverlay!, "data-gz", this.isGz) - setAttributeExistence(this.gameOverlay!, "data-nonlegal", this.isNonLegal) - }, - endPreplay(): void { - this.isPreplay = false - this.updateOverlayState() - this.preplayKeyListener?.remove() - this.preplayKeyListener = null - }, - togglePaused(): void { - if ( - this.gameState !== GameState.PLAYING || - this.isPreplay || - this.isGz || - this.isNonLegal - ) - return - - this.isPaused = !this.isPaused - this.updateOverlayState() - }, - // Transition from win - - async openNextLevel(pager: Pager): Promise { - if (!pager.loadedSet) { - await showAlert("Congratulations on clearing the level!") - pager.openPage(setSelectorPage) - return - } - const level = this.currentLevel! - const playable = level.selectedPlayable! - let exitN = 0 - let exitFound = false - for (const tile of level.tiles(false)) { - const hasExit = !!tile.findActor(actor => - actor.getCompleteTags("tags").includes("exit") - ) - if (!hasExit) continue - exitN += 1 - if (playable.tile === tile) { - exitFound = true - break - } - } - if (!exitFound) { - console.warn("Level won, but the player isn't on an exit tile??") - exitN = 0 - } - const keys = playable.inventory.keys - await pager.loadNextLevel({ - type: "win", - inventoryKeys: { - blue: keys.blueKey?.amount ?? 0, - green: keys.greenKey?.amount ?? 0, - red: keys.redKey?.amount ?? 0, - yellow: keys.yellowKey?.amount ?? 0, - }, - lastExitGender: playable.tags.includes("melinda") ? "female" : "male", - timeLeft: level.timeLeft, - lastExitN: exitN, - inventoryTools: playable.inventory.items.map( - item => item.id as ScriptLegalInventoryTool - ), - totalScore: 0, // TODO Track this - }) - - if (!pager.loadedLevel) return - this.loadLevel(pager) - }, - startPostPlay(state: GameState): void { - this.gameState = state - this.updateOverlayState() - this.findCurrentMainButton()?.focus() - }, - findCurrentMainButton(): HTMLButtonElement | null { - if (!this.gameOverlay) - throw new Error("The game overlay must be set to find the main button.") - - return ( - Array.from( - this.gameOverlay.querySelectorAll(".mainButton") - ).find(button => button.getBoundingClientRect().height !== 0) ?? null - ) - }, - // Managing the live level state - attemptTracker: null as AttemptTracker | null, - submitAttemptUnbound(pager: Pager): void { - if (!this.attemptTracker) return - const level = this.currentLevel! - pager.saveAttempt(this.attemptTracker.endAttempt(level)) - }, - submitAttempt: null as (() => void) | null, - updateTextOutputs(): void { - if (this.gameState !== GameState.PLAYING) return - playerPageBase.updateTextOutputs.call(this) - this.hintBox!.textContent = this.currentLevel!.getHint() ?? "" - }, - heldKeys: { - up: AutoRepeatKeyState.RELEASED, - right: AutoRepeatKeyState.RELEASED, - down: AutoRepeatKeyState.RELEASED, - left: AutoRepeatKeyState.RELEASED, - drop: AutoRepeatKeyState.RELEASED, - rotateInv: AutoRepeatKeyState.RELEASED, - switchPlayable: AutoRepeatKeyState.RELEASED, - } as Record, - updateReleases(): void { - for (const [key, shouldRelease] of Object.entries( - this.currentLevel!.releasedKeys - )) { - const inputKey = key as keyof KeyInputs - if (!shouldRelease) continue - if (this.heldKeys[inputKey] === AutoRepeatKeyState.HELD) { - this.heldKeys[inputKey] = AutoRepeatKeyState.RELEASED - } - } - }, - inputListener(code: string, state: AutoRepeatKeyState): void { - if (!isValidKey(code)) return - const keyInput = keyToInputMap[code] - this.heldKeys[keyInput] = state - }, - getInput(): KeyInputs { - const keyInputs: Partial = {} - for (const inputType of Object.values(keyToInputMap)) { - if ( - this.preventSimultaneousMovement && - inputType === "switchPlayable" && - this.heldKeys[inputType] - ) { - return { - up: false, - right: false, - down: false, - left: false, - drop: false, - rotateInv: false, - switchPlayable: true, - } - } - keyInputs[inputType] = !!this.heldKeys[inputType] - } - return keyInputs as KeyInputs - }, - updateLogic(): void { - const level = this.currentLevel - if (!level) throw new Error("Cannot update the level without a level.") - if ( - this.gameState === GameState.TIMEOUT || - this.isPaused || - this.isPreplay || - this.isGz || - this.isNonLegal - ) - return - playerPageBase.updateLogic.call(this) - this.attemptTracker?.recordAttemptStep(level.gameInput) - this.updateReleases() - if ( - this.gameState === GameState.PLAYING && - level.gameState !== GameState.PLAYING - ) { - this.startPostPlay(level.gameState) - this.submitAttempt?.() - } - }, - logicTimer: null as IntervalTimer | null, - renderTimer: null as AnimationTimer | null, - open(pager: Pager): void { - if (!pager.loadedLevel) - throw new Error("Cannot open the level player page with a level to play.") - this.loadLevel(pager) - this.updateSettings(pager) - this.updateTextOutputs() - this.logicTimer = new IntervalTimer(this.updateLogic.bind(this), 1 / 60) - this.renderTimer = new AnimationTimer(this.updateRender.bind(this)) - this.keyListener = new AutoRepeatKeyListener(this.inputListener.bind(this)) - }, - close(): void { - if (this.logicTimer) { - this.logicTimer.cancel() - this.logicTimer = null - } - if (this.renderTimer) { - this.renderTimer.cancel() - this.renderTimer = null - } - this.preplayKeyListener?.remove() - this.preplayKeyListener = null - this.currentLevel = null - this.keyListener?.remove() - this.keyListener = null - }, - async showInterlude(_pager: Pager, text: string): Promise { - const dialog = makeChoiceDialog(text, [["next", "Next"]], "Story") - dialog.showModal() - const listener = new KeyListener(ev => { - if (ev.code === "KeyN" && ev.shiftKey) { - dialog.querySelector("button")!.click() - } - }) - listener.listenInModals = true - await waitForDialogSubmit(dialog) - listener.remove() - }, - showGz(): void { - this.isGz = true - this.isPaused = false - this.isPreplay = false - this.isNonLegal = false - this.gameState = GameState.PLAYING - this.updateOverlayState() - }, - async loadSolution(pager: Pager, sol: protobuf.ISolutionInfo): Promise { - this.loadLevel(pager) - this.attemptTracker = null - this.currentLevel!.onGlitch = null - this.currentLevel!.inputProvider = new SolutionInfoInputProvider(sol) - this.basePage!.classList.add("solutionPlayback") - this.endPreplay() - }, - extraTileScale: [ - 0.25 + // Padding - // Camera - 0.25 + // Gap - 4 + // Inventory - 0.25, // Padding - 0.25 + // Padding - // Camera - 0.25, // Padding - ] as [number, number], -} - -registerPage(levelPlayerPage) diff --git a/gamePlayer/src/pages/loading.ts b/gamePlayer/src/pages/loading.ts deleted file mode 100644 index c9b93243..00000000 --- a/gamePlayer/src/pages/loading.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { pages, registerPage } from "../const" -import { lookupGbSet } from "../gliderbotSets" -import { Pager } from "../pager" -import { initSaveData } from "../saveData" -import { updatePagerTileset } from "../tilesets" -import { levelPlayerPage } from "./levelPlayer" -import { setSelectorPage } from "./setSelector" -import { loadDirSet, loadSet } from "../levelLoading" -import { findScriptName, LevelSetLoaderFunction } from "@notcc/logic" -import { waitForDialogSubmit } from "../simpleDialogs" - -function queryParamsToObj(query: string): Record { - return Object.fromEntries( - // TypeScript has inaccurate typings here for some reason?? - new URLSearchParams(query) as unknown as Iterable<[string, string]> - ) -} - -export async function openNotccUrl(pager: Pager): Promise { - if (pager.updatingPageUrl) return - const notccLocation = new URL("http://fake.notcc.path") - try { - notccLocation.href = `http://fake.notcc.path/${location.hash.slice(1)}` - } catch {} - - let [pageName, ...subpageParts] = notccLocation.pathname.split("/").slice(2) - const queryParams = { - ...queryParamsToObj(notccLocation.search), - ...queryParamsToObj(location.search), - } - - let pageToOpen = pages[pageName] ?? setSelectorPage - - // Support LL-style queryParam level loading - if (pageName === undefined && queryParams.level !== undefined) { - pageToOpen = levelPlayerPage - subpageParts = ["NotCCEmbed", "1"] - } - - if ( - pageToOpen.requiresLoaded === "set" || - pageToOpen.requiresLoaded === "level" - ) { - const setName = subpageParts.splice(0, 1)[0] - if (setName === undefined) - throw new Error( - "URI must specify set to use. Try using something like eg. /play/cc2lp1/1, instead of /play" - ) - if (setName in nonFreeSets) { - const setLoadingInfo = await showNonFreeDialog(setName) - if (setLoadingInfo === null) { - pageToOpen = setSelectorPage - } else { - pager.loadedSetIdent = setName - await loadSet(pager, setLoadingInfo[0], setLoadingInfo[1], true) - } - } else { - const gbSet = await lookupGbSet(setName) - if (gbSet === null) - throw new Error(`Gliderbot set with name "${setName}" not found`) - pager.loadedSetIdent = setName - await loadSet(pager, gbSet.loaderFunction, gbSet.mainScript, true) - } - } - - if (pageToOpen.requiresLoaded === "level") { - const levelNStr = subpageParts.splice(0, 1)[0] - if (levelNStr === undefined) - throw new Error( - "URI must specify level number to use. Try using something like eg. /play/cc2lp1/1, instead of /play/cc2lp1" - ) - let levelN = parseInt(levelNStr, 10) - - const set = pager.loadedSet! - - while (set.currentLevel < levelN) { - set.lastLevelResult = { type: "skip" } - await set.getNextRecord() - } - await set.goToLevel(levelN) - pager.loadedLevel = (await set.getCurrentRecord()).levelData! - } - - pager.openPage(pageToOpen) - pageToOpen.setNavigationInfo?.(pager, subpageParts.join("/"), queryParams) -} - -interface NonFreeSet { - scriptName: string - steamLink: string -} - -export const nonFreeSets: Record = { - cc1: { - scriptName: "Chips Challenge", - steamLink: "https://store.steampowered.com/app/346850/Chips_Challenge_1", - }, - cc2: { - scriptName: "Chips Challenge 2", - steamLink: "https://store.steampowered.com/app/348300/Chips_Challenge_2", - }, -} - -export function getNonFreeSetId(scriptName: string): string | null { - return ( - Object.entries(nonFreeSets).find( - ([_, val]) => val.scriptName === scriptName - )?.[0] ?? null - ) -} - -const nonFreeSetDialog = - document.querySelector("#nonFreeSetDialog")! - -async function showNonFreeDialog( - setName: string -): Promise<[LevelSetLoaderFunction, string] | null> { - const setInfo = nonFreeSets[setName] - const steamLink = - nonFreeSetDialog.querySelector("#nonFreeSteamLink")! - steamLink.href = setInfo.steamLink - nonFreeSetDialog.showModal() - const response = (await waitForDialogSubmit(nonFreeSetDialog, false)) as - | "load" - | "cancel" - if (response === "cancel") return null - const [loader, scriptPath] = await loadDirSet() - const scriptName = findScriptName((await loader(scriptPath, false)) as string) - if (scriptName !== setInfo.scriptName) { - throw new Error( - `Incorrect set provided: Expected set name "${setInfo.scriptName}", got "${scriptName}"` - ) - } - return [loader, scriptPath] -} - -export const loadingPage = { - pageId: "loadingPage", - pagePath: null, - requiresLoaded: "none" as const, - async open(pager: Pager): Promise { - await initSaveData() - try { - await pager.loadSettings() - } catch { - // Didn't load settings. Fine if this is the first time we're opening the game - } - - await updatePagerTileset(pager) - await openNotccUrl(pager) - }, -} - -registerPage(loadingPage) diff --git a/gamePlayer/src/pages/setSelector.ts b/gamePlayer/src/pages/setSelector.ts deleted file mode 100644 index 655c5c65..00000000 --- a/gamePlayer/src/pages/setSelector.ts +++ /dev/null @@ -1,323 +0,0 @@ -import { - LevelSet, - createLevelFromData, - findScriptName, - parseC2M, -} from "@notcc/logic" -import { Pager } from "../pager" -import stubLevel from "../levels/NotCC.c2m" -import { buildZipIndex, makeZipFileLoader } from "../fileLoaders" -import { - findEntryFilePath, - loadDirSet, - loadSet, - openLevel, -} from "../levelLoading" -import { getGbSets, metadataComparator } from "../gliderbotSets" -import { GliderbotSet } from "../gliderbotSets" -import { HTMLImage, Renderer, Tileset } from "../renderer" -import { - Comparator, - decodeBase64, - fetchImage, - instanciateTemplate, - mergeComparators, - unzlibAsync, -} from "../utils" -import { showLoadPrompt } from "../saveData" -import { showAlert } from "../simpleDialogs" -import { registerPage } from "../const" - -async function makeLevelSetPreview( - tileset: Tileset, - set: GliderbotSet -): Promise { - const levelSet = await LevelSet.constructAsync( - set.mainScript, - set.loaderFunction - ) - const levelRecord = await levelSet.getNextRecord() - if (!levelRecord) return null - const levelData = levelRecord.levelData! - const level = createLevelFromData(levelData) - const canvas = document.createElement("canvas") - const renderer = new Renderer(tileset, canvas) - renderer.viewportCanvas = canvas - renderer.level = level - renderer.cameraSize = level.cameraType - renderer.updateTileSize() - renderer.frame() - return canvas -} - -async function getSetThumbnail( - tileset: Tileset, - set: GliderbotSet -): Promise { - const thumbnailType = set.metadata.thumbnail - if (thumbnailType === undefined || thumbnailType === "image") { - try { - if (set.previewImage === null) throw new Error("No preview.png file") - const imageUrl = `${set.rootDirectory}/${set.previewImage}` - const image = await fetchImage(imageUrl) - return image - } catch (err) { - if (thumbnailType === "image") { - console.error("Failed to fetch image preview") - console.error(err) - return null - } - } - } - try { - const setPreview = await makeLevelSetPreview(tileset, set) - return setPreview - } catch (err) { - console.error("Failed to create a levelset preview.") - console.error(err) - return null - } -} - -const sortMethods = ["Last update", "Alphabetical"] as const -type SortMethod = (typeof sortMethods)[number] - -const sortMethodComparators: Record> = { - "Last update"(a, b) { - return +a.lastChanged - +b.lastChanged - }, - Alphabetical(a, b) { - return a.metadata.title.localeCompare(b.metadata.title) - }, -} - -export const setSelectorPage = { - pageId: "setSelectorPage", - pagePath: null, - requiresLoaded: "none" as const, - - async loadStubLevel(pager: Pager): Promise { - const levelBin = await (await fetch(stubLevel)).arrayBuffer() - const level = parseC2M(levelBin) - openLevel(pager, level) - }, - - async loadZip(pager: Pager, data: Uint8Array): Promise { - const filePaths = buildZipIndex(data) - const loader = makeZipFileLoader(data) - return loadSet(pager, loader, await findEntryFilePath(loader, filePaths)) - }, - async loadFile(pager: Pager, fileData: ArrayBuffer): Promise { - const magicString = Array.from(new Uint8Array(fileData).slice(0, 4), num => - String.fromCharCode(num) - ).join("") - // File types which aren't accepted by the file input (DATs, raw C2Ms) are - // here so that the Drag 'n Drop loader can use this. - if (magicString === "CC2M") { - const level = parseC2M(fileData) - openLevel(pager, level) - return - } else if ( - // ZIP - magicString === "PK\u{3}\u{4}" - ) { - await this.loadZip(pager, new Uint8Array(fileData)) - return - } else if ( - // DAT - magicString === "\xAC\xAA\x02\x00" || - magicString === "\xAC\xAA\x02\x01" || - magicString === "\xAC\xAA\x03\x00" || - magicString === "\xAC\xAA\x03\x01" - ) { - // TODO Proper simpleDialogs - showAlert("DAT files aren't supported, for now.") - return - } else { - const decoder = new TextDecoder("iso-8859-1") - const fileText: string = decoder.decode(fileData) - - if ( - // Explain how to use C2Gs - findScriptName(fileText) !== null - ) { - showAlert("You need to load the whole set, not just the C2G file.") - return - } - } - }, - setListEl: null as HTMLUListElement | null, - setLiTemlpate: null as HTMLTemplateElement | null, - setupPage(pager: Pager, page: HTMLElement): void { - const loadFileButton = page.querySelector("#loadFile")! - loadFileButton.addEventListener("click", async () => { - const files = await showLoadPrompt("Load level file", { - filters: [ - { name: "C2M level file", extensions: ["c2m"] }, - { name: "ZIP levelset archive", extensions: ["zip"] }, - ], - }) - const file = files[0] - const arrayBuffer = await file.arrayBuffer() - this.loadFile(pager, arrayBuffer) - }) - const loadDirectoryButton = - page.querySelector("#loadDirectory")! - loadDirectoryButton.addEventListener("click", async () => { - const [loader, path] = await loadDirSet() - await loadSet(pager, loader, path) - }) - this.setListEl = page.querySelector("#setList") - this.setLiTemlpate = - page.querySelector("#setLiTemplate") - if (!this.setListEl || !this.setLiTemlpate) { - throw new Error("Can't find a required document element.") - } - this.generateSetLis(pager) - }, - open(pager: Pager): void { - pager.loadedLevel = null - pager.loadedSet = null - pager.loadedSetIdent = null - pager.updateShownLevelNumber() - if (!this.loadedParamLevel) { - this.loadedParamLevel = true - this.loadParamLevel(pager) - } - }, - loadedParamLevel: false, - async loadParamLevel(pager: Pager) { - const searchParams = new URLSearchParams(location.search) - - const levelDataBased = searchParams.get("level") - - if (levelDataBased === null) return - - let levelData = decodeBase64(levelDataBased) - - if (levelData[0] === 0x78) { - levelData = await unzlibAsync(levelData, { consume: true }) - } - - this.loadFile(pager, levelData.buffer) - }, - gbSets: null as GliderbotSet[] | null, - buildingGbSetLis: false, - gbSetLis: new Map(), - async makeSetLi(pager: Pager, set: GliderbotSet): Promise { - const tileset = pager.tileset - const setLi = instanciateTemplate(this.setLiTemlpate!) - const setThumbnailContainer = - setLi.querySelector(".setThumbnail")! - const thumbnail = await getSetThumbnail(tileset!, set) - if (thumbnail !== null) { - // Uugh a hack to make sure that thumbnails aren't bigger than the standard size - const width = - thumbnail instanceof HTMLImageElement - ? thumbnail.naturalWidth - : thumbnail.width - const height = - thumbnail instanceof HTMLImageElement - ? thumbnail.naturalHeight - : thumbnail.height - let cameraWidth = width / tileset!.tileSize - let cameraHeight = height / tileset!.tileSize - if (cameraWidth > 10) cameraWidth = 10 - if (cameraHeight > 10) cameraHeight = 10 - setThumbnailContainer.style.setProperty( - "--camera-width", - cameraWidth.toString() - ) - setThumbnailContainer.style.setProperty( - "--camera-height", - cameraHeight.toString() - ) - setThumbnailContainer.appendChild(thumbnail) - } else setThumbnailContainer.remove() - const meta = set.metadata - function addStringFact(className: string, value: string | undefined): void { - const el = setLi.querySelector(`.${className}`)! - if (value === undefined) { - el.remove() - } else { - const inputEl = el.querySelector("span")! - inputEl.textContent = value - } - } - addStringFact("setName", meta.title) - addStringFact("setBy", meta.by) - // TODO Use stars or something for this instead of a number - addStringFact("setDifficulty", meta.difficulty?.toString()) - addStringFact("setDescription", meta.description) - setLi.addEventListener("click", () => { - pager.loadedSetIdent = set.ident - loadSet(pager, set.loaderFunction, set.mainScript) - }) - - return setLi - }, - - async buildSetLis(pager: Pager): Promise { - if (this.gbSets === null) { - const sets = await getGbSets() - this.gbSets = sets - } - if (!this.setListEl) - throw new Error("Can't build a set list without the set list element") - if (!this.setLiTemlpate) - throw new Error( - "Can't build a set list without the set list item template" - ) - - this.buildingGbSetLis = true - this.gbSetLis.clear() - - return Promise.allSettled( - this.gbSets.map(set => - this.makeSetLi(pager, set).then(li => this.gbSetLis.set(set, li)) - ) - ).then(() => { - this.buildingGbSetLis = false - }) - }, - sortSetLis(sortMethod: SortMethod): GliderbotSet[] { - if (this.gbSets === null) return [] - const sets = this.gbSets.slice() - // Always prioritize sets with metadata filled in - sets.sort( - mergeComparators(metadataComparator, sortMethodComparators[sortMethod]) - ) - // We want to show the sets considered to be the best near the top, so we need to reverse the array - return sets.reverse() - }, - showSetLis(): void { - if (this.buildingGbSetLis) - throw new Error( - "Can't show the set list since the list items are still being generated. Race condition?" - ) - if (this.setListEl === null) - throw new Error( - "Can't add list items since the set list element is unset." - ) - const sets = this.sortSetLis("Last update") - for (const li of Array.from(this.setListEl.children)) { - li.remove() - } - for (const set of sets) { - const li = this.gbSetLis.get(set) - if (li === undefined) continue - this.setListEl.appendChild(li) - } - }, - async generateSetLis(pager: Pager): Promise { - await this.buildSetLis(pager) - this.showSetLis() - }, - updateSettings(pager: Pager): void { - if (this.gbSets !== null) { - this.generateSetLis(pager) - } - }, -} - -registerPage(setSelectorPage) diff --git a/gamePlayer/src/railroad.ts b/gamePlayer/src/railroad.ts deleted file mode 100644 index 160dd22d..00000000 --- a/gamePlayer/src/railroad.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Route } from "@notcc/logic" - -export interface RRRoute { - id: string - moves: Route - absoluteTime: number - timeLeft: number - points: number - routeLabel: string - submitter: string - createdAt: Date -} - -export interface RRLevel { - routes: RRRoute[] - setName: string - title: string - levelN: number - boldTime: number - boldScore: number - mainlineTimeRoute: string - mainlineScoreRoute: string -} - -export async function getRRRoutes(pack: string): Promise { - const res = await fetch(`https://glander.club/railroad/packs/${pack}`) - return await res.json() -} - -export function identifyRRPack(setName: string): string | null { - return ( - { - "Chips Challenge": "cc1", - "Chips Challenge 2": "cc2", - "Chips Challenge 2 Level Pack 1": "cc2lp1", - }[setName] ?? null - ) -} diff --git a/gamePlayer/src/renderer.ts b/gamePlayer/src/renderer.ts deleted file mode 100644 index 202b68e2..00000000 --- a/gamePlayer/src/renderer.ts +++ /dev/null @@ -1,537 +0,0 @@ -import { - CameraType, - cc1BootNameList, - Direction, - Item, - Tile, - Wires, -} from "@notcc/logic" -import { LevelState } from "@notcc/logic" -import { Actor } from "@notcc/logic" -import { Layer } from "@notcc/logic" -import { keyNameList } from "@notcc/logic" -import { DirectionString } from "@notcc/logic" -import { specialFuncs, stateFuncs } from "./const" -import "./artSetSpecials" - -export type HTMLImage = HTMLImageElement | HTMLCanvasElement - -export function removeBackground(image: HTMLImage): HTMLImage { - const ctx = document - .createElement("canvas") - .getContext("2d", { willReadFrequently: true }) - if (!ctx) throw new Error("Couldn't create tileset canvas") - ;[ctx.canvas.width, ctx.canvas.height] = [image.width, image.height] - ctx.drawImage(image, 0, 0) - const rawData = ctx.getImageData(0, 0, image.width, image.height) - const maskColor = rawData.data.slice(0, 4) - for (let i = 0; i < rawData.data.length; i += 4) - if ( - rawData.data[i] === maskColor[0] && - rawData.data[i + 1] === maskColor[1] && - rawData.data[i + 2] === maskColor[2] && - rawData.data[i + 3] === maskColor[3] - ) - rawData.data[i + 3] = 0 - - ctx.putImageData(rawData, 0, 0) - return ctx.canvas -} - -export type Frame = [x: number, y: number] -export type Position = [x: number, y: number] -export type Size = [w: number, h: number] - -export function frange(a: Frame, b: Frame): Frame[] { - const frames: Frame[] = [] - const lengthX = b[0] - a[0] - if (a[1] !== b[1]) throw new Error("Can't use `frange` over vertical frames.") - - for (let xi = 0; xi <= Math.abs(lengthX); xi++) { - const x = a[0] + (lengthX > 0 ? xi : -xi) - frames.push([x, a[1]]) - } - return frames -} - -type StaticArt = Frame - -/** Directic is a portmanteau of directional and static */ -interface DirecticArt { - type: "directic" - UP: Frame - RIGHT: Frame - DOWN: Frame - LEFT: Frame -} -interface AnimatedArt { - type: "animated" - duration: number | "steps" - baseFrame?: number - randomizedFrame?: boolean - frames: Frame[] -} -interface DirectionalArt { - type: "directional" - duration: number | "steps" - baseFrame?: number - randomizedFrame?: boolean - UP: Frame[] - RIGHT: Frame[] - DOWN: Frame[] - LEFT: Frame[] -} -interface OverlayArt { - type: "overlay" - bottom: Art - top: Art -} -interface WiresArt { - type: "wires" - base?: Frame - top: Art - alwaysShowTop?: boolean -} -type StateArt = { type: "state" } & { [state: string]: string | Art } - -export type SpecialArt = { - type: "special" - specialType: string -} & { - [arg: string]: - | Art - | Frame[] - | string - | undefined - | boolean - | number - | Record -} -export type Art = - | StaticArt - | DirecticArt - | AnimatedArt - | DirectionalArt - | OverlayArt - | WiresArt - | StateArt - | SpecialArt - | null - -export interface ArtSet { - floor: Art - currentPlayerMarker: Frame - wireBase: Frame - wire: [StaticArt, StaticArt] - wireTunnel: DirecticArt - letters: Record - artMap: Record -} - -export interface Tileset { - image: HTMLImage - art: ArtSet - wireWidth: number - tileSize: number -} - -function clamp(value: number, min: number, max: number): number { - if (value < min) return min - if (value > max) return max - return value -} - -export interface ArtContext { - ctx: CanvasRenderingContext2D - tileSize: number - actor: Actor - ticks: number - offset: Position - noOffset?: boolean -} -export type ArtSessionContext = Omit - -export function ctxToDir(ctx: ArtContext): DirectionString { - return Direction[ctx.actor.direction] as DirectionString -} - -export class Renderer { - ctx: CanvasRenderingContext2D - itemCtx: CanvasRenderingContext2D | null = null - cameraPosition: Position = [0, 0] - level: LevelState | null = null - cameraSize: CameraType | null = null - - constructor( - public tileset: Tileset, - public viewportCanvas: HTMLCanvasElement, - public itemCanvas?: HTMLCanvasElement - ) { - // Get the viewport draw context - const ctx = viewportCanvas.getContext("2d", { - alpha: true, - }) as CanvasRenderingContext2D - if (ctx === null) - throw new Error("The viewport canvas is already being used!") - this.ctx = ctx - - if (this.itemCanvas) { - // Also get the item draw context, if we are allowed - const itemCtx = this.itemCanvas.getContext("2d", { - alpha: true, - }) as CanvasRenderingContext2D - if (itemCtx === null) - throw new Error("The item canvas is already being used!") - this.itemCtx = itemCtx - } - } - updateTileSize(): void { - if (!this.level || !this.cameraSize) - throw new Error("Can't update the tile size without a level!") - this.viewportCanvas.width = this.cameraSize.width * this.tileset.tileSize - this.viewportCanvas.height = this.cameraSize.height * this.tileset.tileSize - } - tileBlit( - { tileSize, ctx, offset }: ArtSessionContext, - pos: Position, - frame: Frame, - size: Size = [1, 1] - ): void { - ctx.drawImage( - this.tileset.image, - frame[0] * tileSize, - frame[1] * tileSize, - size[0] * tileSize, - size[1] * tileSize, - Math.floor((pos[0] + offset[0]) * tileSize), - Math.floor((pos[1] + offset[1]) * tileSize), - size[0] * tileSize, - size[1] * tileSize - ) - } - drawWireBase( - ctx: ArtContext, - pos: Position, - wires: Wires, - state: boolean - ): void { - const frame = this.tileset.art.wire[state ? 1 : 0] - const radius = this.tileset.wireWidth / 2 - const cropStart: Position = [0.5 - radius, 0.5 - radius] - const cropEnd: Position = [0.5 + radius, 0.5 + radius] - if (wires & Wires.UP) { - cropStart[1] = 0 - } - if (wires & Wires.RIGHT) { - cropEnd[0] = 1 - } - if (wires & Wires.DOWN) { - cropEnd[1] = 1 - } - if (wires & Wires.LEFT) { - cropStart[0] = 0 - } - const cropSize: Size = [ - cropEnd[0] - cropStart[0], - cropEnd[1] - cropStart[1], - ] - this.tileBlit( - ctx, - [pos[0] + cropStart[0], pos[1] + cropStart[1]], - [frame[0] + cropStart[0], frame[1] + cropStart[1]], - cropSize - ) - } - /** - * Generalized logic of drawing directional block and clone machine arrows - * @param width The length from the side of the tile to crop to get the - * required tile - */ - drawCompositionalSides( - ctx: ArtContext, - pos: Position, - art: Record, - width: number, - drawnDirections: Direction[] - ): void { - for (const direction of drawnDirections) { - const offset = - direction === Direction.RIGHT - ? [1 - width, 0] - : direction === Direction.DOWN - ? [0, 1 - width] - : [0, 0] - this.tileBlit( - ctx, - [pos[0] + offset[0], pos[1] + offset[1]], - art[Direction[direction] as DirectionString], - direction === Direction.UP || direction === Direction.DOWN - ? [1, width] - : [width, 1] - ) - } - } - getPosition(ctx: ArtContext): Position { - return ctx.noOffset ? [0, 0] : ctx.actor.getVisualPosition() - } - drawStatic(ctx: ArtContext, art: StaticArt): void { - this.tileBlit(ctx, this.getPosition(ctx), art) - } - drawDirectic(ctx: ArtContext, art: DirecticArt): void { - this.drawArt(ctx, art[ctxToDir(ctx)]) - } - drawAnimated(ctx: ArtContext, art: AnimatedArt | DirectionalArt): void { - const frames = art.type === "animated" ? art.frames : art[ctxToDir(ctx)] - const duration = art.duration - let frameN: number - const actor = ctx.actor - - if (typeof duration === "number") { - frameN = Math.floor(frames.length * ((ctx.ticks / duration) % 1)) - } else if (actor.cooldown !== 0) { - frameN = Math.floor( - frames.length * (1 - actor.cooldown / actor.currentMoveSpeed!) - ) - } else { - frameN = art.baseFrame || 0 - } - // TODO `art.randomizedFrame` - this.drawStatic(ctx, frames[frameN]) - } - drawOverlay(ctx: ArtContext, art: OverlayArt): void { - this.drawArt(ctx, art.bottom) - this.drawArt(ctx, art.top) - } - drawWires(ctx: ArtContext, art: WiresArt): void { - const pos = this.getPosition(ctx) - this.tileBlit(ctx, pos, this.tileset.art.wireBase) - if (ctx.actor.level.hideWires && !art.alwaysShowTop) return - if (!ctx.actor.level.hideWires) { - this.drawWireBase(ctx, pos, ctx.actor.wires, false) - this.drawWireBase( - ctx, - pos, - ctx.actor.poweredWires & ctx.actor.wires, - true - ) - } - this.drawArt(ctx, art.top) - } - drawState(ctx: ArtContext, art: StateArt): void { - const stateFunc = stateFuncs[ctx.actor.id] - if (stateFunc === undefined) { - console.warn(`No state function for actor ${ctx.actor.id ?? "floor"}.`) - return - } - - const state = stateFunc(ctx.actor) - const newArt = art[state] as Art - if (newArt === undefined) { - console.warn( - `Unexpected state ${state} for actor ${ctx.actor.id ?? "floor"}.` - ) - return - } - - this.drawArt(ctx, newArt) - } - drawSpecial(ctx: ArtContext, art: SpecialArt): void { - const specialFunc = specialFuncs[art.specialType] - if (specialFunc == undefined) { - console.warn( - `No special draw function for specialType ${art.specialType}.` - ) - return - } - - specialFunc.call(this, ctx, art) - } - drawArt(ctx: ArtContext, art: Art): void { - if (!art) return - if (Array.isArray(art)) { - this.drawStatic(ctx, art) - } else if (art.type === "directic") { - this.drawDirectic(ctx, art) - } else if (art.type === "animated" || art.type === "directional") { - this.drawAnimated(ctx, art) - } else if (art.type === "overlay") { - this.drawOverlay(ctx, art) - } else if (art.type === "wires") { - this.drawWires(ctx, art) - } else if (art.type === "state") { - this.drawState(ctx, art) - } else if (art.type === "special") { - this.drawSpecial(ctx, art) - } - } - drawFloor(ctx: ArtSessionContext, tile: Tile | Position): void { - this.drawArt( - // Warning: This is a really stupid hack. This can only work for - // special-type rendering which handles this kind of hackery - { ...ctx, actor: tile as unknown as Actor }, - this.tileset.art.floor - ) - } - drawActor(ctxSession: ArtSessionContext, actor: Actor): void { - const art = this.tileset.art.artMap[actor.id] - if (art === undefined) { - console.warn(`No art for actor ${actor.id}.`) - return - } - const ctx = { ...ctxSession, actor } - if ( - actor.level.playablesLeft > 1 && - actor === actor.level.selectedPlayable - ) { - const pos = this.getPosition(ctx) - this.tileBlit(ctx, pos, this.tileset.art.currentPlayerMarker) - } - this.drawArt(ctx, art) - } - _drawOrderedItems( - session: ArtSessionContext, - list: string[], - items: Item[], - yOffset: number, - amounts?: number[], - discardNonRegistered = false - ): void { - let nonRegisteredOffset = list.length - for (const [i, item] of items.entries()) { - let index = list.indexOf(item.id) - if (index === -1) { - if (discardNonRegistered) continue - index = nonRegisteredOffset - nonRegisteredOffset += 1 - } - if (amounts && amounts[i] === 0) continue - const ctx: ArtSessionContext = { ...session, offset: [index, yOffset] } - this.drawActor(ctx, item) - if (amounts !== undefined) { - let amount: number | string = amounts[i] - if (amount === 1 || amount > 127) { - continue - } else if (amount > 9) { - amount = "+" - } else { - amount = amount.toString() - } - this.tileBlit( - ctx, - [0.5, 0.5], - this.tileset.art.letters[amount], - [0.5, 0.5] - ) - } - } - } - updateItems(): void { - if (!this.level) - throw new Error("Can't update the inventory without a level!") - if (!this.itemCanvas || !this.itemCtx || !this.level.selectedPlayable) - return - const tileSize = this.tileset.tileSize - const player = this.level.selectedPlayable - const expectedWidth = player.inventory.itemMax * tileSize - const expectedHeight = 2 * tileSize - const session: ArtSessionContext = { - ctx: this.itemCtx, - ticks: 0, - tileSize, - offset: [0, 0], - noOffset: true, - } - - for (let index = 0; index < player.inventory.itemMax * 2; index++) { - const x = index % player.inventory.itemMax - const y = Math.floor(index / player.inventory.itemMax) - this.drawFloor(session, [x, y]) - } - if ( - this.itemCanvas.width !== expectedWidth || - this.itemCanvas.height !== expectedHeight - ) { - this.itemCanvas.width = expectedWidth - this.itemCanvas.height = expectedHeight - } - if (this.level.cc1Boots) { - this._drawOrderedItems( - session, - cc1BootNameList, - player.inventory.items, - 0, - undefined, - true - ) - } else { - for (const [i, item] of player.inventory.items.entries()) { - this.drawActor({ ...session, offset: [i, 0] }, item) - } - } - const keys = Object.values(player.inventory.keys).map(ent => ent.type) - const keyAmounts = Object.values(player.inventory.keys).map( - ent => ent.amount - ) - this._drawOrderedItems(session, keyNameList, keys, 1, keyAmounts) - } - updateCameraPosition(): void { - if (!this.level) { - throw new Error("There's no camera without a level!") - } - if (!this.level.selectedPlayable || !this.cameraSize) { - this.cameraPosition = [0, 0] - return - } - const playerPos = this.level.selectedPlayable.getVisualPosition() - // Note: the opposite of what you'd expect, since `visualPosition` gives - // absolute positions, so we need to recenter by subtracting the camera - // position, but ArtSessionContext adds offsets, so we need to negate - this.cameraPosition = [ - -( - clamp( - playerPos[0] + 0.5, - this.cameraSize.width / 2, - this.level.width - this.cameraSize.width / 2 - ) - - this.cameraSize.width / 2 - ), - -( - clamp( - playerPos[1] + 0.5, - this.cameraSize.height / 2, - this.level.height - this.cameraSize.height / 2 - ) - - this.cameraSize.height / 2 - ), - ] - } - frame(): void { - if (!this.level || !this.cameraSize) return - this.updateCameraPosition() - const session: ArtSessionContext = { - ctx: this.ctx, - offset: this.cameraPosition, - ticks: this.level.currentTick * 3 + this.level.subtick, - tileSize: this.tileset.tileSize, - } - for (let layer = Layer.STATIONARY; layer <= Layer.SPECIAL; layer++) { - for (let xi = -1; xi <= this.cameraSize.width + 1; xi++) { - for (let yi = -1; yi <= this.cameraSize.height + 1; yi++) { - const x = Math.floor(xi - this.cameraPosition[0]) - const y = Math.floor(yi - this.cameraPosition[1]) - const tile = this.level.field[x]?.[y] - if (!tile) continue - if (layer === Layer.STATIONARY && !tile.hasLayer(Layer.STATIONARY)) { - // If there's nothing on the terrain level, draw floor - this.drawFloor(session, tile) - } else { - for (const actor of tile[layer]) { - this.drawActor(session, actor) - } - } - } - } - } - this.updateItems() - } -} diff --git a/gamePlayer/src/reportGenerator.ts b/gamePlayer/src/reportGenerator.ts deleted file mode 100644 index 4da3bd38..00000000 --- a/gamePlayer/src/reportGenerator.ts +++ /dev/null @@ -1,253 +0,0 @@ -import { findBestMetrics, SolutionMetrics } from "@notcc/logic" -import { Pager } from "./pager" -import { instanciateTemplate, resetListeners } from "./utils" -import { - ApiAttributeIdentifier, - ApiPackLevelAttribute, - ApiRRPackLevelAttribute, - getPlayerPackDetails, - tryGetRRPackLevels, -} from "./scoresApi" - -const scoreReportGenDialog = document.querySelector( - "#scoreReportGenDialog" -)! - -const reportLineTemplate = - scoreReportGenDialog.querySelector( - "#reportLineTemplate" - )! - -interface ReportLevel { - levelN: number - levelName: string - metrics: Partial - reportedMetrics: Partial - boldMetrics: Partial - confirmedMetrics: Partial -} - -interface ReportEntry { - text: string - enabled: boolean -} - -type ReportMode = "cc1" | "cc2" - -const setNameToScoreboardName: Partial> = { - "Chips Challenge": ["cc1", "cc1"], - "Chips Challenge 2": ["cc2", "cc2"], - "Chips Challenge 2 Level Pack 1": ["cc2", "cc2lp1"], -} - -function determineMetricReportType( - level: ReportLevel, - metric: keyof SolutionMetrics -): string | null { - const userMetric = level.metrics[metric] - if (userMetric === undefined) throw new Error("No user metric") - const reportedMetric = level.reportedMetrics[metric] - const boldMetric = level.boldMetrics[metric] - const confirmedMetric = level.confirmedMetrics[metric] - // The bold metric should exist as long as there's at least one report for the level - // So, if we don't find one, it's probably the first report for level! Fun stuff. - if (boldMetric === undefined) return null - if (userMetric > boldMetric) return `b+${userMetric - boldMetric}` - if (userMetric === boldMetric) - return confirmedMetric === undefined || boldMetric === confirmedMetric - ? "b" - : "bc" - if (confirmedMetric !== undefined && userMetric > confirmedMetric) return "pc" - if (reportedMetric !== undefined && userMetric > reportedMetric) - return `+${userMetric - reportedMetric}` - return null -} - -function makeReportText(level: ReportLevel, mode: ReportMode): string { - let reportText = `#${level.levelN} ${level.levelName}: ` - - const timeRepType = determineMetricReportType(level, "timeLeft") - - reportText += `${Math.max( - level.metrics.timeLeft ?? -Infinity, - level.reportedMetrics.timeLeft ?? -Infinity - )}s` - - if (timeRepType) { - reportText += ` (${timeRepType})` - } - - if (mode === "cc2") { - const pointsRepType = determineMetricReportType(level, "points") - reportText += ` | ${Math.max( - level.metrics.points ?? -Infinity, - level.reportedMetrics.points ?? -Infinity - )}pts` - if (pointsRepType) { - reportText += ` (${pointsRepType})` - } - } - return reportText -} - -function generateReportLines( - entries: ReportEntry[], - showDisabled: boolean -): void { - const reportText = scoreReportGenDialog.querySelector("#linesPoint")! - // Nuke all current data - reportText.textContent = "" - for (const entry of entries) { - if (!showDisabled && !entry.enabled) continue - const reportLine = instanciateTemplate(reportLineTemplate) - const checkbox = reportLine.querySelector("input")! - checkbox.checked = entry.enabled - reportLine.classList.toggle("disabled", !entry.enabled) - checkbox.addEventListener("change", () => { - entry.enabled = checkbox.checked - generateReportLines(entries, showDisabled) - }) - const textSpan = reportLine.querySelector("span")! - textSpan.textContent = entry.text - reportText.appendChild(reportLine) - } -} - -export function getMetricsFromAttrs( - attrs: T[], - tranformer: (attr: T) => number -): Partial { - const reportedMetrics: Partial = {} - const timeMetric = attrs.find( - report => report.metric === "time" && report.rule_type === "steam" - ) - if (timeMetric) { - reportedMetrics.timeLeft = tranformer(timeMetric) - } - const scoreMetric = attrs.find( - report => report.metric === "score" && report.rule_type === "steam" - ) - if (scoreMetric) { - reportedMetrics.points = tranformer(scoreMetric) - } - return reportedMetrics -} - -export async function openScoreReportGenDialog(pager: Pager): Promise { - const set = pager.loadedSet - - if ( - !pager.settings.optimizerId || - set === null || - !set.scriptRunner.state.scriptTitle || - !(set.scriptRunner.state.scriptTitle in setNameToScoreboardName) - ) - return - resetListeners(scoreReportGenDialog) - - const [reportMode, setName] = - setNameToScoreboardName[set.scriptRunner.state.scriptTitle]! - let reportsInfo - let setInfo - - scoreReportGenDialog.setAttribute("stage", "loading") - - scoreReportGenDialog.showModal() - - try { - reportsInfo = await getPlayerPackDetails( - pager.settings.optimizerId, - setName - ) - setInfo = await tryGetRRPackLevels(setName) - } catch (err) { - scoreReportGenDialog.setAttribute("stage", "error") - scoreReportGenDialog.querySelector(".errorField")!.textContent = ( - err as Error - ).message - return - } - - const sortedLevels = Object.values(set.seenLevels) - .map(record => record.levelInfo) - .sort((a, b) => (a.levelNumber ?? 0) - (b.levelNumber ?? 0)) - - const entries: ReportEntry[] = [] - - for (const levelRecord of sortedLevels) { - const levelN = levelRecord.levelNumber! - - const reportedAttrs = reportsInfo.scores.levels[levelN.toString()] ?? [] - const setAttrs = setInfo[levelN - 1].level_attribs - - const metrics = findBestMetrics(levelRecord) - if (metrics.timeLeft !== undefined) { - metrics.timeLeft = Math.ceil(metrics.timeLeft) - } - const reportedMetrics = getMetricsFromAttrs( - reportedAttrs, - attr => attr.reported_value - ) - - let betterMetric = false - - for (const [metricName, userMetric] of Object.entries(metrics)) { - // Real time isn't generally reported - if (metricName === "realTime") continue - if ( - reportedMetrics[metricName as keyof SolutionMetrics] === undefined || - reportedMetrics[metricName as keyof SolutionMetrics]! < userMetric - ) { - betterMetric = true - break - } - } - - if (!betterMetric) continue - - const boldMetrics = getMetricsFromAttrs< - ApiRRPackLevelAttribute | ApiPackLevelAttribute - >(setAttrs, attr => attr.attribs.highest_reported) - - let confirmedMetrics: Partial = {} - if ("highest_confirmed" in setAttrs[0].attribs) { - confirmedMetrics = getMetricsFromAttrs( - setAttrs as ApiRRPackLevelAttribute[], - attr => attr.attribs.highest_confirmed - ) - } - - const level: ReportLevel = { - levelN, - levelName: levelRecord.title!, - reportedMetrics, - metrics, - boldMetrics, - confirmedMetrics, - } - - entries.push({ enabled: true, text: makeReportText(level, reportMode) }) - } - - generateReportLines(entries, true) - const setNameEl = scoreReportGenDialog.querySelector(".setName") - if (setNameEl) { - setNameEl.textContent = setName.toUpperCase() - if (reportMode === "cc1") { - setNameEl.textContent += " (Steam)" - } - } - - const reportText = - scoreReportGenDialog.querySelector("#reportText")! - const copyReportButton = - scoreReportGenDialog.querySelector("#copyReport") - copyReportButton?.addEventListener("click", () => { - // Stupid, but it works! - generateReportLines(entries, false) - navigator.clipboard.writeText(reportText.innerText) - generateReportLines(entries, true) - }) - - scoreReportGenDialog.setAttribute("stage", "default") -} diff --git a/gamePlayer/src/saveData.localStorage.ts b/gamePlayer/src/saveData.localStorage.ts deleted file mode 100644 index b035f4e7..00000000 --- a/gamePlayer/src/saveData.localStorage.ts +++ /dev/null @@ -1,204 +0,0 @@ -import { protobuf } from "@notcc/logic" -import { compressToUTF16, decompressFromUTF16 } from "lz-string" -import { Settings } from "./settings" -import { ExternalTilesetMetadata } from "./tilesets" -import { fetchImage, reencodeImage } from "./utils" -import type { os } from "@neutralinojs/lib" - -function makeFilePrefix(type: string) { - return `NotCC ${type}` -} - -const base64EncodedUI8Prefix = "\x7F\x00B64\x00\x7F" -const uriImagePrefix = "\x7F\x00URIIMG\x00\x7F" - -function encodeBinaryBase64(bin: Uint8Array): string { - return btoa(String.fromCharCode.apply(null, Array.from(bin))) -} - -function decodeBinaryBase64(b64: string): Uint8Array { - return Uint8Array.from(atob(b64), char => char.charCodeAt(0)) -} - -function jsonStringifyExtended(data: any): string { - return JSON.stringify(data, (_key, val) => { - if (val instanceof Uint8Array) { - return `${base64EncodedUI8Prefix}${encodeBinaryBase64(val)}` - } - if (val instanceof HTMLImageElement) { - // Re-encode the image to also be saved - val = reencodeImage(val) - } - if (val instanceof HTMLCanvasElement) { - return `${uriImagePrefix}${val.toDataURL()}` - } - return val - }) -} - -async function walkObjectAsync( - obj: object, - transform: (val: any) => Promise -): Promise { - if (Array.isArray(obj)) { - return Promise.all(obj.map(item => walkObjectAsync(item, transform))) - } - if (typeof obj === "object" && obj !== null) { - const newObj: any = {} - for (const [key, val] of Object.entries(obj)) { - newObj[key] = await walkObjectAsync(val, transform) - } - return newObj - } - return transform(obj) -} - -function jsonParseExtended(data: string): Promise { - const vanillaData = JSON.parse(data) - return walkObjectAsync(vanillaData, async val => { - if (typeof val === "string") { - if (val.startsWith(base64EncodedUI8Prefix)) { - return decodeBinaryBase64(val.slice(base64EncodedUI8Prefix.length)) - } - if (val.startsWith(uriImagePrefix)) { - return await fetchImage(val.slice(uriImagePrefix.length)) - } - } - return val - }) -} - -export function initSaveData(): Promise { - return Promise.resolve() -} - -export async function saveSetInfo( - solution: protobuf.ISetInfo, - fileName: string -): Promise { - localStorage.setItem( - `${makeFilePrefix("solution")}: ${fileName}`, - compressToUTF16(jsonStringifyExtended(solution)) - ) -} - -export async function loadSetInfo( - fileName: string -): Promise { - const compressedData = localStorage.getItem( - `${makeFilePrefix("solution")}: ${fileName}` - ) - if (!compressedData) throw new Error(`File not fould: ${fileName}`) - return await jsonParseExtended(decompressFromUTF16(compressedData)) -} - -export async function saveSettings(settings: Settings): Promise { - localStorage.setItem(makeFilePrefix("settings"), JSON.stringify(settings)) -} - -export async function loadSettings(): Promise { - const settings = localStorage.getItem(makeFilePrefix("settings")) - if (!settings) throw new Error("Settings file not found") - return JSON.parse(settings) -} - -export async function saveTileset( - tileset: ExternalTilesetMetadata -): Promise { - localStorage.setItem( - `${makeFilePrefix("tileset")}: ${tileset.identifier}`, - jsonStringifyExtended(tileset) - ) -} - -export async function loadTileset( - identifier: string -): Promise { - const tilesetData = localStorage.getItem( - `${makeFilePrefix("tileset")}: ${identifier}` - ) - if (tilesetData === null) throw new Error("Tileset not found") - - const data: ExternalTilesetMetadata = await jsonParseExtended(tilesetData) - if ("imageData" in data) { - // We moved keys, so update legacy tilesets - data.image = reencodeImage(await fetchImage(data.imageData as string)) - } - return data -} - -export async function loadAllTilesets(): Promise { - const tsets: ExternalTilesetMetadata[] = [] - for (const recordName in localStorage) { - const tsetPrefix = `${makeFilePrefix("tileset")}: ` - if (!recordName.startsWith(tsetPrefix)) continue - const tset = await loadTileset(recordName.slice(tsetPrefix.length)) - tsets.push(tset) - } - return tsets -} - -export async function removeTileset(identifier: string): Promise { - const deleteSuccess = - delete localStorage[`${makeFilePrefix("tileset")}: ${identifier}`] - if (!deleteSuccess) throw new Error("Couldn't delete file.") -} - -export async function showLoadPrompt( - _title?: string, - options?: os.OpenDialogOptions -): Promise { - const fileLoader = document.createElement("input") - fileLoader.type = "file" - if (options?.filters !== undefined) { - fileLoader.accept = options.filters - .map(filter => filter.extensions.map(ext => `.${ext}`).join(",")) - .join(",") - } - fileLoader.multiple = !!options?.multiSelections - return new Promise((res, rej) => { - fileLoader.addEventListener("change", () => { - if (fileLoader.files === null || fileLoader.files.length === 0) { - rej(new Error("No files specified")) - } else { - res(Array.from(fileLoader.files)) - } - fileLoader.remove() - }) - fileLoader.click() - }) -} - -export async function showDirectoryPrompt(): Promise { - const fileLoader = document.createElement("input") - fileLoader.type = "file" - fileLoader.webkitdirectory = true - return new Promise((res, rej) => { - fileLoader.addEventListener("change", () => { - if (fileLoader.files === null || fileLoader.files.length === 0) { - rej(new Error("No directory specified")) - } else { - res(Array.from(fileLoader.files)) - } - fileLoader.remove() - }) - fileLoader.click() - }) -} - -export async function showSavePrompt( - fileData: ArrayBuffer, - _title?: string, - option?: os.SaveDialogOptions -): Promise { - const blob = new Blob([fileData], { type: "application/octet-stream" }) - const url = URL.createObjectURL(blob) - const anchor = document.createElement("a") - if (option?.defaultPath !== undefined) { - anchor.download = option.defaultPath.slice(2) - } - anchor.href = url - anchor.click() - anchor.remove() - URL.revokeObjectURL(url) -} diff --git a/gamePlayer/src/saveData.neutralino.ts b/gamePlayer/src/saveData.neutralino.ts deleted file mode 100644 index 4985c8e4..00000000 --- a/gamePlayer/src/saveData.neutralino.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { parseNCCS, protobuf, writeNCCS } from "@notcc/logic" -import { Settings } from "./settings" -import { ExternalTilesetMetadata } from "./tilesets" -import { filesystem, init as neuInit, os } from "@neutralinojs/lib" -import path from "path-browserify" -import { fetchImage, reencodeImage } from "./utils" -import { applicationConfigPath } from "./configPath" - -/** - * Uuugh, Neutralino depends on a couple of global variables prefixed with NL_ - * to be present to function. Problem is, the variables can only be gotten by - * the server serving a __neutralino_globals.js file. We don't want it to be - * served if it's is a web build, but there's no mechanism to include/exclude - * script tags at build time. So, download the globals file, parse it for - * global-ish statements, and add the globals manually instead. Epic hack. - */ -const globalVarRegex = /var (NL_\w+)=([^;]+);/g -async function loadNeuGlobalVariables(): Promise { - const globalsResponse = await fetch("__neutralino_globals.js") - const globalsText = await globalsResponse.text() - let match: RegExpExecArray | null - while ((match = globalVarRegex.exec(globalsText))) { - const key = match[1] - const valString = match[2] - // I don't want to build a JS parser here, so let's just eval it. - const val = new Function(`return ${valString}`)() - ;(globalThis as any)[key] = val - } -} - -async function dirExists(path: string): Promise { - try { - await filesystem.readDirectory(path) - } catch (err) { - return false - } - return true -} - -async function getPath(pathName: string) { - return path.join(await applicationConfigPath("NotCC"), pathName) -} - -const SET_INFO_DIRECTORY = "solutions" -const SETTINGS_FILE = "settings.json" -const TILESETS_DIRECTORY = "tilesets" - -async function assertDirExists(path: string): Promise { - const truePath = await getPath(path) - if (!(await dirExists(truePath))) { - await filesystem.createDirectory(truePath) - } -} - -export async function initSaveData(): Promise { - await loadNeuGlobalVariables() - neuInit() - await assertDirExists(".") - await assertDirExists(SET_INFO_DIRECTORY) - await assertDirExists(TILESETS_DIRECTORY) -} - -export async function saveSetInfo( - solution: protobuf.ISetInfo, - fileName: string -): Promise { - await filesystem.writeBinaryFile( - path.join(await getPath(SET_INFO_DIRECTORY), `${fileName}.nccs`), - writeNCCS(solution) - ) -} - -export async function loadSetInfo( - fileName: string -): Promise { - return parseNCCS( - await filesystem.readBinaryFile( - path.join(await getPath(SET_INFO_DIRECTORY), `${fileName}.nccs`) - ) - ) -} - -export async function saveSettings(settings: Settings): Promise { - await filesystem.writeFile( - await getPath(SETTINGS_FILE), - JSON.stringify(settings) - ) -} - -export async function loadSettings(): Promise { - return JSON.parse(await filesystem.readFile(await getPath(SETTINGS_FILE))) -} - -function canvasToBlob(canvas: HTMLCanvasElement, type: string): Promise { - return new Promise((res, rej) => { - canvas.toBlob(blob => { - if (blob === null) { - rej(new Error("Failed to create a blob from a canvas")) - return - } - res(blob) - }, type) - }) -} -async function bufferToCanvas( - buffer: ArrayBuffer, - type: string -): Promise { - const blob = new Blob([buffer], { type }) - const objectUrl = URL.createObjectURL(blob) - return reencodeImage(await fetchImage(objectUrl)) -} - -export async function saveTileset( - tileset: ExternalTilesetMetadata -): Promise { - const tilesetsDir = await getPath(TILESETS_DIRECTORY) - const image = await canvasToBlob(tileset.image, "image/png") - await filesystem.writeBinaryFile( - path.join(tilesetsDir, `${tileset.identifier}.png`), - await image.arrayBuffer() - ) - await filesystem.writeFile( - path.join(tilesetsDir, `${tileset.identifier}.json`), - JSON.stringify(tileset, (key, val) => (key === "image" ? undefined : val)) - ) -} - -export async function loadTileset( - identifier: string -): Promise { - const tilesetsDir = await getPath(TILESETS_DIRECTORY) - const metadata: ExternalTilesetMetadata = JSON.parse( - await filesystem.readFile(path.join(tilesetsDir, `${identifier}.json`)) - ) - // The `metadata.image` is currently undefined, so actually load the - // extraneous image file - const image = await bufferToCanvas( - await filesystem.readBinaryFile( - path.join(tilesetsDir, `${identifier}.png`) - ), - "image/png" - ) - metadata.image = image - - return metadata -} - -export async function loadAllTilesets(): Promise { - const tilesetsDir = await getPath(TILESETS_DIRECTORY) - const tsets: ExternalTilesetMetadata[] = [] - for (const record of await filesystem.readDirectory(tilesetsDir)) { - if (record.type === "DIRECTORY") continue - if (!record.entry.endsWith(".json")) continue - const tset = await loadTileset(record.entry.slice(0, -5)) - tsets.push(tset) - } - return tsets -} - -export async function removeTileset(identifier: string): Promise { - const tilesetsDir = await getPath(TILESETS_DIRECTORY) - await filesystem.removeFile(path.join(tilesetsDir, `${identifier}.json`)) - await filesystem.removeFile(path.join(tilesetsDir, `${identifier}.png`)) -} - -export async function showLoadPrompt( - title?: string, - options?: os.OpenDialogOptions -): Promise { - const fileNames = await os.showOpenDialog(title, options) - const files: File[] = [] - for (const fileName of fileNames) { - const stat = await filesystem.getStats(fileName) - const bin = await filesystem.readBinaryFile(fileName) - files.push( - new File([bin], path.basename(fileName), { - lastModified: stat.modifiedAt, - }) - ) - } - return files -} - -async function scanDirectory(dirPath: string, prefix: string): Promise { - const entries = await filesystem.readDirectory(dirPath) - const files: File[] = [] - for (const ent of entries) { - if (ent.entry === "." || ent.entry === "..") continue - const filePath = path.join(dirPath, ent.entry) - const prefixPath = path.join(prefix, ent.entry) - if (ent.type === "FILE") { - const stat = await filesystem.getStats(filePath) - const bin = await filesystem.readBinaryFile(filePath) - const file = new File([bin], ent.entry, { lastModified: stat.modifiedAt }) - // Define the property explicitly on the `file`, since the underlying `File.prototype.webkitRelativePath` - // getter (which assigning with `=` uses) doesn't allow writing. ugh - Object.defineProperty(file, "webkitRelativePath", { value: prefixPath }) - files.push(file) - } else { - files.push(...(await scanDirectory(filePath, prefixPath))) - } - } - return files -} - -export async function showDirectoryPrompt( - title?: string, - options?: os.FolderDialogOptions -): Promise { - const dirName = await os.showFolderDialog(title, options) - return await scanDirectory(dirName, "") -} - -export async function showSavePrompt( - fileData: ArrayBuffer, - title?: string, - options?: os.SaveDialogOptions -): Promise { - const savePath = await os.showSaveDialog(title, options) - if (savePath === "") throw new Error("Save path not provided") - await filesystem.writeBinaryFile(savePath, fileData) -} diff --git a/gamePlayer/src/saveData.ts b/gamePlayer/src/saveData.ts deleted file mode 100644 index a398a6ad..00000000 --- a/gamePlayer/src/saveData.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as lsSave from "./saveData.localStorage" -import * as neuSave from "./saveData.neutralino" -import { isDesktop } from "./utils" - -// Decide which save data method to use. Kinda hacky, but what are you gonna do? - -export const initSaveData = isDesktop() - ? neuSave.initSaveData - : lsSave.initSaveData -export const saveSetInfo = isDesktop() - ? neuSave.saveSetInfo - : lsSave.saveSetInfo -export const loadSetInfo = isDesktop() - ? neuSave.loadSetInfo - : lsSave.loadSetInfo -export const saveSettings = isDesktop() - ? neuSave.saveSettings - : lsSave.saveSettings -export const loadSettings = isDesktop() - ? neuSave.loadSettings - : lsSave.loadSettings -export const saveTileset = isDesktop() - ? neuSave.saveTileset - : lsSave.saveTileset -export const loadTileset = isDesktop() - ? neuSave.loadTileset - : lsSave.loadTileset -export const loadAllTilesets = isDesktop() - ? neuSave.loadAllTilesets - : lsSave.loadAllTilesets -export const removeTileset = isDesktop() - ? neuSave.removeTileset - : lsSave.removeTileset -export const showLoadPrompt = isDesktop() - ? neuSave.showLoadPrompt - : lsSave.showLoadPrompt -export const showDirectotyPrompt = isDesktop() - ? neuSave.showDirectoryPrompt - : lsSave.showDirectoryPrompt -export const showSavePrompt = isDesktop() - ? neuSave.showSavePrompt - : lsSave.showSavePrompt diff --git a/gamePlayer/src/scoresApi.ts b/gamePlayer/src/scoresApi.ts deleted file mode 100644 index 46239dc4..00000000 --- a/gamePlayer/src/scoresApi.ts +++ /dev/null @@ -1,127 +0,0 @@ -// /players -export interface ApiPlayerGeneric { - player_id: number - player: string -} - -// /players/[id] -export interface ApiPlayerSummary extends ApiPlayerGeneric { - score_summary: Record - designed_levels: ApiDesignedLevelsSummary[] -} - -export interface ApiPlayerPackMetric { - pack: string - rule_type: string - metric: string - avg_ranking: string - calc_score: number - bold_count: number -} - -export interface ApiDesignedLevelsSummary { - pack: string - level_count: number -} - -export async function getPlayerSummary(id: number): Promise { - const res = await fetch(`https://api.bitbusters.club/players/${id}`) - return await res.json() -} - -// /players/[id]/[pack] -export interface ApiPlayerPackDetails extends ApiPlayerGeneric { - scores: ApiPackReports -} - -export interface ApiPackReports { - pack: string - /** - * Note: If there are no report for a specific level, the key isn't present - */ - levels: Partial> -} - -export interface ApiAttributeIdentifier { - rule_type: string - metric: string -} - -export interface ApiPackReport extends ApiAttributeIdentifier { - reported_value: number - ranking: number - tiebreaker: number - date_reported: string -} - -export interface ApiDesignedLevel { - level: number - level_name: string - wiki_article: string -} - -export async function getPlayerPackDetails( - id: number, - pack: string -): Promise { - const res = await fetch(`https://api.bitbusters.club/players/${id}/${pack}`) - return await res.json() -} - -export interface ApiPackLevel { - level: number - name: string - game: string - pack: string - designers: string - adapted: boolean - password: string | null - time_limit: number - chips_required: number - total_chips: number - chips_note?: string - wiki_article: string - steam_map: string - level_attribs: ApiPackLevelAttribute[] -} - -export interface ApiPackLevelAttribute extends ApiAttributeIdentifier { - attribs: { - melinda: number - highest_reported: number - casual_diff: number - exec_diff: number - luck_diff: number - routing_diff: number - } -} - -export async function getPackLevels(pack: string): Promise { - const res = await fetch(`https://api.bitbusters.club/packs/${pack}/levels`) - return await res.json() -} - -export interface ApiRRPackLevel { - level_attribs: ApiRRPackLevelAttribute[] -} - -export interface ApiRRPackLevelAttribute extends ApiAttributeIdentifier { - attribs: { - highest_reported: number - highest_confirmed: number - } -} - -export async function getRRPackLevels(pack: string): Promise { - const res = await fetch(`https://glander.club/railroad/bolds/${pack}`) - return await res.json() -} - -export function tryGetRRPackLevels( - pack: string -): Promise { - return getRRPackLevels(pack).catch(err => { - console.error(err) - return getPackLevels(pack) - }) -} diff --git a/gamePlayer/src/settings.ts b/gamePlayer/src/settings.ts deleted file mode 100644 index 0ad6ec4e..00000000 --- a/gamePlayer/src/settings.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { Pager } from "./pager" -import clone from "clone" -import { ThemeColors, applyTheme, openThemeSelectorDialog } from "./themes" -import { resetListeners } from "./utils" -import { - getTilesetMetadataFromIdentifier, - openTilesetSelectortDialog, -} from "./tilesets" -import { getPlayerSummary } from "./scoresApi" - -export type SetListPreviewLevel = "title" | "level preview" -export type ExaIntegerTimeRounding = "floor" | "floor + 1" | "ceil" - -export interface Settings { - mainTheme: ThemeColors - tileset: string - preventNonLegalGlitches: boolean - preventSimultaneousMovement: boolean - optimizerId?: number - exaIntegerTimeRounding: ExaIntegerTimeRounding -} - -export const defaultSettings: Settings = { - mainTheme: { hue: 212, saturation: 80 }, - tileset: "cga16", - preventNonLegalGlitches: true, - preventSimultaneousMovement: true, - exaIntegerTimeRounding: "ceil", -} - -const settingsDialog = - document.querySelector("#settingsDialog")! - -export function openSettingsDialog(pager: Pager): void { - resetListeners(settingsDialog) - const newSettings = clone(pager.settings) - function makeSettingsPreference( - id: string, - event: string, - call: (el: T) => void | Promise, - apply: (el: T) => void - ): void { - const el = settingsDialog.querySelector(`#${id}`)! - el.addEventListener(event, async () => { - await call(el) - apply(el) - }) - apply(el) - } - - makeSettingsPreference( - "mainTheme", - "click", - () => - openThemeSelectorDialog(newSettings.mainTheme, pager).then(color => { - if (color !== null) { - newSettings.mainTheme = color - } - }), - el => applyTheme(el, newSettings.mainTheme) - ) - - const currentTilesetText = settingsDialog.querySelector( - "#currentTilesetText" - )! - makeSettingsPreference( - "currentTileset", - "click", - () => - openTilesetSelectortDialog(newSettings.tileset).then(tset => { - if (tset !== null) { - newSettings.tileset = tset - } - }), - async () => { - const tsetMeta = await getTilesetMetadataFromIdentifier( - newSettings.tileset - ) - currentTilesetText.textContent = tsetMeta?.title ?? "Unknown tileset" - } - ) - - makeSettingsPreference( - "preventNonLegalGlitches", - "change", - el => { - newSettings.preventNonLegalGlitches = el.checked - }, - el => { - el.checked = newSettings.preventNonLegalGlitches - } - ) - - makeSettingsPreference( - "preventSimulMovement", - "change", - el => { - newSettings.preventSimultaneousMovement = el.checked - }, - el => { - el.checked = newSettings.preventSimultaneousMovement - } - ) - const currentUsername = settingsDialog.querySelector("#currentUsername")! - makeSettingsPreference( - "optimizerId", - "change", - el => { - if (el.value !== "") { - newSettings.optimizerId = parseInt(el.value) - } else { - delete newSettings.optimizerId - } - }, - el => { - if (newSettings.optimizerId === undefined) { - el.value = "" - currentUsername.textContent = "" - } else { - el.value = newSettings.optimizerId.toString() - currentUsername.textContent = "..." - getPlayerSummary(newSettings.optimizerId) - .then(info => { - currentUsername.textContent = info.player - }) - .catch(() => { - currentUsername.textContent = "???" - }) - } - } - ) - makeSettingsPreference( - "integerTimeRounding", - "change", - el => { - newSettings.exaIntegerTimeRounding = el.value as ExaIntegerTimeRounding - }, - el => { - el.value = newSettings.exaIntegerTimeRounding - } - ) - - const closeListener = () => { - if (settingsDialog.returnValue === "ok") { - pager.saveSettings(newSettings) - } - settingsDialog.removeEventListener("close", closeListener) - } - - settingsDialog.addEventListener("close", closeListener) - - settingsDialog.showModal() -} diff --git a/gamePlayer/src/sfx.ts b/gamePlayer/src/sfx.ts deleted file mode 100644 index b2576527..00000000 --- a/gamePlayer/src/sfx.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { SfxManager } from "@notcc/logic" -const standardSfx = [ - "recessed wall", - "explosion", - "splash", - "teleport", - "robbed", - "dirt clear", - "button press", - "block push", - "force floor", - "bump", - "water step", - "slide step", - "ice slide", - "fire step", - "item get", - "socket unlock", - "door unlock", - // TODO Win, loss SFX -] - -export class AudioSfxManager implements SfxManager { - ctx = new AudioContext() - audioBuffers: Record = {} - playingNodes: Record = {} - async fetchDefaultSounds(url: string): Promise { - let anySfxLoaded = false - for (const sfxName of standardSfx) { - try { - const res = await fetch(`${url}/${sfxName}.wav`) - if (!res.ok) throw new Error(`Failed to fetch: ${res.statusText}`) - const buffer = await res.arrayBuffer() - const audioBuffer = await this.ctx.decodeAudioData(buffer) - this.audioBuffers[sfxName] = audioBuffer - anySfxLoaded = true - } catch (err) { - console.error(`Couldn't load standard sound effect ${sfxName}: ${err}`) - } - } - if (!anySfxLoaded) - throw new Error("Couldn't load any standard sfx from url.") - } - getSfxNode(sfx: string): AudioBufferSourceNode | null { - const audioBuffer = this.audioBuffers[sfx] - if (audioBuffer === undefined) { - if (!standardSfx.includes(sfx)) { - console.warn(`Unknown sfx: ${sfx}`) - } - return null - } - const node = new AudioBufferSourceNode(this.ctx) - node.buffer = audioBuffer - node.connect(this.ctx.destination) - this.playingNodes[sfx] = node - return node - } - stopSfx(sfx: string): void { - const node = this.playingNodes[sfx] - if (node === undefined) return - node.stop() - node.disconnect() - delete this.playingNodes[sfx] - } - playOnce(sfx: string): void { - this.stopSfx(sfx) - const node = this.getSfxNode(sfx) - if (node === null) return - node.addEventListener("ended", () => { - if (this.playingNodes[sfx] === node) { - delete this.playingNodes[sfx] - } - }) - node.start() - } - playContinuous(sfx: string): void { - if (this.playingNodes[sfx] !== undefined) return - const node = this.getSfxNode(sfx) - if (node === null) return - node.loop = true - node.start() - } - stopContinuous(sfx: string): void { - this.stopSfx(sfx) - } - stopAllSfx(): void { - for (const sfxName of Object.keys(this.playingNodes)) { - this.stopSfx(sfxName) - } - } -} diff --git a/gamePlayer/src/sidebar.ts b/gamePlayer/src/sidebar.ts deleted file mode 100644 index e0003622..00000000 --- a/gamePlayer/src/sidebar.ts +++ /dev/null @@ -1,336 +0,0 @@ -import { Page, Pager } from "./pager" -import isHotkey, { parseHotkey } from "is-hotkey" -import { setSelectorPage } from "./pages/setSelector" -import { levelPlayerPage } from "./pages/levelPlayer" -import { openLevelListDialog } from "./levelList" -import { openSettingsDialog } from "./settings" -import { instanciateTemplate } from "./utils" -import { exaPlayerPage } from "./pages/exaPlayer" -import { openAllAttemptsDialog } from "./allAttemptsDialog" -import { generateSolutionTooltipEntries } from "./solutionTooltip" - -interface TooltipEntry { - name: string - shortcut: string | null - action?(pager: Pager): void - enabledPages?: Page[] -} - -export type BasicTooltipEntry = TooltipEntry | "breakline" - -type TooltipEntryGenerator = (pager: Pager) => BasicTooltipEntry[] - -type TooltipEntries = (BasicTooltipEntry | TooltipEntryGenerator)[] - -const playerPages = [levelPlayerPage, exaPlayerPage] - -const aboutDialog = document.querySelector("#aboutDialog") - -function openAboutDialog(): void { - aboutDialog?.showModal() -} - -export const tooltipGroups: Record = { - selector: [ - { - name: "Set selector", - shortcut: "esc", - action(pager: Pager): void { - pager.openPage(setSelectorPage) - }, - }, - ], - level: [ - { - name: "Reset level", - shortcut: "shift+r", - action(pager: Pager): void { - pager.resetLevel() - }, - enabledPages: playerPages, - }, - { - name: "Pause", - shortcut: "p", - action(pager: Pager): void { - if (pager.currentPage === levelPlayerPage) { - const page = pager.currentPage as typeof levelPlayerPage - page.togglePaused() - } - }, - enabledPages: [levelPlayerPage], - }, - "breakline", - { - name: "Previous level", - shortcut: "shift+p", - async action(pager: Pager): Promise { - await pager.loadPreviousLevel() - pager.reloadLevel() - }, - enabledPages: playerPages, - }, - { - name: "Next level", - shortcut: "shift+n", - async action(pager: Pager): Promise { - await pager.loadNextLevel({ type: "skip" }) - pager.reloadLevel() - }, - enabledPages: playerPages, - }, - { - name: "Level list", - shortcut: "shift+s", - action(pager: Pager): void { - if (pager.loadedSet) { - openLevelListDialog(pager) - } - }, - enabledPages: playerPages, - }, - ], - solution: [ - generateSolutionTooltipEntries, - "breakline", - { - name: "All attempts", - shortcut: "shift+a", - action(pager: Pager): void { - openAllAttemptsDialog(pager) - }, - }, - ], - optimization: [ - { - name: "Toggle ExaCC", - shortcut: "shift+x", - action(pager: Pager): void { - if (pager.currentPage !== exaPlayerPage) { - pager.openPage(exaPlayerPage) - } else { - pager.openPage(levelPlayerPage) - } - }, - enabledPages: playerPages, - }, - { - name: "Auto skip", - shortcut: "a", - action(pager: Pager): void { - if (pager.currentPage !== exaPlayerPage) return - exaPlayerPage.autoSkip() - }, - enabledPages: [exaPlayerPage], - }, - { - name: "Undo", - shortcut: "Backspace", - action(pager: Pager): void { - if (pager.currentPage !== exaPlayerPage) return - exaPlayerPage.undo() - }, - enabledPages: [exaPlayerPage], - }, - { - name: "Redo", - shortcut: "Enter", - action(pager: Pager): void { - if (pager.currentPage !== exaPlayerPage) return - exaPlayerPage.redo() - }, - enabledPages: [exaPlayerPage], - }, - { - name: "Import route", - shortcut: "shift+i", - action(pager: Pager): void { - if (pager.currentPage !== exaPlayerPage) return - exaPlayerPage.importRoute(pager) - }, - enabledPages: [exaPlayerPage], - }, - { - name: "Export route", - shortcut: "shift+e", - action(pager: Pager): void { - if (pager.currentPage !== exaPlayerPage) return - exaPlayerPage.exportRoute(pager) - }, - enabledPages: [exaPlayerPage], - }, - ], - settings: [ - { - name: "Settings", - shortcut: "shift+c", - action(pager: Pager): void { - openSettingsDialog(pager) - }, - }, - ], - about: [ - { - name: "About", - shortcut: null, - action(_pager: Pager): void { - openAboutDialog() - }, - }, - ], -} - -function isTooltipEntryDisabled( - pager: Pager, - tooltipEntry: TooltipEntry -): boolean { - return ( - tooltipEntry.action === undefined || - (tooltipEntry.enabledPages !== undefined && - !tooltipEntry.enabledPages.includes(pager.currentPage)) - ) -} - -const tooltipTemplate = - document.querySelector("#tooltipTemplate")! - -export function openTooltip( - pager: Pager, - tooltipContents: TooltipEntries, - at: HTMLElement -): void { - if (tooltipContents.length === 0) return - const tooltipRoot = instanciateTemplate(tooltipTemplate) - const tooltipInsertionPoint = - tooltipRoot.querySelector(".buttonTooltipBox")! - - tooltipInsertionPoint.tabIndex = 0 - - let firstRow: HTMLElement | undefined - - function closeTooltip(): void { - tooltipRoot.style.animation = `closeTooltip 0.4s ease-in` - tooltipRoot.addEventListener("animationend", () => { - tooltipRoot.remove() - }) - } - const basicTooltipEntries = tooltipContents - .map(ent => (typeof ent === "function" ? ent(pager) : [ent])) - .reduce((acc, ent) => acc.concat(...ent), []) - - for (const tooltipEntry of basicTooltipEntries) { - if (tooltipEntry === "breakline") { - tooltipInsertionPoint.appendChild(document.createElement("hr")) - continue - } - const tooltipRow = document.createElement("div") - tooltipRow.classList.add("buttonTooltipRow") - - if (isTooltipEntryDisabled(pager, tooltipEntry)) { - tooltipRow.dataset.disabled = "" - } else { - tooltipRow.tabIndex = 0 - - tooltipRow.addEventListener("click", () => { - tooltipEntry.action?.(pager) - closeTooltip() - }) - if (firstRow === undefined) { - firstRow = tooltipRow - } - } - - const tooltipName = document.createElement("div") - tooltipName.classList.add("buttonTooltipItem") - tooltipName.textContent = tooltipEntry.name - tooltipRow.appendChild(tooltipName) - - if (tooltipEntry.shortcut !== null) { - const tooltipShortcut = document.createElement("div") - tooltipShortcut.classList.add("buttonTooltipKey") - - // eslint-disable-next-line no-inner-declarations - function appendKey(key: string): void { - const keyElement = document.createElement("kbd") - keyElement.textContent = key - tooltipShortcut.appendChild(keyElement) - const spaceElement = document.createTextNode(" ") - tooltipShortcut.appendChild(spaceElement) - } - - const shortcutData = parseHotkey(tooltipEntry.shortcut, { byKey: true }) - - if (shortcutData.ctrlKey) appendKey("Ctrl") - if (shortcutData.metaKey) appendKey("⌘") - if (shortcutData.shiftKey) appendKey("⇧") - if (shortcutData.altKey) appendKey("Alt") - appendKey(shortcutData.key!) - - tooltipRow.appendChild(tooltipShortcut) - } - tooltipInsertionPoint.appendChild(tooltipRow) - } - tooltipRoot.addEventListener("focusout", ev => { - const isChildFocused = tooltipRoot.contains(ev.relatedTarget as Node) - if (isChildFocused) return - closeTooltip() - }) - at.appendChild(tooltipRoot) - - if (firstRow) { - firstRow.focus() - } else { - tooltipInsertionPoint.focus() - } - - tooltipRoot.style.animation = `openTooltip 0.2s ease-out` -} - -export function generateTabButtons(pager: Pager): void { - const sidebar = document.querySelector("nav.sidebar")! - for (const [tabName, tabEntries] of Object.entries(tooltipGroups)) { - const tab = sidebar.querySelector(`#${tabName}Tab`)! - const tabButton = tab.querySelector("img")! - const handler = () => { - openTooltip(pager, tabEntries, tab) - } - tabButton.addEventListener("click", handler) - tabButton.addEventListener("keydown", ev => { - if (ev.code === "Enter" || ev.code === "Space") { - handler() - } - }) - } -} - -export function generateShortcutListener( - pager: Pager -): (ev: KeyboardEvent) => void { - const allTooltipEntries = Object.values(tooltipGroups) - .flat() - .filter((val): val is TooltipEntry => val !== "breakline") - const checkerFunctions: ((ev: KeyboardEvent) => void)[] = [] - for (const entry of allTooltipEntries) { - if (!entry.shortcut || !entry.action) continue - const verifyFunction = isHotkey(entry.shortcut) - checkerFunctions.push(ev => { - if (!verifyFunction(ev)) return - if (isTooltipEntryDisabled(pager, entry)) return - ev.preventDefault() - ev.stopPropagation() - entry.action!(pager) - }) - } - return ev => { - for (const checker of checkerFunctions) { - checker(ev) - } - } -} - -export function setSidebarLevelN(num: string): void { - const levelIconText = document.querySelector("#levelIconText") - if (levelIconText) { - levelIconText.textContent = num - } -} diff --git a/gamePlayer/src/simpleDialogs.ts b/gamePlayer/src/simpleDialogs.ts deleted file mode 100644 index 78dc663d..00000000 --- a/gamePlayer/src/simpleDialogs.ts +++ /dev/null @@ -1,60 +0,0 @@ -const simpleDialog = document.querySelector("#simpleDialog")! - -export async function showAlert(body: string, title?: string): Promise { - await showChoice(body, [["ok", "Ok"]], title) -} - -export function makeChoiceDialog( - body: string, - buttons: [key: string, text: string][], - title?: string -): HTMLDialogElement { - const dialog = simpleDialog.cloneNode(true) as HTMLDialogElement - document.body.appendChild(dialog) - - const headerEl = dialog.querySelector("header")! - const sectionEl = dialog.querySelector("section")! - const footerEl = dialog.querySelector("footer")! - - if (title !== undefined) { - headerEl.textContent = title - } - sectionEl.innerHTML = body.replace("\n", "
") - - for (const [key, text] of buttons) { - const button = document.createElement("button") - button.textContent = text - button.value = key - button.type = "submit" - footerEl.appendChild(button) - } - return dialog -} - -export function waitForDialogSubmit( - dialog: HTMLDialogElement, - removeOnSubmit: boolean = true -): Promise { - return new Promise(res => { - const closeListener = () => { - res(dialog.returnValue) - - if (removeOnSubmit) { - dialog.remove() - } else { - dialog.removeEventListener("close", closeListener) - } - } - dialog.addEventListener("close", closeListener) - }) -} - -export function showChoice( - body: string, - buttons: [key: I, text: string][], - title?: string -): Promise { - const dialog = makeChoiceDialog(body, buttons, title) - dialog.showModal() - return waitForDialogSubmit(dialog) as Promise -} diff --git a/gamePlayer/src/solutionTooltip.ts b/gamePlayer/src/solutionTooltip.ts deleted file mode 100644 index 219f19c9..00000000 --- a/gamePlayer/src/solutionTooltip.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { calculateLevelPoints, protobuf } from "@notcc/logic" -import { Pager } from "./pager" -import { BasicTooltipEntry } from "./sidebar" - -function protoToNum(dur: protobuf.google.protobuf.IDuration): number { - return ( - ((dur.seconds as number) ?? 0) + - (dur.nanos ? (dur.nanos as number) / 1_000_000 : 0) - ) -} - -interface TTSolutionEntry { - title: string - solution: protobuf.ISolutionInfo - showMetric: "time" | "score" | "time/score" | "custom" - customMetric?: string -} - -function getSolEntryMetric( - lvlN: number | undefined, - ent: TTSolutionEntry -): string { - if (ent.showMetric === "custom") return ent.customMetric! - if (ent.showMetric === "time") { - return `${Math.ceil(protoToNum(ent.solution.outcome!.timeLeft!))}s` - } - const score = calculateLevelPoints( - lvlN ?? 0, - Math.ceil(protoToNum(ent.solution.outcome!.timeLeft!)), - ent.solution.outcome!.bonusScore! - ) - if (ent.showMetric === "score") return `${score}pts` - const time = Math.ceil(protoToNum(ent.solution.outcome!.timeLeft!)) - return `${time}s / ${score}pts` -} - -function findAbsTime(sol: protobuf.ISolutionInfo): number { - const steps = sol.steps?.[0] - return steps!.reduce((acc, val, i) => (i % 2 === 1 ? acc + val : acc), 0) / 60 -} - -function findAttemptEnts( - lvlN: number, - attempts: protobuf.IAttemptInfo[] -): TTSolutionEntry[] { - const solutions: protobuf.ISolutionInfo[] = attempts - .filter(att => !att.failReason && att.solution) - .sort((a, b) => protoToNum(a.attemptStart!) - protoToNum(b.attemptStart!)) - .map(att => att.solution!) - - const bestTime = solutions.reduce( - (acc, val) => (val.outcome!.timeLeft! > acc.outcome!.timeLeft! ? val : acc), - solutions[0] - ) - const bestScore = solutions.reduce((acc, val) => { - const valScore = calculateLevelPoints( - lvlN, - Math.ceil(protoToNum(val.outcome!.timeLeft!)), - val.outcome!.bonusScore! - ) - const accScore = calculateLevelPoints( - lvlN, - Math.ceil(protoToNum(acc.outcome!.timeLeft!)), - acc.outcome!.bonusScore! - ) - return valScore > accScore ? val : acc - }, solutions[0]) - - const ents: TTSolutionEntry[] = [] - - if (bestTime === bestScore) { - ents.push({ title: "Best", solution: bestTime, showMetric: "time/score" }) - } else { - ents.push( - { title: "Best time", solution: bestTime, showMetric: "time" }, - { title: "Best score", solution: bestScore, showMetric: "score" } - ) - } - - const lastSol = solutions[solutions.length - 1] - - if (lastSol !== bestTime && lastSol !== bestScore) { - ents.push({ - title: "Last solution", - solution: lastSol, - showMetric: "time/score", - }) - } - - return ents.filter(tt => tt.solution !== undefined) -} - -export function generateSolutionTooltipEntries( - pager: Pager -): BasicTooltipEntry[] { - if (!pager.loadedLevel) return [{ name: "No level loaded.", shortcut: null }] - - const shownSolutions: TTSolutionEntry[] = [] - - const builtinSolution = pager.loadedLevel?.associatedSolution - if (builtinSolution) { - shownSolutions.push({ - title: "Built-in", - solution: builtinSolution, - showMetric: "custom", - customMetric: `~${Math.ceil(findAbsTime(builtinSolution))}rs`, - }) - } - - const lvlN = pager.loadedSet?.currentLevel - - if (pager.loadedSet) { - const levelRecord = pager.loadedSet.seenLevels[pager.loadedSet.currentLevel] - const attempts = levelRecord.levelInfo.attempts - - if (attempts) { - shownSolutions.push(...findAttemptEnts(lvlN!, attempts)) - } - } - - if (shownSolutions.length === 0) - return [{ name: "No solutions found.", shortcut: null }] - - return shownSolutions.map(solEntry => ({ - name: `${solEntry.title} - ${getSolEntryMetric(lvlN, solEntry)}`, - shortcut: null, - action() { - pager.loadSolution(solEntry.solution) - }, - })) -} diff --git a/gamePlayer/src/themes.ts b/gamePlayer/src/themes.ts deleted file mode 100644 index d259acee..00000000 --- a/gamePlayer/src/themes.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Pager } from "./pager" -import { resetListeners } from "./utils" - -export interface ThemeColors { - hue: number - saturation: number -} - -export function applyTheme(el: HTMLElement, theme: ThemeColors): void { - el.style.setProperty( - "--theme-color-huesat", - `${theme.hue}deg ${theme.saturation}%` - ) -} - -const themeSelectorDialog = document.querySelector( - "#themeSelectorDialog" -)! - -export function openThemeSelectorDialog( - defaultTheme: ThemeColors, - pager?: Pager -): Promise { - return new Promise(res => { - resetListeners(themeSelectorDialog) - const hueSlider = - themeSelectorDialog.querySelector("#themeHue")! - const saturationSlider = - themeSelectorDialog.querySelector("#themeSaturation")! - hueSlider.value = defaultTheme.hue.toString() - saturationSlider.value = defaultTheme.saturation.toString() - - function makeTheme(): ThemeColors { - return { - hue: parseInt(hueSlider.value, 10), - saturation: parseInt(saturationSlider.value, 10), - } - } - function updateTheme(): void { - const theme = makeTheme() - pager?.setTheme(theme) - } - updateTheme() - - hueSlider.addEventListener("change", updateTheme) - saturationSlider.addEventListener("change", updateTheme) - - const closeListener = () => { - res(themeSelectorDialog.returnValue === "ok" ? makeTheme() : null) - pager?.updateTheme() - themeSelectorDialog.removeEventListener("close", closeListener) - } - - themeSelectorDialog.addEventListener("close", closeListener) - - themeSelectorDialog.showModal() - }) -} diff --git a/gamePlayer/src/tilesets/cga16.png b/gamePlayer/src/tilesets/cga16.png deleted file mode 100644 index 0041ca0952f662e3db06345978ab1c530b19f541..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6793 zcmY*eWmMEp)c)<#-LQnR2uLGH=PpY~cT0&ucS`MofFdE?NH-EHCAA<8(gI4ew4}7e zzWm=0?>X}>{88H(v003las!IBIhynl*K!|e}X>!G-+yTf- z{|N%99%0$OOGI=v4VAHX0Z?(LKt;uW?hcIp3yuC0?4256vH!XMg}d;syXDmvfjgk` z*4H)w?xy~qP}0Hk0f2E+O-aGfKYPzIs-cpXnzNUioaz?q)Z$AP!{jyET(h)OpSf0q zoBVqU%@L5T2)WdOU39vQs9tL8M+>PZS_#J$(z1D!B&HFU3*JwO6^_@Xx1UMItG`Y$ z6U?^}+u`Z)DdYp?ByZ{ynGqW6;;#<=bt=-@8#*zx7i^ZMy?EYb=`PjGuK`ng;v{ao z`iLW5C}s5?js4_v-r+$$=T6(+0msTs-pvE+*X{8Z({KhI7R=yqn##&E?0V5aBoHlS^DwS79=+ z(*@Au9nu0Cx`67dvtnF&+YTk^2e`C_l1Bu2WY;ha=rpw?Eda6w3`Aq@$6G_v zNOsCL&Ur!-1cTls1#FhMI^3SygPXIyn(g{(Hq$6xHzZtgg>f;L7=LFjF7ipK`Wa_( znNqW{;caqD-}(DTYO3AX=tk%4XqI26i>tVbe!;z#`U@tkc$*64%rnTC&u~?vlBMG~ zdnU;7b@~47C27#lZvoorc z1kf*0Z46r+1rCM7nI4E#4A{u!un`AtzLOif5NLB8+5n9OI!AXEFzQ4H`S!1lxKMe* z5jusk7LWW-6j>SZe(a+jCuZoaQ1>%RK2GO19Y(S?=c_2XNelE}N@ZpwN}h zAO}iW40{#btR^L!UZ$6|ED&s$w5AD*GmgVnH~^T(}Ty z=m>@4iH#ZV1eaEV+_(orKn%if!jAxL?7wW|E+)ZxB^!zr#)x?Jd@x&k{G&zWRoPh> zq11<+Fe9OSsL(tG0`6Ueqx=3o7vK$2+tKb=QzN*2C2`cB#ratALX~CH46t|adRhe+ zO#-H3$aE>-snyh|3|v5dAF>HIcejaamd8oQLtWQVCudUK!trb)8Bxz`G6wj&IxA4L z{hj$#b)e}s0}Y#@AtwLpDZ*fJ#AC2{8_ua6S6(RC88soL@JnETXj>+W(7D}R`O`g9 zA0{_f$fLQ?Kk!&0oAxvpx!TsQ+!kM`&57CM!{a}x@#d51Dq&gG_50%WSMcVaJY~g- z7+r-T`iv`FGb#6@%b4GPl>YD)9QNhuLu!7T>J14$il%L!iH{=G%FR2w*+ zeIheCWV_Sqz%n_4&Wxg)mpFiu-%^zo=ZqAELUjc4VfaBGi*bNc4N}yuVjEfnKnP|U z0tA6k+UG>5D$X8{O|j&Q`4@ZPG66vR{v;9d57%M@86{G$GmjTyglA=RSYZUM$Ug(` zg?}Fm9iH;D?4|+)i2(*0fDxY%Q(PNr&Aig{wV}{9c<%4w2Oon+^9R2}Q4J*}soJNd zN{&yCivRL43Aj33WI^5*JxyJWPFjr-)CnI`EAkvd?Aoms8C3=iI zhgT6QR`n=bwv}|H|6T8Uw(aW}vkm4W|Ms%G$#azj5|P}^#Z$~W(vg>BwOPf|tUbwA zzP)^axBgz_ubR^X4=%Bc@cyxzY;9ht(!>}9=Ypkm>68zHDBdF29`K|4hU5P5vwD$r zd7kdCD0Nsxo=9eIneB7$PkIe1fwogA7#& zwo>Fb7Nz!arpge%3~pRF+xQ*H=rRJWjwbk{^m0IalH2bd^{3-z0S0^oJH3g9`pwV? zQ$mYNw{hBdxb2VWNAgT5?QGJ8s!L)>*#SQ)OsFO%?x*WT`~p*Fkeey7n{LieH0a55JpW(Ur%fWE0VoM1xVP;BXFXk{`<)5U;#7Mt6yL0SUF@#S|y2C*v>%v#B zFRo@QUSUyICLfdI_%1d5ZOpuvCoq-;BH`@6>0AIr(c zl8%%wSueMHnCtTyJ~WuwHuQ?p6Hoyctw!6m)84@(!F<7Oj{j0qBDXd?R&_uCGrcUu z87Pzohll$fUJ6UnmCWE$u(P`LO?0{X1CmIAQ<+ku0Y@^OiM8ueAomD3h*{#?!+ z37`@?fU)VO6xF8~;|D~j_i#Kk@4E=%#C{_@HO@CNNhZY{QSTFp)7w)LIe7m~Utvce z)=c?~IgI&?#my^YEa|Y!xr}o$j^=!~uvjc#3S+yasl8>N0u@r7&j9&sjV$fXacKhGQK z1ZKC1039$zpI=nkkGJazF}d=x;I7=ec!5k<2`F*07ue}rTKINS6=tl8nC&I7Q&~zGk_hMZwL^r zy!Qax@Y>w2kkC1kgztYp2IVL5igWiIpG9mMm%(EW6FokI#JZ;O10D&nbEq&gv$EM> z*m3jbl1x;1>EbB`8E2e4f8l$>P_IL!&xSIX&yKI&8w&ywqLBuC0-gR?V8E zNv);*TNKCUk%Dcd#$-9i=XdV-Wm+&D?Z!aP{NpXRidn8P z$LOveVxWfT_(nEQ6?ieG`5uu?@TLVA3tN2`)|^%bp~=56lTP%24rCbdbgP5srCtIu zJZtVz!tJeIbPchH*4C@}OC#>32By))UQacwV1 z|F(TPv3cmr)V${!pl>T?@7Q}j7sa-8hMzKrIr0 zQs}K!SMsD)7Aq;k%J_I+6}W&q2!xrJCXh%G_h$bcz?X!9q^vxn*$102=HMA|8{`ki z+1T+{%tD1f&8}0(uG8iZlNf?7&#AOksGgg-onOimvR+*LT*9Mdj5>0A?-b@*!ABkB zy!u%^V%85@08^l3C*yGo1_b+JLBe^^Ha=8|fQht?>P=IXAHjDqG`W?u_9l2E?T4 zY!KXDQ_JqrqCa^Vo<3i*#GC56u}jogS@e7{Z}qJpN;Ga!0#ECC{xPUHVKX&?x5K@Y z=^Y<>O~0DvOgLt_^=-l?UV_QhkbxWLIN-q2=0;r68@7Q1ItFDiNQUHXe9>FHzR4h? z#Jny#lKerU!kE@)aBHox`k@WIf#YCxSY9K5x^|EVzUM4&BihTy7{vVh&(&XZ`j^>$ zmD%+v%^?CV8m!*mN0nQbJ?KAto~bPC*JB}*Td_`E>eXXc8+fSS?N9{?_fUMzoT-wTM5}JrqLB}YKfVwx*WQG>r7;T~j~cM=8ckfjUX{r1 z#yQSyi&Il4`kMdqwAnELHskb3%3*a7YY3J@eeqqMmx;{Bjh_f|#tdRLh=OqPj-BLZ z(yoV^{$f?YJ$ns_y==@5KQBZ>rf1>eh!CJW9`$d92o+7~6>a>LbAgoYU+*dB$9=&v z*2nL9Lw~zAYS?=r8!31`UG;6qqmK5p%Q)Z`6bq{!7Q2elai$Z}OY1jqU)JRZA5;I> zIXGNCdu+)30aF0a|CTkvsQj<`5~C)c@*!-!&NNs$m3mOJKx)58T)VIR9?Es@KI~#w zWUt})X!7AT2R{x-B#MM`#9Gw)jNn(5G^mVGH~3e-N(XkP;Tnb?pQ*m@U(8dh!?60!MvUZ3aRfZ@+1%2USMF@X$4!2Dn znSXTi)s-9Pt$^8i#hh{0?I(K0k#7s@etYoJH?NUx-8I|5i86ua zHqi2{oO|Q5*>;vLuO(y1AWWpooB$IINlFM^ijIjc@CFJClhbtSdHGDQ|67jQ|D!!c zbsmhAB0!MEexLhlEYyba2}=num!t}YDbH+QvLRUyW8?2Vbr*w3YU&P7<7dtEL=m( zSiJ3aLN#A4y^hn*k`Ps0S6h(RV2w_ z^)%*MgnukU;u+&QiZ0Cz3R_E^Q{^_NXst!8W=7GH)-v>an;H1Ag`>)Iqb<8p)r$PU zA$zq9khg4;%IYuo$UdpRJoi|*;bb;vs7-Fv80UjLUAl%rk$towFQ|$#7D)g=oMIz9 z4546~8L|vg4jf7U>q7}cn+NA9TUwl6YmKb0j5vstQqdju;pwQ0rIu&=ORxrpJ+Ho= zr;@v;aj;@-WAhM2B-ygb$#UO5Qrj|w@$kbI8{QtQ*pS>@)MUIo%EY?@gQNn;)d8uI zODHE0t3y-8_|K53?z2_5P8t81TDDL5+_6&WS=WQ;r}EXyK{+ZMne8w6Cl73z*omv>j@Ej)h{GuM!RY4AW0=D*QwQo zA~CS!4AVP$@H7&5_9>#h)|Iujb$GB;qD=6P zjGn^Ka+GNRuRkwyA~9O+3W)ru=a1Qsp!N%yG2EHiLwHS=v zmVVg*I$Sy1^>b2jbPJC+4w68%S!+FOYz!fYo%-HrJphXTlElM$utQZ*P0{< zy;@hbGIE-^&p!q9Y6{%QE zjMq=qk5c5e!ggJ6v6a_f&PlHONA1eT=X>|E_1>({=@(zU;iRW2Z`R`+WIQm80Er!u zqpYj})o68x1fHpAP21$!_1~&FVA@C_|B#OsGpOBPo?LA^oWN7#p&@7Cn)9Q_S&OUd zS(d^rdTYs#0z@(*m;tXLFp8glBceBb=ITX`&hJoMbg}Q641lo%a{A{^+ue-fUEqc` z2MqQ=_AEMw%2#Cu^3o2+=z5W`9r+bIQv4+Mq(Q zXT6jbWA!@PMWOVe)p&UvRvD1w2Cey5JA&Yt$?&c`onoq|M9~*S>(6R>&C>qCG`z{n z=Wh93FPp-SeNoi{q+$NSz9>wj{axS2wWlPurkZ9anjEQ#-JBu9 z*7+_USvwI7FAz&NAA6S=&|$LxNpqn8s6rvL;vy$^sh&pg@~UWjZIj7u?#ytjGW3a*y;14$nTv(gpLBR!y1H|Z!;bu#>1z1ogLM_CgNLdbhF7!4mORB@79sHIrAc)hu9y(0MK;Z_qzvn zE01TR^Xdy20_<3Wmw#5+$HupZ3J+p0UJ@M+U4-p2XbdS|B7+-cWdMSXI9BWq7~#M5 z { - if (tset.type === "built-in") { - return await fetchImage(tset.link) - } else { - return tset.image - } -} - -async function getAllTilesets(): Promise { - return (builtInTilesets as TilesetMetadata[]).concat(await loadAllTilesets()) -} - -export async function makeTilesetFromMetadata( - tset: TilesetMetadata -): Promise { - let tsetImage = await fetchTileset(tset) - tsetImage = removeBackground(tsetImage) - return { - // TODO Add custom framemaps - art: cc2ArtSet, - image: tsetImage, - tileSize: tset.tileSize, - wireWidth: tset.wireWidth, - } -} - -export async function getTilesetMetadataFromIdentifier( - identifier: string -): Promise { - return ( - (builtInTilesets as TilesetMetadata[]) - .concat(await loadAllTilesets()) - .find(meta => meta.identifier === identifier) ?? null - ) -} - -export async function updatePagerTileset(pager: Pager): Promise { - let tilesetMeta = await getTilesetMetadataFromIdentifier( - pager.settings.tileset - ) - if (tilesetMeta === null) { - // Uh oh, the current tileset doesn't exist - // Try again with the default one - tilesetMeta = await getTilesetMetadataFromIdentifier( - defaultSettings.tileset - ) - if (tilesetMeta === null) { - // Welp. I guess something is really wrong. - throw new Error("Can't find any tileset metadata") - } - } - - const tileset = await makeTilesetFromMetadata(tilesetMeta) - pager.tileset = tileset -} - -const tilesetSelectDialog = document.querySelector( - "#tilesetSelectorDialog" -)! - -const tsetInfoTemplate = document.querySelector( - "#tilesetInfoTemplate" -)! - -function makeTsetInfo(tset: TilesetMetadata): HTMLSpanElement { - const tsetInfo = instanciateTemplate(tsetInfoTemplate) - - // eslint-disable-next-line no-inner-declarations - function assingTsetInfo(key: string, val: string): void { - tsetInfo.querySelector(`#tset${key}`)!.textContent = val - } - assingTsetInfo("Title", tset.title) - assingTsetInfo("Description", tset.description) - assingTsetInfo("Credits", tset.credits) - assingTsetInfo("TileSize", `${tset.tileSize}px`) - assingTsetInfo("WireWidth", `${tset.wireWidth * tset.tileSize}px`) - return tsetInfo -} - -async function makeTsetPreview(tsetMeta: TilesetMetadata) { - const tset = await makeTilesetFromMetadata(tsetMeta) - const canvas = document.createElement("canvas") - canvas.classList.add("pixelCanvas") - canvas.classList.add("tsetPreviewCanvas") - const renderer = new Renderer(tset, canvas) - const levelBuffer = await (await fetch(previewLevel)).arrayBuffer() - const levelData = parseC2M(levelBuffer) - const level = createLevelFromData(levelData) - level.forcedPerspective = true - renderer.level = level - renderer.cameraSize = { width: 5, height: 5, screens: 1 } - renderer.updateTileSize() - renderer.frame() - return canvas -} - -async function promptCustomTilesetImage(): Promise { - const files = await showLoadPrompt("Load tileset image", { - filters: [{ name: "Image", extensions: ["jpg", "png", "bmp"] }], - }) - const file = files[0] - const image = await makeImagefromBlob(file) - if (image.naturalHeight !== image.naturalWidth * 2) { - showAlert("This doesn't seem like a CC2 tileset.") - throw new Error("This doesn't seem like a CC2 tileset") - } - return image -} - -async function saveImageAsTileset(image: HTMLImageElement): Promise { - const tileSize = image.naturalWidth / 16 - const nowTime = Date.now() - // TODO Somehow determine the wire width?? - const tset: ExternalTilesetMetadata = { - type: "external", - identifier: `custom ${nowTime}`, - title: "A custom tileset", - description: "This is a custom tileset", - credits: "Unknown", - tileSize, - wireWidth: 2 / 32, - image: reencodeImage(image), - } - await saveTileset(tset) -} - -export async function openTilesetSelectortDialog( - currentTileset: string -): Promise { - resetListeners(tilesetSelectDialog) - const tableBody = tilesetSelectDialog.querySelector("tbody")! - - async function makeTilesetList(): Promise { - const allTilesets = await getAllTilesets() - // Nuke all current data - tableBody.textContent = "" - for (const tset of allTilesets) { - const row = document.createElement("tr") - const radioButton = document.createElement("input") - radioButton.tabIndex = 0 - radioButton.type = "radio" - radioButton.name = "tileset" - radioButton.value = tset.identifier - if (currentTileset === radioButton.value) { - radioButton.checked = true - } - row.appendChild(makeTd(radioButton)) - row.appendChild(makeTd(await makeTsetPreview(tset))) - row.appendChild(makeTd(makeTsetInfo(tset))) - if (tset.type === "external") { - const removeButton = document.createElement("button") - removeButton.classList.add("removeTilesetButton") - removeButton.textContent = "❌" - removeButton.type = "button" - removeButton.addEventListener("click", () => { - removeTileset(tset.identifier).then(makeTilesetList) - }) - row.appendChild(makeTd(removeButton)) - } - tableBody.appendChild(row) - row.addEventListener("click", () => { - radioButton.click() - }) - } - } - - await makeTilesetList() - - const addButton = - tilesetSelectDialog.querySelector("#addTilesetButton")! - addButton.addEventListener("click", () => { - promptCustomTilesetImage() - .then(image => saveImageAsTileset(image)) - .then(makeTilesetList) - }) - - return new Promise(res => { - const closeListener = () => { - const dialogForm = tilesetSelectDialog.querySelector("form")! - const tilesetSelection = dialogForm.elements.namedItem( - "tileset" - ) as RadioNodeList - res(tilesetSelection.value === "" ? null : tilesetSelection.value) - tilesetSelectDialog.removeEventListener("close", closeListener) - } - - tilesetSelectDialog.addEventListener("close", closeListener) - tilesetSelectDialog.showModal() - }) -} diff --git a/gamePlayer/src/tilesets/sources/README.md b/gamePlayer/src/tilesets/sources/README.md deleted file mode 100644 index b2c012fc..00000000 --- a/gamePlayer/src/tilesets/sources/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Tileset sources - -This file explains what the files in this directory are and what relation they -have to the built-in tilesets. - -## Tile World - -The .blend files are Blender models which used in the Tile World tileset for -tiles which the original tileset does not include. - -Renders are made and inserted into the tileset image file manually. - -## CGA16 - -cga16.ase is the Aseprite file which is used to generate the CGA16 image file. diff --git a/gamePlayer/src/tilesets/sources/bolt.blend b/gamePlayer/src/tilesets/sources/bolt.blend deleted file mode 100644 index b18f177a9490d5c5d6cd1086e187c2345abb455a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1188708 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

CfsND_U}R1Rb0!im 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 diff --git a/gamePlayer/src/tilesets/sources/cga16.ase b/gamePlayer/src/tilesets/sources/cga16.ase deleted file mode 100644 index 463f3db00b8a97b04db7db5a9414c0be00fbbaa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6941 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 jN0Y$#T0SgBV_W3Wryl6mC_K+ci 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ξ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�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 z zdYot-t8mpCFd5Sh_UQaWjZtM<+1@n{pia+6zask?#K@h@W5JM-v=){iBf<5mVW}p- z@@Q9FIbAUh6NpZSHid_OF$WJ@DYCr18|JPJQ$_f4s>Jw`OV}0R^F57OUZJSh?p(HI6N3OA&W# z3mZr;*V@Sz|SK5Gjx4(8%*bxEE6hlc@6l#F*I5GHJT)kEd7i$ugJn;>Vt%?4r)aAYh{WZmMW&HWe1wvjQ=KBERUQ&c zSQ~aH6B{=hUvVpLdzTF;HesF0GBC@%X!e|SyaT2^@?~Zs-G2C6`X;nOgLPXtuU?nL z_OInqYt~QJu{@b<>W}I8CegMP zZ`V}4&0WA*A;X6WKWUGTl#!BNyEL3#Lm%er%U&!d>s;KErS-3R)xf@{zXy3q5~I9j zG({JdFaP=Q&5wl4zQz7wl(1J84qak1uGuV?iPtbD2MwR6PvU6z`=+eJUnZL1z8odV zp&h=eIfxdglk2bwt*hAzeF9LnV3-v5x;|pTNm+2Tz^e2tylNfdjDxa1Yn>n+_9|MMtzm%Xh0vpXc1x}) zjF-X6KOXy#>Y4{sjaKo6KNq3!ah=dd6^c$aNt~=q{#G53)@ufW55n`Rg_|464DtcDEU;Nna?6(L8yfZ?sC3 zx7KKvyt~>$5n&sDTby*NJ*lJa#-0&Hk|CIY$?{4PPJ#X=U z5q4Hladc6GMT3S00s)fX?(Qx@0>Sme-6c3dn&56hgKMy$!QCAK1b26BoThs!|EyW_ zGHcCCKS6iZty@>lJ!fwa!m!e!{b&AC^;bLvzqTY}kkITlwk^zvjAvNCM8t&$)^28s zM;l%WCw#;wD7fE<7mahDzJGsn-0(HW@QLO2FLyt#{(+;Vvs2R#r8wLMDj-1AHY-^I7Ru8OTelP#3p2!Imo52v__qA z8BxM1X2cqZY-z_FYdGGpY-qb?!YyjQqBtjAkW*9H7nkR{5Ks%c(xHQgy_1f2nv92`-8rzATc(hcdQ&f5AgUZlU&oI0aI7>DP>Z)UUz$x;h{jJ0@zu}O&(#E?CH79m{}maE z3O*2enXZYI&pe!)tMC!OIOyEDCs{Bu)XR7fyahS79t~}ay+B=+Dc2z|_7c_Q!{@Ym z5U_pkH@SQv9PPT+IWEug!7finjBCQ!5!_+YiJy za9rLv?-R*8_H*DWA8;q`<98;fln7x7-=Oh2i1Hya!MP%Dn)0qREX>mF)Cu(CX05*J zc(j<>iQoYhE%|WmmfyDm(*YX+P8)8*EH2Fy;OV2>EQ>faV>_OC;fP*}nyOAmR>CcBX)(asDadki5H8+rjxP2-pC1^CfSL(z z053vSEX?uWe|NFhhFEC^t_uIB)>p$-_1oCbq-@!m|WHpM?+ z^nbh&@$^hyq7Vui#cvJ z7gFX$^m*rv%xP*b@-L%p7_t3oumbz_h@B%XEiC{Xlk+#$)g`{LRs#@qdIqK!w_oM_ z_&7MafvkD(%ZV|)z;>DR9RmX96Ve4y0F<)Jl#ppm)oAGNfV#SZaZ8uhEc#rWo?hGN z?B+mC6vWIZJ)jVuz?XxcOhKdy$V(gaq|&>mHZr-pk?Au?>qcZDOZl`v1B7Yi@I%+P?!OPwIF2}SG9_kun5)?pNjG^D&cCA&Yw4m{hr<$O)$btz0+xpq%F z1y?*leikfE0BEGCrKH)_E0a=bsGQh497Yx;!~|=0&F&=GXA6;d&FfbQHLpA~eBaex zp^h@4DK$**z$?X0n<+B$8C-tlwVT>(y4&~@XLEyPN`}BlQs!%`ai)n=<5BqruFDm6 zW*5)3vAUTBMm!xfjYTi@Mlj_vUW=pMh`lE-&A-h{#iCRr>Qo)UU^u<%zeCOFk0~M6 zryVM>XeL63#-W355%PukNV8t$cg?XjfSlzcFC*r$xljy?L{hU@@JDenqd6jySvBRX z-`@Jzt^5Ds?q3GW{;tCxJY>mW0WOf~N=Wv|ObhbCqI0}HBI2i13Lc0u^W5)i7)I0d zC6P>#mjpt~V5v(w)32&V$_gKrSA107?;q?^r?h@N=JGom$>`GK!y-|@R0~}}dJjWb zXhrV}(~u^445GuZ7#*|{(-4aq7Q@DSRV-19j|#wo{}l~5GP)i}w!pkFxb&*f3tv~2 z^H+)B*$HR8uiwjr0u3t`!}5S~ihdp;_D1G_fuYm@RqJ~x}k@H_`r+b%Em6ygn2jP9o;fy2{vvz};ubB`~=`Vfy-W zaoShT4S5CNi#f2@2iun)&$uy_9G27Z;iRqil4ndDEpzP5oiWkTY;m1+`)e3h(FQMk zAqJ&U)N=80K>pe%mhNV;TJztgEDz-=^`8n@W%%Cf$8UP+v8@jFI>~6F%NaWJ5`E%e zqWwhcU)}{t5dI#JSqw>*gc7}d8;1*f^U>kdSP}!Cn)=rBLh)2Eoy|fAnD5~QU#Npn z<+0=%Hbeeez<)-=tp9i;eM2+H^ElxlmH#DR3^!=e<}C^wAF@$o*^aY6z1m~)Z>UK( zKQ=8bjMKu>QBx5`+Ypj>YhDs4#Q*(?Q;i^5*l1wq`<5_}F@ougTV{xx;a}e*70SB3 z_a*&}kYb=Qm6b(jH_k2_h}-NyuA^e=uYZ13+wyA-6uUf?-fqWe9e*sn5l*|-^(}##0@?M z*Bi^~dF~s8kKBA2mVpxH`&t&vsY9aEFD8ci_x(alLpUZZEI8mAlu&a#<{NHGMBF+~ z6x`R4U)*9?-0u&;n6daV+DVYWdqlTHq$=FLWv!3SQ3<`ZQ6u-?CqF*fo#gpU`8%LX zh0=v3tdq~J&td}`{9k5}K>P2Tf@?SQ(T*jdqVtUJPda(^eMjrK>D|hs;>hY0n`1*s z(MKcLb}imI?EguPwfSbl790!n!SzwuMK&G|Qk96itp1GgLG1tJ0#w3vw>D;Gk~WEE z<4V-L$m+R-%<@lsY?|r4u8@p zh7@DJpO2X2a0iCO!W6*WZiD=`UbFtpx7S=$a;BNkM z^a=+-4u>88@QpWzdZg^ynWLw@eNCMUEqUbwg??*OOJMzU2KQrD#?8YN1`C&I+DkH{J`cRvV>j zZ09FFOtWN9?WnNPN}b4vQ7*MM+`nTEwIJjd8sl&vLy124EF$7^J}>7hnaHE0Sg)MR zW?oBk#zA@R4nG>W57rGEzOAU8+x)A<$`j6sDb;eTBX~)&d6gU^a=Tcf-@(L>O0{6m zsHmq~ld!_3UFE8d?hUDJ!!GBnmTM(CCsB zC4CaRyhF3Ww}f^UrY?K=k}N4e`iUQ(T@Zt zH_?fL#Ptc38LqSGS}9UQ>Lizaq-YnL)>XM%{R#&rKTpj{Jq6HhAdOeswM4dLPJE*x z6(ZrdT)Bm0B(KU*-%@*#@KBY?{pVLM7E*`6ZTSpHU>>qf#e=ISVdeRGjFfM~I(j-z zZ!Rp})*pU2>?d^(Mo8Nj$bIA%KYqls?)0boEd6=#LQ5rvV^Fl9ae{H+)Obb&L^27k zL?Hj17mo@t0&AVAEtO-`(3s8qC>s=uV4nD`PPAMNK8;GUh%}8|eKmT}buN0d3vXP{`f?mCKhMhr9z*T_|Odq7{X31V6_AWGQ{< z^63K8^{FG&y?&zdmW7f0P5TSExtyJzcPaOh{`Zs#d^kszjvratcvpy=Fc~jC>o+8QL{@)Rg9R_rm!5!Q z2an%r4Pz%oZ;ughgFbhD9_;-!Sdm1c0XBnAy6a*}G)fxZuvfIjgwkU9EIx!DSpVFf2yinmwx)AmoHM=Z6di`Gg0z!cZd`~=k-E=YT1u0dyaD;M5 z^cg6Bbw|vs?YlC2T{=861ZjL8%yBs3eL~KHO3`*%a85R#S67on{UR6R-HbeUL+b(Z zWt-OVxZ#cYDPy^jiGRW5K$xZLM}^#j*of^MIa$t$)k0D8DkD2<{9)#^aZhBH&RnS+ zYo%nt{Y@|>RLh(k5`+_Wsgs)JgGDbx?^*sU*0TtICVU!u(CVqPTV~8zsF6?)ohkeL zqGEb6N)6wy~P9&$YcR})wQg*I~Qv2-b6u3k-&y8E`h zUMR!IDf3%&i|nl9n!8DrYxkM3rv)jjpUM;bryqZPES{tXQdkh;I6llye>$trXW*IM@=km zbn`jRHt0mv2Ez5%&TxbAiS?MpsyOO4kwIS-b|=XlJ{g%ZW*NG#LHRrxa+M;?wY9D( z9AzkZICfnE5;y@IqR6l0Ti zQ>4g)SV9aTJfkz+n(a>)c1C-VSqjtRgh4jD!;^vD@+j)jwA`QgX*QwS%TW;^qVRh_ z>rXsOzgd+-X-J!3XT@Ye6#V80>}ATbt7HSspoUIxK(35izrN`mcHp0i|CFqOq{=8i z`i`tOy)X|3>@S2eim)vO;E{F@nW9Kclg`R_V|-)Al-y33SUW?aGla_IGi$tSoKqRf zaE!HV!x#gDRbr9{yOj(Jt(8Jpigh0nvF3X*-8Cz`OCzFS)oxg;Bx>34ea1K|T1k-DBwN0+@==C3)6fk7}M*j@aTJ03P?BVti! zR*?`?nU<)vpEM>*zEP0n^rV4EH1mmhaB=n*6GnM9cDa1a@@Vn35SJzMhWjQxo!A0J zY474bBS(m-dr4@P9LR;@TETNt=f`6_(X&d*rOpMr2xQzlEFIrs;j>wfl#mN6)r^hB z;?3h?>fLyrctgU@GiRM**7DuY)#i>TwH6xa&Xy+%y%~cX)BIWYB}$pai1c{-;}1I6 zhR*>hP+W3!dWw=XcFs?o2#hG#I=#mE#l@k|7hM~eh`?%knxnC)c&JyI|D`OLbFw<` zif~sMjYyW5T7PX(b|yX8SH3{Zx5s|9|HRCYb#rm}U8%x0sz$ThjqGmvy9#wV;vD2JQ!*h?mnV3s`~C zoln*;@PnToJuQdlYe_JEqm&D{m$@vPcg6Vz z>J9LZ3!;#!*}^;_BS&LvJuF}tu!ZbTEHmpzR4A?aPGJJYsE^*PZYO8xAM% z_m|NpYh-SWl?{YH^yAap=X$FfcxdCnT{jfBPxbjfvx2u02rRZFcC|Een%HsYr>=bnY14?X!@q^D*73b<@BS!7Ik4M#u`#l5cGg+EJbuexO* z0ob0~fYNzvLc{-Lx-5%+U{5q0hP^)j^|CTzs8R zUPkuEyBctBrd&Zc5?|q<@yC5xNt^Toa{1W3BlmEZR_VW5OMV*OnZZ;10rH={u=hE*9PZdz&YvVJcbwmo zXWw`eynx0*SI`_>{tg4|&Vb8X1yn|y|6n(_W$9?eGUMLPL3JVoQBjjaPU0NL&h6{( zo}P+s&s+ja6il%v@eXDaUAjDhpu`)lRG7@ZINs^qQ435%0SwR)ZVIieAuk8E1}hBc zkLuEV0^>euzuvAah^Hq!{_E2r(q;MNF7@y<=E1CoiH$Cao$_B{d&D@OqG!~4E;h>c z=Ie|wKRg3GPvUwV2ZVK~kt-@78R_2$6Rjh}TO(MsC!B(g);&9Lr-P3Lk3L^#HNV&*m{6&qDC;W_ zLBOOWU&OLK)tA@MMptNlYKFFOow+YUO82{Y0;Bj+ zNQsFEiS_7%o7S;!+UCuwJM5vXZP6WkHm|K5FN99-ePZ``quu(c-o>Dxhu~7=qm0hP z@cdYv<<54~@dy9aEVC|w+@MHyL2hPe4Ylq&JStk1n-6l_^lcw5y6}TUg&zl1_^-E} zK*TI2nUh_9=S*4314L~vA^mO_AA2@%@^jQ2u`%EUPO#_dkmhI6Bto3^!>XOcScVVO z$uaK4_^<&h%rQQH4ickpN~7{4Pn@ok(!}loFHVfV z!bZs8k^AH&2X>6TfMBr583#f&IbcYE*a^Ss$Jb+g-?Jb-9OKW!9%8 zRkof~T)*!cGx}zmj3zOVK(tv_=)q!p-0Q$+j&CuUiLufaW8!hS9Z4+WAJd@2|78zK zbFm6zeeBMK`51)u-y6F_3a5D7>h2wIJjE5`Pgqk~4f~5(IXz>)!P~)0%p1OCh|^v% zLjjK>`Z(b|%P5UUtL~EARvj@5C#akBD@=qs?M;Lhw(jO`PKmbut$6`O*J#K_|Dn>y zJ90}Ep>4yU?^+H`GaTVUR$K5t(xAjGh>Yz`O90V#zR!5kjG%W4NSUAU`j44kf68fW zOomoF$yQaOWS?_HhIH6$6;hGupd=bq->|>A(A>&JQ1V>fzP?r2A}2(7s7`AokhHD| zW)qJVWVTSi!$y8?HVccU+{(Q(En)L`&o9sEiUBSrw+#`;p5RvOAD=yh$dm#OOQ6Cd zKF3@Y>D3!b4qfjnZ_=*S-`z4Yv48;i2xm+|1yrB$~HgX804;Ol7_1bj}K^H8=vqRsG^ zpo1I8eQxFUHtOLFSVU~Q3(t0x`#Q-ZEKYD!Vm4^>yYR$b;}@q8e2yIA;+Pme%Vn=s zq2%7}t1SF(y6;rpuft-(Q+Kz-2_I+`e46Pn>%T{Jg2YXr-$h~HC&cNJqrmA%m!n_< zb{;{LPX9-YfnKh~?n4AlNHrsKQ3!s@T36=DJCGSSA}hb8Cs^d`(t}+HXO~&zem8Tx zQBn)}2!Lp>wmP`_N8<&czWLvGqAsH!2|<`hV4=;;2GKPG9-S%0p~_;B=--FL$%{+x zb_@0ZfgfMN_rmtObI#N`)aY&T9rBH|G_6|*bdc5I>lE7HCznaI6?cvWDthyOR70Tb zKQla7sX9ioIW6Yu{b=*S%Z}onbH;SPzFg36o@JL7w3I#n$L)gf=vsl_zBJjFDg!7? zh}4g={^EH4iI%k8lMZ6HYa^a}^-SKegE8|>%S{E~1C7WH2ki$cyu)Mlb%<@jxbc22 z6SR*YaI6cOC9?UNt801~Z1gpdFy+@MOg5a0)ue{$3NZ)=* zN17)17F4#A;|A4uRJrli`)$HTRvYQPSh1=TnukIbXh3Y;li9?@wGOn>UjB|dTTy-h ztB1$e#>k%Iqp2VOC*D7}p zDtur`Vi3#}v%6xWL%}9}K8ON++{yLwo(TJLZ@`&b&MV<)o}wv7W2BEfvuEMlVe5Qu zR(F0|Ga0Ev4-cv?_2u3-PW8Y)o0-XIzkS)LQhJR2BVxLbhivp|%7p6-mCiF(JuF`rgplB|F22(FW*Z|N z`_SE_fz4umocs;uh=H#oxz{?$fP;33lOyW~;nZ1t#;31JyaBn+SheZ+woY7<9=xaP zuX|2~?55vtqQ!vghQM`?ScBe|APt00XkpW?{~EqO8~=y}{`cu_tplY4=CtNVDAel@ z`9}Bblt>?cz%^HwUjUl#J^8CC(?c-m>$;WRHLdoj$`_42x+)+&vd~aHL=5+{gfW86 zM*1|>^L6}sQW|dvX9WIi#U~ryF$MHnbvbM8075-cgyG+}A0?gXGL+1kR%}bF%>(K` zB%NUQs0^QhVX%!YfcD+{0#-mN}H&^>r%084{KlV z(9Jj5A%gHWifGsbadTS`iThneSw%%*RaG1;FE7hEtl>dIk}OaY7CmVg=1{&b12))V zAUG05SbC6~X!;4ujVBZ%V+ipQNygLDUXA5DvCI;AWPVx`--;>r6?9vow9xYr$WR&; zd%k1DdmvH$+vmk}t(bJ}&(vj<%MX@(_`ki89cEf`=Oylyf4Kl}(E@Vv`=YDQHfP+3 zsL+wD>N5xxf6f}L1P_?y7ZwIva79`VZ{WrcMGlxn6v*?~NhE!s!N&kpiz60E^8p!F zXf#QI#cFhazu!^$-MbNCdcmJhuBSW2_M65_%>U>g3KYw+bbnayvr^m~?X9NTVM0LA zv%0uKK&JwLQ{NB=&a#s&29Wcb7<#@(azx1D{Pr!QMu%J^30}8-(Lrhz{emk)GcC{Z zwxq2v^XvBx3YfPPmB^ou)?oRJXMSy_oSghE%%Pq=p@zXbRcl_Foh6;vtp89GAVX=R z;v9#PMBH^1bLy+*$u|`U*PS@j$Y*rAi0NGGD7TV35c2MW6)w9rh9C+CP@cJ*>2$&P zXSEPip1DU5slfII)_cqZ{XuV;CQmk7Zv;^DfF|3npnfdA_} zKT+Qb=UG!{VYFf4?#tlJDl{cUBNv=p{qhrTUFd?^R`k|^mVQ_;hv``@JYKJ3xpSQEZ2L=b|go(`2s z{IO8)wG$=OZH9RBG}#9L=HC;Z=uu~$cN{-HpPn&ru@BgQB#d^%XRdWN=*N&bmJ(r7(U!MEwI@j9&UFdN6nOEJBV1_8*!U4NJo&j%uY^AwN{-;C zg}-_j{f161_%mpu^O^0-i6HcldqU(|6GR$pi$7i@`cW@(5aj8aZ_3Th8gSGw(>1US8;g!eU&sA;J`D~q<>lZO_9St4;qF&HtX5t$sgNXcq4 z^ZH0xBf1)?2J^{CqxUC*(m-*`oei%i?QW>)`bLRHFh4#-f8{DkWcxSabY1B3j}aY9 za0RQ%xY&FJN$>?ACU9dsl~Kjin~FS@E)=$;%{AN=2oymEO-&Glgi~V7wX}+j!@;eW zXu+d)AyJqSA(SE(e?Jy3x1XYg!TJ{{Q3xC^5o*)2$?mMfw|Jz#usTxFE){?i)grDy!<1o_S?@ z6^GZ?(X37Z^>YIkjjf9-iAE2`wFm}?iz{S7J<>iC17t_vZEn+>OB;hHU#cO!!lclH zwb_S*_Z4OJd(F;8Ayk2)a?Pr%^3lb)M&SQor(}UKxD+JjdLH5h3`t6KiAi6O5|bZ~ zEKrg--_8$~@(c>P77)E-CkAhc_jlA3kg6eoQOa3HeJP>(U2bJAd2(h~L4tqv!nveM zEbbL)EGuP8OH1Gk~U(|^@aHPU@4JaJwvHCWt|Vn4CM<`;8hn6 zxrC;Uw6AdUT2#dn5DUCG4Jni}-FS|w@ElYserFtpraIjfJR1szA?dolVlhIhw+goO zHWuRmc5Lc^S?o^XJ^X4@g-(SwMIH5*vRC==->aR+4KN8u@x$y7%@z2`yZkL?_EEU^ zghQ2nv!Q~s{k!rm#&?1Fyzt0N)m>kXUtOkp^=2;j$?Ms($esA%s1^NBOhNoy@`g|ZqQ#9NC(RJoArn(*iy1-$ zTFschOyMhlHU?95Xukd)^Nrx3d_Z=6tv*+09U?KcvU7o$fR9UJk$NT2L;QESn>@55 zTfGO$egSd=Y(2)E9&8|y6OC1<^cRFooM^w(7<4V!0c2Ii0v`L{jFGuB`3b~<1Td^r zo-YMs6H5(vIr+**(v$<`Q89=NuQdJ$tIoLbX6Co(>Dd)6Fju?iei6RAWd!B6xS7tg z6w5fLiV=E)U^?-;|p%CDdOqA0#P)^GcyA6}7z0u+Q<#@s z@#2|}isuOFt^@#kPx*R3@kN(fx(#exY|bJ*xAWbuBDv`M9I?UZA=W7Tym`!sqZAYV zY&AUZP}Cx?0hMAFx^&&pwFLs9o__Mq~LeC(?S4NQ>t1dz`{YM zQ0?opoZNaAKkH}=leecLyY%$^4l~q}WLxrh8?Cf1^ypSvgLd?<93GTZ#emx3N1Iyb z{S0m8>LZ=LD57O(ACS$>r6v7Hx<5}N`8IhxF-Sh{KLnp!>J<3GRM$Y%Ba-#shouF6 z%~GZf&2HKlL;+Hc^-mGA7zf!uS$Ks!H8BK`2F?V`ORg`=s&&YeNjT^%Pu;h4xCx^Q z)GJI}R9V$T8lPR5t|~4clNrMwv6LCf-*Ccqdf20WRyy+5Ta*)4RW$*)=J9*u|CD&Z zgKIg@^NziBU5~--H;V}N)lR*2b7Q$U0tB=aWSU>o(SeB7TxQC>MGT~5NUvk@lU#22 z*?X{I!X@cQSDw&#U2(McZFZk#CY6C+Z8YSyBor?}rjRPZ0}mJz3lMtJ)zdnAaMn3a z{RDqqtF@z1kQK3gN&dtQtiXbLD1d1$?5qxWU~`HN?aj9c`nm9>e%(BUV*Cx%yZcD` z6o|81-};2!lsGd^Bj~z<73oCG4H15IqhNGe!yH9)300%dH7dnUGDO3wK*b4VPJRY} zm_HgMKoU&w?1h}6HeVc<=XSEYTON=P;VRdQG@*GS+HbZ+X|I9d z4Ur>g^3o`#g09;s7VS(e#mA5#Fe3IiP5y2|#*LIgm)$cxhg(k6So}zgTbJB}(wm(N zl4u~2eb%pi|EB+Y)HOs~pDLwmGvM@TBs=J&P-WPy9N+Ke1NFpfM6!)vMM3L+N<%5J zLU!1rUo%hkM?M@ABvYv$5dE!AutYkr(_FzGo;T!yn>5Dbk$5{Q2#dt;hG$tPy0h7O59r4 zV<^lw)XNE;dipZw$@Zh-pmr*2tnpqLgD(4n&Aqx~lQ|(0kI;>P62`wV&${WR?lutZ zzuYj+@yAkV8}NT3xThw1hDlQfyupTO!o=vBf7Yg@1wItaRLZnXRjTi|-+O>iUo7|8 zSCJ_caY-$3d`s);QbJ#i(6k9FA7SXQsIpv08=5wfV@XY|n2W))M)|0}>ck z?|4a*Z@((>!Px_*gQlBtUlK@CN^<-p6KEoBcs|kK0}xE)UwRjPBm3-D(9d+14U!zC z{U1u_Phi@Hi=K&j?l;c2;azjbTpOc_d&iZF~vRjoiek|xUf_M=Xg-Y+~3U8{x@$|$;3&|84TC+1Dm#>ODvmE z5rn$RezE2a>!aUBtQ}wMyOMToZv8%9wjq7$-ib&L=gbBFH>?nW+U*;YLb#G{do_Ea zgG7cE>oXjR-1U;RnLwWGMSi?J^YLxts?Jm@HD_m&p2g2Ak$pL1#Lf11?9a-Y3_1CD z%xFd>z2WWR+40j}d)u{0xPT=3%0=|= zX;u%VPl=PRKdlLE#kDPr8pD6y_I}QN{NV@d{VxDAvL{m{q9&x6hzddp514a@9EaKGl^N#%si;8dc%RDOTXtGF zipi%dqT5;53t}b~ZmuTiVX;+llONUrd$V}8$k)hjR`y|OZOJBd`UL@)X<>{dRQ(ke3QwVU&KE-XqCfG#OI%96(=Dv^FeV>d##O5ELZ#x_RkG}zbxtf8VE*FQdZ}{P=T-M8 zcPIVa4%k(F2BHWvmPzkV#3lcQe|JWWO^oJ1q86@Gzof7D^%ASqu;aG)w{PDv_6)+3O#?_6#Ywevk=%%WUN# zKuHZ?sI2GxzmL!WZh7lmf9+1drS@q)+>a8ZuobC}v<_r6ESc5143b#y^71XUYStiK z{y833L?>GofxUCh=mJ8{?2vf+t{uZ~&Ok;9vngV^ePD$XyzVpIH+EqHQ{`_d1 z7pjxWdUxGe+O~@T5I4d0M)PqUo9z$y(gZzFfnNXCK?2nAbjE;ar?1oA$;s;ObV=m) zuLkW-ta zg>DCuNDu){UuH=Ou+8QGLwCscgwLDJ|9Y&~Sw??|m2EjLuNZU(6=A|9C=%Qpwyy+g zbz=aBv_a=Vj<4*OgS89?@piT6xW3@L|GB@k$DvGk$!9Pt+{5*ClTrOENnCH$fCP_T zAq&0zqu8ly@m>uPuiKrzWn;)7@UTv_J6}K`z&H8(LTe9kGxnFW%SgH6CQpv6_rI18 z?&)qh$Pu>7+_{ohygRej|A`; z$Ag|PCxtJDg|d}1)dB7rK$DcU-}%=Jz|#Y+9}p6VT}7&(BUE?6TCx9ZY)k>&Pb|s} z@J#@n42V<#aQ+s+Tod&!GqD#A2s_7olmILnGBR?}8(2a(T3!PA`mp(@D+&fk+T$41 z5*E1)`fy)!dR>ej)a~jcc%nN5dEFfvv%qsg3_X`DdjWDdwXX;nU?op;154uKepG{?0PXaXqSLU= za|F0)0NPdKb@7kJM;33rC`M%LS6c%Js@3ibX%v7kDAnhsUdNTj5g%CgAE?uA9%k(ISQ@4HbD6kLnj)9HYdK!YpV%3ewZVIr;V0TU$uaN} z@(ot;tHcWp4UOOg*V34nm9u?rm4HZVxMwpnyu7PRZ~YfSkzKT4Ns^N>LwO)SLeespP`VYk6Z20aTN zAV+c~zUIBv@Q46E+$y-tb$D?E9YSio-=Z(iJ6f7p?N*Tzgl`fEfhv$A)1k6nV_Xy* zGSLvn)cR70?qg`hoixv6#!X6A2SY)gq9Rm614*!K=6_E zsjhLLSxabk(wO|l_fNYd3#S3KX|D~BS^bi#;lrCqO%(}B|6wn|{Arth6Ali5;xS_af1HTdUu~BE{BzH*Em! z+#AwL&#b9ROSfI%Pdg8NeTpt^ot>vzyWTaYF$LxZJlXmHF`hTA+TbGm1Ql}aO5MZ- z4>iMw+uK`#Y~`epqB~%z{evp~br<~Q0`e|i9Sh!Izc6}i?XhC3hFz)(6h%Sa5zNLL zfcE6bd}J7QDbWY?Iy0Wsu)&O+Z(&lXWHDrI>RI5%fZbNP=vG)JR#!Op?T&jV?9GUC z_Q~!Ds|qql=8{Oi^tcrtf=VZhr?I8*pgUKu!N{hIrhB8REB+_Hn4-P@dq7MwIjMX{ zx;oYM3!Lms=8GMLj6JknAihNSC2V4ptQz5AzuvZ9po-WpuA$SN;5S;^KQPzDA z;45IH$HxHljoI1Rs2E_qRNjw!_QuaY{00bhE&+M0{U?cXdJ|2#PmV9x_QLUx&FWY2 zS??#k*j$*h!IW+tJ3YpBN{6>9+@3#I9*OWzILV;JgGb#Ump=CMRC1d~eeGWc#r{pV z6Tkc*i{{YB?@MXdYrn6^1YK664a+HLKH_G5b#SYQ8bx;LvDO~*%JJbg?z|WaB`e=r z*?8nrA%$VBzz$N9nzPw~?6KcNK;G9s%N_t^{`~p#f0yRRetv*t`8{nerUz>W%h>gM z=XS(EAo6a*vyYu;Z)=-hRps>e{-O&mMz5UJeR6BYm-#p>CzjL*dhACybQh9Q173}P z=SVVCK=h(ungMt-0Sh*O_-}>Gm?8X2PunKy68J=1@sAi=xo}ceUjFI58*qpzsiUJa zC`R{PA*d&hkN3-xWg2BvK?0jf4;mldpW*O*>54?G*XZw}5!eR$+BAdUeG%$0Yr0jY zjLA*v7%(o(zFhGuMM_v-X}jH+)!PZf?w-PM@4hRt_waL&U@kdz8v5I4Me;VS)PRfq zv3MeOC?f0#1~%)nRQa-`;*@6me46We$C|dc0oZnLj%MXZ0paS^qu=4}SJta>c^yBo z^DhD^y7V3-c@*e}w@)#teyzokOsQ;!qcg>dg08#h7oE>e%l@9{tBfj|;{f1PoNKCA zUMW{B8?gD-1L}|8E0%h)1Rnt>-)za}zCBk*&_>|y`Ex~vR_)I{V-*v9;R-6wAU}Zo?pt3NTP&Q7Wi@-S0OOI z6hEi)CxuQ}me+-nQ&bGma;LK3aiqe)FO&eMqkv4x-u|SN7t;5{TZD4x-dbsEtC4TD zg#7OpE9s`y>Timva%Ci$fV2St@5{~73;G#kprgrs+^g6zMh8+yW|%ClybUthmO6a- zPZp|)I`0~)N6If%_9lq4Ia7;uiX94LMkE=77>1~E>tiA%OAdjw?wy{AEmQj!`ij_* z?v$<;MWbeKJYZrwyK|TiXmtcuwLVz;ZhIGEsaIxM{&!13EMvg27I$?ZHz3LZn!_9Z zau0M8!Fx1Ir~i^@$b3(0v-k(j*V-EVX%q?o!zeNu4iJ8l?YREP^KRhGbLak9?$#98 zhXe`z%&q9g=>~E#1pvOWUV|NBz175MOBano|IQcIPLm?E&C~j+x0qT8K|LnRSMoIY z!24uYOZ@N7$hE=B>zgS-Esd7)ykUm&t+nOhtYwWI{m9Z2yFH6 zjp^0Uo4Od26BQAxFru;vz>)4c!6G|%k-q~kfK^=9j+(LY6re6;`zbq5|9#|lZ_BS= zv8k!4m1mDH0n5wF0zTI?SKe9dep^_DPn-A84I-}!7_4rzV`BJiY;6Gt)g^!+E?E=L zP{PLv2b{+@_xJTqYpuUI5dr`YX%*X#%*^^6EQVROU%!6Y>X4RxO9NEY)ueT z$C>AyyNwSE#TM^H!Npo+ZjW%*mgO|SeQR}YNaqE`YdgF}2 zIdSM=a-`#MNMsf=_-0y8?w6bnB`6qJ`;_?(T<{mTu_=X_0Oa>2B%n?(R;JP`W|7K^mmHzr}m+{qy}%Ii7R&X6>=& znsdw;U~BTbo@@h|frpCv&aSeGn^lJt)5cNE_99sW4&&&OJIBTUr{d=Yg`O=F&L`Mbgbp?k{$9fwu`f zLWgl(Lb)zv&N#Bat~`wIZFkp+nkYdUUdEQdURRhR*+=PXYXtJtFw0h zG1dWOs5m77$8?z-M9(HGP-6kmAS5CJtFJS>>f{EdNrPXd5J;$tqI2T467sXMviecW z6u_Jf3atPy?l%~E%m{5M2zii9P+nSDNsWzUnd6A~>a^!O^1cOuh|4BcDU-)vuV!G= z4ybB33A_XTT+T$whn4_p8K5Ny9_eD2FL0Sdq^aYZ)z0CUpq1sJ($pgR0*EVMHRUe~ z*n^ELjd_x-c{EOYv`$yq!v|1=yFLqf&LemF&duN5r<0v^k=+XkcU)vY6jpb^Uwoxv5NT#Yop#|*Rk zcc!A($>@j@5OxL8z0Z55h7dshbU)#{3(ObZ?nF+EUQG#D2jI!+)lA$W1&O^?Q!Osa z05vyYFLgfrl>aUKh0M0|em67Q5BYfxJJBo9xA?LP1UfKX>p)c-4Zyassc8yG)cg8& zC0mm(k63WB16eUbLPAg==^1#t<_V-Y1%{96T#j|z@7TNTtM{@hp2JFM^+0H=1m~+K zV<*(T=gW77Ci*hG;(7nD1kYnUg;}hSA*rB%;;5t3x^tLuf4+3e<`@z6;ajAS8+$PJzW_s|fYaeD|MhoSc{F{aUpWMRB`ETcM8%vre;h4}y0Ix=_}@yvEcXtA=> z4Vl3n1SjvnR!{xL&Tw-HFt*{qd-U4u7Vk?uXLxozy#H_`IW*O$kT z^DHhlhy=k9e%yBsg|OUHXe}!DcS=1Wp7eXaA~wk)aD)~~GgYp66nl<@r=H%d(a#eQ z1e-#r$w9qC$n4W5-s1s6+X4@Lz6D1IR0Yu~f{5h|Nk+mg4vZjFtXe@5X(~V(N?6NR z3Mr0Z**JYYC#yf9in$vJ^t~HknYufN)m|PRfF_s01UelCtf3QoROrg#S7V5u~HZ5Z0If@M08rmRf$RPF1gmFDsZ znpS`*y+yfV?Kby`+*7&oOz__(Vm3s#S;J=Jk|fDDjImUCny;@jt_efpL8-6b{x&rc z!R)5pkNbL=GnMofyuQ!{7rAh~UMFY|d>}&uuGYtz`7M|BgZ=$C3Iceqe0+TSr>7;I zouuun*_vGr+TDHm=tumTWX!D_P@8Xp(2_`-PRck1U^BMtUPW{mFaZPdiy<#!^YazXrl;@=BunR=k;>jBAXLtK zas>P5$i5A`zZO-0kLfc4m5_Cgdy3599h+ga|BEqj_1rdLA>Lrmif;lGdcAHMa&VC0 zpur|$2Bsv5QPb+N;Zt}h3*42s^IcTH9Qbu7(2;yqL%+N=0k@fJ&>tJ>!+yXTOk$1#j!VWHb~dc$wq-<|Cu(QNGxD*^46TY?wsgDnmtv)tCC zf&YiyDND)TEcs#Xc2b^$%Zb}^eE0L|M3BYdc8qK*E`)68u@%1a0;216Bq8%U!TN5R zS9mny@_sKT1y+%z4$VuBwuVr}h$Br`t@e66SaL7fVD$}c2 zN$9@NhCQwIyq_q<`}Fp4vCWaz^X4Bt!y38%8`oDqW;T*mLXHDi5@ovHPVdK7u3}ElpWKT=H0K0UavjM3F6iy zB5OXXJ5}l&9g>rL=c|kaDcJVv{(G}_ zS2Wf%4O}+|^{LHZ6Rmc0*`EK58z5?YUp_h9PM}UbTtG6Jy#vfE*SxOt2j9gzOrQZli5bDVH!Q*F z?SbLj`4Set7E+G>DPgG8diYb9(%6TbQ%{;sg$%ACE8b;YQ@^cq9zcGrFulgzjeYZ> zngH=YdO9HxHKtX{CQdf65NO*>q!lTd-ub`4EAL-w$6)+MAdz~Vc|5i%`msK#CzHl-+H#iy;s9M7AoIu zOqU>po;Ts!&X{(+}FJR<{1 zc%F7(jSI%VPDzm^&0ci@+l58ybtZb;60futG!2zT3h}8d+Km7Z`Tg(&2XhH~m)Qq* zL;D};+0s^m&Xm-A|8I7{SeFe4cE#j2PkEEY#$uJ6-_C&C`}jajJaprC5Ih=2uvAe7 z+g7g(iF4{u2P(fJF^k@k1$1|KlE)#zVv5|ZF1xL5#A&mS>w-b%28{3qd`agSL>4{& z6=aC2&;*28iB~l&p`!N_cFvzUXlTwqgUDtUIgbbPZ&UCSfL@#v9}V>5&9U)RzJ%!u zyKkCr{GC47NbkSc(qZQp7Y8TMDye??fEVh(M;0 zW=aNq3T{)E+6&ez?U@xg)BL<1-2!kpIaG5(Vp(-VCng<8N36P@Y)8)fa zmG8YtTl8#-U`sGCFoX_l=>&F8Sy1Cf0AcG!Ho5op*kR(}ReWSP8?Fo&A8?KUnO2}s z2&fwH8W7j0)u~#r;R3XSJr6Mm<&El6aaU`^p4S1Z$4Pi_d|U+T3xUA!moFqhsG?^n z?k!Oq-kH2q$t}Z`C+yIbo!8}+2nh{mRW=I){0tpa1G%GQHcQp=e1Hbg0PWka(n;A6 zR0-a^QeG$Ktq?bC@(`!yudI;&esRb{@Y~7rb!qO6>1R?%`y9+hQ$?+<8C}}HV0j7Upox59n&DFO z&yl7+dwgCvb^)ACJT=?brAEVN@NCjq<-s45uz=d1nVSQ`ks<4+16ED(;2}sBfNJ~l z^76N1(|{FtOdcKCZUWI0dmrPeLD+L}dOE*!<0hb{sc9YlMt!_3OMSg6e+pQNUk2Sq zbru2Y*b)kh%CK$2CF29_tG4nqSimC$5f%s!K&a8Xb#4)`a(cVv#MfjG1uj#VmnSO2 zw{yN>$HN&U*Fnl4u0oBEY}BL!o;F~dz`cOH1mFq*Y7|SbKq#Hb>j-WW#1V5I3NcZgy_wv@s*6jOrs%v%tnLj&>u-;jMoU}pPx=SufUb+Wo)k> zU9JhVDgSa?T1Fj;%*Ehj4j(EUa>96xm^Z#Ww(5vk^8e_Sp-oN3C_#l~Ke= zTO`{s;THV(q0($^T3>9jh#7T==>o*mvzgw_v**bS)#Ydi* znE?(Gz&!vIl)oQMp@a%R zbcwj(VOcmhxJF}uc-#osoQaSzGb-E&ApBA^D^$B^qs4>^&vff;786PBe&3qY=>rZ%~}{7%H#xyeCchKN!uFd=ihBd?3pqaNuM0`dm= z85Tbam!oNw)T7Zw$-zOZot7sqNlG2gr6J?_UrCP7-$>?i3|d9u=YQtH?TZRTU$ujL z0}*I>LF+ODb6_22bu^B+ zL-R}BN!9e!5oNQ?lm!XO0$Rbo7pD{j87u(6jIm;OZeVhzEYvPT@uMU`1ObehUw&Yj z@n2BbdUTyG7JF!@Tm$;3=6}MH#=wJI6WF_nxJ@?ohaJE?b zp+I}F#crh5TgYY_B1mNH2TsgDQ+;j#dG7Q9z#JgNfClCN#qgdcY^v1(8Zxql?UOQH zV4u;{%4?W-KpKbnpS88>K4`Gr6+{3H4Yn6pPl)tM;B0Ynb8k7cu@XjsbzZS;p~>Bx z$pq7)B(Np)ysu{spMQdom(#yotm!wXeiu0W`6f(N6?5nmT#f(?Xq6H$+|kjfzzB0f zA_3LCz>yuwIBB3ZST!qMT3t;8@PAI1oJ>e%$ez}S?EOF1w?@IWG(2$rXm4PhDCXDbf6Zbk)fkpBCqCCFjY!#ci2|8Ua|53z_>=f80f>$ zjP@*QIP4cb_R&|ll|2^a0K8TlK;*-If9cOOqVwk+&;$n+_4vr3NVW-r1U&h+2Ee`p zD{F%G8=P@nqryT@0QI5yp{us@Fj0iDyO;NG@f6tcSZX9BBT}lfG?QfOP)3k+?@e81-jmrBVUD%+|yC-=_|wIO#wTwL|%L*KUl6h=2)>;bKg< z(*kUVw;mm&Aw8l}Qc@52eqKR7G}z_Hk>Yv7-O}5b4^%2j&#b0KydxoGnqy}cPiDbV zTes{hNVlw`NW%Sfh8nH!=2;oN>hBvUKq~^6IB;;VX{Sl_D>t$=KkUcI-c*%q0hYvW znl-PG8_fBg5JS68s`_l;s_lRYd(=GzPrR@VQMY@)*KZAYJ0_gX#0kq-M$<(xQW9#CL+@;lT(3+Vw{4%jQ)(m4PWiLny6 zmZ-ofiGP$x>Cttf-L|D%1l)VB-{rT#W8OFDW>tb z!7^kw<&_mn^|+@bf3YATMDpA#@A}oVgs~jNFmWhwE(5Vwo?kMA)w~fF?`JYHnOvJ| zmkTVCE;Bh6KW6%M#JSgh-{SYQaA8dEShQh&phz9|9bEB0;Db+2ztqxbNUg3V;+>Hy z=s=P=H4CP57!NQN&wnQ7I}>_;0{h>NuO>0IyEF9s_?K`+^hI8`M4brslGIcR)~a&S zhVj9<7hA>5e|x_%b9^hzW6M97+YPOFpx*Oa)O}F?=I{rHpm2Ce`l~Sx$=JZ8v)01; zp1EGw{n*s)-5@LnEAMqGlRD24-sXXNF-q2~V=eX5Od7OWY9#SOL(a>>&-e?fe_QGA zdS-adRj0i$Hbw9#^!YWU1oNvS`35bbjbf5E-LqSkxD)5qST|KqitDfRq zPOcdgOK4%vir-k|3UW9zv$LDGk0BDT=5Gw{NYlKY9Az9i@T=I!2ngezhxo&_nzFK~VtqBu4nnFt zxDRu{t3eHsp~eK4nOa+m?lam1iU0YBANE_4)twJkB4JIyZVv1?SkB9+Z(MmUd}^J% z&1+3pzba@gW~A35m}FW;!j@|hF@>Ph-AA(_+PXJFjd?$x$5MqjBJ>DF zeg9utGCY%gjpBIbOgiJ|p&8>nMVtC24t4u9!s8FTS`6ms@7iU0p;P;4L?q2i$w@CU zB9Q;;@SsTNzI1%x^ude~EW~@bkIu6d74S2iT-@B#^Yc>(rdRo zR&fzmyhA*VE5 z4|`0?;7#Js(euYcOF3dg;UNhUiu4*rkC>x5D(1M%Uc&jv=EpB6M`T9lXc%n9#6L1$ z!AYdyz>u7mq5<1vF(@%OA6;c76y=y)KZ;Gl@ydBho}#B4RA5WcT<#wDM2jI#0+#?y zPaq}R&z8yne%chFZ7y$1WjIXBi)gU8;WysZSMyDrb=8$0Ym7j+UkVG>O=Y_7Ef9hc zl_4+WUI-0ZRa;1B`%HxR$e)_B5bmx=P3x$J-J({&FZcJ3Hl1lxnvg zOt@6oNH`xRa^97NCC${SB%y}%`1ct>DvoXPXDRxCan=o%(=c8%WPwF4=zEHq zQk0iPPx?E9e+<5dEga5Fn~(>*q3aaJd(QoiI6MFTGm4a5mLQ70z@Uva)%!Wgr2xU1 zG~(Vu9zIcVmQXDx8V{=Pjaozp$hVFQ>qCEs)0oPuic5wxIlGkj`itatH%dQCnvP*U zL5IZdz~J0i_ELTi1#X%-CF!-YVNNs?EdnxWUcDJ&^02o2w-d-^gQ+JN#WT&6v4S55 z0^n1K@O*WApF?3hrw-mD1fYse(rdIe`RBHvR5ZX=7&redvOCG;;!)=8T69fSC!4}T zb;7*J>Q?1_r^1PecwSm7%QTX2o3nSh8TVJPMCm%FMl& zkOCbSC#MA?ni{M~e4#zYOUtTD2A9I$+s6-vXci+#pHkS%!~aPC1p3_oxM3-J9x|UV zNTdsp_mMl9JBlrV<0FG=h1WMvORRQ<9Az+<1_ zih}NR0iXg#i@`~9l#l9Jg{+|ph4`$A1N`3sPE#XX`{I^mQ43ozceZDk8K2K(xLIU= zHt!tGxYMXvS4~zS)09PZKgp#bCW?3wk24LeU>xLCKy=Uz0f75%W7KVA= zd~^Ml5|^4^Tyf3$ba?iKhbUfUaF@(;v7Ep?AIdA{s}dJjbmLtAv8bk@m-~0yP)=*lLJLOKoF**N^POU*m1mP-WQ^xAjo1cXk6J}@f!`{;Q&BF z%_{`go&dwYX+)3D=T|4cw08hvar=Dlp#XS$4^zJvoXC4UKgJbNn^{xUg%YWli^)o| zX&(ZlqQeN@90mcrY`T*5s@}gYdd~0ij5AJLrlhGSr8##M*ik@0{rpr&_ouP2xhi*d zrq8Nk;D*nGibjX+5#^y_^dut6n+q{QLpUHuH-SuY&h}!D+sl0A-Sb6dv*&!6dC>R#AmMU& z)Z0*EIe$9!wF+}0JAYbN@?8uH3B`#&~Z-Ua1H zKe|B2Dmp#7zu3RTuDgh?jVSK54NyYgBRk5v$w?<%pv< zZ~*AT6du@uG9L*;R+QfiWetr!+{>26Y;ar z015j8LQH}Pxk#19r8R`j@@|Rn^8r>2hMi}gvVo~-UkP0Fz*c+snRrIlLdZAoqt8At zw&^r|MsZya6)EtR$Pzk~2}8;ivrpMiwk=1~wBI#d>k=lV3oT)C{Oqvh zr@g2Ler?_GCCLglQ-OC*p5D6JQ$WB7!IGRN4G=s_b(~TZ@I#B~2y}3qQM)Hj`9=yH zSv{HO`PM*#_gZoiiWk?@#g7JNZz}T)095E~L2_&ggi~{n+*sif&+kY(1>|dggnAV; z)(Q7Nn*8UgyrqyS`tmmlLz7ENK=SU<;@(~DkM2!rNQw9Z zWRJ#UW)^eBbG;oJj!iZPs{qxSUsBhPiJmBpSJ<=~R8$8k6H2j~2}}eMr1%oWS4?}K zq_ha;AOOt7>QlN_SSzRlFyK!7F3YF{Si>uw8Kp%u6byDaiAM-zd@q%QgXS1;DkSt2 z94MS4^R;(6h86V2GmVDmDCO9}{dO8(8an&enCEOMS|{aeo65`Cvw25ah)5j~0>nK` z>;y>H2aslw6AK4g+WevWLPeY-Dn=pT1ovg0BAqY55*u>JHwKrW#~JRbipITTNYdJh z`WcVK!h}ZeCVcq^PR*f^DmnkPb2$+irVOcMJT{yQeET{L$31&e(=Eb)xpEJ$M;7Mw zSj@ij$W?(kB9|)Ffv~siN0dD_LOJ{>`29M1)u2nKbVg~q)PA^n_DC^ChW4%hR|^n@ z5@2Pt@0K}WA&|SQ15G_+mu#m~ycya2dLAHK@xyPnDmVDDu%Fq0P=dkwG%n4Hpr9_0 zddMPnBu zkQ)aHp-z81xG&=Sl z<>8a;c;qXt-Jof$NL=b6=d79rW|qlj_JtKCo#AeVOUJwQ2!8FqelG9##eKLPHel^$ zMXqc^*R;M3#yP=Y&%?)4m146=KxqiC4z$z#rkKDa!}$QWrIY@ytiUGyLp67@#T5#$ zy?K6Pjr`8JW#(eOE##j#t@mX^5A3qB>OLlVpj2~{+VQC3yO6l8Dez$%579Yru?;{M z42m65Q1D6%;F}5Y`BT!jR`bWdtjy47D~(T+T(R0Dcyx`;E(!kq#X7wy@B@<)<4Tn) zs#BB_e^bvhtD?zsdj@7N{xT2;M*(pv(PrgwSNb7lOv!;Kz4)u^v*U1?%s9=i7JImS z$fa5p?hnk1%h!1#wA2|6;uwYd=qZmDu|)^o<6y}@IoTE}jC$7$E3-VnQd<3ka#`=@ zJE?sq7H{&<0jFcK!l9O>Kv;Bi<%t5G=gcZd+Mys@RjCU*B5%?DRjMTfF zKb|I@`o2DLW+-qfP!UF{*392VH3uP3O&_~Fm)~T0LFPm0pTYRynV!PC?>X>-w4xHE zS8O`0%65rm`nnJv0?go!gA*SK$O$*;L}@YYwycD44T|M;KRob(xk6-58}KjYK99@m zH(BuhMxg7fW%)YHqxW8d62s>rA?Iv2;~UhS#mvLQkDLIEXa#D_bD7Yaijal2O&?Gk2nOW#yej`}xF#yi5?Q*ULDu=Um#2Nla2E5Fl zuqFTa(q-r77R5?G_C*Vp#297_#>>xIVZ=jUkz_0m;s<}t9~M1n;ch*synCDKP)4Dc zfG^{_+2-EpMmkS|T(SBd;3wKR52n!&=O-T9uq?tzr4b>Kv?_!)VqWm&ew|E>G74rZHEUO%P~aDbZdN>j5%Y-x4c%ES{ae90ej|C{!y^`!gJ1$d2>gtb)DzEQlMkANAU-?QiQjYqHK{J zafqhAcar||q2^nAS7lYzJ!^BQ-n!SNf{FIpJO-!>lBenE?++G6FV(3!DR*!s4l!We zmnz9GJ(Z!H3{*ij>Cn4f@8Y;+;X@}Lphy|H{{*>w%q1r$XTna<6>DE(Oo{wMgaYO_ z1;az%nhPIEmxxlKfPt(3_R0#ewY7C>F&;H_!jSi8qM)DmyBYgGIxB)4yE@RVZ>%7a z@mKdxKXkjJn)#9KAdjMUq5bs}7$z_v%i`a$oD5}2m5$$D#UC#CMx*WVq_EqHdP3!M zicFm&d71k#K@$@{&)#{yYzeXKf;ZrdFa)VfjyW0oUz$Qgf5#19^7O!(A%yy(sj84r zypO5U_fa2?vLGySCy!Uz7c@!1*PsW6is$$m%{Y^pJm|zvSmIEG&w0>B3p81xF`4NG zTyYu-CKCUZ(tyJg>K8)v7K%i}WAH!_`Z$KnC?#Y0Da7UvWE(Ag-$tM1=I5Ur z8$|nkeGBJkZ&VvUQcIjB!%UXS~9?_W%}UG#w*|&^^61)gYDFOCa3@u z&1WOHzr#3+9M}SjnwQbT)(;*|Cl-0|F~Xs7-OKs8JwwtkRa|h^-ZSV%yB`doTf=fh z*xlWAyIpnl*3!p*4Ex;`f=2eRKRA9hD0=Z4y=8zO>^qtuUdS1^1&&Eb(vyPCTy!sl z2@L#Mf>e^uId>294Vn6wsfjvI+}pYFIS7IHyf3P&&+*rSHMfPwx4Q>>X|LQxzBP2= zVxU1)@7egD?XQ>{j=WSdOWRa+Lhl}Kk1sO69c*Z>nd1EVi?xj_=5rUh_feV5thJ-z z&`3hjCH8Alzr-E_mut)i-dgL}mq#`CtE)_i5jbwZN8;;b_^=E1u6T**V?SXD!K{&J zl_qn$IAK3a71BpjU#3DwjOR*?S=E`?V4?-{VrGdXQ+L7TGRh3b_lDO=G^|rp^bZC8 z10B)ppnpI8{~gfYhv>-PX&US6Q?Phq{m|v*^VDM zP+@RRVlI)31{T!MO~dVh=>)<{Xa@w8Q`*9?lcyh=KS8+QnH%Iu(IUc7rDiF3WW9gr zpn-0eD;506>g+}RY+5mr+8DI@ZTj?sJ>1-6H%b3V3!ga)+K0%8_!JFk647{*E;y0;cIo)YDO~~w zOcO*)0)RAG-tf#K5{yq}4gX>Z3d=$_q40OTH>DS&@=2 zT}m~dEeY2(U zu#sS!o14ALb>gt_jBR0&Hh7{Z#9H+wy0r9LmRDU#AvUCbTzg~z@WFkDOg61+ZQYMq z!m(bEsUt!Su_q2uJusO51WS4GhR6Y6TmBq0>ZjgT=s$IYEc=!u;KX z#~G;yuG!<9Qs`eXuuCkXVyYqC(tkcG63h}TFc$DZ$MC)Q#l0wU{SULx z`+ND$*Up^6-tPMujO0iK5P6cL%)2n<<{n7_*N3>( z{Q^tCKh&%Qmy!{i!fwx`4B&WWMk=9Y)$-jg9~Fu@?t2(fKa>17qO~dTD^|+Em@s38 zs|G!K0(d(;`7OtUe*UYb2CkOs->{-5Vh6L%BOs!#pMcCb&p95uMaKdjl8 zd<0bT!V z+0a8dX!$oSAvJg}u<7X5Jyklvd-PsOUjEMAo+5?$%WqcXu1N*u$-^Hfw|~Clec&cU zAs*OddA(rq4qr5DkYP@_(%U)P;)9Q`#bjgZFNU<^9pP|Q*YHkC-j`s5@>HCXA=3`*t^`; zn4{&I?fR<-T=E{-f6YikdQ9pi`D6I7j#JM@aj9$70` z*}~S(8xrJoTF4dq*LQehgr}Oeb#qmAT=w|O&b66Bw@XJ0ClJdd{{mJgXiyvGs?L0N zaF14z(lN!*$|9qpND%6=9!j|WV=jz#VCGd)*0?i%CM7bPt+|;flldJkTQ+adQ|Z9w zow=SQYzP8IA!qE7x;DVGfUs2=HM&y2Q@>>Kl$D77%;*6I_WfHxfGr~m)!)Rq+x?qZ zE7IDMS|kp;dhUd+xX6voJ77`TzxiwYi8R$wO;XBTYv*9dEWcLt*!_%3e`DhMVT+-L zw^(6j`c*r$fYdRnsP?9=LpF$HGD$6{j`Yimm7&r#-8)}|fDHo9yY4_gffn$@?MR5` z>n!I_HjxDu1mpPSTAFrAruC!{EjWJ<#a+wI;+NIEqaGNiU=%(4?Ay!9^zc|+WrieBkLQEROBnSK{AIhhZ<1I$*^(=x zwEVDT-XAY0T-Kxe+iU|9D3Se(*B-opKxoj-{bGc!M2CIhdqaou=^Yw_X9zZL^v8m! zGn5VyZW!)gWkLLf0<&giCDN+@}P$^P1^zcYmENQ4n-mtH4cxObbddXwi zq?1~FP{4BRk^wQm>sI*6)A>Rjv%9#?7$XMPAG{uu!BMOE%G4eQ$>XNzo8u0v&v_>- zWsAp)4pg|QF%50L?5!>_gijj@@r}#7Mb6s3xmds=fhRuI-0^PppX*Z&q^>lHXTJHS}#t`)}2K)U8@Ir4i@{(I@coJ&&Dt z3$|7)s~)D#%UY#YGc*%g8JW{@iM4$NXzY7OF=R{V(m&wppn>C=8Y|qs>f8^2CD4SW zgb>kU#a3|J<}WJ*nc6o;PQIbSY{PMlu*5ABGs$VPFJvF>%jId6lqXdyokvz|s_*Cq zT9bGERZO_p`=4*%06SBS><$IK`3>t%JQJ0;hUFMEjuxEHM`)M2j4W)6jF<{zz!FY= ztui9aC`8&T!>KX4?eHvFw|)?Ymd0V8v}B&HUNv4s%^NB>^(`RGtNX7&($?dnZ+r*{ z06#J6{YRYh%R+!WJ+oxBU5fLAQiaDrO!U^`Cu#?Cl^*v|^)wIm@vG2>c@BFgnn`0B z`GS3v4H;63LUUjt;|SaRn9$(YV5l0)TV%G!p_Ete{45UXJZ$1)GtK%^&CS%FXA4G0 z}KQ9E#iPVKsq1|bJf29WQ*|#MG>)}mk$h$3hQ(k zEmcF06oeKzJI2#d-Mw)cnle7E^n6uC0!V*5)4na@R)Fyw}uT6-!V z*s|s^vd*tC?RB*wLm3-j!ag)Nmn;SUGbG?;+QE-Pa4q~CdAxMo4?U^G5$+}d8ks(T zh32Uy&wCg$mKsrEI#njB!K-V02yb_=LMEC2^NMxN`Ro-UI1uZtGEZue_)2KN*~&|h zv-|z-w$qK#BOr}c#`P?%A{=7hV+%hgSK43^zp z#fEc_(?;cUt!w)0E?b`~h#iKg4AMhfsi~>4HX{h{&=Gf00D5jHelqdDzdu~atu~VBp;M5E?R|GEy z2Rp+xG_;LDPcBju=j4IJMY$a$INITwXMZ1dc5kmtAL!F*+&`poN*YhO+WmBrpE4In z#7WXC5ohwwwDp`dN50~NI{C{mtt8+pS_yq8?=AeaiFW&CZ)@9LoU?Z9_FFp5v(Gw< z7Z|`J)K^27>6sY%;Ahq_jvUGfdwTBye^KqeAz=e1qCa`C-b^?(+7DW_^IvfQ} zCrUUxG|Z<-XN*jKn=!p*xnI579rk*+rdRcNi7H~)M~=~^fkF7Fcz4)>uCsC&uMzeqBIyxAvA2o zyJ|a*k)%bGMygn4KTswfIWXq+R?Wk=UJY03^K57vbuf>x=kC6AN%s<(7#~`!@e_FrUuh zS0-rQ4BCdksrXO`cha!3XhM^@r{)zr{SGTKqyglXq}#fi#uRKnX!77@n5a%%bkngH z7wsc^Ec9IBIdvOpbjJfLrn<2{1Y3MerBtPVq}0$DzqH$|L?RIn<@C8Cu#q#`7zCgc z??hJ?YSd#J_DAVk)rF5w}Gob^Unw9t9|Oa zE4K8c&nq?qh}1|*RbBtG^X9%>n-e*ukMKluyLKOH1RwiTRN9(K4;tTdKm%ffXJleZ ziPXpH`O6mPX>vIyV++V~fWQWLhm(}X$p4~K0_@=jWkUf}sO|9!Ub#HneJOx6IsWC%spc;br>On zf&M@NfXi_jR0n$W%9eO8(qGWF@S~@ajPnoKu>ZjM$#>)@_?Mo90Sq#10v>}xmR>R` zfkYO{r&pdhYD9H)nUZN_u9nz2O8KrtbFqm#WLH3FK5q1chr`%hAIcw+-o8Y3^f?_- zmP};s4kv-RaXzF)T{Go>K0gGud&B@HHZy&@;KBRvuiEvawdQufoswysf=mFgH@|Ju zQ-~gNDt+y4c{FB>A3_o{|iZWdNYrX#dfXRVUJ4&NC`A&amJO$;~H24GYY@QO!} zHH!(Hg5n3`iO|Yd3fPGbLkKxp63tw#{}b7v_kyP^UEs?jVjab z^;Q8OFXd`*zvVXO|HfXBgk#M2ht2;bRu9M&dS2X*5wiHibi>+%dT@>pa<}IvB+_P9GhULA?dKslz%LP| zdbYk@s{Bumn(ETzxAsHw{2E;=6d>}~tuX>HslnraMwoX^(qJKCZ9XIC@tMCH|pJ zRKP;+^FA~M7($Q)*?D7U>(=iHJae#wL1oYf^PFQbT*60Qw{KHbZ1y@N)K(9io-{7kKc{#|rn``Nmpu;w@wvJF^=A0E9^qnfzncMw9e?MK4EEv?a9vhy_JJm+6v-ein|3$4^$%yi&*FC%61Owf; zex*Gvbb(gIej)nQ^OiU|Bjk(6jj;;0qE^Xt-uw{?hM)Hm3Yq!UZFq41=$SROxdEL@ zzS17@KdKmx2mT%Hp3@1P*DdjQYCwzw3SYWQX{-5HkQf;wNugy^tuCG}s}8CZ7p)8t zdt7Vp(>CJ8y?|!5u6udNI@NUx73YhEaysYK6@6l7G!{e^nHbB^_LWcyJbj}_^!?D{ zgzl@RjyIwDcST|~?p_Ld1y*J%M&<_5kiaie-^|_HRqk}Jq#nEp-+y0J#PzQKs9uvd z%*;woU7=T@Pd}V^z$)x}$1%TtD0R0b`(2DiN()W-h=>$nPpkvhWeZtR$y_3g)!pI+ zyyduS@Hhz0|EGkoLvl~G>?E9J?v~p31s8N$r{o{J&u#msw^UACL@TzzgSY%JkDp>S zW3dr}oRNp}4WkOKcZIp1T|EtHS}yh>Q~dvksZtXU72(L9vD(L3d4|Upu)7~_JOr`H z(j+|IY{XDP{hrvnRI5-Yj0&ERAdmC~5kCA(V2>e~sagzdG3NCy z=8axwVrGsX*DoQf>%Bu%+Vb(U zhDZ6~1^`Vbr~dwE-;;+d|67q%mv?ppkE>p1P(MzZJWNr&#~(=GOSbL)2=>Z|=q040 zNVZ)2j_{qU(f5?K5iiX9xrDKI6L)p`B|y?}J$@oB?~cog~e-hF6XY z!gaT;s4tR=;*C2F1S9ocbM0W>(e7?>*SJsDX#(m{{pee^VL>u-6!z{?_|?&%-C9(9 z=6CApXi>z0$KNIq9vT`NEq(oU324v*=Pj)}@0{~aga?iC1I3_=c#0ou;h0&1S;Ik# z3Q`~yIznwzlLSy7AdUINko44)QG9^+gcvNoX#)C(hj-Z9bfZD0JB;Vx%5)Gd3=NMGAtNwQ^pD#Gl=l3XLU8KL1wN^zQc>{Ua|lEYeJw@c&2ES4PFP z1zje%ySoN=ch}(V5Zv8ef(LiE5ZocSyF-x1-Q8X0zM1)Et@+cvpqtx=zNgNv+Eum7 znHiB_4HtOT#*#ut(BELw zQupKjVM3|Re2cc!ebaM*Ivs;o)~N@}HVyjI57m_Qkx5*Jn zA(3E`)sBDK^*}dcK1)5DqveyCu}UF(J=+%m23_{vZW%5!!rv(0K21@7;`Vff$O|Gr z|KIOo`54>Ip)Uf^8|ao-z)?YkUiY^?GnX7}W~Ci2m2Bf_q=iB|39J#lj6CSP*rD zDE|*(31mMK6eB;sbt(ch1w>DUVCq~pg#Jq+K$-^lt^(E^fsE+1NIoQ)5R*S+M1;7G zsBf%exp-9|btc9=gmHX=FoiqXmq-D7&a962ht)2m)xXWK8(~M`EpcFM6a3duUfHvo zbRxl~;f6)r;CzNcF>JMY{9{L#$rgy+083{$mUdI@>ttqP5;8g}(|t6-F0ZD3|9TI3 zX1B^2DjMY7sZgaMrmnsj53`H7Y6)h`hi&{NcB=zA4pvck(OA4HV(az2D~}2rRbes~Rn495^s+i#lz*A1}H~aiplcJYb{O zXy&t0i(V3t@=K6@iU^DN803Wr0XiD)P*IfiXtKY}vHQ6Sb2Ec+peU&E=KL|Jxy+0s zQBgA99L$Xl9&+S9LzY3)2fO!PC+?$|(&k1E`@!D^wUsaV>BL$NutY$;0+HKW(ytGN zXR`iJKmJR1KxN9s>Z^C+*&fm7|Gnk5cNVO;C--d*KSQr+u%dw$iBG?J`i7>a&|U7X zAdL71W>Ye6Or$;qa7Nm5$ipt`8}x-UU@nomy0*Ulz0@sSNR1UTxarx zkmVzc@#I(Nyg-z`B@9%K>0+MfK}S6IpAycvL3bmX$Hf^u0{_r)AHzocaG2Q|iot(H zllC+3p^$+L>yo7`!c^M8BK}YqYO}U9)2B4-)4NiW}-RU2| zFaJAcuc)XH{Ooq*mMumrRvGocT3lSj!N)H$sCh*SF**elCTQzRKIuK9YR#d=Dsfeuqge6M(-{JojUb*h$+abveJ=&gLf$3{eT5STVlK;EwO0f z|3EbM{)N8)nc80QGn*uO5zdwHvSsV){Y%02CuJnpaCcEh?m6InL#>Sox5iI z>vqF@dFc~_Be&FFLt{-7H5=&NQzOR`NV&f1*{t6@h=R2-BIwPST|WM8t{J}f!m5;r zH)3R-+|}MIb3G z?^iqcA29uEZ&YO!Qo3{Bhz5tSy6N8+UkO(4V^3Q*EJ`=L@@4mu*(saHikHSI7Py=7 zJhYD(SuyFaR35-SRs7=;)$bQ)T{``eJ4~jja{Ke)8TCeT_b<5uAQ<27_a3P|DtuKs z5z#6iI7c8^H#W05^rG3`vJyHvd5DGj#ees7FIKD6(-MFVpBJ}LJ2w+x1aq;_Aax_{Ai$Uk zbAN#vlAa0_2AIir6%<&sb_3Ak&tu*acq7e z4^e~0D>)bc#zcfzWb5(wV+f7b?eTxMJS&p)-=a@nzlIaXBb$3F>2Ejde#**4)>;Zd zK>K&S*j)B5xO4^#f@}AEcaShUn72YG3)$ED1zAtOpkXP)ARAI{ab(Khztw`05-y1r zPx+B{+`S`d7Zk*2M4wu+VWq@kv)70ao?`X!I`)~*UK+^4p5DiVZsOViS5h=AQz3J( z+kn%FbgBN)Q^`5ll6biOQp;Ax=Zkat?=LuNVg_7X!wCitQTDFq2~0Tp9E1iqL9E;y z4!d@>5Jk}+EnCJ0OGdBP(jJb(KNgk7XgmV#(T!DmYF?x+VX5l}(EE8#JTGp){(MCo zUS*R3o4fw?&C^C^WWs80Lc-$7?A*hb;RQ3efW)j~YewS=u1CLC*f2RV26rK z0OQQqBdtyrGGErBluWK(*auZ@`XHr~i8y-too{nEcfRf|)YUYY);M#siAf{fG~0ZJ zHWZ+*(XSWGm-Y1QUlP4_&o~KC(No(Q(n$oDiZdo}PnJ2{INd`X3nw<_iY8!USwD8% z;#_RMW@%Epjcr(H_wSmZwK}G9ePc|BJ9s)w`RrYum(dGD%GY;j7**oVr7jRac>a)4D-Po zErb$)IH(d!gQfi{sMjGG%N~1LyP|cN>9y*D;xkob^CkD&W!K}Aa&}PX|H1JxzNP1k zgRAe-Sq~TP{Y33F5$$JFv%^aQ4Z;>6;!{e-^OX>o1dD3JkvuRl!O1!wmt4b>0Ld30 zF)=D1)a}P_8#};_yKXwt#ECxWh_WaVQ; zJws`g4!eDE(c=&*m}k7rZ|yrV3VF=Z{PBgdc}JiJsz1E-05`q$2!Se5Y8H$ZdG+)z zn@F2uGUtIzlP}M)$$dSb7Ho$2!|-}hSlC#W@KEgyN4|aVbzMm19CXYh&{sc|vNNoA z?%$W~907ffso{g4E0Pc%A>oNbO1I&y5FYD9>y~YEpT%!k|Gm#vTVVEuPE6!9#Sna^^ zh*MjvjLnQ>iYNt`(~SxiL+Q=O0j6d9Tm3V>0|Qtu?AJCqU_aB0xq$k^9cK1lcVEmfjrmX4Fz6Vim!UfM@{|8-8%q&Uq{yWlH_^?>N)q#~@oQ zS-A$qCDE*@!f>opf7|%rl{Sp@&)+0Kl1VU|yr`t?F|)Ecn%*@`6(0J6)0;F~ILHl> z5?NV!tA$gFAJ1ZKM3r@n-?mB&w6Amf=h5G$gV75QA6~yD_Uk)Fi-FE z*k*Z;FpiSwN#mBglHV(58WoRbT--1wYl7)Ab4w5-5^9JMAXX;u3kUO3=jGssTG8eo zzkJS)_v|3E)V!rIPbCYZd1Ep3Bzex(5ukCGte8YRJCDi7<;q9pLGH|}Gd$DF0VL`_ zO+92$_4)l7O!kYCfaQzvotN`0LaR<@*%Ab0(L~Kj_akv3W&2qXIK)>(B~wQ|=K_R= z71G8)S$drPzfRL!SejX&Uiar|uFs9=%=vc1Ft2iy5$UnYb+vLtpL$dv<@G1|1qS}#)2rJZLfG2n|y~T=-F}uvhylj!M zT7D%6;q?Z&PE{zyoQ=eU-PH#u{SOx^ zP9Oi^<8-1N`*b?|yjk3Wv6x_EEZH6A$rbDqGs&4--c9CH$Ew0SxU)jDp9tv-LA$#q z(;GK)t383lJ(>BcOnK19mM^V0l5N(hYTCb2xQ~-9lY6Ja+hk_%0Gxt!$b|iN(gGzG z)UE1WTn|{G;<;7(a7-9e|NgH0=Sif)VWs~YYBki|3G=ehdg6Ee{Zo}&Jh&_M2@cRC ziuu4&Z=Zs{KD1o1`|E9Xa?X3n`ME_%{*R!K1+(^PhUWEj^b&Qh=3+9HZN9+`^j2{$amR7|fvqlDof-cr?b5RFGgV-+Vu#iWWy zic0eit`#)$*I5b&2aFMkdcBG4-I5eTktM#G{R>)bw!?VJ$bb1`EjfqYw^)=Wo$Tl;3zLnq~D3 z2LGP&R+gXM>vsKB$S$CFiLRW^33H2RQ5%@o zHevA{-y4JxG|iaPF9t;ORX5%znC9r=PscAcN)#Cj2fSR~9!n>w0@C=tML$CxQSc>K z9S*uiwb+M=X^GL}!G4W<^;y!Vq_(cSKtNT8>q!d>6A8+N`{W~_g8OARW||gt4@U1| zTk0@?)r$_FI954D+brnj3M!))*y5M9&LemUoGy?^qp__}NX@wb+is&m|GKcY8oM(^ zRQ=L(bv@S7%&L9k>yzY(1Y80?GT*6fD<)RkW1Xh$Wx<7pK)77FEq;3hL;=ANWm5allEoxZ>J^SQfxC}Z8$+ATtjFg`m8eS#_*!M|^%bEb8l@rT*y z5XB^^b0wx4Ps2MxUdND54%D{zYk>pB6XSa6+`~+ZpP_C(N%vJ`l;!jbnl0L$;0)ml zBTyCi_^WPs4_CU7t{F7zY%RJWa8fremS1BIG_oLV5~|IN-F)a5)3gxieNM5c`ct8B?9*Jz=6;L9;`FGM3M;|Yo?x}=8txVF zh%^1l$|e71EpSB;p5}rbQI6_gcaQ%s0mE+m>YpLdlPn-u#^h-QHCHU|r4_JyPRS}a zNaaZr5R{L$MZEY)7nB2O5tm4X`<`>NeFZP+0`>FF`w0^0no&%Y!hIj^yo`qWBxWz( zX=6+^o3(DTWXEI2Lqq@uhT;GceSi|aDXR?7C5#q{5S~t*mqGfb@_ASiz{nkQzCr*e ze>H8>{l`?DU(2Vqi!f(3kk-lSZ8}|%*nEy!xe7E3j)z$xsUUN!e2ji#9y0h5^@!qj z)pbrvAoy#h8|xL0?V6_CJjX%GaM%15>Ded@eGJteh!E_n>Uo#8J`G;$pxwrlSYjs)7<}l$LLTv8Jv*lU7xetN z?M7n_(bB~tUKHB!?;g3|IX@ko;1N9YolrA6@?6sW4KAZF6!#C;74TgQ34Ma{*4}v< z393WGkRl@F)M42((r&Pq@YH6^Vv4T&-%4+$e}~8n?LrFbv`+l;-W9Em<*jZnubo{jkpAMLxBe zaeuOV7H}{mPxR<$0f}z7@e=#Rs+O5x7@MqBFy7eji#cwCkOQWzZPr~NyfKmgKwt7k z8u$F@?EU1wPV3Np1t$&Gx?`aa`Hc}?-QPYGzIwO~GaqE9#<0gjoK|93@Pp&I_J#$P zMzU3P+mNd|@U;E}OWO{k6AyN`t(kadTBBEtF)%xG|7M=)+K={GoWxboP&hHDP2+c4&r0Jc&QSp;DkP1pi;_3{UC*W73JKLV5!w zi$v2W&SJ_Gk>a6@JOGpx4Yh`@=M$P z8>z^v@Nb@_td{M_j8&HYZMoSck{_S%u&1rvtR<95Boi=h+puK#K$M$9sz&47iMJPw zEBg+|G&tqre8!!Z>`-TxstkK=xEQb_R4aRb<8Iaxa`;Qq)Ukv5P|GxS(jX(!F(@6+ zq^@PO6h=7-H3mfBL2e*suk)b-dCc&eAgF+HkM+4tv=0{U= zZ_J0?B~G;6Z{eiyl#@XEYn467#BB(qSWp8Y!jExqQTzCX2i}S?s8;(GkDsy+%z1>V z9ljO2iSS;b8iwP3DWdF(bxor+W0%g8ErZEwfz@d`z%l0_^$gavKrtn$z>1kgQZQ(x zu_B(#Ov)o(rb$UWfrcpAqTW3|`9kQeF+Khowbp)Q8!^(6%s(A@rktn~yjj^LHC+cI z{q;y}q3m{c#m(Q~CGCgQU@eZF*1kW@twnYY_vEMdqtJh=4VI1H#3Q~kzd>W+7!%zU zMAo6(6VtYz$L0^W4#Xym&h}P2aNWaU;gGG`6iyNA@IJz~WzdKiRR$XP0@^?G1UkWJ zj6ChgSXC38G*(Z602jDU;d?wtwI)B59V_$E(sCb9eZayxa zZ|NuH@41Ob?7rrzev6VQNd|L}^H2J0d_g9No**4XyR3QdrQ14fPqyv{>kAYgT~6SI z^Y*!o*^7Sr`}(zHXE*iSpIu9?%;CS^^KGB7;E$A>CQ!nTy= zxY&H;s#X`^u3wtg}v%m?J@l0n;pG>_2K;&?dfrHxP7}#@Wmtf|f|a z$cCN!;5?y~oK1VXjccrt9CT*%__}7lRwTaQ0DtGQT}UaHlAbtxOoO#+og0X;RnVlM z7hN~6TfE>fSN_+l+c)JARAXC$W8_1~_;E{uJrM}B(&eggN3t9_3i^flOj6b`8dq!e6lUI)f`N$6}w1f;C4 z`(#Jvna%-|P*2)_SHPCP^A`I<@-kLbIy5&$atf>O06P}3c`%uCYIdF=`rgbq2nMx} zI#zD7GGyPmzqLPRD7cwu{Jzju`CafQXnJ@`DJ^r&Lo=W8dZ7+G0=n?6?IqWva$m)H z+~79@9C`nzkdMO)!Ei>7&j)J-t&O1)zLGF1olGDEtUZ}T*`R%sPSwVmU(KanoC!br zc4T_G!)?tIQ##Y*6!+P+b7y0_-|Bk(1eQeP4p<_I$X61jCAd<*no3HW(dR33ji5#> z(FeqJn9Z~x7<+XpIySm#ue@9S=>)`B@%X%)K7(kvcsqGGbSqsn>`&!=T5N5o2mFxD~`k_iAJmr zPGqX}If`~Gf9IW7OIPXNk5>Og7fpeTZsY^eX|ep#$=-{XGECE?M)E|Z3tHUHfyxno zhIy=^y8pP@Grv1VR3>*`<4cF(htitrfuC7I_+tf<(<8Tql)|l&KII;)al=Xkoe4!2 zji9^`3bjZ>&-t1_Z(FkwhA@~_%XWL%dij->-%!lfDFNp{_BQ#Q2b^WeT%qqDzSN)m zI$!QkU{Z9U(!}*}554!`>?@)t$2i-oDDVdv$W-Ee8>Cy+Q9;;Y|D?p=@aiB&WhkqC z7z^(CT#s3?(cOIS2j03@UiE|?K zPg$bBZav9#kDv%5``%u?auI&srXJHbJshE;7ejaK^T|KOfGmquO8NNibQmb2At@pa z8X`65cXD%wj^muiw8?xMdKP1dQtRrle~B2l5yo6rVm*a4fZ{PjZ+3@WPu(i*#atL< z?(h)LwwcF9U>+=J%#mJ>x)?NkK6$T8knwzdI2Gt}{?u4;4-M4<0@&plH<& zOa$llrToQlKR4er1pCNO?g#V}?+`n;xOBH+X_HT(Mpg=y6 zvs%Ohe{rN6$tR8z{S;){=1A1yO7)Q@_&50r;`}0bZhbZ*+lFcDL@>nn+YYx>8pZ7J zrV{$L!(|(yttM}3c3BKQvkjpRj-wLz$efHbvyIpekpaR3rkn1q@^`Q(+gL)6`J^q7R^ zUp(AGFp0i_n9!PIP#dANW*47&C-`i!(D|z>RlkF@tLzXw>UjIbZTjw_wsg~3M<_vH zz#e=okAvlYpWr*tV&vaeu*;}=iCtRHG-b=8=)#AZ!-w^Ecq>V6WQ{wWmIgJv`CWsP z4N7&Ozhi~pv-7$2BDdtU^6}U37GA}h0?Sg};BLl$%y5x+;pA4-nM|}d^NRPEt62zf z&U5op%|^Zzpl~v<@KYrbD{NMrz@;oUyQUNTh|Bm4&D|hBfk7u7sd_8fdFiQzw$DYD z081mu?hQ8dGmR5eaLLhrcX^L6l#(pehp7I_J_c2)Jo0u9LY~B|J22XB%h|PX+(A_pqhR3v1A6M-7iE--< zM3!+8=)6JCXKZX^Wve|?6)wy-u^=E=zwae@bmFjzN%n<_2~iowH^%r23hcQJ7Pw)X zAk%SoW0%#_dsgh{%|Evs+2X$2!|4orf~)g7E-NB}nJM!+siM-=RlovF$?IIzFSd#|P#0vgtt^(h?=R*EY$$Hp5)%KETW}s2i(LYbs8}~d!PtAcx zu6pb^{5#_uRgYSu_X9(tXcVXeKRxbWPoj|rua$o5jod7zx_26JCxa+^uyN(ppV@YQ zVT^1Oxx+h)iUGOblNuWZ31z?JDciz*-fw}cJOZLdLh>bl2hr;jcnUNqo*0Xu4NA_3Dft(0Y7JAmB}pAFBXf+{8WKeYgk zHBUHMgJWKsxF-TB#tlC^9d<+d>`XlD8x8SzuKf+XdYU41jUmp-Lr&Ku$rmP!L6{$1 z)KU4_#Unoi`m5Fm#fB^i`XjXGWd>4Msv((X(_Sz#DH&I%>lW51ed4KR(LWI9Ukmej zPgb{*Th4^y%DHOC;ckPHD$}@H?OO+O4#etS8?`K5Gb;~s8)}H6e5wkfbDGEyFH$I{ zaldt<^Vc|-q*PV9bC!Cj8DCJ}Ztw^yZ0suB_tt7LE7QawU}aFYbLSD8U!pXHYugJ! z8qH(xi#S1A%uSV|6=>0jHd&N%Dm)`(P#0~o_UOY_BsnhNCGh?Z#;%nJ#rnpD z9?@JB6V+?1?^Ry1ADe58KxMsLr85jE#$o@?z6^8l74i04`28tynm*Vgq&rLx^|9<7 z`a8hYZ|;A?&wjBL9#A`SGKIAnJH2D5(|7Qws%uE)d5$*~3EQY5gYhL%yhLvZH?GK| zeLhcU*yDk|x{PLLnH`#kk1!M!QQ+!4QW<*1GalvBxN=|`wakb#U;7#XxKj)Qx{;aSkBlpjyeUZHb zdW&o1%1hhRn+6?LTC~Qu{*nE0c4Q=AL0fz-VW%3%ise3r-XCn|1WmDHyZt3=Q&A8; z?Y@fq!Y4yw>kNqQ<4*0fd5yynd?xI7-?SMNCy0s{t8b|vlg0f&Tj1$_7Q)!bvy_*( z8Y?z|KgZ8^yg$)K-7{f9IMyY-5GFGqZ9%;tV~4G3PG-frNJ6bOT$3R#Sl+erwS5n= zOElt)Evo~zixi^7Ik-O3^HM1M0kKvllKbX7v{{?pd4eQD*d z>`$CFDO1=ere5X5bZfa}z}$+3WYr_&wd#{ISCFJNr!fVgpgdl-M~$ZRb_PPyQsvU7 zvybxWJvyFa*%)SEIn62jQ?W!Dnsi}hUk)g$eWQ68uiVdbsd%FKGAgRmh@mrdpN#wD zBW_FD;m!q;s=3OV2;aLS8}#3omKCu7=fJua8GEy%l!={d?(4-8&++jlLA_sr1wJhI zVkwNP6a5MPA=KuoU!qar)Kb^0Zrk|J3cv!usJ@iv`3(WvHaRuTNl_6z|KbecW6I@* zV#p*d)bfqE(bQC;7d4u6^;`{5*z>%njjdy86#cqvU$SX$ z5+`n1JSVL|xAE*{eR>MuVaqqFI%t7Pby`EZk55-%GLMbJjBH7nPykZk<(W1h+5Ahd zHMp$-ye-zpIQU-(^ix`@<+r4HF0Si5p*Ry;1fQzO{uZ`fk;(4VU<_!T;i6 zsKJqBNQfFod7}014YmwUS)3>(+tSE?L(;HE6<*Ddmi>V^-7vnv$02~`gzaMmb*8m& zJLOLL2FsC4b?P6wpD?yc8lVhJ{4A6XF%eD_PdGq7QW_v4JBXQ0f{aQ$D}m8?=VzkO zs;WZ9ga|2|dh#3TtF%ZYmh(@Wj+&OS(vHeujjhhHrJJ^vxVD!!3Bn>kNxQPg?) z(nLbyvJj8}l4P1W;*|NFNbr|!$p$VU@AHc{FIN^Zd^gy0yy>;$2(07iMEe2t!}t;d z99u69uXkDm+raG#XWrgL(kaH%c&8x(Txs{FUqHl%tJ~~1$0$>;QIA-|iso7#JJ&lT z=t*{k5)KBdw|c|G=YeNXS6*}Z{NQI*T~vbq)X`w_~3tz6C?wU1;C*-GYdV~CY5C#5oZ@` zC4OFeYEA9k;3Bnx{V}rpD+qyQm|Am)(UI#Gg)ql-KVGk0y88K8>A^JpBtksK({q`^ z+>XlAXGho7oA86?lSRKws?H#oXstpBi;pp!0tI}xKro(p8KvD=Vkf63YyO26oBYty zO{bFMucyW;%Db{m;X0^A9lbq2$SE3u+mvhy#pQw~Q75y7d`R>NW8XDJr)J9AFSU4D3VW@_+Dh^=w**6u9 zaEd;V@SXcrKc$x5pR8$IqRWRb(_X^h8f+|Se@D>8B#I=K+9+7CnOo$r=ej^|j@xa1 zDs`>!^*GZ#n}47wmB`G&YDD1bBod3vkvNMdci&#WdN^{6@(xXTz~iWj9X>JteMqi9 z3Ag!Kosiu2GIQEP#&Vf%(wX(8WGfax3!!M=Jnv?aqB)8KLNjH-!JIKx4>;to(oopz zRf$4885xr8!Xgol^R$&$aZX!Kd=zsa(^=UV?HMgDr=L0xkge@=ecV z0^(20Mop64{;|hPR-boqJi@@Cwl$I<1_a%FbvlK3%u zFW-N;>H3zY3G_>-lsVR!0g;kpY}_udQ!uc@&CDP{^B9SPtVg}4?}E8WR93}vBr+kN zyEudrm-k0%72^2nDjO}e>Iy|JZj8W4K{Dufs^1G2w#Ugg7Ois+y@c+QWU!p#T~Y zWI0m>g6+J93RM*B<=_YvKr6@@SN6Y)a2Hgxu!7YM*webk&OtgOSDw!yoIkhAzUC%R zW13r9{V#SaRsly62Q25{F}iQ}#te8l6B?RCW~u*&9%n`ri{!of?kfdf)4dx2vOer% zfJFny4VULDdKAN@VF=&_h+;`0@YhZFA`^AqQ5l^EFr z3L2VDjo1X*zGiC{*>RSR#qyEO2@az-&Q*mcisWySxheDx9=Dj32{xp1n!n|I6uRNy zM}&ja#;#!@ddVm}1B{0{M`%u)+~3zZo7p^C8v+cO*L-&FWmH0fSb4tBa#IbpvZw*o z%^z$8QQ+Z|y|*f0X@fFVMNyn$H82t))Dxr61?2g^L&(sberjE1Q|!PwEsfP03J5Qn z&1-<`@Jh4-zT#Iu{d{b~FjEHA(@QMSLCiHsi^;BV1TMxPNv}PEY;}p@o5-{G=1-PKp4vqdkcrf!6V!1Lsuc_nMgwMf| zw7$7O63O=t!&jJ!b;+8Ikk~0=;eQ7$9AxS^Q2x7fz8CUYS*zZe?yZ@|`@D zkPfnt`GL?|>pSo*s4 zC6h5sDUjPwl(he@?puoZWkumdn;^ z7d3Y98@13Cpa3W_qpq$~h5-r3*o^>QUDfCCvRo-(TBb@Nl9ShQxL4@+~VNYlXT zBnNks4g{E@R2MS=KA)J;Hdv>5Qg!)1nlu^)CX?G|M|p*)+a2sdHQ-Z$Aair=cVovd0W?y_ zYci}f_~?ES!}9`Swhz7ylH59!b#K3`jI)G@r(b-0fa^LNB|)!1RV62xPokK+m7U(h zCnQAuD>FR&&Km3Pdg*Yeo5dNiX%hlh;n`w&n#ef86s`*G**(D+RI6ooAAbJT3WofX z`9?o?agqB_SGbP$t>X^AO(o5|X3*R(YjW(b<1jET-6%d22Wh!3N`D-P);?H2znfPj zEt%43RFa7O%{{cbZYaozp(#m>@voAnc%Qq_=3IdV5X4hQzn`I<`tMkB7AC8;LeJ8- zKBJS{ECk{cU?x{xD3lD9CBDdCZA;fI3_J-=S>3*S`ML0RV^w)0^y;v=DegxdI`KUc zO>peUwmuAe%ES{=j}>Hbev^2)Y6o6Q)}Qy7Rz?j3b&#!F0@3{^`QPIJ|FbPa!mey) z{@LptBo^>oq%k1ilw(e)O8=y|quD`S-*>ALY+gd+{b`-2&WQkO0pt0;E$syL#9)Me z9-Hs?GjxXL?|8c>1{dcj6k$%&j!WWwe}NYwP%@su^y6hM?_pBqG^(!8`g`c#seez} z506MPcaJj<9Ep?j@hGq%83?Gl5%3=kzZ>aYHmnZBs79OM=T~VTY2#vjgK&_NS=aH- zVGIIa+4ZxO2!6GIdFn7$4>BdK(#D@3jLy6CKeECz=M?-KU_|_O)`{CaWc?#%eMM05 z#0G-lD{m*`sZOvh9TNfbBux-=w#zok;F_^#u1Z7S#0W(kt0K?LKg)L{;5`b>hV~dUn1xwe>n`(!WZZd@%7^FCIRIIVSfQtNA?}xj{r`Ht?t!7cOHDik zCdzjPasDM@hI7DSe`JG)6)sl06|?@klG<{RtV#`T)LKFV<7}21piM;78X^aZsNsO| z<`?kSA4hQ?5!2C36`dk+gg6~Flb2F|mmz2r=Ah~*wf}%@cL2r^U{$&JJ|O;{Lg^T z_RsGD2GU#2ub#;P*1xzzG0z)F*Q{mZCZG$%xFg=SpDs~vAeJpDl-dzz4USGa@;W(u z1N#H-!VHPd-gd`uKw_FWPETIRhWoZh?CmKO4XHAsi>Mc6agit#AUemID@&N1%uHtq zvJ0F;-MR{X+8WmVUu?v@GE8&3B3_|-nr8Mne5P77|ErTYZXcouIBl~>LL|k)nu8_Trnrx2IKOpV(H->$tbDMs zyp51WKKA({LqRSVzOz&5?NVcf!k*$3yJzUO=S6U;ND-q5KtG0g31;`Xd?EQG9_cd# z7?!KIK9N~&eKlqJbe?Gw?Gqw68y%h4ae?xPIEDz?{R%&ch|VPIc2u4A$~O?uA~m%& zwfDQ|5C1=5c_*hmg6R`{En6)2^4DLyWI*~3ItGJ7e?R0!N|cuF9518{hYU&q9J3)T zf~W9T`%nw7Q)Gt@iu-a^ha>x04|Gag*hN&BDQd}p*{0V+dpLcIBARQgBQ0xq3Ly}1 z87lNB8!&tgFkoS}d+U(>dgC?t1u&PhQFE%bZcm~82LPnaHH^sSRgO)RQBu;+ zqfKJEuDcuiXF8m>m)VWB)&>FN9+$Og!+^h%uZ|8{U$p5*-1#`WiG3)77tV=BP}<9B zJ5b0_0lIO-{Wbqd1ay4Abrrqy_@gMJXB8vqV_>g#?dmH`2%(k&6RShs{>l;Mf00d< zf7YMH--~4~71w3b_J8;%84<(laDMjm`cOAy!)EvGx|%esIMOjb*o0SVfJWWm`Wm`J z;>9v1e9$$T$0phjwLs{42)QQn#FQ%&SG6C>>)tANK9i;acZnGtUns~PNL)UwcDkJW zJ@%;hC##i@Qb*n4=iA&K=EA`?xH=xt56svJSAS7>EPLc$$_Hds?QnWj#0jU4l=39} zrX0Bs4VuUgXT-fEg}3M*?BTDtM^soE&OpvJZD^A(S~czV7p_ktTgH?YD{SNYxd82F z3)_L_q>0dcCYq9^cgIwZlY5B0+D-aLyv_zrn?tca2~Tv`4qVbb0zyU?I&LEI62YxA zXl{qZ=pOYv43`09TezaEOU<}FJ#!qG*UE z>lDRcNe$bpfa)`SSdN9`$t9J3o4i)+=Lq~QN>}7lz&j|QN{TF@S6W+L-KkYCId@ZX z84l6?RhF84$?C5P4R6X=E#!>tKM*^RRssw`Cj;T!HdUcXwq{w}N#O?{TU;Ua+xq5v z4w6!tn&;CMsYB;IRvxy{raf!sW+xfSPc#kZQzK$Q4iA{|YT^&6!|| z>*f%r&_pX2DGF$TaAB1su~wN3r>+0cOZox)tPuwtJszq-J;To}d|39t>>8qlL-Uy-77 zlK#^8=e|HEB+Cu#Qrp@DNnG-eC>6x69u$^?B6$k+2-|;_ml-n#@()?t_>~$nQ{84{ z!%L9uAS5LXwC3E()uHgn*L#mRuy*e&U(?7iFiZuNBU4d5xQS@o!nwC-qM8=`>=;&m zL<8-lwR&B#lyn%U_7vVXGDDX?LN}b0J;vn=i+O%p^j_}%ZTISSj81u@rCLKz)-hY8 z(;brj(F;AY3}0w@CEI^$TZ-R>*(Td+Xg0+)Nwp6RL0}v!tb#s0tj|Hi{Z*VAgDGe*2=h$IGTMnBWrLOUI#POT|cX+Gw9 z^N>dizA)tMkB!x)*NYC|gJlg^J<zVY5;PyIJi6a{7`9fl3Bm7lp4$Uy$2V9c1f-q^P9X3vv$Iw5 zd$7%ycKj7H+oT;w*zL>|s>?7lbtnRIQjkNC4g`2Th2mfh3}zR@xg(COktj0hKt4V- z4GrN$z;4^H`?zyT;xN1U{_GGCm+00+r)MAlJpbF_G_rI&5MLP-i2x=iAiy9UpOo}8 zm5qz><@_mXldc(`Onz|wdk-k1uqaD&Zk1xmUq7*qC z+{#;$ST7ao!X@qfuoXvOSivpNw?w*O6%4-72am5<0PS4hYkOuSRv5Bc{~+TIinzF` zRup}q8~ey<hLQbU&Es9$5mXRVAC%+_~!xD^OK z-zbRw<`&`EcUA^X?T63y0MubrC(O_3{hNvo;=31=;o+dz#HARB&=iBb2{F?%Mo}7Wr1u>OrT2sBNICPrtUelq;&7W909x z@r-=cw6%vFjM#Xhv@2)ia}NPPVYcYEgp<+zOh)}9^=+^-Wwy15(S@p;zft2aYr3R| zfM*8ZefSsO@kc!TNeG^@5wlC4oggP$H++)|>W7XP_FQ*a6?uf?7pc%X`CW6 z_h{qKR+ai62!B}pSl0e5Cq9R!w4!?EG$hRVCbxe7tJ`DdqGE|9)A%TT7vpm${g3!b zB;7lpTY?&e9;=HmAS8U5YN?X5(IC7s^-$!c?uxJUZglx}r|Az<=^Yy!Uh3N8iPefvM=FKy7c_w>Hr1b6#) zzX(u$RM#C>NeyI}X5b)!pz7t|Ko~Z^Q#k?te`*0P&PnOu5(k3=tRhbuEP{E2Sb_uy z{-D7#bMneEroHyHFb&seb^g-h31MX=!+A$0Cex+||Jxm4Wwm7E&|r_Y=zB zS8wEih+h~Nw;*7f?-vo9e_N~6@AChOsfc0tLFfw zPb+iCk0+<0Q|M;v3!whp1K|KSYQS|bd>7}Zc6IlZ|0cx_Y`ip@t$OAh%l6e%cz;ze zL%n_-^=Fk3?EDCCdJMcXHAH|RlDHb@17hVd0nW-`Z%C# zS@y8hh<3g@uzJFFt%ome@9ST{5)Fl5wkvIX3YMx+z~C|Y`gXXG9iC4wsW%M+>#)H* zRMJf=GtlFG?pyJI&#DAGJ3kF8m;dOr*GFJBw-B-DZCTjA<%~C2xY3r^GswJbu(Wm3 zWBc-(lc?AQo0}^HT8`9HZrKf%VeRNoR%FT=~oV$K0rX*^=yg~h4BqjLv9Ib(cE@F)elySr? zuLrDVClHBaTkl3GF5`B*uF$@l=zK)x@QSl1rg)L>qke?Q*eZjk6Vi5Gp1sThgkZP0 ze8*ju{U}@W5w5&dn3$~IIs+j`w_%^yooD#Wh3+;X;6T!YK5iqm5v%71fAN3)vIzzX z%w)B2XelbP#EoL253^w55GJrE_f~hp6udHALu%R97#m0cc2`T`VB&fvz zh3piEA_=$$G8%vC-4Fxz4M5%@Nb&&)JxUGE$ph!{js>u4zyJWVthYCc20)JB6{#6Q ze9S=xk6zc$k7IAPdsZ6nKS=28cI!Q?7O2xn)7p0Y^fjJZ;Xi`mlio~99&rf!%%*6A zBUxx(uqk+E*-5z`6%c=Kb}X|&U(4N#y}9mql+W>!P!)jb-=EZShPDk|FL&&<2`gwM z=`@KpQaQf{e4I_glnU5~X%3k_vf4Ki^F_7y1+s|%xfwkWI?V}o{p%j*AR!jcPd47Z z8&(5Er2AkjC(-Irm8_Dfk`eeX8nG#c30$c#e+UqJ?H2;G$)JCXh#^0b(!oqR@Vbj! zQ9%j^C^3^P?H{mkSPQ9l;)|ZC!z#*k z&DX^ti(E+~Y>vt(U4y#ziK5@XE|dvy$oV;2bo7ssH;=-nwvnr>B(XQY=nPP6UURgU zA1tWZ({0sxxFvXk7vOWq`tdElo_?}VwZK8-Dq|t^5Gfb%cHiMaNH+s8R(T~H{1GUx zX606zjH_|*VIf^9;vC|r{d^1ThSlz!8o3iyN;Db+9pAd)x;M^8Y#M;IyZv3?9U+BW z09_4NeXC(fI4hB@nh?bqvZm?GlI>A$7XBeUm{=a-bmkzY+WZC_F5xV5xQRa&5~J6Y zp2G^^44uoXW6D}z7dL>zZTc?3R-)f)H;9SMSNGcPFFMypzlNJCb&yzY8$G!Ba!$_N0kM6~$0Kd!h1anzS|sodDP$hJa3hm6nw` zTCmpFC3iZ%-DeWpKm`Bjt~=UivPW(1*!t z3Y%Ey4=_8`h($q+B@5i@P2RnREvT%;#$1SF<0Of)QEM9UT6=cOub5d-s-pA?M+stg zk58L2AW{6JEQ1=g&nw`9558|Jv5sv}A)rY6UvJAs%>dyO#=$p)ycJBqDI%~9na)`%}oBdUU$8s=45~yR+5G*e8 zr=7RcZs+6h8m3!j!vlG;$keWbtC?e3FN|Q>*JndjjNj$U&WzIx;gn1!+VN8ChC8Vi z4b!o$cbdJ%>M5VZ-)^?N&RTn6QllY}jc(u~YDUzyM7EsJ1&dtcd#mplTQ5%hktXljY>gjL^f5Cb&8YA3h6M|>wHsh!0LWv0ir3KN zf;M;7P?yX5W6!Pkce)U_L8D)q7~BEEzho9Z8bwFu#15YiKER^@IEEMM+ZTlmMaQ(` zp6^q9ox|rMvGLhnKTK(Wc+55;YQ};k5JkU=ts264YFy6!N{>+8XhoLH`&e@KaE`mh zIx4V}*{DSm({(nT^U(#|=4NnCnRg8YNgDb`0~s+ZYZA}Ot+;9t3DK09!}S-i0Kq!_ zYuS8QpZQ_@oYz4`9l)=!#G^UQ477#d=G0j#SC)eEWA5J>=AO6CY<9^=F-ZszNy8Pk zj|2x&_}vBMryFM@ZNh(|xD1}~cy(~PhWXAuQ23&}qetX2&R6jFWfHY0rp#|Sj#^FC zQ$&6uLzjPtANFMfuVUU0SDZJuoOiiiT5o2>K=LO|^LTr{?LxC3)$qx|Baq@|LGJU& zvvHtv4w`ZP9r8Uyxi-w3Q7@L(a`8co#YMchZO3ceL4R~L;hTfZHWJ@%X8s)A?t)gi z3o_&v-i+2vEh^bb6-;y^rU36d&ppy)ilnF6_bz=E4uNrwQEO%@cGwRGt$)Gh4hHHe zSx?i^S%@J6yd5cYV~grfjNdGknZH^ZBs#STP2u^=rgV*c#PbPoQ3YYGLlXLC*L| z_D^jDFI)AT)q46(jk1koTW-|v`iPz0{RYd#e!7Iv$v-7&RkQW#RzE+0TdF=DIdb(1 zl~y6H>eZ6oL=soRA}{@dY8n`Dr|A*gLX~$(G2#(!S}Z8|(Gu^*&`yDE;CTC05s?R3 zwF6`6n6w31%^)wUyM+BS`@5-oaOO=`3j8!RCR7YB%PiC9BCuv7z$-~{9CBM&%lU2* zF^c3J`w>~4a#0kO|7ZvVT=+w;Xan5@H^I8RQBVIeROIhH>;|1~|5F^m6t%6(FktTG zB=>nN2AJ3*A3i;GZ%^(xA~;^5Crhf;8rK2zJ4gZRR_Q6WvF8C{d~VmP(EwYWsIHY$ zeJbm}KAkk}?~w+52e5-=gchoTFmZA_jc)-zqlXTeG0A>j~%F zWU_E$a57O)d>O!JJb1JyWaL(tx=*go~F)lxplUNIrOSB{JhT%0(w)PPQ?s9d%jaXb0^CSxhe?X|L;$($F zZdP~1T{7=UU8^8?wm*wUN7}qg?E{%FH-uD(&IxgLxX|TMvUhWv*PSE96r(ykBhF6I z@+N`SRb%hthH(wK^-|n_$ry2m2z%Z)o@AfHd+GUu%QnJskFZLEoq+hl=1JGEq1qU8 zsJr7JZ`)K)am)(ia4!ht6r!bu@QeeFmd@I^a&@&~Y+VO>!xW^!h#%hqSP&NxP;>gM;@ zUBz$4OW|ztm?ZLaF9$u;H7xc)f@MN;Xoc&u&Fb%v)H`Hs%mm?oz6o9De6kLG-Vz5` zPFnO+9=kTPiLK4$bW9bvzjef2FI=1e_Q`^#W_cYHN6<`HmMekfpO_Fef32I$pEZ=8 z8t88^Wm#YUMC(p{ohxbOO5jiH{Az^K z_Z8j}cSJq)4+Lk|N_h5KUy;$vpwb6K_^)HnQQ5cgFsyy=U;VE)PQKd52fBvbBMC8j zgxvZ;4e}TorMr1+w+;NU%1TK4Rd5B@G%sA6g^ig`dO9ekoh(LK|IG@TOk^Bwpz2Ai z{-GIDtzUQ5K-oiv0WD{yyjH>c$JusMG;a7TrtePbFIBEBgDu>$M5l5!`37k5@4`Y~ z;>yrm`EGNU)IEM(zn9*_*t)JE0h?;XY~3IIQYphJuU|C1OTY8ru};1ShtxJ6eq(d7 z2~x!Q5jqy-V8rG2r;(v<+ss%peu-AaxI^&_{h=kk3z0W<{tf%FHaZ9eaiX(E^dNZp zGH(8c)|HPIv-_lY6-8^PgmnPm^a{I8YF+OGG{tFVHSwh^Bc+_kqVw z9zcq&h4H0TjBaH0=V6P^q?{As7noU>ZvT{-#dSj}&m`Y5SsGAA`hIkXS?W@T`zUv__Fkr6#Iygc;a8(`0z=m6~Jbph1JJ*BvW&7|w%tUu#nL=0oku znqEUSZ^oKwqa~c<*vnM=o~{N!($m#Jz?H)4ic*Hd91Hj_%&F<5Jnm}$|6ZA!WE?4~ zFwwWqa+;2})e8D&5|GK31#^lp_hKzj>sxLwC^8QRYf|GANRc9LS6e-c65iPuUB}*; z4H8ggx_Nc={Sih(3lQSYGd4>{8di5*9YV`&&zq#)L+6Ft71aw$Au2da3G8C%q%@R@ zGIPZuWZ(Mq(_d}SLC?+Mp;D+6oIEW-dof32oDCt_?_0`YvFu?}-sMkS9tRYp5?lr_ z%-&h&qxd)tkm>hU0FAW&;vy!ulBBaq=hLqtJVw;z!GSFf?00h6d8ffU$}l4c=|khw z-Q2~l-$b64-EZMF%q-u(>t9>MKk>=FSLLUvH_r25pQFoLg!De46CE(eSMoBq<2-)KqLR*rDh$LsVGBt<$eG2I#mn$x{@mD(B3iB zPB%iKNvfiZ={POtFP*&2eCQF$8Wp`mQ9buuV|oVIEcpU?O>xG~DvHfjdqU2JvfU}& z=sR_AVgjME1oG+r_i2cx(8Wzj9@Mn=9QLfStXrctw~fyoK~viWF*J64PLY}oZN)9n zBi3m~Toa|O*5eT-rb$Lf<30n0zHkNBzoP*9G>$M8HDtvn?E9dU57R_bQ)%zSw|yY| z(q|ZS-ryZdja6I&O5JH(A^RvlRrR0k5XGz1?P0qyN-R2>u?Ua{-2FIB!9_*jOL0wK z4R*O+;Ra~*kE78cltciRLS8Cy7|otIH+A?E98v+V)*0I=j%Hvrf3x{dT zAWArAhrAe=$4(?SL(V9j!y&d}lOx{6LFM^6EFULoy7HFxH=negoxd0!Ho=}9`e%e4 zLvq!9&BkktN?Y0d_ehp5K9M{_$H<2`tAhqazIK|(yR=8oe77#XOQ0BO^=e%*y`#0^ z<?LeF)Rtj#fdF{81FW2E&xrh1l1hxU+7ShU za^}R=4RLLC1@G?>&|3BEX(^vQT-~prume|&Y@&YJt5S;!vQp3ELL~(DXS{lMNbnIz z{D5YmT*my%Uo|5u+OmGNe?Si@k6Hu3%;(PS*W}#S%{vO6rL4=_l?KXC-@kvSHM2Bw zbWHeHgM+N4j8D^o4(%Zsjcl${ zNS)mvWwE{AL9}(;VJEK(y)~cOPH2h_hH);e?Vb02H3lP6*IE32PoubXf>B*u8+p;` zO=r;@Qj&sLXW5H|DM>cK6pyG& zv8ud;*@(l`-MNCn4g%SjC*hBA^H=+Cdg}KEE9U4kNcOckwV#511^t$9*C+5GcSkMw z_bELX;<-UNc zuuEnQiA$h;Fx2q)RbY;#lxUBO$;iVCp#w#nfWGhy$f zpNXw>B-u{^bG6DkeOMd~dV|F!n)V`Vyvc4%8M6rL^nl$g>oWly!%qe4xBRXQiQ#!c z_s9;^Az!stp9CJH@w8=`2v76rc(dT}kkY#Nmj z#zV3cx7@WH{g(8zW>;(Tiiq=M#kKsf32ZLa+|~H$(XzPHce1r0;+5Rh*jDvVWL0@T z$Glw;IvLWH|4Rd~UO!^OsL#5luJjK|ndx?QUASSVwN@@8G&!`QxaWxXdsx|>|AB*> z^&Od3gdx&|1iF_t7kL|&tZ5kAAi@svP~u`){8wo~YPO!jW*e^ZuVxKRdKgyqN$P1PDXWC|mV`z^oYxZ_25_-Y{rP*#5^Qx{f;~`zBCy>*NnOP*AkHexj)M^1vQ%nPQ*d|L`eglR>u7F* zjUL+%i*%GG2a*_UQQ~nI=c~wQMYYf3jB9>*GF63DvgTv06qTHTG|v zy~d0YWSnZ6Ycn}D;XN{5O&fm@5AFANlRWLmiYh#srspWBLGBr4!?E_<^fumN-bO20 z$-fxjekRBlH{B}e>!NqaLHK;t1yj`tw!}WN}GVM#E zlluY}QKUKczXLLi`&K}VA59@T zS{m?c?xFVfQ-F{2vo;c&8f4a`WWuF#=;#Cq^{kP3er|0Pd?dzg8Zj#Dc39+Y zSj6o4vGo0K)uLOnb|`6dvV+&2AR6^Wd%B)Z2BO|OX$0zPDJ16yJ_r>*6$j=iJWxk1 zvl0aqwAc@-6{Sa=6$=e41WsVPqKNAwQkY&CtSh)8a@4})S9LM?_!7C=2N)8PdKG#h zRADkVxxnCHXM5rM0U*b1YjlP=_2OK#*66J+kBTOt+QT|e^Eni0W6=(aC*JEU)iW|n zj_*fLX@q9t+Q>r(oj&cpfVh-zAL-S0p)_ro=6D{DtUp+vJjG%Yh$`1LMCTIh^{36W zzPi}u9#~a$JCtILQgdH~JzXf3?c@=ry!te!S1wU&0War(u%qb9G3RmxC8Q5G8g}&; zN0slny&65aTa0P6@Pys_UpE6Z)Aka&5M>?1Xs~~Li#H4eC(=TpBMYJ%E1BVAB#IW! z5x49nU->-Lw^Uu*TNBawmym7~(hQv=v%`nrS&3^1<|HiUvnS*|k5m1BuYX zDaMFOP;;5|6NE+hV*qkWlCdaC))lI?nc&D$viu;a=r8C$p?<>VH`?yr{>tLe?VddY zv=y2{$(N)xu5ihl6-thQFWt}X#QMr&Wa*`u??y+KI-_APzi=P$Aq2X~T406yo_cxP zzq#i$_Yq!?=M03J$!g^}4-v5N+zJUFdBiB9BG{7H>3|1o*)v>~wY! z>nL>N$6tsrZm7Jz)2gY(JW&l`ih(>h2l*LM6<>}i|C7uWSU>2EUvf5j#So>+USfaElDnJ_DRqF9~a;W_M_?YaipYmp1Z#y^W)+|66M8C8b>!gJ8x z$~vbq$AI)u?XiVO+w@&u_?_wFc5j!qrk)w=fif#u!taxQpx;Jr{&TDH^wF@p9s-#i8enVvI%J%(c@VKY5a-tb3M1p&Tw`XXzs9;!iu-~bgnA8AH zWfKrOXT3~kt3K~8WsHKLNj4?ZDb%1g@Emz~HTi@T#Tk7&I_F(5E$c~}NJ2!jXyo+% zC5er0_c&DB(|Uvg3sLH7c-W@JYncKQQI^vB{fa^QK%|w#j0oDvHdZ_Kcr9%{W41V= z`r;dgz3?oVqlX8q5JWrU9fG!>b*m@EtUc+T(QT0vyoDQ=eS*vwF<9&I?m^Tk(ggWK zMCYh4OYi+x-u|8vx~vm#gf3J$PEzO{tY0aI3zY|QckI#z5E%1WLt_2E`xHiqTrd!F zbhMBBe;g_2mM%fC^7!+`y3IH_OnLTd&-ZWY$e)>sUqtVU|lG0#F^&O zOiPut-cHRI?d4COn|rM@^x2Y^7MZzOO7G4NO{q1tCuBp$wz{d}3e5}}8Z z(NMNdbfm)C!jsR%b}JW3fMHwSiyg2l*Ft#O4Zc~6fXjRyay!qi`<-79oTJ#cPPgY+K1`=#{O%yy0>Eg?t>AwA%_8?xVM z1Jg|t>y?`o+E{?IILD{mzlo21qhJJN-{7+zy0AxXXwZ#_r zvKn)=8!tcSV0J@v_LC0Vjy|caS7*3;;8n@siD7{i zPy+-g2q-iwMnk=b8vhLUNI!)H-WYC-oHOeu`x^pIM@o)R>sFvJ4qM@UYe@-JK-c)2 zMVg9&ekmBD&^~2A=l0&M2l+!mT&$8y8CvyM%VMoyt{)?;;e5j>n-hMaE=SmW0?E3t zWAH*E>@3TP*k4e@DK8|5<~y61dReUqgrdgY?2j1H7aisB%6qBR%ovF3{QhmZ;DUXL*yDnvOS+nNt`zrK z)LmW6F*P|cenDC8=P7sH9j#mH!QS07JRC*NuR%sy2Q_ow^1l=u3N#diDbHuN^WOiM zKcJ?w&QI1pO;YfGfan9amJj7moPTU}wgr?z!K zD4%j$FXf^H|Kqs=Mgi}1j)}v`sLm||L6U~RvMWpt*zDJEJEaR}F;KyOk%)HhP#ck= zou0G}nOX-4sod7Ok3$cQ9hGO0^AvlsL{qrV@YBT=WXH!RT5^=CW?jX0!X33zMH2fz ziiS8CY`Vi@OQEnRL;mZIl3r_#PxQ7+)NT!r(e0dW{C3yT9VsWaAvfrAAsLz#XO>(Q z;p*}o3BVr=LlK1>5zH_~ZYfU#<9T`2co=fCk`f^)7FlCmYT7>#80SbC9RNq5>H58v z5+wu@D^00a6eeh6C#49-pXt@mra%zNJk+9~y9KSRI@J<41UG-S9y5Gd(5pSFW7ntu z*o92;F6;Vilx0w9mnfFxx-&@fxY&XO6P^j}&L5V0n+klJQ0P|{)Ph11TGM=h1Z$GJaKbe}Vbq_Yu6xSFl3XkO&=~3N-?}1vb3=7i~!8Mk|FV94WohU zHB&eL^kdk7q1sS+IZMUf&S1DCle@_n*!o5X-Vitp8Y>!>h%T>KoDd-@Au0mVKz_vG zI61R(dZt9%j9nEbdTmTR2}O(95xG?1&LS^HqxCv9*x6Ezp$5n2U<5pai8NLdT9A}o z;TXvJFq;YikF%ex^E%RV#ZpJlyZ=UPo8+!>Co<G=5_HJOA0l@Yol zV|nz4+?6pvzh$Gs1$oJeyrlh_ec?zyoTN?uU(#gOYfyn{tGwTaCWbf`oFXKXv;}`! z{haIzqk4BtVUSOLqB4fdz~vt4?gv9`zXn6Jc8}Q)Pden5vH46b6cXDXjc>TM%*Q1ZxVpXlvSwTtR8&;lc$^P7Zr?a|WMX9W z8!_VCeJ%>96aR4G0y*Z~B;y=paCIHuZOR7g7PJ7gWh+zVkz>6#wMl#&$u~7J85{RTirvaP4_n$dVVYKa|7T$(qh?%`**7YKE zuEQZ+a`QA9OiTC!SnC)@+j5ZFNgaBim8{j6TKw@|W`14@phiM$F3{uVE5oJoMo$xOsAz%;WAV7v}cZW^)qvQK(*2*Aa)5kZDaP8!o$L(3=pi)-o){Ubbz?+@ov_7oK zTx)$($*?P;DtSOBH!;y0PJbzeuaL|)}dwYnJlJ9V`tvz z!JXsUXwT2e1$^rwO7sYw!z49t+2@_M1et|0FGpj~?WK3xpHz(}#}ndaXOxze{$iRY zuX0RYx4%KdVX{}m$c{{DY{o{&_&T3yt$0)MOTZo|zGy(o!})O!^1np#^Np5R~A`&WhbwNV1`*nQMjtQ${o|`q$8gKfW`I zdSciHrskAYj5*$g<>)l$NzTxD0dAXPzJ9Yl-(iKoqR6VhPGd z0x}-ngJK&&v*{=Q2F|*H{l0vyVH)A*QP~k(nl=Xz{p;b23poRHMHVvgvY{dwZ4Ym_ zn4O*Gl}xBm8uI1$AC){DO@>Sa4B^($J0csyP<<)|xc%g)$>(t{3ub3ZxVUt_Rxs+} z)d8&epRwN(A4bP9qzk<}szAJ*U01KIb-N9Ju_0F5nr_7yCURyI$jNmQdO%I#A1W@+ z?dTeYTYG=S@iRSHoP1Ny7*tmZL7gA3%`Laaj;ceZIjqpw>yg~d&r&B~R>$Pk)$aN? zkGwCYp$$h>QPcbua9VXo*zUVjRSJr~Py+D#z!+=~^j%%K(8mbWS{9=Lxko~{xT@Tw?) z7BKwt?^VRa!kBSEfFPWXIP2nTX0;nno3b#&#n^%LDc2OG~_jbCzyEibjI-?KZtVOE`T4p5Vt{s;X{jVXm20a+S>XjdIG9TC*%7Y$4080X`roZ z%Bs&TFIM;NGszE48s}F*d!N)PDO4sF34u@%@m2%+{4EoD$ei<%>V6*>gB{3F7pKyNh^|{y~ zzp({N-&cGBC$i9cJ{?b&<=^WQv`QfQ&RfOC)oI$;wxA<}2x02*!6Jj9{okO!IND0N zfFMRr5GZRn3;7$u*NulTuE;xNys(A~Yq?=h~M zURvtTCcB{6?a^gsXO|&GE+{pJ|BAjQC@h>MwaJXsyH2>t^H?R`ZqG?S>K~CI1adx^p5Yjc%^3MNAkQE>>#S*Hb=Lw)VsL)|B?8-@b{<29FshA4I#8>o zc_9clBfHm!*D6kJ{n}!SirxA!tTzV(od~rI%>g9W#1%eUT2Nl%H&|yi{<*j zp4ULsam&}&I!T|Ypv+k{OR6f1I$L@3&cr92RoB<3?FWW2YO9-H`Mz^`n*y~OowoGU zcZLK`ptHswRMyvE&x~E5qusr3T0rq)V^Ok)$+55$-h1`9vE`PJknY4hSllD0@k8&~ zLK@DVoLz_nHe}wO`KXdAjcs3?)XfzF0Z8hlQZ(8`%fOj>JaPidr>#R6a@x z<`=*6b#RjJ-V#8%BZFotlV6@y`8LIi^?e<)!rm@?(2nOBvEE|R-jblL8p6NSjbx1E zb?}lIczR|KylugFo@#FHe7s&B<_6=ZEy(>*(EpKse0F9uTPV%_ychrPW4TgKCHb6v z9zz;>abfLzw!~<%sQqmRsDV4QT)QvG``EI|ewfi9tXt=N-r{-T&{X$pjB~^NlpIoj zfqKC{J5Q#7Tk%NwqX3_aWY~=FIg1|Lf#{L%Xgq2$^*oCPPHy-e@uhb6-ni}X3k0eI z=yW7%G5!B898E?o#{WBrY50me|5m}wrK1WAoPqz-|L*X=hW+nVWt<{54U$m|{J^af z)K_eTjd5CKK;Hcb;8a%gEK6A3AsDQq}chEmNuZ)7aS9%{76qM6$J@X#+KU z!<~S0(jcDw#Ex@Wa`7Ml>v6Wy5H6kmV`ACK=lwqVD$>Ri-VQraY%IBIt4y~e{L=d| zPs>#wc48fl-*~}iJI2>n?(b(x@S2oYJ`-op%F8sYC{?3Y?M!y&kA)vO>XSErEmJa%XO6<2$1NuX8qyfIZ)j2X(x z5EXDC6>l>IPq*D@nJnVrw&$YYCdv*>Kv8OMlv3ejI2MVT2AxIb*;=mE#c{DdEkBiI2_fDYnPJ2 zH}3IIMI8BeAA=n{gPOH<0Tb}~dAj6p*?d29ioOskZd=5^ec?$Cijb8BgnVx@iXa01 zWYRhKjDer?OACkyuz(+CH$~d$aL)n_P2ce5;vfr}479{Ho5LgqVM`&t)F& zNB(I~3^Uh;zRS_1GfZujEa#Wz|N2`5`tR6j`~<4ZNwp1Zd66R86Yy3B z&6`dto&C;E^P-d{emk8mjFh%@6cqgaXUI+~nr7D4q<;Q{SZ%b*Yi#_Hn%ilyNat(h z+!;oZrsu=lW0mzV+vY`-U+mE!62v~o64ns0V$Gc^jU zz*L4Qb-y-SRxC8zz9-5{BlE`itMPP%IHlow#qS%6=cLepB2**a(@`$-tjZ{8wehU+(li_8X2_Wi_`_?ifGk?2RSJwuA%fxY`^WUTKAf z*_j4j8Ga?}2@W<5>4E!*Z1(aoUIO`-|E{Xih8iT3a< z>6Q^@q9lloY%pOqmX07syEUoM(nie*LLoA+Vqq{*L1U<&n9=F{emX|Vx+ zs=15+G|OOrh)bY`=*exoPHT##Jxkp3RpDGl7@X-IjZ*9LzsTL)dnTPMF-<1(i0fmpl&R3gmLuEaQkI|M}ooL#e&;MaQ;(dC6aCn0q6QwMFX57;Nsf`cC z?)oHxgvpYcGr67pPZzxdD!Sekf`HZUZ!HYm?L2w+HgsC-4gQ-S51LR-&~?wx>A%KH zdy{_|5g~z#fwX_CnUC|56qfjH#0jDu?;GX>erGaBGImgjsGnF%vg?D1W85xS7*DAg zFc`sf&xVLWm@F{lZ>58``D%T_FkRL_U86l*#>|g)P6T3*=jI(tmF60?>_DY*zj_V zhOnfhB#vF#N5_Bm%y1}*k&`nmH{oy;C2j*Tr=r42CZ0gLkox3ws&C&Ojj#E$h^VNU zWjk2>i2U1@*%od1`xIBdy!6&$Udh+8S<7W0U>l8;3TG(4s~C3`la&#W%G)!aHQl{unN0z5XierTlLtz6-eSvj*n&E{D%0Hc^8Xo_4Qnq=&KwQ3qWw*X5 zrXrq%P+9C-l+KZEn4T^D!xEoa4^6JSe5PMpT7(rTDj5kiN|`$lqrQkHd8Q#jsk?mx zuth@>oVq8r+E^S{wT7^m^kZXxH|)$|UVos?0nOV}=B)!fL1 z{^7~nzoc~*T?GF^)pfX)d%6F`=hPA9CDhPV}KaTwsCq?++3cW0iJ!T)oSDZy}~$pX=$lioiTjZ^Mnm1 z!PNMwe57xMX49mZdVbm)yQ+Bf`T6Ef5#RfA#0D2~=+$jD$iK1CW_%|#bAwWp)t{E6 z40OYjec5mzXe~1g2XTh8mRx$P;*tHcmhA=dHAAyhr&UW!nn`xQpF7BlGB(L0ltzoc8 z^>0h64}%L3^_L(HLT0$?l!3eHAs`x7$JdOa-;*5u^&|B-%Go4Bf$roZnG*Xz4CD=r zq3F)7IcDzct1=ypr^S`#8d>2&aq+89xorvrQyb-AIm*L^)KiNj9rMrQseaDW!qK;~AV+4ljVC0P zN-gy_C^L5FGfdF?CRfXr|4_`7KMPk!CfKiwEO8t??HB=cv6lN!ke_m6kYW%I3YB>MVna8Vk=3D9uDt4mORmyGZN*-Zv`UOBJ;w!TAnW@Yap)O9q?DoAR(b}J zg7!#+*Fk?M(eae>f<9enWQ|l!@(z#jy@hnf^>XVY++SzeMl-GU%%!rN@iT%sC^O#; zdZ-iAZM*Kd+CBPklj(K}2%kLeR`fJ6@qtdxzQWH<`AADgR>mnP^Ez40G5BgAuy=zw z&HZwARf;9iD86Z$uSatNA&S7%br73;R+6P8w* z;H-RS(R|!9biKH<_4R^w3OuxJ9H~0i9R@5NwmJ%}!z&?f|K$e_f?D#`fKHu?@!iuj)$*?!NQ)5H= zJY8*1tKVxa*}Ym$T)%Q=fTb^|PB8U6W`39gF-YoX{g<>6lNP|83rn!R_ki0(qNO?$uCCYhx+P0= z!1$S&O2I+c%kDV0g$fzW&1FbB+%A?Bt8p4$%tG(W9hvpW69t!4xqqq`_tHT1*noSf z%PirSNBC}p10j%*zLIkDdidOaac0`FJPAOAY1HY(E^{VW5V59#upr1vUz(QN*>t>$ zq7{9%w&iZK=rzi^I0Z!;exgYC@7f8*e*4JL zH8V(n4j=H(>-AeVmv#4cR24lcaXyl2A53=DS?wYrEJ!QH*88Ui)cpM-GBd3?y4;8y(L<;BB%OMN>z+T9(B#_+QI@uaMzM4OklYvJhF z4;u`W0SIzsx&sGO4J9y{{`14K5&a;KuDPiR5Y)BI+m@^>e7zro_{jv|pP7blaM8Ka zi9qcyCZH=zkw#_#)Pa~IuPjGo(u7X*6Yl2+;d7|EJY}|`FRXCYMLx13jkkJ^a%Lwx z;#d&;K|nHxQ^@`1wJH=hwKKfxOxwJd5F1G*WArLg7^PMWm|&EUYq z3#xu|%6jV=^W!VO!w(&`Atuc;TdfledfI~99LGdLKxG0Ix^_^5Nmv(oHt=Frpt((5=lPH z`(d*812eYXzNj#jd^N*$6rwurmr3VqVvQi0rPpEK=2t8auL|MoHE532j<56;iNk(} z*O~A>dfl9aIN#G*Hn+h4uA5KJN#Pr0&h!tses2B_#FCZeH#Jorq|y8dolpAu{cQKf zN6afO*bL#$;|^v*jWi`bPK&V$s`%6T!y@eL&sxA%MtNI^n6A}VjDO}bsIDWXx^pp$ zheJFM9(D9O+mR^2Z~1;%AHUw85Fm~f7N>v*ABpD*`y*e1nhPzkiRE7FDd^jt`nN0* zq)?%?+s+9^)?AAOD2brGDsKLs{&D#uc3P+2?_&&F4s7>-{=r5L(5S!>n|Kg?;~6oU z4EJVYi$@3V;8m{U0D>PkDE(*N&w?`-Ive;C&tyGCzB=N`s^5lZyvX0=@%FjQt%B>(0IwK}tmw*w#RpJ7Sj=UZ?@ z5*rWiL`;&#$k@25a+X|*GaMGn@&#YIs#)aGt_bEGRlT+33LJKXR>aGEiPq+&s+XfH zGc(yfQJhC$%{!Ao$@{hgsZ@vsA5SGID7JcKtc#qR@D>jR``9W*Bss>2T~i<%Vw9Q) z6fO~HcK`0Tm^mfa#L!k9pt(M&OG1d#6BnGz*dAt${FgQepGFAsHB{aHHx$T5-m~w8 zmO5(~!b+BK-LCXPt)wFoo%fKqX8~02uN-5vE?D2CQkz0lzN%AGeCN!Atj@`NA$g!QK5*0#HAJ`FA+Ym##NknIGy~@I7B+!*_Rw0``yNcivW;qHo_VkN8I*%sF0 zD>!Y+fQaBF0wv-qUri3?YjR|xvU>U6A#(9z>r|2KqT^&{?eNb$4j4>HO zfd6(%tr4TA8m|6#`@gnz$Dh67>I%MoacmWs^8dLxef(LFxW;$P1{)zDvzPR34FmRT zUiU28A~NX^i8bD_b|?62^-?Qv#ju8(N{Lw6)(oRIK70s2wI}JUq0-$uib#o~Um{?? z)f2BATS2Eg5scSW{3ff>5)l_1g8ze6kE*yN!x4UxAPKPe7=tA6Uz?MNuk!F(JShLS z&HMP0B?9;g7lP>EAY;cmbht?1WZIY88r!~D>nVUBI!E5F)vHSOVjiy4j#lTi(x)9` zWJbbBDd2nw^oiW~pI;prq0tbBB?9;xUco;Loa++5#uSorlaH!>S#7cHQ|oS9KGY}u zt@=Cn@l12<^{habM|j$#mEpfn}rt9)CjoXG%+y?ek3jgTq? z9?h4sM;K8x-u^D@tfqn| zh7ZH3bo3eego@?;@xPwn*^Ka>WV`T=z6=SkT?Y2N5fk)+9;y2XJmNrCw~DyC&3X*) z;QZq??+Zgj{(t$$j^iAXA)SLQYWadl7$Czp0W8k?TD^m?>&p88m=77pR{AXR^4O zfR;!*9=-5H?#p`M1Li7as_6dh&BB?+G+1o?`6_v0Gx*VBdm>+Wd?^*9gmD`;22)7) zs+sH_19rWnG42<9kv)(t)ujgA2E7wKIn?0>1G`=F--w15u<--eDeg81dMMYyV{(DBpf_%4>GP|fnyg$gz zn1{#c&ccyG>hl!#N{<_SAH=&smVifbfG9(KOe1tvv~U@=&1Jl&r$kSY=s9#|tD+dw z9W-OC>fb%YNEOm(7Y-Ue+N--e+3)Xvzww&Fa_nT71Y>r=CvHtDIOvJ5*lfGsQ|d{(w_whh++K5xD<65fQaQq#S8 z1<&)MLr%Vs3|Kx#C`%!#`Toj{^Mh)%`(OM1U5*;Z%9`pu0TF=T2%EgsOS4C3E$p7l z*gBn+9_gbVNAU*~Cnt`nnw9GwbRdht;bUFeG{AzNZ~K8LPEK_Hs-dSwrP8b?ujt)N z-0Vf$_3qgW#*|M$G;k6L_;#Sn({;{=mhwCgVQhg5Es07 z!XoNiwY}LUmG>ZV@i_nSI@W74a=;_&&AHXyoh$U=Zb82;cZ(9(p^D2{wI{7ZRBRzN zcc^jwbh3+T^Rh%H#SOe3#VhjoA4$PIfkh;TsJhk!9f131C(aJhvI53*bA@Rrq$KNwA(E8L-bYL5Jnb?$b#f7Z$K%zv#MKdBrKY8Ty2^ zk@=6EFLyIR&B4cjUUm&t^{e~OLl3b1@I4RX^N=Ew3&8NurRWUAGv;zG*)_dprhcpP zSv1R$rlza~^85fym4F`6zzQK<`Wlz%u-{tqiQvP0kqJ+U>Be!TUf8IVZO=Uq3?k4p zDi{lN__&Q{K#1bW*=F{XKh(8Rj$;ZjM4aMrKu0 zx%0ugVB7w+)1oR0rh{d{RUqYIeMcHB@N%WuHZpSn)HNY=BHkdN1ikX5G>eJCa#pLY z_a(rP#~jXooMTupeil%Jcdi0}byJ7Uwr79Q@8Wk2Z3{ko1(xw+nRrrfY*gM`py`ky z?S8I0k?hY*_gGF6+|Bh*KXH9b!M=P9@%uSlikt%(9$j{{K&vhJ{KxqqU4%`%j>oOX z4DIo}$dmyvD=P2ho)i62VJ{K*>7kRpR?=ip+pa)G%5x)utI>0!emDlyqGiTQyw?QJ zQy2G%Q}e~5tktV7QN%B-_sAU|)USV5A>Xnx&djM-BPNh1cuOk2yC3#+wTa(m50$r{dT7V>b_@F;nVwMWjqczn$&NM|N{x*$nm2^OY&;@ikO} z&;-w*+xejDxq?*=Xq;#%h#z+s@vXEFV|)-O-7fX@d2*J)8UGl682WNUfiSJFu6-DP z0~B^iLu_@H#+6)|=oi_fqmE*D328SOH25xz7OmjX!F+Tfrt~L2lsQ>y^m`EmE5LdN zvm6(P0WVXsj*mU=ktx=nbEKX+ME6${Vn@&x!iuX2kA_jin^URG9hx`8Z~2vA#p#Qu zMFYQmQp6>F1`|k&*RN|HSN{}cBksVO^ZRrvMB8C5I|QQh`8yY0xC;#J{&o-?*R=*C z>bLjCl744P*9NRZUuR-gbdNdruP5AUL7zOoOG(=Y8Wdx% zbdB7CA7PGl$jZvOdnYZeJ|3?BVNZub2&YX6^281pD39BU_30;SYMOt-{+RUlWAYSh zCKxFSEVm;AW+xk@CjEKGB>l)fT+)D^cr3iViTzmRhU(pt0>vb6CIvoW2#UXfEIe-l z_+cQ3XT{}Zn_D)`%Lds#Psjm}GE@`(O~PV8H>lwIE+9SR(yHtR&+lPgN+^m0-+Z9f zO7g~m8Po{fHw7Y`$=}2le%5pUY+*evBNxXItD_rhF{E4xcN(oy+xOGkCLft0Hvnh_ zeu7WNkXv0^fW-qt^Fb(A1!Q60&mfafkb`#{@sRPh%lv_(J~P-f;cjMVwH+FO6UL@A zKp$6ISyQ@7V^bDFAlFZZZJDL|SjJ0$`AIuNIY06>jwPK;0`txsGt~7Zuw&ZNf)n4I z7N6Ddkp`YaXgp<`cj{~8(&})Pd@eRHr=NuXhMF@Mw0?a70s4*2=f5~_Hp#o*XHA3V zT`Q)xH6`WrPRLpQhpsSSXt3Xink*?72AzP`oT{Lty5_ZI1vLSsc3-l{-(rQPh8O)c zyM1OzJQ1`%ZOYb1O1u8)RYoK_Kc)dKDG<)-U`w=MiKZIcAp59shLs`HECM z;-yHJFQ#xa`FmYlLuVIS>sUHN#yrPUgWb%>L88cA#9*yUBE%Zx^kD`0p=fNB9S>() z0U4JgpB%tOqijRmPQv5Mm1sKhE;iLU*FSRbdV-15S@;>C<`PMNoE2&-MgPrPQ1=Pm zWm&TAhN@aWYrp$zCzKt6%I`HJmS{xGjOiqwFOQvgW`5&3i$Mk(C8xm)Ue;keq1HzU z8U4Aeus#mcfi0|v?knMe3H0s0*dzVnf>^j>2mJmggV2lbZ9jL5@i#t1R(*(UAg++a z^(A;>8R3g%=6&BsrjQWBms=aj3>ku0$eDA#vHf*oGjwrSC9+wtET5Z$3bg_%^9vL^wq;C=&`XC07xNR2j5n7K6F;8a+FB?8Wr^>AK#Qs)B- zJ=0F#Y31VEOJhqCe;b|}5x=ny?}D!a_dpQoED@jSM>`#8<%OIQ#MkNFVNsWvLe;r8 ztVrnf3Gn_q&L1^}&IW@_(v0=?Q_(u*?wL?~moEUye32qx$> zS+p6(M#J|h;iuL{mJ)m$Lr~+SB^9!$uH4%H@`c>^>%unKnGZs@_s&oP*S6;btSa9% zEyUGN31X|r@M(PL0*{7!;_jc1W(b>c({-hWmqRbvN)n>WHNun+mQy3O-1ea7que%s zZTwLv9gE)kf+DAd%DxIReSq<~f%A1a-?>a&e+Er7WI}Wz2FjEEZ)3 zWgfNk1>HQ=oAxAtO&LS{a~kPhb6amV|r_KE?C#s2b6cBC6G-1`kaCwbexeWx46O zM%$%8yoits-u_b%`$eRo55C7C=g+@J_Z-{u%a)as)Kq7wFp1C#EXW9K{upabv{b*zg`UAWrtP@F6I`%_ z{X%585uKQjvRc3UW%cQgv+a8urg$eugB|;?Jq|+1+$eT52m`;TTTLL%o{}Ap;@Q11 zh-3q?J?{o$Mfe9Kn~CDN2BeCvH{q-yh0!~S!&?~3Y2&3Ma+_3m4?+5ZR%VX=3CpA@ zEKLGoHw!1H=Q-8#rz>OLBR~}rkF0IO!CNqMos-H`9s{T}!@k|$nem}+o`%ngh(^v0 z!!^t=m~j13G%SAdL_LZgIZ`~$Hu7Q#_KMO7?Pk;yYKqcz1vzaq8>Oc~Ul50=u)#R<3-h$1ZMEuI` zu){8V`_3GZB%G7R;Bp(xkS7k@y->JQ~@%bER z{4P+>iK0C}lYWM00wf{*%dR$pky5PJ$)8xT(PO+eAU9WqTL1Lr#-0AQS$oR+`t0}h zWcno&#aj;y8sLUp=`1yS*U;tzOz;6R9)_X`_fwBqG&17IH(KVJ+#mTsv4bHZ9d$6G zNn)ZQgdL?1zG8sCYcRzOy~)*&bgDN3E|0m@!cOa8wddGz(p^NkN7LUHS7x5nE9E9z zA>;-k3=dEP=4mQ;NvwiWVKw)bMb`f_<;c}Vr-6;A73PwS7e3$H&^5U zAqaTJ1y@k~;NtER0QNBF7ji>sG*G|WWzjOE?8~UhuJ^9cGBETpzEH8lf0OH^h{%R+ zD%`Vhv@20R-tRe}d(9u`HSZ<2dwyO37!;!hZH;yxL?;Hzi-AK9!zd1 zP5{)QX90W9L3II}-%o%>JAasiJ0u|$92+ihF1x{F`lhezq@Uq$riAQoBEE*~Z^MQ4 z&lIq;7WDsy6a4>S34Ml%{~Wc%rztv7}$xw5B5+2WQUC&OkKagV|xVH!?N*& zrz9TmtbQN3`a`MrxoP4c3fQ|3g!W&IBdmc!W3Vr8rtP1kRUFpuZjf*o;C*L3*VnyguW+DN@T!M+ro|dB_%N_Yieqj2!TQIiZZ$A1y@#P zAMV*cjhg7@P8rA(fEekJmWMWpit%5jrh+f#6lW;@8~LgsEX~aQa9QPFc<{~t-plh% zFu~*ac?acNd-&Ht0|vm)NBG0@(=;MI_<0l$6K1!-+(CzLE^kWpiFGGY?(dbqd!ZMu z)bmpPfeEHWC~ReKyOhO2VqfX{AyDF$$9RP2@B?O+EL5@g85Mj0g6VGyi2R|2J(r3{ z)tkU`KSlCmM=jz0tl;X|jqeNG+=%~QbF=CgZ68jlxhV=cKkMkgB!|F76CerohFq4e zj88#X5p+^9;6A`nUH#z|nORP@=@y=pZ{hkW7X$3g1g!4?#I|{#8FbUTBGm(X@vNB= zwu20t*TPmCp_Xjuqlj#{jlnQW+F|8@(RocISiz9>G%a}Z3~oPw#XS_U4?MV_;!E`&?S@g2C=t;W> zh&sj+4V!G6vy&dUPbLe9g|U7z)Ws%g_JjTC=miGFbX(pH*LLkOBdM@^EUU;N5yrnv z97aiz9q2$!{O?!)T;uskuys@Zi%TiJ8lm#v)6a}s$Fxl_#X3`dsUWOkYcopAuO|R9 z@XL60_$akBax#S}vzLUeh~$~!r^aBBd0x~5O`Aw=cU{)3;gFS&9*4lTpOEl%aHb^K3#YKIhBf;)z$a8Pkn(0JdY_G^yt#jagnUL9O-jY1-9j0NX4h^c>U#AtaGqlWOH>m&RSt?0^Wm7<4C>)8 z+B+u-m7V11a6=3&xY6~k`{!V#KRG=4?r7OqK)B+^(5TZ2~9(Rg;`+(iW zhDNaOlPz*^NQ=v?{OodC7!q_daMT3Rnj*bMmB?GYr5d7qV_0YiD zPxFf*@Mo*sU)M4%WSjn@r3>0|dCTL6fv#S_NPO4)tqKt&qN-MwsdY%aY=HWKmjtDa zEST=|i1|&Ci6qy)7YsL&fx*eYf~;hwXy_%0@}VIgc~oT=6u3*$Op2DP0rs*`&avFQ zvSPYYY0e?Cg3tRlXh1r`3lY(qScR%4Bg|3Dc1xYeH?-i8AB!S8xo;E`*6^#W`H#_b zP|Mv>(?%yS2Zj)dw(g%}4LQqHx>^hCbV`58^3n6Ugl2Ef#E3Yj6m0;E_!Zz<{9q6d z%kMjYM?Xh(A#2l7Sb!O|u|??pgR~N4KMOwFui+8V`s197r$k^zV=No#qVW|vea;Z? zva&#UgIoryg-HT>zjGcK_itNJ60?~&Zhdky_}ItOgn}~`*yNz?lV04!)7g$mr7dv9a>4NjC+G$1CF0Czk$ zPlwX`U=rOGT_TbGlpt(?VAu-!RYR=*tVSe;94%qEW(lLmZgjk@3;GY=J0nL9N0l9r z_0lK9-69Pz=z)BX$wduvd(k$=GR?=Ji^W-OAmd}|06EE8o{76Iaszw8E$%8DjYI2u zxW6EyPsNzQ#m0a`vgCN5h%p%C5iJc|EM#^V)1gY={4-!hJ$}i_HFY9HUvwPBtF`lc(JD--&N`g(p3HFb4<89qL9@+gP|x}+R3 z;o7X3(%+=*m34mK3cKW~^5?GQ=6W4Wf`ehAUU`~Ef0>v#_wM{BtvqwRHi{;4XHH&1 zfg2YOqgELWwVY-Q;kdPb)>&fB@e$bGNFF0T9wbVohqeUv+^&s6*~jme6uDrjJwbTh zM%=_nMo{YqDd#+5_Mz=u@x#h}SjV%W5~ly-pcOFl{N-jY`*YzbRAUOZHw`Op@Y%EJ z*3L!ic(t}W+)Cp7(;Dlo_b2N#H0Ax~to`m~A1M(F(qAh1Pmgnd@RSr8Hk+ay%zn7b zeAr4nhJk{i>~tvpg9`-3fpO7^HU_sWep~6u>Y+2!S}RBpng!UPg(H+D6pBZKd^wI6 z`?o|vvg267QedEi=0LH;h`7fM()R|Ah$o+f*mMbAe;N$?2%PtA9EM1$!6}a zpX=?W6Lr=>Yr)L#jY!7qa;@n{E$dB-{b$li)U5|R$kA#1Lb^ zmlO~G(kB>?$Obb`*~#kd3e4Q^qCU4dKt$nZpFr~m1#vMj%S@4g1$9^z7C&EwFQEe%AGn zdO|}={;}k}?&g&uol7?imF?t#cQM5(hQh{6%cf?hxJHB<$67*SeSsmMeC1|VM?(o1 za{u;-ho_gdgF(s_EyGqRn^Lwclz4UdP!F zF~w4u#TKI}_FBK8+3qEO0`it0z!D2#vc;=nx!(vYdNrkIuv4eY_&A9evYDJI1aP` z?ZSnGTvZ7SXW2a@;fdmtaY~_vqg2N%CBO4p#~VPG^zVFhvfT{dls9a6nCpo-8;v`# zEj|)!)!0vU5l=o}k5D>?W!e?cp*@^4t*=A!?h47ibZHU~<;1V$b2YqFrS4Lnz=fii zR|r-=5}OAb-2Q}Dz@W_|g&kIyL^u?*1zgpRtw2K$kHwM@e_g}fDSf*6G%EX3B;x&Y zVj+f~IW=<=Rr(*80JjQ} z(Z%A-+v__e!Do{8_>vNfrhAcmV=_~--+6H%SthT$O6r+ew4@;k93UMY9GBXFZo2P- zck5oL>PIA2dHHazPjZ)ATbBUjm2Wy*y0KAqIhj`q&WIOA=tNrS0s1wj; z=W|?h{?&2QaKoo{4TC}+;=`e)oVVcDJb(wVzw^z(N}3ei8GMWYcc}8!=#rBelN7@Q zH)4S%7*0eyV4WgK98V>K-r$`V*8U8^8^9 z+E>0hnO2`G;NaanvPaL-T}sBF~9cBFqwOMH~E7W5IMLGKrjhC&)um*?_wO3a1TB1 zzh>c-wpo8+{st?8ElAF1h10`;8ILl2=kJ> zQ#)!b0?MBTIx_5gQ(*r3qAuW=_YEiF`T05d+oqxflq}=`P&St^Z3TL)Zoea{iG0f& zW@AXq8L!*;VXg^xj3%Tk_@P&kAF3!p?dA;wV3CF1ug#x=afr*KK9Igjpg@yf@V@YC z_Yma<|C>4muu?IcOAL3>DJvPlIU4A}+oRo!dNRF$oN%pQ?Ps%DMI1bt9PZ~$IzvSx z>mc-rB73X=nP&iJzZ7(DW2MJd7kw}?0oSL6j*mZ2yZ|k*iid&wM(?+DdQJf;@(7xUSgZtzPj8=36$UJ%dU}+6&)B~@2*12AYgU>ZRs~bD zldvPiPERXvVm&?kNIv$1o!7F4T2aBlu{}ZYKU(Ai4sz*~%lL~^zE-dpr*a|7)9QBs za_;YG<4V$IR0IY6k1l42UX8ay4or+kibdN@p+8|lk#Ab;zfEPq9 z;dleRTxnWqr+5Cp74qv z7)sLVdby~>@S|mkmtWg@Fj}{a3iXZl?QV(>re^Fg($KE()D(4IzEiG9eICt=J;y{= z)TO_mpqj--wNQg<<5Iahg8A{B)vbI~d^jYDBk&s^{Yf;;@u(W(+a8@(b zWcq8z+py76f>#0lP_ST@4PkNxIRn^p{|^%|dr>GaUr3qhJtN__@{ucV3CN`xVXTCe zUWe1sv%Lf6!kW|k#<~ATK{fhR{2#5+IeZLb%imGW{OM#hl9g2AzZ(4bd;C-HiOIdz zSF58wp>!)UR-wnlz28~8ihkHKm&;h;H3fgbUMeCXCe~;W(#wnGdazTNpE4p`xXaz` z_u`pRnY?9Z{>Yrm!1mvz4y zUdWN`$tx~4?Y=2o7~fYt@Al$p%t>ZaIsSX0(QFIj+9^T&gp<$*^c}Kg1S!7t^dzBEzs}W0_$TCV zD6o9VDyM@UA!4H;FgyU{6C5~!!7EPG3KP`fq>!Uduttp1vYN{)#v80GaUeoo^ntX0 zmR8w%FE7(|_F&}-DXqdZLH9X=B8nfFZx{(lDTPm2sCoDgj(ua-0IT9W9#HTdHtxaE zIk$U1Dj$4HeaB(6QboLVGwPQ>c6~Z}q8L?qc{3c^W{=Y894uod(i@^!fAZI?9wX$5 z*8I%X?CCT4aM?aOQqudqJHp7?ZuYsn+=zk#GPKJ~%V(FA9EHVzjdvJuT&2}l{i95d zetU$;Ksvlvl2SyyzoViwQm)j@cIrA+`8^OA%cSBgL5;caLy0kNJ?J9zO`7khLe-C{ z06=3&l8#1U{~+Fl)uv>8$aC}uM)SjI;(QU7aL#Bg75x=+d4dvt>N*zWHyWRtajv)V zW*A9p_G4M@k;KXf{dy zYME9qPEPvda&va>dc?9~%GOjqoJ3a$>pp>2MLlpuKZgcKJoedv*j{eey`nTQ__K!L z_2)8sgQtXcj6sn7$eA|hwR!{Er@*3ZNRqJD$xZrix01(+$B0**Rq)d^E6Yc^*0Mjd zbcrZ!aXyID8PG|BT>mUKKQhbfq@zy|PUe+e&B_LGgxmNI6LJfX4jtMI$0;1lB=d?^ zrmL1;K7UkDP%Y7lIxNyiQ6@RM;Mq>eaVj&;40=S!w3!%~%+-pzsOk_!HH^>2juVNNIC7c~)dmwF8YZBuOHaOU0@Vc1^`TY_4 zTu#C_Mc3J-vnzRl#)@SBqiy9Qv|jHw`q$Yx0@|XOtSpLdv&8fB7wPcl3!aZprMoFV zB2^mdSiY4FYq-^yUM?=8@T%ntOjlan9H3ANi+)KFa+(*7i^!H6sPxyX{IP(8=8c5K z)8masDV$K^V4nB&gjq;P-F!D1=PCSIbfsg1c%`OvZvAxswAn6QJ>T0eS<{q@Pom)P zr~(~ zM@}24)*8c*N{={gCM4!|Sa1MOLyAL(+=g_LLF2CwFIRug6m|FyW76C_hn~K{d|L3D zApx0mXhZ(iHly@q*LNI5PC)1GXh^DgAIDkrVw)_?jYusF50a+U`K(59>x^3*2i9oW z>ovXv)gkcWP)%4B=c6LM$1z0xsHbT|l1Te@@S6!m&^_l`xe52p5z%bx%79;ew>AP~ zi~f*x9|+(2t3L)jZM{(UWnbpF1W8^0yxWO2b|XQ6`K;O?Z5?Ktu_N@F9<9jH=X1?3 zq}%R}SP;fqjMVzz;WJX;ARvl~QHUOWb8!BXcd(!B<=^8z^X~cY#Z2mlzs~ETazGfX zRk#B`K3a9`u%qZnt(cKf@MI1F?VI~F<=n>?YQd=pn{n1STI!j(rOa)(k7Njvl&9DF z29k=Gbw*rIh_n}!<|N&oSFz#*NamN9(;_3IJ!}@4zdRvISAe8c{QO8`8VX;${MJfZ zTJmnD^ZP%cYV~O-Dn{;4I3XrZPm9@3RUW(GL$$QD zH2T1n=KFWL>9=;=bCt?E=?N}auAL6zQm_CiN@2z@E!ue5+xM1@jw7u+2)e)5Dm<=+ zZ$1xKJ2<|go1n%XEN`5P-{iSDlyckcM}I&dr#0Ovjy(0>?g%U+YkYkbg3Z64!n8!nGDy&Q+SdKV7h@dYS*rx6oYk<*y z^uV$_|GXn#fmL*co%M1I!=&_NhKzO+-KfI;J|)M21x|joIEd`*qfi@;FiiM=%(QMC zJGalc*zlUcJb}4E&jd=`+~R<}N4`g}0-vnUdpDewRqxYmn##wgz4L~YSUhfA+SEQ! zLQk3|Uj+(Zq_}o& zArWvAf1p6im!Nhv?YfVYq-->E*e1uS-!akx{MJeAA|^Mg$v!4!ZY&b_3HI~SrZyb?#o!gR*4D4^_{rw8?zibmi20hK zFanfdX30lBs0nv=OR5Rs7K_tZPfdd%0Gr+1W5fw_4h*zRPF3b-3kzLay{ZeJVnAHNQ(;0C$Bv1nT}?x~sDg<< z@598YpW1uhdc2y**5AIX?!NpqeZ5a`e>RamV+?m7t#?PXcCHAmRHsOXzig)GCIY#6xV(%7CtjWZQF^=TPuTj z+#S+_f7PG#Mg&(=mFED)6BpDW-UEBE`|g_|`^K@({=%W73U0!|CI*9jenh-q)Tjb@ zSxBf0ebchlU(=^Yz+>ye2hmP&xiIcA3-v)F3Cri{{GdyY#-Gy0xzjm)ux)YNZH5qy zgG`AL_;LE>@|81U$ER`4ku4fGiED7@eca9PLuijtr|*7EdIp@{qbU0kVI zTn-F)IwDR?q((z~#YjjvHN_qh5->8q)8|nrUga@YIoY-GQG?sA(bpw!Sr4znq)Nt| z`pvvY8^(GdveCX|-H8zrqa`2BRr}YLB}IM*f_U)f;Q?Jx@a;b&lUYWj0GYam=)P?tx zxkR>u(GpZti0YDW2cR!v@GxyoFxIoQr83bu{P1?OoZ?iI>;2yiEa$6R_`RP~VBtHjFSz(A|gbbC)E{?3Y2cd8tkBE|kl`7N@eU z$;#5rt{It*$+3+d7KO+6f1MS*FU~BTJU$oLP`NK@FouR6l@0V97D(f$^l%ZAB%1X1 zF{-^9+n-=;R&rkGvsO;}eRdXF8=#sD9F_}`g zkWXozy)t1M5|Z{nb+MK8#moU%J+>j2_xqT)UwZ3rBu@Q7w0fkh7J83$it}TBX)qLc zuL0zd>BpCEPB0TsocV6d@^ayG@{O#=OgKxqmU4YO$vH0VxxkQg*pocKJ41zA?76+- zWhb7j$x@z*i%X!Y{$YOQ@LR(E4HIE3(z|yInLEk#RTj4K2}L2Dn8>Uuk4A3#9d#+;b&a6%j$itw<> zcphBBDmvq6v1u7{|sEQeZ?w~6}`l=iOor4AI)bRRQ5OTa;lzZX2SYbVR( zDXVQfqrY2_Zy)fGWu*xf2`~}pEE{>r0228N>iN-}DnD8RR(pH;I(>oyw!#U7T_@+4 zT9VJt-zB(+AUrxaIl-eyWhW=(iZ5b?njcC_8RXy*Aib8tN0R7hl+sdE-4;3iTr@O~ zR?Kw?V0QPPM|7#LaEM^9=b~^T*KV2-pS9Uy5W{?SCA%C1L>bkQwh6AWcdZ+_x?Dt{ zqwU)no?9`SaqB*JB*1-qT!TFq)jzJosSP&L34^t z2>+IPgz!`gP|=c>zW<#uM@A(&9(M45p)=!8$Iih1kro#lC6vc#cw%$3%4`7pn7uq9Rk{^@<2on%LvvbtX|sxBkw8ek@o8~VLqEnR($#-!${N8hPsQPz*ey} zf)?eBs9wWKO@<7Ye5xv9apqr0QpDUKi`)k44S5R97TQ*9x;2%ED(#Gz%K9W4f4#IX zzUP7M&pB&eCqFX>>Z>!H?FMKlR);qDGcYWTnJUnXR=<5#=uKg=W4?UNJ40z@#was% zVk26_BI3vG2RYIp66UT6^^g64ePOHT_63&dG{iE&+LVyEi})*l;_7kM7hc5rTvh@r zdHspX<6f~|>iFKIi?Db+=1LlI73oxI09g?Xf!%Tx5d&d~`2e4(B^qeTU*L8d=UuD2 z?I5S~8naa%Hc33TZ8LG>FY)hkfvqv;#?MI(!P#70rq<0&d3m3lfAQ*ij7G>-zkP#* zxpQ7RYH7CPk#8`m!g){uhcTLGm>ryNuao>18!ZNV|4HXgja72SwP zN^3BM$7x7dT*v)^J@fE>&5zIaiefj^H-hNTmPq>jz0tH-O>A$k1wVPZ zc9m+QL3x+>;II3E$FK0^@Rt+|PGsqlDmGO`#RN}sVdvKeKNcKw1uF7D5GHlMHZyR6 zVSpb89Ju(r+IVfnmr24wF(-%zN5@^=-z^P>%^ zFyn7+rKL$_DizJ}vOF$p-f)#adA!8-d+h~o2I$l044Z9vtVmu>DFaQ)-opcX-gwd_ zIH95HVpY+jG#V)%FyJ`l$e>hZx>_IT`FF*z%8c_iN6lz$%!Hc(^T8e&E#6sib!%2O z`hEIz*=Mz)aQ2_p@95H$3oJ{Lq&6NJZo4i*w5|R6xbUeYo^UEj~$hIby7qiaEbkDIOseT z3Vv4+Yi32}YtP-P#k{vNMtn`o*AU0F=$R!%Ni_eU_nmNM!zW*&52h)tQ?c>$w0fR!^$XStpCh(RG4hD_ga}xAXPdX z`BmQ+ndq1WQxtn7k|sUUuG1(aYqf}Pspd%{$~wFQlhy3OaRc^}Gs%I0Ndee(Jv+hu zm&f{ULOR7{luc-p-xAT>NFt)AkJIRVs`PzZZxR}6a*&%#=M{jE*#6~j!saDeFZX<)eq zo;LgH>00*aZg}v{H5jNW4A}aFCs*xDLttu!Mu__FEMgPxB_ku zxX$vnH+}d^dCCKesa%=Cm~pE}Q`@1{J=6TW1yQMeT?RLgI-`rxl=`*!h#!Z46bP2l zGcDT)YgWi#WesBQH}Ac2MbiFMi|N(EY*~!|(ToS_SN=G@X-68(hWG7e435*vXB)fk z8LodNei)l(6?&+X(HcjFpjEP08WDv{v{{OUHJ8P_jaKIzG)_c(*WProOYtq#}y0^Ia9UZEZY2@cUW9CJ{U(Lz?S(_;{F$} zN>*eJ-{1^a+iBIpQJ$ae?-5`7PMpIxZTaY!#8-2jh8X86BV1n=*H269 zXTHxLs%m+8VSN0U`&OW@J3t7&3h-%ej_~g86{T=H0j!RHJE*^G}n)k(r#VVNFR5ciW8f9#dkZ#7fT`dgk{X3CvEc zO))PHRK~(%e^IZiLaX03^x_>AiHSv`U|Tn@pJwQZv8%$x@*Xah@b$&7f8^d{Z8sux zP>|$ndA-IN#iBDrY&E91Fqj=OZKDdZzV=sTM%-LoWg|9}G!L(9(ZMEZT3kd+(VP`9 zv{oxNfLF^2;EzIzvzRAO(xSmIM-FN>+_^dMSaVCRr}$%yf7vg3aU4Gsuz+-XwmNa| zAKlT2@vJzH62dFW|H<$&EY(_1G<*~Jh<^P~$my#wvKc7={Hz?dtO@(LPsFc>ukS2Y zr?Zkj26UVj2+_WMQ)cGUSHlWl%H6p=fT3RPi3&QQOAhQ<&ycow}#7% z#aB~k-llPIJWAMD(^|d$#?KE7xf(8YovEfVqd$Ov{R&u7w{~ejW~aX!v%Wf%=tUT! ze8fsovYWGx@)lEUaOP)l=KapRtvlNGUc`bGS^i|{;m1!+uX!fO!Nz8fLQpS{2}jp= zuAwjQnBkr+Tp6*~dFN+kiBSWC0cEd>oW?tu{9Y0=%YEWrynPjZHCKEPJhp*C96jHr zL!tkNsILyII_S1Oba!`$fV6ajv~+h$DhNn-cZWfTw9-hobV+x2cf&Wn@4erB9{vzH zaDHcI$J%S}nT5Kv#81k5<4)iiUMcGpQYmnCT;$ns`IqR{n^+_(EX|mlE{iQ;STCi; z8?G1GbwNdB481pK&HQW~bKKhB=OJ=(vZ$}ho=Fz-=y*aL*Z-944bAP zOFk|Xs|5}GQpL36leo|p+P* z#~r_8vmPMP*y7P_6fvP3S78;WWS)odOMAPx@ERws$%i@SAWglVl34S$9bvo5=Ydhs z4gb{LLIY1v-wrTZoa`!Plb_iM2O*AmS`z*{ry>5{5+(zj3Er6$22KHvhdQJ=wJ*skc)I8P^-oK%@sV7VO5Ewo6e zM!6LtZcIneg=vs#w@Vl$I5knDk2DNCn13HZ92a)9$9?Agd<91ijqsg}zX3@%DBF^< z%vRB!gI*pk-TCS(ivu8id&H^q11zp9@?hL#_fK=+{n&QYED3Xg=25n~ntAWv^HVy-8-xZu7+78op zAH@B%j-JzJxh+Mrs~c3}|EKk-%lek%^&pi*HvOtj2=mGX>!-30j_Sj#4j=I~OXNRm z8uz3+1uk=Yu!QQb>g0DV!%8+(T=X^yXi*^C`K_6!p{%=+o%`ihEjK~MLx*G2lb$EC z?gr;wF;?|Qf3pou;^%yoB$g7Q$#~X!lR-o7bGa*&7_qiARQ$*?hb2YC96X`UqzYRRy z#F^=0he&{1!kj=e{inu`^Td9;hpmA_5DDRK>~C6&i{bo7Rs8y2*Jx;F$24dKmG(B64^y~&oPhKdM2=y!b3 zMso)}M9c_x0ChlLQ!QA6m^`lfb)}_3qPtKpGsg61_2)$vgkBPWSn%e`LVnondSbEj zJzc)XjyOU^(*>=h-D6i}h8jY3`o#x6Jg9{QNq~N$mzS|zj|R@yqxh+@LI8?4&gvgi zsZ88C`GL`>9GO%(K8>GSP_T?7BD5I9F$eqD0H_8*z`@cEnk)=WQwy1+nap99mzdG2 zOS8q~dbVsTsIv*`=O{D zBWX0b@->{oc((oDtD){>qYQiKX&D)hVh!qi8^SHl2&YgpOcvqZnt6f0#k5sNZ|TKK zxS=B{dcX%)1W#d`=OBB3Tn!G#_p5-wCuX`FD#s<^~;{uAx*-Oh_1iepjl zVgI{}yynMq#HlHxOh4bl@VQL#H1EacvoonpjjN{neWJ;!klDsJaX(uW~5@bRN zoj1C^JT%?6%l4QNlaYM}Ejb9~r?n8((9lRQfU($MI{k}+3OnIdioE>-&(KK5{qGi+ zj@fJfq`=w9{7MTswAxw`fKykoodiBq_;}rmxd!F6;}Vtfui{^yt?A8-7sW|I>*@P! zIt9vhN3Hy-GM9-A2=FdokB7o#4!el{rOhr}P)YYqn^w1xUOPVVIG=LZ>o zPC-{xfNY^)Bcvj=J=qsuBYd@<bv*|6VvG!Zg{u2NLYL5|jV{fkdAy-i@6}u( z#qtBN&b9W->5{5Khl^iL=ebwb@cjGfSJ{l6V`PtK1AbwLu=wkdRB;{>y~DoddnI(2 z9#H0=YrWegV7VmrXRyLlrGiBoElBi=Oh5S00{b+_gqd=KPE#HWeVY9XQ?_YBe^8nG zX^9Aa#;2;;`^)W(k6rmV6(6c!r{r3HyZvTnA$>oVOn6&D)K4-S8YxdS1ygcJWv7Qb z5Igu`QnsRvDezmdd!~F?c%lHjB0f|TBFh!dGX8r$u7TDB(|FCzMCiysLs`M=6y5$R zRzZd1$ZNOA&r73Z+9bC6J5?WCP+Fngg@3s`#L4LWI_yP2^NdY;T&op^gasZ3$kGnf z88%gV`}Q&Sy~mzl#6b`3x2*P;US>DCG1@pQS1!Z85|s8pYInlT4tj8ac|YedJlR5u zb_esg?G~p{I`R=KvLs%t_22%qmCGB{fzf_<{rmvr*m@}i~kG;3-mD?Tnkl;q9u8q(WOw2O*WZLBMbe$DLe z^=l1~G#~-Ykt1T5PrtN#LP^Movv2gH1BNpy>$$1q0 zPYGM>jRhk&4?H0uBZpmTnr!#rSbV?=oB4v{&C&zYlan2RY_zt}{6Z-^YJ`}WrFBuT zO)8)iRn_yfnP>&%m%tD%Ff@m!^R&O8OSO?jR65kUn%A?KyMQrrov5GJqT%zu|r zg-vVB8KIHO9EJjy*#2a$Jo;%PhStQfmG3@xFXE<-+qu767?~jHZ98jSZ1YeP-FNtg$ltw1_8h6>C~%Rm z{j^C4W>K#P6GXA9{LcLRsA~OcbT{kyI$Yo1O^M&t!O=9xUw6S~JbTrU`}>zrq3zE` zX34TE%JZs1Ba6%_=#84a!f%8k@p|^`Hg~#sOMo=`le>f^>2cP+3%`eKhfAtw}!x9F?FU#N}p$eeuwyF4Su_0xDb0!=y!bY5z8OXhF zPm7D|m+v`aQ5NM2oz=#?{lm83vlU=BzdSh;5{}(HorD#YU**~$PfeYI7J14lXPWM}J~qhBC?M2`}SENiJ`!2%~N(+8Q=81+1~7 zJoa|KNc;Jrw;9usD{ox9V$oS$dwxJ*nrS3Qa9deK(y+Hdg5libh7BU;B!arNalml8 z-{Y7rUl{BRF+FZ_2u{UM0gVMda%kR0kzVE&%2=@{gk+feScR}rwS(dG;_+O0JWf#hTYwIB2e#9&O0G+K!m-*~MEAN5z+Y5Z$ zKLfO-2JUN$7P{NxG6<)h9~393$$5WYO}9kD$w1>`{DL$SA>KCKEYkR#my`zUn-mDl zglTcg>Kb_)#i+GP{j@jJBbJuy<=jBr?@z_W)!gdO5R9`s`>p}~=T-T`9^QzaI;&)5 zvOni+fpp}1q-4qlZ|v&B9!5fUNz#b_OBu~`JiBx*TE0B2LxdJ*7(Ul=qr4H~(1-l9K|uEE zwgmY6q5Oel33KTL^)|p;34ta+&ql0xlLc*Xgzufb`+XnMiQ{f-t+L)?0Aosqe|6AJ zx*-CszYH2w#0FkJxG=>aT-dE;VClHCfb=G%rs`JS_f$-tw|@a1mnuz8mF0VUKrUj1 z)7C@Jw>N&iOB@YXk<7ttU%L}6Ez&i*%6npx2g0-qG#CvhG&BU5u`7Ct+;M^`gA1Xt(Fp>& zv^`+D3_F7I-8=E+hh<$_Y!401g2s8(#B3>{%$?(=8&0h>s_-VbjrOkdtvBi3PRR^e zq!!kF)R?F2oa?xz`zLN~U(NGHd93yiWJ<{u+q>w3sM7q=7%3=Ca0a7s3NoGK#Lph$ zzWZbRxnjnuLiJLw;39cj-#(VX7VNgT!y|C;65QuY2h}CZA6dYy#_gPpi($Eu0-IjK zyJt+2HRhYO5?R57a?&W0-}b={PuLS%gB=;Z!9I}K0hf8ZpwQ0Dq6zl!SCrF*Fh(@Z zDx!D~)oM*9ebyVK&=PhOd;xr|c8ix*KFOwxGdIN9!Tq0kqi`<+D@Kg1XU67*#J-z( zX%RacqX|kg>RXkFsX{JpqOV>HY*-}J4_cc(;hDERUaCtOw%t#3Y| z9qunEooT|_n^|taGGmyjl(GzrPkcdyhQGbNqQKc3-#HWco~t}+mfV~yoSlpcO<#m~ zjtZ0FZd;zPbB{oOsM}lxqspD*NC-!%=_qS!?!CS*=6x=VxW^9V#u>|NCKZ;CZiyEN zH8#kB%gs#}tUIFGEyY2p$zGJ%>JMg>`syr?4-aumSSTpZqcu0{B@g0b7*#uQ<>{+> z&xB~pSsK5sS`>t+?-ydJX;!87EZe909f_RlVOqTwd>j8dp+Jm%m5M9h+(f01o;@I( zKl)(3#6;p3Z0Q)}(@&fwln{Bk7jJKpUGUmQFRjITmV2x65ei z@cgOZ!_qhW`4{gS4^VHUhK54Ax^y%BmeJ;&?Z$T;H*NR^!kP?Me^A--^*+GsRMAS% zo2#ZH{CKC48+S2D?x=hl1Yn2uFJqSv!oKe6I5V7)oRz8SE*LSX&<8Goshna%-&2A zDhU!p!ygRErT`@3hkn}C1JN6s%A*2;FIr@)g*VLtW)G{1QIhV4-Ef1-;*sfB=IrI1O-?+TRL;s+dp>+-UXq@9C0`uYUFC{lRODxc*(WYgfLaw9h~AsL-*t zSeav?*}u86oX{n}+p`$)+%v+Ne+iX#b7%vHNffDqvzY|Gw+VgTyt?rFbUpV=1#(Sn zGhNtJe8$5yNFeoHwX40g#r-UIuA=MEGE%uH%#?P*M88_T&)< z(EbWWd_>TJURZc8(#!-i#?!|7l=Figre?}qvu-cD1^(;v@!8$HQoDHf#ibVtW2`Yc zU0w#Gv1zTYzXfOj3m}DAmXr#Y8H;N4OF0IK25sDLnGbc&5Gu%B0&u|pbSVIja8Xk~ zYO+v=3mQ#o{H-&Z){E{)H|*4+n3VVzW`x*-sc%&@zwX;ow6q|ddw_AdFC(e1gHn=E zXlm*oc8^DJqKdmWelm2owBZ=c{#EO-DST7q;f(wi>TSYY?O^{9Fy6W9LKRi9qUflD zeYY0D*tG4k>Jp4g=cDDZBDKn`nLCvq?sLOD*|7j^-jQG02KESHgPp zJ=$)`Cx8KuITk@qqHE^Z!3-pW%av$Y?;4#($2#}3ttA`*Rxppk`m?-XNKri3SsRB9>t284??kjVH`W}F_cOSEpUGv7-^V%r0x8B?`e@O`rYzqBm*@* zo8>Jbp?qrznRaHI!D6fDlj*|E67w(IF8w;pX>NJT!fLkddi7|jcm*c$xIopRwO=Ks zCfp$-iL!Lep5SUs!}kjU>GsCgA(xd zAx>X&Bm#25q#L*FjKBh`VCEu+?_!+wW8U}+?pnpr&{y)%P~^+2hTf@IwtSj3%v_2t z%yge?my#0iGJRe#<19Iuu&kp66g)GR{@y>uHf(FhUA<;dO8l0@S64^Y?U9ZoGfcZRx-&%djU?I5sRBkn;~KqA`;|@-1yO7ez*f~a_)*Vg(@|6G!!%#I(`zr5Zij6!m3i~o7kQCvJWiEFa0C<iR>` zx=6?I+ucE6F!ohyQmJ0jNukVFn=6KWuenJeAFoZ~@$sNr&k$iFhH`bLGlp3UF^+{R zakSdUB^k<41~$lg9J7x0l#%D=m)A2I!(z}UYQ)=N|9;BVFhAEIz8&?IWb(&3-tKEr zHy|}78`B$P#8lZP!Hq+7>d9#EiN2GuwGP_k%jsgNFyz;bui|c5{=83R`MaTC#Z+Y_ zBf5|~A>}_CgoO6t4Eb)O8O)iB4eEN$CIPcmAHKWH4RCckObfmCDRTaLdlVFg@%N$L zaZ@AsD3{B*rf^;Z)AGdH)=mbTU$@Pko9TZwmw5WdNof1sM= z?xGRxFaJ&^4Y}{`nmOqXMR=v8y#e!r@W<)TXA9|{wa`vHXGk;M%`hr;FbAuC?_@qj zXZ+cjMsUo-S!~&1ul$l`G8R-)lJ27Rg}|7!vv^2*aMdJ0V*u%%gvQ&^?lEo(+0hJI z%=GS@czdXrI*9|cZF)OHG!K_EEJw+cq&lgIYnk_=br%=!w14dCmKo^wCep1iLalLrfUAs8Jd`S6J9z=HkEcVEYY5E;*sWl zdR9ow+k5X<+a@VA{uIcq3Z?uj3{=Lyj9kAmI;@Pyii~Eu+_%qY#lVhJiw{Vw$Hh^2 z^-sKNCU$^__C4G&#?sGPjILzvm#yq`6p7Q;B>MZ=*C)F8r%Y7Tas=a-uo39KZGf$ZKADmz#QJG&2r1Ml&BaCEjDdcj7R>77H9x$rJzR#6B%+gLgJP zuhtQ{JCl1=G*vg5C!GGwg6mo1}@FcQhJBfb$~{2JJnUt(Tr@LOqSKG5lA90P=b?-F-#Aa@YJq7}ruf zVOFAaCBdN)_%Dj>e3r&8eFa(@t6#a&h4i0K70!Q6SaEo25F3;s;1GXkef<23fczJM z(k}us9+JbBDZ(Ri3|1GnJg-T{=FtrO_Ug7QYM&gR75gQ(%b&1iJ^a_8UDnm zukDvQo3dZ74zi)O=)(sra|w)VuVmt1B$z$kaudcFB_~^m<*9B&v9Vrdz8lT1Pywf1 zQSPrBCpvj+^vH(S(}I5XYHL_f^YX&Hd)Hcfv}o|g)~?B+^prnQU^-pqT{MN7#!=KTpa| zEKDeB6f#lxT2|Q#+LmyP4xte>@%V%yLn)H^7b#qbL?m0=VW3(+rKmAfiac^y7hK-> z5{U;HV`BgR&H`lXV@~%-Soy+2NuGyi)`2%F|E$6<@pV@jNoXbVS4t7VtT)N;pjV6YDmXQla^bB;fY+Aaiq9 z02NF!`gecVcE{<{MLrxEHWktZ@BM`gzl#?yRKKAo8c;DP3zen`m>Mwa40h3BfhAzm z1FnId)E|&1v&RV&!=u6w%v$aam7mirgu+82?%PWIo-69an}K9_`2FF+44&ibDU#1( zy9u2l;i1&h;qdMjrtCzkRFPk>A$Pgw-|YHY+1f0aHUiQt&)%BTa9JMeIF%Il zkKSy+RYxqnt8f#&al883bV7fvUN|-0&J3G_YX2F5yfrbQ=7dZUV}T`4}ck3 z;$4zTH)30keAd}2x_9e|ypfZXWN5t~h+c4DlQz#IDpb~Ab@K4U*%3OmJWvlJBrMSq z&xv1cS{V)<-tL((*5`1@#9vxcYJTxWxX*=YJqqw)Sh+);m@J+vDlbU6TV!M&d@J6; z=;C^h3>`!E9X@R^sM>0{LPz#jz>h%`?z`BJM33^wsCe&K z*mf?YRS(|ia*H08oEkPcbwE{>1ATbdP=zu7_IlxXIdPbKFOe9i=5TvdHS!{eBSpbk zJGgC3>vxeNut)?WVnI{A!ty6{?>c{JY)3b5V?NgJGx%DtFH<;;-Aajmdx$8i z#p}S+YTt!IXv}RrouH@3#@hN+tkB$X@U^+B_Dn=`vkUNukeg+@-6db?>hU|Hub{yYmv;C@%{dFJj^3m^&Mtsms%rvYc7KKbyUzU^!hqQ-H&$- zEwxbTUqss=F)@aG9)B0T8YwfTCaPg}5BYFfg`l|nU2ySj!6}@M&3=(CLyhE!bu+Y* zQZ&Zb!ySKOc0AFFs&AZ&)hE(+5&OWidBhKH{dUYjAjc4Q$!?sVZ+aTrb5O7> zz<;=Ylk=trGI%zSJaV#4aAQerdhxWQC1k?L2v~ntIGU1QpE&F-QFY|91;mr1 z9Uk0#<(gpksDckeCj!c*{CrONWJ(MjogpDPC{PiYR1(2rCe)8g^lWSH88}W6u*mIx ziJQky#+)cWU(*>eqx|Yb3hROSDuJBV39F7^a)Z6O6(h5xYuuUBeGt;SB_Xy+h3Dkl zf3PF!{Tt37*0vVa>&7?c-V^73;P$>`0*|2dQxBf5wQUthd#V*WihV=L>%dfX%30Gz zPdZ03-klC_WZDF4*KpeB5j%jFX)zu0I}w7wdm@UK+9Ld8+wnRlzAxT zCAgF-ql})96yf3^qM}nI=G%(Qlmgq(VDsChAHIG8CaFJyMus)JHsxbf-Z(;*DGQ6@ zg~KZrHf0%2O#+Cp?`;=!(G(}C&}=}1Gn=GcDVnC{`H$Emtme>j{ z%576sF;@TP)47H4w{JsyZX@#~*M$eyut!Jd%WY8pJ*_@uEu6(qS^9b z)o}BVq;p)=Ei5)ILhP63A;+*vcpqE&35@-gVk*rivd0-e?Z!iSwm=8Fdnpsr&Nf~p z6GDMKkop^ch$v?8=r#SE_@&WnRn_j(O3CNvgYA*l#6Hs2`5Uc5wwZQYg|6LB1Mg3} zDko0j{0VaYZs-~u>h!U6g(FVV5O{G~lh@vVzL5u&9zT7OEKH&n6hzzF;_n+C?yfX1 zS1BbrT#y<4fl(HvJk#PMJ+6JT5_ICjMp97F0A@>&a2S3_=0KMH+VHsh9Y#pW&Mzh$ z_cdfr>Uac_>NCv<%)?Fm=G(VuKF4Paxb3D*YM^i}i~l&|v?@N2gH5q!8@tbVDl9}NEei@JNY z$NoKoomjVMO61Lb?5iJwNdC_XoIY}K0vWi~?_>Vlo)LSW_t%dd-~kPSmXIWCiCmbP z*ueiTb`_@Wdx70sj1PX9e8c6A?mFD{_19h}Cog>c8bfUXzYX3OO`*2(J<{PA80owM zU5!`Aw?_PPcesF&q1L6BHV=Ob8c6$@s{9e!&(0wOC3k6&qfXSLC4#$;L*cYj3cwQ0DgUSCNdbFs9>-&%JvKH5$-0oJez7U{T}d4XLAk1!BLvvz$B1On(|_zD1XRW_QEinDfGJB%MnzA=oxre@<1q=6(SDp z-w=}s0%&~_!#XAzZmmX@@pU57U$3GJwY;315S4Y-o&_L)MSTXb&^(zK2&OtvAAUqR~NhGN%n%yTQwR)(f1=P{zh35-@aAn!ca;ChX>PW@(ZPO_|?Z`^JY$`n`n3ny=7I%6>~IO?@V=sw0FurgLmSUtWn=1k9Y1b0DV ztElDD*w*6u6Mf|E=!p`3#^84;!U2U)WBITfwvmSiakMms?`crw?rueHVWDNkSw=!XP!or3v2&ZEf!g9a3 z)sR!s(iA@3R$#R)9QPt&P#oc1!tjtdjTN9<=C$kMx0AErPFO?srs_`hFc zIgjFpP{X5rY~1^i{83@6>t)&NrBZy-@BA(->X}Z0M+$&B z8WecJlbpQSdG(JetWj0CPqN0S~Q;=iQK&ai#fg&%&|Lc}m-@eU# zHg8U2lX_x+r;&T%5QI#^m>K>q~`lY@_H-_M2k|N=j`vG17T{l);!QMe02{w*GObTBTbx_jjbX?+cMF!QSyNL^OC?5RZqf#Q!_2qPux!cijw z1D)Vfg@1pj&tk19+EO>2-x(e#N(GKvOM&G-boENqo2QVtqM9KP{Y`P{=_3Ij=s2Dt zi@Dx_w2gsxg>>afJ>QNX;p5gR43k9vPW}tlDs$7A`P)-B##ArtsZ4A3$*a++SV!65 zazummO)sC^d2D2Fe)C9(EG;&8I9y!ZTjRXy4Pdwy@82VHZlv^E^bHKi+gN*S4Wzi= zZKa*9g;A{cGh|%~3g?)x6P|)^JMDRBUcW{ITMMEfx*QDJ6i}okHZ(N+^p-l8%LeQZ2`)r{Te`rdlSXrG+8k(BD!lO3|EBjqkbW z{C1==^4P*7L=F8-jYS*-4=f{&5Gn_z1IV;h0+m8SRQSp1X^Fh??kl=J@P_7b!uaEN zxrhd_n4L&#gAVM3U!Td(EwN?2yeNSmE$jD;dtKEj-D;cqFRVw z<2v7<6UF@To!Q*nM0{>R8ENVt9!3*{g2KiLP^^9CwV(C>_ff%JpuwpP!Bho&>j~&gZ>S|B;=YP5HCmnEQU`@6Gn`cc@#^1X**olR}NsDYNn1 zx3iVz2+}dcaP2!D1qB7B>)jDw1U{E!a~TQTzPGZHIYLBifiE1lHmTL?l7{;I{$&y- z7Gcc-$@13bK~GO_eO(C;y1o?Fb9$V5oNCX4(x5K|157at9xgTUZo7`nt$+=S&&VJ< zyFWa%XVI@?`KfDi>RRwGl)i&ybu7d5e8uEWYNqSj{vhFdV)h9V)SC@L()R9n9t?NDLeW03ltwA>i|a~lW;9OAFRgje@*DYC4L1st0&cR#G`1s8J!9Up&e zOZyT|#HM+i{7U_FGf5d}jAyn7BjLn<{~k5`o!9(of9ki(9yZU%#qj24ArL+&!OjDH za!GY{90OKui$u(9Rezuy`Oi$~lWf}GM0|OgSia722h-)iV#twEP|iw?pOBSB z?r47~euZu^V%t4*D57Sk{hE;x1GFkP{uU@m=IS6loy$}oCZd8+wTwkcOeW-ZY_Mpl zWoK*q#c@UWCyxq3{Pha3zyxse%;Hk^Qpz(j|-`aga4o z19WfOxH!G8?KLzsZv7xxc}~ZR{L$pX^DEj@Q&Y`baau2Hmt^J7=ALFYvf-gpHhp0~ zU#u)Gd(JCWsSKq4WfBk=&reh^o!lgTGm25af9Ys?UBn{jdWgusL9xHeWRIl`FEnG4 z{QbKiZJotAkxQ2;FsuCBT%NO~67vOBGsUzIye!f;zK+ zBGvNAr^azjg41rA1z?DL7s1T(cuJc zMZtcj3pwwM#4vS}vJy~c&iV1(HCXfy4Rz1k zziz_>R)~TFL|GF>#}N+^Sf6!Lh0Wk*E_i1zDNg2nOw{&ql!eBBp#{Br0q#RPpTFP; zuHsUS>GHlBtzuE6SD&SeSHYBjQFZu)Bl{w;<4-H`qOpQ&TPsjffUvAgpe+$T7C{k& zXP^p!An8630BR##XYI-pe8D{kfz{bCqJ<&+ko=yJYL1`M8>_U{1HfNwiFLWh*%mKe z5TjwH<-n&cW+46z3lIk|=Z%$I!r#Iie7Lqe-#?vi%89HyOG81rYp*Gkp4*R7HSm-A zgFy(C{55l-2aQPgve@7(ewXx_c*g6bMaFFJ#T{!F!Qh;MIDo6v@$rns>-6pF1@Gb| z#qYO~Kk+84C>a>6RQCMzW2Fz&T_YAiL?GhTz;5xci47 z^fPp5)pIcoCJKDsvxkpU(Gg|D>@ya!L1>mpyp4^`?(y-pgQ{Zpb$2@>6bIkxQaSsuNC-hAPUd^nLPt;gO}fd73y%?Wj^r=feWLCCv}ztk}9b9sm?fL4N$F z1`gucmYcM+Kp=`mehHH~%fB?nf*<9_c46|D;fcHs5J3-eo6g#Ldh*HgmXrG95@^rB z^*CZ+0#c@P*J6A3CT(kVsw|KSQ4_>^SJTr;#V=%w6p=$ZvkXP-rpusoPeE)Qy4;)a zptF+>GSQ_L#-Mro->{IEsVBt*pHRdob~>-V8ZFAcX{4bM3_@VhlQW1A?54OiU8y<}|Ssq9a6D zgo>d-7|_C#I-P3<#+eq{meB|`_ZBSG?Iy6SUfnqB%G<<_r>LKSQ>x=uvb=%Yl?OZ}Vuf~HnVCuKKk%=um0T91OgLunBp)9>f{Divb zDA6os_q?=bG5C!MV2FL7rpYUvdFficnB3f4AgW1`pNs2WfyD>HzvzyL+N)LIk>H%g z+jx#IS{>C3N6*O4YZZ1gtc#up<-gAdn4vB$^LmkOAB&HbGKGlFJqRQ2F{a&oeMLUD zTxm65j0p09^a|kGx+n^zW&vf;OeQsvFLH`}%2>;CzW^!{B3qPv!TEna(1D%-yY)KN zN|$@E1k0lfB-{8$Vq)SKXRh3L18edEk$A*0KUP>wfQi34da)>j3X{;*CaANY!=5q~ zGe`>l_u5hjJpFU17kpq^`ub~ld~4YK{r!9XoAFDSqZfBOV}J=?IyiCv!2(N5I;8YD zwI`Ubgmj|;$T^Jk@tSKT;B0EIrES5;e$9`jZg z+!q!&LYXRc|Gk*p{o>}K#dPN@nCfJD^Kuu!OukL!j`>(Dd*^I(27 zioGo=Pv5h$Fv_(KvdVi0$(mt__dE#q?lF=@zsb2tAyB6G;@M6UgzE^8N&VXBjch;k z)-!SkfP@yS32i+D(}!@MOJXXOpmF=r#2x+j^u}*YLf>esrGzL^O&?5@`uHO<)ce9C z#E}uBCfC=H%R$}pzS32;GYB-Zuas(G7$;F>C;eQqrTwYdp}$0S7*F~+aim|e z!FVss+VkiSp@mzHI+*0dyWg1y#6Qv)K5JYQHop81?J_||rBukZkL=tf2l$utO^Sj0 zw5jRoKR(!6WrYH|Ecl2W6wJZv6np>ZnyDwzzjx+6jtPGG7rl{d)GsRAX(`FcQY~$w zgrM?AfDB~_^8R?Rv$Mm(cvB5HTbw`98A8Ob2gp0z6)%(8vf5cMmb_AA*Uka+2h zB@0rd50cIcFknTXdK4WntCaG2Jy=zt!vc~WK+Gr(l|1WKl z2fHmTp5br~C-W(4PcN}gWbs53N9|l9cQZ87cU(|kHJCz_3Zp9FM7o{YI!wf@tQbOJ z{*Pcv-;4`0rcVOo2SrU8dpQeXG#HI#qY|~-_!INoM&WzAR?%Ejv4;o!zq0^lg$qZa zgImOBfS}6Pd*LAQ3s_Z#j%Gl`8f@vXBbWRN$f(bE+U0s%qELq&2o#%!H(o`96l{Q~ zIy<%FCI;C7mw><=a10#v0n}qEKaE;E+aJit$V>=9C!2I>Y3X@Jrty)6Oe1V-YpeMr zgYT1>#>~H@`pm&O$4`($c?^x&K>`2_U|KR?_$&ZL^kJdyAK?CkCn2w?<-qdT@wNVJ zk%SHYpmoohGHvi5kmT^~aNjR3eDr%ci}SmDIXZI}LnOitI+acHW6!Os;w(AXg=L&S zuo}%IyO~3jkaU4aol5-Ph_45wQh`F68OT_YwrpkLlL454JDFarYeH?$SHGYjH!FUk zh*T!J(-i2+bkg9tkw9*h6J=z@mO>DNb)dcH+te6U={l47_Mz9A%@{SsXCerRt>qFM zWY%x{@AFY<41KYlr~s+%ZeBqa#v%brVZYRfSHI|_Q1U&2vzz*b>!P9hDvLiH>qGiuaJY3P_y}LHTSHN9`zQu(qX_TA z38CTvwbS3f)}qaM>OKil$d@DvspscM@;C%Q-GKOsWsDOjO4u)g{xuGVK0gm9QZ#u2 zZ~w}o<`pS+2bx$V7CW?`^ zpRYl(8cF{Lt6<%r|NE3hXIbo~(5Y<3$8Oh&Jy}d(&Y4EFO_VgojA_enoAS%p!OHfi|5K;fdi$El1BV^A0m=_0seiluu&w}%1$nWNO3F6-qMZnOE zQFPWnIJm(r5+HpWLSTeBi74aLdFd%k?!F4ue7hcn^aFtl6UzC}eiC8w*Zs&bq$bXx-$ced6pO>~kFG1Zdam;hT> zSN99A135Y=A0+!kR*M)96Ilbl#Yof|UUMII(RoxDg2@R@gPY4CB0;>?eq`(NL73En zlZgJ^x6K_Q`a`73X_W$r2SB3V*oVBKX4`IS=klARZnb z7-fL~3hhfu%N2bR1@Ftm#1x;95P-v=bc>MRezPZwBLU-_C0}1aRYthC)9V}Ubq9qIr3~8Of z>WT)A(=(re0J`f}$Db^8Mvz@ENQ6L9yVT^ivHjga+S9YquL7AMH2OwXv%Ma!JU<^6 z;P&UK zpcP@G@D1)U$Y+a8L5CLBcwq|Mv@WqxBE=B=+(q@x5n8poHn_EU)8+FSn&7CGg(b2sGF!qbi!3bYl!?hG78*cX99MIPe|k z1FY2a&8hbHg6Hi20A_uS_u0iiZU)kW0$c|$d|hDjY|ZgDMme|Zs-yZzY=@DVS>dz~ zVfd{|vBvH5O|NPi(=`(?+r|11!>A(jD@@Fv+7R}c>Lx4F06APdeWP`rSD$_dyJRLcf{7V9+ zP90x`#aSR6O1M&CS9$$1an;MKTiU=-1%I^YGT4I`kSkH=rlqJCZ$zWA6QpXI5;@fEn3t!j(~&d{4{y1)>W** zG`_TS#HLTGQ>9ZnCGBJX37`v}5A(PjFj@bvkGeBeCrK~!rCXp%?O zyk8YT@FI|xmj_;%P{9LfoddcvgV{3&2#3CeicL6bAz~W8mRTfjsB zmKKox@C9lSfPBaSz5qCEEKxUrL4ezV?oqT~6pgl@`g6M-AV>c>t`*G~_MpLs^0G21 zH@Et>k-#DctRSq>Aq1>ZG(tVuzR3jTzd9_4i?)cgb(l(wy1NG;q*M4@VkxEbQOT+q z<-4kk$qoV&4gjsD7%PS`QhpW5Q%7i{?DrsfN1Uy&Hh>FxMpPUXoZG&wDjj{GF6g4G&SYNKfoG;%VJ`bbTPGlZ^{P*9D&(f@Qh zbF^Mor-A>XsMtD!Bw|K^lj=W|Q_o)1v?Ft;i!Y9kbA`tot*qS2!NK8oH7S9|7@dZX za;Sa730ZtlV!&v}Nu9QmRC;6+KLBI`0g@6^r5XuzVFF?548{ofAaa)>?bS7aQyRY>O z4U3zaXhMZ58PBT)@XTqCZV(8>_fH!|yJUDtFSjjjY4267d+Z~x(0avb$Jsv_ika<; zf{u>IQBhH7lIZo)C$$19EfbT3nwpx}TeM@!_B=A&;W|dXPZ|`2yY3e2O^zO-v4dDd z-#J$IlUDR}K*b^LrB!J2Y8A+-o%231qL=`ahB@uUDY=cBgHR1!XyZ{v^BHKKtnZIP zE-2|`f2HR0YpcWA(pSHWWQ{~-chM2Nb)=yDUI|8PrbxDnn5WWgFkytkf%u_T({5Ca z6gVD|jxYF|=sNu`8tlHXv$IoLmZf|6PfAuMvtkO>BNLmsL#MEgsZbU7$^j0f$Jww|}|<1(2_#azBy%hwpS^SX)T6B4hQ~ zTCKsMA^Hy<9v%bYzRc*&01a9H^G_}iSJR&6o&fUp_5mo(Fpo!f?YcoDw>y8`q*Osz z>@OuWe!rubR(l(3EQ$6*2Z_HLoD>gV>)6`b{s)w_X;BoE%56Vt2dyzc!o(5iQ!Wgh z1dBawlp$zF2*UCrCqN^Hs8ttq0ba5RyQ>1XU+5c)AUW%P5VS+P2>NR#KctMPBScsY zaqpDAKFbzBW6Qu_+q)?og)eq!lhHoVJ9yJu0hf-y&w$iEqDTBJ=(UYzBvEY2sYk@< zi%~l*%YV_k4?1p;C2~NoW9y5F%i%4MCx}=&vFvo(}0&5P4dP)-&*Xq46Q=brH5Qr+D89#Pmjwz{+qCRYwqzgpAIDS z*h`w5nvgDO==&HEQ7<@F?-;@y689W4V>}8i`z$#(f9;#46*51$h5GyZk2s;F)L)L` zXrxI^I2fA&Em6itUX{1Z&dzQD%hvUvOn2@7KoWYg(WmVH#UI4(vR5Ok%05CrV((aw zEdG1not0JwC2~6Ej1#!XFl29bpY*Um5=Z!pp*kyVw8p807HYVkFgMd@NQdqF#w@PW zx+2pj9%dqxn<3AUWCND7094ROp(-~wbTL6(Uw;BX9N7HgPY?{=nzTqru_%0B^7@5W>Q zPSAV3ksZmBek&G*D_$R785vJj@1GAf!stFB(ZLBUxM`?$ zqq@+YM*bBS2@U!rBP}CUQs#TYTstD!Dn5$OSa+TzxU%L3F9ppzW77l#9O{jJx-@PE z1+yFQ=P0jKJtkXi3NOXMZjO8N95(tF$qG6qcBM`h~g1J2V53m;wEeM)CA1>nDBWW9_eZW zNmD_wtjQ&Fi)mYpyu>6hvz?$3ji1%SaH4ryx-d#_q*j}oB~7&lq}3sNP|taLoa+dG zfg~ye6lIJ~Lwq>eb{8MJt!thReETb-)a<$2e>L)(=c#0ldE&!2f(#9@jWntV!y3Qy z4vrTC&jd;4rI{G34O$^GF;rY?R_}su3iCg9SoqnD+zg-E8-5z1vcE_Q`urU*C&oqA z!nR3^B(i%|pVYOQO1jo>e102WB{Jyu_htZMZ;Ak(X0w7Jq=C1=S(GTfap-HoD36nO zOYpsAcAXG(sLU~>s`hfF_RFV9&2>mmm)}O5%tP0|OH>8{NcQ$b7ikV`L|IUP?pC+S zu6(o~0d`neEGHXepc|_6^9tLK-=9dD^POook=Z;@=ls#S@D!w}!dHmhfFSxI) z$Q1Dm{$4B(NiDH{-CuGATo~z(?VddYzd+WvX!~4UQ}94}Z`Mx_ht^;uq(~~vH3Tc( zIN3AVSJEBr+MaQPe@K9Rm`m@GQ`|y;l(dQZo!_y`Ui0#o)QPk2+V-+o{&r-XjfR$U ze=?AZ(7V3ckq4FOt=ihNJ#k@Ot2}-fgHs9^>~{7EEW~B^p0;Y6sg>V`m_aS+qs3lm z*Lbo}KK!W*`$tE3n^s%>r&eeFOPP2}XQ$!P1q14j?%bJTIAz^6!(90{5?`|U_z2Jv z)Zdc<3yr*;!F)%!grNcD*3FieVFr5kp6CM9DFS(lB?~s^m~|bYGdqsl^YnLx+ zL=f>WX;7(U@L0XduxZzcX_)X?Vsw%0l$O0UaBe3XhS2Rmy`kzbC;FFY@&p_LGV+*C zN&AQJEWF!eGruRJ$8h_~FA4q8y}seQ=(_*$j3Gh$*RNPOJ>^Q^F=K<%;v)x!DQlMu zT0_&>{uQ|9iq|*^HfYWKmQLiCxH4KDX~WWcN`KltC$SyibuozzLbV>?*#>AxT>mpT z0cvkkb$uT-E}MNtOmZhm__$5)_IV!yo&_o?3DLcOg@_Q|DxW7&R))EMkc0=e`4 zqB=x=i1yh-a0xSM>CGb-OQI3wES@q* zi8Dk}8)gS?h-AC}L6;}D8MclG$%+><0{Z&mp}=n@Jf$@mR|a9^kx8AE(}{`A-Iylp zX9V@*eE*MCetWeO;U45Pg!K9ntN8lcglLT0iELaozI%Dj+ohRZw~fxZI00Gv zP}56Yl*2v594;YXq_84LEBKZ_=bmgH_zao3*ZhH?4!hrHhjyZ4H7wSi<$tfj!vHZ0 zS-uN{ot_0k;p&UlbAd7UtD<&8jADjN$$_|DXR{p7=i5o>yL71qQ3?pl1=}FE66W=e zQ?o^ALH2gt;MZWmzxe&FE%a-HDBN-zQa>q8~<1yirzw zpq}FbS%#6A+zPwOc7>l9U6K3y!8QE@ZF?`BO4~yaUgsoxw68-ze%rq-KGIAh(&1N3 z@+gIEve3CZUAW2P?!l;2mmkZ{2cJj%JUvG>;mY(dV?&w;_;xxJJ`5J61l?bIAr9M* z+2oN_Zh^{3POvCS=Y^e))| zo=VURs1O&*(tzldGzw-Y-l<}_R2hfP-K1TN?$3WL!6<$@hpgoTd1YZJ)4CNhbtXZ7 zAi~IXP!2c$z32g%?~KH|;xYkxTis5CLl17ivls_<#v>e*YQG!`TG}tJz29Ng_}>&4 z`|U=cB0}+`{Z^$B6;+82J04z3&JNAL*;-`rdp8*cLqJyWWzrm_)lJ>H7W17>3C8f< z{1S%#Y_!^Xi&%W!hq}US7BW(}{_+#iTYyN@7y$f(s%iQ(P#u%W=WzevkPtKk>td zoD{?lAnG%O0jUe;i8RICm;GG8>YEF#Re~Nv>5w#0eC4_=*z7J*h!yMxl5p%K?Yo6cqq;e*R%I z>F`o!kJwLru;db`XTlv~LlA*A9$EfAMdy^Ci z2vbD;nCrn&mM05?Yxw9XxR}oq~$NL>6gX4$#R1PRS(E);XQuKit z%ekq3Eb|UT79V9d%@H0WRz0={_q$@2+wWGakJM`TpIAE}zNaEo+~;BPkx>J! zeLz=0Ht9fSu}WsX zdY;-4I+D&_2r7oZbB0;R^)f^du55LxA9b#}Ti0e5K1v3ny}l2*PrP ztt6lydNYF2y6H}7lrGP}7fPD#D)5Wm=G}rN%5oxCI~E3Z8uAw9yuBQ^)FtGCsEP*Q zc}}6u($)$5RzAw4-x+=or>!kOLO$mIgVkN)UD>PhQ=HL@+B_|2;(QLwTxOWgr%@w4 z3w=A|-U1Ylo3>6n;x39@NxT>B3meJ5sdHl=J4TZhZ@Rx>)vvs`z1rXYr(n1eEaCtD zxKi89&0_pwRVmI3o2WFwz+zm3R+aK_bG1{vY5}NSsA2ay3#0bGYUap6HpqP2{xOY&K zVhL!!u9v*4r3#+arE=1e4JaZpn) zT=hxMpy0+ldyhVcv}AR6j5fWSnRg@57$L)2qd~9(ah>TMW21)bk`GWNhk;q|u(zS& z6A>fAtnlqV%QVQuRfZdK4wb)<{TS{I?N1>O8vO*JhN|6J@!%h0F!HRd=Eu9Dq$FH?ge+vCEvefi2t6-ChKp=zE%VU8<#N%EEP1FneA zzb8o++;9n(ptvd{cL>!7;CM)FfJ-IWP0sbzUufYD*&x)_nCG`wkr1VfBALTy>73RL z(a^XB^rK5foSor|y7gXb!pk&&!XNU-z~>YcaDVTi?Q|9$f}h)<3DSaoOt0S9(Y`|g}A%y#>dT*(K~iX{W+I1s?2VZEy_`x3%a(%=Z<(j5y=F{K-!gG>g8UB$9EPvL*_FgnAhBc;s*(MLLWsm=(-NPBgw z)unCG&v!lJ}5(dBEkrn1?pMt%X2g z9UdqPOo=y&IyBNs3!T#X^LN~1LZUbsIVQE}aEAuHug#XEztL4bBhM4=!KU{xcVahX zR=>l1Lu|{3GW`iBm0quJlYJ)omH|)gH<1j&%|8zBs+ftr47Ya<7aU~szseQ{=HFqN z%Mk8WQG9pB(6GQ>tHqeJp5JN=5YC;DWR#hwUTQOSViCD2dm93Q-ZOUU;|x7>Bt^gK zYGyHb2r|JyO}qZ_6IA#(->PRK*WcR`z`OFiAS{BW1&XP;^qgRKyQt@&coO~nTOH~* ziUz~~t?|Yr&J)hAVwF;}JdZEv)vQw;(FJay6XpMWOzVt(IyPcXULO6QSb)NaCUh?w zR?Bm;=SplM<)6WzKb{`A=eoimY6HGm4s&i>9p{HT;j4cCcl|HX-gMuQ#m`JdZ0zah zTe+F%T^8q=5Q05M?ysmLZ$VC%bCiz zn0W5@pTAa>`dHzUD7I#qc#ZyLj^?`(wMzbA5ugyMdl(6bnI^6oMEMuUylAN2676HZ_|O`5%mxL6#2{>DZuWh6bOi)6;F|!g0{PX{VnEM(85C z!0neymGJNAma@|iUIkod4?ON)1;asih9k$=SR`MXy2q; zbmraDuZ*N(hhBGcQ@O8XKAcQKP~pO5>Xs(bR$h`?^MB$OkB(!K5ZNIBDD@4f%ZED4 zk--YGnoOKYOc;l4@Ffa6wCEPlh{2-04ygKFZ?iN4CMZHh%|L1&Gn>dpe9sx~3Bc=C z=~PG|x;yS2V3Oj#OhB+f9q-l=+sY*)4$>=x+61q6-M;S!>lXgEe zGsBZ=yR+Qb&;MP)II6w(Kh8P)yMj7B+g8%1XyzQj|E7d$LERBu7Fz&hjfg3ek#9_a zU%6_!v%cFt^^;>hn42rqE&sFtpxMMSl)o9`IY+D#ZfifWf;#60GHZZX32hKUmu1Ni za%lHo&Z3rf4A80|Ekj3p-M{DJbevN5$pAb#J9ce0AEsD2xcqR-6_c+V!U_jm|LX2^ za~Z@Ssvu^*OrwUp4;NfbzzZZ95%SHQ=?P9x0EXswFj-H)T@V}Od_!|2Yl8d}I$9~= zUXumwTkDz0#?O&r1sFZT9_8Uh#k2ql+yLy%Pv{UqJ^B%{vH>e#+_}KYCv$?gu^hot zV1H0eEQqJ_w996pI=GTu(#}ikYiC_Fix`3u8MGprKbk}W z@rJB=Usu}v0rcuyf-SDMR3RAks4hA{c8kkO7n%H{ye2IkbH2 zSfIMoJ-rfNA@gVlAHC;i=%EBuKI*`EVBeuuH=6a9H%+!VAJ{+}X*QEsYp_FJ1vU&@ z%KT!sM!ms_CZ89qnUZkF&r_{b&F=4o9gNYG*U(!oH*)|oTw&!VK{PZSrFzMg1zqos z*qQEFCy^>3`VE+p-<+iZQ;)|GwX0q>#Da>r6cpKMI+KMFF`6 zT<(}ZQxc$$EV`@9y8B59|3F0{ev_BB>gqqasbjxD*RDsumgrgAeOa4c&r6GdbRvBw z%;~`YgXNG%A@MyZ$oyJzhNF}2P`(<{^CICsMH8SVlXd43dGi#_VBy#5h1**ooqNO^ zztP%w*kLt%?*3>SgCmSSpSod8o0GuFwBpO%AhJg(OyCqWaJ(t_=_M7<@OU%b?Fy@> zq3vLJJzX9T%p@zjv$NkK1MGN7_)25lS7|7*Bt;!^V$7t8T?4-oTI`Q zrD#LQ0fdNb4}5Y@_87y@rWcbfRki0D^_(Hd&P+eCZH{neVGir@xRPLMkLM}lY4?@J znkdC`rs#+cH_LAC*_SqLSJ9hoE_L-*U>}n5o^!x31f80&n-T>^XQ(fJD=loO6Mlyn z{e=c>s^J#ZF{-o+CRwTSHnt9Bzyg}qE8o1etc!j=gXLOG7mJUIZr z(d=Jq**#N@M;Vt9XBz)*{X68b()C^T31GPh9bpUwOzT2_BBKRsX?=uLjzsXx zXFk#xIIj1f$Ayj{P51kKF($sE;E&zCJJ2=skhZzp+j=dl3uFE)!Ehndg1a`V@<(i3 zb@Zae2m*KMqYW3?m{WHt$;*G*pq_Y{v5Sol>-`q%%#uV$&Bb8gc7K{xi9XDBY&y#2 z+haadD;7v{cYn(sXCm%Z6G~1{Dx}_BbLpWbt3WxgUC!!$y2G0@^|dTr*?9E)*1&f$ z9P{77t?S+|-)!BGJzoS;uh9fbosZAf=j9}{grJdv2bF!~FSj`ohx<8kW|KeX9P=Zl z@Z0M1kzI;2rcgd~Q5>7cdZc8g3VH|~1Cj;j!{K$8CTlByDR^DH#nYD+yU?Q~iLb-s zW3g{}lir4aEGIP}FeOf9Jg1lj1w1igQ&GYgqaCt6&1O{FoysRv1bll2LhAziK#$QJ z8MIC!k>e0EN;*<Mx4~BAmFW^_C=2~j6mDAg_Trrr zAL`w+tGzSE^suQM{t=>v!ikBkNwiyGGlRya-vP;+>98MX-!IOmT{eQw+A9e+!-?E5 z1Zg)8RzFF?5U+bFDQdq4;V{E5l33UCMY`NTK;pOx5qg(^FY@Ej8y57xftf2zX{3gY z+6upvBPA2s9k!4*=Zn3-!;L|)v-RFjGo}-OmO5{ReNJopvhx=rcmG?@hoGwR3TsnA z+JE8_qQ*AyRt;E-nsZSf#Kzwics2JEZuCgp5WmvI0|{qlYR9gCfpt%zrzY!=fs;Fg zBs+aBO)AiSIEcK1bok8({TOiBpPV*CS)%-Qr@h)N&%_xoFSh+|0Tq2Ny7yU(9T3RW z$$cy|ZmIAaV2MT-7l-*oWl8o0wz!WNzWVBmRH>@8j1rW?1iJGh^to`d!*cK2nWtel zuSTY~x9oqDqS5CkmX|EXmk_j08A+~?nThvFgn_h-wkqvKL^%a70R)wGmFtB|CxIJ* z>ZfVvp)Yq>mfaCoR{xI{15DkyX3X+ZXngsf)OMk8(+oZ2q@Sj@ItILl9own% zT>}ETc9>Lzn>r6D;74~}s%@!q9*r`-Bq(qV8JVh{ot(V#6Oj*{53N1=bCHfQ@;H#g z4!SQBQfQMIc9Fi0m0584#^@2;aUJjP>Mf6G$Pt-)L340V|G+#@5x0#2ItxOye1!#} z?*{Z7N%S2mI3gNonQDIrjSA{mN!oD5&VEIT0?`Kt_2O{|LH|gGJ z_B}Y#YyOAz#8>k~H2)(7H`6FUUDGSxv;H?EE0u}8vJ4hrfG^9j#cD-D-OWde6*dv( zf&)SEaVApnV+zyVXr`(mUDu|&u=R_EKh8mylHsde5^2Dnm6o&Xvhff#)bAilyDNvp zPmQX+g7$(+ z_)P1H9#6&`XO`=ZtA6+(u8gl*5QDC@&03fQ|IsFO@^-{B4cO$Xee(C&<7Q7rH+Lig zoQlL-x5mfF6t1Q7xCN%yGGj*d)8T+;MthU5q0qeT;YlveCvr8Go+r-MN?PvE6T=DP zixZy~Z`DakOHU;d#ee56-ewtl#t+fbA}D&URBUOjM2Y!Z`e8QLyrSdZ-!u7qkQjm{aeMZly3MK;9c z^3Xa`V!nG3xFGENmT~Ui_Ps)*y3(Tq{CF=ck0(2H?8Y6%!6S35*jo;FZv?AcA(o`q zkpt&RQ-D6LCMC>yt;X~jUcK+hlcL5W`t{w5r4$1u8W<(h_?UWNv@=PM8*&`+U|8nw zaFg7>CTdR{jDV8dKrFXh9#)d9m%n-E7%*)?^Na#Uf)`DFll-oGRUX#zpV|Ld>TLfT z+Sk1m-bl_}@L+V=H%8@xe-;dwUcC0PSO@xOe#osqvy>Oilh&t;!ZcUdCtLPmq5{gN zfF^XmH0k9(vFIc%hoHmJ4E0AG_3MLwr_-0ZJNF~U@AdWpH@X@?*}Va+ew$vb;jndi z^MK4bHRz!0_EO7s{`OqNiuN+(k1YJ74wf#jt>D#eU-yu>b059#@wUr~N zf0==WfolD*+zSWmZu2ln-f_vgT_|PCfT@ zyeLiBgU3v_jYJw2#{Cs7CWiS^tGh6Y_0=$XkZ8`#x%12~S6C6o`hRIc)5f3`SAbm= z@F39wx~|c_t1Jg>q=_BKxsm1%sxb{$c-&df+&|!ft6X-i-x7>h&mi-mJ;!fqU9>7x z<}K-z(qRIxE0nHZMLz)~Rzp%Q$G(~Uiu|E?*6}cEMmS<5luR@(L2Al8+y~7; z+Z1f(-r~I6l~)LHJ#Kw_Dc*|q1ncC|Sl=1js->-;EV+xp<&Q35m!j)hI=?Z6Rvu{F z0WMmi$}Xm1cWx=tLyydc?dyv&(w(#5)0xkJcE<4IT%h+nZ#u+;UZy;3_C3X?Qc9k= z5@+MC>Brw0HDaNyD7~praUno`(-;>T-z6`r2NEtg z%OFN-GlX)5+<$jA4v0Ri!tk!hZt(q8uPmB3*F&xo*h9GVL382G7)Oq5MO^9N5lp$? z%we1NXTy*YKqX2-7YW^8I35Hqy1blclume2r4+VcO;OsOW&dxwgV_m%r#3Cu0#!V5 zINM3TF^OZqkTxTF$`N_|X--Th1VV@FC_JL;v_QN-nw$WjSCOjG>TEpI!tYNSHpY+a zyv0YNYOpTA$!F@>z~()e(bWqH7DyJmr2CY*@#1Qa^cpD<2_?^=M5P2@OJn>LbMG@@ z1Nv{EENjni))RDdlUsO!`b$*xE>JxM*p&lT#5Q#Opf%at$@16#8N5l;3fYhwGGFOZ z;t!^@J_4)M{wt8Q39bRGQ2+0b1Rh{T*Bv}_s7rn`j5_W7WI3(WfNcX(t$SDY6!LaW|-Y^aSz zS8Au`6OQyTw{5&f@%qQla!+jGr^H#)V^-5`ME@*zsFvzDV4dSp zqYE}|(5T0MKMvbf%*9kBX$Y-+T}VPCtfv*EKu(`Ijy)I|jj2{&u%Ivjf$Hu>H@H5bVM#320 z!F-o~nVVfhVdB%2_L>8JkP))Vh04Dh_^^d8qjMk=d@=iGjVlkjIods~B9=SoHCM!! zS;(H*OZ#3@JdQab4a)*doHEpBCdW5Q0d zIys&mR)}T9-pIZ`v%@27=aFSC;oka$;P*etwifky&YQBRZyfP12{E_v8JAzjQcq&6o_SQq;=mdpxVC+pBMz#s4BeE|O3VQz;#$ z|3bdIjIC9_`C3EkBD!E?pN`qqjHfSV+c1Z^3{PRM^s5uEA1^)$wHYC5faQmj&QB!o z9iKU=@`(LEx#fsNzGG#*MAFSs={Y%LSWzEzHllD%VOGtq8MYoPq1+S1gj;5sT zpJgpE7LcQAeEX>i=?kY&Y5YZHZV(0-8=0`U51|{@ux9_+AAbnnKgP2yL_W)5qaj zA0(-DKinZao}V4+e8rM}?uAcxiL4_dR+nF&>s=^(teXD&EDJO%Xv-Vjqkv$g@xr3U zqRv--HXnVI@h)2MSg|%dm6eVnoIUwH0V zTSs*m|1C2ckl0@ycb}Qzei%Fg^So99NVq$kK9j5ZDgnF~pv{-)n#RAoHta4-bmsFo zo6U$G1k{teQ=160aAg*&qrdD@FA5gsIQ8o@QO3DkF8i{zi#{NK^3uu28elW16E@bR z3Wkw?9?SJ|4kR%AtR)^+Gd>d#;lmBnOgE37JT^%4_m&#n>Mh+ix|h?uKILVt&C$ zM}um!sk01zD_^I_f}dbNe7X82+}>gzIhA1O>2r{<6nnsfHV&={f_zQ5paHuaj2)5R zm`BzjfIrLe$ouH7+UjpNH@j6(7lPFfAC~fzeSIZ5(5Tg9f;={yQkmf`#ZR`4t2Zvy zTOtm^mOA7Ury6g~(-DqQ7K6gVOwKP)WR`!Nr zK=8FhKhxPdUC2$pP~2_Ezw9x<)F%@kUva_xZl&Sf7;P=gd?jQ(SlN8NVxQ@!;!4Q= zZ7XuBzt*~Yr|+d#%K*aDE;hrU+EC$Nudi89eQSA}f2%-u=8UV?+X;K_(mx_>xbpeR z!+&<2SGKl(3(FmS`eWYz_11!vRUx9n(Jdjp&6CWTHqwNmRf!9A^7;tV@~>a2YQNO; z#J3gHQ91715Z)aR`u2c77h(~k-}=|~cB>{kJRJKx2_$~G4aNv^?bPzS=qm6;*uR$W zU5ofLCOYb+H2j(yE8C)k9D+Ca{e>=#7>*t8?guNHpsWeyrx~p24l0JkPrvn#K?KW& zJ!V2*WxWaVBH1?&Y!h<>A;|T6TorrMF^Kxb{`fm`9d+|4fj|bln1b2;Hu!< zo#rZRoaXAl)Nk+i(cK4M6cp%v!-%#Fr$ z804xuK{Fr|IEuMc{Ry<4Jau13qfb0nXb0$S>t-?E>lD25Po$724IJ!I@1{;Q?jBpg zOD6R8$;-bhqtywtWc~~RUF8y{KEEmQKag{}zHR-7YTox_t~vJDexc{kOxNEmu% z#*?ChN;$5P2?e6?V4f8%)=Z&L)Oi?k5PSx+03l9}Dsg%=A$N)x=YL;!M>D*BHy~1+fzKRzt#4qvttiH!9=?nO^X$`cAEdLNu&kohM{`E!N<8k=$7)`pK zo-DCm#9KU+im>zzPS?XVg!fm>vV6-{x5L%t<)C@&wJgMKC3lU zd$8&LsQ(f-H#Dp3)_NPap8KOA*lUKZu!7fr+}c-uI)1?blU?QMUg9gnLD=x;$B@mLsQniQp#6zwq4W1$nh_^zna|v6?wMAQIU6y{scZujG|=k~{foXIuAYUvKnLWKd$m_PNU ztCohrE1LK+#qtBY;v_nWEOvPS`^=DZTVC(rSU1-P)CLUKihKOQiV%HDz<3SI>Gf> zU;ws>`P=bpSoU-)fjfVy(tM8y+IH$czuLu~8;%nG5K+BMSjBz#*_7%;O#KF9Dg;=T zsy-A(U>=+f{O+bS!`A>WGs>s9@WP(ru|&3)P64d_%eUWGamfjDf4`lJomWxL zEPi>a^r}ESvaSI)`z;}&zC^b&D{*lyXN|7FZgW|Ci1;Jm#WnRUz2vH{WqfBoSZblk zYxXCd?d50V#C+lG(~^x8p{m_WqJ3Q%D=3`LAnu0m%j{b2#*nBj+;zpE;N(ax?(47l zGFHY=&o$Cwl~MnM2>6@apIwygmW$8Q_HTFmx=PbVZ6d_fvtMkt{=UA(&ogiKS;BIY z_505r%XxXpMTp0~M2UDjA<>=QSiTj~PE0eZSU2l5lFWu;17bJ&i}`AkRd-BU=w zh6v7vZ5;5QF$OI6V-rqd6HNwLQLq`oWxl%Z4JBy0d?c!_yNo?Tor-E|FlbaJH3XQ@ z0@rg~pZ`|8Hmq0GTAa~K53R8|`7=m@mn0TLX$Tyzj{Rqx7NA#!P~cyJ5AEq=ve|mR$^kwx&lkbcf|E#XyoUULRf5xly@sja( zzZXJ3)=*_U$&&a#u>gNh_agRlC7ui(8SXefeCIU$VyF^f>aiL0Z4wgUwo=6V)$Sf& zF%2WDh=Taw$Jw9BcrbsMeTG5+t;cK^aVy%4UR7K0v~(Z+kL1`>b zW4f|ZsVlMG;p2_2ZLz({h4K%7k{WyorV`$aG=m2$P9nEnf9B=x;2bqgW?Ghc??`xA z$Ri?Hej{q0fw-wy(QsgC^QI|EWog`>+&}T0E|_oXQK!PkABrk$)=0y^x9+f7rMyE@ z9!SPQ773ndl=Zt;Cu&olDNU4$4m0W+)LTmOaIW7ZO)hd8MO{8W{JUmw7d z8(sMjz!Sr5@vnu{2GahtTOSkz|1wQ#4EEy1q1)ICDOQ`ix?332w+%F?bAhw-2kn(kC31>9|`@;yLBMy&7%s z+jx?Uas_s*H~FaDcws8zS9N9?HA-P5a37xsr0k#BqC5M^t^L{$TGF%c{!r38Ruo4n z7qU}btK3p{|G?M&z3RPD`r7rpBe@<4?5sls*f#OsjhAY9GUPkC7@*qPjQv;7?2|ss zt+XZNwu$+;%6Kx4)g)xScArl_liYM9Gr(Nc!zp>_6vVa}o+r;0CE7EK^y#&IsUG%9 zBn3uPK0!#&Pj_r@Zo@&Sx%|=ykTr1P+s*UI3Ff=dSMC*IO^cAr-M}fNj_{z0+wf!S zC7*8(FYKYyCxr6jdsDDdqtRaUF>rJvofvZ+=zIsU7bK!pr+ zvmhF^&fDJuX4~Epy6v)O+7N$PZ|zI~PVqi;K#$JEI1~I&(Yq?TKF!{0sx_9xhAXWi zy6&iuoA)a&HPT}|tf((Jscz4|v&LZLhq7I1)lyVBeWVL2~gZo{~Rl zh|{pL&y_XzUt_0;8`|vox*hV$r|4G#ho>J-fxoLQ@f>{37uzxU3=J9wg;7LNI_|^4 zr%`r-nHZy#iC=wqrjh^Ptbb2jx;<)s67pSye!{ugaz^yxTLd-3Lmvb)A8{FP+wc8= z%LV~9T&4Y8?^u-#>6dU^`%a%AT>3}d`+>PZd>H9B+I?8QCgb^Ul8jLO=v5vE7pXQ~ zlY}Wn*$&F?fKlg{hfS?{!&6>aXI17AMLDLYPTgXfvX@C2Wd1<@-qg1$A8m`(KZ^#R zx;_284lA}brjbOn@dY(Dfen4o^~Stsw9b8g$w`C`H81ERta(({UT=t6g~L(_nwoyy zBfV%7c7{{-H|_K28$65=$jawMfn+w%sM~}gpF%5&%6XZ!ycqvn`kSBp(df;voVWVZ z2R?-J7{?0hwZZN!@mUPRyI$S>6=_DR(U&A!a~3dkj!MwAGMHRuL2e4Y zs!=so#CiLvP5kX+@1)T!oFsqb+NIGS+sq>chV{EE^ZZ}uh>Iqlz8Q`BU}Y=Dpttk# zp3&S2JT+G-yv2*HE-Yi~#Q^wm-xn+wFYTVw4qI=1<|ffjxbEg>U)69R45wtzbz!5< zjb*NQp^fx9ovgDyd@I=QCNHk;uBGF_ZHo2an;W1&O8Bq=*LV9ys7}~n`cOv9Z z>Q>Ml&gFr<2`bGlO*@wDZ$=E^_!8NQyg z`w8FA<{0t@pVOp#s+~8JIUZEV7K7gB(JhKnG&ylKIy%xJyZzbHOkOw-bMFzQm==bW z{Npw3^bPa7H+++BvF6`+@Mk67U<51*6(Z&83DiFZVT4$9QEw#M5`j@m^VZ+7?}+jd zbw8JxU(S>s+FJTGa3VD=?jK( zG{b*TXazAq^}0(k8!);j{3yAT7ibp`xq`Vi)13B%7G^(ZcX&NnNYB;!0etgJI3ok#l$UIP`xL!n7$YECiN9 zxD^e07AVz}aj#il=VKH&ke`EKoFut_Sa#>$vKS8Vmbdnj7YQbbG=N^yQ8IicX~4<7 z(rn{xT0;%R2HmgN$vT+FGh}VnN_U&DDPx+PYuE|1@O? znct$d*sE(thiS!`iXZf}kIcPL?z;dHnOuoi#`q3nOw~K|ri{pX`8>vtTcsG+TM+vV zXNX$S%ka05U-a5VAySciZGv*&M)x6}L9m#N3^}e-1dJm-%xjw2Lq8;gx307^dblIY zzpXCbnmb@=pXoitcKJ{fxVt_74jf;aNh4-&F+}jg@}PkjAun~K-%Q#$@zfL@^}25; zZumB=l0PjE$zbg02J~O4UQ4WpuD)3i<7ll9$MyFwB3C^@pCPU*mgR`ot zs8vQ2++733IEBIMzUKs)Dhj!Kp!1#i3~;)YpPh;je7rThk?lP|<-%zsujhEF`}^ zp%F)eQc|Oo(hw9_o`;I@6HsA-PevP@ zW5_-H^u`WQ*l&y(RJI5h1ST~?6{yu3p#~jaECwSp(3pm4CDgGtLWl0Mfkzclbu=9< zH55y67%>s5E9GAaFRUrxh(Qd1qY>bHeICqsY(Lf}(XYKuj_chwc**~-+$;sx`# z{qbeo|Lav$hZ``wFaY;ID@S90>1hE6?tAcIrL(h>o^lzhP#B12P#jKx2g34otwgo* zkP7g@zuq4|f9O3|TsrlD|Eqis*Iakakacv&BETi5mXDuv=8y^SBbD6_O6B_e@0SgF z|M_z!GJi%Ro%uXP$HAwnxZAgL-3LB!!sT%^0^IFP95Mku7(cn=aV689WK`ow3XXKM z{L_aHO~>wZoKz7^TMn9^dvW=3x5d4Y2>bGRS_=ib%4KqDH?u~-h**MH%?>7xOmN2d z1k=YSm^~h5j{|%;%C1YsG})WYQXDaY@85lVzlV8mU#Q%&5Mft-gZ(eL{z3|fQ`y3$ znsJt{hG&-#Y$TsObLMf?$Kvl_byAIoPkiDw@!ySXE@-T+fKz#>HPQ&yPOtE1MFxr546>g$P`?^)+5{dnJsTcs=C5Q*uZxr+jFbDk& z_)Z&%;`i_r72!8fP{E8qp#!QrP$#EhVhI{-nGekXs$gdkUR;G}O~{zMW%=C3FkCP~ zQn)3sd%*1hkwgA)5BAMBj)c)3Vv-8u43v-xg$SfNAkcv_HckEH5><^hW&rjC4GOU; zw!Bv4)nBcmCy@ZZ07DueCbHcOXaEc(z(Ah>Uw8R=T>q{MfT0)QY^4Klip6Ls*nIVp z*#JDTbie!4a-ihc2Yk;Zj%UZYb@pr#^ZDp57HKUOIUXF10QX1pnk_>rz(4%uk+;=7 z{d~&-|8IEtFFg9-@o!7&k7E^JTeoQ`CWl0T|EsdiGH+SrD)XL4gEY{RO3|9j(Nipv zGELGucOEPKAvhWVUcPR}kP7g@`0WEvDgX5Chbh|yZoKLp{OFNC9CA;#1U)&(mt{wK zA_mBJmn>2KW5o((cQ#9BE=Ngk>FXEO$_PAUK-j3f`oQxi=qi=io6nQ2s^ZBPUp(&o z|I5b*{v8Q#f1HBeE6(9Z{{0d06}a@$1;<<_iS9jpf2-kJ_QUVs=4%%oa-YwQ$~mSA1hSoZ?qM$Av0wah(DHZ7^i8jr79=_x9>2etCm(*1 z*I(X<)s>PT2I8>Ugbg)M6dGy?P(Py}@XM5e>Isrb$ui_)Nzune{*Jy!nm z&n*3QGw2Q&LazR|q05rq00KY=Y{lVMPd4-9FJ5HTijDMiN`AHWbaoVitZjpyf)0T^ zxVvEN2pNPx^gwUOf6L?vNuI#7AZ^2PQ=Yh(C_$zOg}lQPk2Lf9$6myHbt7ad{IOcRx(2A43X$l3 z{#Ygd#U2EEnKUlVjMGa@oNQCq2-OV+K0J2+?$2y|TJmRwzyVTXkVt^pN}!RZSPZu! zzz5HHKKSg4LmL!vJR5GEJx0WQKDK8v$0fj@TeeJjc+n!Es493KV~yIr&u;kpi@E35 z%{;dBQ2zDX6D%0hhyaS7hhNuGs;iHgAEW?(VbRgK4KF{xk+N%0rTB(SfIoZH#ezcf zF@0yK7NPYDunJh7N68z+{m~D-0$g@o{F-*$0$fO?*ks#83sjn66mWgMBYpL#@Y@HTQl6=}k#D@}9sKy02MX{dv!;?QCFucTq5T3pR7Sx2 zulksP`?=?dfy=@qL9!&neGZiYVx2LD@|L|skpWZO0T#ja3Xx@5_?pJ?Z1c+}#QnXW zKdRia@aWz4rG7z(dhxlBy^|l@|J%O*UB^Oqj=evcyvamGiofS^$k3_RgRW{&oq`!x zE)u_c>gaa^U47L>0$v2*`YSIW=yUkt z80i9jIh~N)(?k2dZi>Y+iH*CNSPMp-fa#MUS2;?~Q(;^PMis%Z03AdGs0XDE@F0|f zu^#nFoAWGy4jX1lW5sZTNp;y3F@cJ zL~~0-d>)EWp&=n9fao|BQ^lu5C^#PBnh^LZ{8^pEdYjl{2`upIxTQzEtJF9;7D*0qw0lw6}HRm}S)5ZaM7{ z7Z4wZLKxi_1`&j4CI3n#|5+O&9zlzHP{=}Fr#2Y^+n|us$nET8{M7M?REDzS$91K9 zWx!_ixn;`~zpkTHTH3(^JPdpMRnGh~LqiAWp_)TOrBLY?iI56uXm2%k}} zm1YKeCgvB2Q_W&FY>S64> z{^Gx2?sUMQXby15{Q$WAlZ(aNY=d;SSG?c{U#25ns+J3*3x1A8`~e>O<$h1eeNX*~ zA0I~i=T3_Qhu?)W5C#)}K!$`BNNd>-b~%d%6iX&;woBR+a-ux31Bx2t!Az^z+almK z01k*Q5Lr-G0XvXZLI}cHlu#NakjJJQU&Nu*)kQgxrmZ{AvWzXKAROdYb{j-G%ZLC> zR!wGByG$D;7~7x_>0XbLb)W>fZk5!!2&C(wY~ifx!V5=WbQOrvpihBN19)Y;Od2JV zXUv{%^rFqy-Cb;MPt(?(C!e(0T!KyqOb;vp?a3?-Fbe9cDOISU(WsNBz`2t#NBKxPY1+zpwq&|#thLD|yXeTINfq<7 zm2JYxfm`uX$t*#j(KaFE%BX*a0;N4D#oegI*CCmO?GY%{OSesH7ot9bHnIxz(NH}F zMl_&Rml1XvoIJDq-PAPL6!Kjtg*3%t9^1ADHUN$!zyrZ8m_s7Kx8HZ4vL_yAS0=;G zbef&%H2*mN%)ZYbfBw+X|BOkE)K>P8bXVMvkF*@$_L$?r3oBcPOn_nk8P2`ejhDuc z_?@EXGHuT26Hmi&2yn@jhiwmq0DpVcD#fxao@;GYs>e(uS%OPv44!|-$>BE>6o6$L zTNDwN>qC_2kzK<_gTVy&k~xi7SSLk*d$FZwD}H6*KnK~RN$(jejw7$;RclYU{onha z_bP?)VTv|%=b$SKod;d*N!Z&{+5J#+qKp#98euP_8-srCXbuGv{=DLqqkir^S6(Sb z?9LESRdS{@aMA-@Jq1W*q+9it*|Wvx=FL0mx_{R@|9;SWXH9EF11_BuKPCfU(SpHa zgG>%pPWe*+4eG0PLfH(ZL>e`d=lNujR7VM~%f@PV*}O^cyNwEec*YM)YhY6~>}`Z? z5!iy9o2L`#fxvi}ISLUgP`hXZzDx(%?Vaq{(Z$xT96QnuF#(E$be9*Q-calkVk;&!A znGQ|5JWGHIzhUUK_hj(p(%{cST@gl?;4~ZROwh`ZRiMQW&(}e74YW6+xDgOhpu(?> zg)vRUW;f8-P$2gABM>CWWjkq4cTp_la2#jgDS+GWyHB}w@nT`@+J)u12;d**pUMBe z^xA-pNeZw;cd0}Y_|1+T$K3&a=ZPnj8?L)f^hP+V&bJJB?~F-}I94lydUCdgrt7@4 zYu5>Ne!T(=`vv&N{Z_!wpWDbwD_a4$WbQ;W;c0=#*3+X;8PcR$&z^hVcnT`1d! zuD(BiRvgRqW0p+(ktjxefz8WKocr6WRw;`b8^v?2t;)3*T_|?7uHe!cah_j)Xc_=6 znKiLbfRji8UNCj4Pzr_P65#*3;R9mpww>H?{+Z&QhaXWEzVlMik!)ektTS1?Zhsp* ze?}wA*ULK4{ZX7reyn}+|D`Q0%A)C0g&rN6DS$0KTbZvM+WTHOXCh^MWRuChEzFK1 z-D^W3z`gKA^W+K*2fR0D#zZs?ig^pnR@s>Yc4ZC1ymQYMFaPD}1#cj%y1zx4b{@iZ znNwq0G|2n zuN4M~=j7Vbu+$7$uKj~QdCq~mBwLv1ju> za=Ul&QgR37M1ZccK|$3~6_pxY$JwW%=T!(PAbgN7Vw)T2vIN<&b<~Xy5UC9lnsqvq z^U$88oGG$Hs3g)Z`_e8kLmpyNFlFGtkrO6Rd*g>F6}k|qod|m?w%Ucz0+c)h*VZvT z6~)#uaw@8&5(+5fxB5^w6xkWxK)6N_8CyqnEPz&3P5kU?DCLRwB+2Y5vRSC~6kRd} zm+@LZKpd`y5eFKyPN#5b?#!p)Cy$F0b&8k*|JQ@dHJ=SW zf=lL11kKk^fOArSqt=iJa4&w`jPmX?5l*G!RTLB<5Ob$Bf(~ZMB%f;~=8xlqEOsnw z9hx-&$0)!q`j86nzu)t?^5uVckNEn}~ip<#PzzK2~jb zNtt@y8KUU981;n%@_)hHvqT_NIc97KaIgShIBPluw^R|}0+@-DCcpqwoij*kuL9B? zY}$TYpM_R3iCUoh>nS3qTgnzV#z@u<5%;lR=Sw?>g!8WZ9#w9*2yqyj3ssY~YPoXZ zW3m9Qp5XGiP;eX3FnD404lbE9kunyV32ECTHew7%BmMwJcQVu~?w{rQkIJTZ(Mr{K#>+6Z=IyuMT-_AKld}Gzo#e(SlZTEj~&ZI_6OiH;{ zGRTweN)=1XLr%N&j!ZZ{s&=HPVQ5IoP1_58f4-bje9+vTZr;{zr&XZWGMhPbKV>vXXl zmrl#0#s`)M-L5>MHse4j7^G&zI8a6d=i*r&W@ar_flZ`Zy71W$4+f|kZ9r5Cp+BsH zqY}-iq+A7cPZH50r#PrJVVoZ#HH9|BZ4-~1RF4A*j07f_nr}gsB1#c_Z zuRwT@T;!B8@aX}3y@G70a#MZO2et|c4_dp?_JQyNRVIw^L#zf>Q>Ya#Ag&YSB zNKTpnH@74dKoklV=oV&)lOn+VvE;S=`MGoPVsX!f7z%^n=@J* zWO#{~9~`$5@nZ;Zr~qeheY{};eD57USFU*P0&(FC2c%=Ui!96dcyz5MaILyq4s!0PNm60Rw8MO^~ro&dV z1v}ix+!+&DwPA-cbMj~*grNGgN&NZGN53YcSUG^FcO>6w7EpobHz&C1!Z8@5V%+hV z+!^!iW@&tQrd&8%bQ}t{P0ln~c<#C4xxf77xQqakR!Wu}rH=H+sWYM^yK^}H1fDCW zBua-l{8IqFy6MOuLIb1hK&S+`;8~FMQX5j-_I#Dr$|ta)MwNp>Q4JqA^;N9*Ux%Yf!9gXH+~n z7w>bxumQsbdQc6OV0w`3oUWv1}1HD*;YM`uxW5~#aA%pM;ozQL-OdUm6rMk!c zQd!eo`1CsJ!Z8vlkL{kqyDA}g%Yds?JSlyp?}FD3>Pz5HgWr*#naBlz3Xs?FQU+pA z01`2T3U1mV)1?z}R6;%#a(>F4f>yl?D_(~ciQ)5mm=T5gfHZu<$lyPT$|757^tw=P z2jkDO0Ym}Sk-HY6MY-M4(IIPq9gqQ<^jgr$D5`=_Q&CkHNBG&;CMX5FFhPU*$x9%C#wR$Xg zGYIh0zgntXf8B@0eGfjY+&X)V@PO_@fgamN)%9NP{;#J31GU8?{eM_I^V*^JHJ%q2 zwJ8`;@Dm5d*VZz#z8)2*%~i2%*Dl&=Wn@FGcztW7ZEV}u_x)?%eSvsr$)5(~|IW47 zimjVB6EzI%%8KdNi@SJ!o&5Z+KOPzdvQUh()oGzNSA}2GNED0g&F6XUwbzcA&!69Z zv-tQIzpKE3J9!%8hz8;``2EDgVXFLoN^X#@d=$&FNQX@_4RYG0;(6I`e6?;kB5&RX zJ0<&2OO-)!>=M+M0ed@2Aq8p(pKfD`IPnn~E;t*ej#gn-8H}R|2(oNrz%vlu{>nnKp1d3Mm64r_=4KtS;*8 z9R=0J5;Z}Epg)4@SLpMN`apA~hezp6Lw6^1z6=ezoZnArkh8$9mz()RWl(I0RzulA zlvJ=y6x#tiimI z?Hyx!fD;;t+&gh{@J0#nU`Sb(Jc?G+WMHjqfdx~i3L_rDQ-tto9=~ZmzMT)fcryy{ zv7*8aLs%!LN`ROCjMfzirFW~{&9i5VNwF9aU8m?c_%)5F-;Y6@ms=Cc{PE+(OS^U{)0&#Z z=55=Qs~4Ut9$NAz+<^l8h>8sx<%9(C{{N)?OjbFb<`NbE%DBgej?aJL(Tp?OJ z+UPEt7@9_PCBmYp>|*dWjblUe%gTbw7Ko+4UwT~STz2I8Cfkz>@qLv5R{J)0q9vA7 zJ6gpTti$j$3_VTt+dR}#2z(XS^S%O1(?JhFunuZ%!ZR$UbQBTA0*bG4=)4&MB?OK} zB&bnu=%DLZK+p#xfPx2_2bzFVM<;e}716p7in5du6IdPa=E-M*ckVv$58$dXbhApGF34dV*!2v2xp za54n=RN+($@Pbc$Q+eU1UlvPLhn{PCm6)?JaQGcd!krG2Xy=_Y-|)bj(jbbnKJK8AyEE* zduJaU*L5BC-+iC^2`m;^P^4C-2vGqY+O$Q7j$B!e%Q%V}S8Y;H)HH1!rEb#B^doIt z$8}RTZZl4%Nv5qMcQk3IjjOnhYdLi-*@|jOtVD&iEY`F|8<8N%ASEsd0t+mF{d)U8 zZ~u5$5(M$FyVwO5;``0)>;U`roqO+l`_8%NoO>?!|HO|6$MlF*htLxI2k%8k!``d8%lUU`kBS{=u$@cDc1mCkp*!+*Qy9_d>a zx27|s)H;^$W2h>Y@3UyzFg$!^spYcrht0?PI_iGtzfuX6f8fKV%QF;TdV!mVbj*T9 zCiN--b;O|nB|891Kt<>BS-3QnA9sZodzf)NXsuH9-QZ~+e-3(i|GuRwADJr-xg zG|)7SGiCS-K{!!Q2Vp)yb$SMG<^|GYI=)v&E8DoUvuFcZ#NYtT0fTy2RnSV}&ooet zQ6L)z-2*?&nD<=>JRHU1J4K6OSK(%FfT|zIRYUpn9xOTG9z=>34n%EwhS z21f~FA~Db;O2Q_7n~OH!aja@lY*=W9f}sx}^f;Pk@Lja_g0p}87e(Q~0j3j)D@ATZJdT!1;tP|4c~g*u7dyUfuG_Z-hc0P-#a^raAgM7zdE-Hyem6oUDw|Se*H5- z27))H=lR}i7x`OHJRxQq4dyJ11>2@%+t|JzR<*3xxmYgK*td_bt({od_INidDk@62 zHE?BmhS$%&K-`47St$hk}1r12E;)csXgKB`y#?R6o%p~ZZhFf*x&8J#x$TyB^Nzja+*`K}|x#IN-zymjLbsxets33}$cVJ+~a< z=3C#%En|0*+xu>YM#hPyhB24>-c_(k#I`|p>F=g#5R>)^WAD&S|j zSNvr?9{$pou9xv@uch9&G!?L-dd$@8IJFvudL1!1$k(?)0e|dw|FCaUA@uFwCmxrPoF+5?)lLlmESmfRvbTcNCv)7;CY-pcTT+ZEpL%8y%Bn( zzI@`e__=%kf>izW?T=4=_``DXrI#q#Hjl0m!~eY%1%{fu>m6hK@DDli&tEBs+i%TC zmKFcWbLTefZ_N&fAY*T;vf9%&&t~TJOS|VsZ-*^_uVHKgMk0>^{)#i z*IkX(wkKe=0ckhPmJbA+fBjVy9jt~;!>dql%%I+$!nZP*GY5%_JepdCpv2921zj4P zd#%R7QH3BefT*RBsF*0|0iY<@i(vT*nT!fT#Rv?NS{W@2nK8G#7lEe2r8izhRbjqt z6BwcVw3(vphssyi^5~gxNgZ(oR0A+QrjSfQN+=KmH&9Te%03YqO&1o*SVF^-VHx0b1%waIYp+5XDB3iv3g4QTA-FY# znaO~85aM|TZ>thalu(iiSz+KW)L=;ow^-EEgvkyHq(IjdhGJm43T0o#@l~WWh%J_R zyU}I{AmS>K0=}{6Ck4C<>3R;pdNi}`mt*c%GA8%{U0BBc}JYGl0kR}(bWB9tOTRk1o#2kUWI)Lje)w3 zRhDQmjhL1|NDbRnD9C6!??d6z^!jR${R19WT7;N z@6IrCYaEjdwtf&bz8_U2U?2gn22c;P{rv?UwJc$eA66|S2AYCyC}={U1`2*4!aa`s zu#|Hkp;-`m-iMeI+7o+kKgz-+A(1=?1N*^DppPbSCj%5iLFgKy8Ws}pe2u_Jpz9jKQNrDpq(IRXQmVl4 zVAcja7y$OD-C7_W5fKrwK0V0+=uqxjGvhVU6$OK<#{Ne8Y`o)8p83Egchk)P;?Ti^ zQZWo9(DXdCDz^)?Mm9!FGq9ybHBfPU!JG}3%Hej^jti;>` zF3mVkp;4ByI@ilazvPTtU0WAm<=B)q}2{*0i|7-(13o3q`*lou+zo_uy zNE|<#VPxGL_|bv7d`g?bW{GjK6EDs%2nPMzfb+kQg+G)ZLQ~*>o;WSudhjjsrPtQ<0Q9>5t#|@32$#Uw0e~Qp%5u+N{vh?a z?~_QHBnNLr#;-a1}HI_60Cqg+)J9I*V?oaFzmC ztiu@(-b*+e4}#`wRG`PR9De@?am(Mw_e{L>twCzJ~br~ zuBdQ9ELZIl=;Uv@4YI=s&mk>!gq92yum`wssS(b&<4RcXpyproG^`H($mMng5-pFAKQaI!A|iUtw&ehH*q-aS`)~Y;_%FZl%Tfr)42FAI{M&!^aryCo^KaJ- z2dq^7_y5%0@=K3DC;s|RzDJ^{{K9=dCjZ-G&-UBQUjQ;LAYYm#=GOT?4hRvxQUXi` zYJtF08YoJG<$i|^Uv7QgG>MxkdKp-BKy{!VZm)a30k#?{*IEM>mY0f#)$}|@m-lX( zo}R^X!^(P1`HBcX-h#n2#1bY5H7uTEJ77DwWq4x&E_v{-6bKE@ zEkMb?D&J~c)xOiyvjlD(Qwe3;%l!n<5tNh$(@Fz_(3psYB@8fiIFK+=6g8aY2ToY1 zrv!gK6IS&LB%E8887#k=@?UXbbc6oq6!?*pU}mntS^w(zCj<<~U~dXyriszq``dA- zR2@!NV2=oGp>lJ~2@^dlerSj^`yUwq5fKr+W~Xuh)?-uozyGg(MSkR8e?~m?FMml6 zro$yuP36BCUwZsG@z?HouXKGM2ZKi*dv>L~?J#;a8}BRc&dU?>rTPL0cy`6=$-g}W zwgH!y;5&`Ag&c~*+usr<-b)J>s-c_PvEdu@&``tA(i+TE;I;ay6I3eXCMGB@EVSK0 z6&M(VgSjy2Uknk}Fm}N@4_}*t3jufus0w(tcKtajl?oFR6D+JF|E+3hK%A??sTG?o z2;k=BLU?b)U~dxkCLn2s#R<<|fXAz$BV;2slmEd4upg8Xd~+sT9MF`%M}x6JxGe*> z4M9AB#aVdpVranJn+`)QuhqlE!{&{*vVKRUQd###TySkAX<`8T!NfY>gYZEVWlF2iNJ4?w%K%ZT2y z)wp7GJ$DK1&MqT*j|lUtI{pns*Ryq`lrjnfbdRlu0Cp;iH==v&^!1C3kBEqfh#jC6 z17I^H-wPw)&8if3TG>YIGPXLqjELCH2qDDkM8Jsd(XAYS=mJGVL_|bH>>|3E1Q;0s zy(b#uh=_=Yh_29S4#0YefV(9ppp!O6$~U4f*zJjcorE-YbAKbc%Wh8u>?EYotN!+) z4#4WQ-Tgo}+OpGY$0GwIVpr0Q9END^c*Jg{8#xTkb9CDfXf*`TO7*!`zO&s3y8poF z#W^=)v$2dGiakbt3MoIevjtnOX-|LrzBWX1&919`d(N%WZ|!-rv6j-?4T*trnSMTJ zE2V%tIkwgBu1BXG>^H@{noir-i2=}w(Y6z;3>$4n2&rv(YbyRvg>TzkJ#97pG$Y<_ zMc6NWU#s8!(zaIE4V3`bQ+oXr3fOL=q#J#2SE+Bd9I#t$=;U0zitBgN)3IG`?Bx3G z6n$*~Y&h%xRQR^jM! zg-;^ZKzypTYuZn-@9j*I+bA!g-I;!?^pg>=+hhN`mCcNR?J@*5%1dZ>rr#>vHUhSi z*tgj^T0KvvO01K%cT-_@a;{dr6`ji8?EC%raO&$E0O+qgfYt0&UcgQ#CGNEH-Rb^! zliiX7u;#gTC@)~AlM>gG--+yQ7yuicr&Bsrq@5_gtyqig8UfufK(=CV_2a{-?+pOh z+z8mo2me-Pzn!$ZUzFcY7y{4aJjd0 zOe+JqUVlZ4-{0z3MT)=2^xJa4jS%#1`{139yRXH1{gt$~U&2<$YNz`jaV@>vKDb+P z_inOYe_P!zp%(@KbT5f;r&$>*-iYmpU9TlGVuxvUrNDM_qba3c8a*4y+)jBBt+Ufg zdAr$)(bLTkK(Fb=?0+k=SF;`Y0P8JnjOZcjDfxa>{=K3fXa6hNj(mV-n5Cck9kD(1 z(XgtOB^v>30JFI&0%*Mnb>! zu@~(2RRG&TzZ(G1SsQy50@x0AY8JdvY=13x%{4L@}W;bj-+$p=o0O&{hA$$@M5wU`3 zMjvq_)2?S?y%0dZ|A_iU$+ol9Zzu8+D2bfUU4oZH>GlZ%*2&3lQZ1L_|bH zL`2+xL>_<$*!kJgcFW)C{zgPxVW(%}+bw^m`x|kUu3U)K?uOl#Byl72(FbzUG_v@z zMzv})JaQ}NUO&y=Tpj?aWNFl<@%$q3Se{rcNpXIXJ)=jk?JBM_g<<5dtRlJ&L6F0Y zWdRqfHib_PQ!f&b!*$arOaY+kV`yTE-}_wjFxaig6Z^t~F2^rL*DxYt7t#|CK&u-O ztUSIK?bwWF8=LaC%W&Clc^e{&ELMuBB2O{_Z(KOdzCGhu)+7XA8U+*;;yN^(0!tMb z8P4O_)6}gZd-omZ!s{m(9LQtYFpwT(ad8$!6ft6B7*z0FkeH}Sg+x3@-7+axrpOND zfx=FYKt!7~6+g!>UGsM*hQL?8@)eoO<+|CtmYAKL<eL!opUY*B149{hGf&e&X`B$hG`{npNeK zM+^WmnGB|BGB!3wKA-1%-}_!q<Dq8YMYWzMJCwz7&XP!sOPa%O&tH zu;-=^aOvVx#N%Tm)%y@!^mBaO6etv>nb{r2EQ-?%+oJ+HlyyfPj%*~xasACKd zW>{J}gIl}4JSriiDzbOa7;(eF^NJK_USu#m#$u&H!ptFXn4f(f zGk%!Bnjo7!g5#V8^)QL#7>i4jWYbVCUm!bt6svxQ`2`qE9|k;Na?Lh3*K$Wy-1-A? z{E}GD#lPARh>`*$-Ym4cxzuV_9@|R2hfbe+of;020q`bA%8hTjR0?zz3?ojpK7sGT z=*UqjpQ3f??!o)F*lGoJ#-z6TL}9K~yk| z9G-I)$ALgjpa{?nFyiAl_9TuC91;slBK7z2Zcsg%z!y7vxZI#g;UG*M(}@eGPOMsDObBq?kc zZh6ZG2mmQ(P!vkCcBzw`o2X)|!y4RH`eDfz_|(=k3UA($4c}bz3$%HZlPEkfze^WMPGrlIGVo zQ~m%$L*tklH0%Pg#1S03f)P7{LIG9JLIA1?j%R?#kxt~X8wDH(GJ{7EB9E@;(2a5Y z00sxgsZd=KQy`~M^rLIG=|6nz7vz8WjlXwY^33X+ z`M*B>UnRhQ`0Y<#^Z&0u_%R9aFaOy;?nwE4=3~DAT>qo{`@eSow#eTK4?OUIxbMFE zM5EEbG)?yJ-_P&={_o4*`mNvERffP?ZvR#k`&!5Bbmo7=jX^6j?oRRtn&F3bzuU@W zrYi=(P8ITb^V5m&|SCbUg=w1F}fN zu}LJxNyL-XtQw|a5Cla$XOhLmNv!%Lsnj?C3#C)&s*UH&0tJK^qh6l?Wt>zh&*hox zLjYg@?8oKEV1mi{YYU>>`|M)-rrR(G`DQWKgg`erE{H^lHBag^tKEUg*zfLZf~B}`ul4Rm%c4vBVLQiBanHNh;Mz zbghPMPa(;XOdckk1lI+-Q9{-7BvXe`go*7Gi6;)@`4tk0BY;bzQ6M)wc3pcKr3&Yt zpX7Hw`=77$;&1$myW~6P$N2T1KOXiIyJM!%jGg({pweF`l+Y* z^rt^9KJ=jviLZU_Yxey7JcePA$z*un``&lmU3F!h|M5%o!U*W}{H+=Rk@An|SGKCe zyCr|EHuPi_KvdYLTS!1`xQy@0kyjE2!|$|;>pCo!Z88ICVle~PnZhTJsTWbzy<`SW zs?~XfVp1xdWpwlyN&^N4j#9T4aa|b5j8d=75(J>@pc`p?Zwk*V&~PAOLbWo1szRln z#ndYx!_^0?nLYIbGIqc}J$_vN`x7U`y~mJW`1C2@6rZ^NI1l`lV|?z>(;(pA%O`o@ zFCFD`e|myne)l*p*U#{aAO4&2@^i1@FD)TED0H$?zBqA0NRZZ(uk-z+#oKZjUb^rG z3k&n41~U{c&5+bIij^5|cD%00-wHtxP%f8w;)y4&xd9$}=%LuQHl)iu_Sj?BDfpG^ z`6J~Y5z!f2_5eig|K75~6R_quOBsg!g`i`zE0ZjuD&V_Qcs{sp0RebkiBjn_iqP@> z0z;W`78lQ>syS-4GX(w=v3MTOUBY&XC`yjuk-Kr7DO?{2U?h7C+W{%Y2pD4^;R0DC z&~TjV+7gozT~Wx^>-@V9-6#L_g{zNzDOpz61R!OBrE-B(0)n7OrE(Ef z0Zo7}q0uOlOpT*3g=y$C8dDI|Ftj|netmn&o`>&(^b6grrJuaP5uF2mD zQc7xX;_|MoDE3JCM?|#FmJEQkX8)1kyz|7!DTQHD0hT~K~+`LDkJ>VeHWZ@KrXZW4FQ z@Vr5QscDG8!M4X^E%|@x_+bFP^33xXL4umSfF0DSx=_ObBiS|iTfuc*3K!Z-Jlu}i zf0M0x0bpYVA1VKci1z5%0Ek@w+s{g6zg5NGB=9T5Vob!HhJI)Y^t zG0eRH7~1tN@=yHYFUnG*LB(+>I}WyYbv3|$`sy>+9=zfX^lLT>FlXCLS1Met)%f~% zzuWd0ttEdbfcuUg0pL%bISne*t2RntqpAjtg<99-cgoiu`+87PTAeGLu|CVFK<73!%0U<&cyJ4j9 z+ycI5<9S6;#z-Vb(Ty=2r@+#}Y08xe2GUt%0NLTYsg%#KH-8VFQ)H=pmUukRZ1F6b zYOiU*{PrLIp?D*grkO=kO%jO=4JVIb zW=SQ-a9xK=`2vo(Vw~COZ=k54sX40E0wY7?6c>s} zSy;18zx&7|qWIRgGBq^BxuGHc;Lpyk+y1wW<-_rzLB(}h3<4gVn%a``T`k}9N*LBO z)k+C~C!d?7RIg#x3@Y)1Ll8i$zpFbR!_=L&Pp0T5ij7P7syk*nnY+C9io z1qK)4eTQ?LoG4ORDlE$nUv=gnm-OdHr>g<1`Z2ygx2u4IitdAnsq16+JWqR4jh_w}bH@pFwHby#?Cy~q& z1UXCtsuqk4kD(g|j$6er$C#Zx6UP1hBBn+d_c!x+ei0#ZSXPlr`3#xiyNSid5QMt~ zN?D{~6>yy?lBsbP7bi)k#<47r%HfvU7!YdEff)Sl_rR!DByB)q`SW+>uMP=oE88vI zpDX3>Pltxb_X}6$uaeV|eAjjFzW3gH+q#C2KKiJC_m8 zk*48+Q1eI$u2%r^#1prmst}8hF+ckpPGgE}?gKRJ0-g`)^cX<^R(+D8p)p*igzZ2) z0W$~8__jtRpf#`@a6M2IFjW{zz-S7F1|gG#q;Yk)xT=KN;JqzY%m4Xf;s0MKT$QhG zQU23UKP`OU=db_V&q*oeh8OYCM<116_`(2cXUK zx4O!4{lJgvHg{l^kWpOFjs-91GXQ|%9Z6;bDhA7Zm*t+uYPZfwdCKo zoR|3YWGLTD>|HIVYx1`Xar~0#^)kR-DF2NMx1SYp{kB9IEj697-SkGQjbEF1Fv8*LDJxMG!!1Tq(F$@?Uxtp1p z=g17iS!lp$I*Y2hxUPxo+awcNJU?9W=Qsu8$)h-p3ychp0aKgy>5rd0EdcKQvG>R) zp8ck{=f~b7zwzuh#ruxEL!LbSqPXive?*F@|0kLoUaXM|u-HgMp@&GP)9AX6qA1}?3_qY&tMS@vuW{+pC0=;p z1x}tk`KJ7Rc3Ruhq3AtShb7fMvij%@)>g3F&xLmv8T|raCU6l zMRa2fRZAhIja6SHl^Uf|nP{tXPdxig0q~9G_mihz6ac5b_5Z|j=bJ{rdI^DTEC0>p zFQ2e!c&s(!Z%h7(6DNe{dGf-A3miCbfMha>5CY%#X*3#Kx^#&P7cTH@o6G%nJMAR( ztz`s6L_}OqPc{RJ*c#m^^0RW4z((h*)@?KuhK7!^uy}z)tjJO=&&Xh&(&99U7$j4N zSzMf;UMmuhk0C^np`kH6&qC93xXu&-M=2o4jB|nQw$A2K%R2NVrb|HhB3(H zndcbJ9;IHrfa4agXfs1hlO4H}#nSUgcPiXdK!f?xG`3SDnH9GijzcaxPQwYe_l+4YR_!d+3M9-tLQ!%3BI)!v zjrt^>1Xa!Axpjm9GaeQTDlMEPX28&%yO=AU!m8&O8X8AaC%JHOlD&KKz}m%twn)<* z-<2GIR#;(l(1P5q%kMQS*YU4b^jE3}uK2u{$%GLR5#1p&0B&#+F{su+C^a0{W_UQy z(o%tj4siqQMxJD95Fw6GDW3&w9J`F6<#60Eu`iuIM#CyoTRcl5o+I!J%+D8y$8u;Y zT%LIaLxp&(h*dA*x^V0MW4!W%u6qEQte1V?^KASLasjqQ{m`09ddM}<`B9+cksZ4_`k{!95TIFRH7A8q1Kw%6|g7l|B8AJkh zqev`yn7EupH%!Xq0)weMFis$A)N2KV0CP^m2j2&jSIE$(GynEX|0~gnx`%UEmSkL9Z zRmDF$J4?M@??w|_#`C;usL2-VH-0&EQcp4d)NNJ#oDQeY8GMOV33ePh%ki!p5=I3Y0WwT5d zi#y%@hz?k72yA7>KQS@E!ootgn${MTN@d68D~f{SIF!p}>h*fh-SWQg6OYFk9Ua9m fw%6#1=s*5HEd>_H=mdeR00000NkvXXu0mjfCl6~1 diff --git a/gamePlayer/src/utils.ts b/gamePlayer/src/utils.ts deleted file mode 100644 index 3ceee219..00000000 --- a/gamePlayer/src/utils.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { AsyncGunzipOptions, unzlib } from "fflate" - -type AnyFunction = (...args: any[]) => any - -export class TimeoutTimer { - id: number - constructor(callback: AnyFunction, time: number) { - this.id = setTimeout(callback, time * 1000) - } - cancel(): void { - clearTimeout(this.id) - } -} - -export class IntervalTimer { - id: number - constructor(callback: AnyFunction, time: number) { - this.id = setInterval(callback, time * 1000) - } - cancel(): void { - clearInterval(this.id) - } -} - -export class TimeoutIntervalTimer { - id: number - constructor(public callback: AnyFunction, public time: number) { - this.nextCall = this.nextCall.bind(this) - this.id = setTimeout(this.nextCall, time * 1000) - } - nextCall(): void { - this.id = setTimeout(this.nextCall, this.time * 1000) - this.callback() - } - cancel(): void { - clearTimeout(this.id) - } -} - -export class AnimationTimer { - id: number - constructor(public callback: AnyFunction) { - this.nextCall = this.nextCall.bind(this) - this.id = requestAnimationFrame(this.nextCall) - } - nextCall(): void { - this.id = requestAnimationFrame(this.nextCall) - this.callback() - } - cancel(): void { - cancelAnimationFrame(this.id) - } -} - -function isModalPresent(): boolean { - return !!document.querySelector("dialog[open]") -} - -export class KeyListener { - removed = false - listenInModals = false - onListener(ev: KeyboardEvent): void { - if (isModalPresent() && !this.listenInModals) return - this.userOn(ev) - } - offListener(ev: KeyboardEvent): void { - if (isModalPresent() && !this.listenInModals) return - // The off listener is only set up if `userOff` is present, so we don't - // need a check for undefined here - this.userOff!(ev) - } - constructor( - public userOn: (ev: KeyboardEvent) => void, - public userOff?: (ev: KeyboardEvent) => void - ) { - this.onListener = this.onListener.bind(this) - document.addEventListener("keydown", this.onListener) - if (userOff) { - this.offListener = this.offListener.bind(this) - document.addEventListener("keyup", this.offListener) - } - } - remove(): void { - if (this.removed) - throw new Error("This key listener has already been removed.") - this.removed = true - document.removeEventListener("keydown", this.onListener) - if (this.userOff) { - document.removeEventListener("keyup", this.offListener) - } - } -} - -export enum AutoRepeatKeyState { - RELEASED, - HELD, - REPEATED, -} - -const KEY_REPEAT_DELAY = 0.25 - -// This is really unfortunate, but the internals are different enough that extending -// doesn't make sense - -export class AutoRepeatKeyListener { - removed = false - keyTimers: Partial> = {} - onListener(ev: KeyboardEvent): void { - if (isModalPresent()) return - if (this.keyTimers[ev.code] !== undefined) return - this.userListener(ev.code, AutoRepeatKeyState.HELD) - this.keyTimers[ev.code] = new TimeoutTimer(() => { - this.keyTimers[ev.code] = "repeating" - this.userListener(ev.code, AutoRepeatKeyState.REPEATED) - }, KEY_REPEAT_DELAY) - } - offListener(ev: KeyboardEvent): void { - if (isModalPresent()) return - const state = this.keyTimers[ev.code] - if (typeof state === "object") { - state.cancel() - } - delete this.keyTimers[ev.code] - this.userListener(ev.code, AutoRepeatKeyState.RELEASED) - } - constructor( - public userListener: (key: string, state: AutoRepeatKeyState) => void - ) { - this.onListener = this.onListener.bind(this) - this.offListener = this.offListener.bind(this) - document.addEventListener("keydown", this.onListener) - document.addEventListener("keyup", this.offListener) - } - remove(): void { - if (this.removed) - throw new Error("This key listener has already been removed.") - this.removed = true - document.removeEventListener("keydown", this.onListener) - document.removeEventListener("keyup", this.offListener) - } -} - -/** - * A hack to remove all event listeners for an HTMLElement's children. Also - * stops the current animation and all references to the children. - */ -export function resetListeners(el: HTMLElement): void { - // eslint-disable-next-line no-self-assign - el.innerHTML = el.innerHTML -} - -export function instanciateTemplate( - template: HTMLTemplateElement -): T { - const fragment = template.content.cloneNode(true) as DocumentFragment - return fragment.firstElementChild! as T -} - -export function makeTd( - contents: string | HTMLElement, - className?: string -): HTMLTableCellElement { - const td = document.createElement("td") - if (typeof contents === "string") { - td.textContent = contents - } else { - td.appendChild(contents) - } - if (className !== undefined) { - td.className = className - } - return td -} - -export async function makeImagefromBlob( - imageBlob: Blob -): Promise { - const url = URL.createObjectURL(imageBlob) - return fetchImage(url).finally(() => URL.revokeObjectURL(url)) -} - -export function fetchImage(link: string): Promise { - return new Promise((res, rej) => { - const img = new Image() - img.addEventListener("load", () => res(img)) - img.addEventListener("error", err => rej(err.error)) - img.src = link - }) -} - -export function reencodeImage(image: HTMLImageElement): HTMLCanvasElement { - const canvas = document.createElement("canvas") - canvas.width = image.naturalWidth - canvas.height = image.naturalHeight - const ctx = canvas.getContext("2d")! - ctx.drawImage(image, 0, 0) - return canvas -} - -export function isDesktop(): boolean { - return import.meta.env.VITE_BUILD_TYPE === "desktop" -} - -export type Comparator = (a: T, b: T) => number - -export function mergeComparators( - one: Comparator, - two: Comparator -): Comparator { - return (a, b) => { - const firstCompare = one(a, b) - if (firstCompare !== 0) return firstCompare - return two(a, b) - } -} - -export function setAttributeExistence( - node: HTMLElement, - attrName: string, - exists: boolean -): void { - if (exists) { - node.setAttribute(attrName, "") - } else { - node.removeAttribute(attrName) - } -} - -export function sleep(time: number): Promise { - return new Promise(res => { - setTimeout(() => { - res() - }, time * 1000) - }) -} - -export function decodeBase64(encoded: string) { - return Uint8Array.from( - atob(encoded.replace(/-/g, "+").replace(/_/g, "/")), - char => char.charCodeAt(0) - ) -} - -export function unzlibAsync( - file: Uint8Array, - opts?: AsyncGunzipOptions -): Promise { - return new Promise((res, rej) => { - unzlib(file, opts ?? {}, (err, data) => { - if (err) { - rej(err) - return - } - res(data) - }) - }) -} diff --git a/gamePlayer/tailwind.config.js b/gamePlayer/tailwind.config.js new file mode 100644 index 00000000..7f98cae2 --- /dev/null +++ b/gamePlayer/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{ts,tsx}"], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/gamePlayer/tsconfig.json b/gamePlayer/tsconfig.json index e9813ecf..bc856ed2 100644 --- a/gamePlayer/tsconfig.json +++ b/gamePlayer/tsconfig.json @@ -1,20 +1,30 @@ { "compilerOptions": { - "target": "ESNext", + "target": "ES2020", "useDefineForClassFields": true, "module": "ESNext", - "lib": ["ESNext", "DOM"], - "types": ["vite/client"], - "moduleResolution": "Node", - "strict": true, - "strictNullChecks": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, "resolveJsonModule": true, "isolatedModules": true, - "esModuleInterop": true, "noEmit": true, + "jsx": "react-jsx", + "jsxImportSource": "preact", + + /* Linting */ + "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noImplicitReturns": true + "noFallthroughCasesInSwitch": true, + "paths": { + "react": ["./node_modules/preact/compat/"], + "react-dom": ["./node_modules/preact/compat/"], + "@/*": ["./src/*"] + } }, "include": ["src"] } diff --git a/gamePlayer/vite.config.ts b/gamePlayer/vite.config.ts index 52b3e9a1..875552aa 100644 --- a/gamePlayer/vite.config.ts +++ b/gamePlayer/vite.config.ts @@ -1,6 +1,7 @@ -import { defineConfig } from "vite" -import { join } from "path" import { execSync } from "child_process" +import { join } from "path" +import { PluginOption, defineConfig } from "vite" +import preact from "@preact/preset-vite" process.env["VITE_LAST_COMMIT_INFO"] = execSync( `git log -1 --format="%s (%h) at %cI"` @@ -14,14 +15,33 @@ process.env["VITE_VERSION"] = execSync('git log -1 --format="%h"').toString( process.env["VITE_BUILD_TIME"] = new Date().toISOString() +const SSG_PLACEHOLDER_STRING = "" + +function ssg(): PluginOption { + return { + name: "notcc-ssg", + async transformIndexHtml(html) { + // The useless `.slice` is here to stop Typescript from resolving the path + // at build time, which will create a silly error when it's not present + const mainModule = await import("./dist/ssg/main-ssg.js".slice()) + const prerenderedHtml = mainModule.renderSsgString() + return html.replace(SSG_PLACEHOLDER_STRING, prerenderedHtml) + }, + } +} + +const prodBuild = !process.env.SSG && process.env.NODE_ENV === "production" + export default defineConfig({ - build: { - sourcemap: true, - }, + plugins: [preact(), prodBuild && ssg()], base: "./", assetsInclude: ["**/*.c2m"], resolve: { - alias: { path: join(process.cwd(), "node_modules/path-browserify") }, + alias: { + path: join(process.cwd(), "node_modules/path-browserify"), + "@": "./src", + }, }, esbuild: { sourcemap: true }, + build: { sourcemap: true, emptyOutDir: !prodBuild }, }) diff --git a/package.json b/package.json index 6d300858..5d37b67b 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,14 @@ "@typescript-eslint/parser": "^4.33.0", "eslint": "^7.32.0", "eslint-config-prettier": "^8.10.0", + "prettier-plugin-tailwindcss": "^0.5.7", "typescript": "^5.2.2", "zx": "^7.2.3" }, "scripts": { - "build-web": "pnpm i && pnpm --filter @notcc/logic run build && pnpm --filter @notcc/player build", - "build-desktop": "pnpm i && pnpm --filter @notcc/logic run build && pnpm --filter @notcc/player build-desktop && pnpm --filter @notcc/desktop-player build", - "build-cli": "pnpm i && pnpm --filter @notcc/logic run build && pnpm --filter @notcc/cli build && pnpm i", + "build:web": "pnpm i && pnpm --filter @notcc/logic run build && pnpm --filter @notcc/player build", + "build:desktop": "pnpm i && pnpm --filter @notcc/logic run build && pnpm --filter @notcc/player build:desktop && pnpm --filter @notcc/desktop-player build", + "build:cli": "pnpm i && pnpm --filter @notcc/logic run build && pnpm --filter @notcc/cli build && pnpm i", "test": "zx ./testing.mjs" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95631ca4..bd5a09de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: eslint-config-prettier: specifier: ^8.10.0 version: 8.10.0(eslint@7.32.0) + prettier-plugin-tailwindcss: + specifier: ^0.5.7 + version: 0.5.7(prettier@3.1.0) typescript: specifier: ^5.2.2 version: 5.2.2 @@ -80,10 +83,6 @@ importers: version: 7.2.3 gamePlayer: - dependencies: - clone: - specifier: ^2.1.2 - version: 2.1.2 devDependencies: '@neutralinojs/lib': specifier: ^3.12.0 @@ -91,21 +90,27 @@ importers: '@notcc/logic': specifier: workspace:^ version: link:../logic + '@preact/preset-vite': + specifier: ^2.6.0 + version: 2.6.0(@babel/core@7.23.3)(preact@10.19.2)(vite@4.5.0) '@types/clone': - specifier: ^2.1.3 - version: 2.1.3 + specifier: ^2.1.4 + version: 2.1.4 '@types/is-hotkey': - specifier: ^0.1.8 - version: 0.1.8 + specifier: ^0.1.9 + version: 0.1.9 + '@types/node': + specifier: ^15.14.9 + version: 15.14.9 '@types/path-browserify': - specifier: ^1.0.1 - version: 1.0.1 - base64-js: - specifier: ^1.5.1 - version: 1.5.1 - dialog-polyfill: - specifier: ^0.5.6 - version: 0.5.6 + specifier: ^1.0.2 + version: 1.0.2 + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.31) + clone: + specifier: ^2.1.2 + version: 2.1.2 fast-printf: specifier: ^1.6.9 version: 1.6.9 @@ -115,21 +120,42 @@ importers: is-hotkey: specifier: ^0.2.0 version: 0.2.0 - less: - specifier: ^4.2.0 - version: 4.2.0 + jotai: + specifier: ^2.5.1 + version: 2.5.1(@preact/compat@17.1.2) lz-string: specifier: ^1.5.0 version: 1.5.0 path-browserify: specifier: ^1.0.1 version: 1.0.1 + postcss: + specifier: ^8.4.31 + version: 8.4.31 + preact: + specifier: ^10.19.2 + version: 10.19.2 + preact-render-to-string: + specifier: ^6.3.1 + version: 6.3.1(preact@10.19.2) + react: + specifier: npm:@preact/compat + version: /@preact/compat@17.1.2(preact@10.19.2) + react-dom: + specifier: npm:@preact/compat + version: /@preact/compat@17.1.2(preact@10.19.2) + tailwind-merge: + specifier: ^2.0.0 + version: 2.0.0 + tailwindcss: + specifier: ^3.3.5 + version: 3.3.5 typescript: - specifier: ^4.9.5 - version: 4.9.5 + specifier: ^5.2.2 + version: 5.2.2 vite: specifier: ^4.5.0 - version: 4.5.0(less@4.2.0) + version: 4.5.0(@types/node@15.14.9) logic: dependencies: @@ -163,12 +189,149 @@ packages: engines: {node: '>=0.10.0'} dev: true + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: '@babel/highlight': 7.22.20 dev: true + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.23.3: + resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.3: + resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.3 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.3: + resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.3 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.3 + dev: true + /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} @@ -179,6 +342,22 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight@7.22.20: resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} @@ -196,6 +375,82 @@ packages: '@babel/types': 7.23.0 dev: true + /@babel/parser@7.23.3: + resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.3 + dev: true + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.3): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.3) + dev: true + + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.3): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) + '@babel/types': 7.23.3 + dev: true + + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: true + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + dev: true + + /@babel/traverse@7.23.3: + resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} @@ -205,6 +460,15 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types@7.23.3: + resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -435,6 +699,36 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jsdoc/salty@0.2.5: resolution: {integrity: sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==} engines: {node: '>=v12.0.0'} @@ -487,6 +781,68 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@preact/compat@17.1.2(preact@10.19.2): + resolution: {integrity: sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==} + peerDependencies: + preact: '*' + dependencies: + preact: 10.19.2 + dev: true + + /@preact/preset-vite@2.6.0(@babel/core@7.23.3)(preact@10.19.2)(vite@4.5.0): + resolution: {integrity: sha512-5nztNzXbCpqyVum/K94nB2YQ5PTnvWdz4u7/X0jc8+kLyskSSpkNUxLQJeI90zfGSFIX1Ibj2G2JIS/mySHWYQ==} + peerDependencies: + '@babel/core': 7.x + vite: 2.x || 3.x || 4.x + dependencies: + '@babel/core': 7.23.3 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.3) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.3) + '@prefresh/vite': 2.4.4(preact@10.19.2)(vite@4.5.0) + '@rollup/pluginutils': 4.2.1 + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.23.3) + debug: 4.3.4 + kolorist: 1.8.0 + resolve: 1.22.8 + vite: 4.5.0(@types/node@15.14.9) + transitivePeerDependencies: + - preact + - supports-color + dev: true + + /@prefresh/babel-plugin@0.5.1: + resolution: {integrity: sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==} + dev: true + + /@prefresh/core@1.5.2(preact@10.19.2): + resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} + peerDependencies: + preact: ^10.0.0 + dependencies: + preact: 10.19.2 + dev: true + + /@prefresh/utils@1.2.0: + resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} + dev: true + + /@prefresh/vite@2.4.4(preact@10.19.2)(vite@4.5.0): + resolution: {integrity: sha512-7jcz3j5pXufOWTjl31n0Lc3BcU8oGoacoaWx/Ur1QJ+fd4Xu0G7g/ER1xV02x7DCiVoFi7xtSgaophOXoJvpmA==} + peerDependencies: + preact: ^10.4.0 + vite: '>=2.0.0' + dependencies: + '@babel/core': 7.23.3 + '@prefresh/babel-plugin': 0.5.1 + '@prefresh/core': 1.5.2(preact@10.19.2) + '@prefresh/utils': 1.2.0 + '@rollup/pluginutils': 4.2.1 + preact: 10.19.2 + vite: 4.5.0(@types/node@15.14.9) + transitivePeerDependencies: + - supports-color + dev: true + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -520,22 +876,34 @@ packages: /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + /@types/clone@2.1.3: resolution: {integrity: sha512-DxFaNYaIUXW1OSRCVCC1UHoLcvk6bVJ0v9VvUaZ6kR5zK8/QazXlOThgdvnK0Xpa4sBq+b/Yoq/mnNn383hVRw==} dev: true + /@types/clone@2.1.4: + resolution: {integrity: sha512-NKRWaEGaVGVLnGLB2GazvDaZnyweW9FJLLFL5LhywGJB3aqGMT9R/EUoJoSRP4nzofYnZysuDmrEJtJdAqUOtQ==} + dev: true + /@types/fs-extra@11.0.3: resolution: {integrity: sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ==} dependencies: '@types/jsonfile': 6.1.3 - '@types/node': 18.18.6 + '@types/node': 15.14.9 /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} requiresBuild: true dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.8.7 + '@types/node': 15.14.9 dev: false optional: true @@ -543,8 +911,8 @@ packages: resolution: {integrity: sha512-cCXfrhgTiChyYIBs7ZZdsi8a9JLs4vVdCsUJt8nczxpNcHcUEMO8Tu5vsMwbepDobKC1mOf4w32jgOz1NEDoaA==} dev: true - /@types/is-hotkey@0.1.8: - resolution: {integrity: sha512-4zW6OgrfVWR14IqHt32L5zpsE5IJgAu9uimQmAOFPdKPdv+M5RgXeoB2UCJZSKvVNGzUdLgbKdtCSZ66N2HdTA==} + /@types/is-hotkey@0.1.9: + resolution: {integrity: sha512-ZUK9mvsjXXZo4YtGcEVBVhyN80mbuqId0evT9ni+anA3C291IPIzxU+1JFJ9/vvU0qZhydeuJIpUCn6d0rnsCw==} dev: true /@types/json-schema@7.0.14: @@ -554,7 +922,7 @@ packages: /@types/jsonfile@6.1.3: resolution: {integrity: sha512-/yqTk2SZ1wIezK0hiRZD7RuSf4B3whFxFamB1kGStv+8zlWScTMcHanzfc0XKWs5vA1TkHeckBlOyM8jxU8nHA==} dependencies: - '@types/node': 18.18.6 + '@types/node': 15.14.9 /@types/linkify-it@3.0.4: resolution: {integrity: sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==} @@ -586,16 +954,8 @@ packages: /@types/node@18.18.6: resolution: {integrity: sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==} - /@types/node@20.8.7: - resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==} - requiresBuild: true - dependencies: - undici-types: 5.25.3 - dev: false - optional: true - - /@types/path-browserify@1.0.1: - resolution: {integrity: sha512-rUSqIy7fAfK6sRasdFCukWO4S77pXcTxViURlLdo1VKuekTDS8ASMdX1LA0TFlbzT3fZgFlgQTCrqmJBuTHpxA==} + /@types/path-browserify@1.0.2: + resolution: {integrity: sha512-ZkC5IUqqIFPXx3ASTTybTzmQdwHwe2C0u3eL75ldQ6T9E9IWFJodn6hIfbZGab73DfyiHN4Xw15gNxUq2FbvBA==} dev: true /@types/progress@2.0.6: @@ -801,13 +1161,16 @@ packages: dependencies: color-convert: 2.0.1 + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: false /archiver-utils@2.1.0: resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} @@ -838,6 +1201,10 @@ packages: zip-stream: 3.0.1 dev: false + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -881,16 +1248,40 @@ packages: engines: {node: '>= 4.0.0'} dev: false + /autoprefixer@10.4.16(postcss@8.4.31): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.1 + caniuse-lite: 1.0.30001562 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: true + + /babel-plugin-transform-hook-names@1.0.2(@babel/core@7.23.3): + resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} + peerDependencies: + '@babel/core': ^7.12.10 + dependencies: + '@babel/core': 7.23.3 + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - dev: false /bl@1.2.3: resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} @@ -932,6 +1323,17 @@ packages: dependencies: fill-range: 7.0.1 + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001562 + electron-to-chromium: 1.4.582 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true + /buffer-alloc-unsafe@1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} dev: false @@ -971,6 +1373,15 @@ packages: engines: {node: '>=6'} dev: true + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /caniuse-lite@1.0.30001562: + resolution: {integrity: sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==} + dev: true + /catharsis@0.9.0: resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} engines: {node: '>= 10'} @@ -1011,7 +1422,6 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: false /chromium-pickle-js@0.2.0: resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} @@ -1029,7 +1439,6 @@ packages: /clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} - dev: false /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1054,6 +1463,11 @@ packages: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + /commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} @@ -1089,10 +1503,8 @@ packages: xdg-basedir: 4.0.0 dev: false - /copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - dependencies: - is-what: 3.14.1 + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true /core-util-is@1.0.3: @@ -1127,6 +1539,12 @@ packages: engines: {node: '>=8'} dev: false + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + /d@1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: @@ -1149,19 +1567,6 @@ packages: ms: 2.0.0 dev: false - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - requiresBuild: true - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - optional: true - /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1231,8 +1636,8 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /dialog-polyfill@0.5.6: - resolution: {integrity: sha512-ZbVDJI9uvxPAKze6z146rmfUZjBqNEwcnFTVamQzXH+svluiV7swmVIGr7miwADgfgt1G2JQIytypM9fbyhX4w==} + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true /dir-glob@3.0.1: @@ -1241,6 +1646,10 @@ packages: dependencies: path-type: 4.0.0 + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -1268,6 +1677,10 @@ packages: w-json: 1.3.10 dev: false + /electron-to-chromium@1.4.582: + resolution: {integrity: sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1289,15 +1702,6 @@ packages: resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} dev: true - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - requiresBuild: true - dependencies: - prr: 1.0.1 - dev: true - optional: true - /es5-ext@0.10.62: resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} engines: {node: '>=0.10'} @@ -1356,7 +1760,6 @@ packages: /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -1532,6 +1935,10 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -1671,6 +2078,10 @@ packages: dependencies: fetch-blob: 3.2.0 + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + /from@0.1.7: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} @@ -1706,6 +2117,10 @@ packages: requiresBuild: true optional: true + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + /functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true @@ -1714,6 +2129,11 @@ packages: resolution: {integrity: sha512-rIYQBmx85Jfhd3pkSw06YPgvSvfTi022ZXTeFDkcCZGCs5nt3sjqFBGtcMFe1TR2S00RDz63be0ab5mhCiOLBw==} hasBin: true + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1733,6 +2153,24 @@ packages: dependencies: is-glob: 4.0.3 + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -1754,6 +2192,11 @@ packages: once: 1.4.0 dev: true + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + /globals@13.23.0: resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} @@ -1796,14 +2239,12 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - requiresBuild: true + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: - safer-buffer: 2.1.2 + function-bind: 1.1.2 dev: true - optional: true /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -1818,14 +2259,6 @@ packages: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} - /image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -1857,7 +2290,12 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - dev: false + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -1911,10 +2349,6 @@ packages: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: false - /is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: true - /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false @@ -1931,6 +2365,26 @@ packages: resolution: {integrity: sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==} dev: false + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /jotai@2.5.1(@preact/compat@17.1.2): + resolution: {integrity: sha512-vanPCCSuHczUXNbVh/iUunuMfrWRL4FdBtAbTRmrfqezJcKb8ybBTg8iivyYuUHapjcDETyJe1E4inlo26bVHA==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=17.0.0' + react: '>=17.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + dependencies: + react: /@preact/compat@17.1.2(preact@10.19.2) + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -1971,6 +2425,12 @@ packages: underscore: 1.13.6 dev: true + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true @@ -1987,6 +2447,12 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -2010,6 +2476,10 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + /lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -2017,26 +2487,6 @@ packages: readable-stream: 2.3.8 dev: false - /less@4.2.0: - resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} - engines: {node: '>=6'} - hasBin: true - dependencies: - copy-anything: 2.0.6 - parse-node-version: 1.0.1 - tslib: 2.6.2 - optionalDependencies: - errno: 0.1.8 - graceful-fs: 4.2.11 - image-size: 0.5.5 - make-dir: 2.1.0 - mime: 1.6.0 - needle: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} @@ -2053,6 +2503,15 @@ packages: type-check: 0.4.0 dev: true + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + /linkify-it@3.0.3: resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} dependencies: @@ -2094,6 +2553,12 @@ packages: /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2113,16 +2578,6 @@ packages: pify: 3.0.0 dev: false - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: true - optional: true - /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -2175,14 +2630,6 @@ packages: braces: 3.0.2 picomatch: 2.3.1 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - requiresBuild: true - dev: true - optional: true - /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -2212,14 +2659,16 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - requiresBuild: true + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 dev: true - optional: true - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true @@ -2228,20 +2677,6 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /needle@3.2.0: - resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} - engines: {node: '>= 4.4.x'} - hasBin: true - requiresBuild: true - dependencies: - debug: 3.2.7 - iconv-lite: 0.6.3 - sax: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: true - optional: true - /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} dev: false @@ -2263,15 +2698,27 @@ packages: hasBin: true dev: false + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - dev: false + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - dev: false + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2309,11 +2756,6 @@ packages: callsites: 3.1.0 dev: true - /parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - dev: true - /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: true @@ -2327,6 +2769,10 @@ packages: engines: {node: '>=8'} dev: true + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -2350,20 +2796,12 @@ packages: /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - dev: false /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} dev: false - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - requiresBuild: true - dev: true - optional: true - /pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} @@ -2376,15 +2814,94 @@ packages: engines: {node: '>=0.10.0'} dev: false + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /postcss-import@15.1.0(postcss@8.4.31): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.31): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.31 + dev: true + + /postcss-load-config@4.0.1(postcss@8.4.31): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.31 + yaml: 2.3.3 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.31): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.6 + nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 dev: true + /preact-render-to-string@6.3.1(preact@10.19.2): + resolution: {integrity: sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==} + peerDependencies: + preact: '>=10' + dependencies: + preact: 10.19.2 + pretty-format: 3.8.0 + dev: true + + /preact@10.19.2: + resolution: {integrity: sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg==} + dev: true + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -2395,6 +2912,71 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /prettier-plugin-tailwindcss@0.5.7(prettier@3.1.0): + resolution: {integrity: sha512-4v6uESAgwCni6YF6DwJlRaDjg9Z+al5zM4JfngcazMy4WEf/XkPS5TEQjbD+DZ5iNuG6RrKQLa/HuX2SYzC3kQ==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@shufo/prettier-plugin-blade': '*' + '@trivago/prettier-plugin-sort-imports': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + prettier-plugin-twig-melody: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@shufo/prettier-plugin-blade': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + prettier-plugin-twig-melody: + optional: true + dependencies: + prettier: 3.1.0 + dev: true + + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + dev: true + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false @@ -2449,12 +3031,6 @@ packages: '@types/node': 15.14.9 long: 5.2.3 - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - requiresBuild: true - dev: true - optional: true - /ps-tree@1.2.0: resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} engines: {node: '>= 0.10'} @@ -2474,6 +3050,12 @@ packages: resolution: {integrity: sha512-hu9vyLjSlHXT62NAS7DjI9WazDlvjN0lgp3n431dCVnirVcLkZIpzSwA3orhZEKzdDD2jqNYI+w0yG0aFf4kpA==} dev: false + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -2500,7 +3082,6 @@ packages: engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - dev: false /recursive-readdir@2.2.3: resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} @@ -2509,6 +3090,10 @@ packages: minimatch: 3.1.2 dev: false + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: true + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -2535,6 +3120,15 @@ packages: engines: {node: '>=4'} dev: true + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2567,18 +3161,6 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - requiresBuild: true - dev: true - optional: true - - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - requiresBuild: true - dev: true - optional: true - /seek-bzip@1.0.6: resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} hasBin: true @@ -2586,17 +3168,9 @@ packages: commander: 2.20.3 dev: false - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - requiresBuild: true - dev: true - optional: true - /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dev: false /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -2715,6 +3289,20 @@ packages: engines: {node: '>=8'} dev: true + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -2728,6 +3316,11 @@ packages: dependencies: has-flag: 4.0.0 + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} @@ -2739,6 +3332,43 @@ packages: strip-ansi: 6.0.1 dev: true + /tailwind-merge@2.0.0: + resolution: {integrity: sha512-WO8qghn9yhsldLSg80au+3/gY9E4hFxIvQ3qOmlpXnqpDKoMruKfi/56BbbMg6fHTQJ9QD3cc79PoWqlaQE4rw==} + dependencies: + '@babel/runtime': 7.23.2 + dev: true + + /tailwindcss@3.3.5: + resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-import: 15.1.0(postcss@8.4.31) + postcss-js: 4.0.1(postcss@8.4.31) + postcss-load-config: 4.0.1(postcss@8.4.31) + postcss-nested: 6.0.1(postcss@8.4.31) + postcss-selector-parser: 6.0.13 + resolve: 1.22.8 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: true + /tar-stream@1.6.2: resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} engines: {node: '>= 0.8.0'} @@ -2767,6 +3397,19 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -2792,12 +3435,12 @@ packages: dependencies: is-number: 7.0.0 - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true /tsutils@3.21.0(typescript@5.2.2): @@ -2876,12 +3519,6 @@ packages: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: true - /undici-types@5.25.3: - resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} - requiresBuild: true - dev: false - optional: true - /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -2893,6 +3530,17 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -2909,7 +3557,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} @@ -2920,7 +3567,7 @@ packages: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} dev: true - /vite@4.5.0(less@4.2.0): + /vite@4.5.0(@types/node@15.14.9): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -2948,8 +3595,8 @@ packages: terser: optional: true dependencies: + '@types/node': 15.14.9 esbuild: 0.18.20 - less: 4.2.0 postcss: 8.4.31 rollup: 3.29.4 optionalDependencies: @@ -3047,6 +3694,10 @@ packages: engines: {node: '>=0.10.32'} dev: false + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true From c9eb8a9e5d8b9123c537f5620201467110e23ab3 Mon Sep 17 00:00:00 2001 From: Zee Date: Tue, 28 Nov 2023 18:05:16 +0200 Subject: [PATCH 002/233] Use dynamically-created CSS variables for tailwind colors --- gamePlayer/src/app.tsx | 6 ++++- gamePlayer/src/index.css | 2 +- gamePlayer/src/themeHelper.ts | 41 +++++++++++++++++++++++++++++++++++ gamePlayer/tailwind.config.js | 13 ++++++++++- 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 gamePlayer/src/themeHelper.ts diff --git a/gamePlayer/src/app.tsx b/gamePlayer/src/app.tsx index 4c07b1a2..b9de71c0 100644 --- a/gamePlayer/src/app.tsx +++ b/gamePlayer/src/app.tsx @@ -1,10 +1,14 @@ import "./index.css" import { Sidebar } from "./components/Sidebar" import { SetSelectorPage } from "./pages/SetSelectorPage" +import { makeThemeCssVars } from "./themeHelper" export function App() { return ( -
+
diff --git a/gamePlayer/src/index.css b/gamePlayer/src/index.css index 84637c1d..73817f4a 100644 --- a/gamePlayer/src/index.css +++ b/gamePlayer/src/index.css @@ -14,6 +14,6 @@ @layer components { .box { - @apply rounded-md bg-blue-900 p-2 shadow-lg; + @apply bg-theme-900 rounded-md p-2 shadow-lg; } } diff --git a/gamePlayer/src/themeHelper.ts b/gamePlayer/src/themeHelper.ts new file mode 100644 index 00000000..ebb8864d --- /dev/null +++ b/gamePlayer/src/themeHelper.ts @@ -0,0 +1,41 @@ +import colors from "tailwindcss/colors" + +const badColors = [ + "inherit", + "transparent", + "black", + "white", + "current", + "lightBlue", + "warmGray", + "coolGray", + "trueGray", + "blueGray", +] as const + +export type ThemeColor = keyof Omit +function hexToChannels(hex: string): string { + return hex + .slice(1) + .split(/(?<=^(?:.{2}|.{4}))/g) + .map(channel => parseInt(channel, 16)) + .join(" ") +} + +export function listThemeColors(): ThemeColor[] { + return Object.keys(colors).filter( + (color): color is ThemeColor => + !(badColors as readonly string[]).includes(color) + ) +} + +export function makeThemeCssVars( + colorName: ThemeColor +): Record { + return Object.fromEntries( + Object.entries(colors[colorName]).map(([colorShade, color]) => [ + `--theme-${colorShade}`, + hexToChannels(color), + ]) + ) +} diff --git a/gamePlayer/tailwind.config.js b/gamePlayer/tailwind.config.js index 7f98cae2..bacadf8f 100644 --- a/gamePlayer/tailwind.config.js +++ b/gamePlayer/tailwind.config.js @@ -2,7 +2,18 @@ export default { content: ["./index.html", "./src/**/*.{ts,tsx}"], theme: { - extend: {}, + extend: { + colors: { + theme: Object.fromEntries( + [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950].map( + colorShade => [ + colorShade, + `rgb(var(--theme-${colorShade}) / )`, + ] + ) + ), + }, + }, }, plugins: [], } From 4d9e4ee69578c394344572ac76a22b2a69990d48 Mon Sep 17 00:00:00 2001 From: Zee Date: Wed, 29 Nov 2023 16:26:56 +0200 Subject: [PATCH 003/233] Add dummy sidebar choosers (tooltip and drawer) --- gamePlayer/package.json | 1 + gamePlayer/src/components/Sidebar/index.tsx | 112 +++++++++++++++++++- gamePlayer/src/index.css | 4 + gamePlayer/tailwind.config.js | 28 +++++ pnpm-lock.yaml | 53 +++++++++ 5 files changed, 196 insertions(+), 2 deletions(-) diff --git a/gamePlayer/package.json b/gamePlayer/package.json index 4c3a625d..5a7e1c57 100644 --- a/gamePlayer/package.json +++ b/gamePlayer/package.json @@ -40,6 +40,7 @@ "preact-render-to-string": "^6.3.1", "react": "npm:@preact/compat", "react-dom": "npm:@preact/compat", + "react-responsive": "^9.0.2", "tailwind-merge": "^2.0.0", "tailwindcss": "^3.3.5", "typescript": "^5.2.2", diff --git a/gamePlayer/src/components/Sidebar/index.tsx b/gamePlayer/src/components/Sidebar/index.tsx index 9171ec4c..654635a6 100644 --- a/gamePlayer/src/components/Sidebar/index.tsx +++ b/gamePlayer/src/components/Sidebar/index.tsx @@ -1,14 +1,112 @@ -import { ComponentChildren } from "preact" +import { ComponentChildren, ComponentProps, Ref } from "preact" import leafIcon from "./tabIcons/leaf.svg" import levelIcon from "./tabIcons/level.svg" import floppyIcon from "./tabIcons/floppy.svg" import clockIcon from "./tabIcons/clock.svg" import toolsIcon from "./tabIcons/tools.svg" import infoIcon from "./tabIcons/info.svg" +import { useLayoutEffect, useRef, useState } from "preact/hooks" +import { forwardRef } from "preact/compat" +import { twJoin } from "tailwind-merge" +import { useMediaQuery } from "react-responsive" + +function useSidebarChooserAnim( + open: boolean +): { + ref: Ref + closingAnim: boolean + endClosingAnim: () => void + shouldRender: boolean +} { + const [wasOpen, setWasOpen] = useState(false) + if (!wasOpen && open) { + setWasOpen(true) + } + + const ref = useRef(null) + const [closingAnim, setClosingAnim] = useState(false) + + useLayoutEffect(() => { + if (wasOpen && !open) { + setClosingAnim(true) + // REFLOW the main div so that the new animation plays + void ref.current?.offsetHeight + } + }, [wasOpen, open]) + function endClosingAnim() { + if (closingAnim) { + setWasOpen(false) + setClosingAnim(false) + } + } + return { ref, closingAnim, endClosingAnim, shouldRender: open || closingAnim } +} + +const SidebarTooltip = forwardRef>( + function SidebarTooltip(props, fref) { + const { endClosingAnim, closingAnim, ref, shouldRender } = + useSidebarChooserAnim(!!props.open) + if (!shouldRender) return + + return ( +
+ + ) + } +) + +function applyRef(ref: Ref, val: T | null): void { + if (typeof ref === "function") ref(val) + else if (ref) ref.current = val +} + +const SidebarDrawer = forwardRef>( + function SidebarDrawer(props, fref) { + const { endClosingAnim, closingAnim, ref, shouldRender } = + useSidebarChooserAnim(!!props.open) + if (!shouldRender) return + + return ( + { + applyRef(ref, dialog) + applyRef(fref, dialog) + }} + onAnimationEnd={endClosingAnim} + class={twJoin( + "box fixed bottom-20 left-0 right-0 z-10 mx-auto w-screen rounded-b-none shadow-none [transform-origin:0_100%]", + props.open && "animate-drawer-open", + closingAnim && "animate-drawer-close" + )} + /> + ) + } +) function SidebarButton( props: { icon: string } | { children: ComponentChildren } ) { + const [tooltipOpened, setTooltipOpened] = useState(false) + const onDialogMount = (dialog: HTMLDialogElement | null) => { + if (tooltipOpened && dialog) { + dialog.focus() + } + } + const useDrawer = !useMediaQuery({ query: "(min-width: 768px)" }) + const SidebarChooser = useDrawer ? SidebarDrawer : SidebarTooltip + return (
{"icon" in props ? ( @@ -16,11 +114,21 @@ function SidebarButton( tabIndex={0} draggable={false} src={props.icon} - class="m-auto block cursor-pointer select-none max-md:h-3/5 md:w-4/5" + class="m-auto block cursor-pointer select-none max-md:h-4/5 md:w-3/5" + onClick={() => { + setTooltipOpened(true) + }} /> ) : ( props.children )} + setTooltipOpened(false)} + ref={onDialogMount} + > + Todo! +
) } diff --git a/gamePlayer/src/index.css b/gamePlayer/src/index.css index 73817f4a..e3d12695 100644 --- a/gamePlayer/src/index.css +++ b/gamePlayer/src/index.css @@ -7,6 +7,10 @@ width: 100vw; height: 100vh; } + body, + dialog { + @apply text-neutral-100; + } #app { display: contents; } diff --git a/gamePlayer/tailwind.config.js b/gamePlayer/tailwind.config.js index bacadf8f..48240340 100644 --- a/gamePlayer/tailwind.config.js +++ b/gamePlayer/tailwind.config.js @@ -13,6 +13,34 @@ export default { ) ), }, + animation: { + "tooltip-open": "0.1s ease-in-out tooltip-reveal", + "tooltip-close": "0.1s ease-in-out tooltip-reveal reverse", + "drawer-open": "0.05s ease-in-out drawer-reveal", + "drawer-close": "0.05s ease-in-out drawer-reveal reverse", + }, + keyframes: { + "tooltip-reveal": { + from: { + transform: "scale(0.4)", + opacity: "0", + }, + to: { + transform: "scale(1)", + opacity: "1", + }, + }, + "drawer-reveal": { + from: { + opacity: 0.7, + transform: "scaleY(0%)", + }, + to: { + opacity: 1, + transform: "scaleY(100%)", + }, + }, + }, }, }, plugins: [], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd5a09de..21239ac2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,6 +144,9 @@ importers: react-dom: specifier: npm:@preact/compat version: /@preact/compat@17.1.2(preact@10.19.2) + react-responsive: + specifier: ^9.0.2 + version: 9.0.2(@preact/compat@17.1.2) tailwind-merge: specifier: ^2.0.0 version: 2.0.0 @@ -1539,6 +1542,10 @@ packages: engines: {node: '>=8'} dev: false + /css-mediaquery@0.1.2: + resolution: {integrity: sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==} + dev: true + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2246,6 +2253,10 @@ packages: function-bind: 1.1.2 dev: true + /hyphenate-style-name@1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + dev: true + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false @@ -2553,6 +2564,13 @@ packages: /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -2615,6 +2633,12 @@ packages: hasBin: true dev: true + /matchmediaquery@0.3.1: + resolution: {integrity: sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==} + dependencies: + css-mediaquery: 0.1.2 + dev: true + /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: true @@ -2993,6 +3017,14 @@ packages: sisteransi: 1.0.5 dev: false + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + /protobufjs-cli@1.1.2(protobufjs@7.2.5): resolution: {integrity: sha512-8ivXWxT39gZN4mm4ArQyJrRgnIwZqffBWoLDsE21TmMcKI3XwJMV4lEF2WU02C4JAtgYYc2SfJIltelD8to35g==} engines: {node: '>=12.0.0'} @@ -3050,6 +3082,23 @@ packages: resolution: {integrity: sha512-hu9vyLjSlHXT62NAS7DjI9WazDlvjN0lgp3n431dCVnirVcLkZIpzSwA3orhZEKzdDD2jqNYI+w0yG0aFf4kpA==} dev: false + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-responsive@9.0.2(@preact/compat@17.1.2): + resolution: {integrity: sha512-+4CCab7z8G8glgJoRjAwocsgsv6VA2w7JPxFWHRc7kvz8mec1/K5LutNC2MG28Mn8mu6+bu04XZxHv5gyfT7xQ==} + engines: {node: '>=0.10'} + peerDependencies: + react: '>=16.8.0' + dependencies: + hyphenate-style-name: 1.0.4 + matchmediaquery: 0.3.1 + prop-types: 15.8.1 + react: /@preact/compat@17.1.2(preact@10.19.2) + shallow-equal: 1.2.1 + dev: true + /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: @@ -3188,6 +3237,10 @@ packages: is-primitive: 3.0.1 dev: false + /shallow-equal@1.2.1: + resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} + dev: true + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} From 80ac7482aec0191689b8c84dec4b4c90793df143 Mon Sep 17 00:00:00 2001 From: Zee Date: Fri, 1 Dec 2023 21:16:29 +0200 Subject: [PATCH 004/233] Slightly enchance mobile toolbar usability --- gamePlayer/src/components/Sidebar/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gamePlayer/src/components/Sidebar/index.tsx b/gamePlayer/src/components/Sidebar/index.tsx index 654635a6..3e3d5227 100644 --- a/gamePlayer/src/components/Sidebar/index.tsx +++ b/gamePlayer/src/components/Sidebar/index.tsx @@ -108,13 +108,13 @@ function SidebarButton( const SidebarChooser = useDrawer ? SidebarDrawer : SidebarTooltip return ( -
+
{"icon" in props ? ( { setTooltipOpened(true) }} From 7926688650749184502e52f283bb61cf085883f5 Mon Sep 17 00:00:00 2001 From: Zee Date: Fri, 1 Dec 2023 22:13:01 +0200 Subject: [PATCH 005/233] Don't try to use JS-side media queries when doing SSG --- gamePlayer/src/components/Sidebar/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gamePlayer/src/components/Sidebar/index.tsx b/gamePlayer/src/components/Sidebar/index.tsx index 3e3d5227..d94ffbf9 100644 --- a/gamePlayer/src/components/Sidebar/index.tsx +++ b/gamePlayer/src/components/Sidebar/index.tsx @@ -104,7 +104,9 @@ function SidebarButton( dialog.focus() } } - const useDrawer = !useMediaQuery({ query: "(min-width: 768px)" }) + const useDrawer = !globalThis.window + ? false + : !useMediaQuery({ query: "(min-width: 768px)" }) const SidebarChooser = useDrawer ? SidebarDrawer : SidebarTooltip return ( From 4abd67744fa800750b52dd536a18d3aedfca97b1 Mon Sep 17 00:00:00 2001 From: Zee Date: Sat, 2 Dec 2023 23:45:37 +0200 Subject: [PATCH 006/233] Add a custom hash-based page router --- gamePlayer/package.json | 1 + gamePlayer/src/app.tsx | 4 +- gamePlayer/src/components/Preloader.tsx | 9 ++ gamePlayer/src/index.css | 10 ++ gamePlayer/src/pages/LevelPlayerPage.tsx | 12 ++ gamePlayer/src/pages/SetSelectorPage.tsx | 4 +- gamePlayer/src/routing.tsx | 136 +++++++++++++++++++++++ pnpm-lock.yaml | 11 ++ 8 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 gamePlayer/src/components/Preloader.tsx create mode 100644 gamePlayer/src/pages/LevelPlayerPage.tsx create mode 100644 gamePlayer/src/routing.tsx diff --git a/gamePlayer/package.json b/gamePlayer/package.json index 5a7e1c57..e5cc464c 100644 --- a/gamePlayer/package.json +++ b/gamePlayer/package.json @@ -33,6 +33,7 @@ "fflate": "^0.7.4", "is-hotkey": "^0.2.0", "jotai": "^2.5.1", + "jotai-effect": "^0.2.3", "lz-string": "^1.5.0", "path-browserify": "^1.0.1", "postcss": "^8.4.31", diff --git a/gamePlayer/src/app.tsx b/gamePlayer/src/app.tsx index b9de71c0..d55aabac 100644 --- a/gamePlayer/src/app.tsx +++ b/gamePlayer/src/app.tsx @@ -1,7 +1,7 @@ import "./index.css" import { Sidebar } from "./components/Sidebar" -import { SetSelectorPage } from "./pages/SetSelectorPage" import { makeThemeCssVars } from "./themeHelper" +import { Router } from "./routing" export function App() { return ( @@ -10,7 +10,7 @@ export function App() { class="from-theme-500 to-theme-800 flex h-full w-full flex-col-reverse bg-gradient-to-br font-sans text-neutral-100 md:flex-row" > - +
) } diff --git a/gamePlayer/src/components/Preloader.tsx b/gamePlayer/src/components/Preloader.tsx new file mode 100644 index 00000000..b8f8912e --- /dev/null +++ b/gamePlayer/src/components/Preloader.tsx @@ -0,0 +1,9 @@ +import { useEffect } from "preact/compat" + +export function Preloader(props: { preloadComplete?: () => void }) { + useEffect(() => { + if (!globalThis.window) return + setTimeout(() => props.preloadComplete?.(), 500) + }, []) + return
Loading very important stuff...
+} diff --git a/gamePlayer/src/index.css b/gamePlayer/src/index.css index e3d12695..b98a3523 100644 --- a/gamePlayer/src/index.css +++ b/gamePlayer/src/index.css @@ -20,4 +20,14 @@ .box { @apply bg-theme-900 rounded-md p-2 shadow-lg; } + button { + @apply cursor-auto appearance-none border-2 border-b-[--low-color] border-l-[--high-color] border-r-[--low-color] border-t-[--high-color] bg-gradient-to-b from-[--high-color] to-[--low-color] px-2; + @apply [--high-color:theme(colors.theme.600)] [--low-color:theme(colors.theme.700)]; + } + button:hover { + @apply [--high-color:theme(colors.theme.500)] [--low-color:theme(colors.theme.600)]; + } + button:active { + @apply [--high-color:theme(colors.theme.700)] [--low-color:theme(colors.theme.800)]; + } } diff --git a/gamePlayer/src/pages/LevelPlayerPage.tsx b/gamePlayer/src/pages/LevelPlayerPage.tsx new file mode 100644 index 00000000..437a78d3 --- /dev/null +++ b/gamePlayer/src/pages/LevelPlayerPage.tsx @@ -0,0 +1,12 @@ +import { levelNAtom, levelSetIdentAtom } from "../routing" +import { useAtomValue } from "jotai" + +export function LevelPlayerPage() { + const levelSetIdent = useAtomValue(levelSetIdentAtom) + const levelN = useAtomValue(levelNAtom) + return ( +
+ This is sure playing {levelSetIdent} #{levelN} +
+ ) +} diff --git a/gamePlayer/src/pages/SetSelectorPage.tsx b/gamePlayer/src/pages/SetSelectorPage.tsx index c8d28ad3..ebfb89dd 100644 --- a/gamePlayer/src/pages/SetSelectorPage.tsx +++ b/gamePlayer/src/pages/SetSelectorPage.tsx @@ -28,7 +28,9 @@ export function SetSelectorPage() { return (
-
Todo!
+
+ +
) } diff --git a/gamePlayer/src/routing.tsx b/gamePlayer/src/routing.tsx new file mode 100644 index 00000000..ccec208b --- /dev/null +++ b/gamePlayer/src/routing.tsx @@ -0,0 +1,136 @@ +import { atom, useAtom, useAtomValue } from "jotai" +import { atomEffect } from "jotai-effect" +import { useEffect, useState } from "preact/hooks" +import { SetSelectorPage } from "./pages/SetSelectorPage" +import { FunctionComponent } from "preact" +import { Preloader } from "./components/Preloader" +import { LevelPlayerPage } from "./pages/LevelPlayerPage" + +function searchParamsToObj(query: string): SearchParams { + return Object.fromEntries(new URLSearchParams(query)) +} + +type SearchParams = { [P in string]?: string } + +interface HashLocation { + pagePath: string[] + searchParams: SearchParams +} + +function parseHashLocation(): HashLocation { + const notccLocation = new URL("http://fake.notcc.path") + try { + notccLocation.href = `http://fake.notcc.path/${location.hash.slice(1)}` + } catch {} + + let pagePath = notccLocation.pathname.split("/").slice(2) + const searchParams = { + ...searchParamsToObj(notccLocation.search), + ...searchParamsToObj(location.search), + } + return { pagePath, searchParams } +} + +function applyHashLocation(hashLoc: HashLocation): void { + const newLoc = new URL(location.toString()) + if ( + hashLoc.pagePath.length === 0 && + Object.keys(hashLoc.searchParams).length === 0 + ) { + newLoc.hash = "" + } else { + newLoc.hash = `#/${hashLoc.pagePath.join("/")}${ + Object.keys(hashLoc.searchParams).length === 0 + ? "" + : // Bad TS types + `?${new URLSearchParams( + hashLoc.searchParams as Record + )}` + }` + } + + history.pushState(null, "", newLoc) +} +interface Page { + component: FunctionComponent + requiresLevel?: boolean + isLevelPlayer?: boolean +} + +const pages: Partial> = { + "": { component: SetSelectorPage }, + play: { + component: LevelPlayerPage, + requiresLevel: true, + isLevelPlayer: true, + }, +} + +export const pageNameAtom = atom("") +export const levelNAtom = atom(null) +export const levelSetIdentAtom = atom(null) +export const searchParamsAtom = atom({}) + +// A small hack to prevent internalToHashLocationSyncAtom from writing to the hash +// right after reading from it. +let preventImmediateHashUpdate = false + +const hashToInternalLocationSyncAtom = atomEffect((_get, set) => { + const listener = () => { + const hashLoc = parseHashLocation() + const pageName = hashLoc.pagePath[0] ?? "" + set(pageNameAtom, pageName) + const page = pages[pageName] + set(searchParamsAtom, hashLoc.searchParams) + if (page?.requiresLevel) { + set(levelSetIdentAtom, hashLoc.pagePath[1]) + set(levelNAtom, parseInt(hashLoc.pagePath[2])) + } else { + set(levelSetIdentAtom, null) + set(levelNAtom, null) + } + preventImmediateHashUpdate = true + } + listener() + window.addEventListener("hashchange", listener) + return () => window.removeEventListener("hashchange", listener) +}) + +const internalToHashLocationSyncAtom = atomEffect(get => { + if (preventImmediateHashUpdate) { + preventImmediateHashUpdate = false + return + } + const levelN = get(levelNAtom) + const levelSetIdent = get(levelSetIdentAtom) + const pageName = get(pageNameAtom) + + applyHashLocation({ + pagePath: [ + pageName === "" ? null : pageName, + levelSetIdent, + levelN !== null ? levelN.toString() : null, + ].filter((part): part is string => part !== null), + searchParams: get(searchParamsAtom), + }) +}) + +function PageNotFound(props: { pageName: string }) { + return
Page "{props.pageName}" doesn't exist.
+} + +export function Router() { + const [preloadComplete, setPreloadComplete] = useState(false) + const pageName = useAtomValue(pageNameAtom) + useEffect(() => { + // Prevent internalToHashLocationSyncAtom from writing to the hash on mount + preventImmediateHashUpdate = true + }, []) + useAtom(hashToInternalLocationSyncAtom) + useAtom(internalToHashLocationSyncAtom) + if (!preloadComplete) + return setPreloadComplete(true)} /> + const Page = pages[pageName]?.component + if (Page === undefined) return + return +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21239ac2..09d5a191 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -123,6 +123,9 @@ importers: jotai: specifier: ^2.5.1 version: 2.5.1(@preact/compat@17.1.2) + jotai-effect: + specifier: ^0.2.3 + version: 0.2.3(jotai@2.5.1) lz-string: specifier: ^1.5.0 version: 1.5.0 @@ -2381,6 +2384,14 @@ packages: hasBin: true dev: true + /jotai-effect@0.2.3(jotai@2.5.1): + resolution: {integrity: sha512-Ecs40W4Y+SI1EqbvPdoLDvbyic5eMyD5ifJIQrrr+hWz1GEjmijVWyKw6TzmYzO2+++CkYPF+fYsWzsWsR0AAQ==} + peerDependencies: + jotai: '>=2.4.3' + dependencies: + jotai: 2.5.1(@preact/compat@17.1.2) + dev: true + /jotai@2.5.1(@preact/compat@17.1.2): resolution: {integrity: sha512-vanPCCSuHczUXNbVh/iUunuMfrWRL4FdBtAbTRmrfqezJcKb8ybBTg8iivyYuUHapjcDETyJe1E4inlo26bVHA==} engines: {node: '>=12.20.0'} From 41cbf6322e06fb53ab9660323e396efbb91c7145 Mon Sep 17 00:00:00 2001 From: Zee Date: Tue, 12 Dec 2023 18:58:18 +0200 Subject: [PATCH 007/233] Add level loading --- gamePlayer/src/app.tsx | 2 + gamePlayer/src/components/Dialog.tsx | 33 ++++ gamePlayer/src/index.css | 18 +- gamePlayer/src/levelData.tsx | 224 +++++++++++++++++++++++ gamePlayer/src/pages/LevelPlayerPage.tsx | 8 +- gamePlayer/src/pages/SetSelectorPage.tsx | 30 ++- gamePlayer/src/prompts.tsx | 86 +++++++++ gamePlayer/src/routing.tsx | 43 ++++- 8 files changed, 428 insertions(+), 16 deletions(-) create mode 100644 gamePlayer/src/components/Dialog.tsx create mode 100644 gamePlayer/src/levelData.tsx create mode 100644 gamePlayer/src/prompts.tsx diff --git a/gamePlayer/src/app.tsx b/gamePlayer/src/app.tsx index d55aabac..7980c2fe 100644 --- a/gamePlayer/src/app.tsx +++ b/gamePlayer/src/app.tsx @@ -2,6 +2,7 @@ import "./index.css" import { Sidebar } from "./components/Sidebar" import { makeThemeCssVars } from "./themeHelper" import { Router } from "./routing" +import { Prompts } from "./prompts" export function App() { return ( @@ -9,6 +10,7 @@ export function App() { style={makeThemeCssVars("blue")} class="from-theme-500 to-theme-800 flex h-full w-full flex-col-reverse bg-gradient-to-br font-sans text-neutral-100 md:flex-row" > +
diff --git a/gamePlayer/src/components/Dialog.tsx b/gamePlayer/src/components/Dialog.tsx new file mode 100644 index 00000000..af750f37 --- /dev/null +++ b/gamePlayer/src/components/Dialog.tsx @@ -0,0 +1,33 @@ +import { ReactNode } from "preact/compat" + +export function Dialog(props: { + header: ReactNode + section: ReactNode + buttons: [string, () => void | Promise][] + onResolve?: () => void +}) { + return ( + { + ref?.showModal() + }} + > +
{props.header}
+
{props.section}
+
+ {props.buttons.map(([label, action]) => ( + + ))} +
+
+ ) +} diff --git a/gamePlayer/src/index.css b/gamePlayer/src/index.css index b98a3523..61e88c4e 100644 --- a/gamePlayer/src/index.css +++ b/gamePlayer/src/index.css @@ -22,12 +22,20 @@ } button { @apply cursor-auto appearance-none border-2 border-b-[--low-color] border-l-[--high-color] border-r-[--low-color] border-t-[--high-color] bg-gradient-to-b from-[--high-color] to-[--low-color] px-2; - @apply [--high-color:theme(colors.theme.600)] [--low-color:theme(colors.theme.700)]; + --high-color: theme(colors.theme.600); + --low-color: theme(colors.theme.700); } - button:hover { - @apply [--high-color:theme(colors.theme.500)] [--low-color:theme(colors.theme.600)]; + button:enabled:hover { + --high-color: theme(colors.theme.500); + --low-color: theme(colors.theme.600); } - button:active { - @apply [--high-color:theme(colors.theme.700)] [--low-color:theme(colors.theme.800)]; + button:enabled:active { + --high-color: theme(colors.theme.700); + --low-color: theme(colors.theme.800); + } + button:disabled { + @apply text-neutral-500; + --high-color: theme(colors.theme.800); + --low-color: theme(colors.theme.900); } } diff --git a/gamePlayer/src/levelData.tsx b/gamePlayer/src/levelData.tsx new file mode 100644 index 00000000..0dfb78a3 --- /dev/null +++ b/gamePlayer/src/levelData.tsx @@ -0,0 +1,224 @@ +import { Getter, Setter, atom, useAtomValue, useSetAtom } from "jotai" +import { LevelData, LevelSet, parseC2M } from "@notcc/logic" +import { + CUSTOM_LEVEL_SET_IDENT, + CUSTOM_SET_SET_IDENT, + levelNAtom, + levelSetIdentAtom, + pageAtom, + searchParamsAtom, +} from "./routing" +import { atomEffect } from "jotai-effect" +import { loadable, unwrap } from "jotai/utils" +import { type os } from "@neutralinojs/lib" +import { Dialog } from "./components/Dialog" +import { useRef } from "preact/hooks" +import { PromptComponent, showPrompt } from "./prompts" +import { unzlib } from "fflate" + +export const levelAtom = atom | null>(null) +export const levelUnwrappedAtom = unwrap(levelAtom) + +const levelLoadableAtom = loadable(levelAtom) +export function useSwrLevel(): LevelData | null { + const levelState = useAtomValue(levelLoadableAtom) + const lastLevel = useRef(null) + if (levelState.state === "hasError") return null + if (levelState.state === "hasData") { + lastLevel.current = levelState.data + } + return lastLevel.current +} + +export const levelSetAtom = atom | null>(null) +export const levelSetUnwrappedAtom = unwrap(levelSetAtom) + +export const autoLevelfromLevelNAtom = atomEffect((get, set) => { + const levelN = get(levelNAtom) + const levelSet = get(levelSetUnwrappedAtom) + if (levelSet && levelN !== null) { + set( + levelAtom, + levelSet.goToLevel(levelN).then(rec => rec.levelData!) + ) + } +}) + +export function useSetLoaded(): { + setSet(set: Promise, ident?: string): void + setLevel(level: Promise): void +} { + const setLevelSet = useSetAtom(levelSetAtom) + const setLevelSetIdent = useSetAtom(levelSetIdentAtom) + const setLevel = useSetAtom(levelAtom) + const setLevelN = useSetAtom(levelNAtom) + const setPageName = useSetAtom(pageAtom) + const page = useAtomValue(pageAtom) + return { + setSet(set, ident) { + setLevelSet(set) + setLevelSetIdent(ident ?? CUSTOM_SET_SET_IDENT) + setLevel( + set.then(set => set.getCurrentRecord()).then(rec => rec.levelData!) + ) + set.then(set => setLevelN(set.currentLevel)) + if (!page?.isLevelPlayer) { + setPageName("play") + } + }, + setLevel(level) { + setLevelSet(null) + setLevelSetIdent(CUSTOM_LEVEL_SET_IDENT) + setLevel(level) + setLevelN(1) + if (!page?.isLevelPlayer) { + setPageName("play") + } + }, + } +} + +// TODO Neutralino prompts +async function showLoadPrompt( + _title?: string, + options?: os.OpenDialogOptions +): Promise { + const fileLoader = document.createElement("input") + fileLoader.type = "file" + if (options?.filters !== undefined) { + fileLoader.accept = options.filters + .map(filter => filter.extensions.map(ext => `.${ext}`).join(",")) + .join(",") + } + fileLoader.multiple = !!options?.multiSelections + return new Promise((res, rej) => { + fileLoader.addEventListener("change", () => { + if (fileLoader.files === null || fileLoader.files.length === 0) { + rej(new Error("No files specified")) + } else { + res(Array.from(fileLoader.files)) + } + fileLoader.remove() + }) + fileLoader.click() + }) +} + +export async function showFileLevelPrompt(): Promise { + const file: File | undefined = ( + await showLoadPrompt("Load level file", { + filters: [{ name: "C2M level file", extensions: ["c2m"] }], + }) + )[0] + return file?.arrayBuffer().then(buf => parseC2M(buf)) +} + +export function useOpenFile(): () => Promise { + const { setLevel } = useSetLoaded() + return async () => { + const files = await showLoadPrompt("Load level file", { + filters: [ + { name: "C2M level file", extensions: ["c2m"] }, + // TODO Set loading + // { name: "ZIP levelset archive", extensions: ["zip"] }, + ], + }) + const file = files[0] + if (!file) return false + const levelPromise = file.arrayBuffer().then(buf => parseC2M(buf)) + setLevel(levelPromise) + await levelPromise + return true + } +} + +export const LoadLevelPrompt: PromptComponent = function ({ + onResolve, +}) { + const setPage = useSetAtom(pageAtom) + return ( + + The URL doesn't provide the level data required to load the level. + Please provide the level file or go back to the set selector. + + } + buttons={[ + [ + "Back to set selector", + () => { + setPage("") + onResolve(null) + }, + ], + [ + "Load file", + async () => { + const level = await showFileLevelPrompt() + if (!level) return + onResolve(level) + }, + ], + ]} + /> + ) +} + +function unzlibAsync(buf: Uint8Array): Promise { + return new Promise((res, rej) => { + unzlib(buf, (err, data) => { + if (err) rej(err) + else res(data) + }) + }) +} +function latin1ToBuffer(str: string): Uint8Array { + return Uint8Array.from(str, c => c.charCodeAt(0)) +} +function decodeBase64(str: string): Uint8Array { + return latin1ToBuffer(atob(str.replace(/-/g, "+").replace(/_/g, "/"))) +} + +const resolveHashLevelPromptIdent = Symbol() + +export async function resolveHashLevel(get: Getter, set: Setter) { + const levelSetIdent = get(levelSetIdentAtom) + const levelN = get(levelNAtom) + const searchParams = get(searchParamsAtom) + if (searchParams.level) { + let buf = decodeBase64(searchParams.level) + if (buf[0] == 0x78) { + buf = await unzlibAsync(buf) + } + set(pageAtom, "play") + set(levelAtom, Promise.resolve(parseC2M(buf.buffer))) + set(levelSetIdentAtom, CUSTOM_LEVEL_SET_IDENT) + if (levelN === null) { + set(levelNAtom, 1) + } + } else if (levelSetIdent === null || levelN === null) { + } else if (levelSetIdent === CUSTOM_LEVEL_SET_IDENT) { + showPrompt(get, set, LoadLevelPrompt, resolveHashLevelPromptIdent).then( + newLevel => { + if (!newLevel) return + set(levelAtom, Promise.resolve(newLevel)) + } + ) + } else { + showPrompt( + get, + set, + ({ onResolve }) => ( + set(pageAtom, "")]]} + onResolve={onResolve} + /> + ), + resolveHashLevelPromptIdent + ) + } +} diff --git a/gamePlayer/src/pages/LevelPlayerPage.tsx b/gamePlayer/src/pages/LevelPlayerPage.tsx index 437a78d3..dfef8b5e 100644 --- a/gamePlayer/src/pages/LevelPlayerPage.tsx +++ b/gamePlayer/src/pages/LevelPlayerPage.tsx @@ -1,12 +1,18 @@ +import { useSwrLevel } from "../levelData" import { levelNAtom, levelSetIdentAtom } from "../routing" import { useAtomValue } from "jotai" export function LevelPlayerPage() { const levelSetIdent = useAtomValue(levelSetIdentAtom) const levelN = useAtomValue(levelNAtom) + const level = useSwrLevel() + if (level === null) { + return
Fetching level data...
+ } return (
- This is sure playing {levelSetIdent} #{levelN} + This is sure playing {levelSetIdent} #{levelN}:{" "} + {level.name ?? "[UNTITLED]"}
) } diff --git a/gamePlayer/src/pages/SetSelectorPage.tsx b/gamePlayer/src/pages/SetSelectorPage.tsx index ebfb89dd..78834ec8 100644 --- a/gamePlayer/src/pages/SetSelectorPage.tsx +++ b/gamePlayer/src/pages/SetSelectorPage.tsx @@ -1,3 +1,4 @@ +import { useOpenFile } from "../levelData" import { atom, useAtom } from "jotai" const altLogoAtom = atom(false) @@ -24,13 +25,36 @@ function Header() { ) } +function UploadBox() { + const openFile = useOpenFile() + return ( +
+

Load external files:

+
+ + +
+
+ + +
+
+ ) +} + export function SetSelectorPage() { return (
-
- -
+
) } diff --git a/gamePlayer/src/prompts.tsx b/gamePlayer/src/prompts.tsx new file mode 100644 index 00000000..a9eabff5 --- /dev/null +++ b/gamePlayer/src/prompts.tsx @@ -0,0 +1,86 @@ +import { atom, useAtom, useAtomValue } from "jotai" +import { ComponentType } from "preact" +import { ReactNode } from "preact/compat" + +interface Prompt { + el: ReactNode + promise: Promise + ident?: unknown +} + +export type PromptComponent = ComponentType<{ + onResolve: (val: R) => void + onReject: (err: unknown) => void +}> + +const promptsAtom = atom[]>([]) + +export function useShowPrompt(): ( + Prompt: PromptComponent, + uniqueIdent?: unknown +) => Promise { + const [prompts, setPrompts] = useAtom(promptsAtom) + return (Prompt, uniqueIdent?: unknown) => + showPrompt( + () => prompts, + (_, val) => setPrompts(val), + Prompt, + uniqueIdent + ) +} +export function showPrompt( + get: (atom: typeof promptsAtom) => Prompt[], + set: (atom: typeof promptsAtom, val: Prompt[]) => void, + Prompt: PromptComponent, + ident?: unknown +): Promise { + let el: ReactNode + let prompt: Prompt + let removed = false + function removePrompt() { + if (removed) return + removed = true + const prompts = get(promptsAtom).concat() + prompts.splice(prompts.indexOf(prompt), 1) + set(promptsAtom, prompts) + } + if (ident) { + const prompts = get(promptsAtom).concat() + const idx = prompts.findIndex( + prompt => prompt.ident && prompt.ident === ident + ) + if (idx !== -1) { + prompts.splice(idx, 1) + set(promptsAtom, prompts) + } + } + const promise = new Promise((res, rej) => { + el = ( + { + res(val) + removePrompt() + }} + onReject={val => { + rej(val) + removePrompt() + }} + /> + ) + }) + prompt = { el, promise, ident } + set(promptsAtom, get(promptsAtom).concat(prompt)) + return promise +} + +export function Prompts() { + const prompts = useAtomValue(promptsAtom) + return ( + <> + {prompts + .concat() + .reverse() + .map(prompt => prompt.el)} + + ) +} diff --git a/gamePlayer/src/routing.tsx b/gamePlayer/src/routing.tsx index ccec208b..e29a72aa 100644 --- a/gamePlayer/src/routing.tsx +++ b/gamePlayer/src/routing.tsx @@ -5,6 +5,7 @@ import { SetSelectorPage } from "./pages/SetSelectorPage" import { FunctionComponent } from "preact" import { Preloader } from "./components/Preloader" import { LevelPlayerPage } from "./pages/LevelPlayerPage" +import { levelAtom, levelSetAtom, resolveHashLevel } from "./levelData" function searchParamsToObj(query: string): SearchParams { return Object.fromEntries(new URLSearchParams(query)) @@ -28,6 +29,11 @@ function parseHashLocation(): HashLocation { ...searchParamsToObj(notccLocation.search), ...searchParamsToObj(location.search), } + if (location.search !== "") { + const newLoc = new URL(location.toString()) + newLoc.search = "" + history.replaceState(null, "", newLoc) + } return { pagePath, searchParams } } @@ -66,16 +72,24 @@ const pages: Partial> = { }, } +export const CUSTOM_LEVEL_SET_IDENT = "*custom-level" +export const CUSTOM_SET_SET_IDENT = "*custom-level" + export const pageNameAtom = atom("") export const levelNAtom = atom(null) export const levelSetIdentAtom = atom(null) export const searchParamsAtom = atom({}) +export const pageAtom = atom( + get => pages[get(pageNameAtom)] ?? null, + (_get, set, pageName) => set(pageNameAtom, pageName) +) + // A small hack to prevent internalToHashLocationSyncAtom from writing to the hash // right after reading from it. let preventImmediateHashUpdate = false -const hashToInternalLocationSyncAtom = atomEffect((_get, set) => { +const hashToInternalLocationSyncAtom = atomEffect((get, set) => { const listener = () => { const hashLoc = parseHashLocation() const pageName = hashLoc.pagePath[0] ?? "" @@ -90,6 +104,7 @@ const hashToInternalLocationSyncAtom = atomEffect((_get, set) => { set(levelNAtom, null) } preventImmediateHashUpdate = true + resolveHashLevel(get, set) } listener() window.addEventListener("hashchange", listener) @@ -97,13 +112,15 @@ const hashToInternalLocationSyncAtom = atomEffect((_get, set) => { }) const internalToHashLocationSyncAtom = atomEffect(get => { + const levelN = get(levelNAtom) + const levelSetIdent = get(levelSetIdentAtom) + const pageName = get(pageNameAtom) + const searchParams = get(searchParamsAtom) + if (preventImmediateHashUpdate) { preventImmediateHashUpdate = false return } - const levelN = get(levelNAtom) - const levelSetIdent = get(levelSetIdentAtom) - const pageName = get(pageNameAtom) applyHashLocation({ pagePath: [ @@ -111,10 +128,20 @@ const internalToHashLocationSyncAtom = atomEffect(get => { levelSetIdent, levelN !== null ? levelN.toString() : null, ].filter((part): part is string => part !== null), - searchParams: get(searchParamsAtom), + searchParams, }) }) +const discardUselessLevelDataAtom = atomEffect((get, set) => { + const page = get(pageAtom) + if (!page?.isLevelPlayer) { + set(levelSetIdentAtom, null) + set(levelNAtom, null) + set(levelAtom, null) + set(levelSetAtom, null) + } +}) + function PageNotFound(props: { pageName: string }) { return
Page "{props.pageName}" doesn't exist.
} @@ -126,11 +153,13 @@ export function Router() { // Prevent internalToHashLocationSyncAtom from writing to the hash on mount preventImmediateHashUpdate = true }, []) + useAtom(discardUselessLevelDataAtom) useAtom(hashToInternalLocationSyncAtom) useAtom(internalToHashLocationSyncAtom) if (!preloadComplete) return setPreloadComplete(true)} /> - const Page = pages[pageName]?.component - if (Page === undefined) return + const page = pages[pageName] + if (page === undefined) return + const Page = page.component return } From c0898c68296cabfe1b9bf5cd6ffa76bc187e8807 Mon Sep 17 00:00:00 2001 From: Zee Date: Sun, 17 Dec 2023 11:36:48 +0200 Subject: [PATCH 008/233] Use ignorant hook for hashToInternal to prevent overwriting of internal path --- gamePlayer/src/helpers.ts | 27 +++++++++++++++++++++++++++ gamePlayer/src/levelData.tsx | 17 +---------------- gamePlayer/src/routing.tsx | 8 ++++++-- 3 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 gamePlayer/src/helpers.ts diff --git a/gamePlayer/src/helpers.ts b/gamePlayer/src/helpers.ts new file mode 100644 index 00000000..9169a6c1 --- /dev/null +++ b/gamePlayer/src/helpers.ts @@ -0,0 +1,27 @@ +import { unzlib } from "fflate" +import { Getter, Setter, useStore } from "jotai" +import { useEffect } from "preact/hooks" + +export function ignorantAtomEffectHook( + effectFn: (get: Getter, set: Setter) => void | (() => void) +) { + return () => { + const { get, set } = useStore() + useEffect(() => effectFn(get, set), []) + } +} + +export function unzlibAsync(buf: Uint8Array): Promise { + return new Promise((res, rej) => { + unzlib(buf, (err, data) => { + if (err) rej(err) + else res(data) + }) + }) +} +export function latin1ToBuffer(str: string): Uint8Array { + return Uint8Array.from(str, c => c.charCodeAt(0)) +} +export function decodeBase64(str: string): Uint8Array { + return latin1ToBuffer(atob(str.replace(/-/g, "+").replace(/_/g, "/"))) +} diff --git a/gamePlayer/src/levelData.tsx b/gamePlayer/src/levelData.tsx index 0dfb78a3..0a482c2c 100644 --- a/gamePlayer/src/levelData.tsx +++ b/gamePlayer/src/levelData.tsx @@ -14,7 +14,7 @@ import { type os } from "@neutralinojs/lib" import { Dialog } from "./components/Dialog" import { useRef } from "preact/hooks" import { PromptComponent, showPrompt } from "./prompts" -import { unzlib } from "fflate" +import { decodeBase64, unzlibAsync } from "./helpers" export const levelAtom = atom | null>(null) export const levelUnwrappedAtom = unwrap(levelAtom) @@ -166,21 +166,6 @@ export const LoadLevelPrompt: PromptComponent = function ({ ) } -function unzlibAsync(buf: Uint8Array): Promise { - return new Promise((res, rej) => { - unzlib(buf, (err, data) => { - if (err) rej(err) - else res(data) - }) - }) -} -function latin1ToBuffer(str: string): Uint8Array { - return Uint8Array.from(str, c => c.charCodeAt(0)) -} -function decodeBase64(str: string): Uint8Array { - return latin1ToBuffer(atob(str.replace(/-/g, "+").replace(/_/g, "/"))) -} - const resolveHashLevelPromptIdent = Symbol() export async function resolveHashLevel(get: Getter, set: Setter) { diff --git a/gamePlayer/src/routing.tsx b/gamePlayer/src/routing.tsx index e29a72aa..28e3bd54 100644 --- a/gamePlayer/src/routing.tsx +++ b/gamePlayer/src/routing.tsx @@ -6,6 +6,7 @@ import { FunctionComponent } from "preact" import { Preloader } from "./components/Preloader" import { LevelPlayerPage } from "./pages/LevelPlayerPage" import { levelAtom, levelSetAtom, resolveHashLevel } from "./levelData" +import { ignorantAtomEffectHook } from "./helpers" function searchParamsToObj(query: string): SearchParams { return Object.fromEntries(new URLSearchParams(query)) @@ -89,11 +90,13 @@ export const pageAtom = atom( // right after reading from it. let preventImmediateHashUpdate = false -const hashToInternalLocationSyncAtom = atomEffect((get, set) => { +const useHashToInternalLocationSync = ignorantAtomEffectHook((get, set) => { const listener = () => { const hashLoc = parseHashLocation() + const pageName = hashLoc.pagePath[0] ?? "" set(pageNameAtom, pageName) + const page = pages[pageName] set(searchParamsAtom, hashLoc.searchParams) if (page?.requiresLevel) { @@ -103,6 +106,7 @@ const hashToInternalLocationSyncAtom = atomEffect((get, set) => { set(levelSetIdentAtom, null) set(levelNAtom, null) } + preventImmediateHashUpdate = true resolveHashLevel(get, set) } @@ -154,7 +158,7 @@ export function Router() { preventImmediateHashUpdate = true }, []) useAtom(discardUselessLevelDataAtom) - useAtom(hashToInternalLocationSyncAtom) + useHashToInternalLocationSync() useAtom(internalToHashLocationSyncAtom) if (!preloadComplete) return setPreloadComplete(true)} /> From dea1d15fc6228113ae2b7e02f0dff599b4376c1d Mon Sep 17 00:00:00 2001 From: Zee Date: Tue, 19 Dec 2023 12:56:42 +0200 Subject: [PATCH 009/233] Add sidebar options and an about dialog --- gamePlayer/src/components/AboutDialog.tsx | 127 ++++++++++++++ gamePlayer/src/components/Dialog.tsx | 13 +- gamePlayer/src/components/Sidebar/index.tsx | 179 +++++++++++++++----- gamePlayer/src/helpers.ts | 6 +- gamePlayer/src/index.css | 3 + gamePlayer/src/routing.tsx | 10 +- gamePlayer/vite.config.ts | 2 +- 7 files changed, 287 insertions(+), 53 deletions(-) create mode 100644 gamePlayer/src/components/AboutDialog.tsx diff --git a/gamePlayer/src/components/AboutDialog.tsx b/gamePlayer/src/components/AboutDialog.tsx new file mode 100644 index 00000000..1411d64d --- /dev/null +++ b/gamePlayer/src/components/AboutDialog.tsx @@ -0,0 +1,127 @@ +import { PromptComponent } from "@/prompts" +import { Dialog } from "./Dialog" + +export const AboutPrompt: PromptComponent = props => { + return ( + +

NotCC

+

+ NotCC is an accurate,{" "} + + open-source + {" "} + + Chip's Challenge 2 + {" "} + and{" "} + + Chip's Challenge 1 (Steam) + {" "} + emulator. +

+

+
+ NotCC is primarily made by{" "} + + G lander + + . +

+

Thanks to:

+
    +
  • + The Chip's Challenge community, residing at{" "} + + the Bit Busters Club + + . Also, more specifically: +
  • +
  • + + eevee + + , for creating the first CC2 emulator,{" "} + + Lexy's Labyrinth + + , which NotCC heavily borrowed (and still borrows) from. +
  • +
  • + Markus O.,{" "} + + Bacorn + + , and{" "} + + Sickly + + , for creating and maintaining SuperCC, the optimization tool + ExaCC is heavily inspired by. +
  • +
  • + + Zrax + + , for creating a very helpful suite of CC tools, appropriately + called{" "} + + CCTools + + . +
  • +
  • + Anders Kaseorg and Kawaiiprincess, for creating and porting to CC2 + (respectively) the bundled Tile World tileset. +
  • +
  • + + Sharpeye + + , for finding a bug with ExaCC auto-scaling and being one of the + first people to use ExaCC for optimization. +
  • +
  • + + Tyler Sontag + + , for creating the very, very helpful resident Discord bot,{" "} + + Gliderbot + + . +
  • +
  • + + IHNN + + , for providing details and feedback on non-legal glitches and + their prevention. +
  • +
+

+ Last change: {import.meta.env.VITE_LAST_COMMIT_INFO}. +
+ Built at {import.meta.env.VITE_BUILD_TIME}. +

+
+ } + buttons={[["Ok", () => {}]]} + onResolve={props.onResolve} + /> + ) +} diff --git a/gamePlayer/src/components/Dialog.tsx b/gamePlayer/src/components/Dialog.tsx index af750f37..88eddd8a 100644 --- a/gamePlayer/src/components/Dialog.tsx +++ b/gamePlayer/src/components/Dialog.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from "preact/compat" +import { ReactNode, useRef } from "preact/compat" export function Dialog(props: { header: ReactNode @@ -6,12 +6,18 @@ export function Dialog(props: { buttons: [string, () => void | Promise][] onResolve?: () => void }) { + const normalSubmitRef = useRef(false) return ( { ref?.showModal() }} + onClose={ev => { + ev.preventDefault() + if (normalSubmitRef.current) return + props.onResolve?.() + }} >
{props.header}
{props.section}
@@ -20,7 +26,10 @@ export function Dialog(props: {
) } diff --git a/gamePlayer/src/pages/ExaPlayerPage/exaPlayer.tsx b/gamePlayer/src/pages/ExaPlayerPage/exaPlayer.tsx index d6ed4593..e31defa2 100644 --- a/gamePlayer/src/pages/ExaPlayerPage/exaPlayer.tsx +++ b/gamePlayer/src/pages/ExaPlayerPage/exaPlayer.tsx @@ -1,8 +1,15 @@ import { GameRenderer } from "@/components/GameRenderer" -import { Getter, Setter, atom, useAtomValue } from "jotai" +import { Getter, Setter, useAtom, useAtomValue, useSetAtom } from "jotai" import { LinearModel } from "./models/linear" import { GraphModel } from "./models/graph" -import { Ref, useLayoutEffect, useMemo, useRef, useState } from "preact/hooks" +import { + Ref, + useEffect, + useLayoutEffect, + useMemo, + useRef, + useState, +} from "preact/hooks" import { CameraType, KeyInputs, @@ -24,8 +31,8 @@ import { Inventory } from "@/components/Inventory" import { GraphView, MovesList } from "./GraphView" import { pageAtom } from "@/routing" import { makeLevelHash } from "./hash" - -export const modelAtom = atom(null) +import { levelControlsAtom } from "@/levelData" +import { modelAtom } from "." export function openExaCCReal( _get: Getter, @@ -113,7 +120,7 @@ function LinearView(props: { model: LinearModel; inputs: KeyInputs }) {
@@ -121,12 +128,28 @@ function LinearView(props: { model: LinearModel; inputs: KeyInputs }) { } export function RealExaPlayerPage() { - const model = useAtomValue(modelAtom)! + const [model, setModel] = useAtom(modelAtom) + const setControls = useSetAtom(levelControlsAtom) const openExaCC = useJotaiFn(openExaCCgs) if (!model) { openExaCC() return <> } + useEffect(() => { + setControls({ + updateLevel: updateLevel, + restart: () => { + model.resetLevel() + updateLevel() + }, + }) + }, [model]) + useEffect(() => { + return () => { + setControls({}) + setModel(null) + } + }, []) const renderRef1 = useRef<() => void>() const renderRef2 = useRef<() => void>() function render() { @@ -162,7 +185,7 @@ export function RealExaPlayerPage() { function finalizeInput() { timer = null try { - model.addInput(inputRef.current, model.level) + model!.addInput(inputRef.current, model!.level) render() } finally { setInput(makeEmptyInputs()) diff --git a/gamePlayer/src/pages/ExaPlayerPage/index.tsx b/gamePlayer/src/pages/ExaPlayerPage/index.tsx index 1c7f1ebd..202a00d0 100644 --- a/gamePlayer/src/pages/ExaPlayerPage/index.tsx +++ b/gamePlayer/src/pages/ExaPlayerPage/index.tsx @@ -1,5 +1,9 @@ import { Suspense, lazy } from "preact/compat" +import type { LinearModel } from "./models/linear" +import type { GraphModel } from "./models/graph" +import { atom } from "jotai" +export const modelAtom = atom(null) const RealExaPlayerPage = lazy(() => import("./exaPlayer").then(mod => mod.RealExaPlayerPage) ) diff --git a/gamePlayer/src/pages/ExaPlayerPage/models/graph.ts b/gamePlayer/src/pages/ExaPlayerPage/models/graph.ts index 97005617..df2022c7 100644 --- a/gamePlayer/src/pages/ExaPlayerPage/models/graph.ts +++ b/gamePlayer/src/pages/ExaPlayerPage/models/graph.ts @@ -375,6 +375,9 @@ export class GraphModel { this.level = cloneLevel(closestSnapshot.level) pos.m.applyToLevel(this.level, [closestSnapshot.tick, pos.o]) } + resetLevel() { + this.goTo(this.rootNode) + } buildReferences() { this.nodeHashMap.clear() this.hashMap.clear() diff --git a/gamePlayer/src/pages/ExaPlayerPage/models/linear.ts b/gamePlayer/src/pages/ExaPlayerPage/models/linear.ts index 77e9a9cc..7019dc3a 100644 --- a/gamePlayer/src/pages/ExaPlayerPage/models/linear.ts +++ b/gamePlayer/src/pages/ExaPlayerPage/models/linear.ts @@ -63,11 +63,11 @@ export class MoveSequence { } } _add_tickLevel(input: KeyInputs, level: LevelState) { - level.gameInput = input - tickLevel(level) if ((this.tickLen + this.snapshotOffset) % SNAPSHOT_PERIOD === 0) { this.snapshots.push({ tick: this.tickLen, level: cloneLevel(level) }) } + level.gameInput = input + tickLevel(level) } add(input: KeyInputs, level: LevelState) { const ogInput = input @@ -97,7 +97,7 @@ export class MoveSequence { this.displayMoves.splice(...interval) this.userMoves.splice(...interval) this.snapshots = this.snapshots.filter( - snap => snap.tick >= interval[0] && snap.tick < interval[1] + snap => !(snap.tick >= interval[0] && snap.tick < interval[1]) ) } clone(): this { @@ -113,16 +113,67 @@ export class MoveSequence { return cloned } merge(other: this) { + const otherOffset = this.tickLen this.moves.push(...other.moves) this.displayMoves.push(...other.displayMoves) this.userMoves.push(...other.userMoves) + for (const oSnapshot of other.snapshots) { + this.snapshots.push({ ...oSnapshot, tick: oSnapshot.tick + otherOffset }) + } } } export class LinearModel { moveSeq = new MoveSequence() + offset = 0 constructor(public level: LevelState) {} addInput(inputs: KeyInputs, level: LevelState): void { - this.moveSeq.add(inputs, level) + if (this.offset !== this.moveSeq.tickLen) { + const newSeq = new MoveSequence() + newSeq.snapshotOffset = this.offset + newSeq.add(inputs, level) + if ( + newSeq.moves.every( + (m, idx) => m === this.moveSeq.moves[idx + this.offset] + ) + ) { + this.offset += newSeq.tickLen + } else { + this.moveSeq.trim([this.offset, Infinity]) + this.moveSeq.merge(newSeq) + this.offset = this.moveSeq.tickLen + } + } else { + this.moveSeq.add(inputs, level) + this.offset = this.moveSeq.tickLen + } + } + undo() { + if (this.offset === 0) return + this.offset = this.moveSeq.userMoves.slice(0, this.offset).lastIndexOf(true) + this.goTo(this.offset) + } + redo() { + const lastOffset = this.offset + const newOffset = this.moveSeq.userMoves + .slice(this.offset + 1) + .indexOf(true) + if (newOffset === -1) { + this.offset = this.moveSeq.tickLen + } else { + this.offset += newOffset + 1 + } + this.moveSeq.applyToLevel(this.level, [lastOffset, this.offset]) + } + goTo(pos: number): void { + this.offset = pos + const closestSnapshot: Snapshot = this.moveSeq.snapshots.find( + snap => snap.tick <= pos + )! + this.level = cloneLevel(closestSnapshot.level) + this.moveSeq.applyToLevel(this.level, [closestSnapshot.tick, pos]) + } + resetLevel() { + this.goTo(0) } } From a0f079c36ee728f352c864e5227317cf775deb6c Mon Sep 17 00:00:00 2001 From: Zee Date: Fri, 1 Mar 2024 14:00:52 +0200 Subject: [PATCH 084/233] ExaCC: Don't prune same-depth nodes when pruning backfeed --- gamePlayer/src/pages/ExaPlayerPage/models/graph.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gamePlayer/src/pages/ExaPlayerPage/models/graph.ts b/gamePlayer/src/pages/ExaPlayerPage/models/graph.ts index df2022c7..916adc41 100644 --- a/gamePlayer/src/pages/ExaPlayerPage/models/graph.ts +++ b/gamePlayer/src/pages/ExaPlayerPage/models/graph.ts @@ -410,17 +410,20 @@ export class GraphModel { } findBackfeedConns(): ConnPtr[] { const nodesToVisit: Node[] = [this.rootNode] + const visited: WeakSet = new WeakSet() + visited.add(this.rootNode) const backConns: ConnPtr[] = [] while (nodesToVisit.length > 0) { const node = nodesToVisit.shift()! for (const [tNode, conns] of node.outConns.entries()) { - if (node.rootDepth >= tNode.rootDepth || node === tNode) { + if (node.rootDepth > tNode.rootDepth || node === tNode) { for (const conn of conns) { backConns.push({ n: node, m: conn }) } } else { - if (!nodesToVisit.includes(tNode)) { + if (!visited.has(tNode)) { nodesToVisit.push(tNode) + visited.add(tNode) } } } From a0c4d6c55ef45574ab2e974955929fbdb734cd9b Mon Sep 17 00:00:00 2001 From: Zee Date: Fri, 1 Mar 2024 14:05:45 +0200 Subject: [PATCH 085/233] Don't accept ExaCC inputs when the level is lost or won --- gamePlayer/src/pages/ExaPlayerPage/exaPlayer.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gamePlayer/src/pages/ExaPlayerPage/exaPlayer.tsx b/gamePlayer/src/pages/ExaPlayerPage/exaPlayer.tsx index e31defa2..c22dcee6 100644 --- a/gamePlayer/src/pages/ExaPlayerPage/exaPlayer.tsx +++ b/gamePlayer/src/pages/ExaPlayerPage/exaPlayer.tsx @@ -12,6 +12,7 @@ import { } from "preact/hooks" import { CameraType, + GameState, KeyInputs, LevelData, LevelState, @@ -185,6 +186,7 @@ export function RealExaPlayerPage() { function finalizeInput() { timer = null try { + if (model?.level.gameState !== GameState.PLAYING) return model!.addInput(inputRef.current, model!.level) render() } finally { From de40469dc8d0bcf5a6c6e8a05bc82d129aebc3db Mon Sep 17 00:00:00 2001 From: Zee Date: Fri, 1 Mar 2024 21:55:25 +0200 Subject: [PATCH 086/233] Add custom camera controls for ExaCC --- gamePlayer/src/components/Dialog.tsx | 6 +- gamePlayer/src/components/DumbLevelPlayer.tsx | 51 +++--- .../src/components/GameRenderer/index.tsx | 14 +- gamePlayer/src/components/Inventory.tsx | 5 +- gamePlayer/src/components/Sidebar/index.tsx | 32 ++-- gamePlayer/src/index.css | 5 +- gamePlayer/src/levelData.tsx | 7 +- .../src/pages/ExaPlayerPage/GraphView.tsx | 2 +- .../src/pages/ExaPlayerPage/exaPlayer.tsx | 168 +++++++++++++----- gamePlayer/src/pages/ExaPlayerPage/index.tsx | 10 +- 10 files changed, 198 insertions(+), 102 deletions(-) diff --git a/gamePlayer/src/components/Dialog.tsx b/gamePlayer/src/components/Dialog.tsx index 98770ad3..eac3b3b1 100644 --- a/gamePlayer/src/components/Dialog.tsx +++ b/gamePlayer/src/components/Dialog.tsx @@ -2,6 +2,7 @@ import { applyRef } from "@/helpers" import { Ref } from "preact" import { ReactNode, forwardRef, useRef } from "preact/compat" import Draggable from "react-draggable" +import { twJoin } from "tailwind-merge" export const Dialog = forwardRef(function ( props: { @@ -18,7 +19,10 @@ export const Dialog = forwardRef(function ( return ( { if (props.notModal) { refVal?.show() diff --git a/gamePlayer/src/components/DumbLevelPlayer.tsx b/gamePlayer/src/components/DumbLevelPlayer.tsx index 742945f3..89eddb05 100644 --- a/gamePlayer/src/components/DumbLevelPlayer.tsx +++ b/gamePlayer/src/components/DumbLevelPlayer.tsx @@ -41,31 +41,34 @@ export interface AutoScaleConfig { safetyCoefficient?: number } -export function useAutoScale(args: AutoScaleConfig) { - const [scale, setScale] = useState(1) - function resize() { - const sidebar = document.querySelector("#sidebar") - if (!sidebar) return - const sidebarRect = sidebar.getBoundingClientRect() - const availableSize = document.body.getBoundingClientRect() - if (sidebarRect.width > sidebarRect.height) { - availableSize.height -= sidebarRect.height - } else { - availableSize.width -= sidebarRect.width - } - availableSize.width -= twUnit(args.twPadding?.[0] ?? 0) - availableSize.height -= twUnit(args.twPadding?.[1] ?? 0) - availableSize.width *= args.safetyCoefficient ?? 0.97 - availableSize.height *= args.safetyCoefficient ?? 0.97 +export function calcScale(args: AutoScaleConfig) { + const sidebar = document.querySelector("#sidebar") + if (!sidebar) return 1 + const sidebarRect = sidebar.getBoundingClientRect() + const availableSize = document.body.getBoundingClientRect() + if (sidebarRect.width > sidebarRect.height) { + availableSize.height -= sidebarRect.height + } else { + availableSize.width -= sidebarRect.width + } + availableSize.width -= twUnit(args.twPadding?.[0] ?? 0) + availableSize.height -= twUnit(args.twPadding?.[1] ?? 0) + availableSize.width *= args.safetyCoefficient ?? 0.97 + availableSize.height *= args.safetyCoefficient ?? 0.97 - const xTiles = args.cameraType.width + (args.tilePadding?.[0] ?? 0) - const yTiles = args.cameraType.height + (args.tilePadding?.[1] ?? 0) + const xTiles = args.cameraType.width + (args.tilePadding?.[0] ?? 0) + const yTiles = args.cameraType.height + (args.tilePadding?.[1] ?? 0) - const xScale = availableSize.width / (xTiles * args.tileSize) - const yScale = availableSize.height / (yTiles * args.tileSize) + const xScale = availableSize.width / (xTiles * args.tileSize) + const yScale = availableSize.height / (yTiles * args.tileSize) - const scale = Math.min(xScale, yScale) - setScale(Math.floor(scale)) + return Math.min(xScale, yScale) +} + +export function useAutoScale(args: AutoScaleConfig) { + const [scale, setScale] = useState(1) + function resize() { + setScale(Math.floor(calcScale(args))) } useLayoutEffect(() => { resize() @@ -183,9 +186,9 @@ export function DumbLevelPlayer(props: { controlsRef?: Ref }) { const tileset = useAtomValue(tilesetAtom) - if (!tileset) return
No tileset loaded.
+ // if (!tileset) return
No tileset loaded.
- const [playerState, setPlayerState] = useState("pregame") + const [playerState, setPlayerState] = useState("pregame" as PlayerState) // Inputs & LevelState const { inputs, releaseKeys, handler: inputHandler } = useKeyInputs() diff --git a/gamePlayer/src/components/GameRenderer/index.tsx b/gamePlayer/src/components/GameRenderer/index.tsx index 048af62e..38ea3eb5 100644 --- a/gamePlayer/src/components/GameRenderer/index.tsx +++ b/gamePlayer/src/components/GameRenderer/index.tsx @@ -4,7 +4,6 @@ import { CameraType, LevelState } from "@notcc/logic" import { Ref as RefG } from "preact" import { AnimationTimer, applyRef } from "@/helpers" import { twJoin } from "tailwind-merge" -import { memo } from "preact/compat" export interface GameRendererProps { tileset: Tileset @@ -16,9 +15,7 @@ export interface GameRendererProps { cameraType: CameraType } -export const GameRenderer = memo(function GameRenderer( - props: GameRendererProps -) { +export function GameRenderer(props: GameRendererProps) { const [canvas, setCanvas] = useState(null) const renderer = useMemo(() => new Renderer(props.tileset), []) @@ -48,17 +45,12 @@ export const GameRenderer = memo(function GameRenderer( }) return () => timer.cancel() }, [ctx, props.autoDraw]) - useLayoutEffect(() => { - if (ctx) { - renderer.frame(ctx) - } - }) const render = useCallback(() => { if ("current" in props.level) { renderer.level = props.level.current } renderer.frame(ctx!) - }, [ctx, props.level]) + }, [ctx, renderer, props.level]) useLayoutEffect(() => { if (!props.renderRef) return @@ -83,4 +75,4 @@ export const GameRenderer = memo(function GameRenderer( }} > ) -}) +} diff --git a/gamePlayer/src/components/Inventory.tsx b/gamePlayer/src/components/Inventory.tsx index e86577b9..79452de4 100644 --- a/gamePlayer/src/components/Inventory.tsx +++ b/gamePlayer/src/components/Inventory.tsx @@ -7,9 +7,8 @@ import { Frame, Tileset } from "./GameRenderer/renderer" import { Ref } from "preact" import { useCallback, useEffect, useMemo, useState } from "preact/hooks" import { applyRef } from "@/helpers" -import { memo } from "preact/compat" -export const Inventory = memo(function Inventory(props: { +export function Inventory(props: { inventory: InventoryI | { current: InventoryI } cc1Boots?: boolean tileScale: number @@ -123,4 +122,4 @@ export const Inventory = memo(function Inventory(props: { ref={ref => setCanvas(ref)} > ) -}) +} diff --git a/gamePlayer/src/components/Sidebar/index.tsx b/gamePlayer/src/components/Sidebar/index.tsx index 238c7007..8c37a5ac 100644 --- a/gamePlayer/src/components/Sidebar/index.tsx +++ b/gamePlayer/src/components/Sidebar/index.tsx @@ -24,8 +24,6 @@ import { PreferencesPrompt } from "../PreferencesPrompt" import isHotkey from "is-hotkey" import { openExaCC, toggleExaCC } from "@/pages/ExaPlayerPage/OpenExaPrompt" import { levelControlsAtom } from "@/levelData" -import { modelAtom } from "@/pages/ExaPlayerPage" -import type { GraphModel } from "@/pages/ExaPlayerPage/models/graph" interface SidebarAction { label: string @@ -236,7 +234,6 @@ function SidebarButton(props: { export function Sidebar() { const sidebarActions: SidebarAction[] = useRef([]).current const levelControls = useAtomValue(levelControlsAtom) - const exaModel = useAtomValue(modelAtom) const { get, set } = useStore() useEffect(() => { const listener = (ev: KeyboardEvent) => { @@ -252,7 +249,7 @@ export function Sidebar() { return () => { document.removeEventListener("keydown", listener) } - }, [levelControls, exaModel]) + }, [levelControls]) return (

f77bo)=iRjI%X* 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%0DV?c#)X*Q7jsD`GKj;hki_K8_gI-mB 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≥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