From eac573c68274b718ebd3381c0de3946541d4a3a4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 27 Feb 2025 10:34:17 +0200 Subject: [PATCH] first commit --- api/.env.example | 8 + api/.gitignore | 175 ++++++++++++++++++++++ api/README.md | 15 ++ api/bun.lockb | Bin 0 -> 37228 bytes api/index.ts | 117 +++++++++++++++ api/package.json | 17 +++ api/rcon.ts | 235 ++++++++++++++++++++++++++++++ api/tsconfig.json | 27 ++++ readme.md | 11 ++ website/.gitignore | 23 +++ website/.npmrc | 1 + website/README.md | 38 +++++ website/bun.lock | 219 ++++++++++++++++++++++++++++ website/package.json | 28 ++++ website/src/app.d.ts | 13 ++ website/src/app.html | 15 ++ website/src/lib/client.ts | 27 ++++ website/src/lib/index.ts | 38 +++++ website/src/routes/+layout.ts | 2 + website/src/routes/+page.svelte | 203 ++++++++++++++++++++++++++ website/static/Myfont-Regular.ttf | Bin 0 -> 29100 bytes website/static/favicon.png | Bin 0 -> 1571 bytes website/static/loading.gif | Bin 0 -> 8733 bytes website/svelte.config.js | 25 ++++ website/tsconfig.json | 19 +++ website/vite.config.ts | 6 + 26 files changed, 1262 insertions(+) create mode 100644 api/.env.example create mode 100644 api/.gitignore create mode 100644 api/README.md create mode 100755 api/bun.lockb create mode 100644 api/index.ts create mode 100644 api/package.json create mode 100644 api/rcon.ts create mode 100644 api/tsconfig.json create mode 100644 readme.md create mode 100644 website/.gitignore create mode 100644 website/.npmrc create mode 100644 website/README.md create mode 100644 website/bun.lock create mode 100644 website/package.json create mode 100644 website/src/app.d.ts create mode 100644 website/src/app.html create mode 100644 website/src/lib/client.ts create mode 100644 website/src/lib/index.ts create mode 100644 website/src/routes/+layout.ts create mode 100644 website/src/routes/+page.svelte create mode 100644 website/static/Myfont-Regular.ttf create mode 100644 website/static/favicon.png create mode 100644 website/static/loading.gif create mode 100644 website/svelte.config.js create mode 100644 website/tsconfig.json create mode 100644 website/vite.config.ts diff --git a/api/.env.example b/api/.env.example new file mode 100644 index 0000000..95e7c4c --- /dev/null +++ b/api/.env.example @@ -0,0 +1,8 @@ +prometheusHost=https://.. +prometheusPassword=.. +prometheusUsername=.. +rconHost=..:3000 +rconPassword=.. + +port=8499 +host=0.0.0.0 \ No newline at end of file diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/api/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..5479cd7 --- /dev/null +++ b/api/README.md @@ -0,0 +1,15 @@ +# api + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.42. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/api/bun.lockb b/api/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..c329b0fd646a9dec77f1ff69a80146a601390eef GIT binary patch literal 37228 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 literal 0 HcmV?d00001 diff --git a/api/index.ts b/api/index.ts new file mode 100644 index 0000000..a94bcc6 --- /dev/null +++ b/api/index.ts @@ -0,0 +1,117 @@ +/* + Ziedu Vija, armija, Ziedu Vija leģions + Pagāju garām es tavai kucei, zivju paviljons + Ēdu sēnes, šampinjons + Tu neēd neko, tu ir bomzis + Nomirs badā paļubom + Nomirs badā paļubom + + 2025 sad.ovh dev + +*/ + +import express, { type Request, type Response, type NextFunction } from 'express'; +import { InstantVector, PrometheusDriver, ResponseType, SampleValue } from 'prometheus-query'; +import { PacketType, Rcon } from "./rcon"; + +if(!process.env.prometheusHost) { + throw new Error("missing prometheus host") +} +if(process.env.prometheusUsername || process.env.prometheusPassword) { + if(!process.env.prometheusUsername) { + throw new Error("missing prometheus username") + } + if(!process.env.prometheusPassword) { + throw new Error("missing prometheus password") + } +} +if(!process.env.rconHost || !process.env.rconPassword) { + throw new Error("missing rcon host or rcon password") +} +const rcon = new Rcon(process.env.rconHost.split(":")[0], +process.env.rconHost.split(":")[1], process.env.rconPassword); +let rconReconnectTimeout: Timer | null | undefined; +let whitelistedPlayers: string[] = []; +let lastRequested = 0; + +const playerRegex = /There are \d* whitelisted player\(s\): /gm; + +rcon.on("connect", () => { + console.log("RCON connected."); +}); + +rcon.on("auth", () => { + console.log("RCON authenicated."); +}); + +rcon.on("response", (a: string) => { + if (playerRegex.test(a)) { + whitelistedPlayers = a.replace(playerRegex, "").split(", "); + } +}) + +rcon.on("end", () => { + console.log("RCON ended. Reconnecting in 2000ms.") + if(rconReconnectTimeout) { + clearTimeout(rconReconnectTimeout); + } + rconReconnectTimeout = setTimeout(() => { + rcon.connect() + }, 2000) +}) +const app = express(); + +//@ts-expect-error +app.use((req, res, next) => { + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + if (req.method === 'OPTIONS') { + return res.sendStatus(200); + } + next(); +}); + +const host = process.env.host || "localhost"; +const port = +(process.env.port || 3000); + +const prom = new PrometheusDriver({ + endpoint: process.env.prometheusHost, + auth: process.env.prometheusUsername ? { + username: process.env.prometheusUsername!, + password: process.env.prometheusPassword! + } : undefined +}) + +app.get("/api/getTps", async (req, res) => { + const query = await prom.instantQuery(`minecraft_tps`); + const value = (query.result[0] as InstantVector).value as SampleValue; + res.json(value.value) +}) + +app.get("/api/getPlayersOnline", async (req, res) => { + const query = await prom.instantQuery(`sum(minecraft_players_online{instance="172.18.0.1:25585", job="prometheus"})`); + const value = (query.result[0] as InstantVector).value as SampleValue; + res.json(value.value) +}) + +app.get("/api/uptime", async (req, res) => { + const query = await prom.instantQuery(`process_start_time_seconds`); + const value = (query.result[0] as InstantVector).value as SampleValue; + res.json(Date.now() - (value.value*1000)) +}) + +app.get("/api/whitelist", async (req, res) => { + if ( Date.now() - lastRequested > 60000) { + lastRequested = Date.now(); + rcon.send("whitelist list", PacketType.COMMAND); + rcon.once("response", () => { + res.json(whitelistedPlayers); + }); + } else { + res.json(whitelistedPlayers); + } +}) +app.listen(port, host, () => { + rcon.connect() + console.log(`Server is running on http://${host}:${port}`); +}); \ No newline at end of file diff --git a/api/package.json b/api/package.json new file mode 100644 index 0000000..2912ac0 --- /dev/null +++ b/api/package.json @@ -0,0 +1,17 @@ +{ + "name": "api", + "module": "index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@types/express": "^5.0.0", + "express": "^4.21.2", + "prometheus-query": "^3.4.1", + "typed-emitter": "^2.1.0" + } +} \ No newline at end of file diff --git a/api/rcon.ts b/api/rcon.ts new file mode 100644 index 0000000..bbe39a0 --- /dev/null +++ b/api/rcon.ts @@ -0,0 +1,235 @@ +import EventEmitter from "events"; +import * as net from "net"; +import * as dgram from "dgram"; +import { Buffer } from "buffer"; +import type TypedEmitter from "typed-emitter"; + +type Events = { + error: (error: Error) => void; + auth: () => void; + response: (response: string) => void; + connect: () => void; + end: () => void; + done: () => void; +}; + +export const PacketType = { + COMMAND: 0x02, + AUTH: 0x03, + RESPONSE_VALUE: 0x00, + RESPONSE_AUTH: 0x02, +}; + +interface Options { + tcp?: boolean; + challenge?: boolean; + id?: number; +} +export class Rcon extends (EventEmitter as new () => TypedEmitter) { + private host: string; + private port: number; + private password: string; + private rconId: number; + private hasAuthed: boolean; + private outstandingData: Uint8Array | null; + private tcp: boolean; + private challenge: boolean; + private _challengeToken: string; + private _tcpSocket!: net.Socket; + private _udpSocket!: dgram.Socket; + + constructor(host: string, port: number, password: string, options?: Options) { + super(); + options = options || {}; + this.host = host; + this.port = port; + this.password = password; + this.rconId = options.id || 0x0012d4a6; // This is arbitrary in most cases + this.hasAuthed = false; + this.outstandingData = null; + this.tcp = options.tcp ? options.tcp : true; + this.challenge = options.challenge ? options.challenge : true; + this._challengeToken = ""; + } + + public send = (data: string, cmd?: number, id?: number): void => { + let sendBuf: Buffer; + if (this.tcp) { + cmd = cmd || PacketType.COMMAND; + id = id || this.rconId; + + const length = Buffer.byteLength(data); + sendBuf = Buffer.alloc(length + 14); + sendBuf.writeInt32LE(length + 10, 0); + sendBuf.writeInt32LE(id, 4); + sendBuf.writeInt32LE(cmd, 8); + sendBuf.write(data, 12); + sendBuf.writeInt16LE(0, length + 12); + } else { + if (this.challenge && !this._challengeToken) { + this.emit("error", new Error("Not authenticated")); + return; + } + let str = "rcon "; + if (this._challengeToken) str += this._challengeToken + " "; + if (this.password) str += this.password + " "; + str += data + "\n"; + sendBuf = Buffer.alloc(4 + Buffer.byteLength(str)); + sendBuf.writeInt32LE(-1, 0); + sendBuf.write(str, 4); + } + this._sendSocket(sendBuf); + }; + + private _sendSocket = (buf: Buffer) => { + if (this._tcpSocket) { + this._tcpSocket.write(buf.toString("binary"), "binary"); + } else if (this._udpSocket) { + this._udpSocket.send(buf, 0, buf.length, this.port, this.host); + } + }; + + public connect = (): void => { + if (this.tcp) { + this._tcpSocket = net.createConnection(this.port, this.host); + this._tcpSocket.on("data", (data) => { + this._tcpSocketOnData(data); + }); + this._tcpSocket.on("connect", () => { + this.socketOnConnect(); + }); + this._tcpSocket.on("error", (err) => { + //this.emit("error", err); + this.socketOnEnd() + }); + this._tcpSocket.on("end", () => { + this.socketOnEnd(); + }); + } else { + this._udpSocket = dgram.createSocket("udp4"); + this._udpSocket + .on("message", (data) => { + this._udpSocketOnData(data); + }) + .on("listening", () => { + this.socketOnConnect(); + }) + .on("error", (err) => { + this.emit("error", err); + }) + .on("close", () => { + this.socketOnEnd(); + }); + this._udpSocket.bind(0); + } + }; + + public disconnect = (): void => { + if (this._tcpSocket) this._tcpSocket.end(); + if (this._udpSocket) this._udpSocket.close(); + }; + + public setTimeout = (timeout: number, callback: () => void): void => { + if (!this._tcpSocket) return; + this._tcpSocket.setTimeout(timeout, () => { + this._tcpSocket.end(); + if (callback) callback(); + }); + }; + + private _udpSocketOnData = (data: Buffer) => { + const a = data.readUInt32LE(0); + if (a === 0xffffffff) { + const str = data.toString("utf-8", 4); + const tokens = str.split(" "); + if ( + tokens.length === 3 && + tokens[0] === "challenge" && + tokens[1] === "rcon" + ) { + this._challengeToken = tokens[2] + .substring(0, tokens[2].length - 1) + .trim(); + this.hasAuthed = true; + this.emit("auth"); + } else { + this.emit("response", str.substring(1, str.length - 2)); + } + } else { + this.emit("error", new Error("Received malformed packet")); + } + }; + + private _tcpSocketOnData = (data: Buffer) => { + if (this.outstandingData != null) { + data = Buffer.concat( + [this.outstandingData, data], + this.outstandingData.length + data.length + ); + this.outstandingData = null; + } + + while (data.length) { + const len = data.readInt32LE(0); + if (!len) return; + + const id = data.readInt32LE(4); + const type = data.readInt32LE(8); + + if (len >= 10 && data.length >= len + 4) { + if (id === this.rconId) { + if (!this.hasAuthed && type === PacketType.RESPONSE_AUTH) { + this.hasAuthed = true; + this.emit("auth"); + } else if (type === PacketType.RESPONSE_VALUE) { + // Read just the body of the packet (truncate the last null byte) + // See https://developer.valvesoftware.com/wiki/Source_RCON_Protocol for details + let str = data.toString("utf8", 12, 12 + len - 10); + + if (str.charAt(str.length - 1) === "\n") { + // Emit the response without the newline. + str = str.substring(0, str.length - 1); + } + + this.emit("response", str); + } + } else { + this.emit("error", new Error("Authentication failed")); + } + + data = data.slice(12 + len - 8); + } else { + // Keep a reference to the chunk if it doesn't represent a full packet + this.outstandingData = data; + break; + } + } + }; + + public socketOnConnect = (): void => { + this.emit("connect"); + + if (this.tcp) { + this.send(this.password, PacketType.AUTH); + } else if (this.challenge) { + const str = "challenge rcon\n"; + const sendBuf = Buffer.alloc(str.length + 4); + sendBuf.writeInt32LE(-1, 0); + sendBuf.write(str, 4); + this._sendSocket(sendBuf); + } else { + const sendBuf = Buffer.alloc(5); + sendBuf.writeInt32LE(-1, 0); + sendBuf.writeUInt8(0, 4); + this._sendSocket(sendBuf); + + this.hasAuthed = true; + this.emit("auth"); + } + }; + + public socketOnEnd = (): void => { + this.emit("end"); + this.hasAuthed = false; + }; +} \ No newline at end of file diff --git a/api/tsconfig.json b/api/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/api/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..82ae8ce --- /dev/null +++ b/readme.md @@ -0,0 +1,11 @@ +# slop website monorepo + +| Subdirectory | Description | | +|--------------|---------------------------------------------------------------------------------------------|---| +| api | This is the API for the website. It's routes are very simple, you can see in index.ts them. | | +| website | The website. It uses svelte, and is very simple, single page PWA. | | +| | | | + + +- API: Run via `cd api; bun run index.ts`, available at port 3000 by default, change with environment variable PORT. Make sure that .env is filled with required info. Check `.env.example`. +- Website: Run `bun run build`, copy `build/` to webroot. api.slop.live is used by default, you can use a different API link. \ No newline at end of file diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000..3b462cb --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/website/.npmrc b/website/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/website/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..b5b2950 --- /dev/null +++ b/website/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```bash +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```bash +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```bash +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/website/bun.lock b/website/bun.lock new file mode 100644 index 0000000..e7b939c --- /dev/null +++ b/website/bun.lock @@ -0,0 +1,219 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "slopsite", + "dependencies": { + "@sveltejs/adapter-static": "^3.0.8", + "@types/ms": "^2.1.0", + "ms": "^2.1.3", + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^4.0.0", + "@sveltejs/kit": "^2.16.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "^5.0.0", + "vite": "^6.0.0", + }, + }, + }, + "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@polka/url": ["@polka/url@1.0.0-next.28", "", {}, "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.34.8", "", { "os": "android", "cpu": "arm" }, "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.34.8", "", { "os": "android", "cpu": "arm64" }, "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.34.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.34.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.34.8", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.34.8", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.34.8", "", { "os": "linux", "cpu": "arm" }, "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.34.8", "", { "os": "linux", "cpu": "arm" }, "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.34.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.34.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.34.8", "", { "os": "linux", "cpu": "none" }, "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.34.8", "", { "os": "linux", "cpu": "ppc64" }, "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.34.8", "", { "os": "linux", "cpu": "none" }, "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.34.8", "", { "os": "linux", "cpu": "s390x" }, "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.34.8", "", { "os": "linux", "cpu": "x64" }, "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.34.8", "", { "os": "linux", "cpu": "x64" }, "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.34.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.34.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.34.8", "", { "os": "win32", "cpu": "x64" }, "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g=="], + + "@sveltejs/adapter-auto": ["@sveltejs/adapter-auto@4.0.0", "", { "dependencies": { "import-meta-resolve": "^4.1.0" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-kmuYSQdD2AwThymQF0haQhM8rE5rhutQXG4LNbnbShwhMO4qQGnKaaTy+88DuNSuoQDi58+thpq8XpHc1+oEKQ=="], + + "@sveltejs/adapter-static": ["@sveltejs/adapter-static@3.0.8", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-YaDrquRpZwfcXbnlDsSrBQNCChVOT9MGuSg+dMAyfsAa1SmiAhrA5jUYUiIMC59G92kIbY/AaQOWcBdq+lh+zg=="], + + "@sveltejs/kit": ["@sveltejs/kit@2.17.2", "", { "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^0.6.0", "devalue": "^5.1.0", "esm-env": "^1.2.2", "import-meta-resolve": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0" }, "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-Vypk02baf7qd3SOB1uUwUC/3Oka+srPo2J0a8YN3EfJypRshDkNx9HzNKjSmhOnGWwT+SSO06+N0mAb8iVTmTQ=="], + + "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@5.0.3", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.0", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.15", "vitefu": "^1.0.4" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw=="], + + "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@4.0.1", "", { "dependencies": { "debug": "^4.3.7" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^5.0.0", "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw=="], + + "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], + + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + + "acorn-typescript": ["acorn-typescript@1.4.13", "", { "peerDependencies": { "acorn": ">=8.9.0" } }, "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q=="], + + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], + + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="], + + "esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + + "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], + + "esrap": ["esrap@1.4.5", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-CjNMjkBWWZeHn+VX+gS8YvFwJ5+NDhg8aWZBSFJPR8qQduDNjbJodA2WcwCm7uQa5Rjqj+nZvVmceg1RbHFB9g=="], + + "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "import-meta-resolve": ["import-meta-resolve@4.1.0", "", {}, "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw=="], + + "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], + + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + + "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "rollup": ["rollup@4.34.8", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.34.8", "@rollup/rollup-android-arm64": "4.34.8", "@rollup/rollup-darwin-arm64": "4.34.8", "@rollup/rollup-darwin-x64": "4.34.8", "@rollup/rollup-freebsd-arm64": "4.34.8", "@rollup/rollup-freebsd-x64": "4.34.8", "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", "@rollup/rollup-linux-arm-musleabihf": "4.34.8", "@rollup/rollup-linux-arm64-gnu": "4.34.8", "@rollup/rollup-linux-arm64-musl": "4.34.8", "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", "@rollup/rollup-linux-riscv64-gnu": "4.34.8", "@rollup/rollup-linux-s390x-gnu": "4.34.8", "@rollup/rollup-linux-x64-gnu": "4.34.8", "@rollup/rollup-linux-x64-musl": "4.34.8", "@rollup/rollup-win32-arm64-msvc": "4.34.8", "@rollup/rollup-win32-ia32-msvc": "4.34.8", "@rollup/rollup-win32-x64-msvc": "4.34.8", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ=="], + + "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + + "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], + + "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "svelte": ["svelte@5.20.3", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "acorn-typescript": "^1.4.13", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^1.4.3", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-8eE+/KXZP5tAYEefOG4eIvElARIrnh+IXJq2e+OM7hmhuZDk9yf7esrVD1YBxUtk5eqYBDYtvu628h71iFrXiA=="], + + "svelte-check": ["svelte-check@4.1.4", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw=="], + + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], + + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + + "vite": ["vite@6.1.1", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.5.2", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA=="], + + "vitefu": ["vitefu@1.0.6", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["vite"] }, "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA=="], + + "zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="], + } +} diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..65c6618 --- /dev/null +++ b/website/package.json @@ -0,0 +1,28 @@ +{ + "name": "slopsite", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^4.0.0", + "@sveltejs/kit": "^2.16.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "^5.0.0", + "vite": "^6.0.0" + }, + "dependencies": { + "@sveltejs/adapter-static": "^3.0.8", + "@types/ms": "^2.1.0", + "ms": "^2.1.3" + } +} diff --git a/website/src/app.d.ts b/website/src/app.d.ts new file mode 100644 index 0000000..da08e6d --- /dev/null +++ b/website/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/website/src/app.html b/website/src/app.html new file mode 100644 index 0000000..f698385 --- /dev/null +++ b/website/src/app.html @@ -0,0 +1,15 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + + diff --git a/website/src/lib/client.ts b/website/src/lib/client.ts new file mode 100644 index 0000000..84507e2 --- /dev/null +++ b/website/src/lib/client.ts @@ -0,0 +1,27 @@ +import { dev } from "$app/environment" +export class Client { + private static async sendRequest(path: string) { + let endpoint; + if(dev) { + endpoint = "http://localhost:3000/" + } else { + endpoint = "https://api.slop.live/" + } + + const req = await fetch(endpoint + path) + return await req.json() + } + + static async tps() { + return await this.sendRequest("api/getTps") + } + static async players() { + return await this.sendRequest("api/getPlayersOnline") + } + static async uptime() { + return await this.sendRequest("api/uptime") + } + static async whitelist(): Promise { + return await this.sendRequest("api/whitelist") + } +} \ No newline at end of file diff --git a/website/src/lib/index.ts b/website/src/lib/index.ts new file mode 100644 index 0000000..b133aa5 --- /dev/null +++ b/website/src/lib/index.ts @@ -0,0 +1,38 @@ +// place files you want to import through the `$lib` alias in this folder. +export const mods = `[audioplayer] audioplayer-fabric-1.21.4-1.13.2.jar +[carpet-tis-addition] carpet-tis-addition-v1.65.0-mc1.21.4.jar +[chunky] Chunky-Fabric-1.4.27.jar +[cloth-config] cloth-config-17.0.144-fabric.jar +[collective] collective-1.21.4-7.89.jar +[dcintegration] dcintegration-fabric-MC1.21.3-3.1.0.1.jar +[easy-elevators] easyelevators-1.21.4-1.2.jar +[fabric-api] fabric-api-0.114.0+1.21.4.jar +[fabric-language-kotlin] fabric-language-kotlin-1.13.0+kotlin.2.1.0.jar +[fabricproxy-lite] FabricProxy-Lite-2.9.0.jar +[ferrite-core] ferritecore-7.1.1-fabric.jar +[forge-config-api-port] ForgeConfigAPIPort-v21.4.1-1.21.4-Fabric.jar +[htm] htm-1.1.15.jar +[just-player-heads] justplayerheads-1.21.4-4.1.jar +[krypton] krypton-0.2.8.jar +[lithium] lithium-fabric-0.14.3+mc1.21.4.jar +[luckperms] LuckPerms-Fabric-5.4.150.jar +[modernfix] modernfix-fabric-5.20.1+mc1.21.4.jar +[mods-command] mods-command-mc1.21.4-1.1.9.jar +[nullscape] Nullscape_1.21.x_v1.2.10.jar +[ouch] ouch-1.3.1+1.21.4.jar +[pl3xmap] Pl3xMap-1.21.4-520.jar +[polydex] polydex-1.4.0+1.21.4-rc3.jar +[simple-voice-chat] voicechat-fabric-1.21.4-2.5.27.jar +[spark] spark-1.10.121-fabric.jar +[terralith] Terralith_1.21.x_v2.5.7.jar +[tt20] tt20-0.7.1+mc1.21.2.jar +[universal-graves] graves-3.6.0+1.21.4.jar +[vmp-fabric] vmp-fabric-mc1.21.4-0.2.0+beta.7.187-all.jar +[worldedit] worldedit-mod-7.3.10-beta-01.jar +carpet-extra-1.21.4-1.4.161.jar +fabric-carpet-1.21.4-1.4.161+v241203.jar +fabricexporter-1.0.14.jar +fuji-6.3.0-4ad808f4ae-mc1.21.4.jar +NoChatReports-FABRIC-1.21.4-v2.11.0.jar +reply-1.0.0.jar +servux-fabric-1.21.4-0.5.1.jar`.split("\n"); \ No newline at end of file diff --git a/website/src/routes/+layout.ts b/website/src/routes/+layout.ts new file mode 100644 index 0000000..09a24d3 --- /dev/null +++ b/website/src/routes/+layout.ts @@ -0,0 +1,2 @@ +export const ssr = false; +export const prerender = true; \ No newline at end of file diff --git a/website/src/routes/+page.svelte b/website/src/routes/+page.svelte new file mode 100644 index 0000000..a53ff0e --- /dev/null +++ b/website/src/routes/+page.svelte @@ -0,0 +1,203 @@ + + +
+ {#if loading} +

loading...

+ loading + {:else} +

Slop Minecraft Server

+ +
+
+

current info

+
+
    +
  • players: {players}
  • +
  • tps: {tps.toFixed(2)}
  • +
  • uptime: {uptime}
  • +
+ this server is heavily whitelisted; to join +
    +
  1. find someone to give you a invite to the discord server
  2. +
  3. join the server
  4. +
  5. send your username in #igns (this server is not cracked)
  6. +
+
+
+
+

info

+
+
+

The SMP uses the following datapacks: Terralith, Nullscape, Blaze and Caves Advancements pack, Invisible Item Frames, Copper Boosted Rails.

+

We also have several server-side mods which you can view using /mods. You do not need any mods to join, you can play on a vanilla client. Most of them provide certain commands or aid in performance:

+
    +
  • There is a chest locking mod to prevent stealing, /htm set private to lock a chest.
  • +
  • There is a graves mod, graves do not despawn. This is to prevent accidentally losing items.
  • +
+

Using client-side optimization mods is completely fine. Most client side mods that do not alter game mechanics and do not give an advantage are fine. If you're unsure about if a certain mod is allowed, feel free to ask a staff member. Xaero's world map is only allowed if you use the fair-play version.

+

We have a world map at https://map.slop.live/. Use /map hide or /map show to hide or show yourself.

+

Server chat can be viewed in #gateway, you can send discord messages and people on the server will see them too.

+
+
+
+
+

rules

+
+ +
    +
  1. Do not hack; Do not use mods that provide considerable unfair advantages
    + - What is a considerable unfair advantage? A considerable unfair advantage is anything that gives you a large edge, ability, greatly speeds up, etc. over other players using means that are not possible within vanilla Minecraft. +
  2. +
  3. + Do not grief, steal, and do not use other people's farms, builds and creations without their explicit permission prior to your use. +
  4. +
  5. + Do not use alts. +
  6. +
  7. + Use common sense.
    + - Do not be an asshole to other people, treat others with respect. Starting unnecessary drama falls into this. +
  8. +
  9. + The seed is not publicly available and using it to find structures, biomes, or anything else is not allowed. Please do NOT use it. The server map exists for this. +
  10. +
+ This is a decently small SMP so we'll give people the benefit of the doubt when possible, we can make certain exceptions, but please do not try to find loopholes. TL;DR: Don't hack, don't steal, use common sense and be nice.
+
+ +
+

info

+
+

Mods

+
    + {#each mods as mod} +
  • {mod}
  • + {/each} +
+

Players

+
    + {#each whitelist as player} +
  • {player}
  • + {/each} +
+ + + +
+
+
+ {/if} +
+ + diff --git a/website/static/Myfont-Regular.ttf b/website/static/Myfont-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..eaba6eace8529fce3f42f5dce4a00bf3c84cec94 GIT binary patch literal 29100 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 literal 0 HcmV?d00001 diff --git a/website/svelte.config.js b/website/svelte.config.js new file mode 100644 index 0000000..2cc0282 --- /dev/null +++ b/website/svelte.config.js @@ -0,0 +1,25 @@ +import adapter from '@sveltejs/adapter-static'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter({ + // default options are shown. On some platforms + // these options are set automatically — see below + pages: 'build', + assets: 'build', + fallback: undefined, + precompress: false, + strict: true + }) + } +}; + +export default config; diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 0000000..0b2d886 --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/website/vite.config.ts b/website/vite.config.ts new file mode 100644 index 0000000..bbf8c7d --- /dev/null +++ b/website/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +});