diff --git a/.env b/.env index 1a9a954e..108ec863 100644 --- a/.env +++ b/.env @@ -2,12 +2,8 @@ NODE_PATH=src PUBLIC_SITE_NAME=OpenShock PUBLIC_SITE_DESCRIPTION=a free and open-source ecosystem to control various shock collars over the internet. -PUBLIC_SITE_DOMAIN=openshock.app -PUBLIC_SITE_SHORT_DOMAIN=openshock.app -PUBLIC_BACKEND_API_DOMAIN=api.openshock.app PUBLIC_GITHUB_PROJECT_URL=https://github.com/OpenShock PUBLIC_DISCORD_INVITE_URL=https://discord.gg/OpenShock -PUBLIC_SENTRY_DSN=INVALID PUBLIC_TURNSTILE_SITE_KEY=INVALID -PUBLIC_TURNSTILE_DEV_BYPASS_VALUE=dev-bypass +PUBLIC_TURNSTILE_DEV_BYPASS_VALUE=INVALID \ No newline at end of file diff --git a/.env.development b/.env.development index 6f02eb49..536d4ca2 100644 --- a/.env.development +++ b/.env.development @@ -1,5 +1,6 @@ -# Sentry -PUBLIC_SENTRY_ENABLED=false -PUBLIC_SENTRY_TRACES_SAMPLERATE=1.0 -PUBLIC_SENTRY_REPLAYS_SESSION_SAMPLERATE=0.1 -PUBLIC_SENTRY_REPLAYS_ONERROR_SAMPLERATE=1.0 +PUBLIC_SITE_DOMAIN=openshock.dev +PUBLIC_SITE_SHORT_DOMAIN=openshock.dev +PUBLIC_BACKEND_API_DOMAIN=api.openshock.dev +PUBLIC_GATEWAY_CSP_WILDCARD=*.openshock.dev + +PUBLIC_TURNSTILE_DEV_BYPASS_VALUE=dev-bypass \ No newline at end of file diff --git a/.env.production b/.env.production index c0df1f2b..3c171d7c 100644 --- a/.env.production +++ b/.env.production @@ -1,5 +1,4 @@ -# Sentry -PUBLIC_SENTRY_ENABLED=true -PUBLIC_SENTRY_TRACES_SAMPLERATE=0.1 -PUBLIC_SENTRY_REPLAYS_SESSION_SAMPLERATE=0.1 -PUBLIC_SENTRY_REPLAYS_ONERROR_SAMPLERATE=0.1 +PUBLIC_SITE_DOMAIN=openshock.app +PUBLIC_SITE_SHORT_DOMAIN=openshock.app +PUBLIC_BACKEND_API_DOMAIN=api.openshock.app +PUBLIC_GATEWAY_CSP_WILDCARD=*.openshock.app \ No newline at end of file diff --git a/.env.test b/.env.test new file mode 100644 index 00000000..b26f5310 --- /dev/null +++ b/.env.test @@ -0,0 +1,6 @@ +PUBLIC_SITE_DOMAIN=openshock.dev +PUBLIC_SITE_SHORT_DOMAIN=openshock.dev +PUBLIC_BACKEND_API_DOMAIN=api.openshock.dev +PUBLIC_GATEWAY_CSP_WILDCARD=*.openshock.dev + +PUBLIC_TURNSTILE_DEV_BYPASS_VALUE=dev-bypass diff --git a/.github/actions/containerize/action.yml b/.github/actions/containerize/action.yml index 86afa088..64832074 100644 --- a/.github/actions/containerize/action.yml +++ b/.github/actions/containerize/action.yml @@ -20,7 +20,6 @@ inputs: runs: using: composite steps: - - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -53,3 +52,5 @@ runs: push: ${{ inputs.push-image }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + build-args: | + GIT_HASH=${{ github.sha }} diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 8130a895..eb1b4852 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -20,7 +20,7 @@ jobs: - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 9 + version: 9.12.3 run_install: false - name: Install Node.js @@ -43,7 +43,8 @@ jobs: - name: Test shell: bash - run: pnpm test + #run: pnpm test # TODO: Fix intehration tests + run: pnpm test:unit build-container: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 5999e9d0..f3b8bd6d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .DS_Store node_modules +.idea /build /.svelte-kit /package diff --git a/.prettierignore b/.prettierignore index 38972655..bd2824ee 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,7 +2,11 @@ node_modules /build /.svelte-kit +/.vscode /package +/src/lib/api/internal +/src/lib/components/ui +/static .env .env.* !.env.example diff --git a/.prettierrc b/.prettierrc index e829f84e..72e74c4f 100644 --- a/.prettierrc +++ b/.prettierrc @@ -5,7 +5,7 @@ "singleQuote": true, "trailingComma": "es5", "printWidth": 100, - "plugins": ["prettier-plugin-svelte"], + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], "overrides": [ { "files": "*.svelte", "options": { "parser": "svelte" } }, { "files": "package*.json", "options": { "tabWidth": 2, "useTabs": true } } diff --git a/Dockerfile b/Dockerfile index c91ac793..0772ed2d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,14 @@ ARG NODE_VERSION=20 -ARG PNPM_VERSION=9.12.2 +ARG PNPM_VERSION=9.12.3 ARG ALPINE_VERSION=3.20 +ARG GIT_HASH FROM node:${NODE_VERSION}-alpine${ALPINE_VERSION} AS build WORKDIR /app ENV DOCKER=true ENV PNPM_VERSION=${PNPM_VERSION} +ENV GIT_HASH=${GIT_HASH} RUN wget -qO /bin/pnpm "https://github.com/pnpm/pnpm/releases/latest/download/pnpm-linuxstatic-x64" && chmod +x /bin/pnpm @@ -26,6 +28,7 @@ WORKDIR /app ENV DOCKER=true ENV NODE_ENV=production ENV PNPM_VERSION=${PNPM_VERSION} +ENV GIT_HASH=${GIT_HASH} RUN wget -qO /bin/pnpm "https://github.com/pnpm/pnpm/releases/latest/download/pnpm-linuxstatic-x64" && chmod +x /bin/pnpm diff --git a/README.md b/README.md index 73b4749d..0e9ff445 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,8 @@ This is the frontend for the OpenShock project that interfaces with the OpenShoc ![Typescript](https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white) ![Vite](https://img.shields.io/badge/Vite-646CFF?style=for-the-badge&logo=vite&logoColor=white) -![SveltKit](https://img.shields.io/badge/SvelteKit-4A4A55?style=for-the-badge&logo=svelte&logoColor=FF3E00) -![Skeleton UI](https://img.shields.io/badge/💀_Skeleton_UI-646CFF?style=for-the-badge&logoColor=white) +![SvelteKit](https://img.shields.io/badge/SvelteKit-4A4A55?style=for-the-badge&logo=svelte&logoColor=FF3E00) +![shadcn-ui](https://img.shields.io/badge/shadcn/ui-000?style=for-the-badge&logo=shadcnui&logoColor=orange) ![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=for-the-badge&logo=tailwind-css&logoColor=white) ## Available Commands @@ -40,16 +40,19 @@ We recommend using a version manager like [Volta](https://docs.volta.sh/guide/ge ### Install Node.js and pnpm Install on Linux: + ```bash curl https://get.volta.sh | bash ``` Install on Windows: + ```pwsh winget install Volta.Volta ``` Then you can install the required **Node.js** and **pnpm** version by running a single command in the repository root directory: + ```bash volta install node volta install pnpm @@ -67,6 +70,7 @@ pnpm run build ## Running locally Running the frontend locally is as simple as this: + ```bash pnpm run dev ``` @@ -74,6 +78,7 @@ pnpm run dev ### Hosts redirect If you do not have a hosts file config for your domain and try to run the project you will get the following example message: + ``` Please ensure that local.openshock.app resolves to 127.0.0.1 in your hosts file @@ -92,4 +97,4 @@ Try closing and re-opening your development environment or console to refresh it ## Support -You can support the openshock dev team here: [Sponsor OpenShock](https://github.com/sponsors/OpenShock) \ No newline at end of file +You can support the openshock dev team here: [Sponsor OpenShock](https://github.com/sponsors/OpenShock) diff --git a/components.json b/components.json new file mode 100644 index 00000000..7c6deac5 --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://next.shadcn-svelte.com/schema.json", + "style": "default", + "tailwind": { + "config": "tailwind.config.ts", + "css": "src\\app.postcss", + "baseColor": "neutral" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks" + }, + "typescript": true, + "registry": "https://next.shadcn-svelte.com/registry" +} diff --git a/eslint.config.js b/eslint.config.js index cc3bf082..d73b8871 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,34 +1,35 @@ -import prettier from "eslint-config-prettier"; +import prettier from 'eslint-config-prettier'; import js from '@eslint/js'; +import { includeIgnoreFile } from '@eslint/compat'; import svelte from 'eslint-plugin-svelte'; import globals from 'globals'; +import { fileURLToPath } from 'node:url'; import ts from 'typescript-eslint'; +const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); export default ts.config( + includeIgnoreFile(gitignorePath), js.configs.recommended, ...ts.configs.recommended, - ...svelte.configs["flat/recommended"], + ...svelte.configs['flat/recommended'], prettier, ...svelte.configs['flat/prettier'], { languageOptions: { - globals: { - ...globals.browser, - ...globals.node - } - } + globals: { + ...globals.browser, + ...globals.node, + }, + }, }, { - files: ["**/*.svelte"], + files: ['**/*.svelte'], languageOptions: { - parserOptions: { - parser: ts.parser, - ecmaVersion: 2020 - } - } - }, - { - ignores: ["build/", ".svelte-kit/", "dist/"] + parserOptions: { + parser: ts.parser, + ecmaVersion: 2020, + }, + }, } ); diff --git a/openapitools.json b/openapitools.json index 19305671..96f3ad7a 100644 --- a/openapitools.json +++ b/openapitools.json @@ -2,7 +2,7 @@ "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", "spaces": 2, "generator-cli": { - "version": "7.9.0", + "version": "7.10.0", "generators": { "v1": { "inputSpec": "https://api.openshock.app/swagger/1/swagger.json", @@ -12,9 +12,10 @@ "supportsES6": true, "stringEnums": true, "withInterfaces": true, - "enumPropertyNaming": "camelCase", + "paramNaming": "camelCase", + "enumPropertyNaming": "PascalCase", "modelPropertyNaming": "camelCase", - "enumUnknownDefaultCase": true, + "enumUnknownDefaultCase": false, "useSingleRequestParameter": false } }, @@ -26,9 +27,10 @@ "supportsES6": true, "stringEnums": true, "withInterfaces": true, - "enumPropertyNaming": "camelCase", + "paramNaming": "camelCase", + "enumPropertyNaming": "PascalCase", "modelPropertyNaming": "camelCase", - "enumUnknownDefaultCase": true, + "enumUnknownDefaultCase": false, "useSingleRequestParameter": false } } diff --git a/openshock-theme.ts b/openshock-theme.ts deleted file mode 100644 index 770004ac..00000000 --- a/openshock-theme.ts +++ /dev/null @@ -1,101 +0,0 @@ -import type { CustomThemeConfig } from '@skeletonlabs/tw-plugin'; - -export const openshockTheme: CustomThemeConfig = { - name: 'openshock', - properties: { - // =~= Theme Properties =~= - '--theme-font-family-base': `system-ui`, - '--theme-font-family-heading': `system-ui`, - '--theme-font-color-base': '0 0 0', - '--theme-font-color-dark': '255 255 255', - '--theme-rounded-base': '9999px', - '--theme-rounded-container': '12px', - '--theme-border-base': '1px', - // =~= Theme On-X Colors =~= - '--on-primary': '0 0 0', - '--on-secondary': '255 255 255', - '--on-tertiary': '0 0 0', - '--on-success': '0 0 0', - '--on-warning': '0 0 0', - '--on-error': '255 255 255', - '--on-surface': '255 255 255', - // =~= Theme Colors =~= - // primary | #ff5c82 - '--color-primary-50': '255 231 236', // #ffe7ec - '--color-primary-100': '255 222 230', // #ffdee6 - '--color-primary-200': '255 214 224', // #ffd6e0 - '--color-primary-300': '255 190 205', // #ffbecd - '--color-primary-400': '255 141 168', // #ff8da8 - '--color-primary-500': '255 92 130', // #ff5c82 - '--color-primary-600': '230 83 117', // #e65375 - '--color-primary-700': '191 69 98', // #bf4562 - '--color-primary-800': '153 55 78', // #99374e - '--color-primary-900': '125 45 64', // #7d2d40 - // secondary | #463eda - '--color-secondary-50': '227 226 249', // #e3e2f9 - '--color-secondary-100': '218 216 248', // #dad8f8 - '--color-secondary-200': '209 207 246', // #d1cff6 - '--color-secondary-300': '181 178 240', // #b5b2f0 - '--color-secondary-400': '126 120 229', // #7e78e5 - '--color-secondary-500': '70 62 218', // #463eda - '--color-secondary-600': '63 56 196', // #3f38c4 - '--color-secondary-700': '53 47 164', // #352fa4 - '--color-secondary-800': '42 37 131', // #2a2583 - '--color-secondary-900': '34 30 107', // #221e6b - // tertiary | #33b8ff - '--color-tertiary-50': '224 244 255', // #e0f4ff - '--color-tertiary-100': '214 241 255', // #d6f1ff - '--color-tertiary-200': '204 237 255', // #ccedff - '--color-tertiary-300': '173 227 255', // #ade3ff - '--color-tertiary-400': '112 205 255', // #70cdff - '--color-tertiary-500': '51 184 255', // #33b8ff - '--color-tertiary-600': '46 166 230', // #2ea6e6 - '--color-tertiary-700': '38 138 191', // #268abf - '--color-tertiary-800': '31 110 153', // #1f6e99 - '--color-tertiary-900': '25 90 125', // #195a7d - // success | #03c200 - '--color-success-50': '217 246 217', // #d9f6d9 - '--color-success-100': '205 243 204', // #cdf3cc - '--color-success-200': '192 240 191', // #c0f0bf - '--color-success-300': '154 231 153', // #9ae799 - '--color-success-400': '79 212 77', // #4fd44d - '--color-success-500': '3 194 0', // #03c200 - '--color-success-600': '3 175 0', // #03af00 - '--color-success-700': '2 146 0', // #029200 - '--color-success-800': '2 116 0', // #027400 - '--color-success-900': '1 95 0', // #015f00 - // warning | #ff7300 - '--color-warning-50': '255 234 217', // #ffead9 - '--color-warning-100': '255 227 204', // #ffe3cc - '--color-warning-200': '255 220 191', // #ffdcbf - '--color-warning-300': '255 199 153', // #ffc799 - '--color-warning-400': '255 157 77', // #ff9d4d - '--color-warning-500': '255 115 0', // #ff7300 - '--color-warning-600': '230 104 0', // #e66800 - '--color-warning-700': '191 86 0', // #bf5600 - '--color-warning-800': '153 69 0', // #994500 - '--color-warning-900': '125 56 0', // #7d3800 - // error | #a30000 - '--color-error-50': '241 217 217', // #f1d9d9 - '--color-error-100': '237 204 204', // #edcccc - '--color-error-200': '232 191 191', // #e8bfbf - '--color-error-300': '218 153 153', // #da9999 - '--color-error-400': '191 77 77', // #bf4d4d - '--color-error-500': '163 0 0', // #a30000 - '--color-error-600': '147 0 0', // #930000 - '--color-error-700': '122 0 0', // #7a0000 - '--color-error-800': '98 0 0', // #620000 - '--color-error-900': '80 0 0', // #500000 - // surface | #202325 - '--color-surface-50': '222 222 222', // #dedede - '--color-surface-100': '210 211 211', // #d2d3d3 - '--color-surface-200': '199 200 201', // #c7c8c9 - '--color-surface-300': '166 167 168', // #a6a7a8 - '--color-surface-400': '99 101 102', // #636566 - '--color-surface-500': '32 35 37', // #202325 - '--color-surface-600': '29 32 33', // #1d2021 - '--color-surface-700': '24 26 28', // #181a1c - '--color-surface-800': '19 21 22', // #131516 - '--color-surface-900': '16 17 18', // #101112 - }, -}; diff --git a/package.json b/package.json index eb291472..8d776537 100644 --- a/package.json +++ b/package.json @@ -16,62 +16,70 @@ "test:unit": "vitest" }, "devDependencies": { - "@floating-ui/dom": "^1.6.11", + "@eslint/compat": "^1.2.4", + "@internationalized/date": "^3.6.0", "@microsoft/signalr": "^8.0.7", - "@openapitools/openapi-generator-cli": "^2.15.0", - "@playwright/test": "^1.48.2", - "@sentry/svelte": "^8.35.0", - "@skeletonlabs/skeleton": "^2.10.3", - "@skeletonlabs/tw-plugin": "0.4.0", - "@sveltejs/adapter-cloudflare": "^4.7.4", - "@sveltejs/adapter-node": "^5.2.9", - "@sveltejs/kit": "^2.7.3", - "@sveltejs/vite-plugin-svelte": "^4.0.0", - "@tailwindcss/forms": "0.5.9", - "@tailwindcss/typography": "0.5.15", + "@playwright/test": "^1.49.1", + "@sveltejs/adapter-cloudflare": "^5.0.0", + "@sveltejs/adapter-node": "^5.2.11", + "@sveltejs/kit": "^2.15.1", + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tanstack/table-core": "^8.20.5", "@types/crypto-js": "^4.2.2", "@types/eslint": "^9.6.1", - "@types/node": "22.8.2", + "@types/node": "^22.10.5", + "@types/semver": "^7.5.8", "@types/w3c-web-serial": "^1.0.7", - "@vincjo/datatables": "^2.0.5", - "autoprefixer": "10.4.20", + "autoprefixer": "^10.4.20", + "bits-ui": "1.0.0-next.77", "bowser": "^2.11.0", + "clsx": "^2.1.1", "crypto-js": "^4.2.0", - "email-validator": "^2.0.4", - "eslint": "^9.13.0", + "dotenv": "^16.4.7", + "eslint": "^9.17.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.46.0", - "globals": "^15.11.0", - "highlight.js": "^11.10.0", - "js-sha1": "^0.7.0", - "postcss": "8.4.47", - "prettier": "^3.3.3", - "prettier-plugin-svelte": "^3.2.7", - "svelte": "^5.1.4", - "svelte-check": "^4.0.5", - "tailwindcss": "3.4.14", - "tslib": "^2.8.0", - "typescript": "^5.6.3", - "typescript-eslint": "^8.12.1", - "ua-parser-js": "^2.0.0-beta.3", + "eslint-plugin-svelte": "^2.46.1", + "globals": "^15.14.0", + "lucide-svelte": "^0.469.0", + "prettier": "^3.4.2", + "prettier-plugin-svelte": "^3.3.2", + "prettier-plugin-tailwindcss": "^0.6.9", + "semver": "^7.6.3", + "svelte": "^5.16.2", + "svelte-check": "^4.1.1", + "svelte-sonner": "^0.3.28", + "tailwind-merge": "^2.6.0", + "tailwind-variants": "^0.3.0", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "tslib": "^2.8.1", + "typescript": "^5.7.2", + "typescript-eslint": "^8.19.0", + "ua-parser-js": "2.0.0", "vite-plugin-mkcert": "^1.17.6", - "vite-plugin-tailwind-purgecss": "0.3.3", - "vitest": "^2.1.4" + "vitest": "^2.1.8" }, "dependencies": { - "esptool-js": "^0.4.6", - "vite": "^5.4.10" + "@tailwindcss/forms": "^0.5.9", + "@tailwindcss/typography": "^0.5.15", + "esptool-js": "^0.5.2", + "vite": "^6.0.7" }, "engines": { - "node": ">=20.18", - "pnpm": ">=9" + "node": "^20.18", + "pnpm": "^9.12.3" }, "volta": { "node": "20.18.0" }, + "packageManager": "pnpm@9.12.3", "pnpm": { "patchedDependencies": { - "esptool-js@0.4.6": "patches/esptool-js@0.4.6.patch" + "@microsoft/signalr@8.0.7": "patches/@microsoft__signalr@8.0.7.patch", + "esptool-js@0.5.2": "patches/esptool-js@0.5.2.patch" + }, + "overrides": { + "cookie@<0.7.0": ">=0.7.0" } } } diff --git a/patches/@microsoft__signalr@8.0.7.patch b/patches/@microsoft__signalr@8.0.7.patch new file mode 100644 index 00000000..df4aa93e --- /dev/null +++ b/patches/@microsoft__signalr@8.0.7.patch @@ -0,0 +1,22 @@ +diff --git a/dist/esm/Utils.js b/dist/esm/Utils.js +index 5a5448a35e688184a8922d03ae9d1fe475f2ee44..56d4b763e137e0183a1485e4751d485cdbf3cbdc 100644 +--- a/dist/esm/Utils.js ++++ b/dist/esm/Utils.js +@@ -186,7 +186,7 @@ export function constructUserAgent(version, os, runtime, runtimeVersion) { + return userAgent; + } + // eslint-disable-next-line spaced-comment +-/*#__PURE__*/ function getOsName() { ++/*#__NO_SIDE_EFFECTS__*/ function getOsName() { + if (Platform.isNode) { + switch (process.platform) { + case "win32": +@@ -204,7 +204,7 @@ export function constructUserAgent(version, os, runtime, runtimeVersion) { + } + } + // eslint-disable-next-line spaced-comment +-/*#__PURE__*/ function getRuntimeVersion() { ++/*#__NO_SIDE_EFFECTS__*/ function getRuntimeVersion() { + if (Platform.isNode) { + return process.versions.node; + } diff --git a/patches/esptool-js@0.4.6.patch b/patches/esptool-js@0.5.2.patch similarity index 65% rename from patches/esptool-js@0.4.6.patch rename to patches/esptool-js@0.5.2.patch index 503055d0..1345d271 100644 --- a/patches/esptool-js@0.4.6.patch +++ b/patches/esptool-js@0.5.2.patch @@ -1,11 +1,11 @@ diff --git a/package.json b/package.json -index 08b403d99a52684e533748c7cf88f1dd62230153..54e6233d4c338edb6c37f38c1312b55c54b575c0 100644 +index 7988e97e936c56b92a24a8b45958ee624054085b..7f89066305c8a84fdfa7477805db854138bf93c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "esptool-js", - "version": "0.4.6", + "version": "0.5.2", + "type": "module", "module": "lib/index.js", "main": "lib/index.js", diff --git a/playwright.config.ts b/playwright.config.ts index db8f8c68..8890ed87 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -3,8 +3,8 @@ import { defineConfig } from '@playwright/test'; export default defineConfig({ webServer: { command: 'npm run build && npm run preview', - port: 4173 + port: 4173, }, - testDir: 'e2e' + testDir: 'e2e', }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ffcc3ad..dbb1c320 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,61 +4,61 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + cookie@<0.7.0: '>=0.7.0' + patchedDependencies: - esptool-js@0.4.6: - hash: 3a3x37scxxjnnesy2e5ida6v34 - path: patches/esptool-js@0.4.6.patch + '@microsoft/signalr@8.0.7': + hash: vl6mvrodvyt4cwoevl3v2ipkay + path: patches/@microsoft__signalr@8.0.7.patch + esptool-js@0.5.2: + hash: yai43fsvnizsaie2tx4fahz3ay + path: patches/esptool-js@0.5.2.patch importers: .: dependencies: + '@tailwindcss/forms': + specifier: ^0.5.9 + version: 0.5.9(tailwindcss@3.4.17) + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.15(tailwindcss@3.4.17) esptool-js: - specifier: ^0.4.6 - version: 0.4.6(patch_hash=3a3x37scxxjnnesy2e5ida6v34) + specifier: ^0.5.2 + version: 0.5.2(patch_hash=yai43fsvnizsaie2tx4fahz3ay) vite: - specifier: ^5.4.10 - version: 5.4.10(@types/node@22.8.2) + specifier: ^6.0.7 + version: 6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1) devDependencies: - '@floating-ui/dom': - specifier: ^1.6.11 - version: 1.6.11 + '@eslint/compat': + specifier: ^1.2.4 + version: 1.2.4(eslint@9.17.0(jiti@1.21.6)) + '@internationalized/date': + specifier: ^3.6.0 + version: 3.6.0 '@microsoft/signalr': specifier: ^8.0.7 - version: 8.0.7 - '@openapitools/openapi-generator-cli': - specifier: ^2.15.0 - version: 2.15.0 + version: 8.0.7(patch_hash=vl6mvrodvyt4cwoevl3v2ipkay) '@playwright/test': - specifier: ^1.48.2 - version: 1.48.2 - '@sentry/svelte': - specifier: ^8.35.0 - version: 8.35.0(svelte@5.1.4) - '@skeletonlabs/skeleton': - specifier: ^2.10.3 - version: 2.10.3(svelte@5.1.4) - '@skeletonlabs/tw-plugin': - specifier: 0.4.0 - version: 0.4.0(tailwindcss@3.4.14) + specifier: ^1.49.1 + version: 1.49.1 '@sveltejs/adapter-cloudflare': - specifier: ^4.7.4 - version: 4.7.4(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(wrangler@3.80.5(@cloudflare/workers-types@4.20241022.0)) + specifier: ^5.0.0 + version: 5.0.0(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(wrangler@3.80.5(@cloudflare/workers-types@4.20241224.0)) '@sveltejs/adapter-node': - specifier: ^5.2.9 - version: 5.2.9(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2))) + specifier: ^5.2.11 + version: 5.2.11(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1))) '@sveltejs/kit': - specifier: ^2.7.3 - version: 2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)) + specifier: ^2.15.1 + version: 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)) '@sveltejs/vite-plugin-svelte': - specifier: ^4.0.0 - version: 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)) - '@tailwindcss/forms': - specifier: 0.5.9 - version: 0.5.9(tailwindcss@3.4.14) - '@tailwindcss/typography': - specifier: 0.5.15 - version: 0.5.15(tailwindcss@3.4.14) + specifier: ^5.0.3 + version: 5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)) + '@tanstack/table-core': + specifier: ^8.20.5 + version: 8.20.5 '@types/crypto-js': specifier: ^4.2.2 version: 4.2.2 @@ -66,83 +66,98 @@ importers: specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: 22.8.2 - version: 22.8.2 + specifier: ^22.10.5 + version: 22.10.5 + '@types/semver': + specifier: ^7.5.8 + version: 7.5.8 '@types/w3c-web-serial': specifier: ^1.0.7 version: 1.0.7 - '@vincjo/datatables': - specifier: ^2.0.5 - version: 2.0.5(svelte@5.1.4) autoprefixer: - specifier: 10.4.20 - version: 10.4.20(postcss@8.4.47) + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.49) + bits-ui: + specifier: 1.0.0-next.77 + version: 1.0.0-next.77(svelte@5.16.2) bowser: specifier: ^2.11.0 version: 2.11.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 crypto-js: specifier: ^4.2.0 version: 4.2.0 - email-validator: - specifier: ^2.0.4 - version: 2.0.4 + dotenv: + specifier: ^16.4.7 + version: 16.4.7 eslint: - specifier: ^9.13.0 - version: 9.13.0(jiti@1.21.6) + specifier: ^9.17.0 + version: 9.17.0(jiti@1.21.6) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.13.0(jiti@1.21.6)) + version: 9.1.0(eslint@9.17.0(jiti@1.21.6)) eslint-plugin-svelte: - specifier: ^2.46.0 - version: 2.46.0(eslint@9.13.0(jiti@1.21.6))(svelte@5.1.4) + specifier: ^2.46.1 + version: 2.46.1(eslint@9.17.0(jiti@1.21.6))(svelte@5.16.2) globals: - specifier: ^15.11.0 - version: 15.11.0 - highlight.js: - specifier: ^11.10.0 - version: 11.10.0 - js-sha1: - specifier: ^0.7.0 - version: 0.7.0 - postcss: - specifier: 8.4.47 - version: 8.4.47 + specifier: ^15.14.0 + version: 15.14.0 + lucide-svelte: + specifier: ^0.469.0 + version: 0.469.0(svelte@5.16.2) prettier: - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.4.2 + version: 3.4.2 prettier-plugin-svelte: - specifier: ^3.2.7 - version: 3.2.7(prettier@3.3.3)(svelte@5.1.4) + specifier: ^3.3.2 + version: 3.3.2(prettier@3.4.2)(svelte@5.16.2) + prettier-plugin-tailwindcss: + specifier: ^0.6.9 + version: 0.6.9(prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.16.2))(prettier@3.4.2) + semver: + specifier: ^7.6.3 + version: 7.6.3 svelte: - specifier: ^5.1.4 - version: 5.1.4 + specifier: ^5.16.2 + version: 5.16.2 svelte-check: - specifier: ^4.0.5 - version: 4.0.5(picomatch@4.0.2)(svelte@5.1.4)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.16.2)(typescript@5.7.2) + svelte-sonner: + specifier: ^0.3.28 + version: 0.3.28(svelte@5.16.2) + tailwind-merge: + specifier: ^2.6.0 + version: 2.6.0 + tailwind-variants: + specifier: ^0.3.0 + version: 0.3.0(tailwindcss@3.4.17) tailwindcss: - specifier: 3.4.14 - version: 3.4.14 + specifier: ^3.4.17 + version: 3.4.17 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) tslib: - specifier: ^2.8.0 - version: 2.8.0 + specifier: ^2.8.1 + version: 2.8.1 typescript: - specifier: ^5.6.3 - version: 5.6.3 + specifier: ^5.7.2 + version: 5.7.2 typescript-eslint: - specifier: ^8.12.1 - version: 8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) + specifier: ^8.19.0 + version: 8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) ua-parser-js: - specifier: ^2.0.0-beta.3 - version: 2.0.0-beta.3 + specifier: 2.0.0 + version: 2.0.0 vite-plugin-mkcert: specifier: ^1.17.6 - version: 1.17.6(vite@5.4.10(@types/node@22.8.2)) - vite-plugin-tailwind-purgecss: - specifier: 0.3.3 - version: 0.3.3(tailwindcss@3.4.14)(vite@5.4.10(@types/node@22.8.2)) + version: 1.17.6(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)) vitest: - specifier: ^2.1.4 - version: 2.1.4(@types/node@22.8.2) + specifier: ^2.1.8 + version: 2.1.8(@types/node@22.10.5) packages: @@ -154,10 +169,6 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} - engines: {node: '>=6.9.0'} - '@cloudflare/kv-asset-handler@0.3.4': resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} @@ -196,8 +207,8 @@ packages: resolution: {integrity: sha512-rfUCvb3hx4AsvdUZsxgk9lmgEnQehqV3jdtXLP/Xr0+P56n11T/0nXNMzmn7Nnv+IJFOV6X9NmFhuMz4sBPw7w==} engines: {node: '>=16.7.0'} - '@cloudflare/workers-types@4.20241022.0': - resolution: {integrity: sha512-1zOAw5QIDKItzGatzCrEpfLOB1AuMTwVqKmbw9B9eBfCUGRFNfJYMrJxIwcse9EmKahsQt2GruqU00pY/GyXgg==} + '@cloudflare/workers-types@4.20241224.0': + resolution: {integrity: sha512-1ZmFc8qqM7S/HUGmLplc4P8n8DoMqiJmc47r9Lr7VbuaotoqCXVljz09w1V1mc4K3pbFPgvqSy4XYStZ08HrlQ==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -219,6 +230,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -231,6 +248,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -243,6 +266,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -255,6 +284,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -267,6 +302,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -279,6 +320,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -291,6 +338,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -303,6 +356,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -315,6 +374,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -327,6 +392,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -339,6 +410,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -351,6 +428,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -363,6 +446,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -375,6 +464,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -387,6 +482,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -399,6 +500,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -411,6 +518,18 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -423,6 +542,18 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -435,6 +566,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -447,6 +584,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -459,6 +602,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -471,6 +620,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -483,38 +638,53 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.1': - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.18.0': - resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + '@eslint/compat@1.2.4': + resolution: {integrity: sha512-S8ZdQj/N69YAtuqFt7653jwcvuUj131+6qGLUyDqfDg1OIoBQ66OCuXC473YQfO2AaxITTutiRQiDwoo7ZLYyg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/core@0.7.0': - resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} + '@eslint/config-array@0.19.0': + resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.1.0': - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + '@eslint/core@0.9.0': + resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.13.0': - resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.17.0': + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.0': - resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + '@eslint/plugin-kit@0.2.3': + resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/busboy@2.1.1': @@ -524,18 +694,18 @@ packages: '@floating-ui/core@1.6.8': resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - '@floating-ui/dom@1.6.11': - resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - '@humanfs/core@0.19.0': - resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.5': - resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -546,12 +716,19 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + + '@internationalized/date@3.6.0': + resolution: {integrity: sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -571,50 +748,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@lukeed/csprng@1.1.0': - resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} - engines: {node: '>=8'} - '@microsoft/signalr@8.0.7': resolution: {integrity: sha512-PHcdMv8v5hJlBkRHAuKG5trGViQEkPYee36LnJQx4xHOQ5LL4X0nEWIxOp5cCtZ7tu+30quz5V3k0b1YNuc6lw==} - '@nestjs/axios@3.1.0': - resolution: {integrity: sha512-CpeK2ickH//ml+H7kX+QPIpeTwER4yedVcw6GPe6Nv58cmKTa0sb+3A3It7ChKD4deW4UKNvZIpYkUk18q78YQ==} - peerDependencies: - '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - axios: ^1.3.1 - rxjs: ^6.0.0 || ^7.0.0 - - '@nestjs/common@10.4.5': - resolution: {integrity: sha512-N/yUyuYCBMb0+H6jHhntR7PURzji0usID/DByhOfooyk/aPGscI0aQKwOA6edlJlT92hHUvXYLJ5p3npj7KcjQ==} - peerDependencies: - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true - - '@nestjs/core@10.4.5': - resolution: {integrity: sha512-wk0KJ+6tuidqAdeemsQ40BCp1BgMsSuSLG577aqXLxXYoa8FQYPrdxoSzd05znYLwJYM55fisZWb3FLF9HT2qw==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - '@nestjs/websockets': ^10.0.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - '@nestjs/websockets': - optional: true - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -627,11 +763,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nuxtjs/opencollective@0.3.2': - resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - '@octokit/auth-token@4.0.0': resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} engines: {node: '>= 18'} @@ -684,17 +815,12 @@ packages: '@octokit/types@13.6.1': resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==} - '@openapitools/openapi-generator-cli@2.15.0': - resolution: {integrity: sha512-28SxjssgQaLLfVRooXTJMjT1MObdA8YjUFBmqk/KqKraVUeS3KUi5CKGPi8zzlJUoyLqF/KrFSvggzvLlx0XQw==} - engines: {node: '>=16'} - hasBin: true - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.48.2': - resolution: {integrity: sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==} + '@playwright/test@1.49.1': + resolution: {integrity: sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==} engines: {node: '>=18'} hasBin: true @@ -719,8 +845,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.3.0': - resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} + '@rollup/plugin-node-resolve@16.0.0': + resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -737,178 +863,233 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.24.2': - resolution: {integrity: sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==} + '@rollup/rollup-android-arm-eabi@4.28.1': + resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.30.0': + resolution: {integrity: sha512-qFcFto9figFLz2g25DxJ1WWL9+c91fTxnGuwhToCl8BaqDsDYMl/kOnBXAyAqkkzAWimYMSWNPWEjt+ADAHuoQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.24.2': - resolution: {integrity: sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==} + '@rollup/rollup-android-arm64@4.28.1': + resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.30.0': + resolution: {integrity: sha512-vqrQdusvVl7dthqNjWCL043qelBK+gv9v3ZiqdxgaJvmZyIAAXMjeGVSqZynKq69T7062T5VrVTuikKSAAVP6A==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.24.2': - resolution: {integrity: sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==} + '@rollup/rollup-darwin-arm64@4.28.1': + resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.30.0': + resolution: {integrity: sha512-617pd92LhdA9+wpixnzsyhVft3szYiN16aNUMzVkf2N+yAk8UXY226Bfp36LvxYTUt7MO/ycqGFjQgJ0wlMaWQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.24.2': - resolution: {integrity: sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==} + '@rollup/rollup-darwin-x64@4.28.1': + resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.24.2': - resolution: {integrity: sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==} + '@rollup/rollup-darwin-x64@4.30.0': + resolution: {integrity: sha512-Y3b4oDoaEhCypg8ajPqigKDcpi5ZZovemQl9Edpem0uNv6UUjXv7iySBpGIUTSs2ovWOzYpfw9EbFJXF/fJHWw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.28.1': + resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-arm64@4.30.0': + resolution: {integrity: sha512-3REQJ4f90sFIBfa0BUokiCdrV/E4uIjhkWe1bMgCkhFXbf4D8YN6C4zwJL881GM818qVYE9BO3dGwjKhpo2ABA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.24.2': - resolution: {integrity: sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==} + '@rollup/rollup-freebsd-x64@4.28.1': + resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.24.2': - resolution: {integrity: sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==} + '@rollup/rollup-freebsd-x64@4.30.0': + resolution: {integrity: sha512-ZtY3Y8icbe3Cc+uQicsXG5L+CRGUfLZjW6j2gn5ikpltt3Whqjfo5mkyZ86UiuHF9Q3ZsaQeW7YswlHnN+lAcg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.30.0': + resolution: {integrity: sha512-bsPGGzfiHXMhQGuFGpmo2PyTwcrh2otL6ycSZAFTESviUoBOuxF7iBbAL5IJXc/69peXl5rAtbewBFeASZ9O0g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.24.2': - resolution: {integrity: sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==} + '@rollup/rollup-linux-arm-musleabihf@4.28.1': + resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.24.2': - resolution: {integrity: sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==} + '@rollup/rollup-linux-arm-musleabihf@4.30.0': + resolution: {integrity: sha512-kvyIECEhs2DrrdfQf++maCWJIQ974EI4txlz1nNSBaCdtf7i5Xf1AQCEJWOC5rEBisdaMFFnOWNLYt7KpFqy5A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.28.1': + resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.30.0': + resolution: {integrity: sha512-CFE7zDNrokaotXu+shwIrmWrFxllg79vciH4E/zeK7NitVuWEaXRzS0mFfFvyhZfn8WfVOG/1E9u8/DFEgK7WQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.24.2': - resolution: {integrity: sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==} + '@rollup/rollup-linux-arm64-musl@4.28.1': + resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.24.2': - resolution: {integrity: sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==} + '@rollup/rollup-linux-arm64-musl@4.30.0': + resolution: {integrity: sha512-MctNTBlvMcIBP0t8lV/NXiUwFg9oK5F79CxLU+a3xgrdJjfBLVIEHSAjQ9+ipofN2GKaMLnFFXLltg1HEEPaGQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.30.0': + resolution: {integrity: sha512-fBpoYwLEPivL3q368+gwn4qnYnr7GVwM6NnMo8rJ4wb0p/Y5lg88vQRRP077gf+tc25akuqd+1Sxbn9meODhwA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.24.2': - resolution: {integrity: sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.30.0': + resolution: {integrity: sha512-1hiHPV6dUaqIMXrIjN+vgJqtfkLpqHS1Xsg0oUfUVD98xGp1wX89PIXgDF2DWra1nxAd8dfE0Dk59MyeKaBVAw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.28.1': + resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.24.2': - resolution: {integrity: sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==} + '@rollup/rollup-linux-riscv64-gnu@4.30.0': + resolution: {integrity: sha512-U0xcC80SMpEbvvLw92emHrNjlS3OXjAM0aVzlWfar6PR0ODWCTQtKeeB+tlAPGfZQXicv1SpWwRz9Hyzq3Jx3g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.28.1': + resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.24.2': - resolution: {integrity: sha512-jOG/0nXb3z+EM6SioY8RofqqmZ+9NKYvJ6QQaa9Mvd3RQxlH68/jcB/lpyVt4lCiqr04IyaC34NzhUqcXbB5FQ==} + '@rollup/rollup-linux-s390x-gnu@4.30.0': + resolution: {integrity: sha512-VU/P/IODrNPasgZDLIFJmMiLGez+BN11DQWfTVlViJVabyF3JaeaJkP6teI8760f18BMGCQOW9gOmuzFaI1pUw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.28.1': + resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.30.0': + resolution: {integrity: sha512-laQVRvdbKmjXuFA3ZiZj7+U24FcmoPlXEi2OyLfbpY2MW1oxLt9Au8q9eHd0x6Pw/Kw4oe9gwVXWwIf2PVqblg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.28.1': + resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.24.2': - resolution: {integrity: sha512-XAo7cJec80NWx9LlZFEJQxqKOMz/lX3geWs2iNT5CHIERLFfd90f3RYLLjiCBm1IMaQ4VOX/lTC9lWfzzQm14Q==} + '@rollup/rollup-linux-x64-musl@4.30.0': + resolution: {integrity: sha512-3wzKzduS7jzxqcOvy/ocU/gMR3/QrHEFLge5CD7Si9fyHuoXcidyYZ6jyx8OPYmCcGm3uKTUl+9jUSAY74Ln5A==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.24.2': - resolution: {integrity: sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==} + '@rollup/rollup-win32-arm64-msvc@4.28.1': + resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.24.2': - resolution: {integrity: sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==} - cpu: [ia32] + '@rollup/rollup-win32-arm64-msvc@4.30.0': + resolution: {integrity: sha512-jROwnI1+wPyuv696rAFHp5+6RFhXGGwgmgSfzE8e4xfit6oLRg7GyMArVUoM3ChS045OwWr9aTnU+2c1UdBMyw==} + cpu: [arm64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.24.2': - resolution: {integrity: sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==} - cpu: [x64] + '@rollup/rollup-win32-ia32-msvc@4.28.1': + resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + cpu: [ia32] os: [win32] - '@sentry-internal/browser-utils@8.35.0': - resolution: {integrity: sha512-uj9nwERm7HIS13f/Q52hF/NUS5Al8Ma6jkgpfYGeppYvU0uSjPkwMogtqoJQNbOoZg973tV8qUScbcWY616wNA==} - engines: {node: '>=14.18'} - - '@sentry-internal/feedback@8.35.0': - resolution: {integrity: sha512-7bjSaUhL0bDArozre6EiIhhdWdT/1AWNWBC1Wc5w1IxEi5xF7nvF/FfvjQYrONQzZAI3HRxc45J2qhLUzHBmoQ==} - engines: {node: '>=14.18'} - - '@sentry-internal/replay-canvas@8.35.0': - resolution: {integrity: sha512-TUrH6Piv19kvHIiRyIuapLdnuwxk/Un/l1WDCQfq7mK9p1Pac0FkQ7Uufjp6zY3lyhDDZQ8qvCS4ioCMibCwQg==} - engines: {node: '>=14.18'} - - '@sentry-internal/replay@8.35.0': - resolution: {integrity: sha512-3wkW03vXYMyWtTLxl9yrtkV+qxbnKFgfASdoGWhXzfLjycgT6o4/04eb3Gn71q9aXqRwH17ISVQbVswnRqMcmA==} - engines: {node: '>=14.18'} - - '@sentry/browser@8.35.0': - resolution: {integrity: sha512-WHfI+NoZzpCsmIvtr6ChOe7yWPLQyMchPnVhY3Z4UeC70bkYNdKcoj/4XZbX3m0D8+71JAsm0mJ9s9OC3Ue6MQ==} - engines: {node: '>=14.18'} - - '@sentry/core@8.35.0': - resolution: {integrity: sha512-Ci0Nmtw5ETWLqQJGY4dyF+iWh7PWKy6k303fCEoEmqj2czDrKJCp7yHBNV0XYbo00prj2ZTbCr6I7albYiyONA==} - engines: {node: '>=14.18'} - - '@sentry/svelte@8.35.0': - resolution: {integrity: sha512-/nV9fVYdVrzmX9obLY6NBOGVeb7JJZUY8ek8vtvkrHHelZkIykUIgWU7xFMSct1at2ii1/Abz/Vz6vXMoiGAmw==} - engines: {node: '>=14.18'} - peerDependencies: - svelte: 3.x || 4.x || 5.x - - '@sentry/types@8.35.0': - resolution: {integrity: sha512-AVEZjb16MlYPifiDDvJ19dPQyDn0jlrtC1PHs6ZKO+Rzyz+2EX2BRdszvanqArldexPoU1p5Bn2w81XZNXThBA==} - engines: {node: '>=14.18'} - - '@sentry/utils@8.35.0': - resolution: {integrity: sha512-MdMb6+uXjqND7qIPWhulubpSeHzia6HtxeJa8jYI09OCvIcmNGPydv/Gx/LZBwosfMHrLdTWcFH7Y7aCxrq7cg==} - engines: {node: '>=14.18'} + '@rollup/rollup-win32-ia32-msvc@4.30.0': + resolution: {integrity: sha512-duzweyup5WELhcXx5H1jokpr13i3BV9b48FMiikYAwk/MT1LrMYYk2TzenBd0jj4ivQIt58JWSxc19y4SvLP4g==} + cpu: [ia32] + os: [win32] - '@skeletonlabs/skeleton@2.10.3': - resolution: {integrity: sha512-O1RecF68zEVvZl3GgRS4emqWMUIQLHvTOFoqGOw/2OXCPE06IxUQrHQf2hnxCPxtGZNXY2YX8UNV38l+eH8GNQ==} - peerDependencies: - svelte: ^3.56.0 || ^4.0.0 || ^5.0.0 + '@rollup/rollup-win32-x64-msvc@4.28.1': + resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + cpu: [x64] + os: [win32] - '@skeletonlabs/tw-plugin@0.4.0': - resolution: {integrity: sha512-v6Y4deBq9ByRx3kTRGgekhhYkWEYgNNNu8UXOwJngCStB7w8SwmbNFSeHkluxMbgCgMnJyp220EMpw9nj/rEsQ==} - peerDependencies: - tailwindcss: '>=3.0.0' + '@rollup/rollup-win32-x64-msvc@4.30.0': + resolution: {integrity: sha512-DYvxS0M07PvgvavMIybCOBYheyrqlui6ZQBHJs6GqduVzHSZ06TPPvlfvnYstjODHQ8UUXFwt5YE+h0jFI8kwg==} + cpu: [x64] + os: [win32] - '@sveltejs/adapter-cloudflare@4.7.4': - resolution: {integrity: sha512-hKvWAfCQLzyNBunXEm5T+yyVfbQ+QNqnyqI0+lDoVYNQ58Yg/EPLEQIBS5aNpZgaEuBtY2tnegLsoPS8ZRcaIg==} + '@sveltejs/adapter-cloudflare@5.0.0': + resolution: {integrity: sha512-YYfkdEajp4sALHFYeIUUQTGC3M1ZicrYYSVz1zmYwR2DKT59dwygYsdufI4L6ONNsDdRh3xeojjo8sO3V9dHcw==} peerDependencies: '@sveltejs/kit': ^2.0.0 - wrangler: ^3.28.4 + wrangler: ^3.87.0 - '@sveltejs/adapter-node@5.2.9': - resolution: {integrity: sha512-51euNrx0AcaTu8//wDfVh7xmqQSVgU52rfinE/MwvGkJa4nHPJMHmzv6+OIpmxg7gZaF6+5NVlxnieCzxLD59g==} + '@sveltejs/adapter-node@5.2.11': + resolution: {integrity: sha512-lR7/dfUaKFf3aI408KRDy/BVDYoqUws7zNOJz2Hl4JoshlTnMgdha3brXBRFXB+cWtYvJjjPhvmq3xqpbioi4w==} peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/kit@2.7.3': - resolution: {integrity: sha512-Vx7nq5MJ86I8qXYsVidC5PX6xm+uxt8DydvOdmJoyOK7LvGP18OFEG359yY+aa51t6pENvqZAMqAREQQx1OI2Q==} + '@sveltejs/kit@2.15.1': + resolution: {integrity: sha512-8t7D3hQHbUDMiaQ2RVnjJJ/+Ur4Fn/tkeySJCsHtX346Q9cp3LAnav8xXdfuqYNJwpUGX0x3BqF1uvbmXQw93A==} engines: {node: '>=18.13'} hasBin: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 + '@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 + vite: ^5.0.3 || ^6.0.0 - '@sveltejs/vite-plugin-svelte-inspector@3.0.0-next.4': - resolution: {integrity: sha512-Ct653z5kHM9goDyuOMfA1s9aPWffJUiKb80pOW6gVZt6+YAEesGj93uzhYtpFtVIN9PqkA7k2szqQbBrir+3oQ==} + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0 - svelte: ^5.0.0-next.96 || ^5.0.0 - vite: ^5.0.0 + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 - '@sveltejs/vite-plugin-svelte@4.0.0': - resolution: {integrity: sha512-kpVJwF+gNiMEsoHaw+FJL76IYiwBikkxYU83+BpqQLdVMff19KeRKLd2wisS8niNBMJ2omv5gG+iGDDwd8jzag==} + '@sveltejs/vite-plugin-svelte@5.0.3': + resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - svelte: ^5.0.0-next.96 || ^5.0.0 - vite: ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@tailwindcss/forms@0.5.9': resolution: {integrity: sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==} @@ -920,8 +1101,9 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@tanstack/table-core@8.20.5': + resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} + engines: {node: '>=12'} '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -941,82 +1123,70 @@ packages: '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - '@types/node@22.8.2': - resolution: {integrity: sha512-NzaRNFV+FZkvK/KLCsNdTvID0SThyrs5SHB6tsD/lajr22FGC73N2QeDPM2wHtVde8mgcXuSsHQkH5cX1pbPLw==} + '@types/node@22.10.5': + resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/w3c-web-serial@1.0.7': resolution: {integrity: sha512-jzcwm//EZ0Z306L1/O1GXC3GthRd//9eaNB4/Yagm98UjEQViTzDS8bYvL+y+rTk1r9OFt9Yhp5pprUQFzSiiQ==} - '@typescript-eslint/eslint-plugin@8.12.1': - resolution: {integrity: sha512-gNg/inLRcPoBsKKIe4Vv38SVSOhk4BKWNO0T56sVff33gRqtTpOsrhHtiOKD1lmIOmCtZMPaW2x/h2FlM+sCEg==} + '@typescript-eslint/eslint-plugin@8.19.0': + resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.12.1': - resolution: {integrity: sha512-I/I9Bg7qFa8rOgBnUUHIWTgzbB5wVkSLX+04xGUzTcJUtdq/I2uHWR9mbW6qUYJG/UmkuDcTax5JHvoEWOAHOQ==} + '@typescript-eslint/parser@8.19.0': + resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.12.1': - resolution: {integrity: sha512-bma6sD1iViTt+y9MAwDlBdPTMCqoH/BNdcQk4rKhIZWv3eM0xHmzeSrPJA663PAqFqfpOmtdugycpr0E1mZDVA==} + '@typescript-eslint/scope-manager@8.19.0': + resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.12.1': - resolution: {integrity: sha512-zJzrvbDVjIzVKV2TGHcjembEhws8RWXJhmqfO9hS2gRXBN0gDwGhRPEdJ6AZglzfJ+YA1q09EWpSLSXjBJpIMQ==} + '@typescript-eslint/type-utils@8.19.0': + resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.12.1': - resolution: {integrity: sha512-anMS4es5lxBe4UVcDXOkcDb3csnm5BvaNIbOFfvy/pJEohorsggdVB8MFbl5EZiEuBnZZ0ei1z7W5b6FdFiV1Q==} + '@typescript-eslint/types@8.19.0': + resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.12.1': - resolution: {integrity: sha512-k/o9khHOckPeDXilFTIPsP9iAYhhdMh3OsOL3i2072PNpFqhqzRHx472/0DeC8H/WZee3bZG0z2ddGRSPgeOKw==} + '@typescript-eslint/typescript-estree@8.19.0': + resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.12.1': - resolution: {integrity: sha512-sDv9yFHrhKe1WN8EYuzfhKCh/sFRupe9P+m/lZ5YgVvPoCUGHNN50IO4llSu7JAbftUM/QcCh+GeCortXPrBYQ==} + '@typescript-eslint/utils@8.19.0': + resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.12.1': - resolution: {integrity: sha512-2RwdwnNGuOQKdGjuhujQHUqBZhEuodg2sLVPvOfWktvA9sOXOVqARjOyHSyhN2LiJGKxV6c8oOcmOtRcAnEeFw==} + '@typescript-eslint/visitor-keys@8.19.0': + resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vincjo/datatables@2.0.5': - resolution: {integrity: sha512-ZD5Y5Tp1jlVSJhKEZqwhaUTUpTi+voz2Hx+Yr2HQ1JoCisYKk4T+MbJNmB6fN/Mra/hjrlEm5j/Ap5Ud0qydLw==} - peerDependencies: - svelte: ^5.0.0 - - '@vitest/expect@2.1.4': - resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==} + '@vitest/expect@2.1.8': + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} - '@vitest/mocker@2.1.4': - resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==} + '@vitest/mocker@2.1.8': + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 @@ -1026,20 +1196,20 @@ packages: vite: optional: true - '@vitest/pretty-format@2.1.4': - resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==} + '@vitest/pretty-format@2.1.8': + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} - '@vitest/runner@2.1.4': - resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==} + '@vitest/runner@2.1.8': + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} - '@vitest/snapshot@2.1.4': - resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==} + '@vitest/snapshot@2.1.8': + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} - '@vitest/spy@2.1.4': - resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==} + '@vitest/spy@2.1.8': + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} - '@vitest/utils@2.1.4': - resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} + '@vitest/utils@2.1.8': + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -1064,17 +1234,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1115,10 +1277,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1142,13 +1300,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} - before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -1156,8 +1307,11 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bits-ui@1.0.0-next.77: + resolution: {integrity: sha512-IV0AyVEvsRkXv4s/fl4iea5E9W2b9EBf98s9mRMKMc1xHxM9MmtM2r6MZMqftHQ/c+gHTIt3A9EKuTlh7uay8w==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.11.0 blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -1180,9 +1334,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1209,13 +1360,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -1228,25 +1372,10 @@ packages: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1258,58 +1387,31 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - compare-versions@4.1.4: - resolution: {integrity: sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@6.5.1: - resolution: {integrity: sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag==} - engines: {node: '>=10.0.0'} - hasBin: true - - consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} - - console.table@0.10.0: - resolution: {integrity: sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==} - engines: {node: '> 0.10'} - - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -1318,14 +1420,6 @@ packages: data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -1335,6 +1429,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -1346,16 +1449,9 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1363,6 +1459,9 @@ packages: deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + detect-europe-js@0.1.2: + resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==} + devalue@5.1.1: resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} @@ -1372,35 +1471,24 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - easy-table@1.1.0: - resolution: {integrity: sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==} - electron-to-chromium@1.5.40: resolution: {integrity: sha512-LYm78o6if4zTasnYclgQzxEcgMoIcybWOhkATWepN95uwVVWV0/IW10v+2sIeHE+bIYWipLneTftVyQm45UY7g==} - email-validator@2.0.4: - resolution: {integrity: sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==} - engines: {node: '>4.0'} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} @@ -1412,23 +1500,19 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - eslint-compat-utils@0.5.1: resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} @@ -1441,8 +1525,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-svelte@2.46.0: - resolution: {integrity: sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==} + eslint-plugin-svelte@2.46.1: + resolution: {integrity: sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 @@ -1455,20 +1539,20 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.1.0: - resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.1.0: - resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.13.0: - resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==} + eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1477,31 +1561,26 @@ packages: jiti: optional: true - esm-env@1.0.0: - resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + esm-env@1.2.1: + resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==} - espree@10.2.0: - resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esptool-js@0.4.6: - resolution: {integrity: sha512-5Wu3/+9+P8DhJnF513VDilOCoWez3wW2Bcz7tMBefduoCX/PyU/6k33KELRHmvLp4NEOrlb2ktypZwdlnZ6a+A==} + esptool-js@0.5.2: + resolution: {integrity: sha512-EGw5AyudbW892ddVhN9Ot9nz45bizoUnqMT8mIFIrI2zgiEDHNHTkWX9GGwwoTHXRRTu5W97Bsw/pD5sfMizLQ==} esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esrap@1.2.2: - resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + esrap@1.3.2: + resolution: {integrity: sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -1540,10 +1619,6 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1551,15 +1626,16 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -1574,10 +1650,6 @@ packages: fetch-cookie@2.2.0: resolution: {integrity: sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==} - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1594,8 +1666,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} @@ -1617,17 +1689,6 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1641,17 +1702,9 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} - engines: {node: '>= 14'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1667,16 +1720,12 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.11.0: - resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} globalyzer@0.1.0: @@ -1685,9 +1734,6 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -1699,25 +1745,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - highlight.js@11.10.0: - resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} - engines: {node: '>=12.0.0'} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1733,23 +1760,19 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} - - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + is-core-module@2.16.0: + resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-extglob@2.1.1: @@ -1764,10 +1787,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -1778,20 +1797,15 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + is-standalone-pwa@0.1.1: + resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - iterare@1.2.1: - resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} - engines: {node: '>=6'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -1799,16 +1813,10 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - js-sha1@0.7.0: - resolution: {integrity: sha512-oQZ1Mo7440BfLSv9TX87VNEyU52pXPVG19F9PL3gTgNt0tVxlZ8F4O6yze3CLuLx28TxotxvlyepCNaaV0ZjMw==} - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -1818,9 +1826,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1839,8 +1844,8 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} lines-and-columns@1.2.4: @@ -1862,31 +1867,25 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - loupe@3.1.2: resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} + lucide-svelte@0.469.0: + resolution: {integrity: sha512-PMIJ8jrFqVUsXJz4d1yfAQplaGhNOahwwkzbunha8DhpiD73xqX24n8dE1dPpUk3vcrdWVsHc1y/liHHotOnGQ==} + peerDependencies: + svelte: ^3 || ^4 || ^5.0.0-next.42 magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.12: - resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1909,10 +1908,6 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true @@ -1925,18 +1920,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1956,24 +1943,17 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -2012,22 +1992,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2036,14 +2004,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - pac-proxy-agent@7.0.2: - resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -2052,13 +2012,7 @@ packages: parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse5-htmlparser2-tree-adapter@7.1.0: - resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} - - parse5@7.2.0: - resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} + engines: {node: '>=6'} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -2075,9 +2029,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@3.3.0: - resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -2107,13 +2058,13 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - playwright-core@1.48.2: - resolution: {integrity: sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==} + playwright-core@1.49.1: + resolution: {integrity: sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==} engines: {node: '>=18'} hasBin: true - playwright@1.48.2: - resolution: {integrity: sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==} + playwright@1.49.1: + resolution: {integrity: sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==} engines: {node: '>=18'} hasBin: true @@ -2182,32 +2133,83 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-svelte@3.2.7: - resolution: {integrity: sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==} + prettier-plugin-svelte@3.3.2: + resolution: {integrity: sha512-kRPjH8wSj2iu+dO+XaUv4vD8qr5mdDmlak3IT/7AOgGIMRG86z/EHOLauFcClKEnOUf4A4nOA7sre5KrJD4Raw==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier-plugin-tailwindcss@0.6.9: + resolution: {integrity: sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + 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-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - proxy-agent@6.4.0: - resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} - engines: {node: '>= 14'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -2218,13 +2220,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - purgecss-from-html@6.0.0: - resolution: {integrity: sha512-GkgAUzgyC4kwcVY5+QOI2eqQghV1Lq7q2uIODAPIueiBn3mHpJOh9boSMjfUQg0/YU/ZEWq7SzjwetuqxTvD4g==} - - purgecss@6.0.0: - resolution: {integrity: sha512-s3EBxg5RSWmpqd0KGzNqPiaBbWDz1/As+2MzoYVGMqgDqRTLBhJW6sywfTBek7OwNfoS/6pS0xdtvChNhFj2cw==} - hasBin: true - querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -2234,10 +2229,6 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -2246,20 +2237,10 @@ packages: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} - reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexparam@3.0.0: resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} engines: {node: '>=8'} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -2267,17 +2248,18 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + resolve@1.22.9: + resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} + hasBin: true reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -2293,35 +2275,33 @@ packages: rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - rollup@4.24.2: - resolution: {integrity: sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==} + rollup@4.28.1: + resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} + rollup@4.30.0: + resolution: {integrity: sha512-sDnr1pcjTgUT69qBksNF1N1anwfbyYG6TBQ22b03bII8EdiUQ7J0TlozVaTMjT/eEJAO49e1ndV7t+UZfL1+vA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} + runed@0.20.0: + resolution: {integrity: sha512-YqPxaUdWL5nUXuSF+/v8a+NkVN8TGyEGbQwTA25fLY35MR/2bvZ1c6sCbudoo1kT4CAJPh4kUkcgGVxW127WKw==} + peerDependencies: + svelte: ^5.7.0 - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + runed@0.22.0: + resolution: {integrity: sha512-ZWVXWhOr0P5xdNgtviz6D1ivLUDWKLCbeC5SUEJ3zBkqLReVqWHenFxMNFeFaiC5bfxhFxyxzyzB+98uYFtwdA==} + peerDependencies: + svelte: ^5.7.0 sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - selfsigned@2.4.1: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} @@ -2331,9 +2311,6 @@ packages: engines: {node: '>=10'} hasBin: true - set-cookie-parser@2.7.0: - resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} - set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} @@ -2348,9 +2325,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -2359,18 +2333,6 @@ packages: resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} engines: {node: '>=18'} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} - engines: {node: '>= 14'} - - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2383,20 +2345,14 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} stacktracey@2.1.8: resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} @@ -2410,9 +2366,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2425,6 +2378,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -2434,16 +2390,12 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@4.0.5: - resolution: {integrity: sha512-icBTBZ3ibBaywbXUat3cK6hB5Du+Kq9Z8CRuyLmm64XIe2/r+lQcbuBx/IQgsbrC+kT2jQ0weVpZSSRIPwB6jQ==} + svelte-check@4.1.1: + resolution: {integrity: sha512-NfaX+6Qtc8W/CyVGS/F7/XdiSSyXz+WGYA9ZWV3z8tso14V2vzjfXviKaTFEzB7g8TqfgO2FOzP6XT4ApSTUTw==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: @@ -2459,18 +2411,40 @@ packages: svelte: optional: true - svelte@5.1.4: - resolution: {integrity: sha512-qgHDV7AyvBZa2pbf+V0tnvWrN1LKD8LdUsBkR/SSYVVN6zXexiXnOy5Pjcjft2y/2NJJVa8ORUHFVn3oiWCLVQ==} + svelte-sonner@0.3.28: + resolution: {integrity: sha512-K3AmlySeFifF/cKgsYNv5uXqMVNln0NBAacOYgmkQStLa/UoU0LhfAACU6Gr+YYC8bOCHdVmFNoKuDbMEsppJg==} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.1 + + svelte-toolbelt@0.7.0: + resolution: {integrity: sha512-i/Tv4NwAWWqJnK5H0F8y/ubDnogDYlwwyzKhrspTUFzrFuGnYshqd2g4/R43ds841wmaFiSW/HsdsdWhPOlrAA==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.0.0 + + svelte@5.16.2: + resolution: {integrity: sha512-S4mKWbjv53ik1NtGuO95TC7kBA8GYBIeT9fM6y2wHdLNqdCmPXJSWLVuO7vlJZ7TUksp+6qnvqCCtWnVXeTCyw==} engines: {node: '>=18'} - tailwindcss@3.4.14: - resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + + tailwind-variants@0.3.0: + resolution: {integrity: sha512-ho2k5kn+LB1fT5XdNS3Clb96zieWxbStE9wNLK7D0AV64kdZMaYzAKo0fWl6fXLPY99ffF9oBJnIj5escEl/8A==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwindcss: '*' + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} hasBin: true - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -2478,9 +2452,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} @@ -2490,8 +2461,8 @@ packages: tinyexec@0.3.1: resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} - tinypool@1.0.1: - resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@1.2.0: @@ -2502,10 +2473,6 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2521,12 +2488,8 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -2534,50 +2497,37 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - - tslib@2.8.0: - resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - typescript-eslint@8.12.1: - resolution: {integrity: sha512-SsKedZnq4TStkrpqnk+OqTnmkC9CkYBRNKjQ965CLpFruGcRkPF5UhKxbcbF6c/m2r6YAgKw/UtQxdlMjh3mug==} + typescript-eslint@8.19.0: + resolution: {integrity: sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} hasBin: true - ua-parser-js@2.0.0-beta.3: - resolution: {integrity: sha512-vZkEG/GplLRxj4XVrjLUQpSNg9Qj9RdnIqrOy8dqrLP1e5x7i2N8RfVYlWRbKEZdDSWfeWNcWS38gmieX03/5A==} + ua-is-frozen@0.1.2: + resolution: {integrity: sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==} + + ua-parser-js@2.0.0: + resolution: {integrity: sha512-SASgD4RlB7+SCMmlVNqrhPw0f/2pGawWBzJ2+LwGTD0GgNnrKGzPJDiraGHJDwW9Zm5DH2lTmUpqDpbZjJY4+Q==} hasBin: true ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - uid@2.0.2: - resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} - engines: {node: '>=8'} - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} @@ -2593,10 +2543,6 @@ packages: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -2612,8 +2558,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - vite-node@2.1.4: - resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==} + vite-node@2.1.8: + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -2623,14 +2569,8 @@ packages: peerDependencies: vite: '>=3' - vite-plugin-tailwind-purgecss@0.3.3: - resolution: {integrity: sha512-fsTAzcSdFKrhLxX8zTq3zaTFjk+APmJWOAy+1ujsmxkh9y8hIvM81dWEgdXK1k7suQjns+b7JsoIUkHpxLf5UA==} - peerDependencies: - tailwindcss: ^3.3.0 - vite: ^4.1.1 || ^5.0.0 - - vite@5.4.10: - resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2660,23 +2600,63 @@ packages: terser: optional: true - vitefu@1.0.3: - resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==} + vite@6.0.7: + resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + 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 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.0.4: + resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: vite: optional: true - vitest@2.1.4: - resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==} + vitest@2.1.8: + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.4 - '@vitest/ui': 2.1.4 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2693,9 +2673,6 @@ packages: jsdom: optional: true - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -2735,10 +2712,6 @@ packages: '@cloudflare/workers-types': optional: true - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2774,30 +2747,18 @@ packages: utf-8-validate: optional: true - xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.6.0: - resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} hasBin: true - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2808,8 +2769,8 @@ packages: zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} snapshots: @@ -2817,13 +2778,9 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@babel/runtime@7.26.0': - dependencies: - regenerator-runtime: 0.14.1 - '@cloudflare/kv-asset-handler@0.3.4': dependencies: mime: 3.0.0 @@ -2846,9 +2803,9 @@ snapshots: '@cloudflare/workers-shared@0.6.0': dependencies: mime: 3.0.0 - zod: 3.23.8 + zod: 3.24.1 - '@cloudflare/workers-types@4.20241022.0': {} + '@cloudflare/workers-types@4.20241224.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -2867,160 +2824,239 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.24.2': + optional: true + '@esbuild/android-arm64@0.17.19': optional: true '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.24.2': + optional: true + '@esbuild/android-arm@0.17.19': optional: true '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.24.2': + optional: true + '@esbuild/android-x64@0.17.19': optional: true '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.24.2': + optional: true + '@esbuild/darwin-arm64@0.17.19': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.24.2': + optional: true + '@esbuild/darwin-x64@0.17.19': optional: true '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.24.2': + optional: true + '@esbuild/freebsd-arm64@0.17.19': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.24.2': + optional: true + '@esbuild/freebsd-x64@0.17.19': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.24.2': + optional: true + '@esbuild/linux-arm64@0.17.19': optional: true '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.24.2': + optional: true + '@esbuild/linux-arm@0.17.19': optional: true '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.24.2': + optional: true + '@esbuild/linux-ia32@0.17.19': optional: true '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.24.2': + optional: true + '@esbuild/linux-loong64@0.17.19': optional: true '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.24.2': + optional: true + '@esbuild/linux-mips64el@0.17.19': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.24.2': + optional: true + '@esbuild/linux-ppc64@0.17.19': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.24.2': + optional: true + '@esbuild/linux-riscv64@0.17.19': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.24.2': + optional: true + '@esbuild/linux-s390x@0.17.19': optional: true '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.24.2': + optional: true + '@esbuild/linux-x64@0.17.19': optional: true '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + '@esbuild/netbsd-x64@0.17.19': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + '@esbuild/openbsd-x64@0.17.19': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.24.2': + optional: true + '@esbuild/sunos-x64@0.17.19': optional: true '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.24.2': + optional: true + '@esbuild/win32-arm64@0.17.19': optional: true '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.24.2': + optional: true + '@esbuild/win32-ia32@0.17.19': optional: true '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.24.2': + optional: true + '@esbuild/win32-x64@0.17.19': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0(jiti@1.21.6))': + '@esbuild/win32-x64@0.24.2': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.6))': dependencies: - eslint: 9.13.0(jiti@1.21.6) + eslint: 9.17.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.1': {} + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/compat@1.2.4(eslint@9.17.0(jiti@1.21.6))': + optionalDependencies: + eslint: 9.17.0(jiti@1.21.6) - '@eslint/config-array@0.18.0': + '@eslint/config-array@0.19.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.7 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.7.0': {} + '@eslint/core@0.9.0': {} - '@eslint/eslintrc@3.1.0': + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 - debug: 4.3.7 - espree: 10.2.0 + debug: 4.4.0 + espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 @@ -3030,11 +3066,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.13.0': {} + '@eslint/js@9.17.0': {} '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.2.0': + '@eslint/plugin-kit@0.2.3': dependencies: levn: 0.4.1 @@ -3044,24 +3080,30 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.8 - '@floating-ui/dom@1.6.11': + '@floating-ui/dom@1.6.12': dependencies: '@floating-ui/core': 1.6.8 '@floating-ui/utils': 0.2.8 '@floating-ui/utils@0.2.8': {} - '@humanfs/core@0.19.0': {} + '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.5': + '@humanfs/node@0.16.6': dependencies: - '@humanfs/core': 0.19.0 + '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/retry@0.4.1': {} + + '@internationalized/date@3.6.0': + dependencies: + '@swc/helpers': 0.5.15 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -3071,7 +3113,7 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 @@ -3093,9 +3135,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@lukeed/csprng@1.1.0': {} - - '@microsoft/signalr@8.0.7': + '@microsoft/signalr@8.0.7(patch_hash=vl6mvrodvyt4cwoevl3v2ipkay)': dependencies: abort-controller: 3.0.0 eventsource: 2.0.2 @@ -3107,34 +3147,6 @@ snapshots: - encoding - utf-8-validate - '@nestjs/axios@3.1.0(@nestjs/common@10.4.5(reflect-metadata@0.1.13)(rxjs@7.8.1))(axios@1.7.7)(rxjs@7.8.1)': - dependencies: - '@nestjs/common': 10.4.5(reflect-metadata@0.1.13)(rxjs@7.8.1) - axios: 1.7.7(debug@4.3.7) - rxjs: 7.8.1 - - '@nestjs/common@10.4.5(reflect-metadata@0.1.13)(rxjs@7.8.1)': - dependencies: - iterare: 1.2.1 - reflect-metadata: 0.1.13 - rxjs: 7.8.1 - tslib: 2.7.0 - uid: 2.0.2 - - '@nestjs/core@10.4.5(@nestjs/common@10.4.5(reflect-metadata@0.1.13)(rxjs@7.8.1))(reflect-metadata@0.1.13)(rxjs@7.8.1)': - dependencies: - '@nestjs/common': 10.4.5(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nuxtjs/opencollective': 0.3.2 - fast-safe-stringify: 2.1.1 - iterare: 1.2.1 - path-to-regexp: 3.3.0 - reflect-metadata: 0.1.13 - rxjs: 7.8.1 - tslib: 2.7.0 - uid: 2.0.2 - transitivePeerDependencies: - - encoding - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3147,14 +3159,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nuxtjs/opencollective@0.3.2': - dependencies: - chalk: 4.1.2 - consola: 2.15.3 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - '@octokit/auth-token@4.0.0': {} '@octokit/core@5.2.0': @@ -3218,270 +3222,239 @@ snapshots: dependencies: '@octokit/openapi-types': 22.2.0 - '@openapitools/openapi-generator-cli@2.15.0': - dependencies: - '@nestjs/axios': 3.1.0(@nestjs/common@10.4.5(reflect-metadata@0.1.13)(rxjs@7.8.1))(axios@1.7.7)(rxjs@7.8.1) - '@nestjs/common': 10.4.5(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.4.5(@nestjs/common@10.4.5(reflect-metadata@0.1.13)(rxjs@7.8.1))(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nuxtjs/opencollective': 0.3.2 - axios: 1.7.7(debug@4.3.7) - chalk: 4.1.2 - commander: 8.3.0 - compare-versions: 4.1.4 - concurrently: 6.5.1 - console.table: 0.10.0 - fs-extra: 10.1.0 - glob: 9.3.5 - inquirer: 8.2.6 - lodash: 4.17.21 - proxy-agent: 6.4.0 - reflect-metadata: 0.1.13 - rxjs: 7.8.1 - tslib: 2.7.0 - transitivePeerDependencies: - - '@nestjs/microservices' - - '@nestjs/platform-express' - - '@nestjs/websockets' - - class-transformer - - class-validator - - debug - - encoding - - supports-color - '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.48.2': + '@playwright/test@1.49.1': dependencies: - playwright: 1.48.2 + playwright: 1.49.1 '@polka/url@1.0.0-next.28': {} - '@rollup/plugin-commonjs@28.0.1(rollup@4.24.2)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.28.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.24.2) + '@rollup/pluginutils': 5.1.3(rollup@4.28.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.2(picomatch@4.0.2) is-reference: 1.2.1 - magic-string: 0.30.12 + magic-string: 0.30.17 picomatch: 4.0.2 optionalDependencies: - rollup: 4.24.2 + rollup: 4.28.1 - '@rollup/plugin-json@6.1.0(rollup@4.24.2)': + '@rollup/plugin-json@6.1.0(rollup@4.28.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.24.2) + '@rollup/pluginutils': 5.1.3(rollup@4.28.1) optionalDependencies: - rollup: 4.24.2 + rollup: 4.28.1 - '@rollup/plugin-node-resolve@15.3.0(rollup@4.24.2)': + '@rollup/plugin-node-resolve@16.0.0(rollup@4.28.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.24.2) + '@rollup/pluginutils': 5.1.3(rollup@4.28.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.9 optionalDependencies: - rollup: 4.24.2 + rollup: 4.28.1 - '@rollup/pluginutils@5.1.3(rollup@4.24.2)': + '@rollup/pluginutils@5.1.3(rollup@4.28.1)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.24.2 + rollup: 4.28.1 - '@rollup/rollup-android-arm-eabi@4.24.2': + '@rollup/rollup-android-arm-eabi@4.28.1': optional: true - '@rollup/rollup-android-arm64@4.24.2': + '@rollup/rollup-android-arm-eabi@4.30.0': optional: true - '@rollup/rollup-darwin-arm64@4.24.2': + '@rollup/rollup-android-arm64@4.28.1': optional: true - '@rollup/rollup-darwin-x64@4.24.2': + '@rollup/rollup-android-arm64@4.30.0': optional: true - '@rollup/rollup-freebsd-arm64@4.24.2': + '@rollup/rollup-darwin-arm64@4.28.1': optional: true - '@rollup/rollup-freebsd-x64@4.24.2': + '@rollup/rollup-darwin-arm64@4.30.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.24.2': + '@rollup/rollup-darwin-x64@4.28.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.24.2': + '@rollup/rollup-darwin-x64@4.30.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.24.2': + '@rollup/rollup-freebsd-arm64@4.28.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.24.2': + '@rollup/rollup-freebsd-arm64@4.30.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.24.2': + '@rollup/rollup-freebsd-x64@4.28.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.24.2': + '@rollup/rollup-freebsd-x64@4.30.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.24.2': + '@rollup/rollup-linux-arm-gnueabihf@4.28.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.24.2': + '@rollup/rollup-linux-arm-gnueabihf@4.30.0': optional: true - '@rollup/rollup-linux-x64-musl@4.24.2': + '@rollup/rollup-linux-arm-musleabihf@4.28.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.24.2': + '@rollup/rollup-linux-arm-musleabihf@4.30.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.24.2': + '@rollup/rollup-linux-arm64-gnu@4.28.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.24.2': + '@rollup/rollup-linux-arm64-gnu@4.30.0': optional: true - '@sentry-internal/browser-utils@8.35.0': - dependencies: - '@sentry/core': 8.35.0 - '@sentry/types': 8.35.0 - '@sentry/utils': 8.35.0 + '@rollup/rollup-linux-arm64-musl@4.28.1': + optional: true - '@sentry-internal/feedback@8.35.0': - dependencies: - '@sentry/core': 8.35.0 - '@sentry/types': 8.35.0 - '@sentry/utils': 8.35.0 + '@rollup/rollup-linux-arm64-musl@4.30.0': + optional: true - '@sentry-internal/replay-canvas@8.35.0': - dependencies: - '@sentry-internal/replay': 8.35.0 - '@sentry/core': 8.35.0 - '@sentry/types': 8.35.0 - '@sentry/utils': 8.35.0 + '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + optional: true - '@sentry-internal/replay@8.35.0': - dependencies: - '@sentry-internal/browser-utils': 8.35.0 - '@sentry/core': 8.35.0 - '@sentry/types': 8.35.0 - '@sentry/utils': 8.35.0 + '@rollup/rollup-linux-loongarch64-gnu@4.30.0': + optional: true - '@sentry/browser@8.35.0': - dependencies: - '@sentry-internal/browser-utils': 8.35.0 - '@sentry-internal/feedback': 8.35.0 - '@sentry-internal/replay': 8.35.0 - '@sentry-internal/replay-canvas': 8.35.0 - '@sentry/core': 8.35.0 - '@sentry/types': 8.35.0 - '@sentry/utils': 8.35.0 + '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + optional: true - '@sentry/core@8.35.0': - dependencies: - '@sentry/types': 8.35.0 - '@sentry/utils': 8.35.0 + '@rollup/rollup-linux-powerpc64le-gnu@4.30.0': + optional: true - '@sentry/svelte@8.35.0(svelte@5.1.4)': - dependencies: - '@sentry/browser': 8.35.0 - '@sentry/core': 8.35.0 - '@sentry/types': 8.35.0 - '@sentry/utils': 8.35.0 - magic-string: 0.30.12 - svelte: 5.1.4 + '@rollup/rollup-linux-riscv64-gnu@4.28.1': + optional: true - '@sentry/types@8.35.0': {} + '@rollup/rollup-linux-riscv64-gnu@4.30.0': + optional: true - '@sentry/utils@8.35.0': - dependencies: - '@sentry/types': 8.35.0 + '@rollup/rollup-linux-s390x-gnu@4.28.1': + optional: true - '@skeletonlabs/skeleton@2.10.3(svelte@5.1.4)': - dependencies: - esm-env: 1.0.0 - svelte: 5.1.4 + '@rollup/rollup-linux-s390x-gnu@4.30.0': + optional: true - '@skeletonlabs/tw-plugin@0.4.0(tailwindcss@3.4.14)': - dependencies: - tailwindcss: 3.4.14 + '@rollup/rollup-linux-x64-gnu@4.28.1': + optional: true - '@sveltejs/adapter-cloudflare@4.7.4(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(wrangler@3.80.5(@cloudflare/workers-types@4.20241022.0))': + '@rollup/rollup-linux-x64-gnu@4.30.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.28.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.30.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.28.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.30.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.28.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.30.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.28.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.30.0': + optional: true + + '@sveltejs/adapter-cloudflare@5.0.0(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(wrangler@3.80.5(@cloudflare/workers-types@4.20241224.0))': dependencies: - '@cloudflare/workers-types': 4.20241022.0 - '@sveltejs/kit': 2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)) - esbuild: 0.21.5 + '@cloudflare/workers-types': 4.20241224.0 + '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)) + esbuild: 0.24.2 worktop: 0.8.0-next.18 - wrangler: 3.80.5(@cloudflare/workers-types@4.20241022.0) + wrangler: 3.80.5(@cloudflare/workers-types@4.20241224.0) - '@sveltejs/adapter-node@5.2.9(@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))': + '@sveltejs/adapter-node@5.2.11(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))': dependencies: - '@rollup/plugin-commonjs': 28.0.1(rollup@4.24.2) - '@rollup/plugin-json': 6.1.0(rollup@4.24.2) - '@rollup/plugin-node-resolve': 15.3.0(rollup@4.24.2) - '@sveltejs/kit': 2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)) - rollup: 4.24.2 + '@rollup/plugin-commonjs': 28.0.1(rollup@4.28.1) + '@rollup/plugin-json': 6.1.0(rollup@4.28.1) + '@rollup/plugin-node-resolve': 16.0.0(rollup@4.28.1) + '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)) + rollup: 4.28.1 - '@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2))': + '@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)) '@types/cookie': 0.6.0 - cookie: 0.6.0 + cookie: 1.0.2 devalue: 5.1.1 - esm-env: 1.0.0 + esm-env: 1.2.1 import-meta-resolve: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.12 + magic-string: 0.30.17 mrmime: 2.0.0 sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.0 - svelte: 5.1.4 + svelte: 5.16.2 tiny-glob: 0.2.9 - vite: 5.4.10(@types/node@22.8.2) + vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1) - '@sveltejs/vite-plugin-svelte-inspector@3.0.0-next.4(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)) - debug: 4.3.7 - svelte: 5.1.4 - vite: 5.4.10(@types/node@22.8.2) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)) + debug: 4.4.0 + svelte: 5.16.2 + vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 3.0.0-next.4(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)))(svelte@5.1.4)(vite@5.4.10(@types/node@22.8.2)) - debug: 4.3.7 + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)))(svelte@5.16.2)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)) + debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.12 - svelte: 5.1.4 - vite: 5.4.10(@types/node@22.8.2) - vitefu: 1.0.3(vite@5.4.10(@types/node@22.8.2)) + magic-string: 0.30.17 + svelte: 5.16.2 + vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1) + vitefu: 1.0.4(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)) transitivePeerDependencies: - supports-color - '@tailwindcss/forms@0.5.9(tailwindcss@3.4.14)': + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/forms@0.5.9(tailwindcss@3.4.17)': dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.4.14 + tailwindcss: 3.4.17 - '@tailwindcss/typography@0.5.15(tailwindcss@3.4.14)': + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.17)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.14 + tailwindcss: 3.4.17 - '@tootallnate/quickjs-emscripten@0.23.0': {} + '@tanstack/table-core@8.20.5': {} '@types/cookie@0.6.0': {} @@ -3498,138 +3471,132 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.8.2 + '@types/node': 22.10.5 - '@types/node@22.8.2': + '@types/node@22.10.5': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 '@types/resolve@1.20.2': {} + '@types/semver@7.5.8': {} + '@types/w3c-web-serial@1.0.7': {} - '@typescript-eslint/eslint-plugin@8.12.1(@typescript-eslint/parser@8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': dependencies: - '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.12.1 - '@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.12.1 - eslint: 9.13.0(jiti@1.21.6) + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.19.0 + eslint: 9.17.0(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': dependencies: - '@typescript-eslint/scope-manager': 8.12.1 - '@typescript-eslint/types': 8.12.1 - '@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.12.1 - debug: 4.3.7 - eslint: 9.13.0(jiti@1.21.6) - optionalDependencies: - typescript: 5.6.3 + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.19.0 + debug: 4.4.0 + eslint: 9.17.0(jiti@1.21.6) + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.12.1': + '@typescript-eslint/scope-manager@8.19.0': dependencies: - '@typescript-eslint/types': 8.12.1 - '@typescript-eslint/visitor-keys': 8.12.1 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/visitor-keys': 8.19.0 - '@typescript-eslint/type-utils@8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3) - '@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) - debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + debug: 4.4.0 + eslint: 9.17.0(jiti@1.21.6) + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - - eslint - supports-color - '@typescript-eslint/types@8.12.1': {} + '@typescript-eslint/types@8.19.0': {} - '@typescript-eslint/typescript-estree@8.12.1(typescript@5.6.3)': - dependencies: - '@typescript-eslint/types': 8.12.1 - '@typescript-eslint/visitor-keys': 8.12.1 - debug: 4.3.7 - fast-glob: 3.3.2 + '@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/visitor-keys': 8.19.0 + debug: 4.4.0 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/utils@8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6)) - '@typescript-eslint/scope-manager': 8.12.1 - '@typescript-eslint/types': 8.12.1 - '@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3) - eslint: 9.13.0(jiti@1.21.6) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) + eslint: 9.17.0(jiti@1.21.6) + typescript: 5.7.2 transitivePeerDependencies: - supports-color - - typescript - - '@typescript-eslint/visitor-keys@8.12.1': - dependencies: - '@typescript-eslint/types': 8.12.1 - eslint-visitor-keys: 3.4.3 - '@vincjo/datatables@2.0.5(svelte@5.1.4)': + '@typescript-eslint/visitor-keys@8.19.0': dependencies: - svelte: 5.1.4 + '@typescript-eslint/types': 8.19.0 + eslint-visitor-keys: 4.2.0 - '@vitest/expect@2.1.4': + '@vitest/expect@2.1.8': dependencies: - '@vitest/spy': 2.1.4 - '@vitest/utils': 2.1.4 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.4(vite@5.4.10(@types/node@22.8.2))': + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.5))': dependencies: - '@vitest/spy': 2.1.4 + '@vitest/spy': 2.1.8 estree-walker: 3.0.3 - magic-string: 0.30.12 + magic-string: 0.30.14 optionalDependencies: - vite: 5.4.10(@types/node@22.8.2) + vite: 5.4.11(@types/node@22.10.5) - '@vitest/pretty-format@2.1.4': + '@vitest/pretty-format@2.1.8': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.4': + '@vitest/runner@2.1.8': dependencies: - '@vitest/utils': 2.1.4 + '@vitest/utils': 2.1.8 pathe: 1.1.2 - '@vitest/snapshot@2.1.4': + '@vitest/snapshot@2.1.8': dependencies: - '@vitest/pretty-format': 2.1.4 - magic-string: 0.30.12 + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.14 pathe: 1.1.2 - '@vitest/spy@2.1.4': + '@vitest/spy@2.1.8': dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.4': + '@vitest/utils@2.1.8': dependencies: - '@vitest/pretty-format': 2.1.4 + '@vitest/pretty-format': 2.1.8 loupe: 3.1.2 tinyrainbow: 1.2.0 @@ -3651,12 +3618,6 @@ snapshots: acorn@8.14.0: {} - agent-base@7.1.1: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -3664,10 +3625,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -3697,22 +3654,18 @@ snapshots: assertion-error@2.0.1: {} - ast-types@0.13.4: - dependencies: - tslib: 2.8.0 - asynckit@0.4.0: {} atob-lite@2.0.0: {} - autoprefixer@10.4.20(postcss@8.4.47): + autoprefixer@10.4.20(postcss@8.4.49): dependencies: browserslist: 4.24.0 caniuse-lite: 1.0.30001669 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.4.47 + postcss: 8.4.49 postcss-value-parser: 4.2.0 axios@1.7.7(debug@4.3.7): @@ -3727,19 +3680,19 @@ snapshots: balanced-match@1.0.2: {} - base64-js@1.5.1: {} - - basic-ftp@5.0.5: {} - before-after-hook@2.2.3: {} binary-extensions@2.3.0: {} - bl@4.1.0: + bits-ui@1.0.0-next.77(svelte@5.16.2): dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + '@floating-ui/core': 1.6.8 + '@floating-ui/dom': 1.6.12 + '@internationalized/date': 3.6.0 + esm-env: 1.2.1 + runed: 0.22.0(svelte@5.16.2) + svelte: 5.16.2 + svelte-toolbelt: 0.7.0(svelte@5.16.2) blake3-wasm@2.1.5: {} @@ -3765,11 +3718,6 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.0) - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - cac@6.7.14: {} callsites@3.1.0: {} @@ -3780,8 +3728,8 @@ snapshots: capnp-ts@0.7.0: dependencies: - debug: 4.3.7 - tslib: 2.8.0 + debug: 4.4.0 + tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -3798,10 +3746,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} - - chardet@0.7.0: {} - check-error@2.1.1: {} chokidar@3.6.0: @@ -3820,21 +3764,7 @@ snapshots: dependencies: readdirp: 4.0.2 - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-spinners@2.9.2: {} - - cli-width@3.0.0: {} - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone@1.0.4: {} + clsx@2.1.1: {} color-convert@2.0.1: dependencies: @@ -3846,40 +3776,17 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@12.1.0: {} - commander@4.1.1: {} - commander@8.3.0: {} - commondir@1.0.1: {} - compare-versions@4.1.4: {} - concat-map@0.0.1: {} - concurrently@6.5.1: - dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 6.6.7 - spawn-command: 0.0.2 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 16.2.0 - - consola@2.15.3: {} - - console.table@0.10.0: - dependencies: - easy-table: 1.1.0 - - cookie@0.6.0: {} - cookie@0.7.2: {} - cross-spawn@7.0.3: + cookie@1.0.2: {} + + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -3887,22 +3794,15 @@ snapshots: crypto-js@4.2.0: {} - css-tree@2.3.1: - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.1 - cssesc@3.0.0: {} data-uri-to-buffer@2.0.2: {} - data-uri-to-buffer@6.0.2: {} - - date-fns@2.30.0: + debug@4.3.7: dependencies: - '@babel/runtime': 7.26.0 + ms: 2.1.3 - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -3912,49 +3812,31 @@ snapshots: deepmerge@4.3.1: {} - defaults@1.0.4: - dependencies: - clone: 1.0.4 - defu@6.1.4: {} - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - delayed-stream@1.0.0: {} deprecation@2.3.1: {} + detect-europe-js@0.1.2: {} + devalue@5.1.1: {} didyoumean@1.2.2: {} dlv@1.1.3: {} - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 + dotenv@16.4.7: {} eastasianwidth@0.2.0: {} - easy-table@1.1.0: - optionalDependencies: - wcwidth: 1.0.1 - electron-to-chromium@1.5.40: {} - email-validator@2.0.4: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - entities@4.5.0: {} + es-module-lexer@1.5.4: {} esbuild@0.17.19: optionalDependencies: @@ -4007,45 +3889,63 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - escalade@3.2.0: {} + 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 - escape-string-regexp@1.0.5: {} + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - eslint-compat-utils@0.5.1(eslint@9.13.0(jiti@1.21.6)): + eslint-compat-utils@0.5.1(eslint@9.17.0(jiti@1.21.6)): dependencies: - eslint: 9.13.0(jiti@1.21.6) + eslint: 9.17.0(jiti@1.21.6) semver: 7.6.3 - eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@1.21.6)): + eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@1.21.6)): dependencies: - eslint: 9.13.0(jiti@1.21.6) + eslint: 9.17.0(jiti@1.21.6) - eslint-plugin-svelte@2.46.0(eslint@9.13.0(jiti@1.21.6))(svelte@5.1.4): + eslint-plugin-svelte@2.46.1(eslint@9.17.0(jiti@1.21.6))(svelte@5.16.2): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.6)) '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.13.0(jiti@1.21.6) - eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.6)) + eslint: 9.17.0(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.17.0(jiti@1.21.6)) esutils: 2.0.3 known-css-properties: 0.35.0 - postcss: 8.4.47 - postcss-load-config: 3.1.4(postcss@8.4.47) - postcss-safe-parser: 6.0.0(postcss@8.4.47) + postcss: 8.4.49 + postcss-load-config: 3.1.4(postcss@8.4.49) + postcss-safe-parser: 6.0.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 semver: 7.6.3 - svelte-eslint-parser: 0.43.0(svelte@5.1.4) + svelte-eslint-parser: 0.43.0(svelte@5.16.2) optionalDependencies: - svelte: 5.1.4 + svelte: 5.16.2 transitivePeerDependencies: - ts-node @@ -4054,37 +3954,37 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-scope@8.1.0: + eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.1.0: {} + eslint-visitor-keys@4.2.0: {} - eslint@9.13.0(jiti@1.21.6): + eslint@9.17.0(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6)) - '@eslint-community/regexpp': 4.11.1 - '@eslint/config-array': 0.18.0 - '@eslint/core': 0.7.0 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.13.0 - '@eslint/plugin-kit': 0.2.0 - '@humanfs/node': 0.16.5 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.6)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.0 + '@eslint/core': 0.9.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.17.0 + '@eslint/plugin-kit': 0.2.3 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.1 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.7 + cross-spawn: 7.0.6 + debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.1.0 - eslint-visitor-keys: 4.1.0 - espree: 10.2.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -4099,19 +3999,18 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - text-table: 0.2.0 optionalDependencies: jiti: 1.21.6 transitivePeerDependencies: - supports-color - esm-env@1.0.0: {} + esm-env@1.2.1: {} - espree@10.2.0: + espree@10.3.0: dependencies: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 4.1.0 + eslint-visitor-keys: 4.2.0 espree@9.6.1: dependencies: @@ -4119,22 +4018,19 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - - esptool-js@0.4.6(patch_hash=3a3x37scxxjnnesy2e5ida6v34): + esptool-js@0.5.2(patch_hash=yai43fsvnizsaie2tx4fahz3ay): dependencies: atob-lite: 2.0.0 pako: 2.1.0 - tslib: 2.8.0 + tslib: 2.8.1 esquery@1.6.0: dependencies: estraverse: 5.3.0 - esrap@1.2.2: + esrap@1.3.2: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 esrecurse@4.3.0: dependencies: @@ -4160,12 +4056,6 @@ snapshots: expect-type@1.1.0: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -4176,12 +4066,18 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fast-safe-stringify@2.1.1: {} - fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -4192,13 +4088,9 @@ snapshots: fetch-cookie@2.2.0: dependencies: - set-cookie-parser: 2.7.0 + set-cookie-parser: 2.7.1 tough-cookie: 4.1.4 - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -4214,10 +4106,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 - flatted@3.3.1: {} + flatted@3.3.2: {} follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: @@ -4225,7 +4117,7 @@ snapshots: foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 form-data@4.0.1: @@ -4236,20 +4128,6 @@ snapshots: fraction.js@4.3.7: {} - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs.realpath@1.0.0: {} - fsevents@2.3.2: optional: true @@ -4258,22 +4136,11 @@ snapshots: function-bind@1.1.2: {} - get-caller-file@2.0.5: {} - get-source@2.0.12: dependencies: data-uri-to-buffer: 2.0.2 source-map: 0.6.1 - get-uri@6.0.3: - dependencies: - basic-ftp: 5.0.5 - data-uri-to-buffer: 6.0.2 - debug: 4.3.7 - fs-extra: 11.2.0 - transitivePeerDependencies: - - supports-color - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4293,23 +4160,14 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@9.3.5: - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.4 - minipass: 4.2.8 - path-scurry: 1.11.1 - globals@14.0.0: {} - globals@15.11.0: {} + globals@15.14.0: {} globalyzer@0.1.0: {} globrex@0.1.2: {} - graceful-fs@4.2.11: {} - graphemer@1.4.0: {} has-flag@4.0.0: {} @@ -4318,28 +4176,6 @@ snapshots: dependencies: function-bind: 1.1.2 - highlight.js@11.10.0: {} - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.5: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - ieee754@1.2.1: {} - ignore@5.3.2: {} import-fresh@3.3.0: @@ -4351,36 +4187,17 @@ snapshots: imurmurhash@0.1.4: {} - inherits@2.0.4: {} - - inquirer@8.2.6: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 6.2.0 - - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + inline-style-parser@0.2.4: {} is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-core-module@2.15.1: + is-core-module@2.16.0: + dependencies: + hasown: 2.0.2 + + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -4392,8 +4209,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-interactive@1.0.0: {} - is-module@1.0.0: {} is-number@7.0.0: {} @@ -4402,16 +4217,14 @@ snapshots: dependencies: '@types/estree': 1.0.6 - is-reference@3.0.2: + is-reference@3.0.3: dependencies: '@types/estree': 1.0.6 - is-unicode-supported@0.1.0: {} + is-standalone-pwa@0.1.1: {} isexe@2.0.0: {} - iterare@1.2.1: {} - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -4420,26 +4233,16 @@ snapshots: jiti@1.21.6: {} - js-sha1@0.7.0: {} - js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -4455,7 +4258,7 @@ snapshots: lilconfig@2.1.0: {} - lilconfig@3.1.2: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -4471,28 +4274,25 @@ snapshots: lodash.merge@4.6.2: {} - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - loupe@3.1.2: {} lru-cache@10.4.3: {} - lru-cache@7.18.3: {} + lucide-svelte@0.469.0(svelte@5.16.2): + dependencies: + svelte: 5.16.2 magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.12: + magic-string@0.30.14: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - mdn-data@2.0.30: {} + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 merge2@1.4.1: {} @@ -4509,8 +4309,6 @@ snapshots: mime@3.0.0: {} - mimic-fn@2.1.0: {} - mini-svg-data-uri@1.4.4: {} miniflare@3.20241011.0: @@ -4526,7 +4324,7 @@ snapshots: workerd: 1.20241011.1 ws: 8.18.0 youch: 3.3.4 - zod: 3.23.8 + zod: 3.24.1 transitivePeerDependencies: - bufferutil - supports-color @@ -4536,16 +4334,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@8.0.4: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - minipass@4.2.8: {} - minipass@7.1.2: {} mri@1.2.0: {} @@ -4556,20 +4348,16 @@ snapshots: mustache@4.2.0: {} - mute-stream@0.0.8: {} - mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} - netmask@2.0.2: {} - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -4592,10 +4380,6 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -4605,20 +4389,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - os-tmpdir@1.0.2: {} - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -4627,24 +4397,6 @@ snapshots: dependencies: p-limit: 3.1.0 - pac-proxy-agent@7.0.2: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.1 - debug: 4.3.7 - get-uri: 6.0.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.4 - transitivePeerDependencies: - - supports-color - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - package-json-from-dist@1.0.1: {} pako@2.1.0: {} @@ -4653,15 +4405,6 @@ snapshots: dependencies: callsites: 3.1.0 - parse5-htmlparser2-tree-adapter@7.1.0: - dependencies: - domhandler: 5.0.3 - parse5: 7.2.0 - - parse5@7.2.0: - dependencies: - entities: 4.5.0 - path-exists@4.0.0: {} path-key@3.1.1: {} @@ -4673,8 +4416,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@3.3.0: {} - path-to-regexp@6.3.0: {} pathe@1.1.2: {} @@ -4691,52 +4432,52 @@ snapshots: pirates@4.0.6: {} - playwright-core@1.48.2: {} + playwright-core@1.49.1: {} - playwright@1.48.2: + playwright@1.49.1: dependencies: - playwright-core: 1.48.2 + playwright-core: 1.49.1 optionalDependencies: fsevents: 2.3.2 - postcss-import@15.1.0(postcss@8.4.47): + postcss-import@15.1.0(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.9 - postcss-js@4.0.1(postcss@8.4.47): + postcss-js@4.0.1(postcss@8.4.49): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.47 + postcss: 8.4.49 - postcss-load-config@3.1.4(postcss@8.4.47): + postcss-load-config@3.1.4(postcss@8.4.49): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.47 + postcss: 8.4.49 - postcss-load-config@4.0.2(postcss@8.4.47): + postcss-load-config@4.0.2(postcss@8.4.49): dependencies: - lilconfig: 3.1.2 - yaml: 2.6.0 + lilconfig: 3.1.3 + yaml: 2.6.1 optionalDependencies: - postcss: 8.4.47 + postcss: 8.4.49 - postcss-nested@6.2.0(postcss@8.4.47): + postcss-nested@6.2.0(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 postcss-selector-parser: 6.1.2 - postcss-safe-parser@6.0.0(postcss@8.4.47): + postcss-safe-parser@6.0.0(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 - postcss-scss@4.0.9(postcss@8.4.47): + postcss-scss@4.0.9(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 postcss-selector-parser@6.0.10: dependencies: @@ -4750,35 +4491,28 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.47: + postcss@8.4.49: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.1.4): + prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.16.2): dependencies: - prettier: 3.3.3 - svelte: 5.1.4 + prettier: 3.4.2 + svelte: 5.16.2 - prettier@3.3.3: {} + prettier-plugin-tailwindcss@0.6.9(prettier-plugin-svelte@3.3.2(prettier@3.4.2)(svelte@5.16.2))(prettier@3.4.2): + dependencies: + prettier: 3.4.2 + optionalDependencies: + prettier-plugin-svelte: 3.3.2(prettier@3.4.2)(svelte@5.16.2) - printable-characters@1.0.42: {} + prettier@3.4.2: {} - proxy-agent@6.4.0: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.2 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.4 - transitivePeerDependencies: - - supports-color + printable-characters@1.0.42: {} proxy-from-env@1.1.0: {} @@ -4786,18 +4520,6 @@ snapshots: punycode@2.3.1: {} - purgecss-from-html@6.0.0: - dependencies: - parse5: 7.2.0 - parse5-htmlparser2-tree-adapter: 7.1.0 - - purgecss@6.0.0: - dependencies: - commander: 12.1.0 - glob: 10.4.5 - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 - querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -4806,42 +4528,31 @@ snapshots: dependencies: pify: 2.3.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 readdirp@4.0.2: {} - reflect-metadata@0.1.13: {} - - regenerator-runtime@0.14.1: {} - regexparam@3.0.0: {} - require-directory@2.1.1: {} - requires-port@1.0.0: {} resolve-from@4.0.0: {} - resolve.exports@2.0.2: {} + resolve.exports@2.0.3: {} - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@3.1.0: + resolve@1.22.9: dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 + is-core-module: 2.16.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 reusify@1.0.4: {} @@ -4859,52 +4570,74 @@ snapshots: dependencies: estree-walker: 0.6.1 - rollup@4.24.2: + rollup@4.28.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.24.2 - '@rollup/rollup-android-arm64': 4.24.2 - '@rollup/rollup-darwin-arm64': 4.24.2 - '@rollup/rollup-darwin-x64': 4.24.2 - '@rollup/rollup-freebsd-arm64': 4.24.2 - '@rollup/rollup-freebsd-x64': 4.24.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.24.2 - '@rollup/rollup-linux-arm-musleabihf': 4.24.2 - '@rollup/rollup-linux-arm64-gnu': 4.24.2 - '@rollup/rollup-linux-arm64-musl': 4.24.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.24.2 - '@rollup/rollup-linux-riscv64-gnu': 4.24.2 - '@rollup/rollup-linux-s390x-gnu': 4.24.2 - '@rollup/rollup-linux-x64-gnu': 4.24.2 - '@rollup/rollup-linux-x64-musl': 4.24.2 - '@rollup/rollup-win32-arm64-msvc': 4.24.2 - '@rollup/rollup-win32-ia32-msvc': 4.24.2 - '@rollup/rollup-win32-x64-msvc': 4.24.2 + '@rollup/rollup-android-arm-eabi': 4.28.1 + '@rollup/rollup-android-arm64': 4.28.1 + '@rollup/rollup-darwin-arm64': 4.28.1 + '@rollup/rollup-darwin-x64': 4.28.1 + '@rollup/rollup-freebsd-arm64': 4.28.1 + '@rollup/rollup-freebsd-x64': 4.28.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 + '@rollup/rollup-linux-arm-musleabihf': 4.28.1 + '@rollup/rollup-linux-arm64-gnu': 4.28.1 + '@rollup/rollup-linux-arm64-musl': 4.28.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 + '@rollup/rollup-linux-riscv64-gnu': 4.28.1 + '@rollup/rollup-linux-s390x-gnu': 4.28.1 + '@rollup/rollup-linux-x64-gnu': 4.28.1 + '@rollup/rollup-linux-x64-musl': 4.28.1 + '@rollup/rollup-win32-arm64-msvc': 4.28.1 + '@rollup/rollup-win32-ia32-msvc': 4.28.1 + '@rollup/rollup-win32-x64-msvc': 4.28.1 fsevents: 2.3.3 - run-async@2.4.1: {} + rollup@4.30.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.30.0 + '@rollup/rollup-android-arm64': 4.30.0 + '@rollup/rollup-darwin-arm64': 4.30.0 + '@rollup/rollup-darwin-x64': 4.30.0 + '@rollup/rollup-freebsd-arm64': 4.30.0 + '@rollup/rollup-freebsd-x64': 4.30.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.0 + '@rollup/rollup-linux-arm-musleabihf': 4.30.0 + '@rollup/rollup-linux-arm64-gnu': 4.30.0 + '@rollup/rollup-linux-arm64-musl': 4.30.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.0 + '@rollup/rollup-linux-riscv64-gnu': 4.30.0 + '@rollup/rollup-linux-s390x-gnu': 4.30.0 + '@rollup/rollup-linux-x64-gnu': 4.30.0 + '@rollup/rollup-linux-x64-musl': 4.30.0 + '@rollup/rollup-win32-arm64-msvc': 4.30.0 + '@rollup/rollup-win32-ia32-msvc': 4.30.0 + '@rollup/rollup-win32-x64-msvc': 4.30.0 + fsevents: 2.3.3 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - rxjs@6.6.7: + runed@0.20.0(svelte@5.16.2): dependencies: - tslib: 1.14.1 + esm-env: 1.2.1 + svelte: 5.16.2 - rxjs@7.8.1: + runed@0.22.0(svelte@5.16.2): dependencies: - tslib: 2.8.0 + esm-env: 1.2.1 + svelte: 5.16.2 sade@1.8.1: dependencies: mri: 1.2.0 - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - selfsigned@2.4.1: dependencies: '@types/node-forge': 1.3.11 @@ -4912,8 +4645,6 @@ snapshots: semver@7.6.3: {} - set-cookie-parser@2.7.0: {} - set-cookie-parser@2.7.1: {} shebang-command@2.0.0: @@ -4924,8 +4655,6 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} sirv@3.0.0: @@ -4934,31 +4663,12 @@ snapshots: mrmime: 2.0.0 totalist: 3.0.1 - smart-buffer@4.2.0: {} - - socks-proxy-agent@8.0.4: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color - - socks@2.8.3: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - source-map-js@1.2.1: {} source-map@0.6.1: {} sourcemap-codec@1.4.8: {} - spawn-command@0.0.2: {} - - sprintf-js@1.1.3: {} - stackback@0.0.2: {} stacktracey@2.1.8: @@ -4966,7 +4676,7 @@ snapshots: as-table: 1.0.55 get-source: 2.0.12 - std-env@3.7.0: {} + std-env@3.8.0: {} stoppable@1.1.0: {} @@ -4982,10 +4692,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -4996,9 +4702,13 @@ snapshots: strip-json-comments@3.1.1: {} + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -5010,35 +4720,42 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.0.5(picomatch@4.0.2)(svelte@5.1.4)(typescript@5.6.3): + svelte-check@4.1.1(picomatch@4.0.2)(svelte@5.16.2)(typescript@5.7.2): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.1 fdir: 6.4.2(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.1.4 - typescript: 5.6.3 + svelte: 5.16.2 + typescript: 5.7.2 transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.43.0(svelte@5.1.4): + svelte-eslint-parser@0.43.0(svelte@5.16.2): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.47 - postcss-scss: 4.0.9(postcss@8.4.47) + postcss: 8.4.49 + postcss-scss: 4.0.9(postcss@8.4.49) optionalDependencies: - svelte: 5.1.4 + svelte: 5.16.2 + + svelte-sonner@0.3.28(svelte@5.16.2): + dependencies: + svelte: 5.16.2 + + svelte-toolbelt@0.7.0(svelte@5.16.2): + dependencies: + clsx: 2.1.1 + runed: 0.20.0(svelte@5.16.2) + style-to-object: 1.0.8 + svelte: 5.16.2 - svelte@5.1.4: + svelte@5.16.2: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -5047,14 +4764,26 @@ snapshots: acorn-typescript: 1.4.13(acorn@8.14.0) aria-query: 5.3.2 axobject-query: 4.1.0 - esm-env: 1.0.0 - esrap: 1.2.2 - is-reference: 3.0.2 + clsx: 2.1.1 + esm-env: 1.2.1 + esrap: 1.3.2 + is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.12 + magic-string: 0.30.17 zimmerframe: 1.1.2 - tailwindcss@3.4.14: + tailwind-merge@2.6.0: {} + + tailwind-variants@0.3.0(tailwindcss@3.4.17): + dependencies: + tailwind-merge: 2.6.0 + tailwindcss: 3.4.17 + + tailwindcss-animate@1.0.7(tailwindcss@3.4.17): + dependencies: + tailwindcss: 3.4.17 + + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -5065,24 +4794,22 @@ snapshots: glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.21.6 - lilconfig: 2.1.0 + lilconfig: 3.1.3 micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.47 - postcss-import: 15.1.0(postcss@8.4.47) - postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47) - postcss-nested: 6.2.0(postcss@8.4.47) + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49) + postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 - resolve: 1.22.8 + resolve: 1.22.9 sucrase: 3.35.0 transitivePeerDependencies: - ts-node - text-table@0.2.0: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -5091,8 +4818,6 @@ snapshots: dependencies: any-promise: 1.3.0 - through@2.3.8: {} - tiny-glob@0.2.9: dependencies: globalyzer: 0.1.0 @@ -5102,16 +4827,12 @@ snapshots: tinyexec@0.3.1: {} - tinypool@1.0.1: {} + tinypool@1.0.2: {} tinyrainbow@1.2.0: {} tinyspy@3.0.2: {} - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -5127,48 +4848,41 @@ snapshots: tr46@0.0.3: {} - tree-kill@1.2.2: {} - - ts-api-utils@1.3.0(typescript@5.6.3): + ts-api-utils@1.4.3(typescript@5.7.2): dependencies: - typescript: 5.6.3 + typescript: 5.7.2 ts-interface-checker@0.1.13: {} - tslib@1.14.1: {} - - tslib@2.7.0: {} - - tslib@2.8.0: {} + tslib@2.8.1: {} type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-fest@0.21.3: {} - - typescript-eslint@8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3): + typescript-eslint@8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.12.1(@typescript-eslint/parser@8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/parser': 8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + eslint: 9.17.0(jiti@1.21.6) + typescript: 5.7.2 transitivePeerDependencies: - - eslint - supports-color - typescript@5.6.3: {} + typescript@5.7.2: {} - ua-parser-js@2.0.0-beta.3: {} - - ufo@1.5.4: {} + ua-is-frozen@0.1.2: {} - uid@2.0.2: + ua-parser-js@2.0.0: dependencies: - '@lukeed/csprng': 1.1.0 + detect-europe-js: 0.1.2 + is-standalone-pwa: 0.1.1 + ua-is-frozen: 0.1.2 - undici-types@6.19.8: {} + ufo@1.5.4: {} + + undici-types@6.20.0: {} undici@5.28.4: dependencies: @@ -5185,8 +4899,6 @@ snapshots: universalify@0.2.0: {} - universalify@2.0.1: {} - update-browserslist-db@1.1.1(browserslist@4.24.0): dependencies: browserslist: 4.24.0 @@ -5204,12 +4916,13 @@ snapshots: util-deprecate@1.0.2: {} - vite-node@2.1.4(@types/node@22.8.2): + vite-node@2.1.8(@types/node@22.10.5): dependencies: cac: 6.7.14 - debug: 4.3.7 + debug: 4.4.0 + es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.10(@types/node@22.8.2) + vite: 5.4.11(@types/node@22.10.5) transitivePeerDependencies: - '@types/node' - less @@ -5221,63 +4934,64 @@ snapshots: - supports-color - terser - vite-plugin-mkcert@1.17.6(vite@5.4.10(@types/node@22.8.2)): + vite-plugin-mkcert@1.17.6(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)): dependencies: '@octokit/rest': 20.1.1 axios: 1.7.7(debug@4.3.7) debug: 4.3.7 picocolors: 1.1.1 - vite: 5.4.10(@types/node@22.8.2) + vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1) transitivePeerDependencies: - supports-color - vite-plugin-tailwind-purgecss@0.3.3(tailwindcss@3.4.14)(vite@5.4.10(@types/node@22.8.2)): + vite@5.4.11(@types/node@22.10.5): dependencies: - chalk: 5.3.0 - css-tree: 2.3.1 - fast-glob: 3.3.2 - purgecss: 6.0.0 - purgecss-from-html: 6.0.0 - tailwindcss: 3.4.14 - vite: 5.4.10(@types/node@22.8.2) + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.30.0 + optionalDependencies: + '@types/node': 22.10.5 + fsevents: 2.3.3 - vite@5.4.10(@types/node@22.8.2): + vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1): dependencies: - esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.24.2 + esbuild: 0.24.2 + postcss: 8.4.49 + rollup: 4.30.0 optionalDependencies: - '@types/node': 22.8.2 + '@types/node': 22.10.5 fsevents: 2.3.3 + jiti: 1.21.6 + yaml: 2.6.1 - vitefu@1.0.3(vite@5.4.10(@types/node@22.8.2)): + vitefu@1.0.4(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1)): optionalDependencies: - vite: 5.4.10(@types/node@22.8.2) + vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.6)(yaml@2.6.1) - vitest@2.1.4(@types/node@22.8.2): + vitest@2.1.8(@types/node@22.10.5): dependencies: - '@vitest/expect': 2.1.4 - '@vitest/mocker': 2.1.4(vite@5.4.10(@types/node@22.8.2)) - '@vitest/pretty-format': 2.1.4 - '@vitest/runner': 2.1.4 - '@vitest/snapshot': 2.1.4 - '@vitest/spy': 2.1.4 - '@vitest/utils': 2.1.4 + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.5)) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 chai: 5.1.2 - debug: 4.3.7 + debug: 4.4.0 expect-type: 1.1.0 - magic-string: 0.30.12 + magic-string: 0.30.14 pathe: 1.1.2 - std-env: 3.7.0 + std-env: 3.8.0 tinybench: 2.9.0 tinyexec: 0.3.1 - tinypool: 1.0.1 + tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.10(@types/node@22.8.2) - vite-node: 2.1.4(@types/node@22.8.2) + vite: 5.4.11(@types/node@22.10.5) + vite-node: 2.1.8(@types/node@22.10.5) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.8.2 + '@types/node': 22.10.5 transitivePeerDependencies: - less - lightningcss @@ -5289,10 +5003,6 @@ snapshots: - supports-color - terser - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -5324,7 +5034,7 @@ snapshots: mrmime: 2.0.0 regexparam: 3.0.0 - wrangler@3.80.5(@cloudflare/workers-types@4.20241022.0): + wrangler@3.80.5(@cloudflare/workers-types@4.20241224.0): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 '@cloudflare/workers-shared': 0.6.0 @@ -5334,29 +5044,23 @@ snapshots: chokidar: 3.6.0 esbuild: 0.17.19 miniflare: 3.20241011.0 - nanoid: 3.3.7 + nanoid: 3.3.8 path-to-regexp: 6.3.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 + resolve: 1.22.10 + resolve.exports: 2.0.3 selfsigned: 2.4.1 source-map: 0.6.1 unenv: unenv-nightly@2.0.0-20241009-125958-e8ea22f workerd: 1.20241011.1 - xxhash-wasm: 1.0.2 + xxhash-wasm: 1.1.0 optionalDependencies: - '@cloudflare/workers-types': 4.20241022.0 + '@cloudflare/workers-types': 4.20241224.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -5375,25 +5079,11 @@ snapshots: ws@8.18.0: {} - xxhash-wasm@1.0.2: {} - - y18n@5.0.8: {} + xxhash-wasm@1.1.0: {} yaml@1.10.2: {} - yaml@2.6.0: {} - - yargs-parser@20.2.9: {} - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 + yaml@2.6.1: {} yocto-queue@0.1.0: {} @@ -5405,4 +5095,4 @@ snapshots: zimmerframe@1.1.2: {} - zod@3.23.8: {} + zod@3.24.1: {} diff --git a/src/app.css b/src/app.css new file mode 100644 index 00000000..d613f003 --- /dev/null +++ b/src/app.css @@ -0,0 +1,85 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } + + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 0 0% 98%; + --ring: 0 0% 3.9%; + --radius: 0.5rem; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + } + + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --ring: 0 0% 83.1%; + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8%; + } + + .kbd { + @apply inline-flex min-h-[30px] items-center justify-center rounded-md border border-gray-200 bg-white px-1.5 py-1 font-mono text-sm text-gray-800 shadow-[0px_2px_0px_0px_rgba(0,0,0,0.08)]; + } + + .dark .kbd { + @apply border-neutral-700 bg-neutral-900 text-neutral-200 shadow-[0px_2px_0px_0px_rgba(255,255,255,0.1)]; + } + + .code { + @apply relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold; + } +} diff --git a/src/app.d.ts b/src/app.d.ts index c90fedc2..4906b5df 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -4,7 +4,7 @@ /// /// -import type { TurnstileInstance } from "$lib/types/TurnstileInstance"; +import type { TurnstileInstance } from '$lib/types/TurnstileInstance'; declare global { declare namespace App { @@ -18,4 +18,4 @@ declare global { } } -export { }; +export {}; diff --git a/src/app.html b/src/app.html index cec2dcb9..5823dd60 100644 --- a/src/app.html +++ b/src/app.html @@ -2,13 +2,12 @@ - + - - OpenShock %sveltekit.head% + - +
%sveltekit.body%
diff --git a/src/app.postcss b/src/app.postcss deleted file mode 100644 index a6280b96..00000000 --- a/src/app.postcss +++ /dev/null @@ -1,21 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; -@tailwind variants; - -/* place global styles here */ -html, -body { - @apply h-full w-full overflow-hidden; -} - -@layer components { - .responsive-card { - @apply m-auto h-full w-full max-w-full overflow-hidden rounded-none; - } - @media (min-width: 700px) { - .responsive-card { - @apply my-8 h-auto w-1/2 max-w-[40rem] rounded-2xl; - } - } -} diff --git a/src/error.html b/src/error.html new file mode 100644 index 00000000..d44bffcd --- /dev/null +++ b/src/error.html @@ -0,0 +1,12 @@ + + + + + %sveltekit.error.message% + + +

Something went really wrong!

+

Status: %sveltekit.status%

+

Message: %sveltekit.error.message%

+ + diff --git a/src/hooks.client.ts b/src/hooks.client.ts deleted file mode 100644 index aa2a9252..00000000 --- a/src/hooks.client.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { PUBLIC_SENTRY_DSN, PUBLIC_SENTRY_ENABLED, PUBLIC_SENTRY_REPLAYS_ONERROR_SAMPLERATE, PUBLIC_SENTRY_REPLAYS_SESSION_SAMPLERATE, PUBLIC_SENTRY_TRACES_SAMPLERATE } from '$env/static/public'; -import { browserTracingIntegration, captureException, init as SentryInit, replayIntegration } from '@sentry/svelte'; -import type { HandleServerError } from '@sveltejs/kit'; - -const sentryEnabled = PUBLIC_SENTRY_ENABLED === 'true'; - -let errorHandler: HandleServerError; -if (sentryEnabled) { - // Initialize Sentry for error and performance monitoring - SentryInit({ - dsn: PUBLIC_SENTRY_DSN, - tracesSampleRate: parseFloat(PUBLIC_SENTRY_TRACES_SAMPLERATE), - - // This sets the sample rate to be 10%. You may want this to be 100% while - // in development and sample at a lower rate in production - replaysSessionSampleRate: parseFloat(PUBLIC_SENTRY_REPLAYS_SESSION_SAMPLERATE), - - // If the entire session is not sampled, use the below sample rate to sample - // sessions when an error occurs. - replaysOnErrorSampleRate: parseFloat(PUBLIC_SENTRY_REPLAYS_ONERROR_SAMPLERATE), - - // If you don't want to use Session Replay, just remove the line below: - integrations: [browserTracingIntegration(), replayIntegration()], - }); - errorHandler = ({ error, event }) => { - const eventId = captureException(error, { extra: { event } }); - - return { - message: 'An error occurred', - eventId, - }; - }; -} else { - console.log('Sentry disabled in dev mode'); - errorHandler = (e) => { - console.error(e); - }; -} - -// If you have a custom error handler, pass it to `handleErrorWithSentry` -export const handleError = errorHandler; diff --git a/src/index.test.ts b/src/index.test.ts index 964d2872..aa934263 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect } from 'vitest'; +import { describe, expect, it } from 'vitest'; describe('sum test', () => { it('adds 1 + 2 to equal 3', () => { diff --git a/src/lib/components/EspTool/FlashManager.ts b/src/lib/EspTool/FlashManager.ts similarity index 62% rename from src/lib/components/EspTool/FlashManager.ts rename to src/lib/EspTool/FlashManager.ts index c9e150f8..3bc19c2d 100644 --- a/src/lib/components/EspTool/FlashManager.ts +++ b/src/lib/EspTool/FlashManager.ts @@ -1,4 +1,10 @@ -import { ESPLoader, Transport, type LoaderOptions, type IEspLoaderTerminal, type FlashOptions } from 'esptool-js'; +import { + ESPLoader, + Transport, + type LoaderOptions, + type IEspLoaderTerminal, + type FlashOptions, +} from 'esptool-js'; import HashMD5 from 'crypto-js/md5'; import Latin1 from 'crypto-js/enc-latin1'; @@ -8,7 +14,12 @@ export default class FlashManager { private terminal: IEspLoaderTerminal; private chip: string; - private constructor(transport: Transport, loader: ESPLoader, terminal: IEspLoaderTerminal, chip: string) { + private constructor( + transport: Transport, + loader: ESPLoader, + terminal: IEspLoaderTerminal, + chip: string + ) { this.transport = transport; this.loader = loader; this.terminal = terminal; @@ -18,18 +29,19 @@ export default class FlashManager { static async Connect(serialPort: SerialPort, terminal: IEspLoaderTerminal) { try { await serialPort.close(); // TODO: Find some way to detect if the port is already open + // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { - // Ignore + /* empty */ } try { - console.log("Connecting to", serialPort); + console.log('Connecting to', serialPort); const transport = new Transport(serialPort); const flashOptions = { transport, baudrate: 115200, - terminal + terminal, } as LoaderOptions; const loader = new ESPLoader(flashOptions); @@ -52,14 +64,14 @@ export default class FlashManager { } async disconnect() { - console.log("Disconnecting"); + console.log('Disconnecting'); if (this.transport) { await this.transport.disconnect(); this.transport = null; } this.loader = null; this.terminal.clean(); - console.log("Disconnected"); + console.log('Disconnected'); } async erase() { @@ -104,15 +116,17 @@ export default class FlashManager { } const flashOptions = { - fileArray: [{ - data: arrayBufferToString(data), - address: 0 - }], + fileArray: [ + { + data: arrayBufferToString(data), + address: 0, + }, + ], flashSize: 'keep', eraseAll, compress: true, reportProgress, - calculateMD5Hash: (image) => HashMD5(Latin1.parse(image)).toString() + calculateMD5Hash: (image) => HashMD5(Latin1.parse(image)).toString(), } as FlashOptions; try { @@ -124,84 +138,39 @@ export default class FlashManager { this.terminal.writeLine(`Failed to flash: ${e}`); return false; } - } private consoleRunning = false; async readConsoleLoop() { - try { - this.consoleRunning = true; + let ok = true; + this.consoleRunning = true; - await this._internalConsoleLoop(0); - - return true; + try { + await this._internalConsoleLoop(); } catch (e) { console.error(e); this.terminal.writeLine(`Failed to read console: ${e}`); - - this.consoleRunning = false; - - return false; - } - } - - private async _internalConsoleLoop(timeout: number) { - const reader = this?.transport?.device?.readable?.getReader(); - if (!reader) { - console.error("No reader"); - this.terminal.writeLine("No reader"); - return; - } - - while (this.transport) { - const value = await this._rawRead(timeout); - - if (value === null) { - break; - } - - this.terminal.write(value.toString()); + ok = false; } this.consoleRunning = false; - } - - private async _rawRead(timeout = 0) { - if (!this.transport) return null; - - if (this.transport.leftOver.length != 0) { - const p = this.transport.leftOver; - this.transport.leftOver = new Uint8Array(0); - return p; - } - if (!this.transport.device.readable) { - return this.transport.leftOver; - } - const reader = this.transport.device.readable.getReader(); - - let t: ReturnType | null = null; - try { - if (timeout > 0) { - t = setTimeout(async () => { - await reader.cancel(); - }, timeout); - } + return ok; + } - const { value, done } = await reader.read(); + private async _internalConsoleLoop() { + while (this.transport) { + const readLoop = this.transport.read(250); + while (true) { + const { value, done } = await readLoop.next(); - if (done) { - throw new Error("Timeout"); - } + if (!value || done) { + break; + } - return value; - } finally { - if (timeout > 0 && t) { - clearTimeout(t); + this.terminal.write(value.toString()); } - - reader.releaseLock(); } } } diff --git a/src/lib/components/EspTool/CDN.ts b/src/lib/api/firmwareCDN.ts similarity index 66% rename from src/lib/components/EspTool/CDN.ts rename to src/lib/api/firmwareCDN.ts index 007e8c1b..05afe2b8 100644 --- a/src/lib/components/EspTool/CDN.ts +++ b/src/lib/api/firmwareCDN.ts @@ -1,3 +1,5 @@ +import { toast } from 'svelte-sonner'; + async function DownloadText(url: string) { try { const response = await fetch(url); @@ -5,6 +7,8 @@ async function DownloadText(url: string) { const text = await response.text(); return text.trim(); } catch (e) { + console.error(e); + toast.error(`Failed to fetch ${url}`); return null; } } @@ -12,13 +16,13 @@ async function DownloadLines(url: string) { const text = await DownloadText(url); if (!text) return null; - return text.split("\n").map((x) => x.trim()); + return text.split('\n').map((x) => x.trim()); } async function DownloadBinary(url: string, onProgress: (progress: number) => void) { const response = await fetch(url); if (!response.ok) return null; - const contentLength = parseInt(response.headers.get("content-length")?.trim() ?? "0"); + const contentLength = parseInt(response.headers.get('content-length')?.trim() ?? '0'); const reader = response.body?.getReader(); if (!reader) return null; @@ -26,7 +30,7 @@ async function DownloadBinary(url: string, onProgress: (progress: number) => voi let receivedLength = 0; const chunks: Uint8Array[] = []; - for (; ;) { + for (;;) { const { done, value } = await reader.read(); if (done) break; if (!value) continue; @@ -42,9 +46,9 @@ async function DownloadBinary(url: string, onProgress: (progress: number) => voi return await blob.arrayBuffer(); } -export const Channels = ["stable", "beta", "develop"] as const; -export type Channel = typeof Channels[number]; -export type ChannelDict = { [key in typeof Channels[number]]?: string }; +export const Channels = ['stable', 'beta', 'develop'] as const; +export type Channel = (typeof Channels)[number]; +export type ChannelDict = { [key in (typeof Channels)[number]]?: string }; function DownloadChannelVersion(channel: Channel) { return DownloadText(`https://firmware.openshock.org/version-${channel}.txt`); @@ -67,18 +71,27 @@ export function GetChannelBoards(version: string) { return DownloadLines(`https://firmware.openshock.org/${version}/boards.txt`); } -export function DownloadFirmwareBinary(version: string, board: string, onProgress: (percent: number) => void) { - return DownloadBinary(`https://firmware.openshock.org/${version}/${board}/firmware.bin`, onProgress); +export function DownloadFirmwareBinary( + version: string, + board: string, + onProgress: (percent: number) => void +) { + return DownloadBinary( + `https://firmware.openshock.org/${version}/${board}/firmware.bin`, + onProgress + ); } export async function GetFirmwareBinaryHash(version: string, board: string) { - const lines = await DownloadLines(`https://firmware.openshock.org/${version}/${board}/hashes.md5.txt`); + const lines = await DownloadLines( + `https://firmware.openshock.org/${version}/${board}/hashes.md5.txt` + ); if (!lines) return null; - const hashLine = lines.find((x) => x.endsWith("firmware.bin")); + const hashLine = lines.find((x) => x.endsWith('firmware.bin')); if (!hashLine) return null; - const hash = hashLine.split(" ")[0].trim(); + const hash = hashLine.split(' ')[0].trim(); // Validate hash length if (hash.length != 32) return null; diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index eb2d8be0..9fe9858c 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -1,6 +1,27 @@ import { PUBLIC_BACKEND_API_DOMAIN } from '$env/static/public'; -import { AccountApi, AdminApi, AuthenticatedAccountApi, Configuration as ConfigurationV1, DeviceApi, DevicesApi, PublicApi, SessionsApi, ShareLinksApi, SharesApi, ShockerApi as ShockerV1Api, TokensApi, UsersApi, VersionApi } from './internal/v1'; -import { Configuration as ConfigurationV2, ShockerApi as ShockerV2Api } from './internal/v2'; +import { + AccountApi as AccountV1Api, + AdminApi, + AuthenticatedAccountApi, + Configuration as ConfigurationV1, + DeviceApi, + DevicesApi as DevicesV1Api, + PublicApi, + SessionsApi, + ShareLinksApi, + SharesApi as SharesV1Api, + ShockerApi as ShockerV1Api, + TokensApi, + UsersApi, + VersionApi, +} from './internal/v1'; +import { + AccountApi as AccountV2Api, + Configuration as ConfigurationV2, + DevicesApi as DevicesV2Api, + SharesApi as SharesV2Api, + ShockerApi as ShockerV2Api, +} from './internal/v2'; type Config = { basePath?: string; @@ -8,7 +29,7 @@ type Config = { }; function GetBasePath() { - let domain = (PUBLIC_BACKEND_API_DOMAIN || undefined) as string | undefined; + const domain = (PUBLIC_BACKEND_API_DOMAIN || undefined) as string | undefined; if (!domain) { return undefined; @@ -24,7 +45,7 @@ function GetBasePath() { function GetConfig(): Config { return { basePath: GetBasePath(), - credentials: 'include' + credentials: 'include', }; } @@ -39,17 +60,20 @@ export function GetV2Config() { const DefaultApiV1Configuration = GetV1Config(); const DefaultApiV2Configuration = GetV2Config(); -export const accountApi = new AccountApi(DefaultApiV1Configuration); +export const accountV1Api = new AccountV1Api(DefaultApiV1Configuration); +export const accountV2Api = new AccountV2Api(DefaultApiV2Configuration); export const authenticatedAccountApi = new AuthenticatedAccountApi(DefaultApiV1Configuration); export const adminApi = new AdminApi(DefaultApiV1Configuration); export const deviceApi = new DeviceApi(DefaultApiV1Configuration); -export const devicesApi = new DevicesApi(DefaultApiV1Configuration); +export const devicesV1Api = new DevicesV1Api(DefaultApiV1Configuration); +export const devicesV2Api = new DevicesV2Api(DefaultApiV2Configuration); export const publicApi = new PublicApi(DefaultApiV1Configuration); export const sessionApi = new SessionsApi(DefaultApiV1Configuration); export const shareLinksApi = new ShareLinksApi(DefaultApiV1Configuration); -export const sharesApi = new SharesApi(DefaultApiV1Configuration); +export const sharesV1Api = new SharesV1Api(DefaultApiV1Configuration); +export const sharesV2Api = new SharesV2Api(DefaultApiV2Configuration); export const shockerV1Api = new ShockerV1Api(DefaultApiV1Configuration); export const shockerV2Api = new ShockerV2Api(DefaultApiV2Configuration); export const tokensApi = new TokensApi(DefaultApiV1Configuration); export const usersApi = new UsersApi(DefaultApiV1Configuration); -export const versionApi = new VersionApi(DefaultApiV1Configuration); \ No newline at end of file +export const versionApi = new VersionApi(DefaultApiV1Configuration); diff --git a/src/lib/api/internal/v1/.openapi-generator/FILES b/src/lib/api/internal/v1/.openapi-generator/FILES index 684e9686..0fcb88d3 100644 --- a/src/lib/api/internal/v1/.openapi-generator/FILES +++ b/src/lib/api/internal/v1/.openapi-generator/FILES @@ -15,9 +15,9 @@ apis/index.ts index.ts models/AdminOnlineDeviceResponse.ts models/AdminOnlineDeviceResponseIEnumerableBaseResponse.ts -models/AdminUserCountsResponse.ts -models/AdminUserResponse.ts -models/AdminUserResponsePaginated.ts +models/AdminUsersView.ts +models/AdminUsersViewPaginated.ts +models/BooleanBaseResponse.ts models/BooleanNullableBaseResponse.ts models/ChangeEmailRequest.ts models/ChangePasswordRequest.ts @@ -25,7 +25,6 @@ models/ChangeUsernameRequest.ts models/Control.ts models/ControlLogSenderLight.ts models/ControlType.ts -models/CreateShareCode.ts models/CreateTokenRequest.ts models/DeviceSelfResponse.ts models/DeviceSelfResponseBaseResponse.ts @@ -84,6 +83,7 @@ models/SharedDevice.ts models/SharedShocker.ts models/ShockerLimits.ts models/ShockerModelType.ts +models/ShockerPermLimitPair.ts models/ShockerPermissions.ts models/ShockerResponse.ts models/ShockerResponseIEnumerableBaseResponse.ts diff --git a/src/lib/api/internal/v1/.openapi-generator/VERSION b/src/lib/api/internal/v1/.openapi-generator/VERSION index 4bc5d618..758bb9c8 100644 --- a/src/lib/api/internal/v1/.openapi-generator/VERSION +++ b/src/lib/api/internal/v1/.openapi-generator/VERSION @@ -1 +1 @@ -7.9.0 +7.10.0 diff --git a/src/lib/api/internal/v1/apis/AccountApi.ts b/src/lib/api/internal/v1/apis/AccountApi.ts index 4328b585..fcaa306c 100644 --- a/src/lib/api/internal/v1/apis/AccountApi.ts +++ b/src/lib/api/internal/v1/apis/AccountApi.ts @@ -107,6 +107,18 @@ export interface AccountApiInterface { */ accountLogin(login?: Login, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AccountApiInterface + */ + accountLogoutRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + accountLogout(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + /** * * @summary Check if a password reset is in progress @@ -187,10 +199,6 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/account/username/check`, method: 'POST', @@ -220,10 +228,6 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/account/login`, method: 'POST', @@ -243,6 +247,29 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { return await response.value(); } + /** + */ + async accountLogoutRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request({ + path: `/1/account/logout`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.VoidApiResponse(response); + } + + /** + */ + async accountLogout(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.accountLogoutRaw(initOverrides); + } + /** * Check if a password reset is in progress */ @@ -265,10 +292,6 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/account/recover/{passwordResetId}/{secret}`.replace(`{${"passwordResetId"}}`, encodeURIComponent(String(requestParameters['passwordResetId']))).replace(`{${"secret"}}`, encodeURIComponent(String(requestParameters['secret']))), method: 'HEAD', @@ -311,10 +334,6 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/account/recover/{passwordResetId}/{secret}`.replace(`{${"passwordResetId"}}`, encodeURIComponent(String(requestParameters['passwordResetId']))).replace(`{${"secret"}}`, encodeURIComponent(String(requestParameters['secret']))), method: 'POST', @@ -344,10 +363,6 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/account/reset`, method: 'POST', @@ -377,10 +392,6 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/account/signup`, method: 'POST', diff --git a/src/lib/api/internal/v1/apis/AdminApi.ts b/src/lib/api/internal/v1/apis/AdminApi.ts index 042febad..8576241b 100644 --- a/src/lib/api/internal/v1/apis/AdminApi.ts +++ b/src/lib/api/internal/v1/apis/AdminApi.ts @@ -16,13 +16,13 @@ import * as runtime from '../runtime'; import type { AdminOnlineDeviceResponseIEnumerableBaseResponse, - AdminUserResponsePaginated, + AdminUsersViewPaginated, } from '../models/index'; import { AdminOnlineDeviceResponseIEnumerableBaseResponseFromJSON, AdminOnlineDeviceResponseIEnumerableBaseResponseToJSON, - AdminUserResponsePaginatedFromJSON, - AdminUserResponsePaginatedToJSON, + AdminUsersViewPaginatedFromJSON, + AdminUsersViewPaginatedToJSON, } from '../models/index'; export interface AdminDeleteUserRequest { @@ -30,8 +30,10 @@ export interface AdminDeleteUserRequest { } export interface AdminGetUsersRequest { - limit?: number; - offset?: number; + $filter?: string; + $orderby?: string; + $offset?: number; + $limit?: number; } /** @@ -49,12 +51,12 @@ export interface AdminApiInterface { * @throws {RequiredError} * @memberof AdminApiInterface */ - adminDeleteUserRaw(requestParameters: AdminDeleteUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + adminDeleteUserRaw(requestParameters: AdminDeleteUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Deletes a user */ - adminDeleteUser(userId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + adminDeleteUser(userId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * @@ -73,18 +75,20 @@ export interface AdminApiInterface { /** * * @summary Gets all users, paginated - * @param {number} [limit] - * @param {number} [offset] + * @param {string} [$filter] + * @param {string} [$orderby] + * @param {number} [$offset] + * @param {number} [$limit] * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof AdminApiInterface */ - adminGetUsersRaw(requestParameters: AdminGetUsersRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + adminGetUsersRaw(requestParameters: AdminGetUsersRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Gets all users, paginated */ - adminGetUsers(limit?: number, offset?: number, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + adminGetUsers($filter?: string, $orderby?: string, $offset?: number, $limit?: number, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; } @@ -96,7 +100,7 @@ export class AdminApi extends runtime.BaseAPI implements AdminApiInterface { /** * Deletes a user */ - async adminDeleteUserRaw(requestParameters: AdminDeleteUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async adminDeleteUserRaw(requestParameters: AdminDeleteUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['userId'] == null) { throw new runtime.RequiredError( 'userId', @@ -108,10 +112,6 @@ export class AdminApi extends runtime.BaseAPI implements AdminApiInterface { const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/admin/users/{userId}`.replace(`{${"userId"}}`, encodeURIComponent(String(requestParameters['userId']))), method: 'DELETE', @@ -119,19 +119,14 @@ export class AdminApi extends runtime.BaseAPI implements AdminApiInterface { query: queryParameters, }, initOverrides); - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + return new runtime.VoidApiResponse(response); } /** * Deletes a user */ - async adminDeleteUser(userId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.adminDeleteUserRaw({ userId: userId }, initOverrides); - return await response.value(); + async adminDeleteUser(userId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.adminDeleteUserRaw({ userId: userId }, initOverrides); } /** @@ -142,10 +137,6 @@ export class AdminApi extends runtime.BaseAPI implements AdminApiInterface { const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/admin/monitoring/onlineDevices`, method: 'GET', @@ -167,23 +158,27 @@ export class AdminApi extends runtime.BaseAPI implements AdminApiInterface { /** * Gets all users, paginated */ - async adminGetUsersRaw(requestParameters: AdminGetUsersRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async adminGetUsersRaw(requestParameters: AdminGetUsersRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { const queryParameters: any = {}; - if (requestParameters['limit'] != null) { - queryParameters['limit'] = requestParameters['limit']; + if (requestParameters['$filter'] != null) { + queryParameters['$filter'] = requestParameters['$filter']; } - if (requestParameters['offset'] != null) { - queryParameters['offset'] = requestParameters['offset']; + if (requestParameters['$orderby'] != null) { + queryParameters['$orderby'] = requestParameters['$orderby']; } - const headerParameters: runtime.HTTPHeaders = {}; + if (requestParameters['$offset'] != null) { + queryParameters['$offset'] = requestParameters['$offset']; + } - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + if (requestParameters['$limit'] != null) { + queryParameters['$limit'] = requestParameters['$limit']; } + const headerParameters: runtime.HTTPHeaders = {}; + const response = await this.request({ path: `/1/admin/users`, method: 'GET', @@ -191,14 +186,14 @@ export class AdminApi extends runtime.BaseAPI implements AdminApiInterface { query: queryParameters, }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => AdminUserResponsePaginatedFromJSON(jsonValue)); + return new runtime.JSONApiResponse(response, (jsonValue) => AdminUsersViewPaginatedFromJSON(jsonValue)); } /** * Gets all users, paginated */ - async adminGetUsers(limit?: number, offset?: number, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.adminGetUsersRaw({ limit: limit, offset: offset }, initOverrides); + async adminGetUsers($filter?: string, $orderby?: string, $offset?: number, $limit?: number, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.adminGetUsersRaw({ $filter: $filter, $orderby: $orderby, $offset: $offset, $limit: $limit }, initOverrides); return await response.value(); } diff --git a/src/lib/api/internal/v1/apis/AuthenticatedAccountApi.ts b/src/lib/api/internal/v1/apis/AuthenticatedAccountApi.ts index 152499b0..19ad053a 100644 --- a/src/lib/api/internal/v1/apis/AuthenticatedAccountApi.ts +++ b/src/lib/api/internal/v1/apis/AuthenticatedAccountApi.ts @@ -76,12 +76,12 @@ export interface AuthenticatedAccountApiInterface { * @throws {RequiredError} * @memberof AuthenticatedAccountApiInterface */ - authenticatedAccountChangePasswordRaw(requestParameters: AuthenticatedAccountChangePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + authenticatedAccountChangePasswordRaw(requestParameters: AuthenticatedAccountChangePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Change the password of the current user */ - authenticatedAccountChangePassword(changePasswordRequest?: ChangePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + authenticatedAccountChangePassword(changePasswordRequest?: ChangePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * @@ -91,12 +91,12 @@ export interface AuthenticatedAccountApiInterface { * @throws {RequiredError} * @memberof AuthenticatedAccountApiInterface */ - authenticatedAccountChangeUsernameRaw(requestParameters: AuthenticatedAccountChangeUsernameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + authenticatedAccountChangeUsernameRaw(requestParameters: AuthenticatedAccountChangeUsernameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Change the username of the current user */ - authenticatedAccountChangeUsername(changeUsernameRequest?: ChangeUsernameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + authenticatedAccountChangeUsername(changeUsernameRequest?: ChangeUsernameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; } @@ -115,10 +115,6 @@ export class AuthenticatedAccountApi extends runtime.BaseAPI implements Authenti headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/account/email`, method: 'POST', @@ -141,17 +137,13 @@ export class AuthenticatedAccountApi extends runtime.BaseAPI implements Authenti /** * Change the password of the current user */ - async authenticatedAccountChangePasswordRaw(requestParameters: AuthenticatedAccountChangePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async authenticatedAccountChangePasswordRaw(requestParameters: AuthenticatedAccountChangePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { const queryParameters: any = {}; const headerParameters: runtime.HTTPHeaders = {}; headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/account/password`, method: 'POST', @@ -160,35 +152,26 @@ export class AuthenticatedAccountApi extends runtime.BaseAPI implements Authenti body: ChangePasswordRequestToJSON(requestParameters['changePasswordRequest']), }, initOverrides); - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + return new runtime.VoidApiResponse(response); } /** * Change the password of the current user */ - async authenticatedAccountChangePassword(changePasswordRequest?: ChangePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.authenticatedAccountChangePasswordRaw({ changePasswordRequest: changePasswordRequest }, initOverrides); - return await response.value(); + async authenticatedAccountChangePassword(changePasswordRequest?: ChangePasswordRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.authenticatedAccountChangePasswordRaw({ changePasswordRequest: changePasswordRequest }, initOverrides); } /** * Change the username of the current user */ - async authenticatedAccountChangeUsernameRaw(requestParameters: AuthenticatedAccountChangeUsernameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async authenticatedAccountChangeUsernameRaw(requestParameters: AuthenticatedAccountChangeUsernameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { const queryParameters: any = {}; const headerParameters: runtime.HTTPHeaders = {}; headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/account/username`, method: 'POST', @@ -197,19 +180,14 @@ export class AuthenticatedAccountApi extends runtime.BaseAPI implements Authenti body: ChangeUsernameRequestToJSON(requestParameters['changeUsernameRequest']), }, initOverrides); - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + return new runtime.VoidApiResponse(response); } /** * Change the username of the current user */ - async authenticatedAccountChangeUsername(changeUsernameRequest?: ChangeUsernameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.authenticatedAccountChangeUsernameRaw({ changeUsernameRequest: changeUsernameRequest }, initOverrides); - return await response.value(); + async authenticatedAccountChangeUsername(changeUsernameRequest?: ChangeUsernameRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.authenticatedAccountChangeUsernameRaw({ changeUsernameRequest: changeUsernameRequest }, initOverrides); } } diff --git a/src/lib/api/internal/v1/apis/DeviceApi.ts b/src/lib/api/internal/v1/apis/DeviceApi.ts index bffc6df1..6401329f 100644 --- a/src/lib/api/internal/v1/apis/DeviceApi.ts +++ b/src/lib/api/internal/v1/apis/DeviceApi.ts @@ -120,7 +120,7 @@ export class DeviceApi extends runtime.BaseAPI implements DeviceApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["DeviceToken"] = await this.configuration.apiKey("DeviceToken"); // HubToken authentication } const response = await this.request({ @@ -150,7 +150,7 @@ export class DeviceApi extends runtime.BaseAPI implements DeviceApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["DeviceToken"] = await this.configuration.apiKey("DeviceToken"); // HubToken authentication } const response = await this.request({ @@ -187,7 +187,7 @@ export class DeviceApi extends runtime.BaseAPI implements DeviceApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["DeviceToken"] = await this.configuration.apiKey("DeviceToken"); // HubToken authentication } const response = await this.request({ @@ -224,7 +224,7 @@ export class DeviceApi extends runtime.BaseAPI implements DeviceApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["DeviceToken"] = await this.configuration.apiKey("DeviceToken"); // HubToken authentication } const response = await this.request({ diff --git a/src/lib/api/internal/v1/apis/DevicesApi.ts b/src/lib/api/internal/v1/apis/DevicesApi.ts index f103f4d3..bef0649c 100644 --- a/src/lib/api/internal/v1/apis/DevicesApi.ts +++ b/src/lib/api/internal/v1/apis/DevicesApi.ts @@ -106,12 +106,12 @@ export interface DevicesApiInterface { * @throws {RequiredError} * @memberof DevicesApiInterface */ - devicesEditDeviceRaw(requestParameters: DevicesEditDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + devicesEditDeviceRaw(requestParameters: DevicesEditDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Edit a device */ - devicesEditDevice(deviceId: string, hubEditRequest?: HubEditRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + devicesEditDevice(deviceId: string, hubEditRequest?: HubEditRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * @@ -210,12 +210,12 @@ export interface DevicesApiInterface { * @throws {RequiredError} * @memberof DevicesApiInterface */ - devicesRegenerateDeviceTokenRaw(requestParameters: DevicesRegenerateDeviceTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + devicesRegenerateDeviceTokenRaw(requestParameters: DevicesRegenerateDeviceTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Regenerate a device token */ - devicesRegenerateDeviceToken(deviceId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + devicesRegenerateDeviceToken(deviceId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * @@ -225,12 +225,12 @@ export interface DevicesApiInterface { * @throws {RequiredError} * @memberof DevicesApiInterface */ - devicesRemoveDeviceRaw(requestParameters: DevicesRemoveDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + devicesRemoveDeviceRaw(requestParameters: DevicesRemoveDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Remove a device from current user\'s account */ - devicesRemoveDevice(deviceId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + devicesRemoveDevice(deviceId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; } @@ -248,7 +248,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -276,7 +276,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { /** * Edit a device */ - async devicesEditDeviceRaw(requestParameters: DevicesEditDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async devicesEditDeviceRaw(requestParameters: DevicesEditDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['deviceId'] == null) { throw new runtime.RequiredError( 'deviceId', @@ -291,7 +291,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -302,19 +302,14 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { body: HubEditRequestToJSON(requestParameters['hubEditRequest']), }, initOverrides); - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + return new runtime.VoidApiResponse(response); } /** * Edit a device */ - async devicesEditDevice(deviceId: string, hubEditRequest?: HubEditRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.devicesEditDeviceRaw({ deviceId: deviceId, hubEditRequest: hubEditRequest }, initOverrides); - return await response.value(); + async devicesEditDevice(deviceId: string, hubEditRequest?: HubEditRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.devicesEditDeviceRaw({ deviceId: deviceId, hubEditRequest: hubEditRequest }, initOverrides); } /** @@ -333,7 +328,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -370,7 +365,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -407,7 +402,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -444,7 +439,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -481,7 +476,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -511,7 +506,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -535,7 +530,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { /** * Regenerate a device token */ - async devicesRegenerateDeviceTokenRaw(requestParameters: DevicesRegenerateDeviceTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async devicesRegenerateDeviceTokenRaw(requestParameters: DevicesRegenerateDeviceTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['deviceId'] == null) { throw new runtime.RequiredError( 'deviceId', @@ -548,7 +543,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -558,25 +553,20 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { query: queryParameters, }, initOverrides); - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + return new runtime.VoidApiResponse(response); } /** * Regenerate a device token */ - async devicesRegenerateDeviceToken(deviceId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.devicesRegenerateDeviceTokenRaw({ deviceId: deviceId }, initOverrides); - return await response.value(); + async devicesRegenerateDeviceToken(deviceId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.devicesRegenerateDeviceTokenRaw({ deviceId: deviceId }, initOverrides); } /** * Remove a device from current user\'s account */ - async devicesRemoveDeviceRaw(requestParameters: DevicesRemoveDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async devicesRemoveDeviceRaw(requestParameters: DevicesRemoveDeviceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['deviceId'] == null) { throw new runtime.RequiredError( 'deviceId', @@ -589,7 +579,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -599,19 +589,14 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { query: queryParameters, }, initOverrides); - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + return new runtime.VoidApiResponse(response); } /** * Remove a device from current user\'s account */ - async devicesRemoveDevice(deviceId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.devicesRemoveDeviceRaw({ deviceId: deviceId }, initOverrides); - return await response.value(); + async devicesRemoveDevice(deviceId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.devicesRemoveDeviceRaw({ deviceId: deviceId }, initOverrides); } } diff --git a/src/lib/api/internal/v1/apis/PublicApi.ts b/src/lib/api/internal/v1/apis/PublicApi.ts index 1f3fd0f4..1fc2c8eb 100644 --- a/src/lib/api/internal/v1/apis/PublicApi.ts +++ b/src/lib/api/internal/v1/apis/PublicApi.ts @@ -83,10 +83,6 @@ export class PublicApi extends runtime.BaseAPI implements PublicApiInterface { const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/public/stats`, method: 'GET', @@ -120,10 +116,6 @@ export class PublicApi extends runtime.BaseAPI implements PublicApiInterface { const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/public/shares/links/{shareLinkId}`.replace(`{${"shareLinkId"}}`, encodeURIComponent(String(requestParameters['shareLinkId']))), method: 'GET', diff --git a/src/lib/api/internal/v1/apis/SessionsApi.ts b/src/lib/api/internal/v1/apis/SessionsApi.ts index a31cc465..48dca5a6 100644 --- a/src/lib/api/internal/v1/apis/SessionsApi.ts +++ b/src/lib/api/internal/v1/apis/SessionsApi.ts @@ -43,11 +43,11 @@ export interface SessionsApiInterface { * @throws {RequiredError} * @memberof SessionsApiInterface */ - sessionsDeleteSessionRaw(requestParameters: SessionsDeleteSessionRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + sessionsDeleteSessionRaw(requestParameters: SessionsDeleteSessionRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** */ - sessionsDeleteSession(sessionId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + sessionsDeleteSession(sessionId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * @@ -84,7 +84,7 @@ export class SessionsApi extends runtime.BaseAPI implements SessionsApiInterface /** */ - async sessionsDeleteSessionRaw(requestParameters: SessionsDeleteSessionRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async sessionsDeleteSessionRaw(requestParameters: SessionsDeleteSessionRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['sessionId'] == null) { throw new runtime.RequiredError( 'sessionId', @@ -96,10 +96,6 @@ export class SessionsApi extends runtime.BaseAPI implements SessionsApiInterface const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/sessions/{sessionId}`.replace(`{${"sessionId"}}`, encodeURIComponent(String(requestParameters['sessionId']))), method: 'DELETE', @@ -107,18 +103,13 @@ export class SessionsApi extends runtime.BaseAPI implements SessionsApiInterface query: queryParameters, }, initOverrides); - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + return new runtime.VoidApiResponse(response); } /** */ - async sessionsDeleteSession(sessionId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.sessionsDeleteSessionRaw({ sessionId: sessionId }, initOverrides); - return await response.value(); + async sessionsDeleteSession(sessionId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.sessionsDeleteSessionRaw({ sessionId: sessionId }, initOverrides); } /** @@ -129,10 +120,6 @@ export class SessionsApi extends runtime.BaseAPI implements SessionsApiInterface const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/sessions/self`, method: 'GET', @@ -158,10 +145,6 @@ export class SessionsApi extends runtime.BaseAPI implements SessionsApiInterface const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1/sessions`, method: 'GET', diff --git a/src/lib/api/internal/v1/apis/ShareLinksApi.ts b/src/lib/api/internal/v1/apis/ShareLinksApi.ts index f99bae3d..c8b03190 100644 --- a/src/lib/api/internal/v1/apis/ShareLinksApi.ts +++ b/src/lib/api/internal/v1/apis/ShareLinksApi.ts @@ -223,7 +223,7 @@ export class ShareLinksApi extends runtime.BaseAPI implements ShareLinksApiInter const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -255,7 +255,7 @@ export class ShareLinksApi extends runtime.BaseAPI implements ShareLinksApiInter headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -293,7 +293,7 @@ export class ShareLinksApi extends runtime.BaseAPI implements ShareLinksApiInter const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -339,7 +339,7 @@ export class ShareLinksApi extends runtime.BaseAPI implements ShareLinksApiInter headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -370,7 +370,7 @@ export class ShareLinksApi extends runtime.BaseAPI implements ShareLinksApiInter const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -416,7 +416,7 @@ export class ShareLinksApi extends runtime.BaseAPI implements ShareLinksApiInter headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -461,7 +461,7 @@ export class ShareLinksApi extends runtime.BaseAPI implements ShareLinksApiInter const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ diff --git a/src/lib/api/internal/v1/apis/SharesApi.ts b/src/lib/api/internal/v1/apis/SharesApi.ts index 64f01600..35bf2108 100644 --- a/src/lib/api/internal/v1/apis/SharesApi.ts +++ b/src/lib/api/internal/v1/apis/SharesApi.ts @@ -93,7 +93,7 @@ export class SharesApi extends runtime.BaseAPI implements SharesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -130,7 +130,7 @@ export class SharesApi extends runtime.BaseAPI implements SharesApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ diff --git a/src/lib/api/internal/v1/apis/ShockerApi.ts b/src/lib/api/internal/v1/apis/ShockerApi.ts index 6c4c51b8..da52ac59 100644 --- a/src/lib/api/internal/v1/apis/ShockerApi.ts +++ b/src/lib/api/internal/v1/apis/ShockerApi.ts @@ -15,9 +15,9 @@ import * as runtime from '../runtime'; import type { + BooleanBaseResponse, BooleanNullableBaseResponse, Control, - CreateShareCode, GuidBaseResponse, LogEntryIEnumerableBaseResponse, NewShocker, @@ -28,15 +28,16 @@ import type { ResponseDeviceWithShockersIEnumerableBaseResponse, ShareCodeInfoIEnumerableBaseResponse, ShareInfoIEnumerableBaseResponse, + ShockerPermLimitPair, ShockerWithDeviceBaseResponse, } from '../models/index'; import { + BooleanBaseResponseFromJSON, + BooleanBaseResponseToJSON, BooleanNullableBaseResponseFromJSON, BooleanNullableBaseResponseToJSON, ControlFromJSON, ControlToJSON, - CreateShareCodeFromJSON, - CreateShareCodeToJSON, GuidBaseResponseFromJSON, GuidBaseResponseToJSON, LogEntryIEnumerableBaseResponseFromJSON, @@ -57,6 +58,8 @@ import { ShareCodeInfoIEnumerableBaseResponseToJSON, ShareInfoIEnumerableBaseResponseFromJSON, ShareInfoIEnumerableBaseResponseToJSON, + ShockerPermLimitPairFromJSON, + ShockerPermLimitPairToJSON, ShockerWithDeviceBaseResponseFromJSON, ShockerWithDeviceBaseResponseToJSON, } from '../models/index'; @@ -99,7 +102,7 @@ export interface ShockerSendControlDEPRECATEDRequest { export interface ShockerShockerShareCodeCreateRequest { shockerId: string; - createShareCode?: CreateShareCode; + shockerPermLimitPair?: ShockerPermLimitPair; } export interface ShockerShockerShareCodeListRequest { @@ -120,7 +123,7 @@ export interface ShockerShockerShareCodeRemoveRequest { export interface ShockerShockerShareCodeUpdateRequest { shockerId: string; sharedWithUserId: string; - createShareCode?: CreateShareCode; + shockerPermLimitPair?: ShockerPermLimitPair; } /** @@ -286,7 +289,7 @@ export interface ShockerApiInterface { * * @summary Create a share code for a shocker * @param {string} shockerId - * @param {CreateShareCode} [createShareCode] + * @param {ShockerPermLimitPair} [shockerPermLimitPair] * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof ShockerApiInterface @@ -296,7 +299,7 @@ export interface ShockerApiInterface { /** * Create a share code for a shocker */ - shockerShockerShareCodeCreate(shockerId: string, createShareCode?: CreateShareCode, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + shockerShockerShareCodeCreate(shockerId: string, shockerPermLimitPair?: ShockerPermLimitPair, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * @@ -323,12 +326,12 @@ export interface ShockerApiInterface { * @throws {RequiredError} * @memberof ShockerApiInterface */ - shockerShockerShareCodePauseRaw(requestParameters: ShockerShockerShareCodePauseRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + shockerShockerShareCodePauseRaw(requestParameters: ShockerShockerShareCodePauseRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Pause/Unpause a share code for a shocker */ - shockerShockerShareCodePause(shockerId: string, sharedWithUserId: string, pauseRequest?: PauseRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + shockerShockerShareCodePause(shockerId: string, sharedWithUserId: string, pauseRequest?: PauseRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * @@ -339,29 +342,29 @@ export interface ShockerApiInterface { * @throws {RequiredError} * @memberof ShockerApiInterface */ - shockerShockerShareCodeRemoveRaw(requestParameters: ShockerShockerShareCodeRemoveRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + shockerShockerShareCodeRemoveRaw(requestParameters: ShockerShockerShareCodeRemoveRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Remove a share code for a shocker */ - shockerShockerShareCodeRemove(shockerId: string, sharedWithUserId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + shockerShockerShareCodeRemove(shockerId: string, sharedWithUserId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * * @summary Update a share for a shocker * @param {string} shockerId * @param {string} sharedWithUserId - * @param {CreateShareCode} [createShareCode] + * @param {ShockerPermLimitPair} [shockerPermLimitPair] * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof ShockerApiInterface */ - shockerShockerShareCodeUpdateRaw(requestParameters: ShockerShockerShareCodeUpdateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + shockerShockerShareCodeUpdateRaw(requestParameters: ShockerShockerShareCodeUpdateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Update a share for a shocker */ - shockerShockerShareCodeUpdate(shockerId: string, sharedWithUserId: string, createShareCode?: CreateShareCode, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + shockerShockerShareCodeUpdate(shockerId: string, sharedWithUserId: string, shockerPermLimitPair?: ShockerPermLimitPair, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; } @@ -388,7 +391,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -426,7 +429,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -471,7 +474,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -508,7 +511,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -538,7 +541,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -568,7 +571,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -607,7 +610,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -640,7 +643,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -678,7 +681,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -710,7 +713,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -750,7 +753,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -758,7 +761,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { method: 'POST', headers: headerParameters, query: queryParameters, - body: CreateShareCodeToJSON(requestParameters['createShareCode']), + body: ShockerPermLimitPairToJSON(requestParameters['shockerPermLimitPair']), }, initOverrides); return new runtime.JSONApiResponse(response, (jsonValue) => GuidBaseResponseFromJSON(jsonValue)); @@ -767,8 +770,8 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { /** * Create a share code for a shocker */ - async shockerShockerShareCodeCreate(shockerId: string, createShareCode?: CreateShareCode, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.shockerShockerShareCodeCreateRaw({ shockerId: shockerId, createShareCode: createShareCode }, initOverrides); + async shockerShockerShareCodeCreate(shockerId: string, shockerPermLimitPair?: ShockerPermLimitPair, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.shockerShockerShareCodeCreateRaw({ shockerId: shockerId, shockerPermLimitPair: shockerPermLimitPair }, initOverrides); return await response.value(); } @@ -788,7 +791,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -812,7 +815,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { /** * Pause/Unpause a share code for a shocker */ - async shockerShockerShareCodePauseRaw(requestParameters: ShockerShockerShareCodePauseRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async shockerShockerShareCodePauseRaw(requestParameters: ShockerShockerShareCodePauseRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['shockerId'] == null) { throw new runtime.RequiredError( 'shockerId', @@ -834,7 +837,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -845,13 +848,13 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { body: PauseRequestToJSON(requestParameters['pauseRequest']), }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => ObjectBaseResponseFromJSON(jsonValue)); + return new runtime.JSONApiResponse(response, (jsonValue) => BooleanBaseResponseFromJSON(jsonValue)); } /** * Pause/Unpause a share code for a shocker */ - async shockerShockerShareCodePause(shockerId: string, sharedWithUserId: string, pauseRequest?: PauseRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + async shockerShockerShareCodePause(shockerId: string, sharedWithUserId: string, pauseRequest?: PauseRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { const response = await this.shockerShockerShareCodePauseRaw({ shockerId: shockerId, sharedWithUserId: sharedWithUserId, pauseRequest: pauseRequest }, initOverrides); return await response.value(); } @@ -859,7 +862,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { /** * Remove a share code for a shocker */ - async shockerShockerShareCodeRemoveRaw(requestParameters: ShockerShockerShareCodeRemoveRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async shockerShockerShareCodeRemoveRaw(requestParameters: ShockerShockerShareCodeRemoveRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['shockerId'] == null) { throw new runtime.RequiredError( 'shockerId', @@ -879,7 +882,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -889,21 +892,20 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { query: queryParameters, }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => ObjectBaseResponseFromJSON(jsonValue)); + return new runtime.VoidApiResponse(response); } /** * Remove a share code for a shocker */ - async shockerShockerShareCodeRemove(shockerId: string, sharedWithUserId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.shockerShockerShareCodeRemoveRaw({ shockerId: shockerId, sharedWithUserId: sharedWithUserId }, initOverrides); - return await response.value(); + async shockerShockerShareCodeRemove(shockerId: string, sharedWithUserId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.shockerShockerShareCodeRemoveRaw({ shockerId: shockerId, sharedWithUserId: sharedWithUserId }, initOverrides); } /** * Update a share for a shocker */ - async shockerShockerShareCodeUpdateRaw(requestParameters: ShockerShockerShareCodeUpdateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async shockerShockerShareCodeUpdateRaw(requestParameters: ShockerShockerShareCodeUpdateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['shockerId'] == null) { throw new runtime.RequiredError( 'shockerId', @@ -925,7 +927,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -933,18 +935,17 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { method: 'PATCH', headers: headerParameters, query: queryParameters, - body: CreateShareCodeToJSON(requestParameters['createShareCode']), + body: ShockerPermLimitPairToJSON(requestParameters['shockerPermLimitPair']), }, initOverrides); - return new runtime.JSONApiResponse(response, (jsonValue) => ObjectBaseResponseFromJSON(jsonValue)); + return new runtime.VoidApiResponse(response); } /** * Update a share for a shocker */ - async shockerShockerShareCodeUpdate(shockerId: string, sharedWithUserId: string, createShareCode?: CreateShareCode, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.shockerShockerShareCodeUpdateRaw({ shockerId: shockerId, sharedWithUserId: sharedWithUserId, createShareCode: createShareCode }, initOverrides); - return await response.value(); + async shockerShockerShareCodeUpdate(shockerId: string, sharedWithUserId: string, shockerPermLimitPair?: ShockerPermLimitPair, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.shockerShockerShareCodeUpdateRaw({ shockerId: shockerId, sharedWithUserId: sharedWithUserId, shockerPermLimitPair: shockerPermLimitPair }, initOverrides); } } diff --git a/src/lib/api/internal/v1/apis/TokensApi.ts b/src/lib/api/internal/v1/apis/TokensApi.ts index fde3d669..246e53f7 100644 --- a/src/lib/api/internal/v1/apis/TokensApi.ts +++ b/src/lib/api/internal/v1/apis/TokensApi.ts @@ -81,12 +81,12 @@ export interface TokensApiInterface { * @throws {RequiredError} * @memberof TokensApiInterface */ - tokensDeleteTokenRaw(requestParameters: TokensDeleteTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + tokensDeleteTokenRaw(requestParameters: TokensDeleteTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Revoke a token from the current user */ - tokensDeleteToken(tokenId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + tokensDeleteToken(tokenId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * @@ -97,12 +97,12 @@ export interface TokensApiInterface { * @throws {RequiredError} * @memberof TokensApiInterface */ - tokensEditTokenRaw(requestParameters: TokensEditTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + tokensEditTokenRaw(requestParameters: TokensEditTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; /** * Edit a token */ - tokensEditToken(tokenId: string, editTokenRequest?: EditTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + tokensEditToken(tokenId: string, editTokenRequest?: EditTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; /** * @@ -165,7 +165,7 @@ export class TokensApi extends runtime.BaseAPI implements TokensApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -190,7 +190,7 @@ export class TokensApi extends runtime.BaseAPI implements TokensApiInterface { /** * Revoke a token from the current user */ - async tokensDeleteTokenRaw(requestParameters: TokensDeleteTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async tokensDeleteTokenRaw(requestParameters: TokensDeleteTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['tokenId'] == null) { throw new runtime.RequiredError( 'tokenId', @@ -203,7 +203,7 @@ export class TokensApi extends runtime.BaseAPI implements TokensApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -213,25 +213,20 @@ export class TokensApi extends runtime.BaseAPI implements TokensApiInterface { query: queryParameters, }, initOverrides); - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + return new runtime.VoidApiResponse(response); } /** * Revoke a token from the current user */ - async tokensDeleteToken(tokenId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.tokensDeleteTokenRaw({ tokenId: tokenId }, initOverrides); - return await response.value(); + async tokensDeleteToken(tokenId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.tokensDeleteTokenRaw({ tokenId: tokenId }, initOverrides); } /** * Edit a token */ - async tokensEditTokenRaw(requestParameters: TokensEditTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + async tokensEditTokenRaw(requestParameters: TokensEditTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { if (requestParameters['tokenId'] == null) { throw new runtime.RequiredError( 'tokenId', @@ -246,7 +241,7 @@ export class TokensApi extends runtime.BaseAPI implements TokensApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -257,19 +252,14 @@ export class TokensApi extends runtime.BaseAPI implements TokensApiInterface { body: EditTokenRequestToJSON(requestParameters['editTokenRequest']), }, initOverrides); - if (this.isJsonMime(response.headers.get('content-type'))) { - return new runtime.JSONApiResponse(response); - } else { - return new runtime.TextApiResponse(response) as any; - } + return new runtime.VoidApiResponse(response); } /** * Edit a token */ - async tokensEditToken(tokenId: string, editTokenRequest?: EditTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { - const response = await this.tokensEditTokenRaw({ tokenId: tokenId, editTokenRequest: editTokenRequest }, initOverrides); - return await response.value(); + async tokensEditToken(tokenId: string, editTokenRequest?: EditTokenRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.tokensEditTokenRaw({ tokenId: tokenId, editTokenRequest: editTokenRequest }, initOverrides); } /** @@ -281,7 +271,7 @@ export class TokensApi extends runtime.BaseAPI implements TokensApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -318,7 +308,7 @@ export class TokensApi extends runtime.BaseAPI implements TokensApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ @@ -348,7 +338,7 @@ export class TokensApi extends runtime.BaseAPI implements TokensApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ diff --git a/src/lib/api/internal/v1/apis/UsersApi.ts b/src/lib/api/internal/v1/apis/UsersApi.ts index 909ee80a..f54e0b2b 100644 --- a/src/lib/api/internal/v1/apis/UsersApi.ts +++ b/src/lib/api/internal/v1/apis/UsersApi.ts @@ -59,7 +59,7 @@ export class UsersApi extends runtime.BaseAPI implements UsersApiInterface { const headerParameters: runtime.HTTPHeaders = {}; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ diff --git a/src/lib/api/internal/v1/apis/VersionApi.ts b/src/lib/api/internal/v1/apis/VersionApi.ts index 705eec8e..e9bcd2a1 100644 --- a/src/lib/api/internal/v1/apis/VersionApi.ts +++ b/src/lib/api/internal/v1/apis/VersionApi.ts @@ -58,10 +58,6 @@ export class VersionApi extends runtime.BaseAPI implements VersionApiInterface { const headerParameters: runtime.HTTPHeaders = {}; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/1`, method: 'GET', diff --git a/src/lib/api/internal/v1/models/AdminOnlineDeviceResponse.ts b/src/lib/api/internal/v1/models/AdminOnlineDeviceResponse.ts index 44b5ff5f..d652ca03 100644 --- a/src/lib/api/internal/v1/models/AdminOnlineDeviceResponse.ts +++ b/src/lib/api/internal/v1/models/AdminOnlineDeviceResponse.ts @@ -38,7 +38,7 @@ export interface AdminOnlineDeviceResponse { * @type {string} * @memberof AdminOnlineDeviceResponse */ - name: string | null; + name: string; /** * * @type {GenericIni} @@ -50,19 +50,43 @@ export interface AdminOnlineDeviceResponse { * @type {string} * @memberof AdminOnlineDeviceResponse */ - firmwareVersion: string | null; + firmwareVersion: string; /** * * @type {string} * @memberof AdminOnlineDeviceResponse */ - gateway: string | null; + gateway: string; /** * * @type {Date} * @memberof AdminOnlineDeviceResponse */ connectedAt: Date; + /** + * + * @type {string} + * @memberof AdminOnlineDeviceResponse + */ + userAgent: string | null; + /** + * + * @type {Date} + * @memberof AdminOnlineDeviceResponse + */ + bootedAt: Date; + /** + * + * @type {number} + * @memberof AdminOnlineDeviceResponse + */ + latencyMs: number | null; + /** + * + * @type {number} + * @memberof AdminOnlineDeviceResponse + */ + rssi: number | null; } /** @@ -75,6 +99,10 @@ export function instanceOfAdminOnlineDeviceResponse(value: object): value is Adm if (!('firmwareVersion' in value) || value['firmwareVersion'] === undefined) return false; if (!('gateway' in value) || value['gateway'] === undefined) return false; if (!('connectedAt' in value) || value['connectedAt'] === undefined) return false; + if (!('userAgent' in value) || value['userAgent'] === undefined) return false; + if (!('bootedAt' in value) || value['bootedAt'] === undefined) return false; + if (!('latencyMs' in value) || value['latencyMs'] === undefined) return false; + if (!('rssi' in value) || value['rssi'] === undefined) return false; return true; } @@ -94,14 +122,18 @@ export function AdminOnlineDeviceResponseFromJSONTyped(json: any, ignoreDiscrimi 'firmwareVersion': json['firmwareVersion'], 'gateway': json['gateway'], 'connectedAt': (new Date(json['connectedAt'])), + 'userAgent': json['userAgent'], + 'bootedAt': (new Date(json['bootedAt'])), + 'latencyMs': json['latencyMs'], + 'rssi': json['rssi'], }; } - export function AdminOnlineDeviceResponseToJSON(json: any): AdminOnlineDeviceResponse { - return AdminOnlineDeviceResponseToJSONTyped(json, false); - } +export function AdminOnlineDeviceResponseToJSON(json: any): AdminOnlineDeviceResponse { + return AdminOnlineDeviceResponseToJSONTyped(json, false); +} - export function AdminOnlineDeviceResponseToJSONTyped(value?: AdminOnlineDeviceResponse | null, ignoreDiscriminator: boolean = false): any { +export function AdminOnlineDeviceResponseToJSONTyped(value?: AdminOnlineDeviceResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } @@ -114,6 +146,10 @@ export function AdminOnlineDeviceResponseFromJSONTyped(json: any, ignoreDiscrimi 'firmwareVersion': value['firmwareVersion'], 'gateway': value['gateway'], 'connectedAt': ((value['connectedAt']).toISOString()), + 'userAgent': value['userAgent'], + 'bootedAt': ((value['bootedAt']).toISOString()), + 'latencyMs': value['latencyMs'], + 'rssi': value['rssi'], }; } diff --git a/src/lib/api/internal/v1/models/AdminOnlineDeviceResponseIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/AdminOnlineDeviceResponseIEnumerableBaseResponse.ts index 476b006c..8aff49d1 100644 --- a/src/lib/api/internal/v1/models/AdminOnlineDeviceResponseIEnumerableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/AdminOnlineDeviceResponseIEnumerableBaseResponse.ts @@ -63,11 +63,11 @@ export function AdminOnlineDeviceResponseIEnumerableBaseResponseFromJSONTyped(js }; } - export function AdminOnlineDeviceResponseIEnumerableBaseResponseToJSON(json: any): AdminOnlineDeviceResponseIEnumerableBaseResponse { - return AdminOnlineDeviceResponseIEnumerableBaseResponseToJSONTyped(json, false); - } +export function AdminOnlineDeviceResponseIEnumerableBaseResponseToJSON(json: any): AdminOnlineDeviceResponseIEnumerableBaseResponse { + return AdminOnlineDeviceResponseIEnumerableBaseResponseToJSONTyped(json, false); +} - export function AdminOnlineDeviceResponseIEnumerableBaseResponseToJSONTyped(value?: AdminOnlineDeviceResponseIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function AdminOnlineDeviceResponseIEnumerableBaseResponseToJSONTyped(value?: AdminOnlineDeviceResponseIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/AdminUserCountsResponse.ts b/src/lib/api/internal/v1/models/AdminUserCountsResponse.ts deleted file mode 100644 index 8d805ceb..00000000 --- a/src/lib/api/internal/v1/models/AdminUserCountsResponse.ts +++ /dev/null @@ -1,147 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * OpenShock.API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -/** - * - * @export - * @interface AdminUserCountsResponse - */ -export interface AdminUserCountsResponse { - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - devices: number; - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - shockers: number; - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - apiTokens: number; - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - passwordResetRequests: number; - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - shockerControlLogs: number; - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - shockerShares: number; - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - shockerShareLinks: number; - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - changeNameRequests: number; - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - changeEmailRequests: number; - /** - * - * @type {number} - * @memberof AdminUserCountsResponse - */ - createUserRequests: number; -} - -/** - * Check if a given object implements the AdminUserCountsResponse interface. - */ -export function instanceOfAdminUserCountsResponse(value: object): value is AdminUserCountsResponse { - if (!('devices' in value) || value['devices'] === undefined) return false; - if (!('shockers' in value) || value['shockers'] === undefined) return false; - if (!('apiTokens' in value) || value['apiTokens'] === undefined) return false; - if (!('passwordResetRequests' in value) || value['passwordResetRequests'] === undefined) return false; - if (!('shockerControlLogs' in value) || value['shockerControlLogs'] === undefined) return false; - if (!('shockerShares' in value) || value['shockerShares'] === undefined) return false; - if (!('shockerShareLinks' in value) || value['shockerShareLinks'] === undefined) return false; - if (!('changeNameRequests' in value) || value['changeNameRequests'] === undefined) return false; - if (!('changeEmailRequests' in value) || value['changeEmailRequests'] === undefined) return false; - if (!('createUserRequests' in value) || value['createUserRequests'] === undefined) return false; - return true; -} - -export function AdminUserCountsResponseFromJSON(json: any): AdminUserCountsResponse { - return AdminUserCountsResponseFromJSONTyped(json, false); -} - -export function AdminUserCountsResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): AdminUserCountsResponse { - if (json == null) { - return json; - } - return { - - 'devices': json['devices'], - 'shockers': json['shockers'], - 'apiTokens': json['apiTokens'], - 'passwordResetRequests': json['passwordResetRequests'], - 'shockerControlLogs': json['shockerControlLogs'], - 'shockerShares': json['shockerShares'], - 'shockerShareLinks': json['shockerShareLinks'], - 'changeNameRequests': json['changeNameRequests'], - 'changeEmailRequests': json['changeEmailRequests'], - 'createUserRequests': json['createUserRequests'], - }; -} - - export function AdminUserCountsResponseToJSON(json: any): AdminUserCountsResponse { - return AdminUserCountsResponseToJSONTyped(json, false); - } - - export function AdminUserCountsResponseToJSONTyped(value?: AdminUserCountsResponse | null, ignoreDiscriminator: boolean = false): any { - if (value == null) { - return value; - } - - return { - - 'devices': value['devices'], - 'shockers': value['shockers'], - 'apiTokens': value['apiTokens'], - 'passwordResetRequests': value['passwordResetRequests'], - 'shockerControlLogs': value['shockerControlLogs'], - 'shockerShares': value['shockerShares'], - 'shockerShareLinks': value['shockerShareLinks'], - 'changeNameRequests': value['changeNameRequests'], - 'changeEmailRequests': value['changeEmailRequests'], - 'createUserRequests': value['createUserRequests'], - }; -} - diff --git a/src/lib/api/internal/v1/models/AdminUserResponse.ts b/src/lib/api/internal/v1/models/AdminUserResponse.ts deleted file mode 100644 index c0ffe635..00000000 --- a/src/lib/api/internal/v1/models/AdminUserResponse.ts +++ /dev/null @@ -1,153 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * OpenShock.API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { PasswordHashingAlgorithm } from './PasswordHashingAlgorithm'; -import { - PasswordHashingAlgorithmFromJSON, - PasswordHashingAlgorithmFromJSONTyped, - PasswordHashingAlgorithmToJSON, - PasswordHashingAlgorithmToJSONTyped, -} from './PasswordHashingAlgorithm'; -import type { AdminUserCountsResponse } from './AdminUserCountsResponse'; -import { - AdminUserCountsResponseFromJSON, - AdminUserCountsResponseFromJSONTyped, - AdminUserCountsResponseToJSON, - AdminUserCountsResponseToJSONTyped, -} from './AdminUserCountsResponse'; -import type { RankType } from './RankType'; -import { - RankTypeFromJSON, - RankTypeFromJSONTyped, - RankTypeToJSON, - RankTypeToJSONTyped, -} from './RankType'; - -/** - * - * @export - * @interface AdminUserResponse - */ -export interface AdminUserResponse { - /** - * - * @type {string} - * @memberof AdminUserResponse - */ - id: string; - /** - * - * @type {string} - * @memberof AdminUserResponse - */ - name: string | null; - /** - * - * @type {string} - * @memberof AdminUserResponse - */ - email: string | null; - /** - * - * @type {PasswordHashingAlgorithm} - * @memberof AdminUserResponse - */ - passwordHashType: PasswordHashingAlgorithm; - /** - * - * @type {Date} - * @memberof AdminUserResponse - */ - createdAt: Date; - /** - * - * @type {boolean} - * @memberof AdminUserResponse - */ - emailActivated: boolean; - /** - * - * @type {RankType} - * @memberof AdminUserResponse - */ - rank: RankType; - /** - * - * @type {AdminUserCountsResponse} - * @memberof AdminUserResponse - */ - counts: AdminUserCountsResponse; -} - - - -/** - * Check if a given object implements the AdminUserResponse interface. - */ -export function instanceOfAdminUserResponse(value: object): value is AdminUserResponse { - if (!('id' in value) || value['id'] === undefined) return false; - if (!('name' in value) || value['name'] === undefined) return false; - if (!('email' in value) || value['email'] === undefined) return false; - if (!('passwordHashType' in value) || value['passwordHashType'] === undefined) return false; - if (!('createdAt' in value) || value['createdAt'] === undefined) return false; - if (!('emailActivated' in value) || value['emailActivated'] === undefined) return false; - if (!('rank' in value) || value['rank'] === undefined) return false; - if (!('counts' in value) || value['counts'] === undefined) return false; - return true; -} - -export function AdminUserResponseFromJSON(json: any): AdminUserResponse { - return AdminUserResponseFromJSONTyped(json, false); -} - -export function AdminUserResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): AdminUserResponse { - if (json == null) { - return json; - } - return { - - 'id': json['id'], - 'name': json['name'], - 'email': json['email'], - 'passwordHashType': PasswordHashingAlgorithmFromJSON(json['passwordHashType']), - 'createdAt': (new Date(json['createdAt'])), - 'emailActivated': json['emailActivated'], - 'rank': RankTypeFromJSON(json['rank']), - 'counts': AdminUserCountsResponseFromJSON(json['counts']), - }; -} - - export function AdminUserResponseToJSON(json: any): AdminUserResponse { - return AdminUserResponseToJSONTyped(json, false); - } - - export function AdminUserResponseToJSONTyped(value?: AdminUserResponse | null, ignoreDiscriminator: boolean = false): any { - if (value == null) { - return value; - } - - return { - - 'id': value['id'], - 'name': value['name'], - 'email': value['email'], - 'passwordHashType': PasswordHashingAlgorithmToJSON(value['passwordHashType']), - 'createdAt': ((value['createdAt']).toISOString()), - 'emailActivated': value['emailActivated'], - 'rank': RankTypeToJSON(value['rank']), - 'counts': AdminUserCountsResponseToJSON(value['counts']), - }; -} - diff --git a/src/lib/api/internal/v1/models/AdminUserResponsePaginated.ts b/src/lib/api/internal/v1/models/AdminUserResponsePaginated.ts deleted file mode 100644 index 5e0405d4..00000000 --- a/src/lib/api/internal/v1/models/AdminUserResponsePaginated.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * OpenShock.API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { AdminUserResponse } from './AdminUserResponse'; -import { - AdminUserResponseFromJSON, - AdminUserResponseFromJSONTyped, - AdminUserResponseToJSON, - AdminUserResponseToJSONTyped, -} from './AdminUserResponse'; - -/** - * - * @export - * @interface AdminUserResponsePaginated - */ -export interface AdminUserResponsePaginated { - /** - * - * @type {number} - * @memberof AdminUserResponsePaginated - */ - offset?: number; - /** - * - * @type {number} - * @memberof AdminUserResponsePaginated - */ - limit?: number; - /** - * - * @type {number} - * @memberof AdminUserResponsePaginated - */ - total?: number; - /** - * - * @type {Array} - * @memberof AdminUserResponsePaginated - */ - data?: Array | null; -} - -/** - * Check if a given object implements the AdminUserResponsePaginated interface. - */ -export function instanceOfAdminUserResponsePaginated(value: object): value is AdminUserResponsePaginated { - return true; -} - -export function AdminUserResponsePaginatedFromJSON(json: any): AdminUserResponsePaginated { - return AdminUserResponsePaginatedFromJSONTyped(json, false); -} - -export function AdminUserResponsePaginatedFromJSONTyped(json: any, ignoreDiscriminator: boolean): AdminUserResponsePaginated { - if (json == null) { - return json; - } - return { - - 'offset': json['offset'] == null ? undefined : json['offset'], - 'limit': json['limit'] == null ? undefined : json['limit'], - 'total': json['total'] == null ? undefined : json['total'], - 'data': json['data'] == null ? undefined : ((json['data'] as Array).map(AdminUserResponseFromJSON)), - }; -} - - export function AdminUserResponsePaginatedToJSON(json: any): AdminUserResponsePaginated { - return AdminUserResponsePaginatedToJSONTyped(json, false); - } - - export function AdminUserResponsePaginatedToJSONTyped(value?: AdminUserResponsePaginated | null, ignoreDiscriminator: boolean = false): any { - if (value == null) { - return value; - } - - return { - - 'offset': value['offset'], - 'limit': value['limit'], - 'total': value['total'], - 'data': value['data'] == null ? undefined : ((value['data'] as Array).map(AdminUserResponseToJSON)), - }; -} - diff --git a/src/lib/api/internal/v1/models/AdminUsersView.ts b/src/lib/api/internal/v1/models/AdminUsersView.ts new file mode 100644 index 00000000..10cc5055 --- /dev/null +++ b/src/lib/api/internal/v1/models/AdminUsersView.ts @@ -0,0 +1,227 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { PasswordHashingAlgorithm } from './PasswordHashingAlgorithm'; +import { + PasswordHashingAlgorithmFromJSON, + PasswordHashingAlgorithmFromJSONTyped, + PasswordHashingAlgorithmToJSON, + PasswordHashingAlgorithmToJSONTyped, +} from './PasswordHashingAlgorithm'; +import type { RankType } from './RankType'; +import { + RankTypeFromJSON, + RankTypeFromJSONTyped, + RankTypeToJSON, + RankTypeToJSONTyped, +} from './RankType'; + +/** + * + * @export + * @interface AdminUsersView + */ +export interface AdminUsersView { + /** + * + * @type {string} + * @memberof AdminUsersView + */ + id: string; + /** + * + * @type {string} + * @memberof AdminUsersView + */ + name: string; + /** + * + * @type {string} + * @memberof AdminUsersView + */ + email: string; + /** + * + * @type {PasswordHashingAlgorithm} + * @memberof AdminUsersView + */ + passwordHashType: PasswordHashingAlgorithm; + /** + * + * @type {Date} + * @memberof AdminUsersView + */ + createdAt: Date; + /** + * + * @type {boolean} + * @memberof AdminUsersView + */ + emailActivated: boolean; + /** + * + * @type {RankType} + * @memberof AdminUsersView + */ + rank: RankType; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + apiTokenCount: number; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + passwordResetCount: number; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + shockerShareCount: number; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + shockerShareLinkCount: number; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + emailChangeRequestCount: number; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + nameChangeRequestCount: number; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + userActivationCount: number; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + deviceCount: number; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + shockerCount: number; + /** + * + * @type {number} + * @memberof AdminUsersView + */ + shockerControlLogCount: number; +} + + + +/** + * Check if a given object implements the AdminUsersView interface. + */ +export function instanceOfAdminUsersView(value: object): value is AdminUsersView { + if (!('id' in value) || value['id'] === undefined) return false; + if (!('name' in value) || value['name'] === undefined) return false; + if (!('email' in value) || value['email'] === undefined) return false; + if (!('passwordHashType' in value) || value['passwordHashType'] === undefined) return false; + if (!('createdAt' in value) || value['createdAt'] === undefined) return false; + if (!('emailActivated' in value) || value['emailActivated'] === undefined) return false; + if (!('rank' in value) || value['rank'] === undefined) return false; + if (!('apiTokenCount' in value) || value['apiTokenCount'] === undefined) return false; + if (!('passwordResetCount' in value) || value['passwordResetCount'] === undefined) return false; + if (!('shockerShareCount' in value) || value['shockerShareCount'] === undefined) return false; + if (!('shockerShareLinkCount' in value) || value['shockerShareLinkCount'] === undefined) return false; + if (!('emailChangeRequestCount' in value) || value['emailChangeRequestCount'] === undefined) return false; + if (!('nameChangeRequestCount' in value) || value['nameChangeRequestCount'] === undefined) return false; + if (!('userActivationCount' in value) || value['userActivationCount'] === undefined) return false; + if (!('deviceCount' in value) || value['deviceCount'] === undefined) return false; + if (!('shockerCount' in value) || value['shockerCount'] === undefined) return false; + if (!('shockerControlLogCount' in value) || value['shockerControlLogCount'] === undefined) return false; + return true; +} + +export function AdminUsersViewFromJSON(json: any): AdminUsersView { + return AdminUsersViewFromJSONTyped(json, false); +} + +export function AdminUsersViewFromJSONTyped(json: any, ignoreDiscriminator: boolean): AdminUsersView { + if (json == null) { + return json; + } + return { + + 'id': json['id'], + 'name': json['name'], + 'email': json['email'], + 'passwordHashType': PasswordHashingAlgorithmFromJSON(json['passwordHashType']), + 'createdAt': (new Date(json['createdAt'])), + 'emailActivated': json['emailActivated'], + 'rank': RankTypeFromJSON(json['rank']), + 'apiTokenCount': json['apiTokenCount'], + 'passwordResetCount': json['passwordResetCount'], + 'shockerShareCount': json['shockerShareCount'], + 'shockerShareLinkCount': json['shockerShareLinkCount'], + 'emailChangeRequestCount': json['emailChangeRequestCount'], + 'nameChangeRequestCount': json['nameChangeRequestCount'], + 'userActivationCount': json['userActivationCount'], + 'deviceCount': json['deviceCount'], + 'shockerCount': json['shockerCount'], + 'shockerControlLogCount': json['shockerControlLogCount'], + }; +} + +export function AdminUsersViewToJSON(json: any): AdminUsersView { + return AdminUsersViewToJSONTyped(json, false); +} + +export function AdminUsersViewToJSONTyped(value?: AdminUsersView | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'id': value['id'], + 'name': value['name'], + 'email': value['email'], + 'passwordHashType': PasswordHashingAlgorithmToJSON(value['passwordHashType']), + 'createdAt': ((value['createdAt']).toISOString()), + 'emailActivated': value['emailActivated'], + 'rank': RankTypeToJSON(value['rank']), + 'apiTokenCount': value['apiTokenCount'], + 'passwordResetCount': value['passwordResetCount'], + 'shockerShareCount': value['shockerShareCount'], + 'shockerShareLinkCount': value['shockerShareLinkCount'], + 'emailChangeRequestCount': value['emailChangeRequestCount'], + 'nameChangeRequestCount': value['nameChangeRequestCount'], + 'userActivationCount': value['userActivationCount'], + 'deviceCount': value['deviceCount'], + 'shockerCount': value['shockerCount'], + 'shockerControlLogCount': value['shockerControlLogCount'], + }; +} + diff --git a/src/lib/api/internal/v1/models/AdminUsersViewPaginated.ts b/src/lib/api/internal/v1/models/AdminUsersViewPaginated.ts new file mode 100644 index 00000000..901c8dd2 --- /dev/null +++ b/src/lib/api/internal/v1/models/AdminUsersViewPaginated.ts @@ -0,0 +1,101 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { AdminUsersView } from './AdminUsersView'; +import { + AdminUsersViewFromJSON, + AdminUsersViewFromJSONTyped, + AdminUsersViewToJSON, + AdminUsersViewToJSONTyped, +} from './AdminUsersView'; + +/** + * + * @export + * @interface AdminUsersViewPaginated + */ +export interface AdminUsersViewPaginated { + /** + * + * @type {number} + * @memberof AdminUsersViewPaginated + */ + offset: number; + /** + * + * @type {number} + * @memberof AdminUsersViewPaginated + */ + limit: number; + /** + * + * @type {number} + * @memberof AdminUsersViewPaginated + */ + total: number; + /** + * + * @type {Array} + * @memberof AdminUsersViewPaginated + */ + data: Array; +} + +/** + * Check if a given object implements the AdminUsersViewPaginated interface. + */ +export function instanceOfAdminUsersViewPaginated(value: object): value is AdminUsersViewPaginated { + if (!('offset' in value) || value['offset'] === undefined) return false; + if (!('limit' in value) || value['limit'] === undefined) return false; + if (!('total' in value) || value['total'] === undefined) return false; + if (!('data' in value) || value['data'] === undefined) return false; + return true; +} + +export function AdminUsersViewPaginatedFromJSON(json: any): AdminUsersViewPaginated { + return AdminUsersViewPaginatedFromJSONTyped(json, false); +} + +export function AdminUsersViewPaginatedFromJSONTyped(json: any, ignoreDiscriminator: boolean): AdminUsersViewPaginated { + if (json == null) { + return json; + } + return { + + 'offset': json['offset'], + 'limit': json['limit'], + 'total': json['total'], + 'data': ((json['data'] as Array).map(AdminUsersViewFromJSON)), + }; +} + +export function AdminUsersViewPaginatedToJSON(json: any): AdminUsersViewPaginated { + return AdminUsersViewPaginatedToJSONTyped(json, false); +} + +export function AdminUsersViewPaginatedToJSONTyped(value?: AdminUsersViewPaginated | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'offset': value['offset'], + 'limit': value['limit'], + 'total': value['total'], + 'data': ((value['data'] as Array).map(AdminUsersViewToJSON)), + }; +} + diff --git a/src/lib/api/internal/v1/models/BooleanBaseResponse.ts b/src/lib/api/internal/v1/models/BooleanBaseResponse.ts new file mode 100644 index 00000000..4f89c47c --- /dev/null +++ b/src/lib/api/internal/v1/models/BooleanBaseResponse.ts @@ -0,0 +1,73 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface BooleanBaseResponse + */ +export interface BooleanBaseResponse { + /** + * + * @type {string} + * @memberof BooleanBaseResponse + */ + message?: string | null; + /** + * + * @type {boolean} + * @memberof BooleanBaseResponse + */ + data?: boolean; +} + +/** + * Check if a given object implements the BooleanBaseResponse interface. + */ +export function instanceOfBooleanBaseResponse(value: object): value is BooleanBaseResponse { + return true; +} + +export function BooleanBaseResponseFromJSON(json: any): BooleanBaseResponse { + return BooleanBaseResponseFromJSONTyped(json, false); +} + +export function BooleanBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): BooleanBaseResponse { + if (json == null) { + return json; + } + return { + + 'message': json['message'] == null ? undefined : json['message'], + 'data': json['data'] == null ? undefined : json['data'], + }; +} + +export function BooleanBaseResponseToJSON(json: any): BooleanBaseResponse { + return BooleanBaseResponseToJSONTyped(json, false); +} + +export function BooleanBaseResponseToJSONTyped(value?: BooleanBaseResponse | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'message': value['message'], + 'data': value['data'], + }; +} + diff --git a/src/lib/api/internal/v1/models/BooleanNullableBaseResponse.ts b/src/lib/api/internal/v1/models/BooleanNullableBaseResponse.ts index e1737d1c..8555ac85 100644 --- a/src/lib/api/internal/v1/models/BooleanNullableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/BooleanNullableBaseResponse.ts @@ -55,11 +55,11 @@ export function BooleanNullableBaseResponseFromJSONTyped(json: any, ignoreDiscri }; } - export function BooleanNullableBaseResponseToJSON(json: any): BooleanNullableBaseResponse { - return BooleanNullableBaseResponseToJSONTyped(json, false); - } +export function BooleanNullableBaseResponseToJSON(json: any): BooleanNullableBaseResponse { + return BooleanNullableBaseResponseToJSONTyped(json, false); +} - export function BooleanNullableBaseResponseToJSONTyped(value?: BooleanNullableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function BooleanNullableBaseResponseToJSONTyped(value?: BooleanNullableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ChangeEmailRequest.ts b/src/lib/api/internal/v1/models/ChangeEmailRequest.ts index 2fa2a380..54877396 100644 --- a/src/lib/api/internal/v1/models/ChangeEmailRequest.ts +++ b/src/lib/api/internal/v1/models/ChangeEmailRequest.ts @@ -24,7 +24,7 @@ export interface ChangeEmailRequest { * @type {string} * @memberof ChangeEmailRequest */ - email: string | null; + email: string; } /** @@ -49,11 +49,11 @@ export function ChangeEmailRequestFromJSONTyped(json: any, ignoreDiscriminator: }; } - export function ChangeEmailRequestToJSON(json: any): ChangeEmailRequest { - return ChangeEmailRequestToJSONTyped(json, false); - } +export function ChangeEmailRequestToJSON(json: any): ChangeEmailRequest { + return ChangeEmailRequestToJSONTyped(json, false); +} - export function ChangeEmailRequestToJSONTyped(value?: ChangeEmailRequest | null, ignoreDiscriminator: boolean = false): any { +export function ChangeEmailRequestToJSONTyped(value?: ChangeEmailRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ChangePasswordRequest.ts b/src/lib/api/internal/v1/models/ChangePasswordRequest.ts index cbc82b45..58695ffd 100644 --- a/src/lib/api/internal/v1/models/ChangePasswordRequest.ts +++ b/src/lib/api/internal/v1/models/ChangePasswordRequest.ts @@ -24,13 +24,13 @@ export interface ChangePasswordRequest { * @type {string} * @memberof ChangePasswordRequest */ - oldPassword: string | null; + oldPassword: string; /** * * @type {string} * @memberof ChangePasswordRequest */ - newPassword: string | null; + newPassword: string; } /** @@ -57,11 +57,11 @@ export function ChangePasswordRequestFromJSONTyped(json: any, ignoreDiscriminato }; } - export function ChangePasswordRequestToJSON(json: any): ChangePasswordRequest { - return ChangePasswordRequestToJSONTyped(json, false); - } +export function ChangePasswordRequestToJSON(json: any): ChangePasswordRequest { + return ChangePasswordRequestToJSONTyped(json, false); +} - export function ChangePasswordRequestToJSONTyped(value?: ChangePasswordRequest | null, ignoreDiscriminator: boolean = false): any { +export function ChangePasswordRequestToJSONTyped(value?: ChangePasswordRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ChangeUsernameRequest.ts b/src/lib/api/internal/v1/models/ChangeUsernameRequest.ts index 6a1eba24..d230b8e6 100644 --- a/src/lib/api/internal/v1/models/ChangeUsernameRequest.ts +++ b/src/lib/api/internal/v1/models/ChangeUsernameRequest.ts @@ -24,7 +24,7 @@ export interface ChangeUsernameRequest { * @type {string} * @memberof ChangeUsernameRequest */ - username: string | null; + username: string; } /** @@ -49,11 +49,11 @@ export function ChangeUsernameRequestFromJSONTyped(json: any, ignoreDiscriminato }; } - export function ChangeUsernameRequestToJSON(json: any): ChangeUsernameRequest { - return ChangeUsernameRequestToJSONTyped(json, false); - } +export function ChangeUsernameRequestToJSON(json: any): ChangeUsernameRequest { + return ChangeUsernameRequestToJSONTyped(json, false); +} - export function ChangeUsernameRequestToJSONTyped(value?: ChangeUsernameRequest | null, ignoreDiscriminator: boolean = false): any { +export function ChangeUsernameRequestToJSONTyped(value?: ChangeUsernameRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/Control.ts b/src/lib/api/internal/v1/models/Control.ts index 7aaa69e6..2c01bbd2 100644 --- a/src/lib/api/internal/v1/models/Control.ts +++ b/src/lib/api/internal/v1/models/Control.ts @@ -90,11 +90,11 @@ export function ControlFromJSONTyped(json: any, ignoreDiscriminator: boolean): C }; } - export function ControlToJSON(json: any): Control { - return ControlToJSONTyped(json, false); - } +export function ControlToJSON(json: any): Control { + return ControlToJSONTyped(json, false); +} - export function ControlToJSONTyped(value?: Control | null, ignoreDiscriminator: boolean = false): any { +export function ControlToJSONTyped(value?: Control | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ControlLogSenderLight.ts b/src/lib/api/internal/v1/models/ControlLogSenderLight.ts index 827bc015..d3376803 100644 --- a/src/lib/api/internal/v1/models/ControlLogSenderLight.ts +++ b/src/lib/api/internal/v1/models/ControlLogSenderLight.ts @@ -30,13 +30,13 @@ export interface ControlLogSenderLight { * @type {string} * @memberof ControlLogSenderLight */ - name: string | null; + name: string; /** * * @type {string} * @memberof ControlLogSenderLight */ - image: string | null; + image: string; /** * * @type {string} @@ -73,11 +73,11 @@ export function ControlLogSenderLightFromJSONTyped(json: any, ignoreDiscriminato }; } - export function ControlLogSenderLightToJSON(json: any): ControlLogSenderLight { - return ControlLogSenderLightToJSONTyped(json, false); - } +export function ControlLogSenderLightToJSON(json: any): ControlLogSenderLight { + return ControlLogSenderLightToJSONTyped(json, false); +} - export function ControlLogSenderLightToJSONTyped(value?: ControlLogSenderLight | null, ignoreDiscriminator: boolean = false): any { +export function ControlLogSenderLightToJSONTyped(value?: ControlLogSenderLight | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ControlType.ts b/src/lib/api/internal/v1/models/ControlType.ts index f10b40cb..8478e8f4 100644 --- a/src/lib/api/internal/v1/models/ControlType.ts +++ b/src/lib/api/internal/v1/models/ControlType.ts @@ -18,11 +18,10 @@ * @enum {string} */ export enum ControlType { - stop = 'Stop', - shock = 'Shock', - vibrate = 'Vibrate', - sound = 'Sound', - unknownDefaultOpenApi = '11184809' + Stop = 'Stop', + Shock = 'Shock', + Vibrate = 'Vibrate', + Sound = 'Sound' } diff --git a/src/lib/api/internal/v1/models/CreateTokenRequest.ts b/src/lib/api/internal/v1/models/CreateTokenRequest.ts index 4cf5d01b..8f2a54bc 100644 --- a/src/lib/api/internal/v1/models/CreateTokenRequest.ts +++ b/src/lib/api/internal/v1/models/CreateTokenRequest.ts @@ -32,13 +32,13 @@ export interface CreateTokenRequest { * @type {string} * @memberof CreateTokenRequest */ - name: string | null; + name: string; /** * * @type {Array} * @memberof CreateTokenRequest */ - permissions?: Array | null; + permissions?: Array; /** * * @type {Date} @@ -71,11 +71,11 @@ export function CreateTokenRequestFromJSONTyped(json: any, ignoreDiscriminator: }; } - export function CreateTokenRequestToJSON(json: any): CreateTokenRequest { - return CreateTokenRequestToJSONTyped(json, false); - } +export function CreateTokenRequestToJSON(json: any): CreateTokenRequest { + return CreateTokenRequestToJSONTyped(json, false); +} - export function CreateTokenRequestToJSONTyped(value?: CreateTokenRequest | null, ignoreDiscriminator: boolean = false): any { +export function CreateTokenRequestToJSONTyped(value?: CreateTokenRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/DeviceEdit.ts b/src/lib/api/internal/v1/models/DeviceEdit.ts deleted file mode 100644 index 9d0ce3f1..00000000 --- a/src/lib/api/internal/v1/models/DeviceEdit.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * OpenShock.API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -/** - * - * @export - * @interface DeviceEdit - */ -export interface DeviceEdit { - /** - * - * @type {string} - * @memberof DeviceEdit - */ - name: string | null; -} - -/** - * Check if a given object implements the DeviceEdit interface. - */ -export function instanceOfDeviceEdit(value: object): value is DeviceEdit { - if (!('name' in value) || value['name'] === undefined) return false; - return true; -} - -export function DeviceEditFromJSON(json: any): DeviceEdit { - return DeviceEditFromJSONTyped(json, false); -} - -export function DeviceEditFromJSONTyped(json: any, ignoreDiscriminator: boolean): DeviceEdit { - if (json == null) { - return json; - } - return { - - 'name': json['name'], - }; -} - - export function DeviceEditToJSON(json: any): DeviceEdit { - return DeviceEditToJSONTyped(json, false); - } - - export function DeviceEditToJSONTyped(value?: DeviceEdit | null, ignoreDiscriminator: boolean = false): any { - if (value == null) { - return value; - } - - return { - - 'name': value['name'], - }; -} - diff --git a/src/lib/api/internal/v1/models/DeviceSelfResponse.ts b/src/lib/api/internal/v1/models/DeviceSelfResponse.ts index 00820fbf..0bdda5cb 100644 --- a/src/lib/api/internal/v1/models/DeviceSelfResponse.ts +++ b/src/lib/api/internal/v1/models/DeviceSelfResponse.ts @@ -38,13 +38,13 @@ export interface DeviceSelfResponse { * @type {string} * @memberof DeviceSelfResponse */ - name: string | null; + name: string; /** * * @type {Array} * @memberof DeviceSelfResponse */ - shockers: Array | null; + shockers: Array; } /** @@ -69,15 +69,15 @@ export function DeviceSelfResponseFromJSONTyped(json: any, ignoreDiscriminator: 'id': json['id'], 'name': json['name'], - 'shockers': (json['shockers'] == null ? null : (json['shockers'] as Array).map(MinimalShockerFromJSON)), + 'shockers': ((json['shockers'] as Array).map(MinimalShockerFromJSON)), }; } - export function DeviceSelfResponseToJSON(json: any): DeviceSelfResponse { - return DeviceSelfResponseToJSONTyped(json, false); - } +export function DeviceSelfResponseToJSON(json: any): DeviceSelfResponse { + return DeviceSelfResponseToJSONTyped(json, false); +} - export function DeviceSelfResponseToJSONTyped(value?: DeviceSelfResponse | null, ignoreDiscriminator: boolean = false): any { +export function DeviceSelfResponseToJSONTyped(value?: DeviceSelfResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } @@ -86,7 +86,7 @@ export function DeviceSelfResponseFromJSONTyped(json: any, ignoreDiscriminator: 'id': value['id'], 'name': value['name'], - 'shockers': (value['shockers'] == null ? null : (value['shockers'] as Array).map(MinimalShockerToJSON)), + 'shockers': ((value['shockers'] as Array).map(MinimalShockerToJSON)), }; } diff --git a/src/lib/api/internal/v1/models/DeviceSelfResponseBaseResponse.ts b/src/lib/api/internal/v1/models/DeviceSelfResponseBaseResponse.ts index b9f637ed..c451db21 100644 --- a/src/lib/api/internal/v1/models/DeviceSelfResponseBaseResponse.ts +++ b/src/lib/api/internal/v1/models/DeviceSelfResponseBaseResponse.ts @@ -63,11 +63,11 @@ export function DeviceSelfResponseBaseResponseFromJSONTyped(json: any, ignoreDis }; } - export function DeviceSelfResponseBaseResponseToJSON(json: any): DeviceSelfResponseBaseResponse { - return DeviceSelfResponseBaseResponseToJSONTyped(json, false); - } +export function DeviceSelfResponseBaseResponseToJSON(json: any): DeviceSelfResponseBaseResponse { + return DeviceSelfResponseBaseResponseToJSONTyped(json, false); +} - export function DeviceSelfResponseBaseResponseToJSONTyped(value?: DeviceSelfResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function DeviceSelfResponseBaseResponseToJSONTyped(value?: DeviceSelfResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/EditTokenRequest.ts b/src/lib/api/internal/v1/models/EditTokenRequest.ts index 942b4892..56bef0b6 100644 --- a/src/lib/api/internal/v1/models/EditTokenRequest.ts +++ b/src/lib/api/internal/v1/models/EditTokenRequest.ts @@ -32,13 +32,13 @@ export interface EditTokenRequest { * @type {string} * @memberof EditTokenRequest */ - name: string | null; + name: string; /** * * @type {Array} * @memberof EditTokenRequest */ - permissions?: Array | null; + permissions?: Array; } /** @@ -64,11 +64,11 @@ export function EditTokenRequestFromJSONTyped(json: any, ignoreDiscriminator: bo }; } - export function EditTokenRequestToJSON(json: any): EditTokenRequest { - return EditTokenRequestToJSONTyped(json, false); - } +export function EditTokenRequestToJSON(json: any): EditTokenRequest { + return EditTokenRequestToJSONTyped(json, false); +} - export function EditTokenRequestToJSONTyped(value?: EditTokenRequest | null, ignoreDiscriminator: boolean = false): any { +export function EditTokenRequestToJSONTyped(value?: EditTokenRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/GenericIni.ts b/src/lib/api/internal/v1/models/GenericIni.ts index 71307a4a..2286c539 100644 --- a/src/lib/api/internal/v1/models/GenericIni.ts +++ b/src/lib/api/internal/v1/models/GenericIni.ts @@ -30,13 +30,13 @@ export interface GenericIni { * @type {string} * @memberof GenericIni */ - name: string | null; + name: string; /** * * @type {string} * @memberof GenericIni */ - image: string | null; + image: string; } /** @@ -65,11 +65,11 @@ export function GenericIniFromJSONTyped(json: any, ignoreDiscriminator: boolean) }; } - export function GenericIniToJSON(json: any): GenericIni { - return GenericIniToJSONTyped(json, false); - } +export function GenericIniToJSON(json: any): GenericIni { + return GenericIniToJSONTyped(json, false); +} - export function GenericIniToJSONTyped(value?: GenericIni | null, ignoreDiscriminator: boolean = false): any { +export function GenericIniToJSONTyped(value?: GenericIni | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/GuidBaseResponse.ts b/src/lib/api/internal/v1/models/GuidBaseResponse.ts index b08f920b..07e9b5a4 100644 --- a/src/lib/api/internal/v1/models/GuidBaseResponse.ts +++ b/src/lib/api/internal/v1/models/GuidBaseResponse.ts @@ -55,11 +55,11 @@ export function GuidBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: bo }; } - export function GuidBaseResponseToJSON(json: any): GuidBaseResponse { - return GuidBaseResponseToJSONTyped(json, false); - } +export function GuidBaseResponseToJSON(json: any): GuidBaseResponse { + return GuidBaseResponseToJSONTyped(json, false); +} - export function GuidBaseResponseToJSONTyped(value?: GuidBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function GuidBaseResponseToJSONTyped(value?: GuidBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/HubEditRequest.ts b/src/lib/api/internal/v1/models/HubEditRequest.ts index efb43e65..ada25d27 100644 --- a/src/lib/api/internal/v1/models/HubEditRequest.ts +++ b/src/lib/api/internal/v1/models/HubEditRequest.ts @@ -49,11 +49,11 @@ export function HubEditRequestFromJSONTyped(json: any, ignoreDiscriminator: bool }; } - export function HubEditRequestToJSON(json: any): HubEditRequest { - return HubEditRequestToJSONTyped(json, false); - } +export function HubEditRequestToJSON(json: any): HubEditRequest { + return HubEditRequestToJSONTyped(json, false); +} - export function HubEditRequestToJSONTyped(value?: HubEditRequest | null, ignoreDiscriminator: boolean = false): any { +export function HubEditRequestToJSONTyped(value?: HubEditRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/LcgNodeResponse.ts b/src/lib/api/internal/v1/models/LcgNodeResponse.ts index 9d6f071a..4cd70158 100644 --- a/src/lib/api/internal/v1/models/LcgNodeResponse.ts +++ b/src/lib/api/internal/v1/models/LcgNodeResponse.ts @@ -24,13 +24,13 @@ export interface LcgNodeResponse { * @type {string} * @memberof LcgNodeResponse */ - fqdn: string | null; + fqdn: string; /** * * @type {string} * @memberof LcgNodeResponse */ - country: string | null; + country: string; } /** @@ -57,11 +57,11 @@ export function LcgNodeResponseFromJSONTyped(json: any, ignoreDiscriminator: boo }; } - export function LcgNodeResponseToJSON(json: any): LcgNodeResponse { - return LcgNodeResponseToJSONTyped(json, false); - } +export function LcgNodeResponseToJSON(json: any): LcgNodeResponse { + return LcgNodeResponseToJSONTyped(json, false); +} - export function LcgNodeResponseToJSONTyped(value?: LcgNodeResponse | null, ignoreDiscriminator: boolean = false): any { +export function LcgNodeResponseToJSONTyped(value?: LcgNodeResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/LcgNodeResponseBaseResponse.ts b/src/lib/api/internal/v1/models/LcgNodeResponseBaseResponse.ts index 8b8800a4..d59e8b0e 100644 --- a/src/lib/api/internal/v1/models/LcgNodeResponseBaseResponse.ts +++ b/src/lib/api/internal/v1/models/LcgNodeResponseBaseResponse.ts @@ -63,11 +63,11 @@ export function LcgNodeResponseBaseResponseFromJSONTyped(json: any, ignoreDiscri }; } - export function LcgNodeResponseBaseResponseToJSON(json: any): LcgNodeResponseBaseResponse { - return LcgNodeResponseBaseResponseToJSONTyped(json, false); - } +export function LcgNodeResponseBaseResponseToJSON(json: any): LcgNodeResponseBaseResponse { + return LcgNodeResponseBaseResponseToJSONTyped(json, false); +} - export function LcgNodeResponseBaseResponseToJSONTyped(value?: LcgNodeResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function LcgNodeResponseBaseResponseToJSONTyped(value?: LcgNodeResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/LcgResponse.ts b/src/lib/api/internal/v1/models/LcgResponse.ts index 92b84b84..3d4e6474 100644 --- a/src/lib/api/internal/v1/models/LcgResponse.ts +++ b/src/lib/api/internal/v1/models/LcgResponse.ts @@ -24,13 +24,13 @@ export interface LcgResponse { * @type {string} * @memberof LcgResponse */ - gateway: string | null; + gateway: string; /** * * @type {string} * @memberof LcgResponse */ - country: string | null; + country: string; } /** @@ -57,11 +57,11 @@ export function LcgResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean }; } - export function LcgResponseToJSON(json: any): LcgResponse { - return LcgResponseToJSONTyped(json, false); - } +export function LcgResponseToJSON(json: any): LcgResponse { + return LcgResponseToJSONTyped(json, false); +} - export function LcgResponseToJSONTyped(value?: LcgResponse | null, ignoreDiscriminator: boolean = false): any { +export function LcgResponseToJSONTyped(value?: LcgResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/LcgResponseBaseResponse.ts b/src/lib/api/internal/v1/models/LcgResponseBaseResponse.ts index 0a508145..bfcbd164 100644 --- a/src/lib/api/internal/v1/models/LcgResponseBaseResponse.ts +++ b/src/lib/api/internal/v1/models/LcgResponseBaseResponse.ts @@ -63,11 +63,11 @@ export function LcgResponseBaseResponseFromJSONTyped(json: any, ignoreDiscrimina }; } - export function LcgResponseBaseResponseToJSON(json: any): LcgResponseBaseResponse { - return LcgResponseBaseResponseToJSONTyped(json, false); - } +export function LcgResponseBaseResponseToJSON(json: any): LcgResponseBaseResponse { + return LcgResponseBaseResponseToJSONTyped(json, false); +} - export function LcgResponseBaseResponseToJSONTyped(value?: LcgResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function LcgResponseBaseResponseToJSONTyped(value?: LcgResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/LogEntry.ts b/src/lib/api/internal/v1/models/LogEntry.ts index 5df6586d..967949d0 100644 --- a/src/lib/api/internal/v1/models/LogEntry.ts +++ b/src/lib/api/internal/v1/models/LogEntry.ts @@ -106,11 +106,11 @@ export function LogEntryFromJSONTyped(json: any, ignoreDiscriminator: boolean): }; } - export function LogEntryToJSON(json: any): LogEntry { - return LogEntryToJSONTyped(json, false); - } +export function LogEntryToJSON(json: any): LogEntry { + return LogEntryToJSONTyped(json, false); +} - export function LogEntryToJSONTyped(value?: LogEntry | null, ignoreDiscriminator: boolean = false): any { +export function LogEntryToJSONTyped(value?: LogEntry | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/LogEntryIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/LogEntryIEnumerableBaseResponse.ts index e6c601ff..90e64b32 100644 --- a/src/lib/api/internal/v1/models/LogEntryIEnumerableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/LogEntryIEnumerableBaseResponse.ts @@ -63,11 +63,11 @@ export function LogEntryIEnumerableBaseResponseFromJSONTyped(json: any, ignoreDi }; } - export function LogEntryIEnumerableBaseResponseToJSON(json: any): LogEntryIEnumerableBaseResponse { - return LogEntryIEnumerableBaseResponseToJSONTyped(json, false); - } +export function LogEntryIEnumerableBaseResponseToJSON(json: any): LogEntryIEnumerableBaseResponse { + return LogEntryIEnumerableBaseResponseToJSONTyped(json, false); +} - export function LogEntryIEnumerableBaseResponseToJSONTyped(value?: LogEntryIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function LogEntryIEnumerableBaseResponseToJSONTyped(value?: LogEntryIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/Login.ts b/src/lib/api/internal/v1/models/Login.ts index fd60c973..2379dd69 100644 --- a/src/lib/api/internal/v1/models/Login.ts +++ b/src/lib/api/internal/v1/models/Login.ts @@ -24,13 +24,13 @@ export interface Login { * @type {string} * @memberof Login */ - password: string | null; + password: string; /** * * @type {string} * @memberof Login */ - email: string | null; + email: string; } /** @@ -57,11 +57,11 @@ export function LoginFromJSONTyped(json: any, ignoreDiscriminator: boolean): Log }; } - export function LoginToJSON(json: any): Login { - return LoginToJSONTyped(json, false); - } +export function LoginToJSON(json: any): Login { + return LoginToJSONTyped(json, false); +} - export function LoginToJSONTyped(value?: Login | null, ignoreDiscriminator: boolean = false): any { +export function LoginToJSONTyped(value?: Login | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/LoginSessionResponse.ts b/src/lib/api/internal/v1/models/LoginSessionResponse.ts index 94e9d9ee..80e01503 100644 --- a/src/lib/api/internal/v1/models/LoginSessionResponse.ts +++ b/src/lib/api/internal/v1/models/LoginSessionResponse.ts @@ -30,13 +30,13 @@ export interface LoginSessionResponse { * @type {string} * @memberof LoginSessionResponse */ - ip: string | null; + ip: string; /** * * @type {string} * @memberof LoginSessionResponse */ - userAgent: string | null; + userAgent: string; /** * * @type {Date} @@ -49,6 +49,12 @@ export interface LoginSessionResponse { * @memberof LoginSessionResponse */ expires: Date; + /** + * + * @type {Date} + * @memberof LoginSessionResponse + */ + lastUsed: Date | null; } /** @@ -60,6 +66,7 @@ export function instanceOfLoginSessionResponse(value: object): value is LoginSes if (!('userAgent' in value) || value['userAgent'] === undefined) return false; if (!('created' in value) || value['created'] === undefined) return false; if (!('expires' in value) || value['expires'] === undefined) return false; + if (!('lastUsed' in value) || value['lastUsed'] === undefined) return false; return true; } @@ -78,14 +85,15 @@ export function LoginSessionResponseFromJSONTyped(json: any, ignoreDiscriminator 'userAgent': json['userAgent'], 'created': (new Date(json['created'])), 'expires': (new Date(json['expires'])), + 'lastUsed': (json['lastUsed'] == null ? null : new Date(json['lastUsed'])), }; } - export function LoginSessionResponseToJSON(json: any): LoginSessionResponse { - return LoginSessionResponseToJSONTyped(json, false); - } +export function LoginSessionResponseToJSON(json: any): LoginSessionResponse { + return LoginSessionResponseToJSONTyped(json, false); +} - export function LoginSessionResponseToJSONTyped(value?: LoginSessionResponse | null, ignoreDiscriminator: boolean = false): any { +export function LoginSessionResponseToJSONTyped(value?: LoginSessionResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } @@ -97,6 +105,7 @@ export function LoginSessionResponseFromJSONTyped(json: any, ignoreDiscriminator 'userAgent': value['userAgent'], 'created': ((value['created']).toISOString()), 'expires': ((value['expires']).toISOString()), + 'lastUsed': (value['lastUsed'] == null ? null : (value['lastUsed'] as any).toISOString()), }; } diff --git a/src/lib/api/internal/v1/models/MinimalShocker.ts b/src/lib/api/internal/v1/models/MinimalShocker.ts index aab3b3a4..6635b606 100644 --- a/src/lib/api/internal/v1/models/MinimalShocker.ts +++ b/src/lib/api/internal/v1/models/MinimalShocker.ts @@ -75,11 +75,11 @@ export function MinimalShockerFromJSONTyped(json: any, ignoreDiscriminator: bool }; } - export function MinimalShockerToJSON(json: any): MinimalShocker { - return MinimalShockerToJSONTyped(json, false); - } +export function MinimalShockerToJSON(json: any): MinimalShocker { + return MinimalShockerToJSONTyped(json, false); +} - export function MinimalShockerToJSONTyped(value?: MinimalShocker | null, ignoreDiscriminator: boolean = false): any { +export function MinimalShockerToJSONTyped(value?: MinimalShocker | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/NewShocker.ts b/src/lib/api/internal/v1/models/NewShocker.ts index 86bc1be2..26112a3b 100644 --- a/src/lib/api/internal/v1/models/NewShocker.ts +++ b/src/lib/api/internal/v1/models/NewShocker.ts @@ -32,7 +32,7 @@ export interface NewShocker { * @type {string} * @memberof NewShocker */ - name: string | null; + name: string; /** * * @type {number} @@ -83,11 +83,11 @@ export function NewShockerFromJSONTyped(json: any, ignoreDiscriminator: boolean) }; } - export function NewShockerToJSON(json: any): NewShocker { - return NewShockerToJSONTyped(json, false); - } +export function NewShockerToJSON(json: any): NewShocker { + return NewShockerToJSONTyped(json, false); +} - export function NewShockerToJSONTyped(value?: NewShocker | null, ignoreDiscriminator: boolean = false): any { +export function NewShockerToJSONTyped(value?: NewShocker | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ObjectBaseResponse.ts b/src/lib/api/internal/v1/models/ObjectBaseResponse.ts index b6a3fdcd..c97b2361 100644 --- a/src/lib/api/internal/v1/models/ObjectBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ObjectBaseResponse.ts @@ -55,11 +55,11 @@ export function ObjectBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: }; } - export function ObjectBaseResponseToJSON(json: any): ObjectBaseResponse { - return ObjectBaseResponseToJSONTyped(json, false); - } +export function ObjectBaseResponseToJSON(json: any): ObjectBaseResponse { + return ObjectBaseResponseToJSONTyped(json, false); +} - export function ObjectBaseResponseToJSONTyped(value?: ObjectBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ObjectBaseResponseToJSONTyped(value?: ObjectBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/OpenShockProblem.ts b/src/lib/api/internal/v1/models/OpenShockProblem.ts index 9f668301..8ff597fe 100644 --- a/src/lib/api/internal/v1/models/OpenShockProblem.ts +++ b/src/lib/api/internal/v1/models/OpenShockProblem.ts @@ -56,13 +56,20 @@ export interface OpenShockProblem { * @memberof OpenShockProblem * @deprecated */ - readonly message?: string | null; + readonly message?: string; /** * * @type {string} * @memberof OpenShockProblem + * @deprecated */ - traceId?: string | null; + readonly traceId?: string | null; + /** + * + * @type {string} + * @memberof OpenShockProblem + */ + requestId?: string | null; } /** @@ -90,14 +97,15 @@ export function OpenShockProblemFromJSONTyped(json: any, ignoreDiscriminator: bo 'instance': json['instance'] == null ? undefined : json['instance'], 'message': json['message'] == null ? undefined : json['message'], 'traceId': json['traceId'] == null ? undefined : json['traceId'], + 'requestId': json['requestId'] == null ? undefined : json['requestId'], }; } - export function OpenShockProblemToJSON(json: any): OpenShockProblem { - return OpenShockProblemToJSONTyped(json, false); - } +export function OpenShockProblemToJSON(json: any): OpenShockProblem { + return OpenShockProblemToJSONTyped(json, false); +} - export function OpenShockProblemToJSONTyped(value?: Omit | null, ignoreDiscriminator: boolean = false): any { +export function OpenShockProblemToJSONTyped(value?: Omit | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } @@ -110,7 +118,7 @@ export function OpenShockProblemFromJSONTyped(json: any, ignoreDiscriminator: bo 'status': value['status'], 'detail': value['detail'], 'instance': value['instance'], - 'traceId': value['traceId'], + 'requestId': value['requestId'], }; } diff --git a/src/lib/api/internal/v1/models/OtaItem.ts b/src/lib/api/internal/v1/models/OtaItem.ts index 5325a16f..40659b82 100644 --- a/src/lib/api/internal/v1/models/OtaItem.ts +++ b/src/lib/api/internal/v1/models/OtaItem.ts @@ -50,7 +50,7 @@ export interface OtaItem { * @type {string} * @memberof OtaItem */ - version: string | null; + version: string; /** * * @type {string} @@ -91,11 +91,11 @@ export function OtaItemFromJSONTyped(json: any, ignoreDiscriminator: boolean): O }; } - export function OtaItemToJSON(json: any): OtaItem { - return OtaItemToJSONTyped(json, false); - } +export function OtaItemToJSON(json: any): OtaItem { + return OtaItemToJSONTyped(json, false); +} - export function OtaItemToJSONTyped(value?: OtaItem | null, ignoreDiscriminator: boolean = false): any { +export function OtaItemToJSONTyped(value?: OtaItem | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/OtaItemIReadOnlyCollectionBaseResponse.ts b/src/lib/api/internal/v1/models/OtaItemIReadOnlyCollectionBaseResponse.ts index 849ca1c7..8eee2536 100644 --- a/src/lib/api/internal/v1/models/OtaItemIReadOnlyCollectionBaseResponse.ts +++ b/src/lib/api/internal/v1/models/OtaItemIReadOnlyCollectionBaseResponse.ts @@ -63,11 +63,11 @@ export function OtaItemIReadOnlyCollectionBaseResponseFromJSONTyped(json: any, i }; } - export function OtaItemIReadOnlyCollectionBaseResponseToJSON(json: any): OtaItemIReadOnlyCollectionBaseResponse { - return OtaItemIReadOnlyCollectionBaseResponseToJSONTyped(json, false); - } +export function OtaItemIReadOnlyCollectionBaseResponseToJSON(json: any): OtaItemIReadOnlyCollectionBaseResponse { + return OtaItemIReadOnlyCollectionBaseResponseToJSONTyped(json, false); +} - export function OtaItemIReadOnlyCollectionBaseResponseToJSONTyped(value?: OtaItemIReadOnlyCollectionBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function OtaItemIReadOnlyCollectionBaseResponseToJSONTyped(value?: OtaItemIReadOnlyCollectionBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/OtaUpdateStatus.ts b/src/lib/api/internal/v1/models/OtaUpdateStatus.ts index db2c769d..61014dcf 100644 --- a/src/lib/api/internal/v1/models/OtaUpdateStatus.ts +++ b/src/lib/api/internal/v1/models/OtaUpdateStatus.ts @@ -18,12 +18,11 @@ * @enum {string} */ export enum OtaUpdateStatus { - started = 'Started', - running = 'Running', - finished = 'Finished', - error = 'Error', - timeout = 'Timeout', - unknownDefaultOpenApi = '11184809' + Started = 'Started', + Running = 'Running', + Finished = 'Finished', + Error = 'Error', + Timeout = 'Timeout' } diff --git a/src/lib/api/internal/v1/models/OwnerShockerResponse.ts b/src/lib/api/internal/v1/models/OwnerShockerResponse.ts index ab3364c2..d0f03bb6 100644 --- a/src/lib/api/internal/v1/models/OwnerShockerResponse.ts +++ b/src/lib/api/internal/v1/models/OwnerShockerResponse.ts @@ -38,19 +38,19 @@ export interface OwnerShockerResponse { * @type {string} * @memberof OwnerShockerResponse */ - name: string | null; + name: string; /** * * @type {string} * @memberof OwnerShockerResponse */ - image: string | null; + image: string; /** * * @type {Array} * @memberof OwnerShockerResponse */ - devices?: Array | null; + devices?: Array; } /** @@ -80,11 +80,11 @@ export function OwnerShockerResponseFromJSONTyped(json: any, ignoreDiscriminator }; } - export function OwnerShockerResponseToJSON(json: any): OwnerShockerResponse { - return OwnerShockerResponseToJSONTyped(json, false); - } +export function OwnerShockerResponseToJSON(json: any): OwnerShockerResponse { + return OwnerShockerResponseToJSONTyped(json, false); +} - export function OwnerShockerResponseToJSONTyped(value?: OwnerShockerResponse | null, ignoreDiscriminator: boolean = false): any { +export function OwnerShockerResponseToJSONTyped(value?: OwnerShockerResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/OwnerShockerResponseIEnumerableIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/OwnerShockerResponseIEnumerableIEnumerableBaseResponse.ts index 16eb5886..c9c12b3a 100644 --- a/src/lib/api/internal/v1/models/OwnerShockerResponseIEnumerableIEnumerableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/OwnerShockerResponseIEnumerableIEnumerableBaseResponse.ts @@ -63,11 +63,11 @@ export function OwnerShockerResponseIEnumerableIEnumerableBaseResponseFromJSONTy }; } - export function OwnerShockerResponseIEnumerableIEnumerableBaseResponseToJSON(json: any): OwnerShockerResponseIEnumerableIEnumerableBaseResponse { - return OwnerShockerResponseIEnumerableIEnumerableBaseResponseToJSONTyped(json, false); - } +export function OwnerShockerResponseIEnumerableIEnumerableBaseResponseToJSON(json: any): OwnerShockerResponseIEnumerableIEnumerableBaseResponse { + return OwnerShockerResponseIEnumerableIEnumerableBaseResponseToJSONTyped(json, false); +} - export function OwnerShockerResponseIEnumerableIEnumerableBaseResponseToJSONTyped(value?: OwnerShockerResponseIEnumerableIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function OwnerShockerResponseIEnumerableIEnumerableBaseResponseToJSONTyped(value?: OwnerShockerResponseIEnumerableIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/PasswordHashingAlgorithm.ts b/src/lib/api/internal/v1/models/PasswordHashingAlgorithm.ts index 9a021ac6..6f89242b 100644 --- a/src/lib/api/internal/v1/models/PasswordHashingAlgorithm.ts +++ b/src/lib/api/internal/v1/models/PasswordHashingAlgorithm.ts @@ -18,10 +18,9 @@ * @enum {string} */ export enum PasswordHashingAlgorithm { - bCrypt = 'BCrypt', - pbkdf2 = 'PBKDF2', - unknown = 'Unknown', - unknownDefaultOpenApi = '11184809' + BCrypt = 'BCrypt', + Pbkdf2 = 'PBKDF2', + Unknown = 'Unknown' } diff --git a/src/lib/api/internal/v1/models/PasswordResetProcessData.ts b/src/lib/api/internal/v1/models/PasswordResetProcessData.ts index 63366663..edd19b87 100644 --- a/src/lib/api/internal/v1/models/PasswordResetProcessData.ts +++ b/src/lib/api/internal/v1/models/PasswordResetProcessData.ts @@ -24,7 +24,7 @@ export interface PasswordResetProcessData { * @type {string} * @memberof PasswordResetProcessData */ - password: string | null; + password: string; } /** @@ -49,11 +49,11 @@ export function PasswordResetProcessDataFromJSONTyped(json: any, ignoreDiscrimin }; } - export function PasswordResetProcessDataToJSON(json: any): PasswordResetProcessData { - return PasswordResetProcessDataToJSONTyped(json, false); - } +export function PasswordResetProcessDataToJSON(json: any): PasswordResetProcessData { + return PasswordResetProcessDataToJSONTyped(json, false); +} - export function PasswordResetProcessDataToJSONTyped(value?: PasswordResetProcessData | null, ignoreDiscriminator: boolean = false): any { +export function PasswordResetProcessDataToJSONTyped(value?: PasswordResetProcessData | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/PauseReasonBaseResponse.ts b/src/lib/api/internal/v1/models/PauseReasonBaseResponse.ts index b5b6541e..4bbda4df 100644 --- a/src/lib/api/internal/v1/models/PauseReasonBaseResponse.ts +++ b/src/lib/api/internal/v1/models/PauseReasonBaseResponse.ts @@ -62,11 +62,11 @@ export function PauseReasonBaseResponseFromJSONTyped(json: any, ignoreDiscrimina }; } - export function PauseReasonBaseResponseToJSON(json: any): PauseReasonBaseResponse { - return PauseReasonBaseResponseToJSONTyped(json, false); - } +export function PauseReasonBaseResponseToJSON(json: any): PauseReasonBaseResponse { + return PauseReasonBaseResponseToJSONTyped(json, false); +} - export function PauseReasonBaseResponseToJSONTyped(value?: PauseReasonBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function PauseReasonBaseResponseToJSONTyped(value?: PauseReasonBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/PauseRequest.ts b/src/lib/api/internal/v1/models/PauseRequest.ts index d4c0b142..897d5171 100644 --- a/src/lib/api/internal/v1/models/PauseRequest.ts +++ b/src/lib/api/internal/v1/models/PauseRequest.ts @@ -49,11 +49,11 @@ export function PauseRequestFromJSONTyped(json: any, ignoreDiscriminator: boolea }; } - export function PauseRequestToJSON(json: any): PauseRequest { - return PauseRequestToJSONTyped(json, false); - } +export function PauseRequestToJSON(json: any): PauseRequest { + return PauseRequestToJSONTyped(json, false); +} - export function PauseRequestToJSONTyped(value?: PauseRequest | null, ignoreDiscriminator: boolean = false): any { +export function PauseRequestToJSONTyped(value?: PauseRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/PermissionType.ts b/src/lib/api/internal/v1/models/PermissionType.ts index d8831636..c229b270 100644 --- a/src/lib/api/internal/v1/models/PermissionType.ts +++ b/src/lib/api/internal/v1/models/PermissionType.ts @@ -18,12 +18,11 @@ * @enum {string} */ export enum PermissionType { - shockersUse = 'shockers.use', - shockersEdit = 'shockers.edit', - shockersPause = 'shockers.pause', - devicesEdit = 'devices.edit', - devicesAuth = 'devices.auth', - unknownDefaultOpenApi = '11184809' + ShockersUse = 'shockers.use', + ShockersEdit = 'shockers.edit', + ShockersPause = 'shockers.pause', + DevicesEdit = 'devices.edit', + DevicesAuth = 'devices.auth' } diff --git a/src/lib/api/internal/v1/models/PublicShareLinkResponse.ts b/src/lib/api/internal/v1/models/PublicShareLinkResponse.ts index 0571c9aa..c5deece2 100644 --- a/src/lib/api/internal/v1/models/PublicShareLinkResponse.ts +++ b/src/lib/api/internal/v1/models/PublicShareLinkResponse.ts @@ -45,7 +45,7 @@ export interface PublicShareLinkResponse { * @type {string} * @memberof PublicShareLinkResponse */ - name: string | null; + name: string; /** * * @type {Date} @@ -69,7 +69,7 @@ export interface PublicShareLinkResponse { * @type {Array} * @memberof PublicShareLinkResponse */ - devices?: Array | null; + devices?: Array; } /** @@ -102,11 +102,11 @@ export function PublicShareLinkResponseFromJSONTyped(json: any, ignoreDiscrimina }; } - export function PublicShareLinkResponseToJSON(json: any): PublicShareLinkResponse { - return PublicShareLinkResponseToJSONTyped(json, false); - } +export function PublicShareLinkResponseToJSON(json: any): PublicShareLinkResponse { + return PublicShareLinkResponseToJSONTyped(json, false); +} - export function PublicShareLinkResponseToJSONTyped(value?: PublicShareLinkResponse | null, ignoreDiscriminator: boolean = false): any { +export function PublicShareLinkResponseToJSONTyped(value?: PublicShareLinkResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/PublicShareLinkResponseBaseResponse.ts b/src/lib/api/internal/v1/models/PublicShareLinkResponseBaseResponse.ts index d8f33619..6a0ed085 100644 --- a/src/lib/api/internal/v1/models/PublicShareLinkResponseBaseResponse.ts +++ b/src/lib/api/internal/v1/models/PublicShareLinkResponseBaseResponse.ts @@ -63,11 +63,11 @@ export function PublicShareLinkResponseBaseResponseFromJSONTyped(json: any, igno }; } - export function PublicShareLinkResponseBaseResponseToJSON(json: any): PublicShareLinkResponseBaseResponse { - return PublicShareLinkResponseBaseResponseToJSONTyped(json, false); - } +export function PublicShareLinkResponseBaseResponseToJSON(json: any): PublicShareLinkResponseBaseResponse { + return PublicShareLinkResponseBaseResponseToJSONTyped(json, false); +} - export function PublicShareLinkResponseBaseResponseToJSONTyped(value?: PublicShareLinkResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function PublicShareLinkResponseBaseResponseToJSONTyped(value?: PublicShareLinkResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/RankType.ts b/src/lib/api/internal/v1/models/RankType.ts index 1128f419..9c3f0b79 100644 --- a/src/lib/api/internal/v1/models/RankType.ts +++ b/src/lib/api/internal/v1/models/RankType.ts @@ -18,12 +18,11 @@ * @enum {string} */ export enum RankType { - user = 'User', - support = 'Support', - staff = 'Staff', - admin = 'Admin', - system = 'System', - unknownDefaultOpenApi = '11184809' + User = 'User', + Support = 'Support', + Staff = 'Staff', + Admin = 'Admin', + System = 'System' } diff --git a/src/lib/api/internal/v1/models/ResetRequest.ts b/src/lib/api/internal/v1/models/ResetRequest.ts index 67477e12..9efd5f7f 100644 --- a/src/lib/api/internal/v1/models/ResetRequest.ts +++ b/src/lib/api/internal/v1/models/ResetRequest.ts @@ -24,7 +24,7 @@ export interface ResetRequest { * @type {string} * @memberof ResetRequest */ - email: string | null; + email: string; } /** @@ -49,11 +49,11 @@ export function ResetRequestFromJSONTyped(json: any, ignoreDiscriminator: boolea }; } - export function ResetRequestToJSON(json: any): ResetRequest { - return ResetRequestToJSONTyped(json, false); - } +export function ResetRequestToJSON(json: any): ResetRequest { + return ResetRequestToJSONTyped(json, false); +} - export function ResetRequestToJSONTyped(value?: ResetRequest | null, ignoreDiscriminator: boolean = false): any { +export function ResetRequestToJSONTyped(value?: ResetRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ResponseDevice.ts b/src/lib/api/internal/v1/models/ResponseDevice.ts index c658a66f..3fffbfc4 100644 --- a/src/lib/api/internal/v1/models/ResponseDevice.ts +++ b/src/lib/api/internal/v1/models/ResponseDevice.ts @@ -30,7 +30,7 @@ export interface ResponseDevice { * @type {string} * @memberof ResponseDevice */ - name: string | null; + name: string; /** * * @type {Date} @@ -65,11 +65,11 @@ export function ResponseDeviceFromJSONTyped(json: any, ignoreDiscriminator: bool }; } - export function ResponseDeviceToJSON(json: any): ResponseDevice { - return ResponseDeviceToJSONTyped(json, false); - } +export function ResponseDeviceToJSON(json: any): ResponseDevice { + return ResponseDeviceToJSONTyped(json, false); +} - export function ResponseDeviceToJSONTyped(value?: ResponseDevice | null, ignoreDiscriminator: boolean = false): any { +export function ResponseDeviceToJSONTyped(value?: ResponseDevice | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ResponseDeviceIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/ResponseDeviceIEnumerableBaseResponse.ts index 3b75121d..25d9fec7 100644 --- a/src/lib/api/internal/v1/models/ResponseDeviceIEnumerableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ResponseDeviceIEnumerableBaseResponse.ts @@ -63,11 +63,11 @@ export function ResponseDeviceIEnumerableBaseResponseFromJSONTyped(json: any, ig }; } - export function ResponseDeviceIEnumerableBaseResponseToJSON(json: any): ResponseDeviceIEnumerableBaseResponse { - return ResponseDeviceIEnumerableBaseResponseToJSONTyped(json, false); - } +export function ResponseDeviceIEnumerableBaseResponseToJSON(json: any): ResponseDeviceIEnumerableBaseResponse { + return ResponseDeviceIEnumerableBaseResponseToJSONTyped(json, false); +} - export function ResponseDeviceIEnumerableBaseResponseToJSONTyped(value?: ResponseDeviceIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ResponseDeviceIEnumerableBaseResponseToJSONTyped(value?: ResponseDeviceIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ResponseDeviceWithShockers.ts b/src/lib/api/internal/v1/models/ResponseDeviceWithShockers.ts index bb831b6c..5e234843 100644 --- a/src/lib/api/internal/v1/models/ResponseDeviceWithShockers.ts +++ b/src/lib/api/internal/v1/models/ResponseDeviceWithShockers.ts @@ -38,7 +38,7 @@ export interface ResponseDeviceWithShockers { * @type {string} * @memberof ResponseDeviceWithShockers */ - name: string | null; + name: string; /** * * @type {Date} @@ -50,7 +50,7 @@ export interface ResponseDeviceWithShockers { * @type {Array} * @memberof ResponseDeviceWithShockers */ - shockers: Array | null; + shockers: Array; } /** @@ -77,15 +77,15 @@ export function ResponseDeviceWithShockersFromJSONTyped(json: any, ignoreDiscrim 'id': json['id'], 'name': json['name'], 'createdOn': (new Date(json['createdOn'])), - 'shockers': (json['shockers'] == null ? null : (json['shockers'] as Array).map(ShockerResponseFromJSON)), + 'shockers': ((json['shockers'] as Array).map(ShockerResponseFromJSON)), }; } - export function ResponseDeviceWithShockersToJSON(json: any): ResponseDeviceWithShockers { - return ResponseDeviceWithShockersToJSONTyped(json, false); - } +export function ResponseDeviceWithShockersToJSON(json: any): ResponseDeviceWithShockers { + return ResponseDeviceWithShockersToJSONTyped(json, false); +} - export function ResponseDeviceWithShockersToJSONTyped(value?: ResponseDeviceWithShockers | null, ignoreDiscriminator: boolean = false): any { +export function ResponseDeviceWithShockersToJSONTyped(value?: ResponseDeviceWithShockers | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } @@ -95,7 +95,7 @@ export function ResponseDeviceWithShockersFromJSONTyped(json: any, ignoreDiscrim 'id': value['id'], 'name': value['name'], 'createdOn': ((value['createdOn']).toISOString()), - 'shockers': (value['shockers'] == null ? null : (value['shockers'] as Array).map(ShockerResponseToJSON)), + 'shockers': ((value['shockers'] as Array).map(ShockerResponseToJSON)), }; } diff --git a/src/lib/api/internal/v1/models/ResponseDeviceWithShockersIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/ResponseDeviceWithShockersIEnumerableBaseResponse.ts index cc695ffd..8fb5d7da 100644 --- a/src/lib/api/internal/v1/models/ResponseDeviceWithShockersIEnumerableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ResponseDeviceWithShockersIEnumerableBaseResponse.ts @@ -63,11 +63,11 @@ export function ResponseDeviceWithShockersIEnumerableBaseResponseFromJSONTyped(j }; } - export function ResponseDeviceWithShockersIEnumerableBaseResponseToJSON(json: any): ResponseDeviceWithShockersIEnumerableBaseResponse { - return ResponseDeviceWithShockersIEnumerableBaseResponseToJSONTyped(json, false); - } +export function ResponseDeviceWithShockersIEnumerableBaseResponseToJSON(json: any): ResponseDeviceWithShockersIEnumerableBaseResponse { + return ResponseDeviceWithShockersIEnumerableBaseResponseToJSONTyped(json, false); +} - export function ResponseDeviceWithShockersIEnumerableBaseResponseToJSONTyped(value?: ResponseDeviceWithShockersIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ResponseDeviceWithShockersIEnumerableBaseResponseToJSONTyped(value?: ResponseDeviceWithShockersIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ResponseDeviceWithToken.ts b/src/lib/api/internal/v1/models/ResponseDeviceWithToken.ts index 01c1e4fd..a4a0d947 100644 --- a/src/lib/api/internal/v1/models/ResponseDeviceWithToken.ts +++ b/src/lib/api/internal/v1/models/ResponseDeviceWithToken.ts @@ -30,7 +30,7 @@ export interface ResponseDeviceWithToken { * @type {string} * @memberof ResponseDeviceWithToken */ - name: string | null; + name: string; /** * * @type {Date} @@ -73,11 +73,11 @@ export function ResponseDeviceWithTokenFromJSONTyped(json: any, ignoreDiscrimina }; } - export function ResponseDeviceWithTokenToJSON(json: any): ResponseDeviceWithToken { - return ResponseDeviceWithTokenToJSONTyped(json, false); - } +export function ResponseDeviceWithTokenToJSON(json: any): ResponseDeviceWithToken { + return ResponseDeviceWithTokenToJSONTyped(json, false); +} - export function ResponseDeviceWithTokenToJSONTyped(value?: ResponseDeviceWithToken | null, ignoreDiscriminator: boolean = false): any { +export function ResponseDeviceWithTokenToJSONTyped(value?: ResponseDeviceWithToken | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ResponseDeviceWithTokenBaseResponse.ts b/src/lib/api/internal/v1/models/ResponseDeviceWithTokenBaseResponse.ts index 5acf4f7f..6c33a6ef 100644 --- a/src/lib/api/internal/v1/models/ResponseDeviceWithTokenBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ResponseDeviceWithTokenBaseResponse.ts @@ -63,11 +63,11 @@ export function ResponseDeviceWithTokenBaseResponseFromJSONTyped(json: any, igno }; } - export function ResponseDeviceWithTokenBaseResponseToJSON(json: any): ResponseDeviceWithTokenBaseResponse { - return ResponseDeviceWithTokenBaseResponseToJSONTyped(json, false); - } +export function ResponseDeviceWithTokenBaseResponseToJSON(json: any): ResponseDeviceWithTokenBaseResponse { + return ResponseDeviceWithTokenBaseResponseToJSONTyped(json, false); +} - export function ResponseDeviceWithTokenBaseResponseToJSONTyped(value?: ResponseDeviceWithTokenBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ResponseDeviceWithTokenBaseResponseToJSONTyped(value?: ResponseDeviceWithTokenBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/RootResponse.ts b/src/lib/api/internal/v1/models/RootResponse.ts index 76179a8f..cec41468 100644 --- a/src/lib/api/internal/v1/models/RootResponse.ts +++ b/src/lib/api/internal/v1/models/RootResponse.ts @@ -24,13 +24,13 @@ export interface RootResponse { * @type {string} * @memberof RootResponse */ - version: string | null; + version: string; /** * * @type {string} * @memberof RootResponse */ - commit: string | null; + commit: string; /** * * @type {Date} @@ -42,13 +42,13 @@ export interface RootResponse { * @type {string} * @memberof RootResponse */ - frontendUrl: string | null; + frontendUrl: string; /** * * @type {string} * @memberof RootResponse */ - shortLinkUrl: string | null; + shortLinkUrl: string; /** * * @type {string} @@ -89,11 +89,11 @@ export function RootResponseFromJSONTyped(json: any, ignoreDiscriminator: boolea }; } - export function RootResponseToJSON(json: any): RootResponse { - return RootResponseToJSONTyped(json, false); - } +export function RootResponseToJSON(json: any): RootResponse { + return RootResponseToJSONTyped(json, false); +} - export function RootResponseToJSONTyped(value?: RootResponse | null, ignoreDiscriminator: boolean = false): any { +export function RootResponseToJSONTyped(value?: RootResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/RootResponseBaseResponse.ts b/src/lib/api/internal/v1/models/RootResponseBaseResponse.ts index 7bb38243..d61f0d51 100644 --- a/src/lib/api/internal/v1/models/RootResponseBaseResponse.ts +++ b/src/lib/api/internal/v1/models/RootResponseBaseResponse.ts @@ -63,11 +63,11 @@ export function RootResponseBaseResponseFromJSONTyped(json: any, ignoreDiscrimin }; } - export function RootResponseBaseResponseToJSON(json: any): RootResponseBaseResponse { - return RootResponseBaseResponseToJSONTyped(json, false); - } +export function RootResponseBaseResponseToJSON(json: any): RootResponseBaseResponse { + return RootResponseBaseResponseToJSONTyped(json, false); +} - export function RootResponseBaseResponseToJSONTyped(value?: RootResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function RootResponseBaseResponseToJSONTyped(value?: RootResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/SelfResponse.ts b/src/lib/api/internal/v1/models/SelfResponse.ts index 083bb75d..aa718cfe 100644 --- a/src/lib/api/internal/v1/models/SelfResponse.ts +++ b/src/lib/api/internal/v1/models/SelfResponse.ts @@ -38,19 +38,19 @@ export interface SelfResponse { * @type {string} * @memberof SelfResponse */ - name: string | null; + name: string; /** * * @type {string} * @memberof SelfResponse */ - email: string | null; + email: string; /** * * @type {string} * @memberof SelfResponse */ - image: string | null; + image: string; /** * * @type {RankType} @@ -91,11 +91,11 @@ export function SelfResponseFromJSONTyped(json: any, ignoreDiscriminator: boolea }; } - export function SelfResponseToJSON(json: any): SelfResponse { - return SelfResponseToJSONTyped(json, false); - } +export function SelfResponseToJSON(json: any): SelfResponse { + return SelfResponseToJSONTyped(json, false); +} - export function SelfResponseToJSONTyped(value?: SelfResponse | null, ignoreDiscriminator: boolean = false): any { +export function SelfResponseToJSONTyped(value?: SelfResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/SelfResponseBaseResponse.ts b/src/lib/api/internal/v1/models/SelfResponseBaseResponse.ts index 1d8282f9..b26fdcfb 100644 --- a/src/lib/api/internal/v1/models/SelfResponseBaseResponse.ts +++ b/src/lib/api/internal/v1/models/SelfResponseBaseResponse.ts @@ -63,11 +63,11 @@ export function SelfResponseBaseResponseFromJSONTyped(json: any, ignoreDiscrimin }; } - export function SelfResponseBaseResponseToJSON(json: any): SelfResponseBaseResponse { - return SelfResponseBaseResponseToJSONTyped(json, false); - } +export function SelfResponseBaseResponseToJSON(json: any): SelfResponseBaseResponse { + return SelfResponseBaseResponseToJSONTyped(json, false); +} - export function SelfResponseBaseResponseToJSONTyped(value?: SelfResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function SelfResponseBaseResponseToJSONTyped(value?: SelfResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/SelfResponseIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/SelfResponseIEnumerableBaseResponse.ts deleted file mode 100644 index 007ca7bf..00000000 --- a/src/lib/api/internal/v1/models/SelfResponseIEnumerableBaseResponse.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * OpenShock.API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { SelfResponse } from './SelfResponse'; -import { - SelfResponseFromJSON, - SelfResponseFromJSONTyped, - SelfResponseToJSON, -} from './SelfResponse'; - -/** - * - * @export - * @interface SelfResponseIEnumerableBaseResponse - */ -export interface SelfResponseIEnumerableBaseResponse { - /** - * - * @type {string} - * @memberof SelfResponseIEnumerableBaseResponse - */ - message?: string; - /** - * - * @type {Array} - * @memberof SelfResponseIEnumerableBaseResponse - */ - data?: Array; -} - -/** - * Check if a given object implements the SelfResponseIEnumerableBaseResponse interface. - */ -export function instanceOfSelfResponseIEnumerableBaseResponse(value: object): boolean { - return true; -} - -export function SelfResponseIEnumerableBaseResponseFromJSON(json: any): SelfResponseIEnumerableBaseResponse { - return SelfResponseIEnumerableBaseResponseFromJSONTyped(json, false); -} - -export function SelfResponseIEnumerableBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): SelfResponseIEnumerableBaseResponse { - if (json == null) { - return json; - } - return { - - 'message': json['message'] == null ? undefined : json['message'], - 'data': json['data'] == null ? undefined : ((json['data'] as Array).map(SelfResponseFromJSON)), - }; -} - -export function SelfResponseIEnumerableBaseResponseToJSON(value?: SelfResponseIEnumerableBaseResponse | null): any { - if (value == null) { - return value; - } - return { - - 'message': value['message'], - 'data': value['data'] == null ? undefined : ((value['data'] as Array).map(SelfResponseToJSON)), - }; -} - diff --git a/src/lib/api/internal/v1/models/ShareCodeInfo.ts b/src/lib/api/internal/v1/models/ShareCodeInfo.ts index 49f14545..56ce4e0b 100644 --- a/src/lib/api/internal/v1/models/ShareCodeInfo.ts +++ b/src/lib/api/internal/v1/models/ShareCodeInfo.ts @@ -57,11 +57,11 @@ export function ShareCodeInfoFromJSONTyped(json: any, ignoreDiscriminator: boole }; } - export function ShareCodeInfoToJSON(json: any): ShareCodeInfo { - return ShareCodeInfoToJSONTyped(json, false); - } +export function ShareCodeInfoToJSON(json: any): ShareCodeInfo { + return ShareCodeInfoToJSONTyped(json, false); +} - export function ShareCodeInfoToJSONTyped(value?: ShareCodeInfo | null, ignoreDiscriminator: boolean = false): any { +export function ShareCodeInfoToJSONTyped(value?: ShareCodeInfo | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareCodeInfoIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/ShareCodeInfoIEnumerableBaseResponse.ts index 3e2bc1a1..f926eaaa 100644 --- a/src/lib/api/internal/v1/models/ShareCodeInfoIEnumerableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ShareCodeInfoIEnumerableBaseResponse.ts @@ -63,11 +63,11 @@ export function ShareCodeInfoIEnumerableBaseResponseFromJSONTyped(json: any, ign }; } - export function ShareCodeInfoIEnumerableBaseResponseToJSON(json: any): ShareCodeInfoIEnumerableBaseResponse { - return ShareCodeInfoIEnumerableBaseResponseToJSONTyped(json, false); - } +export function ShareCodeInfoIEnumerableBaseResponseToJSON(json: any): ShareCodeInfoIEnumerableBaseResponse { + return ShareCodeInfoIEnumerableBaseResponseToJSONTyped(json, false); +} - export function ShareCodeInfoIEnumerableBaseResponseToJSONTyped(value?: ShareCodeInfoIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ShareCodeInfoIEnumerableBaseResponseToJSONTyped(value?: ShareCodeInfoIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareInfo.ts b/src/lib/api/internal/v1/models/ShareInfo.ts index 03166256..9497f496 100644 --- a/src/lib/api/internal/v1/models/ShareInfo.ts +++ b/src/lib/api/internal/v1/models/ShareInfo.ts @@ -103,11 +103,11 @@ export function ShareInfoFromJSONTyped(json: any, ignoreDiscriminator: boolean): }; } - export function ShareInfoToJSON(json: any): ShareInfo { - return ShareInfoToJSONTyped(json, false); - } +export function ShareInfoToJSON(json: any): ShareInfo { + return ShareInfoToJSONTyped(json, false); +} - export function ShareInfoToJSONTyped(value?: ShareInfo | null, ignoreDiscriminator: boolean = false): any { +export function ShareInfoToJSONTyped(value?: ShareInfo | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareInfoIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/ShareInfoIEnumerableBaseResponse.ts index 88ce099b..2c2f3e01 100644 --- a/src/lib/api/internal/v1/models/ShareInfoIEnumerableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ShareInfoIEnumerableBaseResponse.ts @@ -63,11 +63,11 @@ export function ShareInfoIEnumerableBaseResponseFromJSONTyped(json: any, ignoreD }; } - export function ShareInfoIEnumerableBaseResponseToJSON(json: any): ShareInfoIEnumerableBaseResponse { - return ShareInfoIEnumerableBaseResponseToJSONTyped(json, false); - } +export function ShareInfoIEnumerableBaseResponseToJSON(json: any): ShareInfoIEnumerableBaseResponse { + return ShareInfoIEnumerableBaseResponseToJSONTyped(json, false); +} - export function ShareInfoIEnumerableBaseResponseToJSONTyped(value?: ShareInfoIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ShareInfoIEnumerableBaseResponseToJSONTyped(value?: ShareInfoIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareLinkCreate.ts b/src/lib/api/internal/v1/models/ShareLinkCreate.ts index b2fe8088..914960e2 100644 --- a/src/lib/api/internal/v1/models/ShareLinkCreate.ts +++ b/src/lib/api/internal/v1/models/ShareLinkCreate.ts @@ -24,7 +24,7 @@ export interface ShareLinkCreate { * @type {string} * @memberof ShareLinkCreate */ - name: string | null; + name: string; /** * * @type {Date} @@ -56,11 +56,11 @@ export function ShareLinkCreateFromJSONTyped(json: any, ignoreDiscriminator: boo }; } - export function ShareLinkCreateToJSON(json: any): ShareLinkCreate { - return ShareLinkCreateToJSONTyped(json, false); - } +export function ShareLinkCreateToJSON(json: any): ShareLinkCreate { + return ShareLinkCreateToJSONTyped(json, false); +} - export function ShareLinkCreateToJSONTyped(value?: ShareLinkCreate | null, ignoreDiscriminator: boolean = false): any { +export function ShareLinkCreateToJSONTyped(value?: ShareLinkCreate | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareLinkDevice.ts b/src/lib/api/internal/v1/models/ShareLinkDevice.ts index 8f996d46..b12ff233 100644 --- a/src/lib/api/internal/v1/models/ShareLinkDevice.ts +++ b/src/lib/api/internal/v1/models/ShareLinkDevice.ts @@ -38,13 +38,13 @@ export interface ShareLinkDevice { * @type {string} * @memberof ShareLinkDevice */ - name: string | null; + name: string; /** * * @type {Array} * @memberof ShareLinkDevice */ - shockers?: Array | null; + shockers?: Array; } /** @@ -72,11 +72,11 @@ export function ShareLinkDeviceFromJSONTyped(json: any, ignoreDiscriminator: boo }; } - export function ShareLinkDeviceToJSON(json: any): ShareLinkDevice { - return ShareLinkDeviceToJSONTyped(json, false); - } +export function ShareLinkDeviceToJSON(json: any): ShareLinkDevice { + return ShareLinkDeviceToJSONTyped(json, false); +} - export function ShareLinkDeviceToJSONTyped(value?: ShareLinkDevice | null, ignoreDiscriminator: boolean = false): any { +export function ShareLinkDeviceToJSONTyped(value?: ShareLinkDevice | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareLinkEditShocker.ts b/src/lib/api/internal/v1/models/ShareLinkEditShocker.ts index cc76c5bd..e2ebb66b 100644 --- a/src/lib/api/internal/v1/models/ShareLinkEditShocker.ts +++ b/src/lib/api/internal/v1/models/ShareLinkEditShocker.ts @@ -79,11 +79,11 @@ export function ShareLinkEditShockerFromJSONTyped(json: any, ignoreDiscriminator }; } - export function ShareLinkEditShockerToJSON(json: any): ShareLinkEditShocker { - return ShareLinkEditShockerToJSONTyped(json, false); - } +export function ShareLinkEditShockerToJSON(json: any): ShareLinkEditShocker { + return ShareLinkEditShockerToJSONTyped(json, false); +} - export function ShareLinkEditShockerToJSONTyped(value?: ShareLinkEditShocker | null, ignoreDiscriminator: boolean = false): any { +export function ShareLinkEditShockerToJSONTyped(value?: ShareLinkEditShocker | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareLinkResponse.ts b/src/lib/api/internal/v1/models/ShareLinkResponse.ts index b331384c..e44686e0 100644 --- a/src/lib/api/internal/v1/models/ShareLinkResponse.ts +++ b/src/lib/api/internal/v1/models/ShareLinkResponse.ts @@ -30,7 +30,7 @@ export interface ShareLinkResponse { * @type {string} * @memberof ShareLinkResponse */ - name: string | null; + name: string; /** * * @type {Date} @@ -72,11 +72,11 @@ export function ShareLinkResponseFromJSONTyped(json: any, ignoreDiscriminator: b }; } - export function ShareLinkResponseToJSON(json: any): ShareLinkResponse { - return ShareLinkResponseToJSONTyped(json, false); - } +export function ShareLinkResponseToJSON(json: any): ShareLinkResponse { + return ShareLinkResponseToJSONTyped(json, false); +} - export function ShareLinkResponseToJSONTyped(value?: ShareLinkResponse | null, ignoreDiscriminator: boolean = false): any { +export function ShareLinkResponseToJSONTyped(value?: ShareLinkResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareLinkResponseBaseResponse.ts b/src/lib/api/internal/v1/models/ShareLinkResponseBaseResponse.ts index d5bc0c99..4f028974 100644 --- a/src/lib/api/internal/v1/models/ShareLinkResponseBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ShareLinkResponseBaseResponse.ts @@ -63,11 +63,11 @@ export function ShareLinkResponseBaseResponseFromJSONTyped(json: any, ignoreDisc }; } - export function ShareLinkResponseBaseResponseToJSON(json: any): ShareLinkResponseBaseResponse { - return ShareLinkResponseBaseResponseToJSONTyped(json, false); - } +export function ShareLinkResponseBaseResponseToJSON(json: any): ShareLinkResponseBaseResponse { + return ShareLinkResponseBaseResponseToJSONTyped(json, false); +} - export function ShareLinkResponseBaseResponseToJSONTyped(value?: ShareLinkResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ShareLinkResponseBaseResponseToJSONTyped(value?: ShareLinkResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareLinkResponseIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/ShareLinkResponseIEnumerableBaseResponse.ts index 7f0c214b..124c96c0 100644 --- a/src/lib/api/internal/v1/models/ShareLinkResponseIEnumerableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ShareLinkResponseIEnumerableBaseResponse.ts @@ -63,11 +63,11 @@ export function ShareLinkResponseIEnumerableBaseResponseFromJSONTyped(json: any, }; } - export function ShareLinkResponseIEnumerableBaseResponseToJSON(json: any): ShareLinkResponseIEnumerableBaseResponse { - return ShareLinkResponseIEnumerableBaseResponseToJSONTyped(json, false); - } +export function ShareLinkResponseIEnumerableBaseResponseToJSON(json: any): ShareLinkResponseIEnumerableBaseResponse { + return ShareLinkResponseIEnumerableBaseResponseToJSONTyped(json, false); +} - export function ShareLinkResponseIEnumerableBaseResponseToJSONTyped(value?: ShareLinkResponseIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ShareLinkResponseIEnumerableBaseResponseToJSONTyped(value?: ShareLinkResponseIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShareLinkShocker.ts b/src/lib/api/internal/v1/models/ShareLinkShocker.ts index d3492283..cfaa5cbc 100644 --- a/src/lib/api/internal/v1/models/ShareLinkShocker.ts +++ b/src/lib/api/internal/v1/models/ShareLinkShocker.ts @@ -45,7 +45,7 @@ export interface ShareLinkShocker { * @type {string} * @memberof ShareLinkShocker */ - name: string | null; + name: string; /** * * @type {ShockerPermissions} @@ -103,11 +103,11 @@ export function ShareLinkShockerFromJSONTyped(json: any, ignoreDiscriminator: bo }; } - export function ShareLinkShockerToJSON(json: any): ShareLinkShocker { - return ShareLinkShockerToJSONTyped(json, false); - } +export function ShareLinkShockerToJSON(json: any): ShareLinkShocker { + return ShareLinkShockerToJSONTyped(json, false); +} - export function ShareLinkShockerToJSONTyped(value?: ShareLinkShocker | null, ignoreDiscriminator: boolean = false): any { +export function ShareLinkShockerToJSONTyped(value?: ShareLinkShocker | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/SharedDevice.ts b/src/lib/api/internal/v1/models/SharedDevice.ts index 595d1f65..069bf30b 100644 --- a/src/lib/api/internal/v1/models/SharedDevice.ts +++ b/src/lib/api/internal/v1/models/SharedDevice.ts @@ -38,13 +38,13 @@ export interface SharedDevice { * @type {string} * @memberof SharedDevice */ - name: string | null; + name: string; /** * * @type {Array} * @memberof SharedDevice */ - shockers?: Array | null; + shockers?: Array; } /** @@ -72,11 +72,11 @@ export function SharedDeviceFromJSONTyped(json: any, ignoreDiscriminator: boolea }; } - export function SharedDeviceToJSON(json: any): SharedDevice { - return SharedDeviceToJSONTyped(json, false); - } +export function SharedDeviceToJSON(json: any): SharedDevice { + return SharedDeviceToJSONTyped(json, false); +} - export function SharedDeviceToJSONTyped(value?: SharedDevice | null, ignoreDiscriminator: boolean = false): any { +export function SharedDeviceToJSONTyped(value?: SharedDevice | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/SharedShocker.ts b/src/lib/api/internal/v1/models/SharedShocker.ts index 611d51c3..f60bcdc4 100644 --- a/src/lib/api/internal/v1/models/SharedShocker.ts +++ b/src/lib/api/internal/v1/models/SharedShocker.ts @@ -45,7 +45,7 @@ export interface SharedShocker { * @type {string} * @memberof SharedShocker */ - name: string | null; + name: string; /** * * @type {boolean} @@ -96,11 +96,11 @@ export function SharedShockerFromJSONTyped(json: any, ignoreDiscriminator: boole }; } - export function SharedShockerToJSON(json: any): SharedShocker { - return SharedShockerToJSONTyped(json, false); - } +export function SharedShockerToJSON(json: any): SharedShocker { + return SharedShockerToJSONTyped(json, false); +} - export function SharedShockerToJSONTyped(value?: SharedShocker | null, ignoreDiscriminator: boolean = false): any { +export function SharedShockerToJSONTyped(value?: SharedShocker | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShockerLimits.ts b/src/lib/api/internal/v1/models/ShockerLimits.ts index 87d46720..33d6bfff 100644 --- a/src/lib/api/internal/v1/models/ShockerLimits.ts +++ b/src/lib/api/internal/v1/models/ShockerLimits.ts @@ -57,11 +57,11 @@ export function ShockerLimitsFromJSONTyped(json: any, ignoreDiscriminator: boole }; } - export function ShockerLimitsToJSON(json: any): ShockerLimits { - return ShockerLimitsToJSONTyped(json, false); - } +export function ShockerLimitsToJSON(json: any): ShockerLimits { + return ShockerLimitsToJSONTyped(json, false); +} - export function ShockerLimitsToJSONTyped(value?: ShockerLimits | null, ignoreDiscriminator: boolean = false): any { +export function ShockerLimitsToJSONTyped(value?: ShockerLimits | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShockerModelType.ts b/src/lib/api/internal/v1/models/ShockerModelType.ts index 275c4b88..d1d2d1c4 100644 --- a/src/lib/api/internal/v1/models/ShockerModelType.ts +++ b/src/lib/api/internal/v1/models/ShockerModelType.ts @@ -18,10 +18,9 @@ * @enum {string} */ export enum ShockerModelType { - caiXianlin = 'CaiXianlin', - petTrainer = 'PetTrainer', - petrainer998Dr = 'Petrainer998DR', - unknownDefaultOpenApi = '11184809' + CaiXianlin = 'CaiXianlin', + PetTrainer = 'PetTrainer', + Petrainer998Dr = 'Petrainer998DR' } diff --git a/src/lib/api/internal/v1/models/CreateShareCode.ts b/src/lib/api/internal/v1/models/ShockerPermLimitPair.ts similarity index 66% rename from src/lib/api/internal/v1/models/CreateShareCode.ts rename to src/lib/api/internal/v1/models/ShockerPermLimitPair.ts index 3f0480a4..e96e5c51 100644 --- a/src/lib/api/internal/v1/models/CreateShareCode.ts +++ b/src/lib/api/internal/v1/models/ShockerPermLimitPair.ts @@ -31,37 +31,37 @@ import { /** * * @export - * @interface CreateShareCode + * @interface ShockerPermLimitPair */ -export interface CreateShareCode { +export interface ShockerPermLimitPair { /** * * @type {ShockerPermissions} - * @memberof CreateShareCode + * @memberof ShockerPermLimitPair */ permissions: ShockerPermissions; /** * * @type {ShockerLimits} - * @memberof CreateShareCode + * @memberof ShockerPermLimitPair */ limits: ShockerLimits; } /** - * Check if a given object implements the CreateShareCode interface. + * Check if a given object implements the ShockerPermLimitPair interface. */ -export function instanceOfCreateShareCode(value: object): value is CreateShareCode { +export function instanceOfShockerPermLimitPair(value: object): value is ShockerPermLimitPair { if (!('permissions' in value) || value['permissions'] === undefined) return false; if (!('limits' in value) || value['limits'] === undefined) return false; return true; } -export function CreateShareCodeFromJSON(json: any): CreateShareCode { - return CreateShareCodeFromJSONTyped(json, false); +export function ShockerPermLimitPairFromJSON(json: any): ShockerPermLimitPair { + return ShockerPermLimitPairFromJSONTyped(json, false); } -export function CreateShareCodeFromJSONTyped(json: any, ignoreDiscriminator: boolean): CreateShareCode { +export function ShockerPermLimitPairFromJSONTyped(json: any, ignoreDiscriminator: boolean): ShockerPermLimitPair { if (json == null) { return json; } @@ -72,11 +72,11 @@ export function CreateShareCodeFromJSONTyped(json: any, ignoreDiscriminator: boo }; } - export function CreateShareCodeToJSON(json: any): CreateShareCode { - return CreateShareCodeToJSONTyped(json, false); - } +export function ShockerPermLimitPairToJSON(json: any): ShockerPermLimitPair { + return ShockerPermLimitPairToJSONTyped(json, false); +} - export function CreateShareCodeToJSONTyped(value?: CreateShareCode | null, ignoreDiscriminator: boolean = false): any { +export function ShockerPermLimitPairToJSONTyped(value?: ShockerPermLimitPair | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShockerPermissions.ts b/src/lib/api/internal/v1/models/ShockerPermissions.ts index 707616e0..bc3e8e85 100644 --- a/src/lib/api/internal/v1/models/ShockerPermissions.ts +++ b/src/lib/api/internal/v1/models/ShockerPermissions.ts @@ -72,11 +72,11 @@ export function ShockerPermissionsFromJSONTyped(json: any, ignoreDiscriminator: }; } - export function ShockerPermissionsToJSON(json: any): ShockerPermissions { - return ShockerPermissionsToJSONTyped(json, false); - } +export function ShockerPermissionsToJSON(json: any): ShockerPermissions { + return ShockerPermissionsToJSONTyped(json, false); +} - export function ShockerPermissionsToJSONTyped(value?: ShockerPermissions | null, ignoreDiscriminator: boolean = false): any { +export function ShockerPermissionsToJSONTyped(value?: ShockerPermissions | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShockerResponse.ts b/src/lib/api/internal/v1/models/ShockerResponse.ts index c0e9c7fc..06c1d819 100644 --- a/src/lib/api/internal/v1/models/ShockerResponse.ts +++ b/src/lib/api/internal/v1/models/ShockerResponse.ts @@ -50,7 +50,7 @@ export interface ShockerResponse { * @type {string} * @memberof ShockerResponse */ - name: string | null; + name: string; /** * * @type {boolean} @@ -99,11 +99,11 @@ export function ShockerResponseFromJSONTyped(json: any, ignoreDiscriminator: boo }; } - export function ShockerResponseToJSON(json: any): ShockerResponse { - return ShockerResponseToJSONTyped(json, false); - } +export function ShockerResponseToJSON(json: any): ShockerResponse { + return ShockerResponseToJSONTyped(json, false); +} - export function ShockerResponseToJSONTyped(value?: ShockerResponse | null, ignoreDiscriminator: boolean = false): any { +export function ShockerResponseToJSONTyped(value?: ShockerResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShockerResponseIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/ShockerResponseIEnumerableBaseResponse.ts index ef14e248..5307967e 100644 --- a/src/lib/api/internal/v1/models/ShockerResponseIEnumerableBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ShockerResponseIEnumerableBaseResponse.ts @@ -63,11 +63,11 @@ export function ShockerResponseIEnumerableBaseResponseFromJSONTyped(json: any, i }; } - export function ShockerResponseIEnumerableBaseResponseToJSON(json: any): ShockerResponseIEnumerableBaseResponse { - return ShockerResponseIEnumerableBaseResponseToJSONTyped(json, false); - } +export function ShockerResponseIEnumerableBaseResponseToJSON(json: any): ShockerResponseIEnumerableBaseResponse { + return ShockerResponseIEnumerableBaseResponseToJSONTyped(json, false); +} - export function ShockerResponseIEnumerableBaseResponseToJSONTyped(value?: ShockerResponseIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ShockerResponseIEnumerableBaseResponseToJSONTyped(value?: ShockerResponseIEnumerableBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShockerWithDevice.ts b/src/lib/api/internal/v1/models/ShockerWithDevice.ts index a3ac00d7..0505fd9c 100644 --- a/src/lib/api/internal/v1/models/ShockerWithDevice.ts +++ b/src/lib/api/internal/v1/models/ShockerWithDevice.ts @@ -50,7 +50,7 @@ export interface ShockerWithDevice { * @type {string} * @memberof ShockerWithDevice */ - name: string | null; + name: string; /** * * @type {boolean} @@ -107,11 +107,11 @@ export function ShockerWithDeviceFromJSONTyped(json: any, ignoreDiscriminator: b }; } - export function ShockerWithDeviceToJSON(json: any): ShockerWithDevice { - return ShockerWithDeviceToJSONTyped(json, false); - } +export function ShockerWithDeviceToJSON(json: any): ShockerWithDevice { + return ShockerWithDeviceToJSONTyped(json, false); +} - export function ShockerWithDeviceToJSONTyped(value?: ShockerWithDevice | null, ignoreDiscriminator: boolean = false): any { +export function ShockerWithDeviceToJSONTyped(value?: ShockerWithDevice | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/ShockerWithDeviceBaseResponse.ts b/src/lib/api/internal/v1/models/ShockerWithDeviceBaseResponse.ts index a6474d5e..cfa4f431 100644 --- a/src/lib/api/internal/v1/models/ShockerWithDeviceBaseResponse.ts +++ b/src/lib/api/internal/v1/models/ShockerWithDeviceBaseResponse.ts @@ -63,11 +63,11 @@ export function ShockerWithDeviceBaseResponseFromJSONTyped(json: any, ignoreDisc }; } - export function ShockerWithDeviceBaseResponseToJSON(json: any): ShockerWithDeviceBaseResponse { - return ShockerWithDeviceBaseResponseToJSONTyped(json, false); - } +export function ShockerWithDeviceBaseResponseToJSON(json: any): ShockerWithDeviceBaseResponse { + return ShockerWithDeviceBaseResponseToJSONTyped(json, false); +} - export function ShockerWithDeviceBaseResponseToJSONTyped(value?: ShockerWithDeviceBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ShockerWithDeviceBaseResponseToJSONTyped(value?: ShockerWithDeviceBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/SignUp.ts b/src/lib/api/internal/v1/models/SignUp.ts index 3aed4406..af99bb2f 100644 --- a/src/lib/api/internal/v1/models/SignUp.ts +++ b/src/lib/api/internal/v1/models/SignUp.ts @@ -24,19 +24,19 @@ export interface SignUp { * @type {string} * @memberof SignUp */ - username: string | null; + username: string; /** * * @type {string} * @memberof SignUp */ - password: string | null; + password: string; /** * * @type {string} * @memberof SignUp */ - email: string | null; + email: string; } /** @@ -65,11 +65,11 @@ export function SignUpFromJSONTyped(json: any, ignoreDiscriminator: boolean): Si }; } - export function SignUpToJSON(json: any): SignUp { - return SignUpToJSONTyped(json, false); - } +export function SignUpToJSON(json: any): SignUp { + return SignUpToJSONTyped(json, false); +} - export function SignUpToJSONTyped(value?: SignUp | null, ignoreDiscriminator: boolean = false): any { +export function SignUpToJSONTyped(value?: SignUp | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/StatsResponse.ts b/src/lib/api/internal/v1/models/StatsResponse.ts index 66cc8cc5..f10bca64 100644 --- a/src/lib/api/internal/v1/models/StatsResponse.ts +++ b/src/lib/api/internal/v1/models/StatsResponse.ts @@ -49,11 +49,11 @@ export function StatsResponseFromJSONTyped(json: any, ignoreDiscriminator: boole }; } - export function StatsResponseToJSON(json: any): StatsResponse { - return StatsResponseToJSONTyped(json, false); - } +export function StatsResponseToJSON(json: any): StatsResponse { + return StatsResponseToJSONTyped(json, false); +} - export function StatsResponseToJSONTyped(value?: StatsResponse | null, ignoreDiscriminator: boolean = false): any { +export function StatsResponseToJSONTyped(value?: StatsResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/StatsResponseBaseResponse.ts b/src/lib/api/internal/v1/models/StatsResponseBaseResponse.ts index 0ad730b2..c3e05f7e 100644 --- a/src/lib/api/internal/v1/models/StatsResponseBaseResponse.ts +++ b/src/lib/api/internal/v1/models/StatsResponseBaseResponse.ts @@ -63,11 +63,11 @@ export function StatsResponseBaseResponseFromJSONTyped(json: any, ignoreDiscrimi }; } - export function StatsResponseBaseResponseToJSON(json: any): StatsResponseBaseResponse { - return StatsResponseBaseResponseToJSONTyped(json, false); - } +export function StatsResponseBaseResponseToJSON(json: any): StatsResponseBaseResponse { + return StatsResponseBaseResponseToJSONTyped(json, false); +} - export function StatsResponseBaseResponseToJSONTyped(value?: StatsResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function StatsResponseBaseResponseToJSONTyped(value?: StatsResponseBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/StringBaseResponse.ts b/src/lib/api/internal/v1/models/StringBaseResponse.ts index fc0fb090..eac1929f 100644 --- a/src/lib/api/internal/v1/models/StringBaseResponse.ts +++ b/src/lib/api/internal/v1/models/StringBaseResponse.ts @@ -55,11 +55,11 @@ export function StringBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: }; } - export function StringBaseResponseToJSON(json: any): StringBaseResponse { - return StringBaseResponseToJSONTyped(json, false); - } +export function StringBaseResponseToJSON(json: any): StringBaseResponse { + return StringBaseResponseToJSONTyped(json, false); +} - export function StringBaseResponseToJSONTyped(value?: StringBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function StringBaseResponseToJSONTyped(value?: StringBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/TokenCreatedResponse.ts b/src/lib/api/internal/v1/models/TokenCreatedResponse.ts index a8bc5d86..daa828f3 100644 --- a/src/lib/api/internal/v1/models/TokenCreatedResponse.ts +++ b/src/lib/api/internal/v1/models/TokenCreatedResponse.ts @@ -24,7 +24,13 @@ export interface TokenCreatedResponse { * @type {string} * @memberof TokenCreatedResponse */ - token: string | null; + token: string; + /** + * + * @type {string} + * @memberof TokenCreatedResponse + */ + id: string; } /** @@ -32,6 +38,7 @@ export interface TokenCreatedResponse { */ export function instanceOfTokenCreatedResponse(value: object): value is TokenCreatedResponse { if (!('token' in value) || value['token'] === undefined) return false; + if (!('id' in value) || value['id'] === undefined) return false; return true; } @@ -46,14 +53,15 @@ export function TokenCreatedResponseFromJSONTyped(json: any, ignoreDiscriminator return { 'token': json['token'], + 'id': json['id'], }; } - export function TokenCreatedResponseToJSON(json: any): TokenCreatedResponse { - return TokenCreatedResponseToJSONTyped(json, false); - } +export function TokenCreatedResponseToJSON(json: any): TokenCreatedResponse { + return TokenCreatedResponseToJSONTyped(json, false); +} - export function TokenCreatedResponseToJSONTyped(value?: TokenCreatedResponse | null, ignoreDiscriminator: boolean = false): any { +export function TokenCreatedResponseToJSONTyped(value?: TokenCreatedResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } @@ -61,6 +69,7 @@ export function TokenCreatedResponseFromJSONTyped(json: any, ignoreDiscriminator return { 'token': value['token'], + 'id': value['id'], }; } diff --git a/src/lib/api/internal/v1/models/TokenResponse.ts b/src/lib/api/internal/v1/models/TokenResponse.ts index d5c7a33d..f3416f2d 100644 --- a/src/lib/api/internal/v1/models/TokenResponse.ts +++ b/src/lib/api/internal/v1/models/TokenResponse.ts @@ -38,7 +38,7 @@ export interface TokenResponse { * @type {string} * @memberof TokenResponse */ - name: string | null; + name: string; /** * * @type {Date} @@ -62,7 +62,7 @@ export interface TokenResponse { * @type {Array} * @memberof TokenResponse */ - permissions: Array | null; + permissions: Array; } /** @@ -93,15 +93,15 @@ export function TokenResponseFromJSONTyped(json: any, ignoreDiscriminator: boole 'createdOn': (new Date(json['createdOn'])), 'validUntil': (json['validUntil'] == null ? null : new Date(json['validUntil'])), 'lastUsed': (new Date(json['lastUsed'])), - 'permissions': (json['permissions'] == null ? null : (json['permissions'] as Array).map(PermissionTypeFromJSON)), + 'permissions': ((json['permissions'] as Array).map(PermissionTypeFromJSON)), }; } - export function TokenResponseToJSON(json: any): TokenResponse { - return TokenResponseToJSONTyped(json, false); - } +export function TokenResponseToJSON(json: any): TokenResponse { + return TokenResponseToJSONTyped(json, false); +} - export function TokenResponseToJSONTyped(value?: TokenResponse | null, ignoreDiscriminator: boolean = false): any { +export function TokenResponseToJSONTyped(value?: TokenResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } @@ -113,7 +113,7 @@ export function TokenResponseFromJSONTyped(json: any, ignoreDiscriminator: boole 'createdOn': ((value['createdOn']).toISOString()), 'validUntil': (value['validUntil'] == null ? null : (value['validUntil'] as any).toISOString()), 'lastUsed': ((value['lastUsed']).toISOString()), - 'permissions': (value['permissions'] == null ? null : (value['permissions'] as Array).map(PermissionTypeToJSON)), + 'permissions': ((value['permissions'] as Array).map(PermissionTypeToJSON)), }; } diff --git a/src/lib/api/internal/v1/models/TokenResponseBaseResponse.ts b/src/lib/api/internal/v1/models/TokenResponseBaseResponse.ts deleted file mode 100644 index 656abe89..00000000 --- a/src/lib/api/internal/v1/models/TokenResponseBaseResponse.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * OpenShock.API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { TokenResponse } from './TokenResponse'; -import { - TokenResponseFromJSON, - TokenResponseFromJSONTyped, - TokenResponseToJSON, -} from './TokenResponse'; - -/** - * - * @export - * @interface TokenResponseBaseResponse - */ -export interface TokenResponseBaseResponse { - /** - * - * @type {string} - * @memberof TokenResponseBaseResponse - */ - message?: string | null; - /** - * - * @type {TokenResponse} - * @memberof TokenResponseBaseResponse - */ - data?: TokenResponse; -} - -/** - * Check if a given object implements the TokenResponseBaseResponse interface. - */ -export function instanceOfTokenResponseBaseResponse(value: object): value is TokenResponseBaseResponse { - return true; -} - -export function TokenResponseBaseResponseFromJSON(json: any): TokenResponseBaseResponse { - return TokenResponseBaseResponseFromJSONTyped(json, false); -} - -export function TokenResponseBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): TokenResponseBaseResponse { - if (json == null) { - return json; - } - return { - - 'message': json['message'] == null ? undefined : json['message'], - 'data': json['data'] == null ? undefined : TokenResponseFromJSON(json['data']), - }; -} - -export function TokenResponseBaseResponseToJSON(value?: TokenResponseBaseResponse | null): any { - if (value == null) { - return value; - } - return { - - 'message': value['message'], - 'data': TokenResponseToJSON(value['data']), - }; -} - diff --git a/src/lib/api/internal/v1/models/TokenResponseIEnumerableBaseResponse.ts b/src/lib/api/internal/v1/models/TokenResponseIEnumerableBaseResponse.ts deleted file mode 100644 index 8dae1e72..00000000 --- a/src/lib/api/internal/v1/models/TokenResponseIEnumerableBaseResponse.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * OpenShock.API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { TokenResponse } from './TokenResponse'; -import { - TokenResponseFromJSON, - TokenResponseFromJSONTyped, - TokenResponseToJSON, -} from './TokenResponse'; - -/** - * - * @export - * @interface TokenResponseIEnumerableBaseResponse - */ -export interface TokenResponseIEnumerableBaseResponse { - /** - * - * @type {string} - * @memberof TokenResponseIEnumerableBaseResponse - */ - message?: string | null; - /** - * - * @type {Array} - * @memberof TokenResponseIEnumerableBaseResponse - */ - data?: Array | null; -} - -/** - * Check if a given object implements the TokenResponseIEnumerableBaseResponse interface. - */ -export function instanceOfTokenResponseIEnumerableBaseResponse(value: object): value is TokenResponseIEnumerableBaseResponse { - return true; -} - -export function TokenResponseIEnumerableBaseResponseFromJSON(json: any): TokenResponseIEnumerableBaseResponse { - return TokenResponseIEnumerableBaseResponseFromJSONTyped(json, false); -} - -export function TokenResponseIEnumerableBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): TokenResponseIEnumerableBaseResponse { - if (json == null) { - return json; - } - return { - - 'message': json['message'] == null ? undefined : json['message'], - 'data': json['data'] == null ? undefined : ((json['data'] as Array).map(TokenResponseFromJSON)), - }; -} - -export function TokenResponseIEnumerableBaseResponseToJSON(value?: TokenResponseIEnumerableBaseResponse | null): any { - if (value == null) { - return value; - } - return { - - 'message': value['message'], - 'data': value['data'] == null ? undefined : ((value['data'] as Array).map(TokenResponseToJSON)), - }; -} - diff --git a/src/lib/api/internal/v1/models/UsernameAvailability.ts b/src/lib/api/internal/v1/models/UsernameAvailability.ts index 2261646c..faa20ef2 100644 --- a/src/lib/api/internal/v1/models/UsernameAvailability.ts +++ b/src/lib/api/internal/v1/models/UsernameAvailability.ts @@ -18,10 +18,9 @@ * @enum {string} */ export enum UsernameAvailability { - available = 'Available', - taken = 'Taken', - invalid = 'Invalid', - unknownDefaultOpenApi = '11184809' + Available = 'Available', + Taken = 'Taken', + Invalid = 'Invalid' } diff --git a/src/lib/api/internal/v1/models/UsernameCheckResponse.ts b/src/lib/api/internal/v1/models/UsernameCheckResponse.ts index c962081a..4d3d19bb 100644 --- a/src/lib/api/internal/v1/models/UsernameCheckResponse.ts +++ b/src/lib/api/internal/v1/models/UsernameCheckResponse.ts @@ -73,11 +73,11 @@ export function UsernameCheckResponseFromJSONTyped(json: any, ignoreDiscriminato }; } - export function UsernameCheckResponseToJSON(json: any): UsernameCheckResponse { - return UsernameCheckResponseToJSONTyped(json, false); - } +export function UsernameCheckResponseToJSON(json: any): UsernameCheckResponse { + return UsernameCheckResponseToJSONTyped(json, false); +} - export function UsernameCheckResponseToJSONTyped(value?: UsernameCheckResponse | null, ignoreDiscriminator: boolean = false): any { +export function UsernameCheckResponseToJSONTyped(value?: UsernameCheckResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/UsernameCheckResponseBaseResponse.ts b/src/lib/api/internal/v1/models/UsernameCheckResponseBaseResponse.ts deleted file mode 100644 index 5655fc54..00000000 --- a/src/lib/api/internal/v1/models/UsernameCheckResponseBaseResponse.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * OpenShock.API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { UsernameCheckResponse } from './UsernameCheckResponse'; -import { - UsernameCheckResponseFromJSON, - UsernameCheckResponseFromJSONTyped, - UsernameCheckResponseToJSON, -} from './UsernameCheckResponse'; - -/** - * - * @export - * @interface UsernameCheckResponseBaseResponse - */ -export interface UsernameCheckResponseBaseResponse { - /** - * - * @type {string} - * @memberof UsernameCheckResponseBaseResponse - */ - message?: string | null; - /** - * - * @type {UsernameCheckResponse} - * @memberof UsernameCheckResponseBaseResponse - */ - data?: UsernameCheckResponse; -} - -/** - * Check if a given object implements the UsernameCheckResponseBaseResponse interface. - */ -export function instanceOfUsernameCheckResponseBaseResponse(value: object): value is UsernameCheckResponseBaseResponse { - return true; -} - -export function UsernameCheckResponseBaseResponseFromJSON(json: any): UsernameCheckResponseBaseResponse { - return UsernameCheckResponseBaseResponseFromJSONTyped(json, false); -} - -export function UsernameCheckResponseBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): UsernameCheckResponseBaseResponse { - if (json == null) { - return json; - } - return { - - 'message': json['message'] == null ? undefined : json['message'], - 'data': json['data'] == null ? undefined : UsernameCheckResponseFromJSON(json['data']), - }; -} - -export function UsernameCheckResponseBaseResponseToJSON(value?: UsernameCheckResponseBaseResponse | null): any { - if (value == null) { - return value; - } - return { - - 'message': value['message'], - 'data': UsernameCheckResponseToJSON(value['data']), - }; -} - diff --git a/src/lib/api/internal/v1/models/UsernameError.ts b/src/lib/api/internal/v1/models/UsernameError.ts index 9db633a7..d516ee0d 100644 --- a/src/lib/api/internal/v1/models/UsernameError.ts +++ b/src/lib/api/internal/v1/models/UsernameError.ts @@ -32,7 +32,7 @@ export interface UsernameError { * @type {string} * @memberof UsernameError */ - message: string | null; + message: string; /** * * @type {UsernameErrorType} @@ -67,11 +67,11 @@ export function UsernameErrorFromJSONTyped(json: any, ignoreDiscriminator: boole }; } - export function UsernameErrorToJSON(json: any): UsernameError { - return UsernameErrorToJSONTyped(json, false); - } +export function UsernameErrorToJSON(json: any): UsernameError { + return UsernameErrorToJSONTyped(json, false); +} - export function UsernameErrorToJSONTyped(value?: UsernameError | null, ignoreDiscriminator: boolean = false): any { +export function UsernameErrorToJSONTyped(value?: UsernameError | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v1/models/UsernameErrorType.ts b/src/lib/api/internal/v1/models/UsernameErrorType.ts index 8217eae9..44e38889 100644 --- a/src/lib/api/internal/v1/models/UsernameErrorType.ts +++ b/src/lib/api/internal/v1/models/UsernameErrorType.ts @@ -18,12 +18,11 @@ * @enum {string} */ export enum UsernameErrorType { - tooShort = 'TooShort', - tooLong = 'TooLong', - startOrEndWithWhitespace = 'StartOrEndWithWhitespace', - resembleEmail = 'ResembleEmail', - obnoxiousCharacters = 'ObnoxiousCharacters', - unknownDefaultOpenApi = '11184809' + TooShort = 'TooShort', + TooLong = 'TooLong', + StartOrEndWithWhitespace = 'StartOrEndWithWhitespace', + ResembleEmail = 'ResembleEmail', + ObnoxiousCharacters = 'ObnoxiousCharacters' } diff --git a/src/lib/api/internal/v1/models/index.ts b/src/lib/api/internal/v1/models/index.ts index c00e24fa..2ca00548 100644 --- a/src/lib/api/internal/v1/models/index.ts +++ b/src/lib/api/internal/v1/models/index.ts @@ -2,9 +2,9 @@ /* eslint-disable */ export * from './AdminOnlineDeviceResponse'; export * from './AdminOnlineDeviceResponseIEnumerableBaseResponse'; -export * from './AdminUserCountsResponse'; -export * from './AdminUserResponse'; -export * from './AdminUserResponsePaginated'; +export * from './AdminUsersView'; +export * from './AdminUsersViewPaginated'; +export * from './BooleanBaseResponse'; export * from './BooleanNullableBaseResponse'; export * from './ChangeEmailRequest'; export * from './ChangePasswordRequest'; @@ -12,7 +12,6 @@ export * from './ChangeUsernameRequest'; export * from './Control'; export * from './ControlLogSenderLight'; export * from './ControlType'; -export * from './CreateShareCode'; export * from './CreateTokenRequest'; export * from './DeviceSelfResponse'; export * from './DeviceSelfResponseBaseResponse'; @@ -71,6 +70,7 @@ export * from './SharedDevice'; export * from './SharedShocker'; export * from './ShockerLimits'; export * from './ShockerModelType'; +export * from './ShockerPermLimitPair'; export * from './ShockerPermissions'; export * from './ShockerResponse'; export * from './ShockerResponseIEnumerableBaseResponse'; diff --git a/src/lib/api/internal/v1/runtime.ts b/src/lib/api/internal/v1/runtime.ts index f4ef872d..bd03ce65 100644 --- a/src/lib/api/internal/v1/runtime.ts +++ b/src/lib/api/internal/v1/runtime.ts @@ -337,6 +337,11 @@ function querystringSingleKey(key: string, value: string | number | null | undef return `${encodeURIComponent(fullKey)}=${encodeURIComponent(String(value))}`; } +export function exists(json: any, key: string) { + const value = json[key]; + return value !== null && value !== undefined; +} + export function mapValues(data: any, fn: (item: any) => any) { return Object.keys(data).reduce( (acc, key) => ({ ...acc, [key]: fn(data[key]) }), diff --git a/src/lib/api/internal/v2/.openapi-generator/FILES b/src/lib/api/internal/v2/.openapi-generator/FILES index 9897d2af..b2466444 100644 --- a/src/lib/api/internal/v2/.openapi-generator/FILES +++ b/src/lib/api/internal/v2/.openapi-generator/FILES @@ -1,5 +1,6 @@ apis/AccountApi.ts apis/DevicesApi.ts +apis/SharesApi.ts apis/ShockerApi.ts apis/index.ts index.ts @@ -7,10 +8,19 @@ models/ChangeUsernameRequest.ts models/Control.ts models/ControlRequest.ts models/ControlType.ts +models/CreateShareRequest.ts +models/GenericIni.ts models/HubCreateRequest.ts models/LoginV2.ts models/ObjectBaseResponse.ts models/OpenShockProblem.ts +models/ShareInfo.ts +models/ShareRequestBaseDetails.ts +models/ShareRequestBaseItem.ts +models/ShareRequestCounts.ts +models/ShockerLimits.ts +models/ShockerPermLimitPairWithId.ts +models/ShockerPermissions.ts models/SignUpV2.ts models/UsernameAvailability.ts models/UsernameCheckResponse.ts diff --git a/src/lib/api/internal/v2/.openapi-generator/VERSION b/src/lib/api/internal/v2/.openapi-generator/VERSION index 4bc5d618..758bb9c8 100644 --- a/src/lib/api/internal/v2/.openapi-generator/VERSION +++ b/src/lib/api/internal/v2/.openapi-generator/VERSION @@ -1 +1 @@ -7.9.0 +7.10.0 diff --git a/src/lib/api/internal/v2/apis/AccountApi.ts b/src/lib/api/internal/v2/apis/AccountApi.ts index 929c3eb4..d1e708c1 100644 --- a/src/lib/api/internal/v2/apis/AccountApi.ts +++ b/src/lib/api/internal/v2/apis/AccountApi.ts @@ -118,10 +118,6 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/2/account/username/check`, method: 'POST', @@ -151,10 +147,6 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/2/account/login`, method: 'POST', @@ -184,10 +176,6 @@ export class AccountApi extends runtime.BaseAPI implements AccountApiInterface { headerParameters['Content-Type'] = 'application/json'; - if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication - } - const response = await this.request({ path: `/2/account/signup`, method: 'POST', diff --git a/src/lib/api/internal/v2/apis/DevicesApi.ts b/src/lib/api/internal/v2/apis/DevicesApi.ts index c53c72b7..c673b0f9 100644 --- a/src/lib/api/internal/v2/apis/DevicesApi.ts +++ b/src/lib/api/internal/v2/apis/DevicesApi.ts @@ -66,7 +66,7 @@ export class DevicesApi extends runtime.BaseAPI implements DevicesApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ diff --git a/src/lib/api/internal/v2/apis/SharesApi.ts b/src/lib/api/internal/v2/apis/SharesApi.ts new file mode 100644 index 00000000..2360122e --- /dev/null +++ b/src/lib/api/internal/v2/apis/SharesApi.ts @@ -0,0 +1,432 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as runtime from '../runtime'; +import type { + CreateShareRequest, + GenericIni, + OpenShockProblem, + ShareInfo, + ShareRequestBaseDetails, + ShareRequestBaseItem, +} from '../models/index'; +import { + CreateShareRequestFromJSON, + CreateShareRequestToJSON, + GenericIniFromJSON, + GenericIniToJSON, + OpenShockProblemFromJSON, + OpenShockProblemToJSON, + ShareInfoFromJSON, + ShareInfoToJSON, + ShareRequestBaseDetailsFromJSON, + ShareRequestBaseDetailsToJSON, + ShareRequestBaseItemFromJSON, + ShareRequestBaseItemToJSON, +} from '../models/index'; + +export interface SharesCreateShareRequest { + createShareRequest?: CreateShareRequest; +} + +export interface SharesDeleteRequestRequest { + id: string; +} + +export interface SharesDenyRequestRequest { + id: string; +} + +export interface SharesGetRequestRequest { + id: string; +} + +export interface SharesGetSharesToUserRequest { + userId: string; +} + +/** + * SharesApi - interface + * + * @export + * @interface SharesApiInterface + */ +export interface SharesApiInterface { + /** + * + * @param {CreateShareRequest} [createShareRequest] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesApiInterface + */ + sharesCreateShareRaw(requestParameters: SharesCreateShareRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesCreateShare(createShareRequest?: CreateShareRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesApiInterface + */ + sharesDeleteRequestRaw(requestParameters: SharesDeleteRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesDeleteRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesApiInterface + */ + sharesDenyRequestRaw(requestParameters: SharesDenyRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesDenyRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesApiInterface + */ + sharesGetIncomingRequestsListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>>; + + /** + */ + sharesGetIncomingRequestsList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesApiInterface + */ + sharesGetOutstandingRequestsListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>>; + + /** + */ + sharesGetOutstandingRequestsList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesApiInterface + */ + sharesGetRequestRaw(requestParameters: SharesGetRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesGetRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesApiInterface + */ + sharesGetSharesByUsersRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>>; + + /** + */ + sharesGetSharesByUsers(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + * + * @param {string} userId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesApiInterface + */ + sharesGetSharesToUserRaw(requestParameters: SharesGetSharesToUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesGetSharesToUser(userId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + +} + +/** + * + */ +export class SharesApi extends runtime.BaseAPI implements SharesApiInterface { + + /** + */ + async sharesCreateShareRaw(requestParameters: SharesCreateShareRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: CreateShareRequestToJSON(requestParameters['createShareRequest']), + }, initOverrides); + + if (this.isJsonMime(response.headers.get('content-type'))) { + return new runtime.JSONApiResponse(response); + } else { + return new runtime.TextApiResponse(response) as any; + } + } + + /** + */ + async sharesCreateShare(createShareRequest?: CreateShareRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.sharesCreateShareRaw({ createShareRequest: createShareRequest }, initOverrides); + return await response.value(); + } + + /** + */ + async sharesDeleteRequestRaw(requestParameters: SharesDeleteRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['id'] == null) { + throw new runtime.RequiredError( + 'id', + 'Required parameter "id" was null or undefined when calling sharesDeleteRequest().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/outgoing/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))), + method: 'DELETE', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.VoidApiResponse(response); + } + + /** + */ + async sharesDeleteRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.sharesDeleteRequestRaw({ id: id }, initOverrides); + } + + /** + */ + async sharesDenyRequestRaw(requestParameters: SharesDenyRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['id'] == null) { + throw new runtime.RequiredError( + 'id', + 'Required parameter "id" was null or undefined when calling sharesDenyRequest().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/incoming/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))), + method: 'DELETE', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.VoidApiResponse(response); + } + + /** + */ + async sharesDenyRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + await this.sharesDenyRequestRaw({ id: id }, initOverrides); + } + + /** + */ + async sharesGetIncomingRequestsListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/incoming`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(ShareRequestBaseItemFromJSON)); + } + + /** + */ + async sharesGetIncomingRequestsList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.sharesGetIncomingRequestsListRaw(initOverrides); + return await response.value(); + } + + /** + */ + async sharesGetOutstandingRequestsListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/outstanding`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(ShareRequestBaseItemFromJSON)); + } + + /** + */ + async sharesGetOutstandingRequestsList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.sharesGetOutstandingRequestsListRaw(initOverrides); + return await response.value(); + } + + /** + */ + async sharesGetRequestRaw(requestParameters: SharesGetRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['id'] == null) { + throw new runtime.RequiredError( + 'id', + 'Required parameter "id" was null or undefined when calling sharesGetRequest().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => ShareRequestBaseDetailsFromJSON(jsonValue)); + } + + /** + */ + async sharesGetRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.sharesGetRequestRaw({ id: id }, initOverrides); + return await response.value(); + } + + /** + */ + async sharesGetSharesByUsersRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication + } + + const response = await this.request({ + path: `/2/shares`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(GenericIniFromJSON)); + } + + /** + */ + async sharesGetSharesByUsers(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.sharesGetSharesByUsersRaw(initOverrides); + return await response.value(); + } + + /** + */ + async sharesGetSharesToUserRaw(requestParameters: SharesGetSharesToUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['userId'] == null) { + throw new runtime.RequiredError( + 'userId', + 'Required parameter "userId" was null or undefined when calling sharesGetSharesToUser().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication + } + + const response = await this.request({ + path: `/2/shares/{userId}`.replace(`{${"userId"}}`, encodeURIComponent(String(requestParameters['userId']))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => ShareInfoFromJSON(jsonValue)); + } + + /** + */ + async sharesGetSharesToUser(userId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.sharesGetSharesToUserRaw({ userId: userId }, initOverrides); + return await response.value(); + } + +} diff --git a/src/lib/api/internal/v2/apis/SharesVApi.ts b/src/lib/api/internal/v2/apis/SharesVApi.ts new file mode 100644 index 00000000..99753504 --- /dev/null +++ b/src/lib/api/internal/v2/apis/SharesVApi.ts @@ -0,0 +1,442 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import * as runtime from '../runtime'; +import type { + CreateShareRequest, + GenericIni, + OpenShockProblem, + ShareInfo, + ShareRequestBaseDetails, + ShareRequestBaseItem, +} from '../models/index'; +import { + CreateShareRequestFromJSON, + CreateShareRequestToJSON, + GenericIniFromJSON, + GenericIniToJSON, + OpenShockProblemFromJSON, + OpenShockProblemToJSON, + ShareInfoFromJSON, + ShareInfoToJSON, + ShareRequestBaseDetailsFromJSON, + ShareRequestBaseDetailsToJSON, + ShareRequestBaseItemFromJSON, + ShareRequestBaseItemToJSON, +} from '../models/index'; + +export interface SharesVCreateShareRequest { + createShareRequest?: CreateShareRequest; +} + +export interface SharesVDeleteRequestRequest { + id: string; +} + +export interface SharesVDenyRequestRequest { + id: string; +} + +export interface SharesVGetRequestRequest { + id: string; +} + +export interface SharesVGetSharesToUserRequest { + userId: string; +} + +/** + * SharesVApi - interface + * + * @export + * @interface SharesVApiInterface + */ +export interface SharesVApiInterface { + /** + * + * @param {CreateShareRequest} [createShareRequest] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesVApiInterface + */ + sharesVCreateShareRaw(requestParameters: SharesVCreateShareRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesVCreateShare(createShareRequest?: CreateShareRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesVApiInterface + */ + sharesVDeleteRequestRaw(requestParameters: SharesVDeleteRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesVDeleteRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesVApiInterface + */ + sharesVDenyRequestRaw(requestParameters: SharesVDenyRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesVDenyRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesVApiInterface + */ + sharesVGetIncomingRequestsListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>>; + + /** + */ + sharesVGetIncomingRequestsList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesVApiInterface + */ + sharesVGetOutstandingRequestsListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>>; + + /** + */ + sharesVGetOutstandingRequestsList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesVApiInterface + */ + sharesVGetRequestRaw(requestParameters: SharesVGetRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesVGetRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesVApiInterface + */ + sharesVGetSharesByUsersRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>>; + + /** + */ + sharesVGetSharesByUsers(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + * + * @param {string} userId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SharesVApiInterface + */ + sharesVGetSharesToUserRaw(requestParameters: SharesVGetSharesToUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>; + + /** + */ + sharesVGetSharesToUser(userId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise; + +} + +/** + * + */ +export class SharesVApi extends runtime.BaseAPI implements SharesVApiInterface { + + /** + */ + async sharesVCreateShareRaw(requestParameters: SharesVCreateShareRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: CreateShareRequestToJSON(requestParameters['createShareRequest']), + }, initOverrides); + + if (this.isJsonMime(response.headers.get('content-type'))) { + return new runtime.JSONApiResponse(response); + } else { + return new runtime.TextApiResponse(response) as any; + } + } + + /** + */ + async sharesVCreateShare(createShareRequest?: CreateShareRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.sharesVCreateShareRaw({ createShareRequest: createShareRequest }, initOverrides); + return await response.value(); + } + + /** + */ + async sharesVDeleteRequestRaw(requestParameters: SharesVDeleteRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['id'] == null) { + throw new runtime.RequiredError( + 'id', + 'Required parameter "id" was null or undefined when calling sharesVDeleteRequest().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/outgoing/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))), + method: 'DELETE', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + if (this.isJsonMime(response.headers.get('content-type'))) { + return new runtime.JSONApiResponse(response); + } else { + return new runtime.TextApiResponse(response) as any; + } + } + + /** + */ + async sharesVDeleteRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.sharesVDeleteRequestRaw({ id: id }, initOverrides); + return await response.value(); + } + + /** + */ + async sharesVDenyRequestRaw(requestParameters: SharesVDenyRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['id'] == null) { + throw new runtime.RequiredError( + 'id', + 'Required parameter "id" was null or undefined when calling sharesVDenyRequest().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/incoming/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))), + method: 'DELETE', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + if (this.isJsonMime(response.headers.get('content-type'))) { + return new runtime.JSONApiResponse(response); + } else { + return new runtime.TextApiResponse(response) as any; + } + } + + /** + */ + async sharesVDenyRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.sharesVDenyRequestRaw({ id: id }, initOverrides); + return await response.value(); + } + + /** + */ + async sharesVGetIncomingRequestsListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/incoming`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(ShareRequestBaseItemFromJSON)); + } + + /** + */ + async sharesVGetIncomingRequestsList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.sharesVGetIncomingRequestsListRaw(initOverrides); + return await response.value(); + } + + /** + */ + async sharesVGetOutstandingRequestsListRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/outstanding`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(ShareRequestBaseItemFromJSON)); + } + + /** + */ + async sharesVGetOutstandingRequestsList(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.sharesVGetOutstandingRequestsListRaw(initOverrides); + return await response.value(); + } + + /** + */ + async sharesVGetRequestRaw(requestParameters: SharesVGetRequestRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['id'] == null) { + throw new runtime.RequiredError( + 'id', + 'Required parameter "id" was null or undefined when calling sharesVGetRequest().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + } + + const response = await this.request({ + path: `/2/shares/requests/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => ShareRequestBaseDetailsFromJSON(jsonValue)); + } + + /** + */ + async sharesVGetRequest(id: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.sharesVGetRequestRaw({ id: id }, initOverrides); + return await response.value(); + } + + /** + */ + async sharesVGetSharesByUsersRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise>> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + } + + const response = await this.request({ + path: `/2/shares`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(GenericIniFromJSON)); + } + + /** + */ + async sharesVGetSharesByUsers(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const response = await this.sharesVGetSharesByUsersRaw(initOverrides); + return await response.value(); + } + + /** + */ + async sharesVGetSharesToUserRaw(requestParameters: SharesVGetSharesToUserRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + if (requestParameters['userId'] == null) { + throw new runtime.RequiredError( + 'userId', + 'Required parameter "userId" was null or undefined when calling sharesVGetSharesToUser().' + ); + } + + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + if (this.configuration && this.configuration.apiKey) { + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + } + + const response = await this.request({ + path: `/2/shares/{userId}`.replace(`{${"userId"}}`, encodeURIComponent(String(requestParameters['userId']))), + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => ShareInfoFromJSON(jsonValue)); + } + + /** + */ + async sharesVGetSharesToUser(userId: string, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.sharesVGetSharesToUserRaw({ userId: userId }, initOverrides); + return await response.value(); + } + +} diff --git a/src/lib/api/internal/v2/apis/ShockerApi.ts b/src/lib/api/internal/v2/apis/ShockerApi.ts index 88ff3fd9..03ef26d1 100644 --- a/src/lib/api/internal/v2/apis/ShockerApi.ts +++ b/src/lib/api/internal/v2/apis/ShockerApi.ts @@ -72,7 +72,7 @@ export class ShockerApi extends runtime.BaseAPI implements ShockerApiInterface { headerParameters['Content-Type'] = 'application/json'; if (this.configuration && this.configuration.apiKey) { - headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // OpenShockToken authentication + headerParameters["OpenShockToken"] = await this.configuration.apiKey("OpenShockToken"); // ApiToken authentication } const response = await this.request({ diff --git a/src/lib/api/internal/v2/apis/index.ts b/src/lib/api/internal/v2/apis/index.ts index 27f411de..0cb66846 100644 --- a/src/lib/api/internal/v2/apis/index.ts +++ b/src/lib/api/internal/v2/apis/index.ts @@ -2,4 +2,5 @@ /* eslint-disable */ export * from './AccountApi'; export * from './DevicesApi'; +export * from './SharesApi'; export * from './ShockerApi'; diff --git a/src/lib/api/internal/v2/models/ChangeUsernameRequest.ts b/src/lib/api/internal/v2/models/ChangeUsernameRequest.ts index d63064b7..ef646ac1 100644 --- a/src/lib/api/internal/v2/models/ChangeUsernameRequest.ts +++ b/src/lib/api/internal/v2/models/ChangeUsernameRequest.ts @@ -24,7 +24,7 @@ export interface ChangeUsernameRequest { * @type {string} * @memberof ChangeUsernameRequest */ - username: string | null; + username: string; } /** @@ -49,11 +49,11 @@ export function ChangeUsernameRequestFromJSONTyped(json: any, ignoreDiscriminato }; } - export function ChangeUsernameRequestToJSON(json: any): ChangeUsernameRequest { - return ChangeUsernameRequestToJSONTyped(json, false); - } +export function ChangeUsernameRequestToJSON(json: any): ChangeUsernameRequest { + return ChangeUsernameRequestToJSONTyped(json, false); +} - export function ChangeUsernameRequestToJSONTyped(value?: ChangeUsernameRequest | null, ignoreDiscriminator: boolean = false): any { +export function ChangeUsernameRequestToJSONTyped(value?: ChangeUsernameRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v2/models/Control.ts b/src/lib/api/internal/v2/models/Control.ts index 5fb84232..28ad0e06 100644 --- a/src/lib/api/internal/v2/models/Control.ts +++ b/src/lib/api/internal/v2/models/Control.ts @@ -90,11 +90,11 @@ export function ControlFromJSONTyped(json: any, ignoreDiscriminator: boolean): C }; } - export function ControlToJSON(json: any): Control { - return ControlToJSONTyped(json, false); - } +export function ControlToJSON(json: any): Control { + return ControlToJSONTyped(json, false); +} - export function ControlToJSONTyped(value?: Control | null, ignoreDiscriminator: boolean = false): any { +export function ControlToJSONTyped(value?: Control | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v2/models/ControlRequest.ts b/src/lib/api/internal/v2/models/ControlRequest.ts index 17a0cec5..921618fe 100644 --- a/src/lib/api/internal/v2/models/ControlRequest.ts +++ b/src/lib/api/internal/v2/models/ControlRequest.ts @@ -32,7 +32,7 @@ export interface ControlRequest { * @type {Array} * @memberof ControlRequest */ - shocks: Array | null; + shocks: Array; /** * * @type {string} @@ -59,23 +59,23 @@ export function ControlRequestFromJSONTyped(json: any, ignoreDiscriminator: bool } return { - 'shocks': (json['shocks'] == null ? null : (json['shocks'] as Array).map(ControlFromJSON)), + 'shocks': ((json['shocks'] as Array).map(ControlFromJSON)), 'customName': json['customName'] == null ? undefined : json['customName'], }; } - export function ControlRequestToJSON(json: any): ControlRequest { - return ControlRequestToJSONTyped(json, false); - } +export function ControlRequestToJSON(json: any): ControlRequest { + return ControlRequestToJSONTyped(json, false); +} - export function ControlRequestToJSONTyped(value?: ControlRequest | null, ignoreDiscriminator: boolean = false): any { +export function ControlRequestToJSONTyped(value?: ControlRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } return { - 'shocks': (value['shocks'] == null ? null : (value['shocks'] as Array).map(ControlToJSON)), + 'shocks': ((value['shocks'] as Array).map(ControlToJSON)), 'customName': value['customName'], }; } diff --git a/src/lib/api/internal/v2/models/ControlType.ts b/src/lib/api/internal/v2/models/ControlType.ts index 4857eda0..8e16ec48 100644 --- a/src/lib/api/internal/v2/models/ControlType.ts +++ b/src/lib/api/internal/v2/models/ControlType.ts @@ -18,11 +18,10 @@ * @enum {string} */ export enum ControlType { - stop = 'Stop', - shock = 'Shock', - vibrate = 'Vibrate', - sound = 'Sound', - unknownDefaultOpenApi = '11184809' + Stop = 'Stop', + Shock = 'Shock', + Vibrate = 'Vibrate', + Sound = 'Sound' } diff --git a/src/lib/api/internal/v2/models/CreateShareRequest.ts b/src/lib/api/internal/v2/models/CreateShareRequest.ts new file mode 100644 index 00000000..8313c66d --- /dev/null +++ b/src/lib/api/internal/v2/models/CreateShareRequest.ts @@ -0,0 +1,82 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ShockerPermLimitPairWithId } from './ShockerPermLimitPairWithId'; +import { + ShockerPermLimitPairWithIdFromJSON, + ShockerPermLimitPairWithIdFromJSONTyped, + ShockerPermLimitPairWithIdToJSON, + ShockerPermLimitPairWithIdToJSONTyped, +} from './ShockerPermLimitPairWithId'; + +/** + * + * @export + * @interface CreateShareRequest + */ +export interface CreateShareRequest { + /** + * + * @type {Array} + * @memberof CreateShareRequest + */ + shockers: Array; + /** + * + * @type {string} + * @memberof CreateShareRequest + */ + user?: string | null; +} + +/** + * Check if a given object implements the CreateShareRequest interface. + */ +export function instanceOfCreateShareRequest(value: object): value is CreateShareRequest { + if (!('shockers' in value) || value['shockers'] === undefined) return false; + return true; +} + +export function CreateShareRequestFromJSON(json: any): CreateShareRequest { + return CreateShareRequestFromJSONTyped(json, false); +} + +export function CreateShareRequestFromJSONTyped(json: any, ignoreDiscriminator: boolean): CreateShareRequest { + if (json == null) { + return json; + } + return { + + 'shockers': ((json['shockers'] as Array).map(ShockerPermLimitPairWithIdFromJSON)), + 'user': json['user'] == null ? undefined : json['user'], + }; +} + +export function CreateShareRequestToJSON(json: any): CreateShareRequest { + return CreateShareRequestToJSONTyped(json, false); +} + +export function CreateShareRequestToJSONTyped(value?: CreateShareRequest | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'shockers': ((value['shockers'] as Array).map(ShockerPermLimitPairWithIdToJSON)), + 'user': value['user'], + }; +} + diff --git a/src/lib/api/internal/v2/models/GenericIni.ts b/src/lib/api/internal/v2/models/GenericIni.ts new file mode 100644 index 00000000..7ec50849 --- /dev/null +++ b/src/lib/api/internal/v2/models/GenericIni.ts @@ -0,0 +1,84 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface GenericIni + */ +export interface GenericIni { + /** + * + * @type {string} + * @memberof GenericIni + */ + id: string; + /** + * + * @type {string} + * @memberof GenericIni + */ + name: string; + /** + * + * @type {string} + * @memberof GenericIni + */ + image: string; +} + +/** + * Check if a given object implements the GenericIni interface. + */ +export function instanceOfGenericIni(value: object): value is GenericIni { + if (!('id' in value) || value['id'] === undefined) return false; + if (!('name' in value) || value['name'] === undefined) return false; + if (!('image' in value) || value['image'] === undefined) return false; + return true; +} + +export function GenericIniFromJSON(json: any): GenericIni { + return GenericIniFromJSONTyped(json, false); +} + +export function GenericIniFromJSONTyped(json: any, ignoreDiscriminator: boolean): GenericIni { + if (json == null) { + return json; + } + return { + + 'id': json['id'], + 'name': json['name'], + 'image': json['image'], + }; +} + +export function GenericIniToJSON(json: any): GenericIni { + return GenericIniToJSONTyped(json, false); +} + +export function GenericIniToJSONTyped(value?: GenericIni | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'id': value['id'], + 'name': value['name'], + 'image': value['image'], + }; +} + diff --git a/src/lib/api/internal/v2/models/HubCreateRequest.ts b/src/lib/api/internal/v2/models/HubCreateRequest.ts index 1609fc36..1a981846 100644 --- a/src/lib/api/internal/v2/models/HubCreateRequest.ts +++ b/src/lib/api/internal/v2/models/HubCreateRequest.ts @@ -49,11 +49,11 @@ export function HubCreateRequestFromJSONTyped(json: any, ignoreDiscriminator: bo }; } - export function HubCreateRequestToJSON(json: any): HubCreateRequest { - return HubCreateRequestToJSONTyped(json, false); - } +export function HubCreateRequestToJSON(json: any): HubCreateRequest { + return HubCreateRequestToJSONTyped(json, false); +} - export function HubCreateRequestToJSONTyped(value?: HubCreateRequest | null, ignoreDiscriminator: boolean = false): any { +export function HubCreateRequestToJSONTyped(value?: HubCreateRequest | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v2/models/LoginV2.ts b/src/lib/api/internal/v2/models/LoginV2.ts index 4ddafab2..9c36d28b 100644 --- a/src/lib/api/internal/v2/models/LoginV2.ts +++ b/src/lib/api/internal/v2/models/LoginV2.ts @@ -30,7 +30,7 @@ export interface LoginV2 { * @type {string} * @memberof LoginV2 */ - email: string; + usernameOrEmail: string; /** * * @type {string} @@ -44,7 +44,7 @@ export interface LoginV2 { */ export function instanceOfLoginV2(value: object): value is LoginV2 { if (!('password' in value) || value['password'] === undefined) return false; - if (!('email' in value) || value['email'] === undefined) return false; + if (!('usernameOrEmail' in value) || value['usernameOrEmail'] === undefined) return false; if (!('turnstileResponse' in value) || value['turnstileResponse'] === undefined) return false; return true; } @@ -60,16 +60,16 @@ export function LoginV2FromJSONTyped(json: any, ignoreDiscriminator: boolean): L return { 'password': json['password'], - 'email': json['email'], + 'usernameOrEmail': json['usernameOrEmail'], 'turnstileResponse': json['turnstileResponse'], }; } - export function LoginV2ToJSON(json: any): LoginV2 { - return LoginV2ToJSONTyped(json, false); - } +export function LoginV2ToJSON(json: any): LoginV2 { + return LoginV2ToJSONTyped(json, false); +} - export function LoginV2ToJSONTyped(value?: LoginV2 | null, ignoreDiscriminator: boolean = false): any { +export function LoginV2ToJSONTyped(value?: LoginV2 | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } @@ -77,7 +77,7 @@ export function LoginV2FromJSONTyped(json: any, ignoreDiscriminator: boolean): L return { 'password': value['password'], - 'email': value['email'], + 'usernameOrEmail': value['usernameOrEmail'], 'turnstileResponse': value['turnstileResponse'], }; } diff --git a/src/lib/api/internal/v2/models/ObjectBaseResponse.ts b/src/lib/api/internal/v2/models/ObjectBaseResponse.ts index 31d7b038..69f18e20 100644 --- a/src/lib/api/internal/v2/models/ObjectBaseResponse.ts +++ b/src/lib/api/internal/v2/models/ObjectBaseResponse.ts @@ -55,11 +55,11 @@ export function ObjectBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: }; } - export function ObjectBaseResponseToJSON(json: any): ObjectBaseResponse { - return ObjectBaseResponseToJSONTyped(json, false); - } +export function ObjectBaseResponseToJSON(json: any): ObjectBaseResponse { + return ObjectBaseResponseToJSONTyped(json, false); +} - export function ObjectBaseResponseToJSONTyped(value?: ObjectBaseResponse | null, ignoreDiscriminator: boolean = false): any { +export function ObjectBaseResponseToJSONTyped(value?: ObjectBaseResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v2/models/OpenShockProblem.ts b/src/lib/api/internal/v2/models/OpenShockProblem.ts index 91d0c642..fef0a31f 100644 --- a/src/lib/api/internal/v2/models/OpenShockProblem.ts +++ b/src/lib/api/internal/v2/models/OpenShockProblem.ts @@ -56,13 +56,20 @@ export interface OpenShockProblem { * @memberof OpenShockProblem * @deprecated */ - readonly message?: string | null; + readonly message?: string; /** * * @type {string} * @memberof OpenShockProblem + * @deprecated */ - traceId?: string | null; + readonly traceId?: string | null; + /** + * + * @type {string} + * @memberof OpenShockProblem + */ + requestId?: string | null; } /** @@ -90,14 +97,15 @@ export function OpenShockProblemFromJSONTyped(json: any, ignoreDiscriminator: bo 'instance': json['instance'] == null ? undefined : json['instance'], 'message': json['message'] == null ? undefined : json['message'], 'traceId': json['traceId'] == null ? undefined : json['traceId'], + 'requestId': json['requestId'] == null ? undefined : json['requestId'], }; } - export function OpenShockProblemToJSON(json: any): OpenShockProblem { - return OpenShockProblemToJSONTyped(json, false); - } +export function OpenShockProblemToJSON(json: any): OpenShockProblem { + return OpenShockProblemToJSONTyped(json, false); +} - export function OpenShockProblemToJSONTyped(value?: Omit | null, ignoreDiscriminator: boolean = false): any { +export function OpenShockProblemToJSONTyped(value?: Omit | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } @@ -110,7 +118,7 @@ export function OpenShockProblemFromJSONTyped(json: any, ignoreDiscriminator: bo 'status': value['status'], 'detail': value['detail'], 'instance': value['instance'], - 'traceId': value['traceId'], + 'requestId': value['requestId'], }; } diff --git a/src/lib/api/internal/v2/models/ShareInfo.ts b/src/lib/api/internal/v2/models/ShareInfo.ts new file mode 100644 index 00000000..0ff3ae5d --- /dev/null +++ b/src/lib/api/internal/v2/models/ShareInfo.ts @@ -0,0 +1,124 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ShockerPermissions } from './ShockerPermissions'; +import { + ShockerPermissionsFromJSON, + ShockerPermissionsFromJSONTyped, + ShockerPermissionsToJSON, + ShockerPermissionsToJSONTyped, +} from './ShockerPermissions'; +import type { GenericIni } from './GenericIni'; +import { + GenericIniFromJSON, + GenericIniFromJSONTyped, + GenericIniToJSON, + GenericIniToJSONTyped, +} from './GenericIni'; +import type { ShockerLimits } from './ShockerLimits'; +import { + ShockerLimitsFromJSON, + ShockerLimitsFromJSONTyped, + ShockerLimitsToJSON, + ShockerLimitsToJSONTyped, +} from './ShockerLimits'; + +/** + * + * @export + * @interface ShareInfo + */ +export interface ShareInfo { + /** + * + * @type {GenericIni} + * @memberof ShareInfo + */ + sharedWith: GenericIni; + /** + * + * @type {Date} + * @memberof ShareInfo + */ + createdOn: Date; + /** + * + * @type {ShockerPermissions} + * @memberof ShareInfo + */ + permissions: ShockerPermissions; + /** + * + * @type {ShockerLimits} + * @memberof ShareInfo + */ + limits: ShockerLimits; + /** + * + * @type {boolean} + * @memberof ShareInfo + */ + paused: boolean; +} + +/** + * Check if a given object implements the ShareInfo interface. + */ +export function instanceOfShareInfo(value: object): value is ShareInfo { + if (!('sharedWith' in value) || value['sharedWith'] === undefined) return false; + if (!('createdOn' in value) || value['createdOn'] === undefined) return false; + if (!('permissions' in value) || value['permissions'] === undefined) return false; + if (!('limits' in value) || value['limits'] === undefined) return false; + if (!('paused' in value) || value['paused'] === undefined) return false; + return true; +} + +export function ShareInfoFromJSON(json: any): ShareInfo { + return ShareInfoFromJSONTyped(json, false); +} + +export function ShareInfoFromJSONTyped(json: any, ignoreDiscriminator: boolean): ShareInfo { + if (json == null) { + return json; + } + return { + + 'sharedWith': GenericIniFromJSON(json['sharedWith']), + 'createdOn': (new Date(json['createdOn'])), + 'permissions': ShockerPermissionsFromJSON(json['permissions']), + 'limits': ShockerLimitsFromJSON(json['limits']), + 'paused': json['paused'], + }; +} + +export function ShareInfoToJSON(json: any): ShareInfo { + return ShareInfoToJSONTyped(json, false); +} + +export function ShareInfoToJSONTyped(value?: ShareInfo | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'sharedWith': GenericIniToJSON(value['sharedWith']), + 'createdOn': ((value['createdOn']).toISOString()), + 'permissions': ShockerPermissionsToJSON(value['permissions']), + 'limits': ShockerLimitsToJSON(value['limits']), + 'paused': value['paused'], + }; +} + diff --git a/src/lib/api/internal/v2/models/ShareRequestBaseDetails.ts b/src/lib/api/internal/v2/models/ShareRequestBaseDetails.ts new file mode 100644 index 00000000..1ce2d6aa --- /dev/null +++ b/src/lib/api/internal/v2/models/ShareRequestBaseDetails.ts @@ -0,0 +1,117 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ShockerPermLimitPairWithId } from './ShockerPermLimitPairWithId'; +import { + ShockerPermLimitPairWithIdFromJSON, + ShockerPermLimitPairWithIdFromJSONTyped, + ShockerPermLimitPairWithIdToJSON, + ShockerPermLimitPairWithIdToJSONTyped, +} from './ShockerPermLimitPairWithId'; +import type { GenericIni } from './GenericIni'; +import { + GenericIniFromJSON, + GenericIniFromJSONTyped, + GenericIniToJSON, + GenericIniToJSONTyped, +} from './GenericIni'; + +/** + * + * @export + * @interface ShareRequestBaseDetails + */ +export interface ShareRequestBaseDetails { + /** + * + * @type {string} + * @memberof ShareRequestBaseDetails + */ + id: string; + /** + * + * @type {Date} + * @memberof ShareRequestBaseDetails + */ + createdOn: Date; + /** + * + * @type {GenericIni} + * @memberof ShareRequestBaseDetails + */ + owner: GenericIni; + /** + * + * @type {GenericIni} + * @memberof ShareRequestBaseDetails + */ + sharedWith: GenericIni; + /** + * + * @type {Array} + * @memberof ShareRequestBaseDetails + */ + shockers: Array; +} + +/** + * Check if a given object implements the ShareRequestBaseDetails interface. + */ +export function instanceOfShareRequestBaseDetails(value: object): value is ShareRequestBaseDetails { + if (!('id' in value) || value['id'] === undefined) return false; + if (!('createdOn' in value) || value['createdOn'] === undefined) return false; + if (!('owner' in value) || value['owner'] === undefined) return false; + if (!('sharedWith' in value) || value['sharedWith'] === undefined) return false; + if (!('shockers' in value) || value['shockers'] === undefined) return false; + return true; +} + +export function ShareRequestBaseDetailsFromJSON(json: any): ShareRequestBaseDetails { + return ShareRequestBaseDetailsFromJSONTyped(json, false); +} + +export function ShareRequestBaseDetailsFromJSONTyped(json: any, ignoreDiscriminator: boolean): ShareRequestBaseDetails { + if (json == null) { + return json; + } + return { + + 'id': json['id'], + 'createdOn': (new Date(json['createdOn'])), + 'owner': GenericIniFromJSON(json['owner']), + 'sharedWith': GenericIniFromJSON(json['sharedWith']), + 'shockers': ((json['shockers'] as Array).map(ShockerPermLimitPairWithIdFromJSON)), + }; +} + +export function ShareRequestBaseDetailsToJSON(json: any): ShareRequestBaseDetails { + return ShareRequestBaseDetailsToJSONTyped(json, false); +} + +export function ShareRequestBaseDetailsToJSONTyped(value?: ShareRequestBaseDetails | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'id': value['id'], + 'createdOn': ((value['createdOn']).toISOString()), + 'owner': GenericIniToJSON(value['owner']), + 'sharedWith': GenericIniToJSON(value['sharedWith']), + 'shockers': ((value['shockers'] as Array).map(ShockerPermLimitPairWithIdToJSON)), + }; +} + diff --git a/src/lib/api/internal/v2/models/ShareRequestBaseItem.ts b/src/lib/api/internal/v2/models/ShareRequestBaseItem.ts new file mode 100644 index 00000000..2f8bd8de --- /dev/null +++ b/src/lib/api/internal/v2/models/ShareRequestBaseItem.ts @@ -0,0 +1,117 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ShareRequestCounts } from './ShareRequestCounts'; +import { + ShareRequestCountsFromJSON, + ShareRequestCountsFromJSONTyped, + ShareRequestCountsToJSON, + ShareRequestCountsToJSONTyped, +} from './ShareRequestCounts'; +import type { GenericIni } from './GenericIni'; +import { + GenericIniFromJSON, + GenericIniFromJSONTyped, + GenericIniToJSON, + GenericIniToJSONTyped, +} from './GenericIni'; + +/** + * + * @export + * @interface ShareRequestBaseItem + */ +export interface ShareRequestBaseItem { + /** + * + * @type {string} + * @memberof ShareRequestBaseItem + */ + id: string; + /** + * + * @type {Date} + * @memberof ShareRequestBaseItem + */ + createdOn: Date; + /** + * + * @type {GenericIni} + * @memberof ShareRequestBaseItem + */ + owner: GenericIni; + /** + * + * @type {GenericIni} + * @memberof ShareRequestBaseItem + */ + sharedWith: GenericIni; + /** + * + * @type {ShareRequestCounts} + * @memberof ShareRequestBaseItem + */ + counts: ShareRequestCounts; +} + +/** + * Check if a given object implements the ShareRequestBaseItem interface. + */ +export function instanceOfShareRequestBaseItem(value: object): value is ShareRequestBaseItem { + if (!('id' in value) || value['id'] === undefined) return false; + if (!('createdOn' in value) || value['createdOn'] === undefined) return false; + if (!('owner' in value) || value['owner'] === undefined) return false; + if (!('sharedWith' in value) || value['sharedWith'] === undefined) return false; + if (!('counts' in value) || value['counts'] === undefined) return false; + return true; +} + +export function ShareRequestBaseItemFromJSON(json: any): ShareRequestBaseItem { + return ShareRequestBaseItemFromJSONTyped(json, false); +} + +export function ShareRequestBaseItemFromJSONTyped(json: any, ignoreDiscriminator: boolean): ShareRequestBaseItem { + if (json == null) { + return json; + } + return { + + 'id': json['id'], + 'createdOn': (new Date(json['createdOn'])), + 'owner': GenericIniFromJSON(json['owner']), + 'sharedWith': GenericIniFromJSON(json['sharedWith']), + 'counts': ShareRequestCountsFromJSON(json['counts']), + }; +} + +export function ShareRequestBaseItemToJSON(json: any): ShareRequestBaseItem { + return ShareRequestBaseItemToJSONTyped(json, false); +} + +export function ShareRequestBaseItemToJSONTyped(value?: ShareRequestBaseItem | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'id': value['id'], + 'createdOn': ((value['createdOn']).toISOString()), + 'owner': GenericIniToJSON(value['owner']), + 'sharedWith': GenericIniToJSON(value['sharedWith']), + 'counts': ShareRequestCountsToJSON(value['counts']), + }; +} + diff --git a/src/lib/api/internal/v2/models/ShareRequestCounts.ts b/src/lib/api/internal/v2/models/ShareRequestCounts.ts new file mode 100644 index 00000000..53213724 --- /dev/null +++ b/src/lib/api/internal/v2/models/ShareRequestCounts.ts @@ -0,0 +1,66 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface ShareRequestCounts + */ +export interface ShareRequestCounts { + /** + * + * @type {number} + * @memberof ShareRequestCounts + */ + shockers: number; +} + +/** + * Check if a given object implements the ShareRequestCounts interface. + */ +export function instanceOfShareRequestCounts(value: object): value is ShareRequestCounts { + if (!('shockers' in value) || value['shockers'] === undefined) return false; + return true; +} + +export function ShareRequestCountsFromJSON(json: any): ShareRequestCounts { + return ShareRequestCountsFromJSONTyped(json, false); +} + +export function ShareRequestCountsFromJSONTyped(json: any, ignoreDiscriminator: boolean): ShareRequestCounts { + if (json == null) { + return json; + } + return { + + 'shockers': json['shockers'], + }; +} + +export function ShareRequestCountsToJSON(json: any): ShareRequestCounts { + return ShareRequestCountsToJSONTyped(json, false); +} + +export function ShareRequestCountsToJSONTyped(value?: ShareRequestCounts | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'shockers': value['shockers'], + }; +} + diff --git a/src/lib/api/internal/v2/models/ShockerLimits.ts b/src/lib/api/internal/v2/models/ShockerLimits.ts new file mode 100644 index 00000000..cd9dba44 --- /dev/null +++ b/src/lib/api/internal/v2/models/ShockerLimits.ts @@ -0,0 +1,75 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface ShockerLimits + */ +export interface ShockerLimits { + /** + * + * @type {number} + * @memberof ShockerLimits + */ + intensity: number | null; + /** + * + * @type {number} + * @memberof ShockerLimits + */ + duration: number | null; +} + +/** + * Check if a given object implements the ShockerLimits interface. + */ +export function instanceOfShockerLimits(value: object): value is ShockerLimits { + if (!('intensity' in value) || value['intensity'] === undefined) return false; + if (!('duration' in value) || value['duration'] === undefined) return false; + return true; +} + +export function ShockerLimitsFromJSON(json: any): ShockerLimits { + return ShockerLimitsFromJSONTyped(json, false); +} + +export function ShockerLimitsFromJSONTyped(json: any, ignoreDiscriminator: boolean): ShockerLimits { + if (json == null) { + return json; + } + return { + + 'intensity': json['intensity'], + 'duration': json['duration'], + }; +} + +export function ShockerLimitsToJSON(json: any): ShockerLimits { + return ShockerLimitsToJSONTyped(json, false); +} + +export function ShockerLimitsToJSONTyped(value?: ShockerLimits | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'intensity': value['intensity'], + 'duration': value['duration'], + }; +} + diff --git a/src/lib/api/internal/v2/models/ShockerPermLimitPairWithId.ts b/src/lib/api/internal/v2/models/ShockerPermLimitPairWithId.ts new file mode 100644 index 00000000..736c1b4b --- /dev/null +++ b/src/lib/api/internal/v2/models/ShockerPermLimitPairWithId.ts @@ -0,0 +1,98 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +import type { ShockerPermissions } from './ShockerPermissions'; +import { + ShockerPermissionsFromJSON, + ShockerPermissionsFromJSONTyped, + ShockerPermissionsToJSON, + ShockerPermissionsToJSONTyped, +} from './ShockerPermissions'; +import type { ShockerLimits } from './ShockerLimits'; +import { + ShockerLimitsFromJSON, + ShockerLimitsFromJSONTyped, + ShockerLimitsToJSON, + ShockerLimitsToJSONTyped, +} from './ShockerLimits'; + +/** + * + * @export + * @interface ShockerPermLimitPairWithId + */ +export interface ShockerPermLimitPairWithId { + /** + * + * @type {ShockerPermissions} + * @memberof ShockerPermLimitPairWithId + */ + permissions: ShockerPermissions; + /** + * + * @type {ShockerLimits} + * @memberof ShockerPermLimitPairWithId + */ + limits: ShockerLimits; + /** + * + * @type {string} + * @memberof ShockerPermLimitPairWithId + */ + id?: string; +} + +/** + * Check if a given object implements the ShockerPermLimitPairWithId interface. + */ +export function instanceOfShockerPermLimitPairWithId(value: object): value is ShockerPermLimitPairWithId { + if (!('permissions' in value) || value['permissions'] === undefined) return false; + if (!('limits' in value) || value['limits'] === undefined) return false; + return true; +} + +export function ShockerPermLimitPairWithIdFromJSON(json: any): ShockerPermLimitPairWithId { + return ShockerPermLimitPairWithIdFromJSONTyped(json, false); +} + +export function ShockerPermLimitPairWithIdFromJSONTyped(json: any, ignoreDiscriminator: boolean): ShockerPermLimitPairWithId { + if (json == null) { + return json; + } + return { + + 'permissions': ShockerPermissionsFromJSON(json['permissions']), + 'limits': ShockerLimitsFromJSON(json['limits']), + 'id': json['id'] == null ? undefined : json['id'], + }; +} + +export function ShockerPermLimitPairWithIdToJSON(json: any): ShockerPermLimitPairWithId { + return ShockerPermLimitPairWithIdToJSONTyped(json, false); +} + +export function ShockerPermLimitPairWithIdToJSONTyped(value?: ShockerPermLimitPairWithId | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'permissions': ShockerPermissionsToJSON(value['permissions']), + 'limits': ShockerLimitsToJSON(value['limits']), + 'id': value['id'], + }; +} + diff --git a/src/lib/api/internal/v2/models/ShockerPermissions.ts b/src/lib/api/internal/v2/models/ShockerPermissions.ts new file mode 100644 index 00000000..9cc15121 --- /dev/null +++ b/src/lib/api/internal/v2/models/ShockerPermissions.ts @@ -0,0 +1,92 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * OpenShock.API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 2 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface ShockerPermissions + */ +export interface ShockerPermissions { + /** + * + * @type {boolean} + * @memberof ShockerPermissions + */ + vibrate: boolean; + /** + * + * @type {boolean} + * @memberof ShockerPermissions + */ + sound: boolean; + /** + * + * @type {boolean} + * @memberof ShockerPermissions + */ + shock: boolean; + /** + * + * @type {boolean} + * @memberof ShockerPermissions + */ + live?: boolean; +} + +/** + * Check if a given object implements the ShockerPermissions interface. + */ +export function instanceOfShockerPermissions(value: object): value is ShockerPermissions { + if (!('vibrate' in value) || value['vibrate'] === undefined) return false; + if (!('sound' in value) || value['sound'] === undefined) return false; + if (!('shock' in value) || value['shock'] === undefined) return false; + return true; +} + +export function ShockerPermissionsFromJSON(json: any): ShockerPermissions { + return ShockerPermissionsFromJSONTyped(json, false); +} + +export function ShockerPermissionsFromJSONTyped(json: any, ignoreDiscriminator: boolean): ShockerPermissions { + if (json == null) { + return json; + } + return { + + 'vibrate': json['vibrate'], + 'sound': json['sound'], + 'shock': json['shock'], + 'live': json['live'] == null ? undefined : json['live'], + }; +} + +export function ShockerPermissionsToJSON(json: any): ShockerPermissions { + return ShockerPermissionsToJSONTyped(json, false); +} + +export function ShockerPermissionsToJSONTyped(value?: ShockerPermissions | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'vibrate': value['vibrate'], + 'sound': value['sound'], + 'shock': value['shock'], + 'live': value['live'], + }; +} + diff --git a/src/lib/api/internal/v2/models/SignUpV2.ts b/src/lib/api/internal/v2/models/SignUpV2.ts index b48cacdd..764d48ac 100644 --- a/src/lib/api/internal/v2/models/SignUpV2.ts +++ b/src/lib/api/internal/v2/models/SignUpV2.ts @@ -24,19 +24,19 @@ export interface SignUpV2 { * @type {string} * @memberof SignUpV2 */ - username: string | null; + username: string; /** * * @type {string} * @memberof SignUpV2 */ - password: string | null; + password: string; /** * * @type {string} * @memberof SignUpV2 */ - email: string | null; + email: string; /** * * @type {string} @@ -73,11 +73,11 @@ export function SignUpV2FromJSONTyped(json: any, ignoreDiscriminator: boolean): }; } - export function SignUpV2ToJSON(json: any): SignUpV2 { - return SignUpV2ToJSONTyped(json, false); - } +export function SignUpV2ToJSON(json: any): SignUpV2 { + return SignUpV2ToJSONTyped(json, false); +} - export function SignUpV2ToJSONTyped(value?: SignUpV2 | null, ignoreDiscriminator: boolean = false): any { +export function SignUpV2ToJSONTyped(value?: SignUpV2 | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v2/models/UsernameAvailability.ts b/src/lib/api/internal/v2/models/UsernameAvailability.ts index 3426785e..2dcd256f 100644 --- a/src/lib/api/internal/v2/models/UsernameAvailability.ts +++ b/src/lib/api/internal/v2/models/UsernameAvailability.ts @@ -18,10 +18,9 @@ * @enum {string} */ export enum UsernameAvailability { - available = 'Available', - taken = 'Taken', - invalid = 'Invalid', - unknownDefaultOpenApi = '11184809' + Available = 'Available', + Taken = 'Taken', + Invalid = 'Invalid' } diff --git a/src/lib/api/internal/v2/models/UsernameCheckResponse.ts b/src/lib/api/internal/v2/models/UsernameCheckResponse.ts index 4ed35b8c..e6256aad 100644 --- a/src/lib/api/internal/v2/models/UsernameCheckResponse.ts +++ b/src/lib/api/internal/v2/models/UsernameCheckResponse.ts @@ -73,11 +73,11 @@ export function UsernameCheckResponseFromJSONTyped(json: any, ignoreDiscriminato }; } - export function UsernameCheckResponseToJSON(json: any): UsernameCheckResponse { - return UsernameCheckResponseToJSONTyped(json, false); - } +export function UsernameCheckResponseToJSON(json: any): UsernameCheckResponse { + return UsernameCheckResponseToJSONTyped(json, false); +} - export function UsernameCheckResponseToJSONTyped(value?: UsernameCheckResponse | null, ignoreDiscriminator: boolean = false): any { +export function UsernameCheckResponseToJSONTyped(value?: UsernameCheckResponse | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v2/models/UsernameCheckResponseBaseResponse.ts b/src/lib/api/internal/v2/models/UsernameCheckResponseBaseResponse.ts deleted file mode 100644 index 9d0385f3..00000000 --- a/src/lib/api/internal/v2/models/UsernameCheckResponseBaseResponse.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * OpenShock.API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 2 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { mapValues } from '../runtime'; -import type { UsernameCheckResponse } from './UsernameCheckResponse'; -import { - UsernameCheckResponseFromJSON, - UsernameCheckResponseFromJSONTyped, - UsernameCheckResponseToJSON, -} from './UsernameCheckResponse'; - -/** - * - * @export - * @interface UsernameCheckResponseBaseResponse - */ -export interface UsernameCheckResponseBaseResponse { - /** - * - * @type {string} - * @memberof UsernameCheckResponseBaseResponse - */ - message?: string | null; - /** - * - * @type {UsernameCheckResponse} - * @memberof UsernameCheckResponseBaseResponse - */ - data?: UsernameCheckResponse; -} - -/** - * Check if a given object implements the UsernameCheckResponseBaseResponse interface. - */ -export function instanceOfUsernameCheckResponseBaseResponse(value: object): value is UsernameCheckResponseBaseResponse { - return true; -} - -export function UsernameCheckResponseBaseResponseFromJSON(json: any): UsernameCheckResponseBaseResponse { - return UsernameCheckResponseBaseResponseFromJSONTyped(json, false); -} - -export function UsernameCheckResponseBaseResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): UsernameCheckResponseBaseResponse { - if (json == null) { - return json; - } - return { - - 'message': json['message'] == null ? undefined : json['message'], - 'data': json['data'] == null ? undefined : UsernameCheckResponseFromJSON(json['data']), - }; -} - -export function UsernameCheckResponseBaseResponseToJSON(value?: UsernameCheckResponseBaseResponse | null): any { - if (value == null) { - return value; - } - return { - - 'message': value['message'], - 'data': UsernameCheckResponseToJSON(value['data']), - }; -} - diff --git a/src/lib/api/internal/v2/models/UsernameError.ts b/src/lib/api/internal/v2/models/UsernameError.ts index a3bcd627..3fef4a39 100644 --- a/src/lib/api/internal/v2/models/UsernameError.ts +++ b/src/lib/api/internal/v2/models/UsernameError.ts @@ -32,7 +32,7 @@ export interface UsernameError { * @type {string} * @memberof UsernameError */ - message: string | null; + message: string; /** * * @type {UsernameErrorType} @@ -67,11 +67,11 @@ export function UsernameErrorFromJSONTyped(json: any, ignoreDiscriminator: boole }; } - export function UsernameErrorToJSON(json: any): UsernameError { - return UsernameErrorToJSONTyped(json, false); - } +export function UsernameErrorToJSON(json: any): UsernameError { + return UsernameErrorToJSONTyped(json, false); +} - export function UsernameErrorToJSONTyped(value?: UsernameError | null, ignoreDiscriminator: boolean = false): any { +export function UsernameErrorToJSONTyped(value?: UsernameError | null, ignoreDiscriminator: boolean = false): any { if (value == null) { return value; } diff --git a/src/lib/api/internal/v2/models/UsernameErrorType.ts b/src/lib/api/internal/v2/models/UsernameErrorType.ts index cda756dd..24c696d1 100644 --- a/src/lib/api/internal/v2/models/UsernameErrorType.ts +++ b/src/lib/api/internal/v2/models/UsernameErrorType.ts @@ -18,12 +18,11 @@ * @enum {string} */ export enum UsernameErrorType { - tooShort = 'TooShort', - tooLong = 'TooLong', - startOrEndWithWhitespace = 'StartOrEndWithWhitespace', - resembleEmail = 'ResembleEmail', - obnoxiousCharacters = 'ObnoxiousCharacters', - unknownDefaultOpenApi = '11184809' + TooShort = 'TooShort', + TooLong = 'TooLong', + StartOrEndWithWhitespace = 'StartOrEndWithWhitespace', + ResembleEmail = 'ResembleEmail', + ObnoxiousCharacters = 'ObnoxiousCharacters' } diff --git a/src/lib/api/internal/v2/models/index.ts b/src/lib/api/internal/v2/models/index.ts index 8035809e..e3567c38 100644 --- a/src/lib/api/internal/v2/models/index.ts +++ b/src/lib/api/internal/v2/models/index.ts @@ -4,10 +4,19 @@ export * from './ChangeUsernameRequest'; export * from './Control'; export * from './ControlRequest'; export * from './ControlType'; +export * from './CreateShareRequest'; +export * from './GenericIni'; export * from './HubCreateRequest'; export * from './LoginV2'; export * from './ObjectBaseResponse'; export * from './OpenShockProblem'; +export * from './ShareInfo'; +export * from './ShareRequestBaseDetails'; +export * from './ShareRequestBaseItem'; +export * from './ShareRequestCounts'; +export * from './ShockerLimits'; +export * from './ShockerPermLimitPairWithId'; +export * from './ShockerPermissions'; export * from './SignUpV2'; export * from './UsernameAvailability'; export * from './UsernameCheckResponse'; diff --git a/src/lib/api/internal/v2/runtime.ts b/src/lib/api/internal/v2/runtime.ts index 1e7de6f2..229b7f23 100644 --- a/src/lib/api/internal/v2/runtime.ts +++ b/src/lib/api/internal/v2/runtime.ts @@ -337,6 +337,11 @@ function querystringSingleKey(key: string, value: string | number | null | undef return `${encodeURIComponent(fullKey)}=${encodeURIComponent(String(value))}`; } +export function exists(json: any, key: string) { + const value = json[key]; + return value !== null && value !== undefined; +} + export function mapValues(data: any, fn: (item: any) => any) { return Object.keys(data).reduce( (acc, key) => ({ ...acc, [key]: fn(data[key]) }), diff --git a/src/lib/api/pwnedPasswords.ts b/src/lib/api/pwnedPasswords.ts index 3cf1e238..72ed22e1 100644 --- a/src/lib/api/pwnedPasswords.ts +++ b/src/lib/api/pwnedPasswords.ts @@ -1,36 +1,30 @@ -import { sha1 } from "js-sha1"; +import SHA1 from 'crypto-js/sha1'; -export async function fetchPasswordsRangeRaw(hashPrefix: string): Promise { - const response = await fetch(`https://api.pwnedpasswords.com/range/${hashPrefix}`); - - if (!response.ok) { - throw new Error('Failed to fetch pwned passwords range'); +export async function checkPwnedCount(password: string): Promise { + if (!password) { + throw new Error('Password cannot be empty'); } - return await response.text(); -} - + const hash = SHA1(password).toString(); + const hashPrefix = hash.substring(0, 5); + const hashSuffix = hash.substring(5).toUpperCase(); -export async function fetchPasswordsRange(hashPrefix: string): Promise<{ hash: string; count: number }[]> { - const raw = await fetchPasswordsRangeRaw(hashPrefix); + let raw: string; + try { + const response = await fetch(`https://api.pwnedpasswords.com/range/${hashPrefix}`); - return raw - .split('\n') - .filter((line) => line.length > 0) - .map((line) => { - const [hash, count] = line.trim().split(':'); - return { hash, count: parseInt(count) }; - }); -} + raw = await response.text(); + } catch { + throw new Error('Error while fetching pwned passwords range'); + } -export async function checkPwnedCount(password: string): Promise { - const hash = sha1(password).toUpperCase(); - const hashPrefix = hash.substring(0, 5); - const hashSuffix = hash.substring(5); + const match = raw.split('\n').find((line) => line.startsWith(hashSuffix)); - const range = await fetchPasswordsRange(hashPrefix); + if (match) { + const [, count] = match.split(':'); - const match = range.find((hash) => hash.hash == hashSuffix); + return parseInt(count); + } - return match?.count || 0; + return 0; } diff --git a/src/lib/components/AbsolutelySureButton.svelte b/src/lib/components/AbsolutelySureButton.svelte new file mode 100644 index 00000000..5c41d5c8 --- /dev/null +++ b/src/lib/components/AbsolutelySureButton.svelte @@ -0,0 +1,128 @@ + + + + + diff --git a/src/lib/components/ControlModules/ClassicControlModule.svelte b/src/lib/components/ControlModules/ClassicControlModule.svelte index c4eb68ce..c66f4c50 100644 --- a/src/lib/components/ControlModules/ClassicControlModule.svelte +++ b/src/lib/components/ControlModules/ClassicControlModule.svelte @@ -1,26 +1,28 @@

{shocker.name}

@@ -30,30 +32,33 @@
-
+
- + + - + + - + +
diff --git a/src/lib/components/ControlModules/Internal/CircleSlider.svelte b/src/lib/components/ControlModules/Internal/CircleSlider.svelte index 9c30d281..f2f67e12 100644 --- a/src/lib/components/ControlModules/Internal/CircleSlider.svelte +++ b/src/lib/components/ControlModules/Internal/CircleSlider.svelte @@ -29,8 +29,7 @@ let { name, value = $bindable(), min, max, step, tabindex = undefined }: Props = $props(); - let canvasHandle: HTMLDivElement | undefined = $state(); - let sliderHandle: HTMLDivElement | undefined = $state(); + let canvasHandle = $state(); function stupidUnfloatHack(value: number) { // This is a stupid hack to avoid floating point errors, needed to make UI not look like shit @@ -92,13 +91,6 @@ // Update visual progress let degrees = $derived(angleStart + invLerp(min, max, $animatedValue) * angleRange); let progressProps = $derived(calcSvgArcProps(center, angleStart, degrees, radius, 10)); - - $effect(() => { - if (!sliderHandle) return; - - sliderHandle.style.left = `${60 + getCircleX(60, degrees)}px`; // TODO: Avoid using pixel values - sliderHandle.style.top = `${60 + getCircleY(60, degrees)}px`; // TODO: Avoid using pixel values - });
@@ -108,7 +100,7 @@ {...calcSvgArcProps(center, angleStart, angleEnd, radius, 20)} fill="none" stroke-linecap="round" - style="stroke: rgb(27, 29, 30)" + style:stroke="rgb(27, 29, 30)" ontouchstart={trackingStarted} onmousedown={trackingStarted} aria-hidden="true" @@ -117,7 +109,7 @@ {...progressProps} fill="none" stroke-linecap="round" - class="stroke-secondary-500" + style:stroke="rgb(0, 122, 255)" ontouchstart={trackingStarted} onmousedown={trackingStarted} id={guageId} @@ -126,7 +118,8 @@
-
@@ -146,19 +139,19 @@ diff --git a/src/lib/components/ControlModules/MapControlModule.svelte b/src/lib/components/ControlModules/MapControlModule.svelte index 8113d9d7..15f1301e 100644 --- a/src/lib/components/ControlModules/MapControlModule.svelte +++ b/src/lib/components/ControlModules/MapControlModule.svelte @@ -1,18 +1,19 @@ - + diff --git a/src/lib/components/ControlModules/ModuleType.ts b/src/lib/components/ControlModules/ModuleType.ts index ad977e11..61b3a751 100644 --- a/src/lib/components/ControlModules/ModuleType.ts +++ b/src/lib/components/ControlModules/ModuleType.ts @@ -3,4 +3,4 @@ export enum ModuleType { RichControlModule, SimpleControlModule, MapControlModule, -}; +} diff --git a/src/lib/components/ControlModules/RichControlModule.svelte b/src/lib/components/ControlModules/RichControlModule.svelte index 4f1b74e1..e269347e 100644 --- a/src/lib/components/ControlModules/RichControlModule.svelte +++ b/src/lib/components/ControlModules/RichControlModule.svelte @@ -1,62 +1,67 @@

{shocker.name}

-
- +
+

{intensity}%

- +

{duration}s

-
+
- + + - + + - + +
diff --git a/src/lib/components/ControlModules/SimpleControlHeader.svelte b/src/lib/components/ControlModules/SimpleControlHeader.svelte index ac7ab68c..4fccc440 100644 --- a/src/lib/components/ControlModules/SimpleControlHeader.svelte +++ b/src/lib/components/ControlModules/SimpleControlHeader.svelte @@ -1,27 +1,39 @@
-
- +
+

{shockIntensity}%

- +

{vibrationIntensity}%

- +

{duration}s

- - - +
+ + + +
diff --git a/src/lib/components/ControlModules/SimpleControlModule.svelte b/src/lib/components/ControlModules/SimpleControlModule.svelte index 6af0b180..e5557756 100644 --- a/src/lib/components/ControlModules/SimpleControlModule.svelte +++ b/src/lib/components/ControlModules/SimpleControlModule.svelte @@ -1,50 +1,55 @@
-

{shocker.name}

+

{shocker.name}

-
+
- + + - + + - + +
diff --git a/src/lib/components/EspTool/FirmwareSelector.svelte b/src/lib/components/EspTool/FirmwareSelector.svelte deleted file mode 100644 index bc4c36fd..00000000 --- a/src/lib/components/EspTool/FirmwareSelector.svelte +++ /dev/null @@ -1,77 +0,0 @@ - - -
- Select Channel - - {#each Channels as key} - - {key.charAt(0).toUpperCase() + key.slice(1)} - - {/each} - - -
- {#if selectedChannel === 'stable'} - -

This is the recommended channel.

- {:else if selectedChannel === 'beta'} - -

This channel might contain bugs.

- {:else} - -

Avoid this channel unless you know what you're doing.

- {/if} -
-
- - diff --git a/src/lib/components/EspTool/SerialPortSelector.svelte b/src/lib/components/EspTool/SerialPortSelector.svelte deleted file mode 100644 index 6f809f26..00000000 --- a/src/lib/components/EspTool/SerialPortSelector.svelte +++ /dev/null @@ -1,150 +0,0 @@ - - - - -
- {#if !browser} -

Loading...

- {:else if 'serial' in navigator} -
-

Select your device

- -
-
- {#if port === null} -

Please connect your device to your computer.

-

If you don't see your device in the popup, then you may need to install drivers.

- {:else} -

Device connected

-

- HardwareID: {GetHardwareID(port)} -

- {/if} - {#if errorMessage !== null && errorMessage.name !== 'NotFoundError'} -
- -

Error: {errorMessage.message}

-
- {/if} -
-
- {#if port === null} - - - {:else} - - {/if} -
- {:else if ['Chrome', 'Edge', 'Opera'].includes(Bowser.getParser(window.navigator.userAgent).getBrowserName())} -

Your browser version does not support this feature.

-

Please update your browser to the latest version.

- {:else} -

Your browser does not support this feature.

-

Please use one of the following browsers:

- - {/if} -
diff --git a/src/lib/components/LightSwitch.svelte b/src/lib/components/LightSwitch.svelte index e69de29b..90c9d966 100644 --- a/src/lib/components/LightSwitch.svelte +++ b/src/lib/components/LightSwitch.svelte @@ -0,0 +1,66 @@ + + + pendingScheme !== undefined, handleOpenChanged}> + + + Switch to light mode + + Warning: You are about to switch to light mode. +
+ Are you sure you want to do this? +
+
+ +
+
+ + + + + + Toggle theme + + + evaluateLightSwitch('light')}>Light + evaluateLightSwitch('dark')}>Dark + evaluateLightSwitch('system')}>System + + diff --git a/src/lib/components/Turnstile.svelte b/src/lib/components/Turnstile.svelte index f1d9966f..e7f5ed10 100644 --- a/src/lib/components/Turnstile.svelte +++ b/src/lib/components/Turnstile.svelte @@ -1,10 +1,14 @@
- {#if isLoading} + {#if widgetState != 'mounted'}
{#if dev} - + Turnstile disabled {:else} - + Loading... {/if} diff --git a/src/lib/components/input/EmailInput.svelte b/src/lib/components/input/EmailInput.svelte index 03b44f84..9d5ee595 100644 --- a/src/lib/components/input/EmailInput.svelte +++ b/src/lib/components/input/EmailInput.svelte @@ -1,10 +1,10 @@ @@ -50,7 +45,7 @@ {autocomplete} bind:value {validationResult} - {icon} + {Icon} {button} {oninput} /> diff --git a/src/lib/components/input/PasswordInput.svelte b/src/lib/components/input/PasswordInput.svelte index b3261fdf..1340bcab 100644 --- a/src/lib/components/input/PasswordInput.svelte +++ b/src/lib/components/input/PasswordInput.svelte @@ -3,14 +3,13 @@ import { handleApiError } from '$lib/errorhandling/apiErrorHandling'; import { validatePassword } from '$lib/inputvalidation/passwordValidator'; import type { ValidationResult } from '$lib/types/ValidationResult'; - import { randStr } from '$lib/utils/rand'; - import { type PopupSettings, getToastStore } from '@skeletonlabs/skeleton'; - import TextInput from './TextInput.svelte'; import type { FullAutoFill } from 'svelte/elements'; - import PasswordStrengthMeter from './impl/PasswordStrengthMeter.svelte'; import type { ButtonSettings } from './impl/ButtonSettings'; + import PasswordStrengthMeter from './impl/PasswordStrengthMeter.svelte'; + import TextInput from './TextInput.svelte'; + import type { AnyComponent } from '$lib/types/AnyComponent'; - const toastStore = getToastStore(); + import { Eye, EyeOff } from 'lucide-svelte'; interface Props { label: string; @@ -21,7 +20,7 @@ valid?: boolean; validate?: boolean | 'string' | 'pwned' | ValidationResult | null; showStrengthMeter?: boolean; - icon?: `fa-${string}`; + Icon?: AnyComponent; oninput?: (value: string) => void | undefined; } @@ -34,17 +33,11 @@ valid = $bindable(false), validate = false, showStrengthMeter = false, - icon, - oninput + Icon, + oninput, }: Props = $props(); - const popupSettings: PopupSettings = { - event: 'focus-blur', - target: 'popupStrengthMeter-' + randStr(8), - placement: 'left-start', - }; - - let validationResult: ValidationResult | null = $state(null); + let validationResult = $state(null); let passwordDebounce: ReturnType | null = null; function checkHIBP(str: string) { // Stop the previous debounce timer if it exists @@ -65,7 +58,7 @@ // Password has been pwned, change the validation result validationResult = { valid: false, - message: `Password detected in ${pwnedCount} data breaches`, + message: `Password detected in ${pwnedCount} data ${pwnedCount == 1 ? 'breach' : 'breaches'}`, link: { text: "What's this?", href: 'https://haveibeenpwned.com/Passwords', @@ -77,7 +70,7 @@ } } catch (e) { // Show an error toast - await handleApiError(e, toastStore); + await handleApiError(e); // We shouldnt block the user from submitting the form if the pwned password check fails validationResult = { valid: true }; @@ -112,7 +105,7 @@ }); let button: ButtonSettings = $derived({ - icon: valueShown ? 'fa-eye-slash' : 'fa-eye', + Icon: valueShown ? EyeOff : Eye, class: 'cursor-pointer', onClick: () => (valueShown = !valueShown), }); @@ -125,14 +118,13 @@ {autocomplete} bind:value {validationResult} - {icon} + {Icon} {button} - {popupSettings} {oninput} > {#snippet popup()} {#if showStrengthMeter} - + {/if} {/snippet} diff --git a/src/lib/components/input/TextInput.svelte b/src/lib/components/input/TextInput.svelte index 023ae17f..3a503eb5 100644 --- a/src/lib/components/input/TextInput.svelte +++ b/src/lib/components/input/TextInput.svelte @@ -1,10 +1,13 @@
-
- {#if icon} -
+
+ {#if Icon} + {/if} - {#if button} - + {/if}
@@ -107,6 +93,10 @@
{/if} {#if popup} - {@render popup()} + + + {@render popup()} + + {/if} diff --git a/src/lib/components/input/UsernameInput.svelte b/src/lib/components/input/UsernameInput.svelte index c19f84b3..1f72b872 100644 --- a/src/lib/components/input/UsernameInput.svelte +++ b/src/lib/components/input/UsernameInput.svelte @@ -1,19 +1,17 @@ diff --git a/src/lib/components/input/impl/ButtonSettings.ts b/src/lib/components/input/impl/ButtonSettings.ts index cb81a125..6fb3288f 100644 --- a/src/lib/components/input/impl/ButtonSettings.ts +++ b/src/lib/components/input/impl/ButtonSettings.ts @@ -1,2 +1,5 @@ -export type ButtonSettings = { text: string; class?: string; submits?: boolean; onClick: () => void } - | { icon: `fa-${string}`; class?: string; submits?: boolean; onClick: () => void } +import type { AnyComponent } from "$lib/types/AnyComponent"; + +export type ButtonSettings = + | { text: string; class?: string; submits?: boolean; onClick: () => void } + | { Icon: AnyComponent; class?: string; submits?: boolean; onClick: () => void }; diff --git a/src/lib/components/input/impl/PasswordStrengthMeter.svelte b/src/lib/components/input/impl/PasswordStrengthMeter.svelte index 65a3cd08..cdad0c81 100644 --- a/src/lib/components/input/impl/PasswordStrengthMeter.svelte +++ b/src/lib/components/input/impl/PasswordStrengthMeter.svelte @@ -1,38 +1,32 @@ -
+

Password strength:

-

{strength.text}

+

{text}

-
+
- diff --git a/src/lib/components/layout/AppSidebar.svelte b/src/lib/components/layout/AppSidebar.svelte new file mode 100644 index 00000000..e880d8e4 --- /dev/null +++ b/src/lib/components/layout/AppSidebar.svelte @@ -0,0 +1,239 @@ + + +{#snippet menuSubItemSection(subItem: subItem)} + +
+ {subItem.name} + + +{/snippet} + +{#snippet menuSection(menu: Menu)} + + + {#snippet child({ props })} + + + {menu.name} + + {/snippet} + + + + {#if menu.subItems} + + {#each menu.subItems as subItem (subItem.name)} + {@render menuSubItemSection(subItem)} + {/each} + + {/if} +{/snippet} + +{#snippet groupContentSection(group: Group)} + + + {#each group.menus as menu (menu.name)} + {@render menuSection(menu)} + {/each} + + +{/snippet} + +{#snippet groupsSection(userRank: RankType, groups: Group[])} + {#each groups as group (group.title)} + {#if meetsReq(userRank, group)} + {#if group.collapsible === undefined} + + {group.title} + {@render groupContentSection(group)} + + {:else} + + + + {#snippet child({ props })} + + {group.title} + + + {/snippet} + + + {@render groupContentSection(group)} + + + + {/if} + {/if} + {/each} +{/snippet} + + + + + {@render groupsSection(currentUserRank, groups)} + + + {@render groupsSection(currentUserRank, footerGroups)} + + diff --git a/src/lib/components/layout/Footer.svelte b/src/lib/components/layout/Footer.svelte index 4259b374..38833ca3 100644 --- a/src/lib/components/layout/Footer.svelte +++ b/src/lib/components/layout/Footer.svelte @@ -1,13 +1,11 @@ -
+
+ diff --git a/src/lib/components/layout/Header.svelte b/src/lib/components/layout/Header.svelte index 27da8c11..52d13b53 100644 --- a/src/lib/components/layout/Header.svelte +++ b/src/lib/components/layout/Header.svelte @@ -1,65 +1,91 @@ {#snippet item(text: string, href: string)} - - {text} - -{/snippet} - -{#snippet brand(name: string, icon: `fa-${string}`, href: string)} - - - + {/snippet} - - {#snippet lead()} -
- +
+ {#if $UserStore.self} + + {/if} +
+ - {/snippet} - {#snippet trail()} + +
+ - - {#if $UserStore.self !== null} -
- User Avatar - -
-
- {@render item('Profile', '/profile')} - {@render item('Settings', '/settings')} - {@render item('Logout', '/logout')} -
-
+ + {#if $UserStore.self} + + + User Avatar + + + + + Profile + Settings + Logout + + + {:else} {@render item('Login', '/login')} {@render item('Sign Up', '/signup')}
- {@render brand('GitHub', 'fa-github', PUBLIC_GITHUB_PROJECT_URL)} - {@render brand('Discord', 'fa-discord', PUBLIC_DISCORD_INVITE_URL)} + + GitHub + + + Discord +
{/if} - {/snippet} - +
+
diff --git a/src/lib/components/layout/Route.ts b/src/lib/components/layout/Route.ts index 617798d0..95ed723c 100644 --- a/src/lib/components/layout/Route.ts +++ b/src/lib/components/layout/Route.ts @@ -1,13 +1,11 @@ -export interface RouteCategory - { - name: string - routes: Route[] - headerClass?: string - } +export interface RouteCategory { + name: string; + routes: Route[]; + headerClass?: string; +} -export interface Route - { - name: string - href: string - target?: string - } \ No newline at end of file +export interface Route { + name: string; + href: string; + target?: string; +} diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte deleted file mode 100644 index a6843673..00000000 --- a/src/lib/components/layout/Sidebar.svelte +++ /dev/null @@ -1,163 +0,0 @@ - - -{#snippet items(routes: Route[])} - {#each routes as route (route.href)} - {#if meetsReq($UserStore.self, route)} - - {#snippet lead()}{/snippet} - {route.name} - - {/if} - {/each} -{/snippet} - -{#snippet nestedSidebar(baseRoute: string, routes: RouteCategory[])} - {#if $page.url.pathname.startsWith(baseRoute)} -
- {#each routes as category} -

{category.name}

- - {/each} -
- {/if} -{/snippet} - -{#if $UserStore.self !== null && $signalr_state === HubConnectionState.Connected} -
- - {#snippet lead()}{@render items(leadRoutes)}{/snippet} - {#snippet trail()}{@render items(trailRoutes)}{/snippet} - - {@render nestedSidebar('/settings', settingsRoutes)} - {@render nestedSidebar('/admin', adminRoutes)} -
-{/if} diff --git a/src/lib/components/metadata/OpenGraphTags.svelte b/src/lib/components/metadata/OpenGraphTags.svelte index 33e25004..d0cb1f62 100644 --- a/src/lib/components/metadata/OpenGraphTags.svelte +++ b/src/lib/components/metadata/OpenGraphTags.svelte @@ -1,26 +1,26 @@ diff --git a/src/lib/components/metadata/Twitter/TwitterAppTags.svelte b/src/lib/components/metadata/Twitter/TwitterAppTags.svelte index b1df14ca..860175ff 100644 --- a/src/lib/components/metadata/Twitter/TwitterAppTags.svelte +++ b/src/lib/components/metadata/Twitter/TwitterAppTags.svelte @@ -6,12 +6,7 @@ googleplay?: { id: string; name: string; url: string }; } - let { - site, - iphone, - ipad, - googleplay - }: Props = $props(); + let { site, iphone, ipad, googleplay }: Props = $props(); diff --git a/src/lib/components/metadata/Twitter/TwitterPlayerTags.svelte b/src/lib/components/metadata/Twitter/TwitterPlayerTags.svelte index 971c0a6c..ca046631 100644 --- a/src/lib/components/metadata/Twitter/TwitterPlayerTags.svelte +++ b/src/lib/components/metadata/Twitter/TwitterPlayerTags.svelte @@ -9,13 +9,7 @@ player?: { type: 'iframe' | 'stream'; src: string; width: number; height: number }; } - let { - site, - description, - title, - image, - player - }: Props = $props(); + let { site, description, title, image, player }: Props = $props(); diff --git a/src/lib/components/metadata/Twitter/TwitterSummaryTags.svelte b/src/lib/components/metadata/Twitter/TwitterSummaryTags.svelte index efa8ebc5..7c8286b1 100644 --- a/src/lib/components/metadata/Twitter/TwitterSummaryTags.svelte +++ b/src/lib/components/metadata/Twitter/TwitterSummaryTags.svelte @@ -10,14 +10,7 @@ creator?: string | number; } - let { - type, - title, - description, - image, - site, - creator - }: Props = $props(); + let { type, title, description, image, site, creator }: Props = $props(); diff --git a/src/lib/components/metadata/Twitter/index.ts b/src/lib/components/metadata/Twitter/index.ts index 92e76286..dea413e3 100644 --- a/src/lib/components/metadata/Twitter/index.ts +++ b/src/lib/components/metadata/Twitter/index.ts @@ -1,3 +1,5 @@ -export * from './TwitterAppTags.svelte'; -export * from './TwitterPlayerTags.svelte'; -export * from './TwitterSummaryTags.svelte'; +import TwitterAppTags from './TwitterAppTags.svelte'; +import TwitterPlayerTags from './TwitterPlayerTags.svelte'; +import TwitterSummaryTags from './TwitterSummaryTags.svelte'; + +export { TwitterAppTags, TwitterPlayerTags, TwitterSummaryTags }; diff --git a/src/lib/components/metadata/index.ts b/src/lib/components/metadata/index.ts index 8bde6846..fc6adc3f 100644 --- a/src/lib/components/metadata/index.ts +++ b/src/lib/components/metadata/index.ts @@ -1,2 +1,5 @@ -export * from './Twitter'; -export * from './BasicTags.svelte'; +import BasicTags from './BasicTags.svelte'; +import OpenGraphTags from './OpenGraphTags.svelte'; +import { TwitterAppTags, TwitterPlayerTags, TwitterSummaryTags } from './Twitter'; + +export { BasicTags, OpenGraphTags, TwitterAppTags, TwitterPlayerTags, TwitterSummaryTags }; diff --git a/src/lib/components/svg/ChromeLogo.svelte b/src/lib/components/svg/ChromeLogo.svelte new file mode 100644 index 00000000..6115fbcc --- /dev/null +++ b/src/lib/components/svg/ChromeLogo.svelte @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/components/svg/CloudflareLogo.svelte b/src/lib/components/svg/CloudflareLogo.svelte index 8c6cd871..5a3a84de 100644 --- a/src/lib/components/svg/CloudflareLogo.svelte +++ b/src/lib/components/svg/CloudflareLogo.svelte @@ -1,7 +1,15 @@ + + + type Props = { + class?: string; + }; + + let props: Props = $props(); + + + + + + + diff --git a/src/lib/components/svg/EdgeLogo.svelte b/src/lib/components/svg/EdgeLogo.svelte new file mode 100644 index 00000000..a3678f80 --- /dev/null +++ b/src/lib/components/svg/EdgeLogo.svelte @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/components/svg/LoadingCircle.svelte b/src/lib/components/svg/LoadingCircle.svelte new file mode 100644 index 00000000..5684ab1a --- /dev/null +++ b/src/lib/components/svg/LoadingCircle.svelte @@ -0,0 +1,19 @@ +
+ + Loading... +
diff --git a/src/lib/components/svg/OperaLogo.svelte b/src/lib/components/svg/OperaLogo.svelte new file mode 100644 index 00000000..07a21466 --- /dev/null +++ b/src/lib/components/svg/OperaLogo.svelte @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/components/toasts/ToastStore.ts b/src/lib/components/toasts/ToastStore.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/src/lib/components/toasts/Toaster.svelte b/src/lib/components/toasts/Toaster.svelte deleted file mode 100644 index e69de29b..00000000 diff --git a/src/lib/components/ui/accordion/accordion-content.svelte b/src/lib/components/ui/accordion/accordion-content.svelte new file mode 100644 index 00000000..4cc5989e --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-content.svelte @@ -0,0 +1,24 @@ + + + +
+ {@render children?.()} +
+
diff --git a/src/lib/components/ui/accordion/accordion-item.svelte b/src/lib/components/ui/accordion/accordion-item.svelte new file mode 100644 index 00000000..852bcf3e --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-item.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/accordion/accordion-trigger.svelte b/src/lib/components/ui/accordion/accordion-trigger.svelte new file mode 100644 index 00000000..e0aa7b0e --- /dev/null +++ b/src/lib/components/ui/accordion/accordion-trigger.svelte @@ -0,0 +1,29 @@ + + + + svg]:rotate-180", + className + )} + {...restProps} + > + {@render children?.()} + + + diff --git a/src/lib/components/ui/accordion/index.ts b/src/lib/components/ui/accordion/index.ts new file mode 100644 index 00000000..ed492138 --- /dev/null +++ b/src/lib/components/ui/accordion/index.ts @@ -0,0 +1,17 @@ +import { Accordion as AccordionPrimitive } from "bits-ui"; +import Content from "./accordion-content.svelte"; +import Item from "./accordion-item.svelte"; +import Trigger from "./accordion-trigger.svelte"; +const Root = AccordionPrimitive.Root; + +export { + Root, + Content, + Item, + Trigger, + // + Root as Accordion, + Content as AccordionContent, + Item as AccordionItem, + Trigger as AccordionTrigger, +}; diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte new file mode 100644 index 00000000..22ab2d0d --- /dev/null +++ b/src/lib/components/ui/button/button.svelte @@ -0,0 +1,74 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts new file mode 100644 index 00000000..fb585d76 --- /dev/null +++ b/src/lib/components/ui/button/index.ts @@ -0,0 +1,17 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants, +} from "./button.svelte"; + +export { + Root, + type ButtonProps as Props, + // + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant, +}; diff --git a/src/lib/components/ui/calendar/calendar-cell.svelte b/src/lib/components/ui/calendar/calendar-cell.svelte new file mode 100644 index 00000000..3c065a52 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-cell.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-day.svelte b/src/lib/components/ui/calendar/calendar-day.svelte new file mode 100644 index 00000000..d5e802af --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-day.svelte @@ -0,0 +1,30 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-grid-body.svelte b/src/lib/components/ui/calendar/calendar-grid-body.svelte new file mode 100644 index 00000000..8cd86dec --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-grid-body.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-grid-head.svelte b/src/lib/components/ui/calendar/calendar-grid-head.svelte new file mode 100644 index 00000000..333edc47 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-grid-head.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-grid-row.svelte b/src/lib/components/ui/calendar/calendar-grid-row.svelte new file mode 100644 index 00000000..90322369 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-grid-row.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-grid.svelte b/src/lib/components/ui/calendar/calendar-grid.svelte new file mode 100644 index 00000000..1d7edb5a --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-grid.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-head-cell.svelte b/src/lib/components/ui/calendar/calendar-head-cell.svelte new file mode 100644 index 00000000..dd5e55f8 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-head-cell.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-header.svelte b/src/lib/components/ui/calendar/calendar-header.svelte new file mode 100644 index 00000000..e64feae4 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-header.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-heading.svelte b/src/lib/components/ui/calendar/calendar-heading.svelte new file mode 100644 index 00000000..5d57a500 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-heading.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/calendar/calendar-months.svelte b/src/lib/components/ui/calendar/calendar-months.svelte new file mode 100644 index 00000000..4cd0ed7d --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-months.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/calendar/calendar-next-button.svelte b/src/lib/components/ui/calendar/calendar-next-button.svelte new file mode 100644 index 00000000..62f8754d --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-next-button.svelte @@ -0,0 +1,28 @@ + + +{#snippet Fallback()} + +{/snippet} + + diff --git a/src/lib/components/ui/calendar/calendar-prev-button.svelte b/src/lib/components/ui/calendar/calendar-prev-button.svelte new file mode 100644 index 00000000..425b87c9 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar-prev-button.svelte @@ -0,0 +1,28 @@ + + +{#snippet Fallback()} + +{/snippet} + + diff --git a/src/lib/components/ui/calendar/calendar.svelte b/src/lib/components/ui/calendar/calendar.svelte new file mode 100644 index 00000000..16bebd79 --- /dev/null +++ b/src/lib/components/ui/calendar/calendar.svelte @@ -0,0 +1,61 @@ + + + + + {#snippet children({ months, weekdays })} + + + + + + + {#each months as month} + + + + {#each weekdays as weekday} + + {weekday.slice(0, 2)} + + {/each} + + + + {#each month.weeks as weekDates} + + {#each weekDates as date} + + + + {/each} + + {/each} + + + {/each} + + {/snippet} + diff --git a/src/lib/components/ui/calendar/index.ts b/src/lib/components/ui/calendar/index.ts new file mode 100644 index 00000000..ab257ab3 --- /dev/null +++ b/src/lib/components/ui/calendar/index.ts @@ -0,0 +1,30 @@ +import Root from "./calendar.svelte"; +import Cell from "./calendar-cell.svelte"; +import Day from "./calendar-day.svelte"; +import Grid from "./calendar-grid.svelte"; +import Header from "./calendar-header.svelte"; +import Months from "./calendar-months.svelte"; +import GridRow from "./calendar-grid-row.svelte"; +import Heading from "./calendar-heading.svelte"; +import GridBody from "./calendar-grid-body.svelte"; +import GridHead from "./calendar-grid-head.svelte"; +import HeadCell from "./calendar-head-cell.svelte"; +import NextButton from "./calendar-next-button.svelte"; +import PrevButton from "./calendar-prev-button.svelte"; + +export { + Day, + Cell, + Grid, + Header, + Months, + GridRow, + Heading, + GridBody, + GridHead, + HeadCell, + NextButton, + PrevButton, + // + Root as Calendar, +}; diff --git a/src/lib/components/ui/card/card-content.svelte b/src/lib/components/ui/card/card-content.svelte new file mode 100644 index 00000000..1f52856c --- /dev/null +++ b/src/lib/components/ui/card/card-content.svelte @@ -0,0 +1,16 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card-description.svelte b/src/lib/components/ui/card/card-description.svelte new file mode 100644 index 00000000..da026644 --- /dev/null +++ b/src/lib/components/ui/card/card-description.svelte @@ -0,0 +1,16 @@ + + +

+ {@render children?.()} +

diff --git a/src/lib/components/ui/card/card-footer.svelte b/src/lib/components/ui/card/card-footer.svelte new file mode 100644 index 00000000..6894149e --- /dev/null +++ b/src/lib/components/ui/card/card-footer.svelte @@ -0,0 +1,16 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card-header.svelte b/src/lib/components/ui/card/card-header.svelte new file mode 100644 index 00000000..1baa92cb --- /dev/null +++ b/src/lib/components/ui/card/card-header.svelte @@ -0,0 +1,16 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card-title.svelte b/src/lib/components/ui/card/card-title.svelte new file mode 100644 index 00000000..aa4f7f82 --- /dev/null +++ b/src/lib/components/ui/card/card-title.svelte @@ -0,0 +1,25 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card.svelte b/src/lib/components/ui/card/card.svelte new file mode 100644 index 00000000..3e3a4ed7 --- /dev/null +++ b/src/lib/components/ui/card/card.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/index.ts b/src/lib/components/ui/card/index.ts new file mode 100644 index 00000000..0f9084d1 --- /dev/null +++ b/src/lib/components/ui/card/index.ts @@ -0,0 +1,22 @@ +import Root from "./card.svelte"; +import Content from "./card-content.svelte"; +import Description from "./card-description.svelte"; +import Footer from "./card-footer.svelte"; +import Header from "./card-header.svelte"; +import Title from "./card-title.svelte"; + +export { + Root, + Content, + Description, + Footer, + Header, + Title, + // + Root as Card, + Content as CardContent, + Description as CardDescription, + Footer as CardFooter, + Header as CardHeader, + Title as CardTitle, +}; diff --git a/src/lib/components/ui/checkbox/checkbox.svelte b/src/lib/components/ui/checkbox/checkbox.svelte new file mode 100644 index 00000000..79f99116 --- /dev/null +++ b/src/lib/components/ui/checkbox/checkbox.svelte @@ -0,0 +1,35 @@ + + + + {#snippet children({ checked, indeterminate })} +
+ {#if indeterminate} + + {:else} + + {/if} +
+ {/snippet} +
diff --git a/src/lib/components/ui/checkbox/index.ts b/src/lib/components/ui/checkbox/index.ts new file mode 100644 index 00000000..6d92d945 --- /dev/null +++ b/src/lib/components/ui/checkbox/index.ts @@ -0,0 +1,6 @@ +import Root from "./checkbox.svelte"; +export { + Root, + // + Root as Checkbox, +}; diff --git a/src/lib/components/ui/command/command-dialog.svelte b/src/lib/components/ui/command/command-dialog.svelte new file mode 100644 index 00000000..e0f3410c --- /dev/null +++ b/src/lib/components/ui/command/command-dialog.svelte @@ -0,0 +1,33 @@ + + + + + + + diff --git a/src/lib/components/ui/command/command-empty.svelte b/src/lib/components/ui/command/command-empty.svelte new file mode 100644 index 00000000..5d86afee --- /dev/null +++ b/src/lib/components/ui/command/command-empty.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/command/command-group.svelte b/src/lib/components/ui/command/command-group.svelte new file mode 100644 index 00000000..6feb4505 --- /dev/null +++ b/src/lib/components/ui/command/command-group.svelte @@ -0,0 +1,29 @@ + + + + {#if heading} + + {heading} + + {/if} + + diff --git a/src/lib/components/ui/command/command-input.svelte b/src/lib/components/ui/command/command-input.svelte new file mode 100644 index 00000000..e5b42010 --- /dev/null +++ b/src/lib/components/ui/command/command-input.svelte @@ -0,0 +1,25 @@ + + +
+ + +
diff --git a/src/lib/components/ui/command/command-item.svelte b/src/lib/components/ui/command/command-item.svelte new file mode 100644 index 00000000..3738ff27 --- /dev/null +++ b/src/lib/components/ui/command/command-item.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/command/command-link-item.svelte b/src/lib/components/ui/command/command-link-item.svelte new file mode 100644 index 00000000..9bdded2f --- /dev/null +++ b/src/lib/components/ui/command/command-link-item.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/command/command-list.svelte b/src/lib/components/ui/command/command-list.svelte new file mode 100644 index 00000000..4a073217 --- /dev/null +++ b/src/lib/components/ui/command/command-list.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/command/command-separator.svelte b/src/lib/components/ui/command/command-separator.svelte new file mode 100644 index 00000000..526777b5 --- /dev/null +++ b/src/lib/components/ui/command/command-separator.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/command/command-shortcut.svelte b/src/lib/components/ui/command/command-shortcut.svelte new file mode 100644 index 00000000..f09693d4 --- /dev/null +++ b/src/lib/components/ui/command/command-shortcut.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/command/command.svelte b/src/lib/components/ui/command/command.svelte new file mode 100644 index 00000000..feff6909 --- /dev/null +++ b/src/lib/components/ui/command/command.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/command/index.ts b/src/lib/components/ui/command/index.ts new file mode 100644 index 00000000..d3dbadea --- /dev/null +++ b/src/lib/components/ui/command/index.ts @@ -0,0 +1,40 @@ +import { Command as CommandPrimitive } from "bits-ui"; + +import Root from "./command.svelte"; +import Dialog from "./command-dialog.svelte"; +import Empty from "./command-empty.svelte"; +import Group from "./command-group.svelte"; +import Item from "./command-item.svelte"; +import Input from "./command-input.svelte"; +import List from "./command-list.svelte"; +import Separator from "./command-separator.svelte"; +import Shortcut from "./command-shortcut.svelte"; +import LinkItem from "./command-link-item.svelte"; + +const Loading = CommandPrimitive.Loading; + +export { + Root, + Dialog, + Empty, + Group, + Item, + LinkItem, + Input, + List, + Separator, + Shortcut, + Loading, + // + Root as Command, + Dialog as CommandDialog, + Empty as CommandEmpty, + Group as CommandGroup, + Item as CommandItem, + LinkItem as CommandLinkItem, + Input as CommandInput, + List as CommandList, + Separator as CommandSeparator, + Shortcut as CommandShortcut, + Loading as CommandLoading, +}; diff --git a/src/lib/components/ui/data-table/data-table.svelte.ts b/src/lib/components/ui/data-table/data-table.svelte.ts new file mode 100644 index 00000000..b4834ce6 --- /dev/null +++ b/src/lib/components/ui/data-table/data-table.svelte.ts @@ -0,0 +1,112 @@ +import { + type RowData, + type TableOptions, + type TableOptionsResolved, + type TableState, + createTable, +} from "@tanstack/table-core"; + +/** + * Creates a reactive TanStack table object for Svelte. + * @param options Table options to create the table with. + * @returns A reactive table object. + * @example + * ```svelte + * + * + * + * + * {#each table.getHeaderGroups() as headerGroup} + * + * {#each headerGroup.headers as header} + * + * {/each} + * + * {/each} + * + * + *
+ * + *
+ * ``` + */ +export function createSvelteTable(options: TableOptions) { + const resolvedOptions: TableOptionsResolved = mergeObjects( + { + state: {}, + onStateChange() {}, + renderFallbackValue: null, + mergeOptions: ( + defaultOptions: TableOptions, + options: Partial> + ) => { + return mergeObjects(defaultOptions, options); + }, + }, + options + ); + + const table = createTable(resolvedOptions); + let state = $state>(table.initialState); + + function updateOptions() { + table.setOptions((prev) => { + return mergeObjects(prev, options, { + state: mergeObjects(state, options.state || {}), + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onStateChange: (updater: any) => { + if (updater instanceof Function) state = updater(state); + else state = mergeObjects(state, updater); + + options.onStateChange?.(updater); + }, + }); + }); + } + + updateOptions(); + + $effect.pre(() => { + updateOptions(); + }); + + return table; +} + +/** + * Merges objects together while keeping their getters alive. + * Taken from SolidJS: {@link https://github.com/solidjs/solid/blob/24abc825c0996fd2bc8c1de1491efe9a7e743aff/packages/solid/src/server/rendering.ts#L82-L115} + */ +function mergeObjects(source: T): T; +function mergeObjects(source: T, source1: U): T & U; +function mergeObjects(source: T, source1: U, source2: V): T & U & V; +function mergeObjects(source: T, source1: U, source2: V, source3: W): T & U & V & W; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function mergeObjects(...sources: any): any { + const target = {}; + for (let i = 0; i < sources.length; i++) { + let source = sources[i]; + if (typeof source === "function") source = source(); + if (source) { + const descriptors = Object.getOwnPropertyDescriptors(source); + for (const key in descriptors) { + if (key in target) continue; + Object.defineProperty(target, key, { + enumerable: true, + get() { + for (let i = sources.length - 1; i >= 0; i--) { + let s = sources[i]; + if (typeof s === "function") s = s(); + const v = (s || {})[key]; + if (v !== undefined) return v; + } + }, + }); + } + } + } + return target; +} diff --git a/src/lib/components/ui/data-table/flex-render.svelte b/src/lib/components/ui/data-table/flex-render.svelte new file mode 100644 index 00000000..2d686539 --- /dev/null +++ b/src/lib/components/ui/data-table/flex-render.svelte @@ -0,0 +1,46 @@ + + + + +{#if typeof content === "string"} + {content} +{:else if content instanceof Function} + + + {@const result = content(context as any)} + {#if result instanceof RenderComponentConfig} + {@const { component: Component, props } = result} + + {:else if result instanceof RenderSnippetConfig} + {@const { snippet, params } = result} + {@render snippet(params)} + {:else} + {result} + {/if} +{/if} diff --git a/src/lib/components/ui/data-table/index.ts b/src/lib/components/ui/data-table/index.ts new file mode 100644 index 00000000..5f4e77ea --- /dev/null +++ b/src/lib/components/ui/data-table/index.ts @@ -0,0 +1,3 @@ +export { default as FlexRender } from "./flex-render.svelte"; +export { renderComponent, renderSnippet } from "./render-helpers.js"; +export { createSvelteTable } from "./data-table.svelte.js"; diff --git a/src/lib/components/ui/data-table/render-helpers.ts b/src/lib/components/ui/data-table/render-helpers.ts new file mode 100644 index 00000000..1984642e --- /dev/null +++ b/src/lib/components/ui/data-table/render-helpers.ts @@ -0,0 +1,111 @@ +import type { Component, ComponentProps, Snippet } from "svelte"; + +/** + * A helper class to make it easy to identify Svelte components in + * `columnDef.cell` and `columnDef.header` properties. + * + * > NOTE: This class should only be used internally by the adapter. If you're + * reading this and you don't know what this is for, you probably don't need it. + * + * @example + * ```svelte + * {@const result = content(context as any)} + * {#if result instanceof RenderComponentConfig} + * {@const { component: Component, props } = result} + * + * {/if} + * ``` + */ +export class RenderComponentConfig { + component: TComponent; + props: ComponentProps | Record; + constructor( + component: TComponent, + props: ComponentProps | Record = {} + ) { + this.component = component; + this.props = props; + } +} + +/** + * A helper class to make it easy to identify Svelte Snippets in `columnDef.cell` and `columnDef.header` properties. + * + * > NOTE: This class should only be used internally by the adapter. If you're + * reading this and you don't know what this is for, you probably don't need it. + * + * @example + * ```svelte + * {@const result = content(context as any)} + * {#if result instanceof RenderSnippetConfig} + * {@const { snippet, params } = result} + * {@render snippet(params)} + * {/if} + * ``` + */ +export class RenderSnippetConfig { + snippet: Snippet<[TProps]>; + params: TProps; + constructor(snippet: Snippet<[TProps]>, params: TProps) { + this.snippet = snippet; + this.params = params; + } +} + +/** + * A helper function to help create cells from Svelte components through ColumnDef's `cell` and `header` properties. + * + * This is only to be used with Svelte Components - use `renderSnippet` for Svelte Snippets. + * + * @param component A Svelte component + * @param props The props to pass to `component` + * @returns A `RenderComponentConfig` object that helps svelte-table know how to render the header/cell component. + * @example + * ```ts + * // +page.svelte + * const defaultColumns = [ + * columnHelper.accessor('name', { + * header: header => renderComponent(SortHeader, { label: 'Name', header }), + * }), + * columnHelper.accessor('state', { + * header: header => renderComponent(SortHeader, { label: 'State', header }), + * }), + * ] + * ``` + * @see {@link https://tanstack.com/table/latest/docs/guide/column-defs} + */ +export function renderComponent< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + T extends Component, + Props extends ComponentProps, +>(component: T, props: Props) { + return new RenderComponentConfig(component, props); +} + +/** + * A helper function to help create cells from Svelte Snippets through ColumnDef's `cell` and `header` properties. + * + * The snippet must only take one parameter. + * + * This is only to be used with Snippets - use `renderComponent` for Svelte Components. + * + * @param snippet + * @param params + * @returns - A `RenderSnippetConfig` object that helps svelte-table know how to render the header/cell snippet. + * @example + * ```ts + * // +page.svelte + * const defaultColumns = [ + * columnHelper.accessor('name', { + * cell: cell => renderSnippet(nameSnippet, { name: cell.row.name }), + * }), + * columnHelper.accessor('state', { + * cell: cell => renderSnippet(stateSnippet, { state: cell.row.state }), + * }), + * ] + * ``` + * @see {@link https://tanstack.com/table/latest/docs/guide/column-defs} + */ +export function renderSnippet(snippet: Snippet<[TProps]>, params: TProps) { + return new RenderSnippetConfig(snippet, params); +} diff --git a/src/lib/components/ui/dialog/dialog-content.svelte b/src/lib/components/ui/dialog/dialog-content.svelte new file mode 100644 index 00000000..d0cd7a5d --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,36 @@ + + + + + + {@render children?.()} + + + Close + + + diff --git a/src/lib/components/ui/dialog/dialog-description.svelte b/src/lib/components/ui/dialog/dialog-description.svelte new file mode 100644 index 00000000..bc048e4b --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-footer.svelte b/src/lib/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 00000000..91ecaba6 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dialog/dialog-header.svelte b/src/lib/components/ui/dialog/dialog-header.svelte new file mode 100644 index 00000000..8d1abfc4 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/lib/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 00000000..05c30ac2 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-title.svelte b/src/lib/components/ui/dialog/dialog-title.svelte new file mode 100644 index 00000000..9cf592cf --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/dialog/index.ts b/src/lib/components/ui/dialog/index.ts new file mode 100644 index 00000000..3286ab7a --- /dev/null +++ b/src/lib/components/ui/dialog/index.ts @@ -0,0 +1,37 @@ +import { Dialog as DialogPrimitive } from "bits-ui"; + +import Title from "./dialog-title.svelte"; +import Footer from "./dialog-footer.svelte"; +import Header from "./dialog-header.svelte"; +import Overlay from "./dialog-overlay.svelte"; +import Content from "./dialog-content.svelte"; +import Description from "./dialog-description.svelte"; + +const Root = DialogPrimitive.Root; +const Trigger = DialogPrimitive.Trigger; +const Close = DialogPrimitive.Close; +const Portal = DialogPrimitive.Portal; + +export { + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose, +}; diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte new file mode 100644 index 00000000..20e3777b --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte @@ -0,0 +1,40 @@ + + + + {#snippet children({ checked, indeterminate })} + + {#if indeterminate} + + {:else} + + {/if} + + {@render childrenProp?.()} + {/snippet} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte new file mode 100644 index 00000000..255b1a6e --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte new file mode 100644 index 00000000..84d5cca2 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte new file mode 100644 index 00000000..70a52361 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -0,0 +1,23 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte new file mode 100644 index 00000000..9837d5a4 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -0,0 +1,23 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte new file mode 100644 index 00000000..0f219da2 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte @@ -0,0 +1,30 @@ + + + + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte new file mode 100644 index 00000000..32fac4bc --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte new file mode 100644 index 00000000..053e2a2c --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte new file mode 100644 index 00000000..0bb6eea4 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte new file mode 100644 index 00000000..c2dcd32e --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte @@ -0,0 +1,28 @@ + + + + {@render children?.()} + + diff --git a/src/lib/components/ui/dropdown-menu/index.ts b/src/lib/components/ui/dropdown-menu/index.ts new file mode 100644 index 00000000..40c45027 --- /dev/null +++ b/src/lib/components/ui/dropdown-menu/index.ts @@ -0,0 +1,50 @@ +import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui"; +import CheckboxItem from "./dropdown-menu-checkbox-item.svelte"; +import Content from "./dropdown-menu-content.svelte"; +import GroupHeading from "./dropdown-menu-group-heading.svelte"; +import Item from "./dropdown-menu-item.svelte"; +import Label from "./dropdown-menu-label.svelte"; +import RadioItem from "./dropdown-menu-radio-item.svelte"; +import Separator from "./dropdown-menu-separator.svelte"; +import Shortcut from "./dropdown-menu-shortcut.svelte"; +import SubContent from "./dropdown-menu-sub-content.svelte"; +import SubTrigger from "./dropdown-menu-sub-trigger.svelte"; + +const Sub = DropdownMenuPrimitive.Sub; +const Root = DropdownMenuPrimitive.Root; +const Trigger = DropdownMenuPrimitive.Trigger; +const Group = DropdownMenuPrimitive.Group; +const RadioGroup = DropdownMenuPrimitive.RadioGroup; + +export { + CheckboxItem, + Content, + Root as DropdownMenu, + CheckboxItem as DropdownMenuCheckboxItem, + Content as DropdownMenuContent, + Group as DropdownMenuGroup, + GroupHeading as DropdownMenuGroupHeading, + Item as DropdownMenuItem, + Label as DropdownMenuLabel, + RadioGroup as DropdownMenuRadioGroup, + RadioItem as DropdownMenuRadioItem, + Separator as DropdownMenuSeparator, + Shortcut as DropdownMenuShortcut, + Sub as DropdownMenuSub, + SubContent as DropdownMenuSubContent, + SubTrigger as DropdownMenuSubTrigger, + Trigger as DropdownMenuTrigger, + Group, + GroupHeading, + Item, + Label, + RadioGroup, + RadioItem, + Root, + Separator, + Shortcut, + Sub, + SubContent, + SubTrigger, + Trigger, +}; diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts new file mode 100644 index 00000000..f47b6d3f --- /dev/null +++ b/src/lib/components/ui/input/index.ts @@ -0,0 +1,7 @@ +import Root from "./input.svelte"; + +export { + Root, + // + Root as Input, +}; diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte new file mode 100644 index 00000000..328634f7 --- /dev/null +++ b/src/lib/components/ui/input/input.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/ui/label/index.ts b/src/lib/components/ui/label/index.ts new file mode 100644 index 00000000..8bfca0b3 --- /dev/null +++ b/src/lib/components/ui/label/index.ts @@ -0,0 +1,7 @@ +import Root from "./label.svelte"; + +export { + Root, + // + Root as Label, +}; diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte new file mode 100644 index 00000000..247d23cc --- /dev/null +++ b/src/lib/components/ui/label/label.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/menubar/index.ts b/src/lib/components/ui/menubar/index.ts new file mode 100644 index 00000000..1ea010c4 --- /dev/null +++ b/src/lib/components/ui/menubar/index.ts @@ -0,0 +1,51 @@ +import { Menubar as MenubarPrimitive } from "bits-ui"; +import Root from "./menubar.svelte"; +import CheckboxItem from "./menubar-checkbox-item.svelte"; +import Content from "./menubar-content.svelte"; +import Item from "./menubar-item.svelte"; +import GroupHeading from "./menubar-group-heading.svelte"; +import RadioItem from "./menubar-radio-item.svelte"; +import Separator from "./menubar-separator.svelte"; +import Shortcut from "./menubar-shortcut.svelte"; +import SubContent from "./menubar-sub-content.svelte"; +import SubTrigger from "./menubar-sub-trigger.svelte"; +import Trigger from "./menubar-trigger.svelte"; + +const Menu = MenubarPrimitive.Menu; +const Group = MenubarPrimitive.Group; +const Sub = MenubarPrimitive.Sub; +const RadioGroup = MenubarPrimitive.RadioGroup; + +export { + Root, + CheckboxItem, + Content, + Item, + GroupHeading, + RadioItem, + Separator, + Shortcut, + SubContent, + SubTrigger, + Trigger, + Menu, + Group, + Sub, + RadioGroup, + // + Root as Menubar, + CheckboxItem as MenubarCheckboxItem, + Content as MenubarContent, + Item as MenubarItem, + GroupHeading as MenubarGroupHeading, + RadioItem as MenubarRadioItem, + Separator as MenubarSeparator, + Shortcut as MenubarShortcut, + SubContent as MenubarSubContent, + SubTrigger as MenubarSubTrigger, + Trigger as MenubarTrigger, + Menu as MenubarMenu, + Group as MenubarGroup, + Sub as MenubarSub, + RadioGroup as MenubarRadioGroup, +}; diff --git a/src/lib/components/ui/menubar/menubar-checkbox-item.svelte b/src/lib/components/ui/menubar/menubar-checkbox-item.svelte new file mode 100644 index 00000000..9f7646a9 --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-checkbox-item.svelte @@ -0,0 +1,40 @@ + + + + {#snippet children({ checked, indeterminate })} + + {#if indeterminate} + + {:else} + + {/if} + + {@render childrenProp?.()} + {/snippet} + diff --git a/src/lib/components/ui/menubar/menubar-content.svelte b/src/lib/components/ui/menubar/menubar-content.svelte new file mode 100644 index 00000000..e88227ff --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-content.svelte @@ -0,0 +1,27 @@ + + + diff --git a/src/lib/components/ui/menubar/menubar-group-heading.svelte b/src/lib/components/ui/menubar/menubar-group-heading.svelte new file mode 100644 index 00000000..4b897299 --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-group-heading.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/menubar/menubar-item.svelte b/src/lib/components/ui/menubar/menubar-item.svelte new file mode 100644 index 00000000..7d4ad7db --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-item.svelte @@ -0,0 +1,23 @@ + + + diff --git a/src/lib/components/ui/menubar/menubar-radio-item.svelte b/src/lib/components/ui/menubar/menubar-radio-item.svelte new file mode 100644 index 00000000..2a5fe7ee --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-radio-item.svelte @@ -0,0 +1,30 @@ + + + + {#snippet children({ checked })} + + {#if checked} + + {/if} + + {@render childrenProp?.({ checked })} + {/snippet} + diff --git a/src/lib/components/ui/menubar/menubar-separator.svelte b/src/lib/components/ui/menubar/menubar-separator.svelte new file mode 100644 index 00000000..2a6aa047 --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-separator.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/menubar/menubar-shortcut.svelte b/src/lib/components/ui/menubar/menubar-shortcut.svelte new file mode 100644 index 00000000..b35a95f0 --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-shortcut.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/menubar/menubar-sub-content.svelte b/src/lib/components/ui/menubar/menubar-sub-content.svelte new file mode 100644 index 00000000..1d68e88d --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-sub-content.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/menubar/menubar-sub-trigger.svelte b/src/lib/components/ui/menubar/menubar-sub-trigger.svelte new file mode 100644 index 00000000..f75cd8f9 --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-sub-trigger.svelte @@ -0,0 +1,28 @@ + + + + {@render children?.()} + + diff --git a/src/lib/components/ui/menubar/menubar-trigger.svelte b/src/lib/components/ui/menubar/menubar-trigger.svelte new file mode 100644 index 00000000..bf362c7e --- /dev/null +++ b/src/lib/components/ui/menubar/menubar-trigger.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/menubar/menubar.svelte b/src/lib/components/ui/menubar/menubar.svelte new file mode 100644 index 00000000..55c34c66 --- /dev/null +++ b/src/lib/components/ui/menubar/menubar.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/popover/index.ts b/src/lib/components/ui/popover/index.ts new file mode 100644 index 00000000..63aecf9a --- /dev/null +++ b/src/lib/components/ui/popover/index.ts @@ -0,0 +1,17 @@ +import { Popover as PopoverPrimitive } from "bits-ui"; +import Content from "./popover-content.svelte"; +const Root = PopoverPrimitive.Root; +const Trigger = PopoverPrimitive.Trigger; +const Close = PopoverPrimitive.Close; + +export { + Root, + Content, + Trigger, + Close, + // + Root as Popover, + Content as PopoverContent, + Trigger as PopoverTrigger, + Close as PopoverClose, +}; diff --git a/src/lib/components/ui/popover/popover-content.svelte b/src/lib/components/ui/popover/popover-content.svelte new file mode 100644 index 00000000..a897b3b9 --- /dev/null +++ b/src/lib/components/ui/popover/popover-content.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/src/lib/components/ui/progress/index.ts b/src/lib/components/ui/progress/index.ts new file mode 100644 index 00000000..25eee615 --- /dev/null +++ b/src/lib/components/ui/progress/index.ts @@ -0,0 +1,7 @@ +import Root from "./progress.svelte"; + +export { + Root, + // + Root as Progress, +}; diff --git a/src/lib/components/ui/progress/progress.svelte b/src/lib/components/ui/progress/progress.svelte new file mode 100644 index 00000000..5c477703 --- /dev/null +++ b/src/lib/components/ui/progress/progress.svelte @@ -0,0 +1,25 @@ + + + +
+
diff --git a/src/lib/components/ui/range-calendar/index.ts b/src/lib/components/ui/range-calendar/index.ts new file mode 100644 index 00000000..d949b056 --- /dev/null +++ b/src/lib/components/ui/range-calendar/index.ts @@ -0,0 +1,32 @@ +import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui"; +import Root from "./range-calendar.svelte"; +import Cell from "./range-calendar-cell.svelte"; +import Day from "./range-calendar-day.svelte"; +import Grid from "./range-calendar-grid.svelte"; +import Header from "./range-calendar-header.svelte"; +import Months from "./range-calendar-months.svelte"; +import GridRow from "./range-calendar-grid-row.svelte"; +import Heading from "./range-calendar-heading.svelte"; +import HeadCell from "./range-calendar-head-cell.svelte"; +import NextButton from "./range-calendar-next-button.svelte"; +import PrevButton from "./range-calendar-prev-button.svelte"; + +const GridHead = RangeCalendarPrimitive.GridHead; +const GridBody = RangeCalendarPrimitive.GridBody; + +export { + Day, + Cell, + Grid, + Header, + Months, + GridRow, + Heading, + GridBody, + GridHead, + HeadCell, + NextButton, + PrevButton, + // + Root as RangeCalendar, +}; diff --git a/src/lib/components/ui/range-calendar/range-calendar-cell.svelte b/src/lib/components/ui/range-calendar/range-calendar-cell.svelte new file mode 100644 index 00000000..596bd712 --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-cell.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/components/ui/range-calendar/range-calendar-day.svelte b/src/lib/components/ui/range-calendar/range-calendar-day.svelte new file mode 100644 index 00000000..09650e5e --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-day.svelte @@ -0,0 +1,34 @@ + + + diff --git a/src/lib/components/ui/range-calendar/range-calendar-grid-row.svelte b/src/lib/components/ui/range-calendar/range-calendar-grid-row.svelte new file mode 100644 index 00000000..3286b2aa --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-grid-row.svelte @@ -0,0 +1,12 @@ + + + diff --git a/src/lib/components/ui/range-calendar/range-calendar-grid.svelte b/src/lib/components/ui/range-calendar/range-calendar-grid.svelte new file mode 100644 index 00000000..7379a71c --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-grid.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/range-calendar/range-calendar-head-cell.svelte b/src/lib/components/ui/range-calendar/range-calendar-head-cell.svelte new file mode 100644 index 00000000..3c5b8694 --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-head-cell.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/range-calendar/range-calendar-header.svelte b/src/lib/components/ui/range-calendar/range-calendar-header.svelte new file mode 100644 index 00000000..be2bc827 --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-header.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/range-calendar/range-calendar-heading.svelte b/src/lib/components/ui/range-calendar/range-calendar-heading.svelte new file mode 100644 index 00000000..a39e4e21 --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-heading.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/range-calendar/range-calendar-months.svelte b/src/lib/components/ui/range-calendar/range-calendar-months.svelte new file mode 100644 index 00000000..4cd0ed7d --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-months.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/range-calendar/range-calendar-next-button.svelte b/src/lib/components/ui/range-calendar/range-calendar-next-button.svelte new file mode 100644 index 00000000..73898042 --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-next-button.svelte @@ -0,0 +1,28 @@ + + +{#snippet Fallback()} + +{/snippet} + + diff --git a/src/lib/components/ui/range-calendar/range-calendar-prev-button.svelte b/src/lib/components/ui/range-calendar/range-calendar-prev-button.svelte new file mode 100644 index 00000000..75f7b778 --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar-prev-button.svelte @@ -0,0 +1,28 @@ + + +{#snippet Fallback()} + +{/snippet} + + diff --git a/src/lib/components/ui/range-calendar/range-calendar.svelte b/src/lib/components/ui/range-calendar/range-calendar.svelte new file mode 100644 index 00000000..58581614 --- /dev/null +++ b/src/lib/components/ui/range-calendar/range-calendar.svelte @@ -0,0 +1,57 @@ + + + + {#snippet children({ months, weekdays })} + + + + + + + {#each months as month} + + + + {#each weekdays as weekday} + + {weekday.slice(0, 2)} + + {/each} + + + + {#each month.weeks as weekDates} + + {#each weekDates as date} + + + + {/each} + + {/each} + + + {/each} + + {/snippet} + diff --git a/src/lib/components/ui/scroll-area/index.ts b/src/lib/components/ui/scroll-area/index.ts new file mode 100644 index 00000000..e86a25b2 --- /dev/null +++ b/src/lib/components/ui/scroll-area/index.ts @@ -0,0 +1,10 @@ +import Scrollbar from "./scroll-area-scrollbar.svelte"; +import Root from "./scroll-area.svelte"; + +export { + Root, + Scrollbar, + //, + Root as ScrollArea, + Scrollbar as ScrollAreaScrollbar, +}; diff --git a/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte b/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte new file mode 100644 index 00000000..b4360561 --- /dev/null +++ b/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte @@ -0,0 +1,29 @@ + + + + {@render children?.()} + + diff --git a/src/lib/components/ui/scroll-area/scroll-area.svelte b/src/lib/components/ui/scroll-area/scroll-area.svelte new file mode 100644 index 00000000..9943f837 --- /dev/null +++ b/src/lib/components/ui/scroll-area/scroll-area.svelte @@ -0,0 +1,32 @@ + + + + + {@render children?.()} + + {#if orientation === "vertical" || orientation === "both"} + + {/if} + {#if orientation === "horizontal" || orientation === "both"} + + {/if} + + diff --git a/src/lib/components/ui/select/index.ts b/src/lib/components/ui/select/index.ts new file mode 100644 index 00000000..f31b8aed --- /dev/null +++ b/src/lib/components/ui/select/index.ts @@ -0,0 +1,34 @@ +import { Select as SelectPrimitive } from "bits-ui"; + +import GroupHeading from "./select-group-heading.svelte"; +import Item from "./select-item.svelte"; +import Content from "./select-content.svelte"; +import Trigger from "./select-trigger.svelte"; +import Separator from "./select-separator.svelte"; +import ScrollDownButton from "./select-scroll-down-button.svelte"; +import ScrollUpButton from "./select-scroll-up-button.svelte"; + +const Root = SelectPrimitive.Root; +const Group = SelectPrimitive.Group; + +export { + Root, + Group, + GroupHeading, + Item, + Content, + Trigger, + Separator, + ScrollDownButton, + ScrollUpButton, + // + Root as Select, + Group as SelectGroup, + GroupHeading as SelectGroupHeading, + Item as SelectItem, + Content as SelectContent, + Trigger as SelectTrigger, + Separator as SelectSeparator, + ScrollDownButton as SelectScrollDownButton, + ScrollUpButton as SelectScrollUpButton, +}; diff --git a/src/lib/components/ui/select/select-content.svelte b/src/lib/components/ui/select/select-content.svelte new file mode 100644 index 00000000..56916eff --- /dev/null +++ b/src/lib/components/ui/select/select-content.svelte @@ -0,0 +1,39 @@ + + + + + + + {@render children?.()} + + + + diff --git a/src/lib/components/ui/select/select-group-heading.svelte b/src/lib/components/ui/select/select-group-heading.svelte new file mode 100644 index 00000000..7984bef2 --- /dev/null +++ b/src/lib/components/ui/select/select-group-heading.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/select/select-item.svelte b/src/lib/components/ui/select/select-item.svelte new file mode 100644 index 00000000..c3a77db1 --- /dev/null +++ b/src/lib/components/ui/select/select-item.svelte @@ -0,0 +1,37 @@ + + + + {#snippet children({ selected, highlighted })} + + {#if selected} + + {/if} + + {#if childrenProp} + {@render childrenProp({ selected, highlighted })} + {:else} + {label || value} + {/if} + {/snippet} + diff --git a/src/lib/components/ui/select/select-scroll-down-button.svelte b/src/lib/components/ui/select/select-scroll-down-button.svelte new file mode 100644 index 00000000..b927d626 --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-down-button.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/lib/components/ui/select/select-scroll-up-button.svelte b/src/lib/components/ui/select/select-scroll-up-button.svelte new file mode 100644 index 00000000..b8939ba0 --- /dev/null +++ b/src/lib/components/ui/select/select-scroll-up-button.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/lib/components/ui/select/select-separator.svelte b/src/lib/components/ui/select/select-separator.svelte new file mode 100644 index 00000000..38a3ab0b --- /dev/null +++ b/src/lib/components/ui/select/select-separator.svelte @@ -0,0 +1,13 @@ + + + diff --git a/src/lib/components/ui/select/select-trigger.svelte b/src/lib/components/ui/select/select-trigger.svelte new file mode 100644 index 00000000..f917f135 --- /dev/null +++ b/src/lib/components/ui/select/select-trigger.svelte @@ -0,0 +1,24 @@ + + +span]:line-clamp-1", + className + )} + {...restProps} +> + {@render children?.()} + + diff --git a/src/lib/components/ui/separator/index.ts b/src/lib/components/ui/separator/index.ts new file mode 100644 index 00000000..82442d2c --- /dev/null +++ b/src/lib/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from "./separator.svelte"; + +export { + Root, + // + Root as Separator, +}; diff --git a/src/lib/components/ui/separator/separator.svelte b/src/lib/components/ui/separator/separator.svelte new file mode 100644 index 00000000..839494d8 --- /dev/null +++ b/src/lib/components/ui/separator/separator.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/ui/sheet/index.ts b/src/lib/components/ui/sheet/index.ts new file mode 100644 index 00000000..1cf1af1d --- /dev/null +++ b/src/lib/components/ui/sheet/index.ts @@ -0,0 +1,36 @@ +import { Dialog as SheetPrimitive } from "bits-ui"; +import Overlay from "./sheet-overlay.svelte"; +import Content from "./sheet-content.svelte"; +import Header from "./sheet-header.svelte"; +import Footer from "./sheet-footer.svelte"; +import Title from "./sheet-title.svelte"; +import Description from "./sheet-description.svelte"; + +const Root = SheetPrimitive.Root; +const Close = SheetPrimitive.Close; +const Trigger = SheetPrimitive.Trigger; +const Portal = SheetPrimitive.Portal; + +export { + Root, + Close, + Trigger, + Portal, + Overlay, + Content, + Header, + Footer, + Title, + Description, + // + Root as Sheet, + Close as SheetClose, + Trigger as SheetTrigger, + Portal as SheetPortal, + Overlay as SheetOverlay, + Content as SheetContent, + Header as SheetHeader, + Footer as SheetFooter, + Title as SheetTitle, + Description as SheetDescription, +}; diff --git a/src/lib/components/ui/sheet/sheet-content.svelte b/src/lib/components/ui/sheet/sheet-content.svelte new file mode 100644 index 00000000..2e2e36b1 --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-content.svelte @@ -0,0 +1,53 @@ + + + + + + + + {@render children?.()} + + + Close + + + diff --git a/src/lib/components/ui/sheet/sheet-description.svelte b/src/lib/components/ui/sheet/sheet-description.svelte new file mode 100644 index 00000000..885e01f2 --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-description.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/sheet/sheet-footer.svelte b/src/lib/components/ui/sheet/sheet-footer.svelte new file mode 100644 index 00000000..91ecaba6 --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-footer.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/sheet/sheet-header.svelte b/src/lib/components/ui/sheet/sheet-header.svelte new file mode 100644 index 00000000..47ea6be7 --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-header.svelte @@ -0,0 +1,20 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/sheet/sheet-overlay.svelte b/src/lib/components/ui/sheet/sheet-overlay.svelte new file mode 100644 index 00000000..faa2de19 --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-overlay.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/sheet/sheet-title.svelte b/src/lib/components/ui/sheet/sheet-title.svelte new file mode 100644 index 00000000..25f42fcb --- /dev/null +++ b/src/lib/components/ui/sheet/sheet-title.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/lib/components/ui/sidebar/constants.ts b/src/lib/components/ui/sidebar/constants.ts new file mode 100644 index 00000000..4de44351 --- /dev/null +++ b/src/lib/components/ui/sidebar/constants.ts @@ -0,0 +1,6 @@ +export const SIDEBAR_COOKIE_NAME = "sidebar:state"; +export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; +export const SIDEBAR_WIDTH = "16rem"; +export const SIDEBAR_WIDTH_MOBILE = "18rem"; +export const SIDEBAR_WIDTH_ICON = "3rem"; +export const SIDEBAR_KEYBOARD_SHORTCUT = "b"; diff --git a/src/lib/components/ui/sidebar/context.svelte.ts b/src/lib/components/ui/sidebar/context.svelte.ts new file mode 100644 index 00000000..15248ada --- /dev/null +++ b/src/lib/components/ui/sidebar/context.svelte.ts @@ -0,0 +1,81 @@ +import { IsMobile } from "$lib/hooks/is-mobile.svelte.js"; +import { getContext, setContext } from "svelte"; +import { SIDEBAR_KEYBOARD_SHORTCUT } from "./constants.js"; + +type Getter = () => T; + +export type SidebarStateProps = { + /** + * A getter function that returns the current open state of the sidebar. + * We use a getter function here to support `bind:open` on the `Sidebar.Provider` + * component. + */ + open: Getter; + + /** + * A function that sets the open state of the sidebar. To support `bind:open`, we need + * a source of truth for changing the open state to ensure it will be synced throughout + * the sub-components and any `bind:` references. + */ + setOpen: (open: boolean) => void; +}; + +class SidebarState { + readonly props: SidebarStateProps; + open = $derived.by(() => this.props.open()); + openMobile = $state(false); + setOpen: SidebarStateProps["setOpen"]; + #isMobile: IsMobile; + state = $derived.by(() => (this.open ? "expanded" : "collapsed")); + + constructor(props: SidebarStateProps) { + this.setOpen = props.setOpen; + this.#isMobile = new IsMobile(); + this.props = props; + } + + // Convenience getter for checking if the sidebar is mobile + // without this, we would need to use `sidebar.isMobile.current` everywhere + get isMobile() { + return this.#isMobile.current; + } + + // Event handler to apply to the `` + handleShortcutKeydown = (e: KeyboardEvent) => { + if (e.key === SIDEBAR_KEYBOARD_SHORTCUT && (e.metaKey || e.ctrlKey)) { + e.preventDefault(); + this.toggle(); + } + }; + + setOpenMobile = (value: boolean) => { + this.openMobile = value; + }; + + toggle = () => { + return this.#isMobile.current + ? (this.openMobile = !this.openMobile) + : this.setOpen(!this.open); + }; +} + +const SYMBOL_KEY = "scn-sidebar"; + +/** + * Instantiates a new `SidebarState` instance and sets it in the context. + * + * @param props The constructor props for the `SidebarState` class. + * @returns The `SidebarState` instance. + */ +export function setSidebar(props: SidebarStateProps): SidebarState { + return setContext(Symbol.for(SYMBOL_KEY), new SidebarState(props)); +} + +/** + * Retrieves the `SidebarState` instance from the context. This is a class instance, + * so you cannot destructure it. + * @returns The `SidebarState` instance. + */ +export function useSidebar(): SidebarState { + return getContext(Symbol.for(SYMBOL_KEY)); +} diff --git a/src/lib/components/ui/sidebar/index.ts b/src/lib/components/ui/sidebar/index.ts new file mode 100644 index 00000000..318a3417 --- /dev/null +++ b/src/lib/components/ui/sidebar/index.ts @@ -0,0 +1,75 @@ +import { useSidebar } from "./context.svelte.js"; +import Content from "./sidebar-content.svelte"; +import Footer from "./sidebar-footer.svelte"; +import GroupAction from "./sidebar-group-action.svelte"; +import GroupContent from "./sidebar-group-content.svelte"; +import GroupLabel from "./sidebar-group-label.svelte"; +import Group from "./sidebar-group.svelte"; +import Header from "./sidebar-header.svelte"; +import Input from "./sidebar-input.svelte"; +import Inset from "./sidebar-inset.svelte"; +import MenuAction from "./sidebar-menu-action.svelte"; +import MenuBadge from "./sidebar-menu-badge.svelte"; +import MenuButton from "./sidebar-menu-button.svelte"; +import MenuItem from "./sidebar-menu-item.svelte"; +import MenuSkeleton from "./sidebar-menu-skeleton.svelte"; +import MenuSubButton from "./sidebar-menu-sub-button.svelte"; +import MenuSubItem from "./sidebar-menu-sub-item.svelte"; +import MenuSub from "./sidebar-menu-sub.svelte"; +import Menu from "./sidebar-menu.svelte"; +import Provider from "./sidebar-provider.svelte"; +import Rail from "./sidebar-rail.svelte"; +import Separator from "./sidebar-separator.svelte"; +import Trigger from "./sidebar-trigger.svelte"; +import Root from "./sidebar.svelte"; + +export { + Content, + Footer, + Group, + GroupAction, + GroupContent, + GroupLabel, + Header, + Input, + Inset, + Menu, + MenuAction, + MenuBadge, + MenuButton, + MenuItem, + MenuSkeleton, + MenuSub, + MenuSubButton, + MenuSubItem, + Provider, + Rail, + Root, + Separator, + // + Root as Sidebar, + Content as SidebarContent, + Footer as SidebarFooter, + Group as SidebarGroup, + GroupAction as SidebarGroupAction, + GroupContent as SidebarGroupContent, + GroupLabel as SidebarGroupLabel, + Header as SidebarHeader, + Input as SidebarInput, + Inset as SidebarInset, + Menu as SidebarMenu, + MenuAction as SidebarMenuAction, + MenuBadge as SidebarMenuBadge, + MenuButton as SidebarMenuButton, + MenuItem as SidebarMenuItem, + MenuSkeleton as SidebarMenuSkeleton, + MenuSub as SidebarMenuSub, + MenuSubButton as SidebarMenuSubButton, + MenuSubItem as SidebarMenuSubItem, + Provider as SidebarProvider, + Rail as SidebarRail, + Separator as SidebarSeparator, + Trigger as SidebarTrigger, + Trigger, + useSidebar, +}; diff --git a/src/lib/components/ui/sidebar/sidebar-content.svelte b/src/lib/components/ui/sidebar/sidebar-content.svelte new file mode 100644 index 00000000..c6db009f --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-content.svelte @@ -0,0 +1,24 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/sidebar/sidebar-footer.svelte b/src/lib/components/ui/sidebar/sidebar-footer.svelte new file mode 100644 index 00000000..c62cb410 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-footer.svelte @@ -0,0 +1,21 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/sidebar/sidebar-group-action.svelte b/src/lib/components/ui/sidebar/sidebar-group-action.svelte new file mode 100644 index 00000000..6961e4c0 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-group-action.svelte @@ -0,0 +1,36 @@ + + +{#if child} + {@render child({ props: propObj })} +{:else} + +{/if} diff --git a/src/lib/components/ui/sidebar/sidebar-group-content.svelte b/src/lib/components/ui/sidebar/sidebar-group-content.svelte new file mode 100644 index 00000000..f5e623b9 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-group-content.svelte @@ -0,0 +1,21 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/sidebar/sidebar-group-label.svelte b/src/lib/components/ui/sidebar/sidebar-group-label.svelte new file mode 100644 index 00000000..77c180fd --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-group-label.svelte @@ -0,0 +1,34 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} +
+ {@render children?.()} +
+{/if} diff --git a/src/lib/components/ui/sidebar/sidebar-group.svelte b/src/lib/components/ui/sidebar/sidebar-group.svelte new file mode 100644 index 00000000..aa8bf31a --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-group.svelte @@ -0,0 +1,21 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/sidebar/sidebar-header.svelte b/src/lib/components/ui/sidebar/sidebar-header.svelte new file mode 100644 index 00000000..5656c0bc --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-header.svelte @@ -0,0 +1,21 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/sidebar/sidebar-input.svelte b/src/lib/components/ui/sidebar/sidebar-input.svelte new file mode 100644 index 00000000..1d57f437 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-input.svelte @@ -0,0 +1,23 @@ + + + diff --git a/src/lib/components/ui/sidebar/sidebar-inset.svelte b/src/lib/components/ui/sidebar/sidebar-inset.svelte new file mode 100644 index 00000000..b9cd447b --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-inset.svelte @@ -0,0 +1,24 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-action.svelte b/src/lib/components/ui/sidebar/sidebar-menu-action.svelte new file mode 100644 index 00000000..5a94f39a --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-menu-action.svelte @@ -0,0 +1,43 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} + +{/if} diff --git a/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte b/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte new file mode 100644 index 00000000..0fd4c515 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte @@ -0,0 +1,29 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-button.svelte b/src/lib/components/ui/sidebar/sidebar-menu-button.svelte new file mode 100644 index 00000000..1513721a --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-menu-button.svelte @@ -0,0 +1,97 @@ + + + + +{#snippet Button({ props }: { props?: Record })} + {@const mergedProps = mergeProps(buttonProps, props)} + {#if child} + {@render child({ props: mergedProps })} + {:else} + + {/if} +{/snippet} + +{#if !tooltipContent} + {@render Button({})} +{:else} + + + {#snippet child({ props })} + {@render Button({ props })} + {/snippet} + + +{/if} diff --git a/src/lib/components/ui/sidebar/sidebar-menu-item.svelte b/src/lib/components/ui/sidebar/sidebar-menu-item.svelte new file mode 100644 index 00000000..ee82144b --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-menu-item.svelte @@ -0,0 +1,21 @@ + + +
  • + {@render children?.()} +
  • diff --git a/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte b/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte new file mode 100644 index 00000000..5c2effea --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte @@ -0,0 +1,36 @@ + + +
    + {#if showIcon} + + {/if} + + {@render children?.()} +
    diff --git a/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte b/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte new file mode 100644 index 00000000..26b2a90b --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte @@ -0,0 +1,43 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} + + {@render children?.()} + +{/if} diff --git a/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte b/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte new file mode 100644 index 00000000..6e7346d3 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte @@ -0,0 +1,14 @@ + + +
  • + {@render children?.()} +
  • diff --git a/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte b/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte new file mode 100644 index 00000000..2a239905 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte @@ -0,0 +1,25 @@ + + +
      + {@render children?.()} +
    diff --git a/src/lib/components/ui/sidebar/sidebar-menu.svelte b/src/lib/components/ui/sidebar/sidebar-menu.svelte new file mode 100644 index 00000000..72534db3 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-menu.svelte @@ -0,0 +1,21 @@ + + +
      + {@render children?.()} +
    diff --git a/src/lib/components/ui/sidebar/sidebar-provider.svelte b/src/lib/components/ui/sidebar/sidebar-provider.svelte new file mode 100644 index 00000000..086fc281 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-provider.svelte @@ -0,0 +1,53 @@ + + + + + +
    + {@render children?.()} +
    +
    diff --git a/src/lib/components/ui/sidebar/sidebar-rail.svelte b/src/lib/components/ui/sidebar/sidebar-rail.svelte new file mode 100644 index 00000000..ee16fce1 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-rail.svelte @@ -0,0 +1,36 @@ + + + diff --git a/src/lib/components/ui/sidebar/sidebar-separator.svelte b/src/lib/components/ui/sidebar/sidebar-separator.svelte new file mode 100644 index 00000000..0cc3a25b --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-separator.svelte @@ -0,0 +1,18 @@ + + + diff --git a/src/lib/components/ui/sidebar/sidebar-trigger.svelte b/src/lib/components/ui/sidebar/sidebar-trigger.svelte new file mode 100644 index 00000000..87954d67 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar-trigger.svelte @@ -0,0 +1,35 @@ + + + diff --git a/src/lib/components/ui/sidebar/sidebar.svelte b/src/lib/components/ui/sidebar/sidebar.svelte new file mode 100644 index 00000000..0e127eb5 --- /dev/null +++ b/src/lib/components/ui/sidebar/sidebar.svelte @@ -0,0 +1,96 @@ + + +{#if collapsible === "none"} +
    + {@render children?.()} +
    +{:else if sidebar.isMobile} + sidebar.openMobile, (v) => sidebar.setOpenMobile(v)} + {...restProps} + > + +
    + {@render children?.()} +
    +
    +
    +{:else} + +{/if} diff --git a/src/lib/components/ui/skeleton/index.ts b/src/lib/components/ui/skeleton/index.ts new file mode 100644 index 00000000..186db219 --- /dev/null +++ b/src/lib/components/ui/skeleton/index.ts @@ -0,0 +1,7 @@ +import Root from "./skeleton.svelte"; + +export { + Root, + // + Root as Skeleton, +}; diff --git a/src/lib/components/ui/skeleton/skeleton.svelte b/src/lib/components/ui/skeleton/skeleton.svelte new file mode 100644 index 00000000..4089b496 --- /dev/null +++ b/src/lib/components/ui/skeleton/skeleton.svelte @@ -0,0 +1,17 @@ + + +
    diff --git a/src/lib/components/ui/sonner/index.ts b/src/lib/components/ui/sonner/index.ts new file mode 100644 index 00000000..1ad9f4a2 --- /dev/null +++ b/src/lib/components/ui/sonner/index.ts @@ -0,0 +1 @@ +export { default as Toaster } from "./sonner.svelte"; diff --git a/src/lib/components/ui/sonner/sonner.svelte b/src/lib/components/ui/sonner/sonner.svelte new file mode 100644 index 00000000..c2f965c0 --- /dev/null +++ b/src/lib/components/ui/sonner/sonner.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/lib/components/ui/table/index.ts b/src/lib/components/ui/table/index.ts new file mode 100644 index 00000000..14695c81 --- /dev/null +++ b/src/lib/components/ui/table/index.ts @@ -0,0 +1,28 @@ +import Root from "./table.svelte"; +import Body from "./table-body.svelte"; +import Caption from "./table-caption.svelte"; +import Cell from "./table-cell.svelte"; +import Footer from "./table-footer.svelte"; +import Head from "./table-head.svelte"; +import Header from "./table-header.svelte"; +import Row from "./table-row.svelte"; + +export { + Root, + Body, + Caption, + Cell, + Footer, + Head, + Header, + Row, + // + Root as Table, + Body as TableBody, + Caption as TableCaption, + Cell as TableCell, + Footer as TableFooter, + Head as TableHead, + Header as TableHeader, + Row as TableRow, +}; diff --git a/src/lib/components/ui/table/table-body.svelte b/src/lib/components/ui/table/table-body.svelte new file mode 100644 index 00000000..6c20c017 --- /dev/null +++ b/src/lib/components/ui/table/table-body.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-caption.svelte b/src/lib/components/ui/table/table-caption.svelte new file mode 100644 index 00000000..2b0cba56 --- /dev/null +++ b/src/lib/components/ui/table/table-caption.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-cell.svelte b/src/lib/components/ui/table/table-cell.svelte new file mode 100644 index 00000000..05365528 --- /dev/null +++ b/src/lib/components/ui/table/table-cell.svelte @@ -0,0 +1,20 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-footer.svelte b/src/lib/components/ui/table/table-footer.svelte new file mode 100644 index 00000000..0267c47e --- /dev/null +++ b/src/lib/components/ui/table/table-footer.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-head.svelte b/src/lib/components/ui/table/table-head.svelte new file mode 100644 index 00000000..5300ce62 --- /dev/null +++ b/src/lib/components/ui/table/table-head.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-header.svelte b/src/lib/components/ui/table/table-header.svelte new file mode 100644 index 00000000..684a57b1 --- /dev/null +++ b/src/lib/components/ui/table/table-header.svelte @@ -0,0 +1,16 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table-row.svelte b/src/lib/components/ui/table/table-row.svelte new file mode 100644 index 00000000..9e693bc1 --- /dev/null +++ b/src/lib/components/ui/table/table-row.svelte @@ -0,0 +1,23 @@ + + + + {@render children?.()} + diff --git a/src/lib/components/ui/table/table.svelte b/src/lib/components/ui/table/table.svelte new file mode 100644 index 00000000..e3a95b63 --- /dev/null +++ b/src/lib/components/ui/table/table.svelte @@ -0,0 +1,18 @@ + + +
    + + {@render children?.()} +
    +
    diff --git a/src/lib/components/ui/toggle-group/index.ts b/src/lib/components/ui/toggle-group/index.ts new file mode 100644 index 00000000..12b14b96 --- /dev/null +++ b/src/lib/components/ui/toggle-group/index.ts @@ -0,0 +1,10 @@ +import Root from "./toggle-group.svelte"; +import Item from "./toggle-group-item.svelte"; + +export { + Root, + Item, + // + Root as ToggleGroup, + Item as ToggleGroupItem, +}; diff --git a/src/lib/components/ui/toggle-group/toggle-group-item.svelte b/src/lib/components/ui/toggle-group/toggle-group-item.svelte new file mode 100644 index 00000000..87575ba7 --- /dev/null +++ b/src/lib/components/ui/toggle-group/toggle-group-item.svelte @@ -0,0 +1,30 @@ + + + diff --git a/src/lib/components/ui/toggle-group/toggle-group.svelte b/src/lib/components/ui/toggle-group/toggle-group.svelte new file mode 100644 index 00000000..08860053 --- /dev/null +++ b/src/lib/components/ui/toggle-group/toggle-group.svelte @@ -0,0 +1,41 @@ + + + + + + diff --git a/src/lib/components/ui/toggle/index.ts b/src/lib/components/ui/toggle/index.ts new file mode 100644 index 00000000..8cb2936f --- /dev/null +++ b/src/lib/components/ui/toggle/index.ts @@ -0,0 +1,13 @@ +import Root from "./toggle.svelte"; +export { + toggleVariants, + type ToggleSize, + type ToggleVariant, + type ToggleVariants, +} from "./toggle.svelte"; + +export { + Root, + // + Root as Toggle, +}; diff --git a/src/lib/components/ui/toggle/toggle.svelte b/src/lib/components/ui/toggle/toggle.svelte new file mode 100644 index 00000000..b66fa93f --- /dev/null +++ b/src/lib/components/ui/toggle/toggle.svelte @@ -0,0 +1,51 @@ + + + + + diff --git a/src/lib/components/ui/tooltip/index.ts b/src/lib/components/ui/tooltip/index.ts new file mode 100644 index 00000000..e9e1fd73 --- /dev/null +++ b/src/lib/components/ui/tooltip/index.ts @@ -0,0 +1,18 @@ +import { Tooltip as TooltipPrimitive } from "bits-ui"; +import Content from "./tooltip-content.svelte"; + +const Root = TooltipPrimitive.Root; +const Trigger = TooltipPrimitive.Trigger; +const Provider = TooltipPrimitive.Provider; + +export { + Root, + Trigger, + Content, + Provider, + // + Root as Tooltip, + Content as TooltipContent, + Trigger as TooltipTrigger, + Provider as TooltipProvider, +}; diff --git a/src/lib/components/ui/tooltip/tooltip-content.svelte b/src/lib/components/ui/tooltip/tooltip-content.svelte new file mode 100644 index 00000000..68ff232b --- /dev/null +++ b/src/lib/components/ui/tooltip/tooltip-content.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/errorhandling/ProblemDetails.ts b/src/lib/errorhandling/ProblemDetails.ts index e9fb2839..e3aa27fa 100644 --- a/src/lib/errorhandling/ProblemDetails.ts +++ b/src/lib/errorhandling/ProblemDetails.ts @@ -1,6 +1,6 @@ export interface ProblemDetails { - type: string; - title: string; - status: number; - detail: string | null; -} \ No newline at end of file + type: string; + title: string; + status: number; + detail: string | null; +} diff --git a/src/lib/errorhandling/apiErrorHandling.ts b/src/lib/errorhandling/apiErrorHandling.ts index 51062399..13d03e2d 100644 --- a/src/lib/errorhandling/apiErrorHandling.ts +++ b/src/lib/errorhandling/apiErrorHandling.ts @@ -1,48 +1,70 @@ -import { ResponseError } from "$lib/api/internal/v1"; -import type { ToastStore } from "@skeletonlabs/skeleton"; -import type { ProblemDetails } from "./ProblemDetails"; - +import { FetchError, RequiredError, ResponseError } from '$lib/api/internal/v1'; +import { toast } from 'svelte-sonner'; +import type { ProblemDetails } from './ProblemDetails'; export type HandleProblemCallback = (problem: ProblemDetails) => boolean; -export async function handleApiError(error: any, toastStore: ToastStore, - handleProblemCallback: HandleProblemCallback | null = null): Promise { - if (!(error instanceof ResponseError)) { - return; - } - +export async function handleApiError( + error: any, + handleProblemCallback: HandleProblemCallback | null = null +): Promise { + if (error instanceof ResponseError) { const problem = await getProblemDetails(error.response); if (problem === null) { - return; + console.error('Got error with problem of null', error); // TODO: Display toast + return; } - console.error("API error: " + problem.title); + console.error('API error: ' + problem.title); - if(handleProblemCallback && handleProblemCallback(problem)) { - return; + if (handleProblemCallback && handleProblemCallback(problem)) { + // TODO: Display toast + return; } - toastStore.trigger({ - background: 'variant-filled-error', - message: problem.title, - }); + toast.error(problem.title); + return; + } + + if (error instanceof FetchError) { + console.error('Got fetch error: ' + JSON.stringify(error)); // TODO: Display toast + return; + } + + if (error instanceof RequiredError) { + console.error('Got required error: ' + JSON.stringify(error)); // TODO: Display toast + return; + } + + if (error instanceof Error) { + console.error('Got generic error: ' + JSON.stringify(error)); // TODO: Display toast + return; + } + + if ('cause' in error) { + console.error('Got unknown error type: ' + JSON.stringify(error)); // TODO: Display toast + return; + } + + console.error('Got error of unknown type', JSON.stringify(error)); // TODO: Display toast } async function getProblemDetails(response: Response): Promise { - const contentTypeHeader = response.headers.get("Content-Type"); - if (!contentTypeHeader) { - console.error("No content type header found in response"); - return null; - } + const contentTypeHeader = response.headers.get('Content-Type'); + if (!contentTypeHeader) { + console.error('No content type header found in response'); + return null; + } - if(!contentTypeHeader.startsWith('application/problem+json')) { - console.error("Content type header is not application/problem+json [" - + contentTypeHeader + "]"); - return null; - } + if (!contentTypeHeader.startsWith('application/problem+json')) { + console.error( + 'Content type header is not application/problem+json [' + contentTypeHeader + ']' + ); + return null; + } - const problem = (await response.json()) as ProblemDetails; + const problem = (await response.json()) as ProblemDetails; - return problem; -} \ No newline at end of file + return problem; +} diff --git a/src/lib/hooks/is-mobile.svelte.ts b/src/lib/hooks/is-mobile.svelte.ts new file mode 100644 index 00000000..ad5b50e8 --- /dev/null +++ b/src/lib/hooks/is-mobile.svelte.ts @@ -0,0 +1,27 @@ +import { untrack } from 'svelte'; + +const MOBILE_BREAKPOINT = 768; + +export class IsMobile { + #current = $state(false); + + constructor() { + $effect(() => { + return untrack(() => { + const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); + const onChange = () => { + this.#current = window.innerWidth < MOBILE_BREAKPOINT; + }; + mql.addEventListener('change', onChange); + onChange(); + return () => { + mql.removeEventListener('change', onChange); + }; + }); + }); + } + + get current() { + return this.#current; + } +} diff --git a/src/lib/inputvalidation/emailValidator.test.ts b/src/lib/inputvalidation/emailValidator.test.ts index 0f300fe1..196ea224 100644 --- a/src/lib/inputvalidation/emailValidator.test.ts +++ b/src/lib/inputvalidation/emailValidator.test.ts @@ -23,7 +23,7 @@ describe('email validator test', () => { it('valid email should return true and no error', () => { const result = validateEmail('valid.address@email.com'); expect(result).toEqual({ - valid: true + valid: true, }); }); }); diff --git a/src/lib/inputvalidation/emailValidator.ts b/src/lib/inputvalidation/emailValidator.ts index bd1770e8..deebd9ec 100644 --- a/src/lib/inputvalidation/emailValidator.ts +++ b/src/lib/inputvalidation/emailValidator.ts @@ -1,12 +1,34 @@ import type { ValidationResult } from '$lib/types/ValidationResult'; -import { validate } from 'email-validator'; + +const emailRegex = + /^[\w-!#$%&'*+/=?^`{|}~](\.?[\w-!#$%&'*+/=?^`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/; + +export function isEmailAddress(value: string): boolean { + if (!value) return false; + if (value.length > 320) return false; + + const emailParts = value.split('@'); + + if (emailParts.length !== 2) return false; + + const [account, address] = emailParts; + + if (account.length > 64) return false; + if (address.length > 255) return false; + + const domainParts = address.split('.'); + + if (domainParts.some((part) => part.length > 63)) return false; + + return emailRegex.test(value); +} export function validateEmail(value: string): ValidationResult | null { if (value.length == 0) { return null; } - if (!validate(value)) { + if (!isEmailAddress(value)) { return { valid: false, message: 'Invalid email', diff --git a/src/lib/inputvalidation/passwordValidator.test.ts b/src/lib/inputvalidation/passwordValidator.test.ts index 0c8a06ef..f25c934c 100644 --- a/src/lib/inputvalidation/passwordValidator.test.ts +++ b/src/lib/inputvalidation/passwordValidator.test.ts @@ -1,4 +1,4 @@ -import { validatePassword, validatePasswordMatch } from "./passwordValidator"; +import { validatePassword, validatePasswordMatch } from './passwordValidator'; import { describe, expect, it } from 'vitest'; describe('email validator test', () => { @@ -41,40 +41,6 @@ describe('email validator test', () => { message: 'Password cannot start or end with whitespace', }); }); - it('password without lowercase character should return false and error', () => { - const result = validatePassword('MYINSECUREPASSWORD123!'); - expect(result).toEqual({ - valid: false, - message: 'Password must contain a lowercase character', - }); - }); - it('password without uppercase character should return false and error', () => { - const result = validatePassword('myinsecurepassword123!'); - expect(result).toEqual({ - valid: false, - message: 'Password must contain a uppercase character', - }); - }); - it('password without digit should return false and error', () => { - const result = validatePassword('MyInsecurePassword!'); - expect(result).toEqual({ - valid: false, - message: 'Password must contain a digit', - }); - }); - it('password without special character should return false and error', () => { - const result = validatePassword('MyInsecurePassword123'); - expect(result).toEqual({ - valid: false, - message: 'Password must contain a special character', - }); - }); - it('valid password should return true and no error', () => { - const result = validatePassword('validPassword123!'); - expect(result).toEqual({ - valid: true - }); - }); it('password match with different password should return false and error', () => { const result = validatePasswordMatch('password', 'differentpassword'); expect(result).toEqual({ @@ -85,7 +51,7 @@ describe('email validator test', () => { it('password match with invalid password should return false and error', () => { const result = validatePasswordMatch('password', 'password'); expect(result).toEqual({ - valid: true + valid: true, }); }); }); diff --git a/src/lib/inputvalidation/passwordValidator.ts b/src/lib/inputvalidation/passwordValidator.ts index bb947448..7a696887 100644 --- a/src/lib/inputvalidation/passwordValidator.ts +++ b/src/lib/inputvalidation/passwordValidator.ts @@ -2,28 +2,6 @@ import type { TwColor } from '$lib/types/Tailwind'; import type { ValidationResult } from '$lib/types/ValidationResult'; import { calculateStringEntropy } from '$lib/utils/entropy'; -function countCharacters(value: string): { lower: number; upper: number; digit: number; special: number } { - const uniqueChars = new Set(value); - let lower = 0; - let upper = 0; - let digit = 0; - let special = 0; - - for (const char of uniqueChars) { - if (char.match(/[a-z]/)) { - lower++; - } else if (char.match(/[A-Z]/)) { - upper++; - } else if (char.match(/[0-9]/)) { - digit++; - } else if ('!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'.includes(char)) { - special++; - } - } - - return { lower, upper, digit, special }; -} - export function validatePassword(value: string): ValidationResult | null { if (value.length == 0) { return null; @@ -31,7 +9,7 @@ export function validatePassword(value: string): ValidationResult | null { const result = { valid: false, - message: '' + message: '', }; if (value.length < 12) { @@ -55,27 +33,6 @@ export function validatePassword(value: string): ValidationResult | null { return result; } - const { lower, upper, digit, special } = countCharacters(value); - if (lower < 1) { - result.message = 'Password must contain a lowercase character'; - return result; - } - - if (upper < 1) { - result.message = 'Password must contain a uppercase character'; - return result; - } - - if (digit < 1) { - result.message = 'Password must contain a digit'; - return result; - } - - if (special < 1) { - result.message = 'Password must contain a special character'; - return result; - } - return { valid: true }; } @@ -97,7 +54,11 @@ export function validatePasswordMatch( return { valid: true }; } -export function getPasswordStrength(value: string): { percent: number; text: string; color: TwColor } { +export function getPasswordStrength(value: string): { + percent: number; + text: string; + color: TwColor; +} { let percent: number; let text: string; let color: TwColor; diff --git a/src/lib/inputvalidation/usernameValidator.test.ts b/src/lib/inputvalidation/usernameValidator.test.ts index 091b6ef4..a28e4311 100644 --- a/src/lib/inputvalidation/usernameValidator.test.ts +++ b/src/lib/inputvalidation/usernameValidator.test.ts @@ -1,5 +1,5 @@ -import { validateUsername } from "./usernameValidator"; -import { describe, expect, it, test } from 'vitest'; +import { validateUsername } from './usernameValidator'; +import { describe, expect, it } from 'vitest'; describe('username validator test', () => { it('empty username should return null', () => { @@ -121,7 +121,7 @@ describe('username validator test', () => { it('valid username should return true and no error', () => { const result = validateUsername('validUsername'); expect(result).toEqual({ - valid: true + valid: true, }); }); }); diff --git a/src/lib/inputvalidation/usernameValidator.ts b/src/lib/inputvalidation/usernameValidator.ts index 0348f845..0c58bd34 100644 --- a/src/lib/inputvalidation/usernameValidator.ts +++ b/src/lib/inputvalidation/usernameValidator.ts @@ -1,13 +1,12 @@ -import { validate as validateEmail } from 'email-validator'; import type { ValidationResult } from '$lib/types/ValidationResult'; -import { accountApi } from '$lib/api'; import { UsernameAvailability } from '$lib/api/internal/v2'; -import { handleApiError } from '$lib/errorhandling/apiErrorHandling'; +import { isEmailAddress } from './emailValidator'; /* eslint-disable no-misleading-character-class */ // This is taken from https://github.com/OpenShock/API/blob/develop/ServicesCommon/Validation/ChatsetMatchers.cs#L19 const MultipleWhiteSpaceRegex = /\s{2,}/; +// eslint-disable-next-line no-control-regex const UnwantedCharacterRegex = /[\u0000-\u001F\u007F-\u00A0\u02B0-\u036F\u1400-\u17FF\u1AB0-\u1AFF\u1DC0-\u1DFF\u2000-\u209F\u20D0-\u21FF\u2300-\u23FF\u2460-\u24FF\u25A0-\u27BF\u2900-\u297F\u2B00-\u2BFF\uFE00-\uFE0F\u{1F000}-\u{1F02F}\u{1F0A0}-\u{10FFFF}\u00AD\u180B-\u180F\u3000]/u; @@ -102,7 +101,7 @@ export function validateUsername(value: string): ValidationResult | null { return UsernameBannedCharactersValRes; } - if (validateEmail(value)) { + if (isEmailAddress(value)) { return UsernameResemblesEmailValRes; } @@ -111,9 +110,9 @@ export function validateUsername(value: string): ValidationResult | null { export function mapUsernameAvailability(availability: UsernameAvailability): ValidationResult { switch (availability) { - case UsernameAvailability.available: + case UsernameAvailability.Available: return UsernameAvailableValRes; - case UsernameAvailability.taken: + case UsernameAvailability.Taken: return UsernameTakenValRes; default: return UsernameAvailabilityUnknownValRes; diff --git a/src/lib/metadata.ts b/src/lib/metadata.ts index 8bc3e8d0..38a98953 100644 --- a/src/lib/metadata.ts +++ b/src/lib/metadata.ts @@ -1,13 +1,13 @@ -import { PUBLIC_SITE_NAME, PUBLIC_SITE_DESCRIPTION } from "$env/static/public"; -import type { Page } from "@sveltejs/kit"; +import { PUBLIC_SITE_DESCRIPTION, PUBLIC_SITE_NAME } from '$env/static/public'; -function getPageTitleAndDescription(page: Page): { title: string; description: string } { +// eslint-disable-next-line @typescript-eslint/no-unused-vars +function getPageTitleAndDescription(url: URL): { title: string; description: string } { const title = PUBLIC_SITE_NAME.trim(); const details = PUBLIC_SITE_DESCRIPTION.trim(); let description: string; switch (title.toLowerCase()) { - case "openshock": + case 'openshock': description = `Welcome to OpenShock, ${details}`; break; default: @@ -18,17 +18,17 @@ function getPageTitleAndDescription(page: Page): { title: string; description: s return { title, description }; } -export function buildMetaData(page: Page) { - const { title, description } = getPageTitleAndDescription(page); +export function buildMetaData(url: URL) { + const { title, description } = getPageTitleAndDescription(url); const image = { - src: new URL('/logo.svg', page.url.origin).href, + src: new URL('/logo.svg', url.origin).href, alt: 'OpenShock Logo', }; return { title, description, - image + image, }; } diff --git a/src/lib/modals/ApiTokenDisplayGeneratedModal.svelte b/src/lib/modals/ApiTokenDisplayGeneratedModal.svelte deleted file mode 100644 index bf9cff93..00000000 --- a/src/lib/modals/ApiTokenDisplayGeneratedModal.svelte +++ /dev/null @@ -1,42 +0,0 @@ - - -
    -
    API Token Generated
    -

    Please copy your API Token now, you will not be able to view it again later!

    -
    - -
    -
    - - -
    - - -
    -
    diff --git a/src/lib/modals/ApiTokenEditModal.svelte b/src/lib/modals/ApiTokenEditModal.svelte deleted file mode 100644 index f943171b..00000000 --- a/src/lib/modals/ApiTokenEditModal.svelte +++ /dev/null @@ -1,130 +0,0 @@ - - -
    -
    Generate a new API Token
    - -
    diff --git a/src/lib/modals/ApiTokenGenerateModal.svelte b/src/lib/modals/ApiTokenGenerateModal.svelte deleted file mode 100644 index 0d7f5aaa..00000000 --- a/src/lib/modals/ApiTokenGenerateModal.svelte +++ /dev/null @@ -1,180 +0,0 @@ - - -
    -
    Generate a new API Token
    - -
    diff --git a/src/lib/modals/InstallDriversModal.svelte b/src/lib/modals/InstallDriversModal.svelte deleted file mode 100644 index 2fc4a851..00000000 --- a/src/lib/modals/InstallDriversModal.svelte +++ /dev/null @@ -1,95 +0,0 @@ - - -
    -
    -

    Install device drivers

    -
    -
    -
    -

    1. Download drivers

    - - - CP210x Universal Windows Driver - -
    -
    -

    2. Extract the zip file

    -

    Extract the contents of the zip file to a folder on your computer.

    -
    -
    -

    3. Run the installer

    -

    - Go to the folder where you extracted the zip file and run - CP210xVCPInstaller_x64.exe
    - Follow the instructions to install the drivers. -

    -
    -

    If the device still doesn't appear in the list:

    -
    -

    1. Open Device Manager

    -

    - Press Win + X and select - Device Manager. -

    -
    -
    -

    2. Find your device

    -

    - Go to Ports (COM & LPT) and look a device similar to one of the following: -

    -
      -
    • Silicon Labs CP210x USB to UART Bridge
    • -
    • Silicon Labs CP210x USB to UART Bridge (COM...)
    • -
    -

    - If you don't see it in the list, make sure that your device is connected to your computer. -

    -
    -
    -

    3. Update drivers

    -

    - Right click on the device and select Update Driver. -

    -

    - Select Browse my computer for drivers and browse to the folder where - you extracted the zip file. -

    -

    Make sure that Include subfolders option is checked.

    -

    - If successful, you should see Silicon Labs CP210x USB to UART Bridge in the list. -

    -
    -

    Still having problems?

    -
    -

    - If you still have problems, join our discord server and ask for help in the #support - channel. -

    - - - Join our Discord server - -
    -
    -
    diff --git a/src/lib/modals/SignUpSuccessModal.svelte b/src/lib/modals/SignUpSuccessModal.svelte deleted file mode 100644 index 64741751..00000000 --- a/src/lib/modals/SignUpSuccessModal.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - -
    -
    -

    Account created

    -

    Your account has been created. Please check your email to verify your account.

    - -
    -
    diff --git a/src/lib/modals/index.ts b/src/lib/modals/index.ts deleted file mode 100644 index ffb8bba1..00000000 --- a/src/lib/modals/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { ModalComponent } from "@skeletonlabs/skeleton"; -import InstallDriversModal from "./InstallDriversModal.svelte"; -import SignUpSuccessModal from "./SignUpSuccessModal.svelte"; -import ApiTokenGenerateModal from "./ApiTokenGenerateModal.svelte"; -import ApiTokenEditModal from "./ApiTokenEditModal.svelte"; -import ApiTokenDisplayGeneratedModal from "./ApiTokenDisplayGeneratedModal.svelte"; - -export const modalRegistry: Record = { - 'InstallDrivers': { ref: InstallDriversModal }, - 'SignUpSuccess': { ref: SignUpSuccessModal }, - 'ApiTokenGenerate': { ref: ApiTokenGenerateModal }, - 'ApiTokenEdit': { ref: ApiTokenEditModal }, - 'ApiTokenDisplayGenerated': { ref: ApiTokenDisplayGeneratedModal }, -}; diff --git a/src/lib/signalr/connection.ts b/src/lib/signalr/connection.ts deleted file mode 100644 index e8ba329e..00000000 --- a/src/lib/signalr/connection.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { browser } from '$app/environment'; -import { PUBLIC_BACKEND_API_DOMAIN } from '$env/static/public'; -import { OwnDeviceStatesStore, refreshOwnDevices, type OwnDeviceState } from '$lib/stores/DevicesStore'; -import { UserStore } from '$lib/stores/UserStore'; -import * as SignalR from '@microsoft/signalr'; -import { get, writable } from 'svelte/store'; - -const signalr_connection = writable(null); -const signalr_state = writable(SignalR.HubConnectionState.Disconnected); - -function isDeviceStatusArray(array: any): array is OwnDeviceState[] { - if (!array || !Array.isArray(array)) return false; - - for (const item of array) { - if (Object.hasOwnProperty.call(item, 'device') && typeof item.device !== 'string') { - return false; - } - - if ( - Object.hasOwnProperty.call(item, 'firmwareVersion') && - typeof item.firmwareVersion !== 'string' - ) { - return false; - } - - if (Object.hasOwnProperty.call(item, 'online') && typeof item.online !== 'boolean') { - return false; - } - } - - return true; -} - -async function create_signalr_connection() { - let connection = get(signalr_connection); - if (connection) { - return; - } - - connection = new SignalR.HubConnectionBuilder() - .configureLogging(SignalR.LogLevel.Debug) - .withUrl(`https://${PUBLIC_BACKEND_API_DOMAIN}/1/hubs/user`, { - transport: SignalR.HttpTransportType.WebSockets, - skipNegotiation: true, - }) - .withAutomaticReconnect([0, 1000, 2000, 5000, 10000, 10000, 15000, 30000, 60000]) - .build(); - - connection.onclose(() => { - signalr_state.set(SignalR.HubConnectionState.Disconnected); - }); - - connection.onreconnecting(() => { - signalr_state.set(SignalR.HubConnectionState.Reconnecting); - }); - - connection.onreconnected(() => { - signalr_state.set(SignalR.HubConnectionState.Connected); - }); - - connection.on('welcome', (message) => { - console.log(message); - }); - - connection.on('devicestatus', (message) => { - if (!isDeviceStatusArray(message)) { - console.error('Received invalid device status message'); - return; - } - - OwnDeviceStatesStore.set(message); - }); - - connection.on('deviceupdate', (message) => { - console.log('Received device update message', message); - refreshOwnDevices(); - }); - - signalr_connection.set(connection); - - await connection.start(); -} - -function destroy_signalr_connection() { - if (signalr_connection) { - const connection = get(signalr_connection); - if (connection) { - connection.stop(); - signalr_connection.set(null); - } - } -} - -if (browser) { - UserStore.subscribe(({ self }) => { - if (self === null) { - destroy_signalr_connection(); - } else { - create_signalr_connection() - .then(() => { - signalr_state.set(SignalR.HubConnectionState.Connected); - }) - .catch((e) => { - console.error(e); - signalr_state.set(SignalR.HubConnectionState.Disconnected); - }); - } - }); -} - -export { signalr_connection, signalr_state }; diff --git a/src/lib/signalr/handlers/DeviceStatus.ts b/src/lib/signalr/handlers/DeviceStatus.ts new file mode 100644 index 00000000..7c430471 --- /dev/null +++ b/src/lib/signalr/handlers/DeviceStatus.ts @@ -0,0 +1,46 @@ +import { OnlineHubsStore } from '$lib/stores/HubsStore'; +import { toast } from 'svelte-sonner'; + +type SignalrHub = { + device: string; + online: boolean; + firmwareVersion: string | null; +}; + +function isValidSignalrHubArray(array: unknown): array is SignalrHub[] { + if (!Array.isArray(array)) { + return false; + } + + return array.every( + (item) => + typeof item === 'object' && + item !== null && + 'device' in item && + 'online' in item && + 'firmwareVersion' in item && + typeof item.device === 'string' && + typeof item.online === 'boolean' && + (typeof item.firmwareVersion === 'string' || item.firmwareVersion === null) + ); +} + +export function handleSignalrDeviceState(array: unknown) { + if (!isValidSignalrHubArray(array)) { + console.error('Received invalid SignalR DeviceState event', array); + toast.error('Received invalid update from server!'); + return; + } + + OnlineHubsStore.update((state) => { + array.forEach((entry) => { + state.set(entry.device, { + hubId: entry.device, + isOnline: entry.online, + firmwareVersion: entry.firmwareVersion, + }); + }); + + return state; + }); +} diff --git a/src/lib/signalr/handlers/DeviceUpdate.ts b/src/lib/signalr/handlers/DeviceUpdate.ts new file mode 100644 index 00000000..43e19cd8 --- /dev/null +++ b/src/lib/signalr/handlers/DeviceUpdate.ts @@ -0,0 +1,13 @@ +import { refreshOwnHubs } from '$lib/stores/HubsStore'; +import { isNumber, isString } from '$lib/typeguards'; +import { toast } from 'svelte-sonner'; + +export function handleSignalrDeviceUpdate(deviceId: unknown, count: unknown) { + if (isString(deviceId) && isNumber(count)) { + refreshOwnHubs(); + return; + } + + console.error('Received invalid SignalR DeviceUpdate event', deviceId, count); + toast.error('Received invalid update from server!'); +} diff --git a/src/lib/signalr/index.ts b/src/lib/signalr/index.ts new file mode 100644 index 00000000..e6bb6588 --- /dev/null +++ b/src/lib/signalr/index.ts @@ -0,0 +1,90 @@ +import { browser, dev } from '$app/environment'; +import { PUBLIC_BACKEND_API_DOMAIN } from '$env/static/public'; +import { UserStore } from '$lib/stores/UserStore'; +import * as SR from '@microsoft/signalr'; +import { get, writable, type Readable } from 'svelte/store'; +import { handleSignalrDeviceState } from './handlers/DeviceStatus'; +import { handleSignalrDeviceUpdate } from './handlers/DeviceUpdate'; +import { toast } from 'svelte-sonner'; + +const signalr_connection = writable(null); +const signalr_state = writable(SR.HubConnectionState.Disconnected); + +async function create_signalr_connection() { + let connection = get(signalr_connection); + if (connection) { + return; + } + + connection = new SR.HubConnectionBuilder() + .configureLogging(dev ? SR.LogLevel.Debug : SR.LogLevel.Information) + .withUrl(`https://${PUBLIC_BACKEND_API_DOMAIN}/1/hubs/user`, { + transport: SR.HttpTransportType.WebSockets, + skipNegotiation: true, + }) + .withAutomaticReconnect([0, 1000, 2000, 5000, 10000, 10000, 15000, 30000, 60000]) + .build(); + + connection.onclose(() => { + signalr_state.set(SR.HubConnectionState.Disconnected); + }); + + connection.onreconnecting(() => { + signalr_state.set(SR.HubConnectionState.Reconnecting); + }); + + connection.onreconnected(() => { + signalr_state.set(SR.HubConnectionState.Connected); + }); + + connection.on('Welcome', (message) => { + console.log(message); + }); + + connection.on('Log', (log) => {}); + + connection.on('DeviceStatus', handleSignalrDeviceState); + connection.on('DeviceUpdate', handleSignalrDeviceUpdate); + + signalr_connection.set(connection); + + await connection.start(); +} + +function destroy_signalr_connection() { + if (signalr_connection) { + const connection = get(signalr_connection); + if (connection) { + connection.stop(); + signalr_connection.set(null); + } + } +} + +export const SignalR_State = { + subscribe: signalr_state.subscribe, +} as Readable; + +export const SignalR_Connection = { + subscribe: signalr_connection.subscribe, +} as Readable; + +export function initializeSignalR() { + if (!browser) return; + + UserStore.subscribe(({ self }) => { + if (self === null) { + destroy_signalr_connection(); + } else { + create_signalr_connection() + .then(() => { + signalr_state.set(SR.HubConnectionState.Connected); + }) + .catch((e) => { + console.error(e); + toast.error('Failed to connect to server!'); + signalr_state.set(SR.HubConnectionState.Disconnected); + }); + } + }); +} diff --git a/src/lib/stores/ApiTokensStore.ts b/src/lib/stores/ApiTokensStore.ts new file mode 100644 index 00000000..031f1df9 --- /dev/null +++ b/src/lib/stores/ApiTokensStore.ts @@ -0,0 +1,43 @@ +import { tokensApi } from '$lib/api'; +import type { TokenResponse } from '$lib/api/internal/v1'; +import { writable } from 'svelte/store'; + +export type ApiToken = TokenResponse; + +export const ApiTokensStore = writable>(new Map()); + +export function refreshApiToken(id: string) { + tokensApi + .tokensGetTokenById(id) + .then((token) => { + ApiTokensStore.update((state) => { + state.set(token.id, token); + return state; + }); + }) + .catch((error) => { + console.error(error); // TODO: Show toast + }); +} + +export function refreshApiTokens() { + tokensApi + .tokensListTokens() + .then((tokens) => { + ApiTokensStore.set(new Map(tokens.map((t) => [t.id, t]))); + }) + .catch((error) => { + console.error(error); // TODO: Show toast + }); +} + +export function deleteApiToken(id: string) { + ApiTokensStore.update((state) => { + state.delete(id); + return state; + }); +} + +export function initializeApiTokenStore() { + refreshApiTokens(); +} diff --git a/src/lib/stores/AuthTokenStore.ts b/src/lib/stores/AuthTokenStore.ts deleted file mode 100644 index 598d15af..00000000 --- a/src/lib/stores/AuthTokenStore.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { AuthToken } from "$lib/types/AuthToken"; -import { writable, type Writable } from "svelte/store"; - -const LOCALSTORAGE_KEY = "authToken"; - -const { subscribe, set, update } = writable(null); - -function setAll(authToken: AuthToken | null) { - if (!authToken) { - localStorage.removeItem("authToken"); - set(null); - return; - } - - localStorage.setItem("authToken", JSON.stringify(authToken)); - set(authToken); -} - -function isAuthToken(value: unknown): value is AuthToken { - if (typeof value !== "object" || value === null) { - return false; - } - - const authToken = value as AuthToken; - return typeof authToken.token === "string" && typeof authToken.expires === "number"; -} - -function updateFromJson(json: string | null) { - if (!json) { - setAll(null); - return; - } - - const authToken = JSON.parse(json); - if (!isAuthToken(authToken)) { - console.error("Invalid auth token, clearing localStorage"); - setAll(null); - return; - } - - setAll(authToken); -} - -window.addEventListener("storage", (event) => { - if (event.storageArea === localStorage && event.key === LOCALSTORAGE_KEY) { - updateFromJson(event.newValue); - } -}); - -export const authTokenStore: Writable = { - subscribe, - set: setAll, - update, -}; diff --git a/src/lib/stores/ColorSchemeStore.ts b/src/lib/stores/ColorSchemeStore.ts new file mode 100644 index 00000000..80a4bafb --- /dev/null +++ b/src/lib/stores/ColorSchemeStore.ts @@ -0,0 +1,117 @@ +import { browser } from '$app/environment'; +import { writable, type Updater } from 'svelte/store'; + +function getLocalStoreState() { + const scheme = localStorage.getItem('theme'); + if (scheme === 'dark' || scheme === 'light' || scheme === 'system') { + return scheme; + } + + localStorage.setItem('theme', 'system'); + + return 'system'; +} + +export function getDarkReaderState() { + const rootHtml = document.documentElement; + + const proxyInjected = rootHtml.getAttribute('data-darkreader-proxy-injected'); + const metaElement = rootHtml.querySelector('head meta[name="darkreader"]'); + + let scheme = rootHtml.getAttribute('data-darkreader-scheme'); + if (scheme === 'auto') { + scheme = 'system'; + } + + return { + isInjected: proxyInjected === 'true', + isActive: metaElement !== null, + scheme, + }; +} + +function getColorSchemePreference() { + // If we are not in a browser environment, return default + if (!browser) { + return 'system'; + } + + // Check if local storage has a theme stored + const localStoreState = getLocalStoreState(); + if (localStoreState !== 'system') { + return localStoreState; + } + + // If a user has Dark Reader extension installed, assume they prefer dark mode + const darkReaderState = getDarkReaderState(); + if (darkReaderState.isInjected) { + return 'dark'; + } + + // Check if the user has a system theme preference for light mode + if (window.matchMedia('(prefers-color-scheme: light)').matches) { + return 'light'; + } + + // Default to dark mode + return 'dark'; +} + +const { set, update, subscribe } = writable<'dark' | 'light' | 'system'>( + getColorSchemePreference() +); + +function setHtmlDarkModeSelector(value: boolean) { + document.documentElement.classList.toggle('dark', value); +} + +function handleSchemePreferenceChange() { + const scheme = getColorSchemePreference(); + setHtmlDarkModeSelector(scheme === 'dark'); +} + +export const ColorSchemeStore = { + set: (value: 'dark' | 'light' | 'system') => { + localStorage.setItem('theme', value); + set(value); + handleSchemePreferenceChange(); + }, + update: (updater: Updater<'dark' | 'light' | 'system'>) => { + update((value) => { + const oldValue = value; + const newValue = updater(value); + if (oldValue !== newValue) { + setHtmlDarkModeSelector(newValue === 'dark'); + localStorage.setItem('theme', newValue); + } + return newValue; + }); + }, + subscribe, +}; + +export function willActivateLightMode(value: 'dark' | 'light' | 'system') { + return ( + value === 'light' || + (value === 'system' && window.matchMedia('(prefers-color-scheme: light)').matches) + ); +} + +export function initializeDarkModeStore() { + const schemePreference = getColorSchemePreference(); + setHtmlDarkModeSelector(schemePreference === 'dark'); + set(schemePreference); + + window + .matchMedia('(prefers-color-scheme: light)') + .addEventListener('change', handleSchemePreferenceChange); + window + .matchMedia('(prefers-color-scheme: dark)') + .addEventListener('change', handleSchemePreferenceChange); + + window.addEventListener('storage', (event) => { + if (event.key !== 'theme') return; + + setHtmlDarkModeSelector(event.newValue === 'dark'); + }); +} diff --git a/src/lib/stores/DevicesStore.ts b/src/lib/stores/DevicesStore.ts deleted file mode 100644 index adb3101a..00000000 --- a/src/lib/stores/DevicesStore.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { browser } from "$app/environment"; -import { shockerV1Api } from "$lib/api"; -import type { ResponseDeviceWithShockers } from "$lib/api/internal/v1"; -import { writable } from "svelte/store"; - -export type OwnDevice = ResponseDeviceWithShockers; -export interface OwnDeviceState { - device: string; - online: boolean; - firmwareVersion: string; -}; - -const OwnDevicesStore = writable(null); -const OwnDeviceStatesStore = writable(null); - -function refreshOwnDevices() { - shockerV1Api.shockerListShockers().then((response) => { - if (!response.data) { - throw new Error(`Failed to fetch devices: ${response.message}`); - } - - OwnDevicesStore.set(response.data); - }); -} - -if (browser) { - refreshOwnDevices(); -} - -export { OwnDevicesStore, OwnDeviceStatesStore, refreshOwnDevices }; diff --git a/src/lib/stores/FlashManagersStore.ts b/src/lib/stores/FlashManagersStore.ts index 0c980dab..e4e960d5 100644 --- a/src/lib/stores/FlashManagersStore.ts +++ b/src/lib/stores/FlashManagersStore.ts @@ -1,7 +1,6 @@ -import { browser } from "$app/environment"; -import FlashManager from "$lib/components/EspTool/FlashManager"; -import type { IEspLoaderTerminal } from "esptool-js"; -import { get, writable } from "svelte/store"; +import FlashManager from '$lib/EspTool/FlashManager'; +import type { IEspLoaderTerminal } from 'esptool-js'; +import { get, writable } from 'svelte/store'; const { update, subscribe } = writable([]); @@ -11,7 +10,7 @@ async function getManager(port: SerialPort, terminal: IEspLoaderTerminal) { return manager; } - console.log("Connecting to", port); + console.log('Connecting to', port); manager = await FlashManager.Connect(port, terminal); @@ -25,6 +24,7 @@ async function getManager(port: SerialPort, terminal: IEspLoaderTerminal) { async function removeManager(manager: FlashManager) { try { await manager.disconnect(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { // Ignore } @@ -35,12 +35,12 @@ async function removeManager(manager: FlashManager) { } function removePort(port: SerialPort) { - console.log("Removing port", port); + console.log('Removing port', port); update((m) => { const manager = m.find((m) => m.SerialPort === port); if (manager) { - console.log("Disconnecting manager", manager); + console.log('Disconnecting manager', manager); manager.disconnect(); // Ignored promise } @@ -48,13 +48,15 @@ function removePort(port: SerialPort) { }); } -if (browser && 'serial' in navigator) { - navigator.serial.addEventListener("disconnect", (e) => removePort(e.target as SerialPort)); -} - export const FlashManagerStore = { getManager, removeManager, removePort, subscribe, }; + +export function initializeFlashManagersStore() { + if ('serial' in navigator) { + navigator.serial.addEventListener('disconnect', (e) => removePort(e.target as SerialPort)); + } +} diff --git a/src/lib/stores/HubsStore.ts b/src/lib/stores/HubsStore.ts new file mode 100644 index 00000000..6ca7814c --- /dev/null +++ b/src/lib/stores/HubsStore.ts @@ -0,0 +1,31 @@ +import { shockerV1Api } from '$lib/api'; +import type { ResponseDeviceWithShockers } from '$lib/api/internal/v1'; +import { handleApiError } from '$lib/errorhandling/apiErrorHandling'; +import { writable } from 'svelte/store'; + +export type OwnHub = ResponseDeviceWithShockers; +export type HubOnlineState = { + hubId: string; + isOnline: boolean; + firmwareVersion: string | null; +}; + +export const OwnHubsStore = writable>(new Map()); +export const OnlineHubsStore = writable>(new Map()); + +export function refreshOwnHubs() { + shockerV1Api + .shockerListShockers() + .then((response) => { + if (!response.data) { + throw new Error(`Failed to fetch devices: ${response.message}`); + } + + OwnHubsStore.set(new Map(response.data.map((d) => [d.id, d]))); + }) + .catch(handleApiError); +} + +export function initializeDevicesStore() { + refreshOwnHubs(); +} diff --git a/src/lib/stores/SerialPortsStore.ts b/src/lib/stores/SerialPortsStore.ts index 2ed021ca..56fe8232 100644 --- a/src/lib/stores/SerialPortsStore.ts +++ b/src/lib/stores/SerialPortsStore.ts @@ -1,5 +1,4 @@ -import { browser } from "$app/environment"; -import { writable } from "svelte/store"; +import { writable } from 'svelte/store'; const { update, subscribe } = writable([]); @@ -10,17 +9,6 @@ function removePort(port: SerialPort) { update((p) => p.filter((p) => p !== port)); } -if (browser && 'serial' in navigator) { - navigator.serial.addEventListener("connect", (e) => addPort(e.target as SerialPort)); - navigator.serial.addEventListener("disconnect", (e) => removePort(e.target as SerialPort)); - - navigator.serial.getPorts().then((ports) => { - if (ports.length > 0) { - update((p) => [...p, ...ports]); - } - }); -} - export const SerialPortsStore = { requestPort: async (options: SerialPortRequestOptions) => { const port = await navigator.serial.requestPort(options); @@ -29,3 +17,21 @@ export const SerialPortsStore = { }, subscribe, }; + +export function initializeSerialPortsStore() { + if (!('serial' in navigator)) return; + + navigator.serial.addEventListener('connect', (e) => addPort(e.target as SerialPort)); + navigator.serial.addEventListener('disconnect', (e) => removePort(e.target as SerialPort)); + + navigator.serial + .getPorts() + .then((ports) => { + if (ports.length > 0) { + update((p) => [...p, ...ports]); + } + }) + .catch((error) => { + console.error('Failed to get ports', error); // TODO: Show toast + }); +} diff --git a/src/lib/stores/UserStore.ts b/src/lib/stores/UserStore.ts index 5e276037..a5f76f4c 100644 --- a/src/lib/stores/UserStore.ts +++ b/src/lib/stores/UserStore.ts @@ -1,9 +1,11 @@ -import { browser } from "$app/environment"; -import { usersApi } from "$lib/api"; -import type { ApiUser, ApiUserSelf } from "$lib/types/ApiUser"; -import { writable } from "svelte/store"; +import { usersApi } from '$lib/api'; +import type { ApiUser, ApiUserSelf } from '$lib/types/ApiUser'; +import { writable } from 'svelte/store'; -const { set, update, subscribe } = writable<{ self: ApiUserSelf | null, all: ApiUser[] }>({ self: null, all: [] }); +const { set, update, subscribe } = writable<{ self: ApiUserSelf | null; all: ApiUser[] }>({ + self: null, + all: [], +}); function updateAllFromSelf(all: ApiUser[], self: ApiUserSelf | null): ApiUser[] { if (!self) return all; @@ -24,41 +26,38 @@ function setSelfName(name: string) { }); } -async function refreshSelf() { - if (!browser) return; +function refreshSelf() { + usersApi + .usersGetSelf() + .then(({ data, message }) => { + if (!data) { + console.error(`Failed to get user self: ${message}`); + return; + } - try { - const { data, message } = await usersApi.usersGetSelf(); + const user = { + id: data.id!, + name: data.name!, + avatar: data.image!, + rank: data.rank!, + email: data.email!, + }; - if (!data) { - console.error(`Failed to get user self: ${message}`); - return; - } - - const user = { - id: data.id!, - name: data.name!, - avatar: data.image!, - rank: data.rank!, - email: data.email!, - }; - - update((state) => { - state.self = user; - state.all = updateAllFromSelf(state.all, user); - return state; + update((state) => { + state.self = user; + state.all = updateAllFromSelf(state.all, user); + return state; + }); + }) + .catch((error) => { + console.error(error); // TODO: Show toast }); - } catch (error) { - console.error(error); - } } function reset() { set({ self: null, all: [] }); } -refreshSelf(); - export const UserStore = { subscribe, set, @@ -67,3 +66,7 @@ export const UserStore = { refreshSelf, reset, }; + +export function initializeUserStore() { + refreshSelf(); +} diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts new file mode 100644 index 00000000..52c5c981 --- /dev/null +++ b/src/lib/stores/index.ts @@ -0,0 +1,18 @@ +import { initializeApiTokenStore } from './ApiTokensStore'; +import { initializeDarkModeStore } from './ColorSchemeStore'; +import { initializeDevicesStore } from './HubsStore'; +import { initializeFlashManagersStore } from './FlashManagersStore'; +import { initializeSerialPortsStore } from './SerialPortsStore'; +import { initializeUserStore } from './UserStore'; +import { browser } from '$app/environment'; + +export function initializeStores() { + if (!browser) return; + + initializeApiTokenStore; + initializeDarkModeStore(); + initializeDevicesStore(); + initializeFlashManagersStore(); + initializeSerialPortsStore(); + initializeUserStore(); +} diff --git a/src/lib/types/AnyComponent.ts b/src/lib/types/AnyComponent.ts new file mode 100644 index 00000000..a7bd37dc --- /dev/null +++ b/src/lib/types/AnyComponent.ts @@ -0,0 +1,4 @@ +import type { Component, SvelteComponent } from "svelte"; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type AnyComponent = Component | (new (...args: any[]) => SvelteComponent); diff --git a/src/lib/types/ApiUser.ts b/src/lib/types/ApiUser.ts index 45cd1d8e..ce433ece 100644 --- a/src/lib/types/ApiUser.ts +++ b/src/lib/types/ApiUser.ts @@ -1,11 +1,11 @@ -import type { RankType } from "$lib/api/internal/v1"; +import type { RankType } from '$lib/api/internal/v1'; export interface ApiUser { id: string; name: string; avatar: string; rank: RankType; -}; +} export interface ApiUserSelf extends ApiUser { email: string; -}; +} diff --git a/src/lib/types/Tailwind.ts b/src/lib/types/Tailwind.ts index e58af47c..17005124 100644 --- a/src/lib/types/Tailwind.ts +++ b/src/lib/types/Tailwind.ts @@ -1,6 +1,5 @@ - -type color - = 'slate' +type color = + | 'slate' | 'gray' | 'zinc' | 'neutral' @@ -23,19 +22,15 @@ type color | 'pink' | 'rose'; -type shade - = 50 - | 100 - | 200 - | 300 - | 400 - | 500 - | 600 - | 700 - | 800 - | 900; +type shade = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900; -export type TwColor = 'transparent' | 'current' | 'black' | 'white' | 'inherit' | `${color}-${shade}`; +export type TwColor = + | 'transparent' + | 'current' + | 'black' + | 'white' + | 'inherit' + | `${color}-${shade}`; export type TwBgColor = `bg-${TwColor}`; export type TwTextColor = `text-${TwColor}`; export type TwBorderColor = `border-${TwColor}`; diff --git a/src/lib/types/TurnstileInstance.ts b/src/lib/types/TurnstileInstance.ts index a6c8d97b..41c1c9e4 100644 --- a/src/lib/types/TurnstileInstance.ts +++ b/src/lib/types/TurnstileInstance.ts @@ -8,7 +8,17 @@ export interface TurnstileInstance { getResponse: (container: string | HTMLElement) => string; implicitRender: () => void; ready: (callback: (token: string) => void) => void; - remove: (container: string | HTMLElement) => void; - render: (container: string | HTMLElement, parameters: TurnstileRenderParameters) => void; - reset: (container: string | HTMLElement) => void; + + /** + * Programatically loads turnstile + * @param container reference to a HTML widget + * @param parameters render parameters + * @returns Returns a widgetId if successful, else returns undefined. + */ + render: ( + container: string | HTMLElement, + parameters: TurnstileRenderParameters + ) => string | undefined; + reset: (widgetId: string) => void; + remove: (widgetId: string) => void; } diff --git a/src/lib/types/TurnstileRenderParameters.ts b/src/lib/types/TurnstileRenderParameters.ts index 4b3638f3..a170cc30 100644 --- a/src/lib/types/TurnstileRenderParameters.ts +++ b/src/lib/types/TurnstileRenderParameters.ts @@ -1,38 +1,168 @@ export interface TurnstileRenderParameters { + /** + * Every widget has a sitekey. + * + * This sitekey is associated with the corresponding widget configuration and is created upon the widget creation. + */ sitekey: string; + + /** + * A customer value that can be used to differentiate widgets under the same sitekey in analytics and which is returned upon validation. + * + * This can only contain up to 32 alphanumeric characters including _ and -. + */ action?: string; + + /** + * A customer payload that can be used to attach customer data to the challenge throughout its issuance and which is returned upon validation. + * + * This can only contain up to 255 alphanumeric characters including _ and -. + */ cData?: string; + + /** + * A JavaScript callback invoked upon success of the challenge. + * + * The callback is passed a token that can be validated. + */ callback?: (token: string) => void; + + /** + * A JavaScript callback invoked when there is an error (e.g. network error or the challenge failed). + * + * Refer to {@link https://developers.cloudflare.com/turnstile/troubleshooting/client-side-errors/|Client-side errors}. + */ 'error-callback'?: () => void; + + /** + * Execution controls when to obtain the token of the widget and can be on render (default) or on execute. + * + * Refer to {@link https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#execution-modes|Execution Modes} for more information. + */ execution?: 'render' | 'execute'; + + /** + * A JavaScript callback invoked when the token expires and does not reset the widget. + */ 'expired-callback'?: () => void; + + /** + * A JavaScript callback invoked before the challenge enters interactive mode. + */ + 'before-interactive-callback'?: () => void; + + /** + * A JavaScript callback invoked when challenge has left interactive mode. + */ + 'after-interactive-callback'?: () => void; + + /** + * A JavaScript callback invoked when a given client/browser is not supported by Turnstile. + */ + 'unsupported-callback'?: () => void; + + /** + * The widget theme. Can take the following values: light, dark, auto. + * + * The default is auto, which respects the user preference. This can be forced to light or dark by setting the theme accordingly. + */ theme?: 'light' | 'dark' | 'auto'; + + /** + * Language to display, must be either: auto (default) to use the language that the visitor has chosen, or an ISO 639-1 two-letter language code (e.g. en) or language and country code (e.g. en-US). + * + * Refer to the {@link https://developers.cloudflare.com/turnstile/reference/supported-languages/|list of supported languages} for more information. + */ language?: - | 'auto' - | 'ar-eg' - | 'de' - | 'en' - | 'es' - | 'fa' - | 'fr' - | 'id' - | 'it' - | 'ja' - | 'ko' - | 'nl' - | 'pl' - | 'pt-br' - | 'ru' - | 'tr' - | 'zh-cn' - | 'zh-tw'; + | 'auto' + | 'ar-eg' + | 'de' + | 'en' + | 'es' + | 'fa' + | 'fr' + | 'id' + | 'it' + | 'ja' + | 'ko' + | 'nl' + | 'pl' + | 'pt-br' + | 'ru' + | 'tr' + | 'zh-cn' + | 'zh-tw'; + + /** + * The tabindex of Turnstile's iframe for accessibility purposes. + * + * The default value is 0. + */ tabindex?: number; + + /** + * A JavaScript callback invoked when the challenge presents an interactive challenge but was not solved within a given time. + * + * A callback will reset the widget to allow a visitor to solve the challenge again. + */ 'timeout-callback'?: () => void; - 'response-field'?: string; + + /** + * A boolean that controls if an input element with the response token is created, defaults to true. + */ + 'response-field'?: boolean; + + /** + * Name of the input element, defaults to cf-turnstile-response. + */ 'response-field-name'?: string; - size?: 'normal' | 'compact'; + + /** + * The widget size. Can take the following values: normal, flexible, compact. + */ + size?: 'normal' | 'flexible' | 'compact'; + + /** + * Controls whether the widget should automatically retry to obtain a token if it did not succeed. The default is auto, which will retry automatically. + * + * This can be set to never to disable retry on failure. + */ retry?: 'auto' | 'never'; + + /** + * When retry is set to auto, retry-interval controls the time between retry attempts in milliseconds. + * + * Value must be a positive integer less than 900000, defaults to 8000. + */ 'retry-interval'?: number; + + /** + * Automatically refreshes the token when it expires. + * + * Can take auto, manual, or never, defaults to auto. + */ 'refresh-expired'?: 'auto' | 'manual' | 'never'; + + /** + * Controls whether the widget should automatically refresh upon entering an interactive challenge and observing a timeout. + * + * Can take auto (automatically refreshes upon encountering an interactive timeout), manual (prompts the visitor to manually refresh) or never (will show a timeout), defaults to auto. + * + * Only applies to widgets of mode managed. + */ + 'refresh-timeout'?: 'auto' | 'manual' | 'never'; + + /** + * Appearance controls when the widget is visible. It can be always (default), execute, or interaction-only. + * + * Refer to {@link https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#appearance-modes|Appearance modes} for more information. + */ apperance?: 'always' | 'execute' | 'interaction-only'; + + /** + * Allows Cloudflare to gather visitor feedback upon widget failure. + * + * It can be true (default) or false. + */ + 'feedback-enabled'?: boolean; } diff --git a/src/lib/types/ValidationResult.ts b/src/lib/types/ValidationResult.ts index aa76feca..710bfb86 100644 --- a/src/lib/types/ValidationResult.ts +++ b/src/lib/types/ValidationResult.ts @@ -1,6 +1,11 @@ -import type { TwColor } from "./Tailwind"; +import type { TwColor } from './Tailwind'; -export type ValidationResult = { valid: boolean, message?: string; color?: TwColor, link?: { text: string, href: string } }; +export type ValidationResult = { + valid: boolean; + message?: string; + color?: TwColor; + link?: { text: string; href: string }; +}; export function GetValResColor(valRes: ValidationResult): TwColor { if (valRes.color !== undefined) return valRes.color; diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 00000000..9ad0df42 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/src/lib/utils/cn.ts b/src/lib/utils/cn.ts new file mode 100644 index 00000000..9ad0df42 --- /dev/null +++ b/src/lib/utils/cn.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/src/lib/utils/encoding.ts b/src/lib/utils/encoding.ts index b3bab0ce..5ead6c9a 100644 --- a/src/lib/utils/encoding.ts +++ b/src/lib/utils/encoding.ts @@ -1,10 +1,9 @@ -export function escapeHtml(unsafe: string | null): string -{ - if (unsafe === null) return "null"; - return unsafe - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); - } \ No newline at end of file +export function escapeHtml(unsafe: string | null): string { + if (unsafe === null) return 'null'; + return unsafe + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts new file mode 100644 index 00000000..c11f08f4 --- /dev/null +++ b/src/lib/utils/index.ts @@ -0,0 +1,6 @@ +export * from './cn'; +export * from './entropy'; +export * from './math'; +export * from './rand'; +export * from './svg'; +export * from './time'; diff --git a/src/lib/utils/rand.test.ts b/src/lib/utils/rand.test.ts index e278eb19..5e71df9f 100644 --- a/src/lib/utils/rand.test.ts +++ b/src/lib/utils/rand.test.ts @@ -1,4 +1,4 @@ -import { randStr } from "./rand"; +import { randStr } from './rand'; import { describe, expect, it } from 'vitest'; describe('rand utils validator test', () => { diff --git a/src/lib/utils/svg.ts b/src/lib/utils/svg.ts index dbd89f30..1b2879e6 100644 --- a/src/lib/utils/svg.ts +++ b/src/lib/utils/svg.ts @@ -1,4 +1,4 @@ -import { getCircleX, getCircleY } from "./math"; +import { getCircleX, getCircleY } from './math'; export function calcSvgArcProps( center: { x: number; y: number }, diff --git a/src/lib/utils/time.test.ts b/src/lib/utils/time.test.ts index ca6fc9ca..171c20c0 100644 --- a/src/lib/utils/time.test.ts +++ b/src/lib/utils/time.test.ts @@ -1,4 +1,4 @@ -import { durationToString } from "./time"; +import { durationToString } from './time'; import { describe, expect, it } from 'vitest'; describe('time utils validator test', () => { diff --git a/src/lib/utils/userAgent.ts b/src/lib/utils/userAgent.ts new file mode 100644 index 00000000..6fe4f7cc --- /dev/null +++ b/src/lib/utils/userAgent.ts @@ -0,0 +1,36 @@ +import { UAParser, type UAParserExt } from 'ua-parser-js'; + +const OpenShockExtension: UAParserExt = { + browser: [[/^(OpenShock)\/([-\w.+]+)/i], ['name', 'version']], + cpu: [ + [/;\s*(ESP32(?:S[0-9]+)?);/i], + [['architecture', 'XTensa']], + [/;\s*(ESP32C[0-9]+);/i], + [['architecture', 'RISC-V']], + ], + device: [ + [/;\s*(ESP32(?:[SC][0-9]+)?);\s*Espressif\)/i], + ['model', ['vendor', 'Espressif'], ['type', 'embedded']], + ], + os: [[/\(arduino-esp32;/i], [['name', 'Arduino']]], +}; + +export function getReadableUserAgentName(userAgent: string): string | null { + const ua = new UAParser(userAgent, OpenShockExtension); + + const browser = ua.getBrowser(); + const os = ua.getOS(); + + if (!browser.name || !os.name) return null; + + if (browser.name === 'OpenShock') { + const device = ua.getDevice(); + return `OpenShock ${browser.version} on ${os.name} ${device.model}`; + } + + let name = `${browser.name} on ${os.name}`; + + if (os.version) name += ` ${os.version}`; + + return name; +} diff --git a/src/routes/(authenticated)/+layout.svelte b/src/routes/(authenticated)/+layout.svelte index 6aea2f66..d5228b7b 100644 --- a/src/routes/(authenticated)/+layout.svelte +++ b/src/routes/(authenticated)/+layout.svelte @@ -1,21 +1,23 @@ {#if $UserStore.self === null} -
    +

    You need to be logged in to access this page

    Login
    -{:else if $signalr_state !== HubConnectionState.Connected} -
    +{:else if $SignalR_State !== HubConnectionState.Connected} +

    Connecting to server...

    {:else} diff --git a/src/routes/(authenticated)/admin/+layout.svelte b/src/routes/(authenticated)/admin/+layout.svelte new file mode 100644 index 00000000..ebf6b835 --- /dev/null +++ b/src/routes/(authenticated)/admin/+layout.svelte @@ -0,0 +1,21 @@ + + +{#if isAdmin} + {@render children?.()} +{:else} +

    You do not have permission to access this page

    + Go Home +{/if} diff --git a/src/routes/(authenticated)/admin/+page.svelte b/src/routes/(authenticated)/admin/+page.svelte index 029fab3f..4aeda968 100644 --- a/src/routes/(authenticated)/admin/+page.svelte +++ b/src/routes/(authenticated)/admin/+page.svelte @@ -1,8 +1,6 @@ diff --git a/src/routes/(authenticated)/admin/online-hubs/+page.svelte b/src/routes/(authenticated)/admin/online-hubs/+page.svelte index 5a610c21..ae5d703f 100644 --- a/src/routes/(authenticated)/admin/online-hubs/+page.svelte +++ b/src/routes/(authenticated)/admin/online-hubs/+page.svelte @@ -1,52 +1,72 @@ -
    - {#if !isAdmin} -

    You do not have permission to access this page

    - Go Home - {:else} -
    -

    Online Hubs

    - -
    - - - {#if devices} - - {/if} - {/if} +
    + + + Online Hubs: {data.length} + + + + + +
    diff --git a/src/routes/(authenticated)/admin/online-hubs/AdminDeviceList.svelte b/src/routes/(authenticated)/admin/online-hubs/AdminDeviceList.svelte deleted file mode 100644 index 04050055..00000000 --- a/src/routes/(authenticated)/admin/online-hubs/AdminDeviceList.svelte +++ /dev/null @@ -1,56 +0,0 @@ - - -
    - - - - - Device ID - Device Name - Firmware Version - Uptime - Gateway - Owner - - - - {#each table.rows as row} - - - - - - - - - {/each} - -
    {row.id}{row.name}{row.firmwareVersion} - {row.connectedAt ? durationToString(since - row.connectedAt.getTime()) : 'N/A'} - {row.gateway} -
    - User Avatar -

    {row.ownerName}

    -
    -
    -
    -
    diff --git a/src/routes/(authenticated)/admin/online-hubs/columns.ts b/src/routes/(authenticated)/admin/online-hubs/columns.ts new file mode 100644 index 00000000..44ed1da5 --- /dev/null +++ b/src/routes/(authenticated)/admin/online-hubs/columns.ts @@ -0,0 +1,204 @@ +import type { ColumnDef, StringOrTemplateHeader } from '@tanstack/table-core'; +import { createRawSnippet } from 'svelte'; +import { SemVer } from 'semver'; +import { renderComponent, renderSnippet } from '$lib/components/ui/data-table'; +import { durationToString } from '$lib/utils/time'; +import type { TwColor } from '$lib/types/Tailwind'; +import DataTableActions from './data-table-actions.svelte'; +import { getReadableUserAgentName } from '$lib/utils/userAgent'; +import DataTableSortButton from './data-table-sort-button.svelte'; + +export type OnlineHubOwner = { + id: string; + name: string; + image: string; +}; +export type OnlineHub = { + id: string; + name: string; + owner: OnlineHubOwner; + firmware_version: SemVer; + gateway: string; + connected_at: Date; + user_agent: string | null; + booted_at: Date; + latency: number | null; + rssi: number | null; +}; + +function CreateSortHeader(name: string): StringOrTemplateHeader { + return ({ column }) => + renderComponent(DataTableSortButton, { + name, + onclick: () => column.toggleSorting(column.getIsSorted() === 'asc'), + }); +} + +export const columns: ColumnDef[] = [ + { + accessorKey: 'name', + header: CreateSortHeader('Name'), + }, + { + accessorKey: 'owner', + header: CreateSortHeader('Owner'), + cell: ({ row }) => { + const ownerCellSnippet = createRawSnippet<[OnlineHubOwner]>((getOwner) => { + const owner = getOwner(); + return { + render: () => + `
    ${owner.name}
    `, + }; + }); + + return renderSnippet(ownerCellSnippet, row.getValue('owner')); + }, + sortingFn: (row_a, row_b) => { + const a = row_a.getValue('owner'); + const b = row_b.getValue('owner'); + + return a.name.localeCompare(b.name); + }, + }, + { + accessorKey: 'firmware_version', + header: CreateSortHeader('Firmware Version'), + cell: ({ row }) => { + const firmwareVersionCellSnippet = createRawSnippet<[string]>((getFirmwareVersion) => { + let firmwareVersion = getFirmwareVersion().toString(); + + let color: `text-${TwColor}`; + if (firmwareVersion.length <= 0) { + firmwareVersion = 'Invalid'; + color = 'text-red-500'; + } else if (firmwareVersion === '0.0.0-local') { + color = 'text-orange-500'; + } + + return { + render: () => + `
    ${firmwareVersion}
    `, + }; + }); + + return renderSnippet(firmwareVersionCellSnippet, row.getValue('firmware_version')); + }, + sortingFn: (row_a, row_b) => { + const a = new SemVer(row_a.getValue('firmware_version')); + const b = new SemVer(row_b.getValue('firmware_version')); + + if (a === b) return 0; + + return a.compare(b); + }, + }, + { + accessorKey: 'gateway', + header: 'Gateway', + }, + { + accessorKey: 'connected_at', + header: CreateSortHeader('Online for'), + cell: ({ row }) => { + const connectedAtCellSnippet = createRawSnippet<[Date]>((getConnectedAt) => { + const now = Date.now(); + const connectedAt = getConnectedAt(); + const formattedDuration = durationToString(now - connectedAt.getTime()); + return { + render: () => + `
    ${formattedDuration}
    `, + }; + }); + + return renderSnippet(connectedAtCellSnippet, row.getValue('connected_at')); + }, + }, + { + accessorKey: 'user_agent', + header: 'User Agent', + cell: ({ row }) => { + const userAgentCellSnippet = createRawSnippet<[string | null]>((getUserAgent) => { + const userAgent = getUserAgent(); + const readableName = userAgent ? getReadableUserAgentName(userAgent) : 'Unknown'; + + let color: `` | `text-${TwColor}` = ''; + if (!userAgent) { + color = 'text-red-500'; + } else if (!readableName) { + color = 'text-orange-500'; + } + + return { + render: () => + `
    ${readableName ?? userAgent}
    `, + }; + }); + + return renderSnippet(userAgentCellSnippet, row.getValue('user_agent')); + }, + }, + { + accessorKey: 'booted_at', + header: CreateSortHeader('Uptime'), + cell: ({ row }) => { + const bootedAtCellSnippet = createRawSnippet<[Date]>((getBootedAt) => { + const bootedAt = getBootedAt(); + const now = Date.now(); + const formattedDuration = durationToString(now - bootedAt.getTime()); + return { + render: () => + `
    ${formattedDuration}
    `, + }; + }); + + return renderSnippet(bootedAtCellSnippet, row.getValue('booted_at')); + }, + }, + { + accessorKey: 'latency', + header: CreateSortHeader('Latency'), + cell: ({ row }) => { + const latencyCellSnippet = createRawSnippet<[number | null]>((getLatency) => { + const latency = getLatency(); + if (!latency) { + return { + render: () => `
    N/A
    `, + }; + } + + return { + render: () => `
    ${latency}
    `, + }; + }); + + return renderSnippet(latencyCellSnippet, row.getValue('latency')); + }, + }, + { + accessorKey: 'rssi', + header: CreateSortHeader('RSSI'), + cell: ({ row }) => { + const rssiCellSnippet = createRawSnippet<[number | null]>((getRssi) => { + const rssi = getRssi(); + if (!rssi) { + return { + render: () => `
    N/A
    `, + }; + } + + return { + render: () => `
    ${rssi}
    `, + }; + }); + + return renderSnippet(rssiCellSnippet, row.getValue('rssi')); + }, + }, + { + id: 'actions', + cell: ({ row }) => { + // You can pass whatever you need from `row.original` to the component + return renderComponent(DataTableActions, { hub: row.original }); + }, + }, +]; diff --git a/src/routes/(authenticated)/admin/online-hubs/data-table-actions.svelte b/src/routes/(authenticated)/admin/online-hubs/data-table-actions.svelte new file mode 100644 index 00000000..226cc103 --- /dev/null +++ b/src/routes/(authenticated)/admin/online-hubs/data-table-actions.svelte @@ -0,0 +1,35 @@ + + + + + {#snippet child({ props })} + + {/snippet} + + + Copy ID + Edit + Delete + + diff --git a/src/routes/(authenticated)/admin/online-hubs/data-table-sort-button.svelte b/src/routes/(authenticated)/admin/online-hubs/data-table-sort-button.svelte new file mode 100644 index 00000000..ef3f3109 --- /dev/null +++ b/src/routes/(authenticated)/admin/online-hubs/data-table-sort-button.svelte @@ -0,0 +1,15 @@ + + + diff --git a/src/routes/(authenticated)/admin/online-hubs/data-table.svelte b/src/routes/(authenticated)/admin/online-hubs/data-table.svelte new file mode 100644 index 00000000..2c741f13 --- /dev/null +++ b/src/routes/(authenticated)/admin/online-hubs/data-table.svelte @@ -0,0 +1,76 @@ + + +
    + + + {#each table.getHeaderGroups() as headerGroup (headerGroup.id)} + + {#each headerGroup.headers as header (header.id)} + + {#if !header.isPlaceholder} + + {/if} + + {/each} + + {/each} + + + {#each table.getRowModel().rows as row (row.id)} + + {#each row.getVisibleCells() as cell (cell.id)} + + + + {/each} + + {:else} + + No results. + + {/each} + + +
    diff --git a/src/routes/(authenticated)/admin/users/+page.svelte b/src/routes/(authenticated)/admin/users/+page.svelte index e69de29b..648ace56 100644 --- a/src/routes/(authenticated)/admin/users/+page.svelte +++ b/src/routes/(authenticated)/admin/users/+page.svelte @@ -0,0 +1,82 @@ + + +
    + + + Users + + + + + + +
    diff --git a/src/routes/(authenticated)/admin/users/columns.ts b/src/routes/(authenticated)/admin/users/columns.ts new file mode 100644 index 00000000..22d1edf7 --- /dev/null +++ b/src/routes/(authenticated)/admin/users/columns.ts @@ -0,0 +1,104 @@ +import type { ColumnDef, StringOrTemplateHeader } from '@tanstack/table-core'; +import { createRawSnippet } from 'svelte'; +import { renderComponent, renderSnippet } from '$lib/components/ui/data-table'; +import { PasswordHashingAlgorithm, RankType } from '$lib/api/internal/v1'; +import DataTableSortButton from './data-table-sort-button.svelte'; +import DataTableActions from './data-table-actions.svelte'; + +export type User = { + id: string; + name: string; + email: string; + password_hash_type: PasswordHashingAlgorithm; + created_at: Date; + email_activated: boolean; + rank: RankType; +}; + +function CreateSortHeader(name: string): StringOrTemplateHeader { + return ({ column }) => + renderComponent(DataTableSortButton, { + name, + onclick: () => column.toggleSorting(column.getIsSorted() === 'asc'), + }); +} + +export const columns: ColumnDef[] = [ + { + accessorKey: 'name', + header: CreateSortHeader('Name'), + }, + { + accessorKey: 'email', + header: CreateSortHeader('Email'), + }, + { + accessorKey: 'password_hash_type', + header: CreateSortHeader('Password hash type'), + cell: ({ row }) => { + const passwordHashTypeCellSnippet = createRawSnippet<[string]>((getPasswordHashType) => { + const passwordHashType = getPasswordHashType(); + const isLegacy = passwordHashType !== PasswordHashingAlgorithm.BCrypt; + return { + render: () => + `
    ${passwordHashType}
    `, + }; + }); + + return renderSnippet(passwordHashTypeCellSnippet, row.getValue('password_hash_type')); + }, + }, + { + accessorKey: 'created_at', + header: CreateSortHeader('Created at'), + cell: ({ row }) => { + const createdAtCellSnippet = createRawSnippet<[Date]>((getCreatedAt) => { + const createdAt = getCreatedAt(); + return { + render: () => + `
    ${createdAt.toLocaleString()}
    `, + }; + }); + + return renderSnippet(createdAtCellSnippet, row.getValue('created_at')); + }, + }, + { + accessorKey: 'email_activated', + header: CreateSortHeader('Email activated'), + cell: ({ row }) => { + const emailActivatedCellSnippet = createRawSnippet<[boolean]>((getEmailActivated) => { + const emailActivated = getEmailActivated(); + return { + render: () => + `
    ${emailActivated}
    `, + }; + }); + + return renderSnippet(emailActivatedCellSnippet, row.getValue('email_activated')); + }, + }, + { + accessorKey: 'rank', + header: CreateSortHeader('Rank'), + cell: ({ row }) => { + const rankCellSnippet = createRawSnippet<[RankType]>((getRank) => { + const rank = getRank(); + const isPrivileged = [RankType.Admin, RankType.System].includes(rank); + return { + render: () => + `
    ${rank}
    `, + }; + }); + + return renderSnippet(rankCellSnippet, row.getValue('rank')); + }, + }, + { + id: 'actions', + cell: ({ row }) => { + // You can pass whatever you need from `row.original` to the component + return renderComponent(DataTableActions, { user: row.original }); + }, + }, +]; diff --git a/src/routes/(authenticated)/admin/users/data-table-actions.svelte b/src/routes/(authenticated)/admin/users/data-table-actions.svelte new file mode 100644 index 00000000..58db1027 --- /dev/null +++ b/src/routes/(authenticated)/admin/users/data-table-actions.svelte @@ -0,0 +1,53 @@ + + + + + + + + {#snippet child({ props })} + + {/snippet} + + + Copy ID + (editDialogOpen = true)}>Edit + Promote + Reset password + (deleteDialogOpen = true)} + disabled={isPrivileged} + class={isPrivileged ? undefined : 'text-red-500'} + > + Delete + + + diff --git a/src/routes/(authenticated)/admin/users/data-table-sort-button.svelte b/src/routes/(authenticated)/admin/users/data-table-sort-button.svelte new file mode 100644 index 00000000..ef3f3109 --- /dev/null +++ b/src/routes/(authenticated)/admin/users/data-table-sort-button.svelte @@ -0,0 +1,15 @@ + + + diff --git a/src/routes/(authenticated)/admin/users/data-table.svelte b/src/routes/(authenticated)/admin/users/data-table.svelte new file mode 100644 index 00000000..87dc0f8c --- /dev/null +++ b/src/routes/(authenticated)/admin/users/data-table.svelte @@ -0,0 +1,130 @@ + + +
    +
    + + +
    +
    + + + {#each table.getHeaderGroups() as headerGroup (headerGroup.id)} + + {#each headerGroup.headers as header (header.id)} + + {#if !header.isPlaceholder} + + {/if} + + {/each} + + {/each} + + + {#each table.getRowModel().rows as row (row.id)} + + {#each row.getVisibleCells() as cell (cell.id)} + + + + {/each} + + {:else} + + No results. + + {/each} + + +
    +
    diff --git a/src/routes/(authenticated)/admin/users/dialog-user-delete.svelte b/src/routes/(authenticated)/admin/users/dialog-user-delete.svelte new file mode 100644 index 00000000..4590a187 --- /dev/null +++ b/src/routes/(authenticated)/admin/users/dialog-user-delete.svelte @@ -0,0 +1,26 @@ + + + open, (o) => (open = o)}> + + + Delete user + + Are you sure you want to delete {user.name}?
    + All data associated with this user will be permanently deleted.
    + This action is irreversible. +
    +
    + {}} /> +
    +
    diff --git a/src/routes/(authenticated)/admin/users/dialog-user-edit.svelte b/src/routes/(authenticated)/admin/users/dialog-user-edit.svelte new file mode 100644 index 00000000..ec7a8909 --- /dev/null +++ b/src/routes/(authenticated)/admin/users/dialog-user-edit.svelte @@ -0,0 +1,27 @@ + + + open, (o) => (open = o)}> + + + Edit user + + + + + + + diff --git a/src/routes/(authenticated)/home/+page.svelte b/src/routes/(authenticated)/home/+page.svelte index 53db5904..d4dadd8e 100644 --- a/src/routes/(authenticated)/home/+page.svelte +++ b/src/routes/(authenticated)/home/+page.svelte @@ -1,4 +1,4 @@ -
    +
    diff --git a/src/routes/(authenticated)/hubs/+page.svelte b/src/routes/(authenticated)/hubs/+page.svelte index 8e938435..0e364cfb 100644 --- a/src/routes/(authenticated)/hubs/+page.svelte +++ b/src/routes/(authenticated)/hubs/+page.svelte @@ -1,84 +1,53 @@ -
    - - - - - - - - - - - {#each devices as device (device.id)} - - - - - - - {/each} - -
    Device NameStatusVersionCreated On
    - {device.name ?? 'Unnamed device'} - - {#if device.isOnline} - Online - {:else} - Offline - {/if} - {#if device.firmwareVersion} - - {/if} - - {#if device.firmwareVersion} - Version {device.firmwareVersion} - {/if} - - {device.createdAt.toLocaleDateString()} -
    +
    + + + Hubs + + + This is a list of all hubs you own. + + + +
    - - \ No newline at end of file diff --git a/src/routes/(authenticated)/hubs/columns.ts b/src/routes/(authenticated)/hubs/columns.ts new file mode 100644 index 00000000..8ffc5db2 --- /dev/null +++ b/src/routes/(authenticated)/hubs/columns.ts @@ -0,0 +1,91 @@ +import type { ColumnDef, StringOrTemplateHeader } from '@tanstack/table-core'; +import { createRawSnippet } from 'svelte'; +import { renderComponent, renderSnippet } from '$lib/components/ui/data-table'; +import { ShockerModelType } from '$lib/api/internal/v1'; +import DataTableSortButton from './data-table-sort-button.svelte'; +import DataTableActions from './data-table-actions.svelte'; +import type { SemVer } from 'semver'; + +export type Shocker = { + id: string; + rf_id: number; + model: ShockerModelType; + name: string; + is_paused: boolean; + created_at: Date; +}; +export type Hub = { + id: string; + name: string; + is_online: boolean; + firmware_version: SemVer | null; + shockers: Shocker[]; + created_at: Date; +}; + +function CreateSortHeader(name: string): StringOrTemplateHeader { + return ({ column }) => + renderComponent(DataTableSortButton, { + name, + onclick: () => column.toggleSorting(column.getIsSorted() === 'asc'), + }); +} + +export const columns: ColumnDef[] = [ + { + accessorKey: 'name', + header: CreateSortHeader('Name'), + }, + { + accessorKey: 'is_online', + header: CreateSortHeader('Status'), + cell: ({ row }) => { + const isOnlineCellSnippet = createRawSnippet<[boolean]>((getIsOnline) => { + const isOnline = getIsOnline(); + return { + render: () => + `
    ${isOnline ? 'Online' : 'Offline'}
    `, + }; + }); + + return renderSnippet(isOnlineCellSnippet, row.getValue('is_online')); + }, + }, + { + accessorKey: 'firmware_version', + header: CreateSortHeader('Version'), + cell: ({ row }) => { + const versionCellSnippet = createRawSnippet<[SemVer | null]>((getFirmwareVersion) => { + const firmwareVersion = getFirmwareVersion(); + return { + render: () => + `
    ${firmwareVersion?.format() ?? ''}
    `, + }; + }); + + return renderSnippet(versionCellSnippet, row.getValue('firmware_version')); + }, + }, + { + accessorKey: 'created_at', + header: CreateSortHeader('Created at'), + cell: ({ row }) => { + const createdAtCellSnippet = createRawSnippet<[Date]>((getCreatedAt) => { + const createdAt = getCreatedAt(); + return { + render: () => + `
    ${createdAt.toLocaleString()}
    `, + }; + }); + + return renderSnippet(createdAtCellSnippet, row.getValue('created_at')); + }, + }, + { + id: 'actions', + cell: ({ row }) => { + // You can pass whatever you need from `row.original` to the component + return renderComponent(DataTableActions, { hub: row.original }); + }, + }, +]; diff --git a/src/routes/(authenticated)/hubs/data-table-actions.svelte b/src/routes/(authenticated)/hubs/data-table-actions.svelte new file mode 100644 index 00000000..67bd15bc --- /dev/null +++ b/src/routes/(authenticated)/hubs/data-table-actions.svelte @@ -0,0 +1,47 @@ + + + + + + + + + {#snippet child({ props })} + + {/snippet} + + + Copy ID + (updateDialogOpen = true)}>Update + (editDialogOpen = true)}>Edit + (deleteDialogOpen = true)}>Delete + + diff --git a/src/routes/(authenticated)/hubs/data-table-sort-button.svelte b/src/routes/(authenticated)/hubs/data-table-sort-button.svelte new file mode 100644 index 00000000..ef3f3109 --- /dev/null +++ b/src/routes/(authenticated)/hubs/data-table-sort-button.svelte @@ -0,0 +1,15 @@ + + + diff --git a/src/routes/(authenticated)/hubs/data-table.svelte b/src/routes/(authenticated)/hubs/data-table.svelte new file mode 100644 index 00000000..2534f25c --- /dev/null +++ b/src/routes/(authenticated)/hubs/data-table.svelte @@ -0,0 +1,78 @@ + + +
    +
    + + + {#each table.getHeaderGroups() as headerGroup (headerGroup.id)} + + {#each headerGroup.headers as header (header.id)} + + {#if !header.isPlaceholder} + + {/if} + + {/each} + + {/each} + + + {#each table.getRowModel().rows as row (row.id)} + + {#each row.getVisibleCells() as cell (cell.id)} + + + + {/each} + + {:else} + + No results. + + {/each} + + +
    +
    diff --git a/src/routes/(authenticated)/hubs/dialog-hub-delete.svelte b/src/routes/(authenticated)/hubs/dialog-hub-delete.svelte new file mode 100644 index 00000000..35beecf8 --- /dev/null +++ b/src/routes/(authenticated)/hubs/dialog-hub-delete.svelte @@ -0,0 +1,28 @@ + + + open, (o) => (open = o)}> + + + Delete hub + + Are you sure you want to delete {hub.name}? + + + + + diff --git a/src/routes/(authenticated)/hubs/dialog-hub-edit.svelte b/src/routes/(authenticated)/hubs/dialog-hub-edit.svelte new file mode 100644 index 00000000..39e6594e --- /dev/null +++ b/src/routes/(authenticated)/hubs/dialog-hub-edit.svelte @@ -0,0 +1,23 @@ + + + open, (o) => (open = o)}> + + + Edit hub + + + + + diff --git a/src/routes/(authenticated)/hubs/dialog-hub-update.svelte b/src/routes/(authenticated)/hubs/dialog-hub-update.svelte new file mode 100644 index 00000000..6e9e92b6 --- /dev/null +++ b/src/routes/(authenticated)/hubs/dialog-hub-update.svelte @@ -0,0 +1,21 @@ + + + open, (o) => (open = o)}> + + + Update hub + This is the dialog for updating a hub. + + TODO: Implement OTA update form thing + + diff --git a/src/routes/(authenticated)/settings/+page.svelte b/src/routes/(authenticated)/settings/+page.svelte index 8df2b168..634d440d 100644 --- a/src/routes/(authenticated)/settings/+page.svelte +++ b/src/routes/(authenticated)/settings/+page.svelte @@ -1,8 +1,6 @@ diff --git a/src/routes/(authenticated)/settings/account/+page.svelte b/src/routes/(authenticated)/settings/account/+page.svelte index 7b005020..3f83417a 100644 --- a/src/routes/(authenticated)/settings/account/+page.svelte +++ b/src/routes/(authenticated)/settings/account/+page.svelte @@ -1,46 +1,41 @@ {#if $UserStore.self} -
    +

    Account Settings

    @@ -79,20 +76,18 @@ placeholder={$UserStore.self.email} autocomplete="off" bind:value={email} - icon="fa-envelope" + Icon={Mail} button={{ text: 'Change', submits: true, onClick: submitEmail }} /> - - - {#snippet lead()} - - {/snippet} - {#snippet summary()} + + + + Change your password - {/snippet} - {#snippet content()} -
    + + +
    - + Change Password +
    - {/snippet} - - +
    + +
    {/if} diff --git a/src/routes/(authenticated)/settings/api-tokens/+page.svelte b/src/routes/(authenticated)/settings/api-tokens/+page.svelte index 4251b0ce..bd12767b 100644 --- a/src/routes/(authenticated)/settings/api-tokens/+page.svelte +++ b/src/routes/(authenticated)/settings/api-tokens/+page.svelte @@ -1,139 +1,52 @@ -
    -

    API Tokens

    -
    -

    API Tokens are used to authenticate with the OpenShock API

    - - -
    - - - - - - - - - - - - - {#each tokens as token (token.id)} - - - - {#if token.validUntil} - - {:else} - - {/if} - {#if token.lastUsed.getTime() < 0} - - {:else} - - {/if} - - - {/each} - -
    NameCreatedExpiresLast Used
    {token.name}{token.createdOn.toLocaleDateString()} - {elapsedToString(token.validUntil.getTime() - since)} - NeverNever - {elapsedToString(token.lastUsed.getTime() - since)} - - - -
    + refreshApiToken(id)} /> + +
    + + + API Tokens + + + API Tokens are used to authenticate with the OpenShock API + + + +
    +
    - -
    +
    diff --git a/src/routes/(authenticated)/settings/api-tokens/columns.ts b/src/routes/(authenticated)/settings/api-tokens/columns.ts new file mode 100644 index 00000000..26da72da --- /dev/null +++ b/src/routes/(authenticated)/settings/api-tokens/columns.ts @@ -0,0 +1,101 @@ +import type { ColumnDef, StringOrTemplateHeader } from '@tanstack/table-core'; +import { createRawSnippet } from 'svelte'; +import { renderComponent, renderSnippet } from '$lib/components/ui/data-table'; +import { PermissionType } from '$lib/api/internal/v1'; +import DataTableSortButton from './data-table-sort-button.svelte'; +import DataTableActions from './data-table-actions.svelte'; +import { elapsedToString } from '$lib/utils/time'; + +export type ApiToken = { + id: string; + name: string; + created_at: Date; + expires_at: Date | null; + last_used: Date; + permissions: PermissionType[]; +}; + +function CreateSortHeader(name: string): StringOrTemplateHeader { + return ({ column }) => + renderComponent(DataTableSortButton, { + name, + onclick: () => column.toggleSorting(column.getIsSorted() === 'asc'), + }); +} + +export const columns: ColumnDef[] = [ + { + accessorKey: 'name', + header: CreateSortHeader('Name'), + }, + { + accessorKey: 'created_at', + header: CreateSortHeader('Created at'), + cell: ({ row }) => { + const createdAtCellSnippet = createRawSnippet<[Date]>((getCreatedAt) => { + const createdAt = getCreatedAt(); + return { + render: () => + `
    ${createdAt.toLocaleDateString()}
    `, + }; + }); + + return renderSnippet(createdAtCellSnippet, row.getValue('created_at')); + }, + }, + { + accessorKey: 'expires_at', + header: CreateSortHeader('Expires at'), + cell: ({ row }) => { + const expiresAtCellSnippet = createRawSnippet<[Date | null]>((getExpiresAt) => { + const expiresAt = getExpiresAt(); + + if (expiresAt === null) { + return { + render: () => '
    Never
    ', + }; + } + const now = Date.now(); + const formattedTimeSpan = elapsedToString(expiresAt.getTime() - now); + return { + render: () => + `
    ${formattedTimeSpan}
    `, + }; + }); + + return renderSnippet(expiresAtCellSnippet, row.getValue('expires_at')); + }, + }, + { + accessorKey: 'last_used', + header: CreateSortHeader('Last used'), + cell: ({ row }) => { + const lastUsedCellSnippet = createRawSnippet<[Date]>((getLastUsed) => { + const lastUsed = getLastUsed(); + const isNever = lastUsed.getTime() < 0; + + if (isNever) { + return { + render: () => '
    Never
    ', + }; + } + + const now = Date.now(); + const formattedTimeSpan = elapsedToString(lastUsed.getTime() - now); + return { + render: () => + `
    ${formattedTimeSpan}
    `, + }; + }); + + return renderSnippet(lastUsedCellSnippet, row.getValue('last_used')); + }, + }, + { + id: 'actions', + cell: ({ row }) => { + // You can pass whatever you need from `row.original` to the component + return renderComponent(DataTableActions, { token: row.original }); + }, + }, +]; diff --git a/src/routes/(authenticated)/settings/api-tokens/data-table-actions.svelte b/src/routes/(authenticated)/settings/api-tokens/data-table-actions.svelte new file mode 100644 index 00000000..0266c951 --- /dev/null +++ b/src/routes/(authenticated)/settings/api-tokens/data-table-actions.svelte @@ -0,0 +1,43 @@ + + + + + + + + {#snippet child({ props })} + + {/snippet} + + + Copy ID + (editDialogOpen = true)}>Edit + (deleteDialogOpen = true)}>Delete + + diff --git a/src/routes/(authenticated)/settings/api-tokens/data-table-sort-button.svelte b/src/routes/(authenticated)/settings/api-tokens/data-table-sort-button.svelte new file mode 100644 index 00000000..ef3f3109 --- /dev/null +++ b/src/routes/(authenticated)/settings/api-tokens/data-table-sort-button.svelte @@ -0,0 +1,15 @@ + + + diff --git a/src/routes/(authenticated)/settings/api-tokens/data-table.svelte b/src/routes/(authenticated)/settings/api-tokens/data-table.svelte new file mode 100644 index 00000000..bd838548 --- /dev/null +++ b/src/routes/(authenticated)/settings/api-tokens/data-table.svelte @@ -0,0 +1,78 @@ + + +
    +
    + + + {#each table.getHeaderGroups() as headerGroup (headerGroup.id)} + + {#each headerGroup.headers as header (header.id)} + + {#if !header.isPlaceholder} + + {/if} + + {/each} + + {/each} + + + {#each table.getRowModel().rows as row (row.id)} + + {#each row.getVisibleCells() as cell (cell.id)} + + + + {/each} + + {:else} + + No results. + + {/each} + + +
    +
    diff --git a/src/routes/(authenticated)/settings/api-tokens/dialog-token-created.svelte b/src/routes/(authenticated)/settings/api-tokens/dialog-token-created.svelte new file mode 100644 index 00000000..015cdeb0 --- /dev/null +++ b/src/routes/(authenticated)/settings/api-tokens/dialog-token-created.svelte @@ -0,0 +1,44 @@ + + + open, (o) => (open = o)}> + + + API Token Generated + + Please copy your API Token now, you will not be able to view it again later! + + +
    +
    + + + +
    +
    +
    +
    diff --git a/src/routes/(authenticated)/settings/api-tokens/dialog-token-delete.svelte b/src/routes/(authenticated)/settings/api-tokens/dialog-token-delete.svelte new file mode 100644 index 00000000..11a326b8 --- /dev/null +++ b/src/routes/(authenticated)/settings/api-tokens/dialog-token-delete.svelte @@ -0,0 +1,38 @@ + + + open, (o) => (open = o)}> + + + Are you sure you want to delete {token?.name}? + + This action cannot be undone. This will permanently delete the token. + + + + + diff --git a/src/routes/(authenticated)/settings/api-tokens/dialog-token-edit.svelte b/src/routes/(authenticated)/settings/api-tokens/dialog-token-edit.svelte new file mode 100644 index 00000000..286f7c78 --- /dev/null +++ b/src/routes/(authenticated)/settings/api-tokens/dialog-token-edit.svelte @@ -0,0 +1,107 @@ + + + open, (o) => (open = o)}> + + + Edit API Token + + +
    + + +
    +

    Permissions

    +
    + {#each permissionTypes as category} + {category.name} + {#each category.perms as permission} + + {/each} + {/each} +
    +
    + + + +
    +
    diff --git a/src/routes/(authenticated)/settings/api-tokens/dialog-token-generate.svelte b/src/routes/(authenticated)/settings/api-tokens/dialog-token-generate.svelte new file mode 100644 index 00000000..24c108a4 --- /dev/null +++ b/src/routes/(authenticated)/settings/api-tokens/dialog-token-generate.svelte @@ -0,0 +1,207 @@ + + + + + open, (o) => (open = o)}> + + + Generate a new API Token + Example text + + + diff --git a/src/routes/(authenticated)/settings/danger-zone/+page.svelte b/src/routes/(authenticated)/settings/danger-zone/+page.svelte new file mode 100644 index 00000000..04065275 --- /dev/null +++ b/src/routes/(authenticated)/settings/danger-zone/+page.svelte @@ -0,0 +1,11 @@ + + +
    +

    Danger Zone

    +
    + +
    +
    diff --git a/src/routes/(authenticated)/settings/delete-account/+page.svelte b/src/routes/(authenticated)/settings/delete-account/+page.svelte deleted file mode 100644 index 992cd44d..00000000 --- a/src/routes/(authenticated)/settings/delete-account/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - -
    -

    Danger Zone

    -
    - -
    -
    diff --git a/src/routes/(authenticated)/settings/sessions/+page.svelte b/src/routes/(authenticated)/settings/sessions/+page.svelte index ea4ebd78..69db5703 100644 --- a/src/routes/(authenticated)/settings/sessions/+page.svelte +++ b/src/routes/(authenticated)/settings/sessions/+page.svelte @@ -1,136 +1,67 @@ -
    -

    Sessions

    -
    -

    Currently valid sessions

    - - -
    - - - - - - - - - - - - - - {#each sessions as session (session.id)} - - - - - - - - {#if since < session.expires.getTime()} - - {:else} - - {/if} - - - - - - {/each} - -
    UserAgentCreatedLast SeenExpiresIP
    - {getReadableName(session.userAgent)} - - {session.created.toLocaleDateString()} - Not Implemented - {elapsedToString(session.expires.getTime() - since)} - - Already expired - {session.ip} - -
    -
    -
    +
    + + + Sessions + + + + This is a list of all active sessions of your account. Revoke any sessions you do not + recognize. + + + + +
    diff --git a/src/routes/(authenticated)/settings/sessions/columns.ts b/src/routes/(authenticated)/settings/sessions/columns.ts new file mode 100644 index 00000000..6fea29b3 --- /dev/null +++ b/src/routes/(authenticated)/settings/sessions/columns.ts @@ -0,0 +1,111 @@ +import { renderComponent, renderSnippet } from '$lib/components/ui/data-table'; +import { elapsedToString } from '$lib/utils/time'; +import { getReadableUserAgentName } from '$lib/utils/userAgent'; +import type { ColumnDef, StringOrTemplateHeader } from '@tanstack/table-core'; +import { createRawSnippet } from 'svelte'; +import DataTableActions from './data-table-actions.svelte'; +import DataTableSortButton from './data-table-sort-button.svelte'; + +export type Session = { + id: string; + ip: string; + user_agent: string; + created_at: Date; + expires_at: Date; + last_seen: Date | null; +}; + +function CreateSortHeader(name: string): StringOrTemplateHeader { + return ({ column }) => + renderComponent(DataTableSortButton, { + name, + onclick: () => column.toggleSorting(column.getIsSorted() === 'asc'), + }); +} + +export const columns: ColumnDef[] = [ + { + accessorKey: 'ip', + header: 'Ip', + }, + { + accessorKey: 'user_agent', + header: CreateSortHeader('User Agent'), + cell: ({ row }) => { + const userAgentCellSnippet = createRawSnippet<[string]>((getUserAgent) => { + const userAgent = getUserAgent(); + const readableUserAgent = getReadableUserAgentName(userAgent); + return { + render: () => + `
    ${readableUserAgent ?? userAgent}
    `, + }; + }); + + return renderSnippet(userAgentCellSnippet, row.getValue('user_agent')); + }, + }, + { + accessorKey: 'created_at', + header: CreateSortHeader('Created at'), + cell: ({ row }) => { + const createdAtCellSnippet = createRawSnippet<[Date]>((getCreatedAt) => { + const now = Date.now(); + const createdAt = getCreatedAt(); + const formattedTimeSpan = elapsedToString(now - createdAt.getTime()); + return { + render: () => + `
    ${formattedTimeSpan}
    `, + }; + }); + + return renderSnippet(createdAtCellSnippet, row.getValue('created_at')); + }, + }, + { + accessorKey: 'expires_at', + header: CreateSortHeader('Expires at'), + cell: ({ row }) => { + const expiresAtCellSnippet = createRawSnippet<[Date]>((getExpiresAt) => { + const now = Date.now(); + const expiresAt = getExpiresAt(); + const formattedTimeSpan = elapsedToString(expiresAt.getTime() - now); + return { + render: () => + `
    ${formattedTimeSpan}
    `, + }; + }); + + return renderSnippet(expiresAtCellSnippet, row.getValue('expires_at')); + }, + }, + { + accessorKey: 'last_seen', + header: CreateSortHeader('Last seen'), + cell: ({ row }) => { + const lastSeenCellSnippet = createRawSnippet<[Date | null]>((getLastSeen) => { + const lastSeen = getLastSeen(); + if (!lastSeen) { + return { + render: () => `
    N/A
    `, + }; + } + + const now = Date.now(); + const formattedTimeSpan = elapsedToString(lastSeen.getTime() - now); + return { + render: () => + `
    ${formattedTimeSpan}
    `, + }; + }); + + return renderSnippet(lastSeenCellSnippet, row.getValue('last_seen')); + }, + }, + { + id: 'actions', + cell: ({ row }) => { + // You can pass whatever you need from `row.original` to the component + return renderComponent(DataTableActions, { session: row.original }); + }, + }, +]; diff --git a/src/routes/(authenticated)/settings/sessions/data-table-actions.svelte b/src/routes/(authenticated)/settings/sessions/data-table-actions.svelte new file mode 100644 index 00000000..5de13474 --- /dev/null +++ b/src/routes/(authenticated)/settings/sessions/data-table-actions.svelte @@ -0,0 +1,41 @@ + + + + + + + {#snippet child({ props })} + + {/snippet} + + + Copy ID + (revokeDialogOpen = true)} class="text-red-500"> + Revoke + + + diff --git a/src/routes/(authenticated)/settings/sessions/data-table-sort-button.svelte b/src/routes/(authenticated)/settings/sessions/data-table-sort-button.svelte new file mode 100644 index 00000000..ef3f3109 --- /dev/null +++ b/src/routes/(authenticated)/settings/sessions/data-table-sort-button.svelte @@ -0,0 +1,15 @@ + + + diff --git a/src/routes/(authenticated)/settings/sessions/data-table.svelte b/src/routes/(authenticated)/settings/sessions/data-table.svelte new file mode 100644 index 00000000..5ac4e832 --- /dev/null +++ b/src/routes/(authenticated)/settings/sessions/data-table.svelte @@ -0,0 +1,76 @@ + + +
    + + + {#each table.getHeaderGroups() as headerGroup (headerGroup.id)} + + {#each headerGroup.headers as header (header.id)} + + {#if !header.isPlaceholder} + + {/if} + + {/each} + + {/each} + + + {#each table.getRowModel().rows as row (row.id)} + + {#each row.getVisibleCells() as cell (cell.id)} + + + + {/each} + + {:else} + + No results. + + {/each} + + +
    diff --git a/src/routes/(authenticated)/settings/sessions/dialog-session-revoke.svelte b/src/routes/(authenticated)/settings/sessions/dialog-session-revoke.svelte new file mode 100644 index 00000000..164179e3 --- /dev/null +++ b/src/routes/(authenticated)/settings/sessions/dialog-session-revoke.svelte @@ -0,0 +1,46 @@ + + + open, (o) => (open = o)}> + + + Revoke session + Are you sure you want to revoke this session? + + + + Session logged in from {session.ip} using + {readableUserAgent} + + + + + diff --git a/src/routes/(authenticated)/shockers/+page.svelte b/src/routes/(authenticated)/shockers/+page.svelte index 2cd3755d..0479d29c 100644 --- a/src/routes/(authenticated)/shockers/+page.svelte +++ b/src/routes/(authenticated)/shockers/+page.svelte @@ -7,101 +7,109 @@ import RichControlModule from '$lib/components/ControlModules/RichControlModule.svelte'; import SimpleControlHeader from '$lib/components/ControlModules/SimpleControlHeader.svelte'; import SimpleControlModule from '$lib/components/ControlModules/SimpleControlModule.svelte'; - import { OwnDevicesStore } from '$lib/stores/DevicesStore'; - import { popup, type PopupSettings } from '@skeletonlabs/skeleton'; + import * as Popover from '$lib/components/ui/popover'; + import { OwnHubsStore } from '$lib/stores/HubsStore'; - let shockers = $derived( - $OwnDevicesStore?.flatMap((device) => device.shockers)?.filter((shocker) => !!shocker) ?? [] - ); + import { Layers, Settings } from 'lucide-svelte'; - let moduleType: ModuleType = $state(ModuleType.ClassicControlModule); + let shockers = $derived(Array.from($OwnHubsStore).flatMap(([, hub]) => hub.shockers)); - const modeClick: PopupSettings = { - event: 'click', - target: 'modeClick', - placement: 'bottom', - }; + let moduleType = $state(ModuleType.ClassicControlModule); - function handleCommand( - event: CustomEvent<{ id: string; type: ControlType; intensity: number; duration: number }> - ) { - let shocks: Control[] = [ - { - id: event.detail.id, - type: event.detail.type, - intensity: event.detail.intensity, - duration: event.detail.duration, - }, - ]; + let shockIntensity = $state(25); + let vibrationIntensity = $state(25); + let duration = $state(1); + + function handleControlMessages(controls: Control[]) { shockerV2Api.shockerSendControl({ - shocks, + shocks: controls, customName: 'Custom name', }); } + function handleSimpleControl(shockerId: string, controlType: ControlType) { + let intensity: number; + switch (controlType) { + case 'Stop': + intensity = 0; + break; + case 'Shock': + intensity = shockIntensity; + break; + case 'Vibrate': + intensity = vibrationIntensity; + break; + case 'Sound': + intensity = 0; + break; + default: + return; + } + + handleControlMessages([{ id: shockerId, type: controlType, intensity, duration }]); + } -
    - {#if $OwnDevicesStore == null} +
    + {#if $OwnHubsStore == null}

    Loading...

    {:else}

    Shockers

    - -
    -
    - - - - -
    -
    -
    + + + +
    + + + + +
    +
    +

    {#if moduleType === ModuleType.SimpleControlModule} - + {/if} {#if moduleType === ModuleType.MapControlModule} - + {:else} -
    +
    {#each shockers ?? [] as shocker (shocker.id)} {#if moduleType === ModuleType.ClassicControlModule} - + {:else if moduleType === ModuleType.RichControlModule} - + {:else if moduleType === ModuleType.SimpleControlModule} - + {:else}

    Unknown module type

    {/if} diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte index 78544cee..0de9549e 100644 --- a/src/routes/+error.svelte +++ b/src/routes/+error.svelte @@ -1,12 +1,11 @@ - +
    -
    {$page.status}
    +
    {page.status}
    - {$page.error?.message ?? 'Something went wrong.'} + {page.error?.message ?? 'Something went wrong.'}
    Go back
    diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 23dac358..f4e4e77e 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,44 +1,51 @@ + let meta = $derived(buildMetaData(page.url)); - - + let isOpen = $state(false); + let isLoggedIn = $derived($UserStore?.self !== null); + let currentUserRank = $derived($UserStore?.self?.rank ?? null); + + + - - - - {#snippet header()} -
    - {/snippet} - {#snippet sidebarLeft()} - - {/snippet} - {@render children?.()} - - {#snippet pageFooter()} + + + + isOpen && isLoggedIn, (o) => (isOpen = o)}> + +
    +
    +
    + {@render children?.()} +
    - {/snippet} - +
    +
    diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 00000000..189f71e2 --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 6364f0a7..fc57edea 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,20 +1,20 @@ -
    +
    -

    +

    Welcome to OpenShock

    [Put a slogan here]

    - -
    +
    diff --git a/src/routes/flashtool/+page.svelte b/src/routes/flashtool/+page.svelte index 3dec086b..6aed3172 100644 --- a/src/routes/flashtool/+page.svelte +++ b/src/routes/flashtool/+page.svelte @@ -1,22 +1,35 @@ - -
    -
    -
    - - {#if port} - {#if manager} - - {#if version && board && manager} - - {/if} - {:else if !connectFailed} -
    - Connecting... - -
    - {/if} - {/if} - {#if connectFailed} -
    - Device connection failed - - There was an issue connecting to your device, please try the following: - -
      -
    1. - Install the drivers for your device if you haven't already, using the button above -
    2. -
    3. Unplug and replug your device
    4. -
    5. Use a different USB port
    6. -
    7. Use a different USB cable
    8. -
    9. - Contact support if the issue persists: - - OpenShock Discord - -
    10. -
    -
    - {/if} -
    +{#snippet mainContent()} + + + {#if manager} +

    Select Channel

    + + +

    Select Board

    + - {#if terminalOpen} -
    -
    -

    Console

    - -
    -
    + +
    +
    + Erase before flashing + +

    + Flash tool will erase all data on the device before flashing, in the process clearing any + existing configs +

    +
    + + {#if version && board} + {/if} -
    + {:else if port && !connectFailed} +
    + Connecting... + + +
    + {/if} + + {#if port && connectFailed} +
    + Device connection failed + + There was an issue connecting to your device, please try the following: + +
      +
    1. Install the drivers for your device if you haven't already, using the button above
    2. +
    3. Unplug and replug your device
    4. +
    5. Use a different USB port
    6. +
    7. Use a different USB cable
    8. +
    9. + Contact support if the issue persists: + +
    10. +
    +
    + {/if} +{/snippet} + +{#snippet unsupportedBrowser()} +

    Your browser does not support this feature.

    + {#if ['Chrome', 'Edge', 'Opera'].includes(Bowser.getParser(navigator.userAgent).getBrowserName())} +

    + Please update your browser to the latest version. +

    + {:else} +

    Please use one of the following browsers:

    + + {/if} +{/snippet} + + (showHelpDialog = false)} /> + +
    + + Flash Tool + {#if isSupported} +
    + + +
    + {/if} +
    + + {#if isSupported} + {@render mainContent()} + {:else if browser} + {@render unsupportedBrowser()} + {:else} + Loading... + {/if} +
    + + terminalOpen, (o) => (terminalOpen = o)}> + + + + Console +
    + +
    +
    +
    +
    {terminalText}
    +
    +
    +
    diff --git a/src/routes/flashtool/FirmwareBoardSelector.svelte b/src/routes/flashtool/FirmwareBoardSelector.svelte new file mode 100644 index 00000000..9c662ba3 --- /dev/null +++ b/src/routes/flashtool/FirmwareBoardSelector.svelte @@ -0,0 +1,67 @@ + + +
    + + + + + + + + No board found. + + {#each boards as board} + (selectedBoard = board)}> + + {board} + + {/each} + + + + +
    diff --git a/src/routes/flashtool/FirmwareChannelSelector.svelte b/src/routes/flashtool/FirmwareChannelSelector.svelte new file mode 100644 index 00000000..d40d148d --- /dev/null +++ b/src/routes/flashtool/FirmwareChannelSelector.svelte @@ -0,0 +1,60 @@ + + +
    + + {#each Object.keys(channels) as key} + + {key.charAt(0).toUpperCase() + key.slice(1)} + + {/each} + + +
    + {#if selectedChannel === 'stable'} + +

    This is the recommended channel.

    + {:else if selectedChannel === 'beta'} + +

    This channel might contain bugs.

    + {:else} + +

    Avoid this channel unless you know what you're doing.

    + {/if} +
    +
    diff --git a/src/lib/components/EspTool/FirmwareFlasher.svelte b/src/routes/flashtool/FirmwareFlasher.svelte similarity index 68% rename from src/lib/components/EspTool/FirmwareFlasher.svelte rename to src/routes/flashtool/FirmwareFlasher.svelte index 9d05ad8e..d2425ee6 100644 --- a/src/lib/components/EspTool/FirmwareFlasher.svelte +++ b/src/routes/flashtool/FirmwareFlasher.svelte @@ -1,14 +1,18 @@ -
    -

    Flashing

    -
    -
    - -
    -
    - +
    - +
    {#if error}
    - +

    Error: {error}

    {:else} @@ -124,7 +114,7 @@ {/if} {#if progressName !== null} - + {/if} {/if}
    diff --git a/src/routes/flashtool/HelpDialog.svelte b/src/routes/flashtool/HelpDialog.svelte new file mode 100644 index 00000000..b5a9b102 --- /dev/null +++ b/src/routes/flashtool/HelpDialog.svelte @@ -0,0 +1,122 @@ + + + open, onOpenChange}> + + + +

    + Troubleshooter +

    +
    +
    + +
    +

    Install drivers

    +
    +

    1. Download drivers

    +
    + +
    +
    +
    +

    2. Extract the zip file

    +
    +

    Extract the contents of the zip file to a folder on your computer.

    +
    +
    +
    +

    3. Run the installer

    +
    +

    + Go to the folder where you extracted the zip file and run + CP210xVCPInstaller_x64.exe
    + Follow the instructions to install the drivers. +

    +
    +
    +

    + If the device still doesn't appear in the list +

    +
    +

    1. Open Device Manager

    +
    +

    + Press Win + X and select + Device Manager. +

    +
    +
    +
    +

    2. Find your device

    +
    +

    + Go to Ports (COM & LPT) and look a device similar to one of the + following: +

    +
      +
    • Silicon Labs CP210x USB to UART Bridge
    • +
    • Silicon Labs CP210x USB to UART Bridge (COM...)
    • +
    +

    + If you don't see it in the list, make sure that your device is connected to your + computer. +

    +
    +
    +
    +

    3. Update drivers

    +
    +

    + Right click on the device and select Update Driver. +

    +

    + Select Browse my computer for drivers and browse to the folder + where you extracted the zip file. +

    +

    Make sure that Include subfolders option is checked.

    +

    + If successful, you should see Silicon Labs CP210x USB to UART Bridge in the list. +

    +
    +
    +
    +
    + + + +
    +
    diff --git a/src/routes/flashtool/SerialPortSelector.svelte b/src/routes/flashtool/SerialPortSelector.svelte new file mode 100644 index 00000000..d337dbc6 --- /dev/null +++ b/src/routes/flashtool/SerialPortSelector.svelte @@ -0,0 +1,93 @@ + + +
    +
    + +
    + {#if port !== null || (errorMessage !== null && errorMessage.name !== 'NotFoundError')} +
    + {#if port !== null} +

    + Device connected: {GetHardwareID(port)} +

    + {/if} + {#if errorMessage !== null && errorMessage.name !== 'NotFoundError'} +
    + +

    Error: {errorMessage.message}

    +
    + {/if} +
    + {/if} +
    diff --git a/src/routes/login/+page.svelte b/src/routes/login/+page.svelte index c8e09fd7..debbbf0f 100644 --- a/src/routes/login/+page.svelte +++ b/src/routes/login/+page.svelte @@ -1,49 +1,59 @@ -
    -
    -

    Login

    +
    + + Login + + + + + - - + - - + + +
    diff --git a/src/routes/logout/+page.svelte b/src/routes/logout/+page.svelte index 82eb3f3c..299f92a4 100644 --- a/src/routes/logout/+page.svelte +++ b/src/routes/logout/+page.svelte @@ -1,27 +1,31 @@ {#if browser && $UserStore.self} -
    +

    Logout

    diff --git a/src/routes/signup/+page.svelte b/src/routes/signup/+page.svelte index 0fcc9283..d58af404 100644 --- a/src/routes/signup/+page.svelte +++ b/src/routes/signup/+page.svelte @@ -1,17 +1,18 @@ -
    -
    -

    Sign Up

    - - - - - - - - - - + accountCreated, onOpenChange}> + + + Account created + + Your account has been created. Please check your email to verify your account. + + + + + + + +
    + + Sign Up + + +
    + + + + + + + + + +
    diff --git a/static/fa/LICENSE.txt b/static/fa/LICENSE.txt deleted file mode 100644 index e69c5e39..00000000 --- a/static/fa/LICENSE.txt +++ /dev/null @@ -1,165 +0,0 @@ -Fonticons, Inc. (https://fontawesome.com) - --------------------------------------------------------------------------------- - -Font Awesome Free License - -Font Awesome Free is free, open source, and GPL friendly. You can use it for -commercial projects, open source projects, or really almost whatever you want. -Full Font Awesome Free license: https://fontawesome.com/license/free. - --------------------------------------------------------------------------------- - -# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) - -The Font Awesome Free download is licensed under a Creative Commons -Attribution 4.0 International License and applies to all icons packaged -as SVG and JS file types. - --------------------------------------------------------------------------------- - -# Fonts: SIL OFL 1.1 License - -In the Font Awesome Free download, the SIL OFL license applies to all icons -packaged as web and desktop font files. - -Copyright (c) 2024 Fonticons, Inc. (https://fontawesome.com) -with Reserved Font Name: "Font Awesome". - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - -SIL OPEN FONT LICENSE -Version 1.1 - 26 February 2007 - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting — in part or in whole — any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - --------------------------------------------------------------------------------- - -# Code: MIT License (https://opensource.org/licenses/MIT) - -In the Font Awesome Free download, the MIT license applies to all non-font and -non-icon files. - -Copyright 2024 Fonticons, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in the -Software without restriction, including without limitation the rights to use, copy, -modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -# Attribution - -Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font -Awesome Free files already contain embedded comments with sufficient -attribution, so you shouldn't need to do anything additional when using these -files normally. - -We've kept attribution comments terse, so we ask that you do not actively work -to remove them from files, especially code. They're a great way for folks to -learn about Font Awesome. - --------------------------------------------------------------------------------- - -# Brand Icons - -All brand icons are trademarks of their respective owners. The use of these -trademarks does not indicate endorsement of the trademark holder by Font -Awesome, nor vice versa. **Please do not use brand logos for any purpose except -to represent the company, product, or service to which they refer.** diff --git a/static/fa/css/all.css b/static/fa/css/all.css deleted file mode 100644 index 08cf8326..00000000 --- a/static/fa/css/all.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp-solid,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} - -.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-thumb-tack-slash:before,.fa-thumbtack-slash:before{content:"\e68f"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-table-cells-row-unlock:before{content:"\e691"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} -.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-dart-lang:before{content:"\e693"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-flutter:before{content:"\e694"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/static/fa/css/brands.css b/static/fa/css/brands.css deleted file mode 100644 index bcc96eb0..00000000 --- a/static/fa/css/brands.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-dart-lang:before{content:"\e693"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-flutter:before{content:"\e694"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"} \ No newline at end of file diff --git a/static/fa/css/fontawesome.css b/static/fa/css/fontawesome.css deleted file mode 100644 index e949285b..00000000 --- a/static/fa/css/fontawesome.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp-solid,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} - -.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-thumb-tack-slash:before,.fa-thumbtack-slash:before{content:"\e68f"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-table-cells-row-unlock:before{content:"\e691"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} -.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0} \ No newline at end of file diff --git a/static/fa/css/regular.css b/static/fa/css/regular.css deleted file mode 100644 index 2b94e444..00000000 --- a/static/fa/css/regular.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400} \ No newline at end of file diff --git a/static/fa/css/solid.css b/static/fa/css/solid.css deleted file mode 100644 index eab276ec..00000000 --- a/static/fa/css/solid.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} \ No newline at end of file diff --git a/static/fa/css/v4-font-face.css b/static/fa/css/v4-font-face.css deleted file mode 100644 index fd452b25..00000000 --- a/static/fa/css/v4-font-face.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/static/fa/css/v4-shims.css b/static/fa/css/v4-shims.css deleted file mode 100644 index 80f2d7e2..00000000 --- a/static/fa/css/v4-shims.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa.fa-glass:before{content:"\f000"}.fa.fa-envelope-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-star-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-home:before{content:"\f015"}.fa.fa-file-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-list-alt:before{content:"\f022"}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-edit{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-edit:before{content:"\f044"}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart-o:before,.fa.fa-bar-chart:before{content:"\e0e3"}.fa.fa-twitter-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-twitter-square:before{content:"\f081"}.fa.fa-facebook-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-square:before{content:"\f082"}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-github-square:before{content:"\f092"}.fa.fa-lemon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-globe:before{content:"\f57d"}.fa.fa-tasks:before{content:"\f828"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-cut:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-save{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-save:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-magic:before{content:"\e2ca"}.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pinterest-square:before{content:"\f0d3"}.fa.fa-google-plus-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-square:before{content:"\f0d4"}.fa.fa-google-plus{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f625"}.fa.fa-comment-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard:before{content:"\f0ea"}.fa.fa-lightbulb-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f0ed"}.fa.fa-cloud-upload:before{content:"\f0ee"}.fa.fa-bell-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f5c0"}.fa.fa-star-half-empty{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f5c0"}.fa.fa-star-half-full{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f5c0"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before,.fa.fa-unlink:before{content:"\f127"}.fa.fa-calendar-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-unlock-alt:before{content:"\f09c"}.fa.fa-minus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\24"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\e1bc"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f884"}.fa.fa-sort-amount-desc:before{content:"\f160"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-youtube-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-square:before{content:"\f431"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-xing-square:before{content:"\f169"}.fa.fa-youtube-play{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-tumblr-square:before{content:"\f174"}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo-square:before{content:"\f194"}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\e2bb"}.fa.fa-plus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-google,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-yahoo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-reddit-square:before{content:"\f1a2"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-behance-square:before{content:"\f1b5"}.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-steam-square:before{content:"\f1b7"}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-life-bouy:before,.fa.fa-life-buoy:before,.fa.fa-life-saver:before,.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-git-square:before{content:"\f1d2"}.fa.fa-git,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-futbol-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-lastfm-square:before{content:"\f203"}.fa.fa-angellist,.fa.fa-ioxhost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before,.fa.fa-transgender:before{content:"\f224"}.fa.fa-transgender-alt:before{content:"\f225"}.fa.fa-facebook-official{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-clone{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-creative-commons,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-odnoklassniki-square:before{content:"\f264"}.fa.fa-chrome,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-internet-explorer,.fa.fa-opera,.fa.fa-safari,.fa.fa-wikipedia-w{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-viadeo,.fa.fa-viadeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-viadeo-square:before{content:"\f2aa"}.fa.fa-snapchat,.fa.fa-snapchat-ghost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-ghost:before{content:"\f2ab"}.fa.fa-snapchat-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-square:before{content:"\f2ad"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-themeisle,.fa.fa-yoast{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-meetup,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 6 Brands";font-weight:400} \ No newline at end of file diff --git a/static/fa/css/v5-font-face.css b/static/fa/css/v5-font-face.css deleted file mode 100644 index 78cc949a..00000000 --- a/static/fa/css/v5-font-face.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")} \ No newline at end of file diff --git a/static/fa/webfonts/fa-brands-400.ttf b/static/fa/webfonts/fa-brands-400.ttf deleted file mode 100644 index 08362f34..00000000 Binary files a/static/fa/webfonts/fa-brands-400.ttf and /dev/null differ diff --git a/static/fa/webfonts/fa-brands-400.woff2 b/static/fa/webfonts/fa-brands-400.woff2 deleted file mode 100644 index d84512f3..00000000 Binary files a/static/fa/webfonts/fa-brands-400.woff2 and /dev/null differ diff --git a/static/fa/webfonts/fa-regular-400.ttf b/static/fa/webfonts/fa-regular-400.ttf deleted file mode 100644 index 7f9b53c1..00000000 Binary files a/static/fa/webfonts/fa-regular-400.ttf and /dev/null differ diff --git a/static/fa/webfonts/fa-regular-400.woff2 b/static/fa/webfonts/fa-regular-400.woff2 deleted file mode 100644 index 452b49c0..00000000 Binary files a/static/fa/webfonts/fa-regular-400.woff2 and /dev/null differ diff --git a/static/fa/webfonts/fa-solid-900.ttf b/static/fa/webfonts/fa-solid-900.ttf deleted file mode 100644 index e7e2ecfa..00000000 Binary files a/static/fa/webfonts/fa-solid-900.ttf and /dev/null differ diff --git a/static/fa/webfonts/fa-solid-900.woff2 b/static/fa/webfonts/fa-solid-900.woff2 deleted file mode 100644 index fec1fae7..00000000 Binary files a/static/fa/webfonts/fa-solid-900.woff2 and /dev/null differ diff --git a/static/fa/webfonts/fa-v4compatibility.ttf b/static/fa/webfonts/fa-v4compatibility.ttf deleted file mode 100644 index 577b7a00..00000000 Binary files a/static/fa/webfonts/fa-v4compatibility.ttf and /dev/null differ diff --git a/static/fa/webfonts/fa-v4compatibility.woff2 b/static/fa/webfonts/fa-v4compatibility.woff2 deleted file mode 100644 index 73931680..00000000 Binary files a/static/fa/webfonts/fa-v4compatibility.woff2 and /dev/null differ diff --git a/svelte.config.js b/svelte.config.js index fba25b9c..bce14ede 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,14 +1,27 @@ -import { default as adapterCloudflare } from '@sveltejs/adapter-cloudflare'; -import { default as adapterNode } from '@sveltejs/adapter-node'; +import * as child_process from 'node:child_process'; +import adapterCloudflare from '@sveltejs/adapter-cloudflare'; +import adapterNode from '@sveltejs/adapter-node'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; -import { env } from 'process'; +import dotenv from 'dotenv'; +import process from 'process'; // Determine if we are running on Cloudflare Pages -const isCloudflare = env.CF_PAGES === '1'; +const isCloudflare = process.env.CF_PAGES === '1'; // Use the appropriate adapter const adapter = isCloudflare ? adapterCloudflare : adapterNode; +function readEnv(path) { + return dotenv.config({ path })?.parsed ?? {}; +} + +const env = { + ...readEnv('.env'), + ...readEnv(`.env.${process.env.NODE_ENV}`), + ...readEnv('.env.local'), + ...process.env, +}; + /** @type {import('@sveltejs/kit').Config} */ const config = { extensions: ['.svelte'], @@ -26,6 +39,32 @@ const config = { exclude: [''], }, }), + csp: { + mode: 'hash', + directives: { + 'default-src': ['self'], + 'child-src': ['https://challenges.cloudflare.com'], + 'frame-src': ['https://challenges.cloudflare.com'], // Deprecated + 'img-src': ['self', 'https://www.gravatar.com'], + 'connect-src': [ + 'self', + 'https://' + env.PUBLIC_BACKEND_API_DOMAIN, + 'wss://' + env.PUBLIC_BACKEND_API_DOMAIN, + 'wss://' + env.PUBLIC_GATEWAY_CSP_WILDCARD, + 'https://firmware.openshock.org', + 'https://api.pwnedpasswords.com/range/', + 'https://cloudflareinsights.com', + ], + 'script-src': [ + 'self', + 'https://challenges.cloudflare.com/turnstile/', + 'https://static.cloudflareinsights.com', + ], + }, + }, + version: { + name: process.env.GIT_HASH ?? child_process.execSync('git rev-parse HEAD').toString().trim(), + }, }, }; export default config; diff --git a/tailwind.config.ts b/tailwind.config.ts index a62bb650..3841e60d 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,25 +1,96 @@ -import { join } from 'path' -import type { Config } from 'tailwindcss' -import forms from '@tailwindcss/forms'; -import typography from '@tailwindcss/typography'; -import { skeleton } from '@skeletonlabs/tw-plugin' -import { openshockTheme } from './openshock-theme'; +import { fontFamily } from 'tailwindcss/defaultTheme'; +import type { Config } from 'tailwindcss'; +import tailwindcssAnimate from 'tailwindcss-animate'; -export default { - darkMode: 'class', - content: ['./src/**/*.{html,js,svelte,ts}', join(require.resolve('@skeletonlabs/skeleton'), '../**/*.{html,js,svelte,ts}')], +const config: Config = { + darkMode: ['class'], + content: ['./src/**/*.{html,js,svelte,ts}'], + safelist: ['dark'], theme: { - extend: {}, - }, - plugins: [ - forms, - typography, - skeleton({ - themes: { - custom: [ - openshockTheme - ], + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border) / )', + input: 'hsl(var(--input) / )', + ring: 'hsl(var(--ring) / )', + background: 'hsl(var(--background) / )', + foreground: 'hsl(var(--foreground) / )', + primary: { + DEFAULT: 'hsl(var(--primary) / )', + foreground: 'hsl(var(--primary-foreground) / )', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary) / )', + foreground: 'hsl(var(--secondary-foreground) / )', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive) / )', + foreground: 'hsl(var(--destructive-foreground) / )', + }, + muted: { + DEFAULT: 'hsl(var(--muted) / )', + foreground: 'hsl(var(--muted-foreground) / )', + }, + accent: { + DEFAULT: 'hsl(var(--accent) / )', + foreground: 'hsl(var(--accent-foreground) / )', + }, + popover: { + DEFAULT: 'hsl(var(--popover) / )', + foreground: 'hsl(var(--popover-foreground) / )', + }, + card: { + DEFAULT: 'hsl(var(--card) / )', + foreground: 'hsl(var(--card-foreground) / )', + }, + sidebar: { + DEFAULT: 'hsl(var(--sidebar-background))', + foreground: 'hsl(var(--sidebar-foreground))', + primary: 'hsl(var(--sidebar-primary))', + 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', + accent: 'hsl(var(--sidebar-accent))', + 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', + border: 'hsl(var(--sidebar-border))', + ring: 'hsl(var(--sidebar-ring))', + }, + }, + borderRadius: { + xl: 'calc(var(--radius) + 4px)', + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + fontFamily: { + sans: [...fontFamily.sans], }, - }), - ], -} satisfies Config; + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + 'caret-blink': { + '0%,70%,100%': { opacity: '1' }, + '20%,50%': { opacity: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + 'caret-blink': 'caret-blink 1.25s ease-out infinite', + }, + }, + }, + plugins: [tailwindcssAnimate], +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json index 9d20aa08..34aadc02 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,8 +9,8 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "moduleResolution": "bundler", - }, + "moduleResolution": "bundler" + } // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias // // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes diff --git a/vite.config.ts b/vite.config.ts index 195dde00..f7d51a7c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,8 @@ -import { purgeCss } from 'vite-plugin-tailwind-purgecss'; import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig, type PluginOption, loadEnv } from 'vite'; -import mkcert from 'vite-plugin-mkcert'; import dns from 'dns'; import { env } from 'process'; +import { defineConfig, loadEnv, type PluginOption, type UserConfig } from 'vite'; +import mkcert from 'vite-plugin-mkcert'; function printRed(message: string) { console.log(`\u001b[1;31m${message}\u001b[0m`); @@ -38,8 +37,12 @@ async function ensureFqdnRedirect(host: string, fqdn: string) { console.log('On macOS and Linux, you can do this by running the following command:'); printBlue(`echo "${host} ${fqdn}" | sudo tee -a /etc/hosts\n`); - console.log('On Windows, you can do this by running the following command in PowerShell as an administrator:'); - printBlue(`Add-Content -Path "C:\\Windows\\System32\\drivers\\etc\\hosts" -Value "${host} ${fqdn}"\n`); + console.log( + 'On Windows, you can do this by running the following command in PowerShell as an administrator:' + ); + printBlue( + `Add-Content -Path "C:\\Windows\\System32\\drivers\\etc\\hosts" -Value "${host} ${fqdn}"\n` + ); printRed('Then restart your development server'); process.exit(1); @@ -60,9 +63,6 @@ async function getPlugins(useLocalRedirect: boolean) { // Add the sveltekit plugin plugins.push(sveltekit()); - // Configure the purgeCss plugin - plugins.push(purgeCss()); - return plugins; } @@ -87,20 +87,20 @@ async function getServer(mode: string, useLocalRedirect: boolean) { function getTest() { return { - include: ['src/**/*.{test,spec}.{js,ts}'] + include: ['src/**/*.{test,spec}.{js,ts}'], }; } export default defineConfig(async ({ command, mode, isPreview }) => { const isLocalServe = command === 'serve' || isPreview === true; const isProduction = mode === 'production' && (isThruthy(env.DOCKER) || isThruthy(env.CF_PAGES)); - + // If we are running locally, ensure that local.{PUBLIC_SITE_DOMAIN} resolves to localhost, and then use mkcert to generate a certificate const useLocalRedirect = isLocalServe && !isProduction && !isThruthy(env.CI); return defineConfig({ plugins: await getPlugins(useLocalRedirect), server: await getServer(mode, useLocalRedirect), - test: getTest() - }); + test: getTest(), + } as UserConfig); // TODO: "test" is not a valid property of the defineconfig argument? This needs to get fixed });