diff --git a/.forgejo/workflows/deploy-edge-proxy.yml b/.forgejo/workflows/deploy-edge-proxy.yml deleted file mode 100644 index 87125e3..0000000 --- a/.forgejo/workflows/deploy-edge-proxy.yml +++ /dev/null @@ -1,31 +0,0 @@ -# name: Deploy Edge Proxy -# run-name: ${{ gitea.actor }} Deploy Edge Proxy -# on: -# push: -# branches: [ master ] - -# env: -# GARDEN_DEPLOY_ACTION: minecluster-proxy - -# jobs: -# deploy-edge: -# steps: -# # Setup Oasis -# - name: Oasis Setup -# uses: https://gitea.dunemask.dev/elysium/elysium-actions@oasis-setup-auto -# with: -# deploy-env: edge -# infisical-token: ${{ secrets.INFISICAL_ELYSIUM_EDGE_READ_TOKEN }} -# # Deploy to Edge Cluster -# - name: Deploy to Edge Cluster -# run: garden deploy $GARDEN_DEPLOY_ACTION --force --force-build --env usw-edge -# working-directory: ${{ env.OASIS_WORKSPACE }} -# # Alert via Discord -# - name: Discord Alert -# if: always() -# uses: https://gitea.dunemask.dev/elysium/elysium-actions@discord-status -# with: -# status: ${{ job.status }} -# channel: deployments -# header: DEPLOY EDGE -# additional-content: "Minecluster Proxy" \ No newline at end of file diff --git a/.forgejo/workflows/deploy-edge.yml b/.forgejo/workflows/deploy-edge.yml deleted file mode 100644 index afb0c78..0000000 --- a/.forgejo/workflows/deploy-edge.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Deploy USW-MC -run-name: ${{ forgejo.actor }} Deploy USW-MC -on: - push: - branches: [master] - -env: - GARDEN_DEPLOY_ACTION: minecluster - -jobs: - deploy-edge: - steps: - # Configure proper kubeconfig (Used when cluster does not match the edge environment) - - name: Get usw-mc deployment kubeconfig - uses: https://forgejo.dunemask.dev/elysium/elysium-actions@infisical-env - with: - infisical-token: ${{ secrets.INFISICAL_ELYSIUM_EDGE_READ_TOKEN }} - project-id: ${{ vars.INFISICAL_DEPLOYMENTS_PROJECT_ID }} - secret-envs: edge - secret-paths: /kubernetes/usw-mc - # Setup Oasis - - name: Oasis Setup - uses: https://forgejo.dunemask.dev/elysium/elysium-actions@oasis-setup-auto - with: - deploy-env: edge - infisical-token: ${{ secrets.INFISICAL_ELYSIUM_EDGE_READ_TOKEN }} - infisical-project: ${{ vars.INFISICAL_DEPLOYMENTS_PROJECT_ID }} - extra-secret-paths: /dashboard - extra-secret-envs: edge - # Deploy to Edge - - name: Deploy to Edge env - run: garden deploy $GARDEN_DEPLOY_ACTION --force --force-build --env usw-edge - working-directory: ${{ env.OASIS_WORKSPACE }} - env: # (Used when cluster does not match the edge environment) - MCL_KUBECONFIG: ${{ env.KUBERNETES_CONFIG_USW_MC }} - # Alert via Discord - - name: Discord Alert - if: always() - uses: https://forgejo.dunemask.dev/elysium/elysium-actions@discord-status - with: - status: ${{ job.status }} - channel: deployments - header: DEPLOY MC - additional-content: "Minecluster Server Manager Deployment" diff --git a/.forgejo/workflows/qa-api-tests.yml b/.forgejo/workflows/qa-api-tests.yml deleted file mode 100644 index 596e11a..0000000 --- a/.forgejo/workflows/qa-api-tests.yml +++ /dev/null @@ -1,42 +0,0 @@ -# name: QA API Tests -# run-name: ${{ gitea.actor }} QA API Test -# on: -# pull_request: -# branches: [ master ] - -# env: -# REPO_DIR: ${{ gitea.workspace }}/minecluster -# GARDEN_LINK_ACTION: build.minecluster-image - -# jobs: -# qa-api-tests: -# steps: -# # Setup Oasis -# - name: Oasis Setup -# uses: https://gitea.dunemask.dev/elysium/elysium-actions@oasis-setup-auto -# with: -# deploy-env: ci -# infisical-token: ${{ secrets.INFISICAL_ELYSIUM_CI_READ_TOKEN }} -# # Test Code -# - name: Checkout repository -# uses: actions/checkout@v3 -# with: -# path: ${{ env.REPO_DIR }} -# # Garden link -# - name: Link Repo code to Garden -# run: garden link action $GARDEN_LINK_ACTION $REPO_DIR --env usw-ci --var cubit-projects=cairo,minecluster -# working-directory: ${{ env.OASIS_WORKSPACE }} -# # Cubit CI Tests -# - name: Run Cubit tests in CI env -# run: garden workflow qa-api-tests --env usw-ci --var ci-ttl=25m -# working-directory: ${{ env.OASIS_WORKSPACE }} -# # Discord Alert -# - name: Discord Alert -# if: always() -# uses: https://gitea.dunemask.dev/elysium/elysium-actions@discord-status -# with: -# status: ${{ job.status }} -# channel: ci -# header: QA API Tests -# additional-content: "CI Namespace: `${{env.CI_NAMESPACE}}`" - \ No newline at end of file diff --git a/.forgejo/workflows/s3-repo-backup.yml b/.forgejo/workflows/s3-repo-backup.yml deleted file mode 100644 index 4e4e7fd..0000000 --- a/.forgejo/workflows/s3-repo-backup.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: S3 Repo Backup -run-name: ${{ forgejo.actor }} S3 Repo Backup -on: - push: - branches: [ master ] - -jobs: - s3-repo-backup: - steps: - - name: S3 Backup - uses: https://forgejo.dunemask.dev/elysium/elysium-actions@s3-backup - with: - infisical-token: ${{ secrets.INFISICAL_ELYSIUM_EDGE_READ_TOKEN }} - infisical-project: ${{ vars.INFISICAL_DEPLOYMENTS_PROJECT_ID }} - - name: Status Alert - if: always() - run: echo "The Job ended with status ${{ job.status }}." diff --git a/.gitea/workflows/s3-repo-backup.yml b/.gitea/workflows/s3-repo-backup.yml new file mode 100644 index 0000000..68c426c --- /dev/null +++ b/.gitea/workflows/s3-repo-backup.yml @@ -0,0 +1,31 @@ +name: S3 Repo Backup +run-name: ${{ gitea.actor }} S3 Repo Backup +on: + push: + branches: [ master ] + +env: + S3_BACKUP_ENDPOINT: https://s3.dunemask.dev + S3_BACKUP_KEY_ID: gitea-repo-backup + S3_BACKUP_KEY: ${{ secrets.S3_REPO_BACKUP_KEY }} + REPO_DIR: ${{ gitea.workspace }}/${{ gitea.respository }} +jobs: + s3-repo-backup: + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + path: ${{ env.REPO_DIR }} + - name: S3 Backup + uses: peter-evans/s3-backup@v1 + env: + ACCESS_KEY_ID: ${{ env.S3_BACKUP_KEY_ID }} + SECRET_ACCESS_KEY: ${{ env.S3_BACKUP_KEY }} + MIRROR_SOURCE: ${{ env.REPO_DIR }} + MIRROR_TARGET: repository-backups/${{ gitea.repository }} + STORAGE_SERVICE_URL: ${{env.S3_BACKUP_ENDPOINT}} + with: + args: --overwrite --remove + - name: Status Alert + if: always() + run: echo "The Job ended with status ${{ job.status }}." diff --git a/.gitignore b/.gitignore index 5c86a6a..d570088 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ node_modules/ -.env diff --git a/Dockerfile b/Dockerfile index c578d05..c80bac8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,9 +8,8 @@ RUN npm i COPY public public COPY dist dist COPY src src +COPY lib lib COPY index.html . COPY vite.config.js . RUN npm run build:react -# Copy Backend resources over -COPY lib lib CMD ["npm","start"] diff --git a/README.md b/README.md index ed786b8..3348a0b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,3 @@ Minecluster or MCL is a web interface used to manage multiple instance of Minecraft Servers in Kubernetes. This app is built to be an all in one for self-hosting Minecraft server. It uses rendered helm charts based on itzg/minecraft-server More info coming soon. - -## ⚠ Warning ⚠ -Development is very active and there is no garuntee for compatability or migration across versions 1/15/24 diff --git a/dist/app.js b/dist/app.js index d87897e..2f46e88 100644 --- a/dist/app.js +++ b/dist/app.js @@ -8,4 +8,4 @@ const kc = new k8s.KubeConfig(); kc.loadFromDefault(); } -main().catch((e)=>{console.error(e)}); +main().catch((e)=>{console.log(e)}); diff --git a/index.html b/index.html index 4fadd4e..ce38114 100644 --- a/index.html +++ b/index.html @@ -4,15 +4,6 @@ - - - - - - - - - Minecluster diff --git a/lib/controllers/file-controller.js b/lib/controllers/file-controller.js index e5e7075..36aa0b0 100644 --- a/lib/controllers/file-controller.js +++ b/lib/controllers/file-controller.js @@ -4,17 +4,13 @@ import { listServerFiles, removeServerItem, uploadServerItem, - moveServerItems, } from "../k8s/server-files.js"; import { sendError } from "../util/ExpressClientError.js"; -import { checkAuthorization } from "../database/queries/server-queries.js"; export async function listFiles(req, res) { const serverSpec = req.body; if (!serverSpec) return res.sendStatus(400); - if (!serverSpec.id) return res.status(400).send("Server id missing!"); - const authorized = await checkAuthorization(serverSpec.id, req.cairoId); - if (!authorized) return res.sendStatus(403); + if (!serverSpec.name) return res.status(400).send("Server name required!"); listServerFiles(serverSpec) .then((f) => { const fileData = f.map((fi, i) => ({ @@ -33,10 +29,8 @@ export async function listFiles(req, res) { export async function createFolder(req, res) { const serverSpec = req.body; if (!serverSpec) return res.sendStatus(400); - if (!serverSpec.id) return res.status(400).send("Server id missing!"); + if (!serverSpec.name) return res.status(400).send("Server name required!"); if (!serverSpec.path) return res.status(400).send("Path required!"); - const authorized = await checkAuthorization(serverSpec.id, req.cairoId); - if (!authorized) return res.sendStatus(403); createServerFolder(serverSpec) .then(() => res.sendStatus(200)) .catch(sendError(res)); @@ -45,12 +39,10 @@ export async function createFolder(req, res) { export async function deleteItem(req, res) { const serverSpec = req.body; if (!serverSpec) return res.sendStatus(400); - if (!serverSpec.id) return res.status(400).send("Server id missing!"); + if (!serverSpec.name) return res.status(400).send("Server name required!"); if (!serverSpec.path) return res.status(400).send("Path required!"); if (serverSpec.isDir === undefined || serverSpec.isDir === null) return res.status(400).send("IsDIr required!"); - const authorized = await checkAuthorization(serverSpec.id, req.cairoId); - if (!authorized) return res.sendStatus(403); removeServerItem(serverSpec) .then(() => res.sendStatus(200)) .catch(sendError(res)); @@ -58,10 +50,8 @@ export async function deleteItem(req, res) { export async function uploadItem(req, res) { const serverSpec = req.body; - if (!serverSpec.id) return res.status(400).send("Server id missing!"); + if (!serverSpec.name) return res.status(400).send("Server name required!"); if (!serverSpec.path) return res.status(400).send("Path required!"); - const authorized = await checkAuthorization(serverSpec.id, req.cairoId); - if (!authorized) return res.sendStatus(403); uploadServerItem(serverSpec, req.file) .then(() => res.sendStatus(200)) .catch(sendError(res)); @@ -69,10 +59,8 @@ export async function uploadItem(req, res) { export async function getItem(req, res) { const serverSpec = req.body; - if (!serverSpec.id) return res.status(400).send("Server id missing!"); + if (!serverSpec.name) return res.status(400).send("Server name required!"); if (!serverSpec.path) return res.status(400).send("Path required!"); - const authorized = await checkAuthorization(serverSpec.id, req.cairoId); - if (!authorized) return res.sendStatus(403); getServerItem(serverSpec, res) .then(({ ds, ftpTransfer }) => { ds.pipe(res).on("error", sendError(res)); @@ -80,18 +68,3 @@ export async function getItem(req, res) { }) .catch(sendError(res)); } - -export async function moveItems(req, res) { - const serverSpec = req.body; - if (!serverSpec.id) return res.status(400).send("Server id missing!"); - if (!serverSpec.destination) - return res.status(400).send("Destination required!"); - if (!serverSpec.origin) return res.status(400).send("Origin required!"); - if (!serverSpec.files || !Array.isArray(serverSpec.files)) - return res.status(400).send("Files required!"); - const authorized = await checkAuthorization(serverSpec.id, req.cairoId); - if (!authorized) return res.sendStatus(403); - moveServerItems(serverSpec) - .then(() => res.sendStatus(200)) - .catch(sendError(res)); -} diff --git a/lib/controllers/lifecycle-controller.js b/lib/controllers/lifecycle-controller.js index 1916157..5b0105e 100644 --- a/lib/controllers/lifecycle-controller.js +++ b/lib/controllers/lifecycle-controller.js @@ -4,96 +4,46 @@ import { createServerEntry, deleteServerEntry, getServerEntry, - modifyServerEntry, } from "../database/queries/server-queries.js"; -import ExpressClientError, { sendError } from "../util/ExpressClientError.js"; +import { sendError } from "../util/ExpressClientError.js"; +import { + startServerContainer, + stopServerContainer, +} from "../k8s/server-control.js"; import { toggleServer } from "../k8s/k8s-server-control.js"; -import { checkAuthorization } from "../database/queries/server-queries.js"; -import { WARN } from "../util/logging.js"; -import modifyServerResources from "../k8s/server-modify.js"; - -const dnsRegex = new RegExp( - `^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$`, -); - -function backupPayloadFilter(req, res) { - const serverSpec = req.body; - const { - storage, - backupHost, - backupBucket, - backupId, - backupKey, - backupInterval, - } = serverSpec; - // TODO: Impliment non creation time backups - if ( - !!backupHost || - !!backupBucket || - !!backupId || - !!backupKey || - !!backupInterval - ) { - if (storage === 0) - return res.status(400).send("Backups cannot be used if storage is zero!"); - // If any keys are required, all are required - if ( - !( - !!backupHost && - !!backupBucket && - !!backupId && - !!backupKey && - !!backupInterval - ) - ) - return res.status(400).send("All backup keys are required!"); - if (!dnsRegex.test(backupHost)) - return res.status(400).send("Backup Host invalid!"); - } - return "filtered"; -} function payloadFilter(req, res) { const serverSpec = req.body; if (!serverSpec) return res.sendStatus(400); - const { name, host, version, serverType, memory, extraPorts } = serverSpec; + const { name, host, version, serverType, difficulty, gamemode, memory } = + serverSpec; if (!name) return res.status(400).send("Server name is required!"); if (!host) return res.status(400).send("Server host is required!"); - if (!dnsRegex.test(host)) return res.status(400).send("Hostname invalid!"); if (!version) return res.status(400).send("Server version is required!"); + if (!difficulty) + return res.status(400).send("Server difficulty is required!"); if (!serverType) return res.status(400).send("Server type is required!"); + if (!gamemode) return res.status(400).send("Server Gamemode is required!"); if (!memory) return res.status(400).send("Memory is required!"); - if ( - !!extraPorts && - (!Array.isArray(extraPorts) || - extraPorts.find((e) => typeof e !== "string" || e.length > 5)) - ) - return res - .status(400) - .send("Extra ports must be a list of strings with length of 5!"); - if (host !== host.toLowerCase()) - WARN("CREATE", "Host automatically being lowercasified..."); - req.body.host = host.toLowerCase(); + req.body.name = req.body.name.toLowerCase(); return "filtered"; } -async function checkServerId(cairoId, serverSpec) { +function checkServerName(serverSpec) { if (!serverSpec) throw new ExpressClientError({ c: 400 }); - if (!serverSpec.id) - throw new ExpressClientError({ c: 400, m: "Server id missing!" }); - const authorized = await checkAuthorization(serverSpec.id, cairoId); - if (!authorized) - throw new ExpressClientError({ c: 403, m: "Access forbidden!" }); + if (!serverSpec.name) + throw new ExpressClientError({ c: 400, m: "Server name required!" }); } export async function createServer(req, res) { if (payloadFilter(req, res) !== "filtered") return; - if (backupPayloadFilter(req, res) !== "filtered") return; const serverSpec = req.body; try { - const serverEntry = await createServerEntry(req.cairoId, serverSpec); - await createServerResources(serverEntry); - res.json(serverEntry); + const serverSpecs = await getServerEntry(serverSpec.name); + if (serverSpecs.length !== 0) throw Error("Server already exists in DB!"); + await createServerResources(serverSpec); + await createServerEntry(serverSpec); + res.sendStatus(200); } catch (e) { sendError(res)(e); } @@ -103,11 +53,11 @@ export async function deleteServer(req, res) { // Ensure spec is safe const serverSpec = req.body; try { - await checkServerId(req.cairoId, serverSpec); + checkServerName(serverSpec); } catch (e) { return sendError(res)(e); } - const deleteEntry = deleteServerEntry(serverSpec.id); + const deleteEntry = deleteServerEntry(serverSpec.name); const deleteResources = deleteServerResources(serverSpec); Promise.all([deleteEntry, deleteResources]) .then(() => res.sendStatus(200)) @@ -118,12 +68,12 @@ export async function startServer(req, res) { // Ensure spec is safe const serverSpec = req.body; try { - await checkServerId(req.cairoId, serverSpec); + checkServerName(serverSpec); } catch (e) { return sendError(res)(e); } - const { id } = serverSpec; - toggleServer(id, true) + const { name } = serverSpec; + toggleServer(name, true) .then(() => res.sendStatus(200)) .catch(sendError(res)); } @@ -132,48 +82,12 @@ export async function stopServer(req, res) { // Ensure spec is safe const serverSpec = req.body; try { - await checkServerId(req.cairoId, serverSpec); + checkServerName(serverSpec); } catch (e) { return sendError(res)(e); } - const { id } = serverSpec; - toggleServer(id, false) + const { name } = serverSpec; + toggleServer(name, false) .then(() => res.sendStatus(200)) .catch(sendError(res)); } - -export async function getServer(req, res) { - // Ensure spec is safe - const serverSpec = req.body; - try { - await checkServerId(req.cairoId, serverSpec); - } catch (e) { - return sendError(res)(e); - } - const { id } = serverSpec; - getServerEntry(id).then((s) => { - delete s.backupKey; // Do not let this ever get to an API client - s.backupBucket = s.backupPath; - delete s.backupPath; - delete s.backupId; // Do not let this ever get to an API client - res.json(s); - }); -} - -export async function modifyServer(req, res) { - if (payloadFilter(req, res) !== "filtered") return; - const serverSpec = req.body; - if (!!serverSpec.host) - WARN( - "MODIFY", - "Warning, hostname changing is not implimented yet! Please ask the developer if you'd like to see this added!", - ); - try { - await checkServerId(req.cairoId, serverSpec); - const serverEntry = await modifyServerEntry(serverSpec); - await modifyServerResources(serverEntry); - res.sendStatus(200); - } catch (e) { - sendError(res)(e); - } -} diff --git a/lib/controllers/s3-controller.js b/lib/controllers/s3-controller.js deleted file mode 100644 index 43c6f7d..0000000 --- a/lib/controllers/s3-controller.js +++ /dev/null @@ -1,84 +0,0 @@ -import { S3, GetObjectCommand } from "@aws-sdk/client-s3"; -import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; -import { basename } from "node:path"; -import { getServerEntry } from "../database/queries/server-queries.js"; -import { ERR } from "../util/logging.js"; -import { checkAuthorization } from "../database/queries/server-queries.js"; -const s3Region = "us-east-1"; - -async function getS3BackupData(serverId) { - const serverEntry = await getServerEntry(serverId); - if (!serverEntry?.backupHost) return undefined; - const s3Config = { - credentials: { - accessKeyId: serverEntry.backupId, - secretAccessKey: serverEntry.backupKey, - }, - endpoint: `https://${serverEntry.backupHost}`, - forcePathStyle: true, - region: s3Region, - }; - const pathParts = serverEntry.backupPath.split("/"); - if (pathParts[0] === "") pathParts.shift(); - const bucket = pathParts.shift(); - const backupPrefix = pathParts.join("/"); - return { s3Config, bucket, backupPrefix }; -} - -export async function listS3Backups(req, res) { - const serverSpec = req.body; - if (!serverSpec.id) return res.status(400).send("Server id missing!"); - const authorized = await checkAuthorization(serverSpec.id, req.cairoId); - if (!authorized) - return res - .status(403) - .send("You do not have permission to access that server!"); - const s3Data = await getS3BackupData(serverSpec.id); - if (!s3Data) return res.status(409).send("Backup not configured!"); - const { s3Config, bucket, backupPrefix } = s3Data; - const s3Client = new S3(s3Config); - try { - const listResponse = await s3Client.listObjectsV2({ - Bucket: bucket, - Prefix: backupPrefix, - }); - const files = - listResponse.Contents?.map((f) => ({ - name: basename(f.Key), - lastModified: f.LastModified, - path: f.Key, - size: f.Size, - })) ?? []; - res.json(files); - } catch (e) { - ERR("S3", e); - res.sendStatus(500); - } -} - -export async function getS3BackupUrl(req, res) { - const serverSpec = req.body; - if (!serverSpec.id) return res.status(400).send("Server id missing!"); - if (!serverSpec.backupPath) - return res.status(400).send("Backup path missing!"); - const authorized = await checkAuthorization(serverSpec.id, req.cairoId); - if (!authorized) - return res - .status(403) - .send("You do not have permission to access that server!"); - const s3Data = await getS3BackupData(serverSpec.id); - if (!s3Data) return res.status(409).send("Backup not configured!"); - const { s3Config, bucket } = s3Data; - const s3Client = new S3(s3Config); - try { - const command = new GetObjectCommand({ - Bucket: bucket, - Key: serverSpec.backupPath, - }); - const url = await getSignedUrl(s3Client, command, { expiresIn: 3600 }); - res.json({ url }); - } catch (e) { - ERR("S3", e); - res.sendStatus(500); - } -} diff --git a/lib/controllers/status-controller.js b/lib/controllers/status-controller.js index a36a53b..b2fa8b7 100644 --- a/lib/controllers/status-controller.js +++ b/lib/controllers/status-controller.js @@ -1,18 +1,18 @@ -import { getUserDeployments } from "../k8s/k8s-server-control.js"; -import { getInstances } from "../k8s/server-status.js"; +import { getDeployments } from "../k8s/k8s-server-control.js"; +import { getInstances } from "../k8s/server-control.js"; import { sendError } from "../util/ExpressClientError.js"; export function serverList(req, res) { - getUserDeployments(req.cairoId) + getDeployments() .then((sd) => res.json(sd.map((s) => s.metadata.name.substring(4)))) .catch((e) => { - ERR("STATUS CONTROLLER", e); + ERR("SERVER CONTROL", e); res.status(500).send("Couldn't get server list"); }); } export function serverInstances(req, res) { - getInstances(req.cairoId) + getInstances() .then((i) => res.json(i)) .catch(sendError(res)); } diff --git a/lib/controllers/sub-controllers/console-controller.js b/lib/controllers/sub-controllers/console-controller.js index b272f03..40cf777 100644 --- a/lib/controllers/sub-controllers/console-controller.js +++ b/lib/controllers/sub-controllers/console-controller.js @@ -3,18 +3,17 @@ import k8s from "@kubernetes/client-node"; import { Rcon as RconClient } from "rcon-client"; import stream from "stream"; import { ERR, WARN } from "../../util/logging.js"; -import { getServerEntry } from "../../database/queries/server-queries.js"; -import kc from "../../k8s/k8s-config.js"; -// Kubernetes Configuration +// Kubernetes Configuration +const kc = new k8s.KubeConfig(); +kc.loadFromDefault(); const k8sCore = kc.makeApiClient(k8s.CoreV1Api); const namespace = process.env.MCL_SERVER_NAMESPACE; // Retrieves logs from the minecraft server container export async function webConsoleLogs(socket) { - const { serverId } = socket.mcs; - const server = await getServerEntry(serverId); - const podName = `mcl-${server.mclName}`; + const { serverName } = socket.mcs; + const podName = `mcl-${serverName}`; const containerName = `${podName}-server`; const podResponse = await k8sCore.listNamespacedPod(namespace); const pods = podResponse.body.items.map((vp1) => vp1.metadata.name); @@ -26,13 +25,9 @@ export async function webConsoleLogs(socket) { const log = new k8s.Log(kc); const logStream = new stream.PassThrough(); - var logstreamBuffer = ""; - logStream.on("data", (chunk) => { - const bufferString = Buffer.from(chunk).toString(); - if (!bufferString.includes("\n")) return (logstreamBuffer += bufferString); - const clientChunks = `${logstreamBuffer}${bufferString}`.split("\n"); - for (var c of clientChunks) socket.emit("push", c); - }); + logStream.on("data", (chunk) => + socket.emit("push", Buffer.from(chunk).toString()), + ); log .log(namespace, mcsPods[0], containerName, logStream, { follow: true, @@ -46,15 +41,14 @@ export async function webConsoleLogs(socket) { export async function webConsoleRcon(socket) { if (socket.rconClient) return VERB("RCON", "Socket already connected to RCON"); - const { serverId } = socket.mcs; - const server = await getServerEntry(serverId); - const rconSecret = `mcl-${server.mclName}-rcon-secret`; + const rconSecret = `mcl-${socket.mcs.serverName}-rcon-secret`; const rconRes = await k8sCore.readNamespacedSecret(rconSecret, namespace); const rconPassword = Buffer.from( rconRes.body.data["rcon-password"], "base64", ).toString("utf8"); - const rconHost = `mcl-${server.mclName}-rcon.${namespace}.svc.cluster.local`; + const { serverName } = socket.mcs; + const rconHost = `mcl-${serverName}-rcon.${namespace}.svc.cluster.local`; const rcon = new RconClient({ host: rconHost, port: 25575, @@ -64,7 +58,7 @@ export async function webConsoleRcon(socket) { try { await rcon.connect(); } catch (error) { - socket.emit("rcon-error", "Could not connect RCON Input to server!"); + socket.emit("push", "Could not connect RCON Input to server!"); WARN("RCON", `Could not connect to '${rconHost}'`); } socket.rconClient = rcon; diff --git a/lib/database/migrations/1_create_servers_table.sql b/lib/database/migrations/1_create_servers_table.sql index 6386fc5..5306630 100644 --- a/lib/database/migrations/1_create_servers_table.sql +++ b/lib/database/migrations/1_create_servers_table.sql @@ -1,21 +1,12 @@ CREATE SEQUENCE servers_id_seq; CREATE TABLE servers ( id bigint NOT NULL DEFAULT nextval('servers_id_seq') PRIMARY KEY, - owner_cairo_id varchar(63), - host varchar(255) DEFAULT NULL, name varchar(255) DEFAULT NULL, + host varchar(255) DEFAULT NULL, version varchar(63) DEFAULT 'latest', server_type varchar(63) DEFAULT 'VANILLA', - cpu varchar(63) DEFAULT '500', memory varchar(63) DEFAULT '512', - storage varchar(63) DEFAULT NULL, - backup_enabled BOOLEAN DEFAULT FALSE, - backup_host varchar(255) DEFAULT NULL, - backup_bucket_path varchar(255) DEFAULT NULL, - backup_id varchar(255) DEFAULT NULL, - backup_key varchar(255) DEFAULT NULL, - backup_interval varchar(255) DEFAULT NULL, - extra_ports varchar(7)[] DEFAULT NULL, + CONSTRAINT unique_name UNIQUE(name), CONSTRAINT unique_host UNIQUE(host) ); ALTER SEQUENCE servers_id_seq OWNED BY servers.id; \ No newline at end of file diff --git a/lib/database/postgres.js b/lib/database/postgres.js index 452b53c..eb2a037 100644 --- a/lib/database/postgres.js +++ b/lib/database/postgres.js @@ -11,7 +11,7 @@ const { MCL_POSTGRES_DATABASE: database, MCL_POSTGRES_ENABLED: pgEnabled, MCL_POSTGRES_HOST: host, - MCL_POSTGRES_PASS: password, + MCL_POSTGRES_PASSWORD: password, MCL_POSTGRES_PORT: port, MCL_POSTGRES_USER: user, } = process.env; diff --git a/lib/database/queries/server-queries.js b/lib/database/queries/server-queries.js index 59dea89..d8baa8f 100644 --- a/lib/database/queries/server-queries.js +++ b/lib/database/queries/server-queries.js @@ -1,10 +1,5 @@ import pg from "../postgres.js"; -import { - deleteQuery, - insertQuery, - selectWhereAllQuery, - updateWhereAllQuery, -} from "../pg-query.js"; +import { deleteQuery, insertQuery, selectWhereQuery } from "../pg-query.js"; import ExpressClientError from "../../util/ExpressClientError.js"; const table = "servers"; @@ -12,241 +7,35 @@ const asExpressClientError = (e) => { throw new ExpressClientError({ m: e.message, c: 409 }); }; -const getMclName = (host, id) => - `${host.toLowerCase().replaceAll(".", "-")}-${id}`; - -export async function checkAuthorization(serverId, cairoId) { - console.log( - `Checking Authorization for user ${cairoId} for serverId ${serverId}`, - ); - if (!cairoId) return false; - const q = selectWhereAllQuery(table, { - id: serverId, - owner_cairo_id: cairoId, - }); - return (await pg.query(q)).length === 1; -} - -export async function createServerEntry(cairoId, serverSpec) { - const { - name, - host, - version, - serverType: server_type, - cpu, // TODO: Ignored for now by the K8S manifests - memory, - storage: storage_val, - extraPorts: extra_ports, - backupHost: backup_host, - backupBucket: backup_bucket_path, - backupId: backup_id, - backupKey: backup_key, - backupInterval: backup_interval, - } = serverSpec; - - var q = insertQuery(table, { - name, - owner_cairo_id: cairoId, - host, - version, - server_type, - cpu, // TODO: Ignored for now by the K8S manifests - memory, - storage: !storage_val || storage_val === "0" ? null : storage_val, // 0, undefined, null, or "0" becomes null - extra_ports, - backup_enabled: !!backup_interval ? true : null, // We already verified the payload, so any backup key will work - backup_host, - backup_bucket_path, - backup_id, - backup_key, - backup_interval, - }); - q += "\n RETURNING *"; - try { - const entries = await pg.query(q); - const { - id, - owner_cairo_id: ownerCairoId, - name, - host, - version, - server_type: serverType, - cpu, // TODO: Ignored for now by the K8S manifests - memory, - storage, - extra_ports: extraPorts, - backup_enabled: backupEnabled, - backup_host: backupHost, - backup_bucket_path: backupPath, - backup_id: backupId, - backup_key: backupKey, - backup_interval: backupInterval, - } = entries[0]; - const mclName = getMclName(host, id); - return { - name, - mclName, - id, - ownerCairoId, - host, - version, - serverType, - cpu, // TODO: Ignored for now by the K8S manifests - memory, - storage, - extraPorts, - backupEnabled, - backupHost, - backupPath, - backupId, - backupKey, - backupInterval, - }; - } catch (e) { - asExpressClientError(e); - } -} - -export async function deleteServerEntry(serverId) { - if (!serverId) asExpressClientError({ message: "Server ID Required!" }); - const q = deleteQuery(table, { id: serverId }); +export async function createServerEntry(serverSpec) { + const { name, host, version, serverType: server_type, memory } = serverSpec; + const q = insertQuery(table, { name, host, version, server_type, memory }); return pg.query(q).catch(asExpressClientError); } -export async function getServerEntry(serverId) { - if (!serverId) asExpressClientError({ message: "Server ID Required!" }); - const q = selectWhereAllQuery(table, { id: serverId }); +export async function deleteServerEntry(serverName) { + if (!serverName) asExpressClientError({ message: "Server Name Required!" }); + const q = deleteQuery(table, { name: serverName }); + return pg.query(q).catch(asExpressClientError); +} + +export async function getServerEntry(serverName) { + if (!serverName) asExpressClientError({ message: "Server Name Required!" }); + const q = selectWhereQuery(table, { name: serverName }); try { const serverSpecs = await pg.query(q); if (serverSpecs.length === 0) return []; if (!serverSpecs.length === 1) throw Error("Multiple servers found with the same name!"); const { - id, - owner_cairo_id: ownerCairoId, name, host, version, server_type: serverType, - cpu, // TODO: Ignored for now by the K8S manifests memory, - storage, - extra_ports: extraPorts, - backup_enabled: backupEnabled, - backup_host: backupHost, - backup_bucket_path: backupPath, - backup_id: backupId, - backup_key: backupKey, - backup_interval: backupInterval, } = serverSpecs[0]; - const mclName = getMclName(host, id); - return { - name, - mclName, - id, - ownerCairoId, - host, - version, - serverType, - cpu, // TODO: Ignored for now by the K8S manifests - memory, - storage, - extraPorts, - backupEnabled, - backupHost, - backupPath, - backupId, - backupKey, - backupInterval, - }; + return { name, host, version, serverType, memory }; } catch (e) { asExpressClientError(e); } } - -export async function modifyServerEntry(serverSpec) { - const { - id, - // ownerCairoId: owner_cairo_id, // DIsabled! If these becomes a reqest, please create a new function! - name, - // host, // TODO: Can only be updated if service name is generic and non descriptive - version, - serverType: server_type, - cpu, // TODO: Ignored for now by the K8S manifests - memory, - // storage, // DO NOT INCLUDE THIS KEY, Not all storage providers in kubernetes allow for dynamically resizable PVCs - extraPorts: extra_ports, - backupEnabled: backup_enabled, - backupHost: backup_host, - backupBucket: backup_bucket_path, - backupId: backup_id, - backupKey: backup_key, - backupInterval: backup_interval, - } = serverSpec; - - const q = - updateWhereAllQuery( - table, - { - name, - // host, // TODO: Can only be updated if service name is generic and non descriptive - version, - server_type, - cpu, // TODO: Ignored for now by the K8S manifests - memory, - // storage, // DO NOT INCLUDE THIS KEY, Not all storage providers in kubernetes allow for dynamically resizable PVCs - extra_ports, - backup_enabled, - backup_host, - backup_bucket_path, - backup_id, - backup_key, - backup_interval, - }, - { id }, - ) + ` RETURNING *;`; - try { - const entries = await pg.query(q); - const { - name, - host, // Should always read the database value - server_type: serverType, - storage, - extra_ports: extraPorts, - backup_enabled: backupEnabled, - backup_host: backupHost, - backup_bucket_path: backupPath, - backup_id: backupId, - backup_key: backupKey, - backup_interval: backupInterval, - } = entries[0]; - - const mclName = getMclName(host, id); - - return { - name, // Could change - mclName, // Shouldn't change - id, // Won't change - host, // TODO: Can only be updated if service name is generic and non descriptive, this returns the host from the database - version, - serverType, - cpu, // TODO: Ignored for now by the K8S manifests - memory, - storage, - extraPorts, - backupEnabled, - backupHost, - backupPath, - backupId, - backupKey, - backupInterval, - }; - } catch (e) { - asExpressClientError(e); - } -} - -export async function getServerEntries() { - const q = `SELECT * FROM ${table}`; - return pg.query(q); -} diff --git a/lib/k8s/configs/backup-secret.yml b/lib/k8s/configs/backup-secret.yml deleted file mode 100644 index eae59e3..0000000 --- a/lib/k8s/configs/backup-secret.yml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - annotations: - minecluster.dunemask.net/id: changeme-server-id - labels: - app: changeme-app-label - name: changeme-backup-secret -type: Opaque -data: - rclone.conf: "" diff --git a/lib/k8s/configs/containers/ftp-server.yml b/lib/k8s/configs/containers/ftp-server.yml index 3544592..759bc20 100644 --- a/lib/k8s/configs/containers/ftp-server.yml +++ b/lib/k8s/configs/containers/ftp-server.yml @@ -6,21 +6,23 @@ env: image: garethflowers/ftp-server imagePullPolicy: IfNotPresent livenessProbe: - exec: { command: ["/bin/sh", "-c", "netstat -a | grep -q ftp"] } - failureThreshold: 20 - initialDelaySeconds: 0 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 1 +exec: + command: ["echo"] +failureThreshold: 20 +initialDelaySeconds: 30 +periodSeconds: 5 +successThreshold: 1 +timeoutSeconds: 1 name: changeme-name-ftp ports: [] # Programatically add all the ports for easier readability, Ports include: 20,21,40000-400009 readinessProbe: - exec: { command: ["/bin/sh", "-c", "netstat -a | grep -q ftp"] } - failureThreshold: 20 - initialDelaySeconds: 0 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 1 + exec: + command: ["echo"] + failureThreshold: 20 + initialDelaySeconds: 30 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 1 resources: requests: cpu: 50m diff --git a/lib/k8s/configs/containers/minecraft-backup.yml b/lib/k8s/configs/containers/minecraft-backup.yml index 3caeae8..074025a 100644 --- a/lib/k8s/configs/containers/minecraft-backup.yml +++ b/lib/k8s/configs/containers/minecraft-backup.yml @@ -33,20 +33,20 @@ env: - name: DEST_DIR value: /backups - name: LINK_LATEST - value: "true" + value: "false" - name: TAR_COMPRESS_METHOD value: gzip - name: ZSTD_PARAMETERS value: -3 --long=25 --single-thread - name: RCLONE_REMOTE - value: mcl-backup-changeme + value: mc-dunemask-net - name: RCLONE_DEST_DIR - value: /mcl/backups/changeme + value: /minecraft-backups/deltasmp-backups - name: RCLONE_COMPRESS_METHOD value: gzip image: itzg/mc-backup:latest imagePullPolicy: IfNotPresent -name: mcl-backup-changeme +name: mcs-deltasmp-minecraft-mc-backup resources: requests: cpu: 500m diff --git a/lib/k8s/configs/containers/minecraft-server.yml b/lib/k8s/configs/containers/minecraft-server.yml index 56e9b1b..4034e36 100644 --- a/lib/k8s/configs/containers/minecraft-server.yml +++ b/lib/k8s/configs/containers/minecraft-server.yml @@ -72,10 +72,12 @@ env: image: itzg/minecraft-server:latest imagePullPolicy: IfNotPresent livenessProbe: - exec: { command: [mc-health] } - failureThreshold: 200 + exec: + command: + - mc-health + failureThreshold: 20 initialDelaySeconds: 30 - periodSeconds: 3 + periodSeconds: 5 successThreshold: 1 timeoutSeconds: 1 name: changeme-name-server @@ -86,13 +88,15 @@ ports: - containerPort: 25575 name: rcon protocol: TCP -# readinessProbe: # Disabling this allows for users to manipulate files even if the container is starting -# exec: {command: [mc-health]} -# failureThreshold: 200 -# initialDelaySeconds: 30 -# periodSeconds: 3 -# successThreshold: 1 -# timeoutSeconds: 1 +readinessProbe: + exec: + command: + - mc-health + failureThreshold: 20 + initialDelaySeconds: 30 + periodSeconds: 5 + successThreshold: 1 + timeoutSeconds: 1 resources: requests: cpu: 500m diff --git a/lib/k8s/configs/extra-svc.yml b/lib/k8s/configs/extra-svc.yml deleted file mode 100644 index dee717f..0000000 --- a/lib/k8s/configs/extra-svc.yml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - annotations: - minecluster.dunemask.net/id: changeme-server-id - labels: - app: changeme-app - name: changeme-extra - namespace: changeme-namespace -spec: - internalTrafficPolicy: Cluster - ipFamilies: - - IPv4 - ipFamilyPolicy: SingleStack - # ports: Programatically generated - # - name: port-name - # port: 1234 - # protocol: TCP - # targetPort: port-name - selector: - app: changeme-app - sessionAffinity: None - type: LoadBalancer diff --git a/lib/k8s/configs/rcon-secret.yml b/lib/k8s/configs/rcon-secret.yml index a90c319..ff52e1a 100644 --- a/lib/k8s/configs/rcon-secret.yml +++ b/lib/k8s/configs/rcon-secret.yml @@ -4,7 +4,7 @@ data: kind: Secret metadata: annotations: - minecluster.dunemask.net/id: changeme-server-id + minecluster.dunemask.net/server-name: changeme-server-name labels: app: changeme-app-label name: changeme-rcon-secret diff --git a/lib/k8s/configs/rcon-svc.yml b/lib/k8s/configs/rcon-svc.yml index 49a7089..9a68813 100644 --- a/lib/k8s/configs/rcon-svc.yml +++ b/lib/k8s/configs/rcon-svc.yml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Service metadata: annotations: - minecluster.dunemask.net/id: changeme-server-id + minecluster.dunemask.net/server-name: changeme-server-name labels: app: changeme-app name: changeme-rcon diff --git a/lib/k8s/configs/server-deployment.yml b/lib/k8s/configs/server-deployment.yml index 0acd0cf..0d5d335 100644 --- a/lib/k8s/configs/server-deployment.yml +++ b/lib/k8s/configs/server-deployment.yml @@ -2,7 +2,7 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - minecluster.dunemask.net/id: changeme-server-id + minecluster.dunemask.net/server-name: changeme-server-name name: changeme-name namespace: changeme-namespace spec: @@ -17,7 +17,7 @@ spec: template: metadata: annotations: - minecluster.dunemask.net/id: changeme-server-id + minecluster.dunemask.net/server-name: changeme-server-name labels: app: changeme-app spec: @@ -30,17 +30,15 @@ spec: # runAsUser: 1000 terminationGracePeriodSeconds: 30 volumes: - - emptyDir: {} - name: datadir + - name: datadir + persistentVolumeClaim: + claimName: changeme-pvc-name - emptyDir: {} name: backupdir - # - name: datadir - # persistentVolumeClaim: - # claimName: changeme-pvc-name - # - name: rclone-config - # secret: - # defaultMode: 420 - # items: - # - key: rclone.conf - # path: rclone.conf - # secretName: rclone-config + - name: rclone-config + secret: + defaultMode: 420 + items: + - key: rclone.conf + path: rclone.conf + secretName: rclone-config diff --git a/lib/k8s/configs/server-pvc.yml b/lib/k8s/configs/server-pvc.yml index bf21ea4..f502e8a 100644 --- a/lib/k8s/configs/server-pvc.yml +++ b/lib/k8s/configs/server-pvc.yml @@ -2,7 +2,7 @@ apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: - minecluster.dunemask.net/id: changeme-server-id + minecluster.dunemask.net/server-name: changeme-server-name labels: service: changeme-service-name name: changeme-pvc-name diff --git a/lib/k8s/configs/server-svc.yml b/lib/k8s/configs/server-svc.yml index a6f520e..c7e7fa2 100644 --- a/lib/k8s/configs/server-svc.yml +++ b/lib/k8s/configs/server-svc.yml @@ -4,13 +4,15 @@ metadata: annotations: ingress.qumine.io/hostname: changeme-url ingress.qumine.io/portname: minecraft - minecluster.dunemask.net/id: changeme-server-id + minecluster.dunemask.net/server-name: changeme-server-name labels: app: changeme-app name: changeme-name namespace: changeme-namespace spec: internalTrafficPolicy: Cluster + ipFamilies: + - IPv4 ipFamilyPolicy: SingleStack ports: # Programatically add all FTP ports. Port range includes 20, 21, 40000-40001 - name: minecraft diff --git a/lib/k8s/k8s-config.js b/lib/k8s/k8s-config.js deleted file mode 100644 index cbe55b6..0000000 --- a/lib/k8s/k8s-config.js +++ /dev/null @@ -1,14 +0,0 @@ -import k8s from "@kubernetes/client-node"; -const MCL_KUBECONFIG = process.env.MCL_KUBECONFIG; -const envConfig = MCL_KUBECONFIG ? MCL_KUBECONFIG : null; -const kc = new k8s.KubeConfig(); -try { - if (!!envConfig) - kc.loadFromString(Buffer.from(envConfig, "base64").toString("utf8")); - else kc.loadFromDefault(); -} catch (e) { - kc.loadFromDefault(); -} -if(kc.contexts.length === 1) kc.setCurrentContext(kc.contexts[0].name); -if(!kc.currentContext) throw new Error("Could not infer current context! Please set it manually in the Kubeconfig!"); -export default kc; diff --git a/lib/k8s/k8s-server-control.js b/lib/k8s/k8s-server-control.js index c708328..4e5233d 100644 --- a/lib/k8s/k8s-server-control.js +++ b/lib/k8s/k8s-server-control.js @@ -7,8 +7,8 @@ import { getCoreServerContainer, getBackupContainer, } from "./server-containers.js"; -import { checkAuthorization } from "../database/queries/server-queries.js"; -import kc from "./k8s-config.js"; +const kc = new k8s.KubeConfig(); +kc.loadFromDefault(); const k8sDeps = kc.makeApiClient(k8s.AppsV1Api); const k8sCore = kc.makeApiClient(k8s.CoreV1Api); @@ -20,24 +20,10 @@ const loadYaml = (f) => yaml.load(fs.readFileSync(path.resolve(f), "utf8")); const mineclusterManaged = (o) => o.metadata && o.metadata.annotations && - o.metadata.annotations["minecluster.dunemask.net/id"] !== undefined; + o.metadata.annotations["minecluster.dunemask.net/server-name"] !== undefined; -export const serverMatch = (serverId) => (o) => - o.metadata.annotations["minecluster.dunemask.net/id"] === serverId; - -export const cairoMatch = (cairoId) => (o) => - checkAuthorization( - o.metadata.annotations["minecluster.dunemask.net/id"], - cairoId, - ); - -export async function getUserDeployments(cairoId) { - const authFIlter = cairoMatch(cairoId); - const allDeployments = await getDeployments(); - const authChecks = allDeployments.map(authFIlter); - const authorizations = await Promise.all(authChecks); - return allDeployments.filter((_d, i) => authorizations[i]); -} +export const serverMatch = (serverName) => (o) => + o.metadata.annotations["minecluster.dunemask.net/server-name"] === serverName; export async function getDeployments() { const deploymentRes = await k8sDeps.listNamespacedDeployment(namespace); @@ -64,8 +50,8 @@ export async function getVolumes() { return serverVolumes; } -export function getServerAssets(serverId) { - const serverFilter = serverMatch(serverId); +export function getServerAssets(serverName) { + const serverFilter = serverMatch(serverName); return Promise.all([ getDeployments(), getServices(), @@ -80,19 +66,17 @@ export function getServerAssets(serverId) { if (deployments.length > 1) throw Error("Deployment filter broken!"); if (volumes.length > 1) throw Error("Volume filter broken!"); - if (secrets.length > 2) throw Error("Secrets broken!"); + if (secrets.length > 1) throw Error("Secrets broken!"); const serverAssets = { deployment: deployments[0], - service: services.find((s) => s.metadata.name.endsWith("-server")), + service: services.find( + (s) => s.metadata.name === `mcl-${serverName}-server`, + ), volume: volumes[0], - rconService: services.find((s) => s.metadata.name.endsWith("-rcon")), - rconSecret: secrets.find((s) => - s.metadata.name.endsWith("-rcon-secret"), + rconService: services.find( + (s) => s.metadata.name === `mcl-${serverName}-rcon`, ), - backupSecret: secrets.find((s) => - s.metadata.name.endsWith("-backup-secret"), - ), - extraService: services.find((s) => s.metadata.name.endsWith("-extra")), + rconSecret: secrets[0], }; for (var k in serverAssets) if (serverAssets[k]) return serverAssets; // If no assets exist, return nothing @@ -100,51 +84,59 @@ export function getServerAssets(serverId) { .catch((e) => ERR("SERVER ASSETS", e)); } -export async function getDeployment(serverId) { +export async function getDeployment(serverName) { const servers = await getDeployments(); const serverDeployment = servers.find( - (s) => s.metadata.annotations["minecluster.dunemask.net/id"] === serverId, + (s) => + s.metadata.annotations["minecluster.dunemask.net/server-name"] === + serverName, ); if (!serverDeployment) - throw Error(`MCL Deployment with ID '${serverId}' could not be found!`); + throw Error(`MCL Deployment '${serverName}' could not be found!`); return serverDeployment; } -export async function getContainers(serverId) { - const deployment = await getDeployment(serverId); +export async function getContainers(serverName) { + const deployment = await getDeployment(serverName); return deployment.spec.template.spec.containers; } -async function containerControl(serverSpec, deployment, scaleUp) { +async function containerControl(serverName, deployment, scaleUp) { const { containers } = deployment.spec.template.spec; const depFtp = containers.find((c) => c.name.endsWith("-ftp")); const depServer = containers.find((c) => c.name.endsWith("-server")); const depBackup = containers.find((c) => c.name.endsWith("-backup")); + const serverSpec = await getServerEntry(serverName); const ftpContainer = depFtp ?? getFtpContainer(serverSpec); const serverContainer = depServer ?? getCoreServerContainer(serverSpec); const backupContainer = depBackup ?? getBackupContainer(serverSpec); - if (scaleUp && serverSpec.backupEnabled) - return [ftpContainer, serverContainer, backupContainer]; - else if (scaleUp) return [ftpContainer, serverContainer]; + if (scaleUp) return [ftpContainer, serverContainer]; return [ftpContainer]; } -export function terminationControl(containers) { - return containers.length > 1 ? 30 /*seconds*/ : 1 /*seconds */; +export async function toggleServer(serverName, scaleUp = false) { + const deployment = await getDeployment(serverName); + deployment.spec.template.spec.containers = await containerControl( + serverName, + deployment, + scaleUp, + ); + return k8sDeps.replaceNamespacedDeployment( + deployment.metadata.name, + namespace, + deployment, + ); } -export async function toggleServer(serverId, scaleUp = false) { - const [deployment, serverSpec] = await Promise.all([ - getDeployment(serverId), - getServerEntry(serverId), - ]); - const containers = await containerControl(serverSpec, deployment, scaleUp); - const ts = terminationControl(containers); - - // Speed up container termination if not running a server - deployment.spec.template.spec.terminationGracePeriodSeconds = ts; - deployment.spec.template.spec.containers = containers; +export async function scaleDeployment(serverName, scaleUp = false) { + const deployment = await getDeployment(serverName); + if (deployment.spec.replicas === 1 && scaleUp) + return VERB( + "KSC", + `MCL Deployment '${serverName}' is already scaled! Ignoring scale adjustment.`, + ); + deployment.spec.replicas = scaleUp ? 1 : 0; return k8sDeps.replaceNamespacedDeployment( deployment.metadata.name, diff --git a/lib/k8s/server-containers.js b/lib/k8s/server-containers.js index a969c69..4694828 100644 --- a/lib/k8s/server-containers.js +++ b/lib/k8s/server-containers.js @@ -4,9 +4,9 @@ import yaml from "js-yaml"; const loadYaml = (f) => yaml.load(fs.readFileSync(path.resolve(f), "utf8")); export function getFtpContainer(serverSpec) { - const { mclName, storage } = serverSpec; + const { name } = serverSpec; const ftpContainer = loadYaml("lib/k8s/configs/containers/ftp-server.yml"); - ftpContainer.name = `mcl-${mclName}-ftp`; + ftpContainer.name = `mcl-${name}-ftp`; const ftpPortList = [ { p: 20, n: "ftp-data" }, { p: 21, n: "ftp-commands" }, @@ -18,15 +18,14 @@ export function getFtpContainer(serverSpec) { name, protocol: "TCP", })); - if (!storage) delete ftpContainer.volumeMounts; return ftpContainer; } export function getCoreServerContainer(serverSpec) { - const { mclName, version, serverType, memory, storage } = serverSpec; + const { name, version, serverType, memory } = serverSpec; const container = loadYaml("lib/k8s/configs/containers/minecraft-server.yml"); // Container Updates - container.name = `mcl-${mclName}-server`; + container.name = `mcl-${name}-server`; container.resources.requests.memory = `${memory}Mi`; const findEnv = (k) => container.env.find(({ name: n }) => n === k); @@ -37,54 +36,32 @@ export function getCoreServerContainer(serverSpec) { updateEnv("VERSION", version); updateEnv("MEMORY", `${memory}M`); // RCON - const rs = `mcl-${mclName}-rcon-secret`; + const rs = `mcl-${name}-rcon-secret`; findEnv("RCON_PASSWORD").valueFrom.secretKeyRef.name = rs; - if (!storage) delete container.volumeMounts; return container; } export function getServerContainer(serverSpec) { - const { - difficulty, - gamemode, - motd, - maxPlayers, - seed, - ops, - whitelist, - storage, - } = serverSpec; + const { difficulty, gamemode, motd, maxPlayers, seed, ops, whitelist } = + serverSpec; const container = getCoreServerContainer(serverSpec); const findEnv = (k) => container.env.find(({ name: n }) => n === k); const updateEnv = (k, v) => (findEnv(k).value = v); // Enviornment variables - /*updateEnv("DIFFICULTY", difficulty); + updateEnv("DIFFICULTY", difficulty); updateEnv("MODE", gamemode); updateEnv("MOTD", motd); updateEnv("MAX_PLAYERS", maxPlayers); updateEnv("SEED", seed); updateEnv("OPS", ops); - updateEnv("WHITELIST", whitelist); */ - if (!storage) delete container.volumeMounts; + updateEnv("WHITELIST", whitelist); return container; } export function getBackupContainer(serverSpec) { - const { mclName, backupEnabled, backupPath, storage } = serverSpec; const container = loadYaml("lib/k8s/configs/containers/minecraft-backup.yml"); - if (!backupEnabled) return; - const findEnv = (k) => container.env.find(({ name: n }) => n === k); - const updateEnv = (k, v) => (findEnv(k).value = v); - updateEnv("RCLONE_REMOTE", `${mclName}-backup`); - updateEnv("RCLONE_DEST_DIR", backupPath); - container.name = `mcl-${mclName}-backup`; - // RCON - const rs = `mcl-${mclName}-rcon-secret`; - findEnv("RCON_PASSWORD").valueFrom.secretKeyRef.name = rs; - if (!storage) delete container.volumeMounts; - return container; } diff --git a/lib/k8s/server-control.js b/lib/k8s/server-control.js new file mode 100644 index 0000000..63097e6 --- /dev/null +++ b/lib/k8s/server-control.js @@ -0,0 +1,86 @@ +import k8s from "@kubernetes/client-node"; +import { + getDeployment, + getDeployments, + getServerAssets, + scaleDeployment, +} from "./k8s-server-control.js"; +import { ERR } from "../util/logging.js"; +import ExpressClientError from "../util/ExpressClientError.js"; +const kc = new k8s.KubeConfig(); +kc.loadFromDefault(); + +const k8sMetrics = new k8s.Metrics(kc); +const k8sDeps = kc.makeApiClient(k8s.AppsV1Api); +const namespace = process.env.MCL_SERVER_NAMESPACE; + +export async function startServerContainer(serverSpec) { + const { name } = serverSpec; + try { + await scaleDeployment(name, true); + } catch (e) { + ERR("SERVER CONTROL", e); + throw new ExpressClientError({ + c: 500, + m: `Error updating server '${name}'!\n`, + }); + } +} + +export async function stopServerContainer(serverSpec) { + const { name } = serverSpec; + try { + await scaleDeployment(name, false); + } catch (e) { + ERR("SERVER CONTROL", e); + throw new ExpressClientError({ + c: 500, + m: `Error updating server '${name}'!`, + }); + } +} + +export async function getInstances() { + const serverDeployments = await getDeployments(); + const podMetricsResponse = await k8sMetrics.getPodMetrics(namespace); + var name, metrics, started; + const serverInstances = serverDeployments.map((s) => { + name = s.metadata.annotations["minecluster.dunemask.net/server-name"]; + metrics = null; + started = !!s.spec.template.spec.containers.find((c) => + c.name.includes(`mcl-${name}-server`), + ); + const pod = podMetricsResponse.items.find(({ metadata: md }) => { + return md.labels && md.labels.app && md.labels.app === `mcl-${name}-app`; + }); + if (started && pod) { + const podCpus = pod.containers.map( + ({ usage }) => parseInt(usage.cpu) / 1_000_000, + ); + const podMems = pod.containers.map( + ({ usage }) => parseInt(usage.memory) / 1024, + ); + metrics = { + cpu: Math.ceil(podCpus.reduce((a, b) => a + b)), + memory: Math.ceil(podMems.reduce((a, b) => a + b)), + }; + } + return { name, metrics, started }; + }); + return serverInstances; +} + +export async function getNamespaceMetrics() { + const serverInstances = await getInstances(); + var clusterMetrics = { cpu: 0, memory: 0 }; + if (servers.length > 1) { + const clusterCpu = serverInstances + .map(({ metrics }) => (metrics ? metrics.cpu : 0)) + .reduce((a, b) => a + b); + const clusterMem = serverInstances + .map(({ metrics }) => (metrics ? metrics.memory : 0)) + .reduce((a, b) => a + b); + clusterMetrics = { cpu: clusterCpu, memory: clusterMem }; + } + return clusterMetrics; +} diff --git a/lib/k8s/server-create.js b/lib/k8s/server-create.js index 7d09e61..8ef2fe3 100644 --- a/lib/k8s/server-create.js +++ b/lib/k8s/server-create.js @@ -4,102 +4,48 @@ import k8s from "@kubernetes/client-node"; import yaml from "js-yaml"; import fs from "node:fs"; import path from "node:path"; - +import ExpressClientError from "../util/ExpressClientError.js"; import { getFtpContainer, getServerContainer, getBackupContainer, } from "./server-containers.js"; -import kc from "./k8s-config.js"; +const kc = new k8s.KubeConfig(); +kc.loadFromDefault(); const k8sDeps = kc.makeApiClient(k8s.AppsV1Api); const k8sCore = kc.makeApiClient(k8s.CoreV1Api); const namespace = process.env.MCL_SERVER_NAMESPACE; const loadYaml = (f) => yaml.load(fs.readFileSync(path.resolve(f), "utf8")); -export function createExtraService(serverSpec) { - const { mclName, id, extraPorts } = serverSpec; - if (!extraPorts) return; - const serviceYaml = loadYaml("lib/k8s/configs/extra-svc.yml"); - serviceYaml.metadata.labels.app = `mcl-${mclName}-app`; - serviceYaml.metadata.name = `mcl-${mclName}-extra`; - serviceYaml.metadata.namespace = namespace; - serviceYaml.metadata.annotations["minecluster.dunemask.net/id"] = id; - serviceYaml.spec.selector.app = `mcl-${mclName}-app`; - // Port List: - const portList = extraPorts.map((p) => ({ - port: parseInt(p), - name: `mcl-extra-${p}`, - })); - const tcpPorts = portList.map(({ port, name }) => ({ - port, - name: `${name}-tcp`, - protocol: "TCP", - targetPort: port, - })); - const udpPorts = portList.map(({ port, name }) => ({ - port, - name: `${name}-udp`, - protocol: "UDP", - targetPort: port, - })); - - serviceYaml.spec.ports = [...tcpPorts, ...udpPorts]; - return serviceYaml; -} - -export function createBackupSecret(serverSpec) { - if (!serverSpec.backupEnabled) return; // If backup not defined, don't create RCLONE secret - const { mclName, id, backupId, backupKey, backupHost } = serverSpec; - const backupYaml = loadYaml("lib/k8s/configs/backup-secret.yml"); - backupYaml.metadata.labels.app = `mcl-${mclName}-app`; - backupYaml.metadata.name = `mcl-${mclName}-backup-secret`; - backupYaml.metadata.namespace = namespace; - backupYaml.metadata.annotations["minecluster.dunemask.net/id"] = id; - const rcloneConfig = [ - `[${mclName}-backup]`, - "type = s3", - "provider = Minio", - "env_auth = false", - `access_key_id = ${backupId}`, - `secret_access_key = ${backupKey}`, - `endpoint = ${backupHost}`, - `acl = private`, - `no_check_bucket = true`, - `no_check_container = true`, - ].join("\n"); - backupYaml.data["rclone.conf"] = Buffer.from(rcloneConfig).toString("base64"); - return backupYaml; -} - function createRconSecret(serverSpec) { - const { mclName, id } = serverSpec; + const { name } = serverSpec; const rconYaml = loadYaml("lib/k8s/configs/rcon-secret.yml"); // TODO: Dyamic rconPassword const rconPassword = bcrypt.hashSync(uuidv4(), 10); rconYaml.data["rcon-password"] = Buffer.from(rconPassword).toString("base64"); - rconYaml.metadata.labels.app = `mcl-${mclName}-app`; - rconYaml.metadata.name = `mcl-${mclName}-rcon-secret`; + rconYaml.metadata.labels.app = `mcl-${name}-app`; + rconYaml.metadata.name = `mcl-${name}-rcon-secret`; rconYaml.metadata.namespace = namespace; - rconYaml.metadata.annotations["minecluster.dunemask.net/id"] = id; + rconYaml.metadata.annotations["minecluster.dunemask.net/server-name"] = name; return rconYaml; } function createServerVolume(serverSpec) { - const { mclName, id, storage } = serverSpec; - if (!storage) return; + const { name } = serverSpec; const volumeYaml = loadYaml("lib/k8s/configs/server-pvc.yml"); - volumeYaml.metadata.labels.service = `mcl-${mclName}-server`; - volumeYaml.metadata.name = `mcl-${mclName}-volume`; + volumeYaml.metadata.labels.service = `mcl-${name}-server`; + volumeYaml.metadata.name = `mcl-${name}-volume`; volumeYaml.metadata.namespace = namespace; - volumeYaml.metadata.annotations["minecluster.dunemask.net/id"] = id; - volumeYaml.spec.resources.requests.storage = `${storage}Gi`; + volumeYaml.metadata.annotations["minecluster.dunemask.net/server-name"] = + name; + volumeYaml.spec.resources.requests.storage = "1Gi"; // TODO: Changeme return volumeYaml; } function createServerDeploy(serverSpec) { - const { mclName, id, backupEnabled, storage } = serverSpec; + const { name, host } = serverSpec; const deployYaml = loadYaml("lib/k8s/configs/server-deployment.yml"); const { metadata } = deployYaml; const serverContainer = getServerContainer(serverSpec); @@ -107,63 +53,39 @@ function createServerDeploy(serverSpec) { const ftpContainer = getFtpContainer(serverSpec); // Configure Metadata; - metadata.name = `mcl-${mclName}`; + metadata.name = `mcl-${name}`; metadata.namespace = namespace; - metadata.annotations["minecluster.dunemask.net/id"] = id; + metadata.annotations["minecluster.dunemask.net/server-name"] = name; deployYaml.metadata = metadata; - deployYaml.spec.template.spec.terminationGracePeriodSeconds = 1; - // Configure Lables & Selectors - deployYaml.spec.selector.matchLabels.app = `mcl-${mclName}-app`; - deployYaml.spec.template.metadata.labels.app = `mcl-${mclName}-app`; - deployYaml.spec.template.metadata.annotations["minecluster.dunemask.net/id"] = - id; + deployYaml.spec.selector.matchLabels.app = `mcl-${name}-app`; + deployYaml.spec.template.metadata.labels.app = `mcl-${name}-app`; // Volumes - if (!!storage) { - const dvi = deployYaml.spec.template.spec.volumes.findIndex( - ({ name }) => name === "datadir", - ); - delete deployYaml.spec.template.spec.volumes[dvi].emptyDir; - deployYaml.spec.template.spec.volumes[dvi] = { - ...deployYaml.spec.template.spec.volumes[dvi], - persistentVolumeClaim: { - claimName: `mcl-${mclName}-volume`, - }, - }; - } - - // Backups - if (backupEnabled) { - deployYaml.spec.template.spec.volumes.push({ - name: "rclone-config", - secret: { - defaultMode: 420, - items: [{ key: "rclone.conf", path: "rclone.conf" }], - secretName: `mcl-${mclName}-backup-secret`, - }, - }); - } + deployYaml.spec.template.spec.volumes.find( + ({ name }) => name === "datadir", + ).persistentVolumeClaim.claimName = `mcl-${name}-volume`; // Apply Containers TODO: User control for autostart - // deployYaml.spec.template.spec.containers.push(serverContainer); + deployYaml.spec.template.spec.containers.push(serverContainer); deployYaml.spec.template.spec.containers.push(ftpContainer); deployYaml.spec.replicas = 1; return deployYaml; } -export function createServerService(serverSpec) { - const { mclName, host, id } = serverSpec; +function createServerService(serverSpec) { + const { name, host } = serverSpec; const serviceYaml = loadYaml("lib/k8s/configs/server-svc.yml"); serviceYaml.metadata.annotations["ingress.qumine.io/hostname"] = host; serviceYaml.metadata.annotations["mc-router.itzg.me/externalServerName"] = host; - serviceYaml.metadata.labels.app = `mcl-${mclName}-app`; - serviceYaml.metadata.name = `mcl-${mclName}-server`; + serviceYaml.metadata.labels.app = `mcl-${name}-app`; + serviceYaml.metadata.name = `mcl-${name}-server`; serviceYaml.metadata.namespace = namespace; - serviceYaml.metadata.annotations["minecluster.dunemask.net/id"] = id; - serviceYaml.spec.selector.app = `mcl-${mclName}-app`; + serviceYaml.metadata.annotations["minecluster.dunemask.net/server-name"] = + name; + serviceYaml.spec.selector.app = `mcl-${name}-app`; // Port List: const serverPortList = [{ p: 25565, n: "minecraft" }]; @@ -185,45 +107,35 @@ export function createServerService(serverSpec) { return serviceYaml; } -function createRconService(createSpec) { - const { id, mclName } = createSpec; +function createRconService(serverSpec) { + const { name } = serverSpec; const rconSvcYaml = loadYaml("lib/k8s/configs/rcon-svc.yml"); - rconSvcYaml.metadata.labels.app = `mcl-${mclName}-app`; - rconSvcYaml.metadata.name = `mcl-${mclName}-rcon`; + rconSvcYaml.metadata.labels.app = `mcl-${name}-app`; + rconSvcYaml.metadata.name = `mcl-${name}-rcon`; rconSvcYaml.metadata.namespace = namespace; - rconSvcYaml.metadata.annotations["minecluster.dunemask.net/id"] = id; - rconSvcYaml.spec.selector.app = `mcl-${mclName}-app`; + rconSvcYaml.metadata.annotations["minecluster.dunemask.net/server-name"] = + name; + rconSvcYaml.spec.selector.app = `mcl-${name}-app`; return rconSvcYaml; } -export default async function createServerResources(createSpec) { - const backupSecret = createBackupSecret(createSpec); - const rconSecret = createRconSecret(createSpec); - const serverVolume = createServerVolume(createSpec); - const serverDeploy = createServerDeploy(createSpec); - const serverService = createServerService(createSpec); - const rconService = createRconService(createSpec); - const extraService = createExtraService(createSpec); - const serverResources = []; - if (!!serverVolume) - serverResources.push( - k8sCore.createNamespacedPersistentVolumeClaim(namespace, serverVolume), - ); - if (!!extraService) - serverResources.push( - k8sCore.createNamespacedService(namespace, extraService), - ); - if (!!backupSecret) - serverResources.push( - k8sCore.createNamespacedSecret(namespace, backupSecret), - ); - serverResources.push(k8sCore.createNamespacedSecret(namespace, rconSecret)); - serverResources.push( - k8sCore.createNamespacedService(namespace, serverService), - ); - serverResources.push(k8sCore.createNamespacedService(namespace, rconService)); - serverResources.push( - k8sDeps.createNamespacedDeployment(namespace, serverDeploy), - ); - return await Promise.all(serverResources); +export default async function createServerResources(serverSpec) { + const deploymentRes = await k8sDeps.listNamespacedDeployment(namespace); + const deployments = deploymentRes.body.items.map((i) => i.metadata.name); + if (deployments.includes(`mcl-${serverSpec.name}`)) + throw new ExpressClientError({ m: "Server already exists!", c: 409 }); + const pvcRes = await k8sCore.listNamespacedPersistentVolumeClaim(namespace); + const pvcs = pvcRes.body.items.map((i) => i.metadata.name); + if (pvcs.includes(`mcl-${serverSpec.name}-volume`)) + throw new ExpressClientError({ m: "Server PVC already exists!", c: 409 }); + const rconSecret = createRconSecret(serverSpec); + const serverVolume = createServerVolume(serverSpec); + const serverDeploy = createServerDeploy(serverSpec); + const serverService = createServerService(serverSpec); + const rconService = createRconService(serverSpec); + k8sCore.createNamespacedPersistentVolumeClaim(namespace, serverVolume); + k8sCore.createNamespacedSecret(namespace, rconSecret); + k8sCore.createNamespacedService(namespace, serverService); + k8sCore.createNamespacedService(namespace, rconService); + k8sDeps.createNamespacedDeployment(namespace, serverDeploy); } diff --git a/lib/k8s/server-delete.js b/lib/k8s/server-delete.js index c0364a8..e226fbf 100644 --- a/lib/k8s/server-delete.js +++ b/lib/k8s/server-delete.js @@ -2,7 +2,8 @@ import k8s from "@kubernetes/client-node"; import { ERR } from "../util/logging.js"; import { getServerAssets } from "./k8s-server-control.js"; import ExpressClientError from "../util/ExpressClientError.js"; -import kc from "./k8s-config.js"; +const kc = new k8s.KubeConfig(); +kc.loadFromDefault(); const k8sDeps = kc.makeApiClient(k8s.AppsV1Api); const k8sCore = kc.makeApiClient(k8s.CoreV1Api); @@ -21,9 +22,9 @@ function deleteOnExist(o, fn) { } export default async function deleteServerResources(serverSpec) { - const { id } = serverSpec; + const { name } = serverSpec; // Ensure deployment exists - const server = await getServerAssets(id); + const server = await getServerAssets(name); if (!server) throw new ExpressClientError({ c: 404, @@ -46,14 +47,6 @@ export default async function deleteServerResources(serverSpec) { const deleteRconSecret = deleteOnExist(server.rconSecret, (name) => k8sCore.deleteNamespacedSecret(name, namespace), ); - - const deleteBackupSecret = deleteOnExist(server.backupSecret, (name) => - k8sCore.deleteNamespacedSecret(name, namespace), - ); - - const deleteExtraService = deleteOnExist(server.extraService, (name) => - k8sCore.deleteNamespacedService(name, namespace), - ); const deleteVolume = deleteOnExist(server.volume, (name) => k8sCore.deleteNamespacedPersistentVolumeClaim(name, namespace), ); @@ -62,8 +55,6 @@ export default async function deleteServerResources(serverSpec) { deleteService, deleteRconService, deleteRconSecret, - deleteExtraService, - deleteBackupSecret, deleteVolume, ]).catch(deleteError); } diff --git a/lib/k8s/server-files.js b/lib/k8s/server-files.js index 36dcd4a..ec1f7cc 100644 --- a/lib/k8s/server-files.js +++ b/lib/k8s/server-files.js @@ -2,8 +2,7 @@ import ftp from "basic-ftp"; import { ERR } from "../util/logging.js"; import { getServerAssets } from "./k8s-server-control.js"; import ExpressClientError from "../util/ExpressClientError.js"; -import { Readable, Transform } from "node:stream"; -import { dirname, basename } from "node:path"; +import { Readable, Writable, Transform } from "node:stream"; const namespace = process.env.MCL_SERVER_NAMESPACE; @@ -35,8 +34,8 @@ export async function getFtpClient(serverService) { } export async function useServerFtp(serverSpec, fn) { - const { id } = serverSpec; - const server = await getServerAssets(id); + const { name } = serverSpec; + const server = await getServerAssets(name); if (!server) throw new ExpressClientError({ c: 404, @@ -83,27 +82,16 @@ export async function uploadServerItem(serverSpec, file) { const { path } = serverSpec; pathSecurityCheck(path); await useServerFtp(serverSpec, async (c) => { - await c.ensureDir(dirname(path)); - await c.uploadFrom(fileStream, basename(path)); + await c.uploadFrom(fileStream, `${path}/${file.originalname}`); }).catch(handleError); } -export async function getServerItem(serverSpec) { +export async function getServerItem(serverSpec, writableStream) { const { path } = serverSpec; - const ds = new Transform({ transform: (c, _e, cb) => cb(null, c) }); + const ds = new Transform({ transform: (c, e, cb) => cb(null, c) }); pathSecurityCheck(path); const ftpTransfer = useServerFtp(serverSpec, async (c) => { await c.downloadTo(ds, path); }).catch(handleError); return { ds, ftpTransfer }; } - -export async function moveServerItems(serverSpec) { - const { destination, origin, files } = serverSpec; - useServerFtp(serverSpec, async (c) => - Promise.all( - files.map((f) => c.rename(`${origin}/${f}`, `${destination}/${f}`)), - ), - ).catch(handleError); - return files; -} diff --git a/lib/k8s/server-modify.js b/lib/k8s/server-modify.js deleted file mode 100644 index 74a1428..0000000 --- a/lib/k8s/server-modify.js +++ /dev/null @@ -1,59 +0,0 @@ -import k8s from "@kubernetes/client-node"; -import { - createExtraService, - createBackupSecret, - createServerService, -} from "./server-create.js"; -import kc from "./k8s-config.js"; -import { getServerAssets } from "./k8s-server-control.js"; -const k8sCore = kc.makeApiClient(k8s.CoreV1Api); -const namespace = process.env.MCL_SERVER_NAMESPACE; - -export default async function modifyServerResources(modifySpec) { - const { id: serverId } = modifySpec; - const serverAssets = await getServerAssets(serverId); - const serverService = createServerService(modifySpec); - const extraService = createExtraService(modifySpec); - const backupSecret = createBackupSecret(modifySpec); - const serverResources = []; - - if (!!serverService) - // Will Always Exist - serverResources.push( - k8sCore.replaceNamespacedService( - serverAssets.service.metadata.name, - namespace, - serverService, - ), - ); - - if (!!extraService && !!serverAssets.extraService) - // Might not exist - serverResources.push( - k8sCore.replaceNamespacedService( - serverAssets.extraService.metadata.name, - namespace, - extraService, - ), - ); - else if (!!extraService) - serverResources.push( - k8sCore.createNamespacedService(namespace, extraService), - ); - - if (!!backupSecret && !!serverAssets.backupSecret) - // Might not exist - serverResources.push( - k8sCore.replaceNamespacedSecret( - serverAssets.backupSecret.metadata.name, - namespace, - backupSecret, - ), - ); - else if (!!backupSecret) - serverResources.push( - k8sCore.createNamespacedSecret(namespace, backupSecret), - ); - - return await Promise.all(serverResources); -} diff --git a/lib/k8s/server-status.js b/lib/k8s/server-status.js deleted file mode 100644 index 0c421c1..0000000 --- a/lib/k8s/server-status.js +++ /dev/null @@ -1,85 +0,0 @@ -import k8s from "@kubernetes/client-node"; -import { getUserDeployments } from "./k8s-server-control.js"; -import { getServerEntries } from "../database/queries/server-queries.js"; -import kc from "./k8s-config.js"; - -const k8sMetrics = new k8s.Metrics(kc); -const namespace = process.env.MCL_SERVER_NAMESPACE; - -function getServerMetrics(podMetricsRes, serverId, serverAvailable) { - const pod = podMetricsRes.items.find(({ metadata: md }) => { - return ( - md.annotations && - md.annotations["minecluster.dunemask.net/id"] === serverId - ); - }); - if (!serverAvailable || !pod) return null; - const podCpus = pod.containers.map( - ({ usage }) => parseInt(usage.cpu) / 1_000_000, - ); - const podMems = pod.containers.map( - ({ usage }) => parseInt(usage.memory) / 1024, - ); - return { - cpu: Math.ceil(podCpus.reduce((a, b) => a + b)), - memory: Math.ceil(podMems.reduce((a, b) => a + b)), - }; -} - -function getServerStatus(server) { - const { containers } = server.spec.template.spec; - const services = containers.map(({ name }) => name.split("-").pop()); - const serverStatusList = server.status.conditions.map( - ({ type: statusType, status: sts }) => ({ statusType, sts }), - ); - const deploymentAvailable = - serverStatusList.find( - (ss) => ss.statusType === "Available" && ss.sts === "True", - ) !== undefined; - const serverAvailable = services.includes(`server`) && deploymentAvailable; - const ftpAvailable = services.includes("ftp"); // TODO this needs some handling for container creation - return { serverAvailable, ftpAvailable, services, deploymentAvailable }; -} - -export async function getInstances(cairoId) { - const [serverDeployments, podMetricsRes, entries] = await Promise.all([ - getUserDeployments(cairoId), - k8sMetrics.getPodMetrics(namespace), - getServerEntries(), - ]); - - var serverId, metrics; - const serverInstances = serverDeployments.map((s) => { - serverId = s.metadata.annotations["minecluster.dunemask.net/id"]; - const entry = entries.find((e) => e.id === serverId); - const { ftpAvailable, serverAvailable, services, deploymentAvailable } = - getServerStatus(s); - metrics = getServerMetrics(podMetricsRes, serverId, serverAvailable); - return { - name: !!entry ? entry.name : "Unknown", - host: !!entry ? entry.host : "Unkonwn", - id: serverId, - metrics, - services, - serverAvailable, - ftpAvailable, - deploymentAvailable, - }; - }); - return serverInstances; -} - -export async function getNamespaceMetrics() { - const serverInstances = await getInstances(); - var clusterMetrics = { cpu: 0, memory: 0 }; - if (servers.length > 1) { - const clusterCpu = serverInstances - .map(({ metrics }) => (metrics ? metrics.cpu : 0)) - .reduce((a, b) => a + b); - const clusterMem = serverInstances - .map(({ metrics }) => (metrics ? metrics.memory : 0)) - .reduce((a, b) => a + b); - clusterMetrics = { cpu: clusterCpu, memory: clusterMem }; - } - return clusterMetrics; -} diff --git a/lib/routes/auth-route.js b/lib/routes/auth-route.js deleted file mode 100644 index 638e163..0000000 --- a/lib/routes/auth-route.js +++ /dev/null @@ -1,19 +0,0 @@ -import { Router } from "express"; -import cairoAuthMiddleware from "./middlewares/auth-middleware.js"; -const router = Router(); - -const cairoProjectId = process.env.MCL_CAIRO_PROJECT; -if(!cairoProjectId) throw Error("Cairo Project Required!"); - -const ok = (_r, res) => res.sendStatus(200); - -function cairoRedirect(req, res) { - res.redirect( - `${process.env.MCL_CAIRO_URL}/cairo/authenticate?redirectUri=${req.query.redirectUri}&projectId=${cairoProjectId}`, - ); -} - -router.get("/verify", cairoAuthMiddleware, ok); -router.get("/redirect", cairoRedirect); - -export default router; diff --git a/lib/routes/files-route.js b/lib/routes/files-route.js index d82f780..c27c175 100644 --- a/lib/routes/files-route.js +++ b/lib/routes/files-route.js @@ -6,20 +6,16 @@ import { listFiles, uploadItem, getItem, - moveItems, } from "../controllers/file-controller.js"; -import cairoAuthMiddleware from "./middlewares/auth-middleware.js"; - const router = Router(); -router.use([jsonMiddleware(), cairoAuthMiddleware]); +router.use(jsonMiddleware()); const multerMiddleware = multer(); router.post("/list", listFiles); router.post("/folder", createFolder); router.delete("/item", deleteItem); router.post("/item", getItem); -router.post("/move", moveItems); router.post("/upload", multerMiddleware.single("file"), uploadItem); export default router; diff --git a/lib/routes/middlewares/auth-middleware.js b/lib/routes/middlewares/auth-middleware.js deleted file mode 100644 index 5758cb4..0000000 --- a/lib/routes/middlewares/auth-middleware.js +++ /dev/null @@ -1,47 +0,0 @@ -// Imports -import { Router } from "express"; -import bearerTokenMiddleware from "express-bearer-token"; -import { ERR, VERB } from "../../util/logging.js"; - -// Constants -const { MCL_CAIRO_URL, MCL_CAIRO_PROJECT } = process.env; -const cairoAuthMiddleware = Router(); - -const cairoAuthenticate = async (token) => { - const config = { headers: { Authorization: `Bearer ${token}` } }; - return fetch(`${MCL_CAIRO_URL}/api/${MCL_CAIRO_PROJECT}/auth/credentials`, config).then(async (res) => { - if (res.status >= 300) { - const errorMessage = await res - .json() - .then((data) => JSON.stringify(data)) - .catch(() => res.statusText); - throw Error( - `Could not authenticate with user, receieved message: ${errorMessage}`, - ); - } - - return res.json(); - }); -}; - -// Middleware -const cairoAuthHandler = (req, res, next) => { - if (!req.token) return res.status(401).send("Cairo auth required!"); - cairoAuthenticate(req.token) - .then((authData) => { - console.log(authData); - if (!authData?.user?.id) - throw Error(`Cairo didn't return the expected data! ${authData?.user?.id}`); - req.cairoId = authData?.user?.id; - }) - .then(() => next()) - .catch((err) => { - ERR("AUTH", err.response ? err.response.data : err.message); - if (!err.response) return res.status(500).send(`Auth failure ${err}`); - return res.status(err.response.status).send(err.response.data); - }); -}; - -cairoAuthMiddleware.use([bearerTokenMiddleware(), cairoAuthHandler]); - -export default cairoAuthMiddleware; diff --git a/lib/routes/s3-route.js b/lib/routes/s3-route.js deleted file mode 100644 index c97afb0..0000000 --- a/lib/routes/s3-route.js +++ /dev/null @@ -1,11 +0,0 @@ -import { Router, json as jsonMiddleware } from "express"; -import { getS3BackupUrl, listS3Backups } from "../controllers/s3-controller.js"; -import cairoAuthMiddleware from "./middlewares/auth-middleware.js"; - -const router = Router(); -router.use([cairoAuthMiddleware, jsonMiddleware()]); - -router.post("/backups", listS3Backups); -router.post("/backup-url", getS3BackupUrl); - -export default router; diff --git a/lib/routes/server-route.js b/lib/routes/server-route.js index d8ae832..7361abd 100644 --- a/lib/routes/server-route.js +++ b/lib/routes/server-route.js @@ -4,18 +4,13 @@ import { deleteServer, startServer, stopServer, - getServer, - modifyServer, } from "../controllers/lifecycle-controller.js"; import { serverInstances, serverList, } from "../controllers/status-controller.js"; - -import cairoAuthMiddleware from "./middlewares/auth-middleware.js"; - const router = Router(); -router.use([jsonMiddleware(), cairoAuthMiddleware]); +router.use(jsonMiddleware()); // Routes router.post("/create", createServer); router.delete("/delete", deleteServer); @@ -23,6 +18,4 @@ router.post("/start", startServer); router.post("/stop", stopServer); router.get("/list", serverList); router.get("/instances", serverInstances); -router.post("/blueprint", getServer); -router.post("/modify", modifyServer); export default router; diff --git a/lib/routes/system-route.js b/lib/routes/system-route.js index ef913ed..66e1022 100644 --- a/lib/routes/system-route.js +++ b/lib/routes/system-route.js @@ -1,12 +1,9 @@ import { Router } from "express"; import k8s from "@kubernetes/client-node"; import { WARN } from "../util/logging.js"; -import kc from "../k8s/k8s-config.js"; const router = Router(); - -import cairoAuthMiddleware from "./middlewares/auth-middleware.js"; -router.use(cairoAuthMiddleware); - +const kc = new k8s.KubeConfig(); +kc.loadFromDefault(); const k8sApi = kc.makeApiClient(k8s.CoreV1Api); // Get Routes router.get("/available", (req, res) => { diff --git a/lib/server/router.js b/lib/server/router.js index 685dd1d..ccedebb 100644 --- a/lib/server/router.js +++ b/lib/server/router.js @@ -3,12 +3,10 @@ import express from "express"; // Routes import vitals from "../routes/vitals-route.js"; -import authRoute from "../routes/auth-route.js"; import systemRoute from "../routes/system-route.js"; import serverRoute from "../routes/server-route.js"; import filesRoute from "../routes/files-route.js"; import reactRoute from "../routes/react-route.js"; -import s3Route from "../routes/s3-route.js"; import { logErrors, clientErrorHandler, @@ -24,11 +22,9 @@ export default function buildRoutes(pg, skio) { // Middlewares // Routes - router.use("/api/auth", authRoute); router.use("/api/system", systemRoute); router.use("/api/server", serverRoute); router.use("/api/files", filesRoute); - router.use("/api/s3", s3Route); router.use(["/mcl", "/mcl/*"], reactRoute); // Static Build Route /*router.use(logErrors); router.use(clientErrorHandler); diff --git a/lib/server/sockets.js b/lib/server/sockets.js index d9804ef..370e3d4 100644 --- a/lib/server/sockets.js +++ b/lib/server/sockets.js @@ -18,7 +18,7 @@ async function rconSend(socket, m) { const socketConnect = async (io, socket) => { VERB("WS", "Websocket connecting"); - socket.mcs = { serverId: socket.handshake.query.serverId }; + socket.mcs = { serverName: socket.handshake.query.serverName }; try { await webConsoleLogs(socket); await webConsoleRcon(socket); diff --git a/lib/storage/s3-integration.js b/lib/storage/s3-integration.js new file mode 100644 index 0000000..34ed5d5 --- /dev/null +++ b/lib/storage/s3-integration.js @@ -0,0 +1,34 @@ +import multer from "multer"; +import multerS3 from "multer-s3"; +import AWS from "aws-sdk"; + +// Environment Variables +const { + MCL_S3_ENDPOINT: s3Endpoint, + MCL_S3_ACCESS_KEY_ID: s3KeyId, + MCL_S3_ACCESS_KEY: s3Key, +} = process.env; + +export const mcl = "mcl"; + +export const s3 = new AWS.S3({ + endpoint: s3Endpoint, + accessKeyId: s3KeyId, + secretAccessKey: s3Key, + sslEnabled: true, + s3ForcePathStyle: true, +}); + +const storage = multerS3({ + s3, + bucket, + contentType: multerS3.AUTO_CONTENT_TYPE, + metadata: (req, file, cb) => { + cb(null, { fieldName: file.fieldname }); + }, + key: (req, file, cb) => { + cb(null, Date.now().toString()); + }, +}); + +export const upload = multer({ storage }); diff --git a/package-lock.json b/package-lock.json index cc9f68d..d111705 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,60 +1,54 @@ { "name": "minecluster", - "version": "0.0.1-alpha.1", + "version": "0.0.1-alpha.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "minecluster", - "version": "0.0.1-alpha.1", + "version": "0.0.1-alpha.0", "license": "LGPL-2.1", "dependencies": { - "@aws-sdk/client-s3": "^3.529.1", - "@aws-sdk/s3-request-presigner": "^3.529.1", "@kubernetes/client-node": "^0.20.0", + "aws-sdk": "^2.1514.0", "basic-ftp": "^5.0.4", "bcrypt": "^5.1.1", "chalk": "^5.3.0", + "chonky": "^2.3.2", + "chonky-icon-fontawesome": "^2.3.2", "express": "^4.18.2", - "express-bearer-token": "^2.4.0", "figlet": "^1.7.0", "js-yaml": "^4.1.0", - "moment": "^2.30.1", + "moment": "^2.29.4", "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "pg-promise": "^11.5.4", "postgres-migrations": "^5.3.0", "rcon-client": "^4.2.4", - "react-dropzone": "^14.2.3", - "socket.io": "^4.7.4", + "socket.io": "^4.7.2", "uuid": "^9.0.1" }, "devDependencies": { - "@emotion/react": "^11.11.3", + "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@mui/icons-material": "^5.15.9", - "@mui/material": "^5.15.9", - "@tanstack/react-query": "^5.20.1", + "@mui/icons-material": "^5.14.19", + "@mui/material": "^5.14.20", + "@tanstack/react-query": "^5.12.2", "@vitejs/plugin-react": "^4.2.1", - "chonky": "^2.3.2", - "chonky-icon-fontawesome": "^2.3.2", "concurrently": "^8.2.2", - "nodemon": "^3.0.3", - "prettier": "^3.2.5", + "nodemon": "^3.0.2", + "prettier": "^3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-quill": "^2.0.0", - "react-router-dom": "^6.22.0", - "react-toastify": "^10.0.4", - "socket.io-client": "^4.7.4", - "vite": "^5.1.1" + "react-router-dom": "^6.20.1", + "socket.io-client": "^4.7.2", + "vite": "^5.0.7" } }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -67,6 +61,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "peer": true, "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -76,12 +71,14 @@ "node_modules/@aws-crypto/crc32/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true }, "node_modules/@aws-crypto/crc32c": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "peer": true, "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -91,12 +88,14 @@ "node_modules/@aws-crypto/crc32c/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true }, "node_modules/@aws-crypto/ie11-detection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "peer": true, "dependencies": { "tslib": "^1.11.1" } @@ -104,12 +103,14 @@ "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true }, "node_modules/@aws-crypto/sha1-browser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", + "peer": true, "dependencies": { "@aws-crypto/ie11-detection": "^3.0.0", "@aws-crypto/supports-web-crypto": "^3.0.0", @@ -123,12 +124,14 @@ "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true }, "node_modules/@aws-crypto/sha256-browser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "peer": true, "dependencies": { "@aws-crypto/ie11-detection": "^3.0.0", "@aws-crypto/sha256-js": "^3.0.0", @@ -143,12 +146,14 @@ "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true }, "node_modules/@aws-crypto/sha256-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "peer": true, "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -158,12 +163,14 @@ "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "peer": true, "dependencies": { "tslib": "^1.11.1" } @@ -171,12 +178,14 @@ "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true }, "node_modules/@aws-crypto/util": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "peer": true, "dependencies": { "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-utf8-browser": "^3.0.0", @@ -186,69 +195,69 @@ "node_modules/@aws-crypto/util/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true }, "node_modules/@aws-sdk/client-s3": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.529.1.tgz", - "integrity": "sha512-ZpvyO4w3XWo/OjXLd3fm7CLcKUUYcyady9qzTnKKSnp8a2NqO7UvU/1zhYdm+yyy8TR/9t7sDy+q6AYd4Nsr8g==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.427.0.tgz", + "integrity": "sha512-YKjJ9zgn0oE393HURKgvjNoX6lxUjb+dkTBE1GymFnGCPl6VxQbKXajXWNqUyN+oPPlZ2osEiljPaN0RserUjA==", + "peer": true, "dependencies": { "@aws-crypto/sha1-browser": "3.0.0", "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.529.1", - "@aws-sdk/core": "3.529.1", - "@aws-sdk/credential-provider-node": "3.529.1", - "@aws-sdk/middleware-bucket-endpoint": "3.525.0", - "@aws-sdk/middleware-expect-continue": "3.523.0", - "@aws-sdk/middleware-flexible-checksums": "3.523.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-location-constraint": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-sdk-s3": "3.525.0", - "@aws-sdk/middleware-signing": "3.523.0", - "@aws-sdk/middleware-ssec": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/signature-v4-multi-region": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@aws-sdk/xml-builder": "3.523.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/eventstream-serde-browser": "^2.1.3", - "@smithy/eventstream-serde-config-resolver": "^2.1.3", - "@smithy/eventstream-serde-node": "^2.1.3", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-blob-browser": "^2.1.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/hash-stream-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/md5-js": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-stream": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "@smithy/util-waiter": "^2.1.3", + "@aws-sdk/client-sts": "3.427.0", + "@aws-sdk/credential-provider-node": "3.427.0", + "@aws-sdk/middleware-bucket-endpoint": "3.425.0", + "@aws-sdk/middleware-expect-continue": "3.425.0", + "@aws-sdk/middleware-flexible-checksums": "3.425.0", + "@aws-sdk/middleware-host-header": "3.425.0", + "@aws-sdk/middleware-location-constraint": "3.425.0", + "@aws-sdk/middleware-logger": "3.425.0", + "@aws-sdk/middleware-recursion-detection": "3.425.0", + "@aws-sdk/middleware-sdk-s3": "3.427.0", + "@aws-sdk/middleware-signing": "3.425.0", + "@aws-sdk/middleware-ssec": "3.425.0", + "@aws-sdk/middleware-user-agent": "3.427.0", + "@aws-sdk/region-config-resolver": "3.425.0", + "@aws-sdk/signature-v4-multi-region": "3.425.0", + "@aws-sdk/types": "3.425.0", + "@aws-sdk/util-endpoints": "3.427.0", + "@aws-sdk/util-user-agent-browser": "3.425.0", + "@aws-sdk/util-user-agent-node": "3.425.0", + "@aws-sdk/xml-builder": "3.310.0", + "@smithy/config-resolver": "^2.0.11", + "@smithy/eventstream-serde-browser": "^2.0.10", + "@smithy/eventstream-serde-config-resolver": "^2.0.10", + "@smithy/eventstream-serde-node": "^2.0.10", + "@smithy/fetch-http-handler": "^2.2.1", + "@smithy/hash-blob-browser": "^2.0.10", + "@smithy/hash-node": "^2.0.10", + "@smithy/hash-stream-node": "^2.0.10", + "@smithy/invalid-dependency": "^2.0.10", + "@smithy/md5-js": "^2.0.10", + "@smithy/middleware-content-length": "^2.0.12", + "@smithy/middleware-endpoint": "^2.0.10", + "@smithy/middleware-retry": "^2.0.13", + "@smithy/middleware-serde": "^2.0.10", + "@smithy/middleware-stack": "^2.0.4", + "@smithy/node-config-provider": "^2.0.13", + "@smithy/node-http-handler": "^2.1.6", + "@smithy/protocol-http": "^3.0.6", + "@smithy/smithy-client": "^2.1.9", + "@smithy/types": "^2.3.4", + "@smithy/url-parser": "^2.0.10", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.13", + "@smithy/util-defaults-mode-node": "^2.0.15", + "@smithy/util-retry": "^2.0.3", + "@smithy/util-stream": "^2.0.14", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.10", + "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, "engines": { @@ -256,166 +265,92 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.529.1.tgz", - "integrity": "sha512-KT1U/ZNjDhVv2ZgjzaeAn9VM7l667yeSguMrRYC8qk5h91/61MbjZypi6eOuKuVM+0fsQvzKScTQz0Lio0eYag==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.427.0.tgz", + "integrity": "sha512-sFVFEmsQ1rmgYO1SgrOTxE/MTKpeE4hpOkm1WqhLQK7Ij136vXpjCxjH1JYZiHiUzO1wr9t4ex4dlB5J3VS/Xg==", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.529.1", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", + "@aws-sdk/middleware-host-header": "3.425.0", + "@aws-sdk/middleware-logger": "3.425.0", + "@aws-sdk/middleware-recursion-detection": "3.425.0", + "@aws-sdk/middleware-user-agent": "3.427.0", + "@aws-sdk/region-config-resolver": "3.425.0", + "@aws-sdk/types": "3.425.0", + "@aws-sdk/util-endpoints": "3.427.0", + "@aws-sdk/util-user-agent-browser": "3.425.0", + "@aws-sdk/util-user-agent-node": "3.425.0", + "@smithy/config-resolver": "^2.0.11", + "@smithy/fetch-http-handler": "^2.2.1", + "@smithy/hash-node": "^2.0.10", + "@smithy/invalid-dependency": "^2.0.10", + "@smithy/middleware-content-length": "^2.0.12", + "@smithy/middleware-endpoint": "^2.0.10", + "@smithy/middleware-retry": "^2.0.13", + "@smithy/middleware-serde": "^2.0.10", + "@smithy/middleware-stack": "^2.0.4", + "@smithy/node-config-provider": "^2.0.13", + "@smithy/node-http-handler": "^2.1.6", + "@smithy/protocol-http": "^3.0.6", + "@smithy/smithy-client": "^2.1.9", + "@smithy/types": "^2.3.4", + "@smithy/url-parser": "^2.0.10", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.13", + "@smithy/util-defaults-mode-node": "^2.0.15", + "@smithy/util-retry": "^2.0.3", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.529.1.tgz", - "integrity": "sha512-bimxCWAvRnVcluWEQeadXvHyzWlBWsuGVligsaVZaGF0TLSn0eLpzpN9B1EhHzTf7m0Kh/wGtPSH1JxO6PpB+A==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.529.1", - "@aws-sdk/core": "3.529.1", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.529.1" - } - }, "node_modules/@aws-sdk/client-sts": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.529.1.tgz", - "integrity": "sha512-Rvk2Sr3MACQTOtngUU+omlf4E17k47dRVXR7OFRD6Ow5iGgC9tkN2q/ExDPW/ktPOmM0lSgzWyQ6/PC/Zq3HUg==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.427.0.tgz", + "integrity": "sha512-le2wLJKILyWuRfPz2HbyaNtu5kEki+ojUkTqCU6FPDRrqUvEkaaCBH9Awo/2AtrCfRkiobop8RuTTj6cAnpiJg==", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.529.1", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.529.1" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.529.1.tgz", - "integrity": "sha512-Sj42sYPfaL9PHvvciMICxhyrDZjqnnvFbPKDmQL5aFKyXy122qx7RdVqUOQERDmMQfvJh6+0W1zQlLnre89q4Q==", - "dependencies": { - "@smithy/core": "^1.3.5", - "@smithy/protocol-http": "^3.2.1", - "@smithy/signature-v4": "^2.1.3", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", + "@aws-sdk/credential-provider-node": "3.427.0", + "@aws-sdk/middleware-host-header": "3.425.0", + "@aws-sdk/middleware-logger": "3.425.0", + "@aws-sdk/middleware-recursion-detection": "3.425.0", + "@aws-sdk/middleware-sdk-sts": "3.425.0", + "@aws-sdk/middleware-signing": "3.425.0", + "@aws-sdk/middleware-user-agent": "3.427.0", + "@aws-sdk/region-config-resolver": "3.425.0", + "@aws-sdk/types": "3.425.0", + "@aws-sdk/util-endpoints": "3.427.0", + "@aws-sdk/util-user-agent-browser": "3.425.0", + "@aws-sdk/util-user-agent-node": "3.425.0", + "@smithy/config-resolver": "^2.0.11", + "@smithy/fetch-http-handler": "^2.2.1", + "@smithy/hash-node": "^2.0.10", + "@smithy/invalid-dependency": "^2.0.10", + "@smithy/middleware-content-length": "^2.0.12", + "@smithy/middleware-endpoint": "^2.0.10", + "@smithy/middleware-retry": "^2.0.13", + "@smithy/middleware-serde": "^2.0.10", + "@smithy/middleware-stack": "^2.0.4", + "@smithy/node-config-provider": "^2.0.13", + "@smithy/node-http-handler": "^2.1.6", + "@smithy/protocol-http": "^3.0.6", + "@smithy/smithy-client": "^2.1.9", + "@smithy/types": "^2.3.4", + "@smithy/url-parser": "^2.0.10", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.13", + "@smithy/util-defaults-mode-node": "^2.0.15", + "@smithy/util-retry": "^2.0.3", + "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, @@ -424,32 +359,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.523.0.tgz", - "integrity": "sha512-Y6DWdH6/OuMDoNKVzZlNeBc6f1Yjk1lYMjANKpIhMbkRCvLJw/PYZKOZa8WpXbTYdgg9XLjKybnLIb3ww3uuzA==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.425.0.tgz", + "integrity": "sha512-J20etnLvMKXRVi5FK4F8yOCNm2RTaQn5psQTGdDEPWJNGxohcSpzzls8U2KcMyUJ+vItlrThr4qwgpHG3i/N0w==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.525.0.tgz", - "integrity": "sha512-RNWQGuSBQZhl3iqklOslUEfQ4br1V3DCPboMpeqFtddUWJV3m2u2extFur9/4Uy+1EHVF120IwZUKtd8dF+ibw==", - "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/property-provider": "^2.1.3", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/util-stream": "^2.1.3", + "@aws-sdk/types": "3.425.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -457,20 +374,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.529.1.tgz", - "integrity": "sha512-RjHsuTvHIwXG7a/3ERexemiD3c9riKMCZQzY2/b0Gg0ButEVbBcMfERtUzWmQ0V4ufe/PEZjP68MH1gupcoF9A==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.427.0.tgz", + "integrity": "sha512-NmH1cO/w98CKMltYec3IrJIIco19wRjATFNiw83c+FGXZ+InJwReqBnruxIOmKTx2KDzd6fwU1HOewS7UjaaaQ==", + "peer": true, "dependencies": { - "@aws-sdk/client-sts": "3.529.1", - "@aws-sdk/credential-provider-env": "3.523.0", - "@aws-sdk/credential-provider-process": "3.523.0", - "@aws-sdk/credential-provider-sso": "3.529.1", - "@aws-sdk/credential-provider-web-identity": "3.529.1", - "@aws-sdk/types": "3.523.0", - "@smithy/credential-provider-imds": "^2.2.3", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", + "@aws-sdk/credential-provider-env": "3.425.0", + "@aws-sdk/credential-provider-process": "3.425.0", + "@aws-sdk/credential-provider-sso": "3.427.0", + "@aws-sdk/credential-provider-web-identity": "3.425.0", + "@aws-sdk/types": "3.425.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -478,21 +395,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.529.1.tgz", - "integrity": "sha512-mvY7F3dMmk/0dZOCfl5sUI1bG0osureBjxhELGCF0KkJqhWI0hIzh8UnPkYytSg3vdc97CMv7pTcozxrdA3b0g==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.427.0.tgz", + "integrity": "sha512-wYYbQ57nKL8OfgRbl8k6uXcdnYml+p3LSSfDUAuUEp1HKlQ8lOXFJ3BdLr5qrk7LhpyppSRnWBmh2c3kWa7ANQ==", + "peer": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.523.0", - "@aws-sdk/credential-provider-http": "3.525.0", - "@aws-sdk/credential-provider-ini": "3.529.1", - "@aws-sdk/credential-provider-process": "3.523.0", - "@aws-sdk/credential-provider-sso": "3.529.1", - "@aws-sdk/credential-provider-web-identity": "3.529.1", - "@aws-sdk/types": "3.523.0", - "@smithy/credential-provider-imds": "^2.2.3", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", + "@aws-sdk/credential-provider-env": "3.425.0", + "@aws-sdk/credential-provider-ini": "3.427.0", + "@aws-sdk/credential-provider-process": "3.425.0", + "@aws-sdk/credential-provider-sso": "3.427.0", + "@aws-sdk/credential-provider-web-identity": "3.425.0", + "@aws-sdk/types": "3.425.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -500,14 +417,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.523.0.tgz", - "integrity": "sha512-f0LP9KlFmMvPWdKeUKYlZ6FkQAECUeZMmISsv6NKtvPCI9e4O4cLTeR09telwDK8P0HrgcRuZfXM7E30m8re0Q==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.425.0.tgz", + "integrity": "sha512-YY6tkLdvtb1Fgofp3b1UWO+5vwS14LJ/smGmuGpSba0V7gFJRdcrJ9bcb9vVgAGuMdjzRJ+bUKlLLtqXkaykEw==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -515,16 +433,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.529.1.tgz", - "integrity": "sha512-KFMKkaoTGDgSJG+o9Ii7AglWG5JQeF6IFw9cXLMwDdIrp3KUmRcUIqe0cjOoCqeQEDGy0VHsimHmKKJ3894i/A==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.427.0.tgz", + "integrity": "sha512-c+tXyS/i49erHs4bAp6vKNYeYlyQ0VNMBgoco0LCn1rL0REtHbfhWMnqDLF6c2n3yIWDOTrQu0D73Idnpy16eA==", + "peer": true, "dependencies": { - "@aws-sdk/client-sso": "3.529.1", - "@aws-sdk/token-providers": "3.529.1", - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", + "@aws-sdk/client-sso": "3.427.0", + "@aws-sdk/token-providers": "3.427.0", + "@aws-sdk/types": "3.425.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -532,14 +451,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.529.1.tgz", - "integrity": "sha512-AGuZDOKN+AttjwTjrF47WLqzeEut2YynyxjkXZhxZF/xn8i5Y51kUAUdXsXw1bgR25pAeXQIdhsrQlRa1Pm5kw==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.425.0.tgz", + "integrity": "sha512-/0R65TgRzL01JU3SzloivWNwdkbIhr06uY/F5pBHf/DynQqaspKNfdHn6AiozgSVDfwRHFjKBTUy6wvf3QFkuA==", + "peer": true, "dependencies": { - "@aws-sdk/client-sts": "3.529.1", - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -584,16 +503,17 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.525.0.tgz", - "integrity": "sha512-nYfQ2Xspfef7j8mZO7varUWLPH6HQlXateH7tBVtBNUAazyQE4UJEvC0fbQ+Y01e+FKlirim/m2umkdMXqAlTg==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.425.0.tgz", + "integrity": "sha512-7UTfA10fmDw9cgHLApxRUNPywZTG4S/1TNZgTxndO/1OM9ZHtIatw1iLbqJD35gHrpEYI8Vo14YvcnD2ITuiMw==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-arn-parser": "3.495.0", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", - "@smithy/util-config-provider": "^2.2.1", + "@aws-sdk/types": "3.425.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/node-config-provider": "^2.0.13", + "@smithy/protocol-http": "^3.0.6", + "@smithy/types": "^2.3.4", + "@smithy/util-config-provider": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -601,13 +521,14 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.523.0.tgz", - "integrity": "sha512-E5DyRAHU39VHaAlQLqXYS/IKpgk3vsryuU6kkOcIIK8Dgw0a2tjoh5AOCaNa8pD+KgAGrFp35JIMSX1zui5diA==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.425.0.tgz", + "integrity": "sha512-CqAmnDST2o7+sKKw2/ffHKiYKE+jZb/Ce9U0P//ZYzqp9R1Wb016ID+W6DoxufyPJAS9dpRMcUDnAssmMIC/EA==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/protocol-http": "^3.0.6", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -615,17 +536,18 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.523.0.tgz", - "integrity": "sha512-lIa1TdWY9q4zsDFarfSnYcdrwPR+nypaU4n6hb95i620/1F5M5s6H8P0hYtwTNNvx+slrR8F3VBML9pjBtzAHw==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.425.0.tgz", + "integrity": "sha512-BDwn2vVVsC/AzmHXQlaZhEpKXL7GfKFpH7ZFccZuwEQBcyn8lVCcwtfaRe5P1mEe2wklVzOXd1dw8bt0+BOUPA==", + "peer": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", "@aws-crypto/crc32c": "3.0.0", - "@aws-sdk/types": "3.523.0", - "@smithy/is-array-buffer": "^2.1.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", - "@smithy/util-utf8": "^2.1.1", + "@aws-sdk/types": "3.425.0", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/protocol-http": "^3.0.6", + "@smithy/types": "^2.3.4", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -633,13 +555,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.523.0.tgz", - "integrity": "sha512-4g3q7Ta9sdD9TMUuohBAkbx/e3I/juTqfKi7TPgP+8jxcYX72MOsgemAMHuP6CX27eyj4dpvjH+w4SIVDiDSmg==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.425.0.tgz", + "integrity": "sha512-E5Gt41LObQ+cr8QnLthwsH3MtVSNXy1AKJMowDr85h0vzqA/FHUkgHyOGntgozzjXT5M0MaSRYxS0xwTR5D4Ew==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/protocol-http": "^3.0.6", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -647,12 +570,13 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.523.0.tgz", - "integrity": "sha512-1QAUXX3U0jkARnU0yyjk81EO4Uw5dCeQOtvUY5s3bUOHatR3ThosQeIr6y9BCsbXHzNnDe1ytCjqAPyo8r/bYw==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.425.0.tgz", + "integrity": "sha512-3rt0LpGmL1LCRFuEObS1yERd9OEV+AEIAvhY7b53M7u7SyrjWQtpntWkI365L/QljhgMXQBfps2qO4JtrhQnsA==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -660,12 +584,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.523.0.tgz", - "integrity": "sha512-PeDNJNhfiaZx54LBaLTXzUaJ9LXFwDFFIksipjqjvxMafnoVcQwKbkoPUWLe5ytT4nnL1LogD3s55mERFUsnwg==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.425.0.tgz", + "integrity": "sha512-INE9XWRXx2f4a/r2vOU0tAmgctVp7nEaEasemNtVBYhqbKLZvr9ndLBSgKGgJ8LIcXAoISipaMuFiqIGkFsm7A==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -673,13 +598,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.523.0.tgz", - "integrity": "sha512-nZ3Vt7ehfSDYnrcg/aAfjjvpdE+61B3Zk68i6/hSUIegT3IH9H1vSW67NDKVp+50hcEfzWwM2HMPXxlzuyFyrw==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.425.0.tgz", + "integrity": "sha512-77gnzJ5b91bgD75L/ugpOyerx6lR3oyS4080X1YI58EzdyBMkDrHM4FbMcY2RynETi3lwXCFzLRyZjWXY1mRlw==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/protocol-http": "^3.0.6", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -687,18 +613,31 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.525.0.tgz", - "integrity": "sha512-ewFyyFM6wdFTOqCiId5GQNi7owDdLEonQhB4h8tF6r3HV52bRlDvZA4aDos+ft6N/XY2J6L0qlFTFq+/oiurXw==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.427.0.tgz", + "integrity": "sha512-virGCf9vsqYCLpmngLOZOVSYgVr2cCOCvTuRoT9vf5tD/63JwaC173jnbdoJO6CWI7ID5Iz0eNdgITXVQ2mpew==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-arn-parser": "3.495.0", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/protocol-http": "^3.2.1", - "@smithy/signature-v4": "^2.1.3", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/util-config-provider": "^2.2.1", + "@aws-sdk/types": "3.425.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^3.0.6", + "@smithy/smithy-client": "^2.1.9", + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.425.0.tgz", + "integrity": "sha512-JFojrg76oKAoBknnr9EL5N2aJ1mRCtBqXoZYST58GSx8uYdFQ89qS65VNQ8JviBXzsrCNAn4vDhZ5Ch5E6TxGQ==", + "peer": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.425.0", + "@aws-sdk/types": "3.425.0", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -706,16 +645,17 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.523.0.tgz", - "integrity": "sha512-pFXV4don6qcmew/OvEjLUr2foVjzoJ8o5k57Oz9yAHz8INx3RHK8MP/K4mVhHo6n0SquRcWrm4kY/Tw+89gkEA==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.425.0.tgz", + "integrity": "sha512-ZpOfgJHk7ovQ0sSwg3tU4NxFOnz53lJlkJRf7S+wxQALHM0P2MJ6LYBrZaFMVsKiJxNIdZBXD6jclgHg72ZW6Q==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/protocol-http": "^3.2.1", - "@smithy/signature-v4": "^2.1.3", - "@smithy/types": "^2.10.1", - "@smithy/util-middleware": "^2.1.3", + "@aws-sdk/types": "3.425.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.6", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.3.4", + "@smithy/util-middleware": "^2.0.3", "tslib": "^2.5.0" }, "engines": { @@ -723,12 +663,13 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.523.0.tgz", - "integrity": "sha512-FaqAZQeF5cQzZLOIboIJRaWVOQ2F2pJZAXGF5D7nJsxYNFChotA0O0iWimBRxU35RNn7yirVxz35zQzs20ddIw==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.425.0.tgz", + "integrity": "sha512-9HTuXnHYAZWkwPC8x9tElsQjFPxDT//orbIFauS7VF5HkLCKn9J6O6lW1wKMxrEnDwfN/Vi3nw479MoPj5Ss0Q==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -736,14 +677,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.525.0.tgz", - "integrity": "sha512-4al/6uO+t/QIYXK2OgqzDKQzzLAYJza1vWFS+S0lJ3jLNGyLB5BMU5KqWjDzevYZ4eCnz2Nn7z0FveUTNz8YdQ==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.427.0.tgz", + "integrity": "sha512-y9HxYsNvnA3KqDl8w1jHeCwz4P9CuBEtu/G+KYffLeAMBsMZmh4SIkFFCO9wE/dyYg6+yo07rYcnnIfy7WA0bw==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@aws-sdk/util-endpoints": "3.427.0", + "@smithy/protocol-http": "^3.0.6", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -751,33 +693,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.525.0.tgz", - "integrity": "sha512-8kFqXk6UyKgTMi7N7QlhA6qM4pGPWbiUXqEY2RgUWngtxqNFGeM9JTexZeuavQI+qLLe09VPShPNX71fEDcM6w==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.425.0.tgz", + "integrity": "sha512-u7uv/iUOapIJdRgRkO3wnpYsUgV6ponsZJQgVg/8L+n+Vo5PQL5gAcIuAOwcYSKQPFaeK+KbmByI4SyOK203Vw==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/types": "^2.10.1", - "@smithy/util-config-provider": "^2.2.1", - "@smithy/util-middleware": "^2.1.3", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.529.1.tgz", - "integrity": "sha512-54nNN/LjqlyUDTLO3U9D7xkYK4/UttcqfKoHQuPI6QabqZGT1hMFs5SzsyihNchgxci6ZTo4pqQQ3lGfE/HHOA==", - "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-format-url": "3.523.0", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", + "@smithy/node-config-provider": "^2.0.13", + "@smithy/types": "^2.3.4", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.3", "tslib": "^2.5.0" }, "engines": { @@ -785,15 +709,15 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.525.0.tgz", - "integrity": "sha512-j8gkdfiokaherRgokfZBl2azYBMHlegT7pOnR/3Y79TSz6G+bJeIkuNk8aUbJArr6R8nvAM1j4dt1rBM+efolQ==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.425.0.tgz", + "integrity": "sha512-7n2FRPE9rLaVa26xXQJ8TExrt53dWN824axQd1a0r5va0SmMQYG/iV5LBmwUlAntUSq46Lse4Q5YnbOVedGOmw==", + "peer": true, "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@smithy/protocol-http": "^3.2.1", - "@smithy/signature-v4": "^2.1.3", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/protocol-http": "^3.0.6", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -801,15 +725,45 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.529.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.529.1.tgz", - "integrity": "sha512-NpgMjsfpqiugbxrYGXtta914N43Mx/H0niidqv8wKMTgWQEtsJvYtOni+kuLXB+LmpjaMFNlpadooFU/bK4buA==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.427.0.tgz", + "integrity": "sha512-4E5E+4p8lJ69PBY400dJXF06LUHYx5lkKzBEsYqWWhoZcoftrvi24ltIhUDoGVLkrLcTHZIWSdFAWSos4hXqeg==", + "peer": true, "dependencies": { - "@aws-sdk/client-sso-oidc": "3.529.1", - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.425.0", + "@aws-sdk/middleware-logger": "3.425.0", + "@aws-sdk/middleware-recursion-detection": "3.425.0", + "@aws-sdk/middleware-user-agent": "3.427.0", + "@aws-sdk/types": "3.425.0", + "@aws-sdk/util-endpoints": "3.427.0", + "@aws-sdk/util-user-agent-browser": "3.425.0", + "@aws-sdk/util-user-agent-node": "3.425.0", + "@smithy/config-resolver": "^2.0.11", + "@smithy/fetch-http-handler": "^2.2.1", + "@smithy/hash-node": "^2.0.10", + "@smithy/invalid-dependency": "^2.0.10", + "@smithy/middleware-content-length": "^2.0.12", + "@smithy/middleware-endpoint": "^2.0.10", + "@smithy/middleware-retry": "^2.0.13", + "@smithy/middleware-serde": "^2.0.10", + "@smithy/middleware-stack": "^2.0.4", + "@smithy/node-config-provider": "^2.0.13", + "@smithy/node-http-handler": "^2.1.6", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.6", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.9", + "@smithy/types": "^2.3.4", + "@smithy/url-parser": "^2.0.10", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.13", + "@smithy/util-defaults-mode-node": "^2.0.15", + "@smithy/util-retry": "^2.0.3", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -817,11 +771,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.523.0.tgz", - "integrity": "sha512-AqGIu4u+SxPiUuNBp2acCVcq80KDUFjxe6e3cMTvKWTzCbrVk1AXv0dAaJnCmdkWIha6zJDWxpIk/aL4EGhZ9A==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.425.0.tgz", + "integrity": "sha512-6lqbmorwerN4v+J5dqbHPAsjynI0mkEF+blf+69QTaKKGaxBBVaXgqoqul9RXYcK5MMrrYRbQIMd0zYOoy90kA==", + "peer": true, "dependencies": { - "@smithy/types": "^2.10.1", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -829,9 +784,10 @@ } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.495.0.tgz", - "integrity": "sha512-hwdA3XAippSEUxs7jpznwD63YYFR+LtQvlEcebPTgWR9oQgG9TfS+39PUfbnEeje1ICuOrN3lrFqFbmP9uzbMg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", + "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", + "peer": true, "dependencies": { "tslib": "^2.5.0" }, @@ -840,27 +796,13 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.525.0.tgz", - "integrity": "sha512-DIW7WWU5tIGkeeKX6NJUyrEIdWMiqjLQG3XBzaUj+ufIENwNjdAHhlD8l2vX7Yr3JZRT6yN/84wBCj7Tw1xd1g==", + "version": "3.427.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.427.0.tgz", + "integrity": "sha512-rSyiAIFF/EVvity/+LWUqoTMJ0a25RAc9iqx0WZ4tf1UjuEXRRXxZEb+jEZg1bk+pY84gdLdx9z5E+MSJCZxNQ==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/types": "^2.10.1", - "@smithy/util-endpoints": "^1.1.4", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-format-url": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.523.0.tgz", - "integrity": "sha512-OWi+8bsEfxG4DvHkWauxyWVZMbYrezC49DbGDEu1lJgk9eqQALlyGkZHt9O8KKfyT/mdqQbR8qbpkxqYcGuHVA==", - "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/querystring-builder": "^2.1.3", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/node-config-provider": "^2.0.13", "tslib": "^2.5.0" }, "engines": { @@ -871,6 +813,7 @@ "version": "3.310.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "peer": true, "dependencies": { "tslib": "^2.5.0" }, @@ -879,24 +822,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.523.0.tgz", - "integrity": "sha512-6ZRNdGHX6+HQFqTbIA5+i8RWzxFyxsZv8D3soRfpdyWIKkzhSz8IyRKXRciwKBJDaC7OX2jzGE90wxRQft27nA==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.425.0.tgz", + "integrity": "sha512-22Y9iMtjGcFjGILR6/xdp1qRezlHVLyXtnpEsbuPTiernRCPk6zfAnK/ATH77r02MUjU057tdxVkd5umUBTn9Q==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/types": "^2.3.4", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.525.0.tgz", - "integrity": "sha512-88Wjt4efyUSBGcyIuh1dvoMqY1k15jpJc5A/3yi67clBQEFsu9QCodQCQPqmRjV3VRcMtBOk+jeCTiUzTY5dRQ==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.425.0.tgz", + "integrity": "sha512-SIR4F5uQeeVAi8lv4OgRirtdtNi5zeyogTuQgGi9su8F/WP1N6JqxofcwpUY5f8/oJ2UlXr/tx1f09UHfJJzvA==", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.425.0", + "@smithy/node-config-provider": "^2.0.13", + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -915,16 +860,17 @@ "version": "3.259.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "peer": true, "dependencies": { "tslib": "^2.3.1" } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.523.0.tgz", - "integrity": "sha512-wfvyVymj2TUw7SuDor9IuFcAzJZvWRBZotvY/wQJOlYa3UP3Oezzecy64N4FWfBJEsZdrTN+HOZFl+IzTWWnUA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", + "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", + "peer": true, "dependencies": { - "@smithy/types": "^2.10.1", "tslib": "^2.5.0" }, "engines": { @@ -935,7 +881,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, "dependencies": { "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" @@ -948,7 +893,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -960,7 +904,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -974,7 +917,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -982,14 +924,12 @@ "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -998,7 +938,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1007,7 +946,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", @@ -1036,14 +974,12 @@ "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/@babel/generator": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", - "dev": true, "dependencies": { "@babel/types": "^7.23.5", "@jridgewell/gen-mapping": "^0.3.2", @@ -1058,7 +994,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1070,7 +1005,6 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.15", @@ -1086,7 +1020,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1095,7 +1028,6 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" @@ -1108,7 +1040,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1120,7 +1051,6 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, "dependencies": { "@babel/types": "^7.22.15" }, @@ -1132,7 +1062,6 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", @@ -1151,7 +1080,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1160,7 +1088,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1172,7 +1099,6 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1184,7 +1110,6 @@ "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1193,7 +1118,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1202,7 +1126,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1211,7 +1134,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", - "dev": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/traverse": "^7.23.5", @@ -1225,7 +1147,6 @@ "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -1239,7 +1160,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -1251,7 +1171,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1265,7 +1184,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -1273,14 +1191,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -1289,7 +1205,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1301,7 +1216,6 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1343,10 +1257,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dev": true, + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1358,7 +1271,6 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1372,7 +1284,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.5", @@ -1393,7 +1304,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -1445,7 +1355,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", - "dev": true, "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -1453,19 +1362,18 @@ "node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "dev": true + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", - "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", "dev": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", + "@emotion/serialize": "^1.1.2", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1", "@emotion/weak-memoize": "^0.3.1", @@ -1481,9 +1389,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", "dev": true, "dependencies": { "@emotion/hash": "^0.9.1", @@ -1525,8 +1433,7 @@ "node_modules/@emotion/stylis": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "dev": true + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" }, "node_modules/@emotion/unitless": { "version": "0.8.1", @@ -1555,6 +1462,246 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==", "dev": true }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", + "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", + "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", + "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", + "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", + "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", + "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", + "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", + "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", + "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", + "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", + "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", + "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", + "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", + "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", + "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-x64": { "version": "0.19.8", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", @@ -1571,32 +1718,128 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", + "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", + "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", + "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", + "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", + "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", + "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", + "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", "dev": true, "dependencies": { - "@floating-ui/utils": "^0.2.1" + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz", - "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dev": true, "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.1" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", "dev": true, "dependencies": { - "@floating-ui/dom": "^1.6.1" + "@floating-ui/dom": "^1.5.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -1604,16 +1847,15 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", "dev": true }, "node_modules/@formatjs/ecma402-abstract": { "version": "1.11.4", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz", "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==", - "dev": true, "dependencies": { "@formatjs/intl-localematcher": "0.2.25", "tslib": "^2.1.0" @@ -1623,7 +1865,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz", "integrity": "sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==", - "dev": true, "dependencies": { "tslib": "^2.1.0" } @@ -1632,7 +1873,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz", "integrity": "sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==", - "dev": true, "dependencies": { "@formatjs/ecma402-abstract": "1.11.4", "@formatjs/icu-skeleton-parser": "1.3.6", @@ -1643,7 +1883,6 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz", "integrity": "sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==", - "dev": true, "dependencies": { "@formatjs/ecma402-abstract": "1.11.4", "tslib": "^2.1.0" @@ -1653,7 +1892,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.2.1.tgz", "integrity": "sha512-vgvyUOOrzqVaOFYzTf2d3+ToSkH2JpR7x/4U1RyoHQLmvEaTQvXJ7A2qm1Iy3brGNXC/+/7bUlc3lpH+h/LOJA==", - "dev": true, "dependencies": { "@formatjs/ecma402-abstract": "1.11.4", "@formatjs/fast-memoize": "1.2.1", @@ -1676,7 +1914,6 @@ "version": "5.4.3", "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-5.4.3.tgz", "integrity": "sha512-4r12A3mS5dp5hnSaQCWBuBNfi9Amgx2dzhU4lTFfhSxgb5DOAiAbMpg6+7gpWZgl4ahsj3l2r/iHIjdmdXOE2Q==", - "dev": true, "dependencies": { "@formatjs/ecma402-abstract": "1.11.4", "@formatjs/intl-localematcher": "0.2.25", @@ -1687,7 +1924,6 @@ "version": "6.5.3", "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-6.5.3.tgz", "integrity": "sha512-ozpz515F/+3CU+HnLi5DYPsLa6JoCfBggBSSg/8nOB5LYSFW9+ZgNQJxJ8tdhKYeODT+4qVHX27EeJLoxLGLNg==", - "dev": true, "dependencies": { "@formatjs/ecma402-abstract": "1.11.4", "@formatjs/intl-localematcher": "0.2.25", @@ -1698,7 +1934,6 @@ "version": "0.2.25", "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz", "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==", - "dev": true, "dependencies": { "tslib": "^2.1.0" } @@ -1707,7 +1942,6 @@ "version": "0.2.36", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", - "dev": true, "hasInstallScript": true, "engines": { "node": ">=6" @@ -1717,7 +1951,6 @@ "version": "1.2.36", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", - "dev": true, "hasInstallScript": true, "dependencies": { "@fortawesome/fontawesome-common-types": "^0.2.36" @@ -1730,7 +1963,6 @@ "version": "5.13.1", "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.13.1.tgz", "integrity": "sha512-dKwF+NpIV2LVCNBA7hibH53k+ChF4Wu59P2z35gu3zwRBZpmpLVhS9k1/RiSqUqkyXUQvA2rSv48GY6wp5axZQ==", - "dev": true, "dependencies": { "@fortawesome/fontawesome-common-types": "^0.2.29" }, @@ -1742,7 +1974,6 @@ "version": "5.15.4", "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", - "dev": true, "hasInstallScript": true, "dependencies": { "@fortawesome/fontawesome-common-types": "^0.2.36" @@ -1755,7 +1986,6 @@ "version": "0.1.19", "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", - "dev": true, "dependencies": { "prop-types": "^15.8.1" }, @@ -1768,7 +1998,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1782,7 +2011,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -1791,7 +2019,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -1799,14 +2026,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1903,7 +2128,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", - "dev": true, "peerDependencies": { "@types/react": "*" }, @@ -1914,17 +2138,17 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.36.tgz", - "integrity": "sha512-6A8fYiXgjqTO6pgj31Hc8wm1M3rFYCxDRh09dBVk0L0W4cb2lnurRJa3cAyic6hHY+we1S58OdGYRbKmOsDpGQ==", + "version": "5.0.0-beta.26", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.26.tgz", + "integrity": "sha512-gPMRKC84VRw+tjqYoyBzyrBUqHQucMXdlBpYazHa5rCXrb91fYEQk5SqQ2U5kjxx9QxZxTBvWAmZ6DblIgaGhQ==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.9", + "@babel/runtime": "^7.23.4", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.10", + "@mui/utils": "^5.14.20", "@popperjs/core": "^2.11.8", - "clsx": "^2.1.0", + "clsx": "^2.0.0", "prop-types": "^15.8.1" }, "engines": { @@ -1946,9 +2170,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.9", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.9.tgz", - "integrity": "sha512-CSDpVevGaxsvMkiYBZ8ztki1z/eT0mM2MqUT21eCRiMz3DU4zQw5rXG5ML/yTuJF9Z2Wv9SliIeaRAuSR/9Nig==", + "version": "5.14.20", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.20.tgz", + "integrity": "sha512-fXoGe8VOrIYajqALysFuyal1q1YmBARqJ3tmnWYDVl0scu8f6h6tZQbS2K8BY28QwkWNGyv4WRfuUkzN5HR3Ow==", "dev": true, "funding": { "type": "opencollective", @@ -1956,12 +2180,12 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.15.9", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.9.tgz", - "integrity": "sha512-6tLQoM6RylQuDnHR6qQay0G0pJgKmrhn5MIm0IfrwtmSO8eV5iUFR+nNUTXsWa24gt7ZbIKnJ962UlYaeXa4bg==", + "version": "5.14.19", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.19.tgz", + "integrity": "sha512-yjP8nluXxZGe3Y7pS+yxBV+hWZSsSBampCxkZwaw+1l+feL+rfP74vbEFbMrX/Kil9I/Y1tWfy5bs/eNvwNpWw==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9" + "@babel/runtime": "^7.23.4" }, "engines": { "node": ">=12.0.0" @@ -1982,20 +2206,20 @@ } }, "node_modules/@mui/material": { - "version": "5.15.9", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.9.tgz", - "integrity": "sha512-kbHTZDcFmN8GHKzRpImUEl9AJfFWI/0Kl+DsYVT3kHzQWUuHiKm3uHXR1RCOqr7H8IgHFPdbxItmCSQ/mj7zgg==", + "version": "5.14.20", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.20.tgz", + "integrity": "sha512-SUcPZnN6e0h1AtrDktEl76Dsyo/7pyEUQ+SAVe9XhHg/iliA0b4Vo+Eg4HbNkELsMbpDsUF4WHp7rgflPG7qYQ==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.36", - "@mui/core-downloads-tracker": "^5.15.9", - "@mui/system": "^5.15.9", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.9", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", + "@babel/runtime": "^7.23.4", + "@mui/base": "5.0.0-beta.26", + "@mui/core-downloads-tracker": "^5.14.20", + "@mui/system": "^5.14.20", + "@mui/types": "^7.2.10", + "@mui/utils": "^5.14.20", + "@types/react-transition-group": "^4.4.9", + "clsx": "^2.0.0", + "csstype": "^3.1.2", "prop-types": "^15.8.1", "react-is": "^18.2.0", "react-transition-group": "^4.4.5" @@ -2027,13 +2251,13 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.15.9", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.9.tgz", - "integrity": "sha512-/aMJlDOxOTAXyp4F2rIukW1O0anodAMCkv1DfBh/z9vaKHY3bd5fFf42wmP+0GRmwMinC5aWPpNfHXOED1fEtg==", + "version": "5.14.20", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.20.tgz", + "integrity": "sha512-WV560e1vhs2IHCh0pgUaWHznrcrVoW9+cDCahU1VTkuwPokWVvb71ccWQ1f8Y3tRBPPcNkU2dChkkRJChLmQlQ==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.9", + "@babel/runtime": "^7.23.4", + "@mui/utils": "^5.14.20", "prop-types": "^15.8.1" }, "engines": { @@ -2054,14 +2278,14 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.15.9", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.9.tgz", - "integrity": "sha512-NRKtYkL5PZDH7dEmaLEIiipd3mxNnQSO+Yo8rFNBNptY8wzQnQ+VjayTq39qH7Sast5cwHKYFusUrQyD+SS4Og==", + "version": "5.14.20", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.20.tgz", + "integrity": "sha512-Vs4nGptd9wRslo9zeRkuWcZeIEp+oYbODy+fiZKqqr4CH1Gfi9fdP0Q1tGYk8OiJ2EPB/tZSAyOy62Hyp/iP7g==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", + "@babel/runtime": "^7.23.4", "@emotion/cache": "^11.11.0", - "csstype": "^3.1.3", + "csstype": "^3.1.2", "prop-types": "^15.8.1" }, "engines": { @@ -2086,18 +2310,18 @@ } }, "node_modules/@mui/system": { - "version": "5.15.9", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.9.tgz", - "integrity": "sha512-SxkaaZ8jsnIJ77bBXttfG//LUf6nTfOcaOuIgItqfHv60ZCQy/Hu7moaob35kBb+guxVJnoSZ+7vQJrA/E7pKg==", + "version": "5.14.20", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.20.tgz", + "integrity": "sha512-jKOGtK4VfYZG5kdaryUHss4X6hzcfh0AihT8gmnkfqRtWP7xjY+vPaUhhuSeibE5sqA5wCtdY75z6ep9pxFnIg==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.9", - "@mui/styled-engine": "^5.15.9", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.9", - "clsx": "^2.1.0", - "csstype": "^3.1.3", + "@babel/runtime": "^7.23.4", + "@mui/private-theming": "^5.14.20", + "@mui/styled-engine": "^5.14.19", + "@mui/types": "^7.2.10", + "@mui/utils": "^5.14.20", + "clsx": "^2.0.0", + "csstype": "^3.1.2", "prop-types": "^15.8.1" }, "engines": { @@ -2126,9 +2350,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz", - "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==", + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.10.tgz", + "integrity": "sha512-wX1vbDC+lzF7FlhT6A3ffRZgEoKWPF8VqRoTu4lZwouFX2t90KyCMsgepMw5DxLak1BSp/KP86CmtZttikb/gQ==", "dev": true, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" @@ -2140,12 +2364,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.9", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.9.tgz", - "integrity": "sha512-yDYfr61bCYUz1QtwvpqYy/3687Z8/nS4zv7lv/ih/6ZFGMl1iolEvxRmR84v2lOYxlds+kq1IVYbXxDKh8Z9sg==", + "version": "5.14.20", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.20.tgz", + "integrity": "sha512-Y6yL5MoFmtQml20DZnaaK1znrCEwG6/vRSzW8PKOTrzhyqKIql0FazZRUR7sA5EPASgiyKZfq0FPwISRXm5NdA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", + "@babel/runtime": "^7.23.4", "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -2180,20 +2404,22 @@ "node_modules/@react-dnd/asap": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", - "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==", - "dev": true + "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" }, "node_modules/@react-dnd/invariant": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-2.0.0.tgz", - "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==", - "dev": true + "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==" + }, + "node_modules/@react-dnd/shallowequal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz", + "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==" }, "node_modules/@reduxjs/toolkit": { "version": "1.9.7", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", - "dev": true, "dependencies": { "immer": "^9.0.21", "redux": "^4.2.1", @@ -2214,14 +2440,118 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz", - "integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.13.1.tgz", + "integrity": "sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==", "dev": true, "engines": { "node": ">=14.0.0" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.7.0.tgz", + "integrity": "sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.7.0.tgz", + "integrity": "sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.7.0.tgz", + "integrity": "sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.7.0.tgz", + "integrity": "sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.7.0.tgz", + "integrity": "sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.7.0.tgz", + "integrity": "sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.7.0.tgz", + "integrity": "sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.7.0.tgz", + "integrity": "sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.7.0.tgz", @@ -2248,12 +2578,51 @@ "linux" ] }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.7.0.tgz", + "integrity": "sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.7.0.tgz", + "integrity": "sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.7.0.tgz", + "integrity": "sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@smithy/abort-controller": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.4.tgz", - "integrity": "sha512-66HO817oIZ2otLIqy06R5muapqZjkgF1jfU0wyNko8cuqZNu8nbS9ljlhcRYw/M/uWRJzB9ih81DLSHhYbBLlQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.11.tgz", + "integrity": "sha512-MSzE1qR2JNyb7ot3blIOT3O3H0Jn06iNDEgHRaqZUwBgx5EG+VIx24Y21tlKofzYryIOcWpIohLrIIyocD6LMA==", "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2261,49 +2630,34 @@ } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.1.1.tgz", - "integrity": "sha512-NjNFCKxC4jVvn+lUr3Yo4/PmUJj3tbyqH6GNHueyTGS5Q27vlEJ1MkNhUDV8QGxJI7Bodnc2pD18lU2zRfhHlQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", + "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", + "peer": true, "dependencies": { "tslib": "^2.5.0" } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.1.2.tgz", - "integrity": "sha512-KwR9fFc/t5jH9RQFbrA9DHSmI+URTmB4v+i7H08UNET9AcN6GGBTBMiDKpA56Crw6CN7cSaSDXaRS/AsfOuupQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.0.tgz", + "integrity": "sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==", + "peer": true, "dependencies": { - "@smithy/util-base64": "^2.2.0", + "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/config-resolver": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.5.tgz", - "integrity": "sha512-LcBB5JQC3Tx2ZExIJzfvWaajhFIwHrUNQeqxhred2r5nnqrdly9uoCrvM1sxOOdghYuWWm2Kr8tBCDOmxsgeTA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.14.tgz", + "integrity": "sha512-K1K+FuWQoy8j/G7lAmK85o03O89s2Vvh6kMFmzEmiHUoQCRH1rzbDtMnGNiaMHeSeYJ6y79IyTusdRG+LuWwtg==", + "peer": true, "dependencies": { - "@smithy/node-config-provider": "^2.2.5", - "@smithy/types": "^2.11.0", - "@smithy/util-config-provider": "^2.2.1", - "@smithy/util-middleware": "^2.1.4", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.7.tgz", - "integrity": "sha512-zHrrstOO78g+/rOJoHi4j3mGUBtsljRhcKNzloWPv1XIwgcFUi+F1YFKr2qPQ3z7Ls5dNc4L2SPrVarNFIQqog==", - "dependencies": { - "@smithy/middleware-endpoint": "^2.4.6", - "@smithy/middleware-retry": "^2.1.6", - "@smithy/middleware-serde": "^2.2.1", - "@smithy/protocol-http": "^3.2.2", - "@smithy/smithy-client": "^2.4.4", - "@smithy/types": "^2.11.0", - "@smithy/util-middleware": "^2.1.4", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/types": "^2.3.5", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.4", "tslib": "^2.5.0" }, "engines": { @@ -2311,14 +2665,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.6.tgz", - "integrity": "sha512-+xQe4Pite0kdk9qn0Vyw5BRVh0iSlj+T4TEKRXr4E1wZKtVgIzGlkCrfICSjiPVFkPxk4jMpVboMYdEiiA88/w==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.16.tgz", + "integrity": "sha512-tKa2xF+69TvGxJT+lnJpGrKxUuAZDLYXFhqnPEgnHz+psTpkpcB4QRjHj63+uj83KaeFJdTfW201eLZeRn6FfA==", + "peer": true, "dependencies": { - "@smithy/node-config-provider": "^2.2.5", - "@smithy/property-provider": "^2.1.4", - "@smithy/types": "^2.11.0", - "@smithy/url-parser": "^2.1.4", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/property-provider": "^2.0.12", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", "tslib": "^2.5.0" }, "engines": { @@ -2326,23 +2681,25 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.4.tgz", - "integrity": "sha512-UkiieTztP7adg8EuqZvB0Y4LewdleZCJU7Kgt9RDutMsRYqO32fMpWeQHeTHaIMosmzcRZUykMRrhwGJe9mP3A==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.11.tgz", + "integrity": "sha512-BQCTjxhCYRZIfXapa2LmZSaH8QUBGwMZw7XRN83hrdixbLjIcj+o549zjkedFS07Ve2TlvWUI6BTzP+nv7snBA==", + "peer": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.11.0", - "@smithy/util-hex-encoding": "^2.1.1", + "@smithy/types": "^2.3.5", + "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.1.4.tgz", - "integrity": "sha512-K0SyvrUu/vARKzNW+Wp9HImiC/cJ6K88/n7FTH1slY+MErdKoiSbRLaXbJ9qD6x1Hu28cplHMlhADwZelUx/Ww==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.11.tgz", + "integrity": "sha512-p9IK4uvwT6B3pT1VGlODvcVBfPVikjBFHAcKpvvNF+7lAEI+YiC6d0SROPkpjnvCgVBYyGXa3ciqrWnFze6mwQ==", + "peer": true, "dependencies": { - "@smithy/eventstream-serde-universal": "^2.1.4", - "@smithy/types": "^2.11.0", + "@smithy/eventstream-serde-universal": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2350,11 +2707,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.1.4.tgz", - "integrity": "sha512-FH+2AwOwZ0kHPB9sciWJtUqx81V4vizfT3P6T9eslmIC2hi8ch/KFvQlF7jDmwR1aLlPlq6qqLKLqzK/71Ki4A==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.11.tgz", + "integrity": "sha512-vN32E8yExo0Z8L7kXhlU9KRURrhqOpPdLxQMp3MwfMThrjiqbr1Sk5srUXc1ed2Ygl/l0TEN9vwNG0bQHg6AjQ==", + "peer": true, "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2362,12 +2720,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.1.4.tgz", - "integrity": "sha512-gsc5ZTvVcB9sleLQzsK/rOhgn52+AAsmhEr41WDwAcctccBjh429+b8gT9t+SU8QyajypfsLOZfJQu0+zE515Q==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.11.tgz", + "integrity": "sha512-Gjqbpg7UmD+YzkpgNShNcDNZcUpBWIkvX2XCGptz5PoxJU/UQbuF9eSc93ZlIb7j4aGjtFfqk23HUMW8Hopg2Q==", + "peer": true, "dependencies": { - "@smithy/eventstream-serde-universal": "^2.1.4", - "@smithy/types": "^2.11.0", + "@smithy/eventstream-serde-universal": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2375,12 +2734,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.1.4.tgz", - "integrity": "sha512-NKLAsYnZA5s+ntipJRKo1RrRbhYHrsEnmiUoz0EhVYrAih+UELY9sKR+A1ujGaFm3nKDs5fPfiozC2wpXq2zUA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.11.tgz", + "integrity": "sha512-F8FsxLTbFN4+Esgpo+nNKcEajrgRZJ+pG9c8+MhLM4Odp5ejLHw2GMCXd81cGsgmfcbnzdDEXazPPVzOwj89MQ==", + "peer": true, "dependencies": { - "@smithy/eventstream-codec": "^2.1.4", - "@smithy/types": "^2.11.0", + "@smithy/eventstream-codec": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2388,36 +2748,38 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.4.tgz", - "integrity": "sha512-DSUtmsnIx26tPuyyrK49dk2DAhPgEw6xRW7V62nMHIB5dk3NqhGnwcKO2fMdt/l3NUVgia34ZsSJA8bD+3nh7g==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.2.tgz", + "integrity": "sha512-K7aRtRuaBjzlk+jWWeyfDTLAmRRvmA4fU8eHUXtjsuEDgi3f356ZE32VD2ssxIH13RCLVZbXMt5h7wHzYiSuVA==", "dependencies": { - "@smithy/protocol-http": "^3.2.2", - "@smithy/querystring-builder": "^2.1.4", - "@smithy/types": "^2.11.0", - "@smithy/util-base64": "^2.2.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/querystring-builder": "^2.0.11", + "@smithy/types": "^2.3.5", + "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-blob-browser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.1.4.tgz", - "integrity": "sha512-bDugS1DortnriGDdp0sqdq7dLI5if8CEOF9rKtpJa1ZYMq6fxOtTId//dlilS5QgUtUs6GHN5aMQVxEjhBzzQA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.11.tgz", + "integrity": "sha512-/6vq/NiH2EN3mWdwcLdjVohP+VCng+ZA1GnlUdx959egsfgIlLWQvCyjnB2ze9Hr6VHV5XEFLLpLQH2dHA6Sgw==", + "peer": true, "dependencies": { - "@smithy/chunked-blob-reader": "^2.1.1", - "@smithy/chunked-blob-reader-native": "^2.1.2", - "@smithy/types": "^2.11.0", + "@smithy/chunked-blob-reader": "^2.0.0", + "@smithy/chunked-blob-reader-native": "^2.0.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.4.tgz", - "integrity": "sha512-uvCcpDLXaTTL0X/9ezF8T8sS77UglTfZVQaUOBiCvR0QydeSyio3t0Hj3QooVdyFsKTubR8gCk/ubLk3vAyDng==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.11.tgz", + "integrity": "sha512-PbleVugN2tbhl1ZoNWVrZ1oTFFas/Hq+s6zGO8B9bv4w/StTriTKA9W+xZJACOj9X7zwfoTLbscM+avCB1KqOQ==", + "peer": true, "dependencies": { - "@smithy/types": "^2.11.0", - "@smithy/util-buffer-from": "^2.1.1", - "@smithy/util-utf8": "^2.2.0", + "@smithy/types": "^2.3.5", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -2425,12 +2787,13 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.1.4.tgz", - "integrity": "sha512-HcDQRs/Fcx7lwAd+/vSW/e7ltdh148D2Pq7XI61CEWcOoQdQ0W8aYBHDRC4zjtXv6hySdmWE+vo3dvdTt7aj8A==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.11.tgz", + "integrity": "sha512-Jn2yl+Dn0kvwKvSavvR1/BFVYa2wIkaJKWeTH48kno89gqHAJxMh1hrtBN6SJ7F8VhodNZTiNOlQVqCSfLheNQ==", + "peer": true, "dependencies": { - "@smithy/types": "^2.11.0", - "@smithy/util-utf8": "^2.2.0", + "@smithy/types": "^2.3.5", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -2438,18 +2801,19 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.4.tgz", - "integrity": "sha512-QzlNBl6jt3nb9jNnE51wTegReVvUdozyMMrFEyb/rc6AzPID1O+qMJYjAAoNw098y0CZVfCpEnoK2+mfBOd8XA==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.11.tgz", + "integrity": "sha512-zazq99ujxYv/NOf9zh7xXbNgzoVLsqE0wle8P/1zU/XdhPi/0zohTPKWUzIxjGdqb5hkkwfBkNkl5H+LE0mvgw==", + "peer": true, "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" } }, "node_modules/@smithy/is-array-buffer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.1.tgz", - "integrity": "sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", "dependencies": { "tslib": "^2.5.0" }, @@ -2458,22 +2822,24 @@ } }, "node_modules/@smithy/md5-js": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.1.4.tgz", - "integrity": "sha512-WHTnnYJPKE7Sy49DogLuox42TnlwD3cQ6TObPD6WFWjKocWIdpEpIvdJHwWUfSFf0JIi8ON8z6ZEhsnyKVCcLQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.11.tgz", + "integrity": "sha512-YBIv+e95qeGvQA05ucwstmTeQ/bUzWgU+nO2Ffmif5awu6IzSR0Jfk3XLYh4mdy7f8DCgsn8qA63u7N9Lu0+5A==", + "peer": true, "dependencies": { - "@smithy/types": "^2.11.0", - "@smithy/util-utf8": "^2.2.0", + "@smithy/types": "^2.3.5", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.4.tgz", - "integrity": "sha512-C6VRwfcr0w9qRFhDGCpWMVhlEIBFlmlPRP1aX9Cv9xDj9SUwlDrNvoV1oP1vjRYuLxCDgovBBynCwwcluS2wLw==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.13.tgz", + "integrity": "sha512-Md2kxWpaec3bXp1oERFPQPBhOXCkGSAF7uc1E+4rkwjgw3/tqAXRtbjbggu67HJdwaif76As8AV6XxbD1HzqTQ==", + "peer": true, "dependencies": { - "@smithy/protocol-http": "^3.2.2", - "@smithy/types": "^2.11.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2481,16 +2847,14 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.6.tgz", - "integrity": "sha512-AsXtUXHPOAS0EGZUSFOsVJvc7p0KL29PGkLxLfycPOcFVLru/oinYB6yvyL73ZZPX2OB8sMYUMrj7eH2kI7V/w==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.11.tgz", + "integrity": "sha512-mCugsvB15up6fqpzUEpMT4CuJmFkEI+KcozA7QMzYguXCaIilyMKsyxgamwmr+o7lo3QdjN0//XLQ9bWFL129g==", "dependencies": { - "@smithy/middleware-serde": "^2.2.1", - "@smithy/node-config-provider": "^2.2.5", - "@smithy/shared-ini-file-loader": "^2.3.5", - "@smithy/types": "^2.11.0", - "@smithy/url-parser": "^2.1.4", - "@smithy/util-middleware": "^2.1.4", + "@smithy/middleware-serde": "^2.0.11", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", + "@smithy/util-middleware": "^2.0.4", "tslib": "^2.5.0" }, "engines": { @@ -2498,17 +2862,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.6.tgz", - "integrity": "sha512-khpSV0NxqMHfa06kfG4WYv+978sVvfTFmn0hIFKKwOXtIxyYtPKiQWFT4nnwZD07fGdYGbtCBu3YALc8SsA5mA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.16.tgz", + "integrity": "sha512-Br5+0yoiMS0ugiOAfJxregzMMGIRCbX4PYo1kDHtLgvkA/d++aHbnHB819m5zOIAMPvPE7AThZgcsoK+WOsUTA==", + "peer": true, "dependencies": { - "@smithy/node-config-provider": "^2.2.5", - "@smithy/protocol-http": "^3.2.2", - "@smithy/service-error-classification": "^2.1.4", - "@smithy/smithy-client": "^2.4.4", - "@smithy/types": "^2.11.0", - "@smithy/util-middleware": "^2.1.4", - "@smithy/util-retry": "^2.1.4", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/protocol-http": "^3.0.7", + "@smithy/service-error-classification": "^2.0.4", + "@smithy/types": "^2.3.5", + "@smithy/util-middleware": "^2.0.4", + "@smithy/util-retry": "^2.0.4", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -2520,16 +2884,17 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "peer": true, "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@smithy/middleware-serde": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.2.1.tgz", - "integrity": "sha512-VAWRWqnNjgccebndpyK94om4ZTYzXLQxUmNCXYzM/3O9MTfQjTNBgtFtQwyIIez6z7LWcCsXmnKVIOE9mLqAHQ==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.11.tgz", + "integrity": "sha512-NuxnjMyf4zQqhwwdh0OTj5RqpnuT6HcH5Xg5GrPijPcKzc2REXVEVK4Yyk8ckj8ez1XSj/bCmJ+oNjmqB02GWA==", "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2537,11 +2902,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.4.tgz", - "integrity": "sha512-Qqs2ba8Ax1rGKOSGJS2JN23fhhox2WMdRuzx0NYHtXzhxbJOIMmz9uQY6Hf4PY8FPteBPp1+h0j5Fmr+oW12sg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.5.tgz", + "integrity": "sha512-bVQU/rZzBY7CbSxIrDTGZYnBWKtIw+PL/cRc9B7etZk1IKSOe0NvKMJyWllfhfhrTeMF6eleCzOihIQympAvPw==", "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2549,13 +2914,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.5.tgz", - "integrity": "sha512-CxPf2CXhjO79IypHJLBATB66Dw6suvr1Yc2ccY39hpR6wdse3pZ3E8RF83SODiNH0Wjmkd0ze4OF8exugEixgA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.1.tgz", + "integrity": "sha512-1lF6s1YWBi1LBu2O30tD3jyTgMtuvk/Z1twzXM4GPYe4dmZix4nNREPJIPOcfFikNU2o0eTYP80+izx5F2jIJA==", + "peer": true, "dependencies": { - "@smithy/property-provider": "^2.1.4", - "@smithy/shared-ini-file-loader": "^2.3.5", - "@smithy/types": "^2.11.0", + "@smithy/property-provider": "^2.0.12", + "@smithy/shared-ini-file-loader": "^2.2.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2563,14 +2929,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.4.2.tgz", - "integrity": "sha512-yrj3c1g145uiK5io+1UPbJAHo8BSGORkBzrmzvAsOmBKb+1p3jmM8ZwNLDH/HTTxVLm9iM5rMszx+iAh1HUC4Q==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.7.tgz", + "integrity": "sha512-PQIKZXlp3awCDn/xNlCSTFE7aYG/5Tx33M05NfQmWYeB5yV1GZZOSz4dXpwiNJYTXb9jPqjl+ueXXkwtEluFFA==", "dependencies": { - "@smithy/abort-controller": "^2.1.4", - "@smithy/protocol-http": "^3.2.2", - "@smithy/querystring-builder": "^2.1.4", - "@smithy/types": "^2.11.0", + "@smithy/abort-controller": "^2.0.11", + "@smithy/protocol-http": "^3.0.7", + "@smithy/querystring-builder": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2578,11 +2944,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.4.tgz", - "integrity": "sha512-nWaY/MImj1BiXZ9WY65h45dcxOx8pl06KYoHxwojDxDL+Q9yLU1YnZpgv8zsHhEftlj9KhePENjQTlNowWVyug==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.12.tgz", + "integrity": "sha512-Un/OvvuQ1Kg8WYtoMCicfsFFuHb/TKL3pCA6ZIo/WvNTJTR94RtoRnL7mY4XkkUAoFMyf6KjcQJ76y1FX7S5rw==", + "peer": true, "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2590,11 +2957,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.2.2.tgz", - "integrity": "sha512-xYBlllOQcOuLoxzhF2u8kRHhIFGQpDeTQj/dBSnw4kfI29WMKL5RnW1m9YjnJAJ49miuIvrkJR+gW5bCQ+Mchw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.7.tgz", + "integrity": "sha512-HnZW8y+r66ntYueCDbLqKwWcMNWW8o3eVpSrHNluwtBJ/EUWfQHRKSiu6vZZtc6PGfPQWgVfucoCE/C3QufMAA==", "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2602,12 +2969,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.4.tgz", - "integrity": "sha512-LXSL0J/nRWvGT+jIj+Fip3j0J1ZmHkUyBFRzg/4SmPNCLeDrtVu7ptKOnTboPsFZu5BxmpYok3kJuQzzRdrhbw==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.11.tgz", + "integrity": "sha512-b4kEbVMxpmfv2VWUITn2otckTi7GlMteZQxi+jlwedoATOGEyrCJPfRcYQJjbCi3fZ2QTfh3PcORvB27+j38Yg==", "dependencies": { - "@smithy/types": "^2.11.0", - "@smithy/util-uri-escape": "^2.1.1", + "@smithy/types": "^2.3.5", + "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -2615,11 +2982,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.4.tgz", - "integrity": "sha512-U2b8olKXgZAs0eRo7Op11jTNmmcC/sqYmsA7vN6A+jkGnDvJlEl7AetUegbBzU8q3D6WzC5rhR/joIy8tXPzIg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.11.tgz", + "integrity": "sha512-YXe7jhi7s3dQ0Fu9dLoY/gLu6NCyy8tBWJL/v2c9i7/RLpHgKT+uT96/OqZkHizCJ4kr0ZD46tzMjql/o60KLg==", "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2627,22 +2994,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.4.tgz", - "integrity": "sha512-JW2Hthy21evnvDmYYk1kItOmbp3X5XI5iqorXgFEunb6hQfSDZ7O1g0Clyxg7k/Pcr9pfLk5xDIR2To/IohlsQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.4.tgz", + "integrity": "sha512-77506l12I5gxTZqBkx3Wb0RqMG81bMYLaVQ+EqIWFwQDJRs5UFeXogKxSKojCmz1wLUziHZQXm03MBzPQiumQw==", + "peer": true, "dependencies": { - "@smithy/types": "^2.11.0" + "@smithy/types": "^2.3.5" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.5.tgz", - "integrity": "sha512-oI99+hOvsM8oAJtxAGmoL/YCcGXtbP0fjPseYGaNmJ4X5xOFTer0KPk7AIH3AL6c5AlYErivEi1X/X78HgTVIw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.0.tgz", + "integrity": "sha512-xFXqs4vAb5BdkzHSRrTapFoaqS4/3m/CGZzdw46fBjYZ0paYuLAoMY60ICCn1FfGirG+PiJ3eWcqJNe4/SkfyA==", + "peer": true, "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2650,17 +3019,18 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.4.tgz", - "integrity": "sha512-gnu9gCn0qQ8IdhNjs6o3QVCXzUs33znSDYwVMWo3nX4dM6j7z9u6FC302ShYyVWfO4MkVMuGCCJ6nl3PcH7V1Q==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.11.tgz", + "integrity": "sha512-EFVU1dT+2s8xi227l1A9O27edT/GNKvyAK6lZnIZ0zhIHq/jSLznvkk15aonGAM1kmhmZBVGpI7Tt0odueZK9A==", + "peer": true, "dependencies": { - "@smithy/eventstream-codec": "^2.1.4", - "@smithy/is-array-buffer": "^2.1.1", - "@smithy/types": "^2.11.0", - "@smithy/util-hex-encoding": "^2.1.1", - "@smithy/util-middleware": "^2.1.4", - "@smithy/util-uri-escape": "^2.1.1", - "@smithy/util-utf8": "^2.2.0", + "@smithy/eventstream-codec": "^2.0.11", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.3.5", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.4", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -2668,15 +3038,13 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.4.4.tgz", - "integrity": "sha512-SNE17wjycPZIJ2P5sv6wMTteV/vQVPdaqQkoK1KeGoWHXx79t3iLhQXj1uqRdlkMUS9pXJrLOAS+VvUSOYwQKw==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.10.tgz", + "integrity": "sha512-2OEmZDiW1Z196QHuQZ5M6cBE8FCSG0H2HADP1G+DY8P3agsvb0YJyfhyKuJbxIQy15tr3eDAK6FOrlbxgKOOew==", "dependencies": { - "@smithy/middleware-endpoint": "^2.4.6", - "@smithy/middleware-stack": "^2.1.4", - "@smithy/protocol-http": "^3.2.2", - "@smithy/types": "^2.11.0", - "@smithy/util-stream": "^2.1.4", + "@smithy/middleware-stack": "^2.0.5", + "@smithy/types": "^2.3.5", + "@smithy/util-stream": "^2.0.15", "tslib": "^2.5.0" }, "engines": { @@ -2684,9 +3052,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.11.0.tgz", - "integrity": "sha512-AR0SXO7FuAskfNhyGfSTThpLRntDI5bOrU0xrpVYU0rZyjl3LBXInZFMTP/NNSd7IS6Ksdtar0QvnrPRIhVrLQ==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.5.tgz", + "integrity": "sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==", "dependencies": { "tslib": "^2.5.0" }, @@ -2695,22 +3063,21 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.4.tgz", - "integrity": "sha512-1hTy6UYRYqOZlHKH2/2NzdNQ4NNmW2Lp0sYYvztKy+dEQuLvZL9w88zCzFQqqFer3DMcscYOshImxkJTGdV+rg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.11.tgz", + "integrity": "sha512-h89yXMCCF+S5k9XIoKltMIWTYj+FcEkU/IIFZ6RtE222fskOTL4Iak6ZRG+ehSvZDt8yKEcxqheTDq7JvvtK3g==", "dependencies": { - "@smithy/querystring-parser": "^2.1.4", - "@smithy/types": "^2.11.0", + "@smithy/querystring-parser": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" } }, "node_modules/@smithy/util-base64": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.2.0.tgz", - "integrity": "sha512-RiQI/Txu0SxCR38Ky5BMEVaFfkNTBjpbxlr2UhhxggSmnsHDQPZJWMtPoXs7TWZaseslIlAWMiHmqRT3AV/P2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", "dependencies": { - "@smithy/util-buffer-from": "^2.1.1", - "@smithy/util-utf8": "^2.2.0", + "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -2718,17 +3085,19 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.1.tgz", - "integrity": "sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "peer": true, "dependencies": { "tslib": "^2.5.0" } }, "node_modules/@smithy/util-body-length-node": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.1.tgz", - "integrity": "sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "peer": true, "dependencies": { "tslib": "^2.5.0" }, @@ -2737,11 +3106,11 @@ } }, "node_modules/@smithy/util-buffer-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.1.tgz", - "integrity": "sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", "dependencies": { - "@smithy/is-array-buffer": "^2.1.1", + "@smithy/is-array-buffer": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -2749,9 +3118,10 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.1.tgz", - "integrity": "sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "peer": true, "dependencies": { "tslib": "^2.5.0" }, @@ -2760,13 +3130,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.6.tgz", - "integrity": "sha512-lM2JMYCilrejfGf8WWnVfrKly3vf+mc5x9TrTpT++qIKP452uWfLqlaUxbz1TkSfhqm8RjrlY22589B9aI8A9w==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.14.tgz", + "integrity": "sha512-NupG7SWUucm3vJrvlpt9jG1XeoPJphjcivgcUUXhDJbUPy4F04LhlTiAhWSzwlCNcF8OJsMvZ/DWbpYD3pselw==", + "peer": true, "dependencies": { - "@smithy/property-provider": "^2.1.4", - "@smithy/smithy-client": "^2.4.4", - "@smithy/types": "^2.11.0", + "@smithy/property-provider": "^2.0.12", + "@smithy/smithy-client": "^2.1.10", + "@smithy/types": "^2.3.5", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -2775,39 +3146,27 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.2.6.tgz", - "integrity": "sha512-UmUbPHbkBJCXRFbq+FPLpVwiFPHj1oPWXJS2f2sy23PtXM94c9X5EceI6JKuKdBty+tzhrAs5JbmPM/HvmDB8Q==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.18.tgz", + "integrity": "sha512-+3jMom/b/Cdp21tDnY4vKu249Al+G/P0HbRbct7/aSZDlROzv1tksaYukon6UUv7uoHn+/McqnsvqZHLlqvQ0g==", + "peer": true, "dependencies": { - "@smithy/config-resolver": "^2.1.5", - "@smithy/credential-provider-imds": "^2.2.6", - "@smithy/node-config-provider": "^2.2.5", - "@smithy/property-provider": "^2.1.4", - "@smithy/smithy-client": "^2.4.4", - "@smithy/types": "^2.11.0", + "@smithy/config-resolver": "^2.0.14", + "@smithy/credential-provider-imds": "^2.0.16", + "@smithy/node-config-provider": "^2.1.1", + "@smithy/property-provider": "^2.0.12", + "@smithy/smithy-client": "^2.1.10", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, - "node_modules/@smithy/util-endpoints": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.5.tgz", - "integrity": "sha512-tgDpaUNsUtRvNiBulKU1VnpoXU1GINMfZZXunRhUXOTBEAufG1Wp79uDXLau2gg1RZ4dpAR6lXCkrmddihCGUg==", - "dependencies": { - "@smithy/node-config-provider": "^2.2.5", - "@smithy/types": "^2.11.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/@smithy/util-hex-encoding": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.1.tgz", - "integrity": "sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", "dependencies": { "tslib": "^2.5.0" }, @@ -2816,11 +3175,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.4.tgz", - "integrity": "sha512-5yYNOgCN0DL0OplME0pthoUR/sCfipnROkbTO7m872o0GHCVNJj5xOFJ143rvHNA54+pIPMLum4z2DhPC2pVGA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.4.tgz", + "integrity": "sha512-Pbu6P4MBwRcjrLgdTR1O4Y3c0sTZn2JdOiJNcgL7EcIStcQodj+6ZTXtbyU/WTEU3MV2NMA10LxFc3AWHZ3+4A==", "dependencies": { - "@smithy/types": "^2.11.0", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2828,12 +3187,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.4.tgz", - "integrity": "sha512-JRZwhA3fhkdenSEYIWatC8oLwt4Bdf2LhHbNQApqb7yFoIGMl4twcYI3BcJZ7YIBZrACA9jGveW6tuCd836XzQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.4.tgz", + "integrity": "sha512-b+n1jBBKc77C1E/zfBe1Zo7S9OXGBiGn55N0apfhZHxPUP/fMH5AhFUUcWaJh7NAnah284M5lGkBKuhnr3yK5w==", + "peer": true, "dependencies": { - "@smithy/service-error-classification": "^2.1.4", - "@smithy/types": "^2.11.0", + "@smithy/service-error-classification": "^2.0.4", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2841,17 +3201,17 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.4.tgz", - "integrity": "sha512-CiWaFPXstoR7v/PGHddFckovkhJb28wgQR7LwIt6RsQCJeRIHvUTVWhXw/Pco6Jm6nz/vfzN9FFdj/JN7RTkxQ==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.15.tgz", + "integrity": "sha512-A/hkYJPH2N5MCWYvky4tTpQihpYAEzqnUfxDyG3L/yMndy/2sLvxnyQal9Opuj1e9FiKSTeMyjnU9xxZGs0mRw==", "dependencies": { - "@smithy/fetch-http-handler": "^2.4.4", - "@smithy/node-http-handler": "^2.4.2", - "@smithy/types": "^2.11.0", - "@smithy/util-base64": "^2.2.0", - "@smithy/util-buffer-from": "^2.1.1", - "@smithy/util-hex-encoding": "^2.1.1", - "@smithy/util-utf8": "^2.2.0", + "@smithy/fetch-http-handler": "^2.2.2", + "@smithy/node-http-handler": "^2.1.7", + "@smithy/types": "^2.3.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -2859,9 +3219,9 @@ } }, "node_modules/@smithy/util-uri-escape": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.1.tgz", - "integrity": "sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", "dependencies": { "tslib": "^2.5.0" }, @@ -2870,11 +3230,11 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.2.0.tgz", - "integrity": "sha512-hBsKr5BqrDrKS8qy+YcV7/htmMGxriA1PREOf/8AGBhHIZnfilVv1Waf1OyKhSbFW15U/8+gcMUQ9/Kk5qwpHQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", "dependencies": { - "@smithy/util-buffer-from": "^2.1.1", + "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -2882,12 +3242,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.1.4.tgz", - "integrity": "sha512-AK17WaC0hx1wR9juAOsQkJ6DjDxBGEf5TrKhpXtNFEn+cVto9Li3MVsdpAO97AF7bhFXSyC8tJA3F4ThhqwCdg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.11.tgz", + "integrity": "sha512-8SJWUl9O1YhjC77EccgltI3q4XZQp3vp9DGEW6o0OdkUcwqm/H4qOLnMkA2n+NDojuM5Iia2jWoCdbluIiG7TA==", + "peer": true, "dependencies": { - "@smithy/abort-controller": "^2.1.4", - "@smithy/types": "^2.11.0", + "@smithy/abort-controller": "^2.0.11", + "@smithy/types": "^2.3.5", "tslib": "^2.5.0" }, "engines": { @@ -2900,9 +3261,9 @@ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, "node_modules/@tanstack/query-core": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.20.1.tgz", - "integrity": "sha512-OONHHYG5vzjob4An+EfzbW7TRyb+sCA0AEgHzUIMlV9NYlF7wIwbla3PUfB3ocnaK1gZyROf0Lux/CBSu0exBQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.12.1.tgz", + "integrity": "sha512-WbZztNmKq0t6QjdNmHzezbi/uifYo9j6e2GLJkodsYaYUlzMbAp91RDyeHkIZrm7EfO4wa6Sm5sxJZm5SPlh6w==", "dev": true, "funding": { "type": "github", @@ -2910,12 +3271,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.20.1.tgz", - "integrity": "sha512-KRkOtJ47tv9B3EXfjHkbPkiFzOzYCOid8BrYBozk0rm9JpDB2xSf71q8w1PRudlQW6QUQIEDI9E6NIMh6AlLUw==", + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.12.2.tgz", + "integrity": "sha512-BeWZu8zVFH20oRc+S/K9ADPgWjEzP/XQCGBNz5IbApUwPQAdwkQYbXODVL5AyAlWiSxhx+P2xlARPBApj2Yrog==", "dev": true, "dependencies": { - "@tanstack/query-core": "5.20.1" + "@tanstack/query-core": "5.12.1" }, "funding": { "type": "github", @@ -2976,7 +3337,6 @@ "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz", "integrity": "sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==", "deprecated": "This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.", - "dev": true, "dependencies": { "classnames": "*" } @@ -2997,14 +3357,12 @@ "node_modules/@types/fuzzy-search": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@types/fuzzy-search/-/fuzzy-search-2.1.5.tgz", - "integrity": "sha512-Yw8OsjhVKbKw83LMDOZ9RXc+N+um48DmZYMrz7QChpHkQuygsc5O40oCL7SfvWgpaaviCx2TbNXYUBwhMtBH5w==", - "dev": true + "integrity": "sha512-Yw8OsjhVKbKw83LMDOZ9RXc+N+um48DmZYMrz7QChpHkQuygsc5O40oCL7SfvWgpaaviCx2TbNXYUBwhMtBH5w==" }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "dev": true, "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -3018,8 +3376,7 @@ "node_modules/@types/memoizee": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/@types/memoizee/-/memoizee-0.4.11.tgz", - "integrity": "sha512-2gyorIBZu8GoDr9pYjROkxWWcFtHCquF7TVbN2I+/OvgZhnIGQS0vX5KJz4lXNKb8XOSfxFOSG5OLru1ESqLUg==", - "dev": true + "integrity": "sha512-2gyorIBZu8GoDr9pYjROkxWWcFtHCquF7TVbN2I+/OvgZhnIGQS0vX5KJz4lXNKb8XOSfxFOSG5OLru1ESqLUg==" }, "node_modules/@types/node": { "version": "20.8.3", @@ -3035,23 +3392,12 @@ "node_modules/@types/prop-types": { "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true - }, - "node_modules/@types/quill": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", - "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", - "dev": true, - "dependencies": { - "parchment": "^1.1.2" - } + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { "version": "17.0.73", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.73.tgz", "integrity": "sha512-6AcjgPIVsXTIsFDgsGW0iQhvg0xb2vt2qAWgXyncnVNRaW9ZXTTwAh7RQoh7PzK1AhjPoGDvUBkdAREih9n5oQ==", - "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3062,7 +3408,6 @@ "version": "7.1.33", "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", - "dev": true, "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -3074,7 +3419,6 @@ "version": "4.4.10", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "dev": true, "dependencies": { "@types/react": "*" } @@ -3083,7 +3427,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.4.tgz", "integrity": "sha512-nhYwlFiYa8M3S+O2T9QO/e1FQUYMr/wJENUdf/O0dhRi1RS/93rjrYQFYdbUqtdFySuhrtnEDX29P6eKOttY+A==", - "dev": true, "dependencies": { "@types/react": "*" } @@ -3092,7 +3435,6 @@ "version": "1.8.8", "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", - "dev": true, "dependencies": { "@types/react": "*" } @@ -3100,8 +3442,7 @@ "node_modules/@types/redux-watch": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@types/redux-watch/-/redux-watch-1.1.2.tgz", - "integrity": "sha512-pooK4MLNYmTyfOU7jy/ZmS2mpbSHkEVpWIcK4/BRbaegOnCB4PYA2JY88vBXE2LVkhPM+du1Z+lVzRiewMz6wg==", - "dev": true + "integrity": "sha512-pooK4MLNYmTyfOU7jy/ZmS2mpbSHkEVpWIcK4/BRbaegOnCB4PYA2JY88vBXE2LVkhPM+du1Z+lVzRiewMz6wg==" }, "node_modules/@types/request": { "version": "2.48.8", @@ -3117,14 +3458,12 @@ "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/shortid": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/shortid/-/shortid-0.0.29.tgz", - "integrity": "sha512-9BCYD9btg2CY4kPcpMQ+vCR8U6V8f/KvixYD5ZbxoWlkhddNF5IeZMVL3p+QFUkg+Hb+kPAG9Jgk4bnnF1v/Fw==", - "dev": true + "integrity": "sha512-9BCYD9btg2CY4kPcpMQ+vCR8U6V8f/KvixYD5ZbxoWlkhddNF5IeZMVL3p+QFUkg+Hb+kPAG9Jgk4bnnF1v/Fw==" }, "node_modules/@types/tough-cookie": { "version": "4.0.2", @@ -3298,12 +3637,43 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/attr-accept": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", - "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1514.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1514.0.tgz", + "integrity": "sha512-ZQE5kHhJozwBB+Zaa21Gglm2pSQVU+8fFZNOn4pr+Kc1scYPlmVBPR3a0w19Vc4HNXPzjApAk2G4xMvzZDktAw==", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/aws-sign2": { @@ -3338,7 +3708,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", @@ -3459,7 +3828,8 @@ "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "peer": true }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -3486,7 +3856,6 @@ "version": "4.22.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3514,6 +3883,16 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3579,7 +3958,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3588,7 +3966,6 @@ "version": "1.0.30001566", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3651,7 +4028,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/chonky/-/chonky-2.3.2.tgz", "integrity": "sha512-ed2u+SEjEPSn8bv/zC0sXfMG/XS6Ydm4J2leLCvRb7a/2BZxKqE1DFETxqfLeJ2OA1IRujvwnuvmJO8ZgyOGyA==", - "dev": true, "dependencies": { "@material-ui/core": "4.11.3", "@reduxjs/toolkit": "^1.5.0", @@ -3694,7 +4070,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/chonky-icon-fontawesome/-/chonky-icon-fontawesome-2.3.2.tgz", "integrity": "sha512-19Duy25JxteIlQJfZKLH7ZSujU1zYBMLKovWDOLlw1EdPlXb9exsfYUUkwfNS+31KpwttfaqnGuN8Gyed/R6UQ==", - "dev": true, "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-brands-svg-icons": "5.13.1", @@ -3712,15 +4087,13 @@ "node_modules/chonky/node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "dev": true + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "node_modules/chonky/node_modules/@material-ui/core": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.3.tgz", "integrity": "sha512-Adt40rGW6Uds+cAyk3pVgcErpzU/qxc7KBR94jFHBYretU4AtWZltYcNsbeMn9tXL86jjVL1kuGcIHsgLgFGRw==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dev": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.11.3", @@ -3758,7 +4131,6 @@ "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dev": true, "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", @@ -3799,7 +4171,6 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "dev": true, "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.3", @@ -3828,7 +4199,6 @@ "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", @@ -3842,17 +4212,10 @@ "react-dom": "^16.8.0 || ^17.0.0" } }, - "node_modules/chonky/node_modules/@react-dnd/shallowequal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz", - "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==", - "dev": true - }, "node_modules/chonky/node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "dev": true, "engines": { "node": ">=6" } @@ -3860,30 +4223,12 @@ "node_modules/chonky/node_modules/csstype": { "version": "2.6.21", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "dev": true - }, - "node_modules/chonky/node_modules/react-dnd": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-11.1.3.tgz", - "integrity": "sha512-8rtzzT8iwHgdSC89VktwhqdKKtfXaAyC4wiqp0SywpHG12TTLvfOoL6xNEIUWXwIEWu+CFfDn4GZJyynCEuHIQ==", - "dev": true, - "dependencies": { - "@react-dnd/shallowequal": "^2.0.0", - "@types/hoist-non-react-statics": "^3.3.1", - "dnd-core": "^11.1.3", - "hoist-non-react-statics": "^3.3.0" - }, - "peerDependencies": { - "react": ">= 16.9.0", - "react-dom": ">= 16.9.0" - } + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, "node_modules/chonky/node_modules/react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dev": true, "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -3897,14 +4242,12 @@ "node_modules/chonky/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/chonky/node_modules/scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dev": true, "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -3922,8 +4265,7 @@ "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", - "dev": true + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/cliui": { "version": "8.0.1", @@ -3939,19 +4281,10 @@ "node": ">=12" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", "dev": true, "engines": { "node": ">=6" @@ -4157,26 +4490,6 @@ "node": ">= 0.6" } }, - "node_modules/cookie-parser": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", - "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", - "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-parser/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -4219,7 +4532,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "dev": true, "engines": { "node": ">=4" } @@ -4228,7 +4540,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/css-jss/-/css-jss-10.10.0.tgz", "integrity": "sha512-YyMIS/LsSKEGXEaVJdjonWe18p4vXLo8CMA4FrW/kcaEyqdIGKCFXao31gbJddXEdIxSXFFURWrenBJPlKTgAA==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "^10.10.0", @@ -4239,7 +4550,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "dev": true, "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -4250,17 +4560,15 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "dev": true, "dependencies": { "@babel/runtime": "^7.8.3", "is-in-browser": "^1.0.2" } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/dashdash": { "version": "1.14.1", @@ -4305,66 +4613,14 @@ } } }, - "node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dev": true, - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4407,7 +4663,6 @@ "version": "11.1.3", "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-11.1.3.tgz", "integrity": "sha512-QugF55dNW+h+vzxVJ/LSJeTeUw9MCJ2cllhmVThVPEtF16ooBkxj0WBE5RB+AceFxMFo1rO6bJKXtqKl+JNnyA==", - "dev": true, "dependencies": { "@react-dnd/asap": "^4.0.0", "@react-dnd/invariant": "^2.0.0", @@ -4418,7 +4673,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dev": true, "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -4441,8 +4695,7 @@ "node_modules/electron-to-chromium": { "version": "1.4.608", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.608.tgz", - "integrity": "sha512-J2f/3iIIm3Mo0npneITZ2UPe4B1bg8fTNrFjD8715F/k1BvbviRuqYGkET1PgprrczXYTHFvotbBOmUp6KE0uA==", - "dev": true + "integrity": "sha512-J2f/3iIIm3Mo0npneITZ2UPe4B1bg8fTNrFjD8715F/k1BvbviRuqYGkET1PgprrczXYTHFvotbBOmUp6KE0uA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -4556,7 +4809,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -4586,17 +4838,18 @@ "node": ">= 0.6" } }, - "node_modules/eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", - "dev": true + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } }, "node_modules/exact-trie": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/exact-trie/-/exact-trie-1.0.13.tgz", - "integrity": "sha512-2N0sx9jMlzZxRmSOpFKmcuaPcLXYLGRp69DohigW5E7R/uo9i6S1zJ/PuAckf70099am1ts7YBRMLO8Nr8AJLg==", - "dev": true + "integrity": "sha512-2N0sx9jMlzZxRmSOpFKmcuaPcLXYLGRp69DohigW5E7R/uo9i6S1zJ/PuAckf70099am1ts7YBRMLO8Nr8AJLg==" }, "node_modules/express": { "version": "4.18.2", @@ -4639,26 +4892,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express-bearer-token": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/express-bearer-token/-/express-bearer-token-2.4.0.tgz", - "integrity": "sha512-2+kRZT2xo+pmmvSY7Ma5FzxTJpO3kGaPCEXPbAm3GaoZ/z6FE4K6L7cvs1AUZwY2xkk15PcQw7t4dWjsl5rdJw==", - "dependencies": { - "cookie": "^0.3.1", - "cookie-parser": "^1.4.4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/express-bearer-token/node_modules/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4690,12 +4923,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-diff": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", - "dev": true - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4704,8 +4931,7 @@ "node_modules/fast-sort": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/fast-sort/-/fast-sort-2.2.0.tgz", - "integrity": "sha512-W7zqnn2zsYoQA87FKmYtgOsbJohOrh7XrtZrCVHN5XZKqTBTv5UG+rSS3+iWbg/nepRQUOu+wnas8BwtK8kiCg==", - "dev": true + "integrity": "sha512-W7zqnn2zsYoQA87FKmYtgOsbJohOrh7XrtZrCVHN5XZKqTBTv5UG+rSS3+iWbg/nepRQUOu+wnas8BwtK8kiCg==" }, "node_modules/fast-xml-parser": { "version": "4.2.5", @@ -4721,6 +4947,7 @@ "url": "https://github.com/sponsors/NaturalIntelligence" } ], + "peer": true, "dependencies": { "strnum": "^1.0.5" }, @@ -4739,17 +4966,6 @@ "node": ">= 0.4.0" } }, - "node_modules/file-selector": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", - "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", @@ -4762,7 +4978,6 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.4.0.tgz", "integrity": "sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==", - "dev": true, "engines": { "node": ">= 0.4.0" } @@ -4815,6 +5030,14 @@ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -4884,28 +5107,29 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/fuzzy-search": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/fuzzy-search/-/fuzzy-search-3.2.1.tgz", - "integrity": "sha512-vAcPiyomt1ioKAsAL2uxSABHJ4Ju/e4UeDM+g1OlR0vV4YhLGMNsdLNvZTpEDY4JCSt0E4hASCNM5t2ETtsbyg==", - "dev": true + "integrity": "sha512-vAcPiyomt1ioKAsAL2uxSABHJ4Ju/e4UeDM+g1OlR0vV4YhLGMNsdLNvZTpEDY4JCSt0E4hASCNM5t2ETtsbyg==" }, "node_modules/gauge": { "version": "3.0.2", @@ -4930,7 +5154,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -4945,14 +5168,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5001,7 +5223,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } @@ -5010,7 +5231,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -5043,7 +5263,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -5055,34 +5274,10 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -5098,7 +5293,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -5114,22 +5308,10 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, "dependencies": { "react-is": "^16.7.0" } @@ -5137,14 +5319,12 @@ "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/hotkeys-js": { "version": "3.13.2", "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.13.2.tgz", "integrity": "sha512-SXd+x90nhOdo5s+DZNPtrvXs0ZahQLXT0tWQ68bzjxCNUZ7eV4ZlNqjHLi3Kt2URpR8EBJOB2dBLdNfwIeql1A==", - "dev": true, "funding": { "url": "https://jaywcjlove.github.io/#/sponsor" } @@ -5198,8 +5378,7 @@ "node_modules/hyphenate-style-name": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==", - "dev": true + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, "node_modules/iconv-lite": { "version": "0.4.24", @@ -5227,7 +5406,6 @@ "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -5267,7 +5445,6 @@ "version": "9.13.0", "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-9.13.0.tgz", "integrity": "sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==", - "dev": true, "dependencies": { "@formatjs/ecma402-abstract": "1.11.4", "@formatjs/fast-memoize": "1.2.1", @@ -5287,7 +5464,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5317,6 +5493,17 @@ "node": ">=8" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", @@ -5329,21 +5516,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5361,6 +5533,20 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5376,8 +5562,7 @@ "node_modules/is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", - "dev": true + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" }, "node_modules/is-number": { "version": "7.0.0", @@ -5388,14 +5573,12 @@ "node": ">=0.12.0" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -5427,6 +5610,14 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/jose": { "version": "4.13.1", "resolved": "https://registry.npmjs.org/jose/-/jose-4.13.1.tgz", @@ -5461,7 +5652,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -5494,7 +5684,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -5528,7 +5717,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "csstype": "^3.0.2", @@ -5544,7 +5732,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", @@ -5555,7 +5742,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-compose/-/jss-plugin-compose-10.10.0.tgz", "integrity": "sha512-F5kgtWpI2XfZ3Z8eP78tZEYFdgTIbpA/TMuX3a8vwrNolYtN1N4qJR/Ob0LAsqIwCMLojtxN7c7Oo/+Vz6THow==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -5566,7 +5752,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -5576,7 +5761,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-expand/-/jss-plugin-expand-10.10.0.tgz", "integrity": "sha512-ymT62W2OyDxBxr7A6JR87vVX9vTq2ep5jZLIdUSusfBIEENLdkkc0lL/Xaq8W9s3opUq7R0sZQpzRWELrfVYzA==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -5586,7 +5770,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-extend/-/jss-plugin-extend-10.10.0.tgz", "integrity": "sha512-sKYrcMfr4xxigmIwqTjxNcHwXJIfvhvjTNxF+Tbc1NmNdyspGW47Ey6sGH8BcQ4FFQhLXctpWCQSpDwdNmXSwg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -5597,7 +5780,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -5607,7 +5789,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -5618,7 +5799,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" @@ -5628,7 +5808,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -5639,7 +5818,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.10.0.tgz", "integrity": "sha512-ZLMaYrR3QE+vD7nl3oNXuj79VZl9Kp8/u6A1IbTPDcuOu8b56cFdWRZNZ0vNr8jHewooEeq2doy8Oxtymr2ZPA==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -5650,7 +5828,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-template/-/jss-plugin-template-10.10.0.tgz", "integrity": "sha512-ocXZBIOJOA+jISPdsgkTs8wwpK6UbsvtZK5JI7VUggTD6LWKbtoxUzadd2TpfF+lEtlhUmMsCkTRNkITdPKa6w==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -5661,7 +5838,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "css-vendor": "^2.0.8", @@ -5672,7 +5848,6 @@ "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-10.10.0.tgz", "integrity": "sha512-GL175Wt2FGhjE+f+Y3aWh+JioL06/QWFgZp53CbNNq6ZkVU0TDplD8Bxm9KnkotAYn3FlplNqoW5CjyLXcoJ7Q==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", @@ -5699,8 +5874,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -5717,7 +5891,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -5747,8 +5920,7 @@ "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" }, "node_modules/merge-descriptors": { "version": "1.0.1", @@ -5860,9 +6032,9 @@ } }, "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } @@ -5970,13 +6142,12 @@ "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nodemon": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.3.tgz", - "integrity": "sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", + "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", "dev": true, "dependencies": { "chokidar": "^3.5.2", @@ -6102,36 +6273,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object-path": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "dev": true, "engines": { "node": ">= 10.12.0" } @@ -6202,12 +6347,6 @@ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" }, - "node_modules/parchment": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", - "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", - "dev": true - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6387,14 +6526,12 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -6405,13 +6542,12 @@ "node_modules/popper.js": { "version": "1.16.1-lts", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", - "dev": true + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "dev": true, "funding": [ { @@ -6439,8 +6575,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/postgres-array": { "version": "2.0.0", @@ -6493,9 +6628,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -6572,6 +6707,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6591,34 +6735,6 @@ } ] }, - "node_modules/quill": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", - "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", - "dev": true, - "dependencies": { - "clone": "^2.1.1", - "deep-equal": "^1.0.1", - "eventemitter3": "^2.0.3", - "extend": "^3.0.2", - "parchment": "^1.1.4", - "quill-delta": "^3.6.2" - } - }, - "node_modules/quill-delta": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", - "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", - "dev": true, - "dependencies": { - "deep-equal": "^1.0.1", - "extend": "^3.0.2", - "fast-diff": "1.1.2" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -6663,14 +6779,27 @@ "node_modules/react-display-name": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz", - "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==", - "dev": true + "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==" + }, + "node_modules/react-dnd": { + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-11.1.3.tgz", + "integrity": "sha512-8rtzzT8iwHgdSC89VktwhqdKKtfXaAyC4wiqp0SywpHG12TTLvfOoL6xNEIUWXwIEWu+CFfDn4GZJyynCEuHIQ==", + "dependencies": { + "@react-dnd/shallowequal": "^2.0.0", + "@types/hoist-non-react-statics": "^3.3.1", + "dnd-core": "^11.1.3", + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "react": ">= 16.9.0", + "react-dom": ">= 16.9.0" + } }, "node_modules/react-dnd-html5-backend": { "version": "11.1.3", "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-11.1.3.tgz", "integrity": "sha512-/1FjNlJbW/ivkUxlxQd7o3trA5DE33QiRZgxent3zKme8DwF4Nbw3OFVhTRFGaYhHFNL1rZt6Rdj1D78BjnNLw==", - "dev": true, "dependencies": { "dnd-core": "^11.1.3" } @@ -6679,7 +6808,6 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -6688,27 +6816,10 @@ "react": "^18.2.0" } }, - "node_modules/react-dropzone": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", - "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", - "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "react": ">= 16.8 || 18.0.0" - } - }, "node_modules/react-intl": { "version": "5.25.1", "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-5.25.1.tgz", "integrity": "sha512-pkjdQDvpJROoXLMltkP/5mZb0/XqrqLoPGKUCfbdkP8m6U9xbK40K51Wu+a4aQqTEvEK5lHBk0fWzUV72SJ3Hg==", - "dev": true, "dependencies": { "@formatjs/ecma402-abstract": "1.11.4", "@formatjs/icu-messageformat-parser": "2.1.0", @@ -6734,14 +6845,12 @@ "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react-jss": { "version": "10.10.0", "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-10.10.0.tgz", "integrity": "sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ==", - "dev": true, "dependencies": { "@babel/runtime": "^7.3.1", "@emotion/is-prop-valid": "^0.7.3", @@ -6763,7 +6872,6 @@ "version": "0.7.3", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz", "integrity": "sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==", - "dev": true, "dependencies": { "@emotion/memoize": "0.7.1" } @@ -6771,29 +6879,12 @@ "node_modules/react-jss/node_modules/@emotion/memoize": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz", - "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==", - "dev": true - }, - "node_modules/react-quill": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", - "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", - "dev": true, - "dependencies": { - "@types/quill": "^1.3.10", - "lodash": "^4.17.4", - "quill": "^1.3.7" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } + "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==" }, "node_modules/react-redux": { "version": "7.2.9", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", - "dev": true, "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -6817,8 +6908,7 @@ "node_modules/react-redux/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/react-refresh": { "version": "0.14.0", @@ -6830,12 +6920,12 @@ } }, "node_modules/react-router": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz", - "integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==", + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.20.1.tgz", + "integrity": "sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==", "dev": true, "dependencies": { - "@remix-run/router": "1.15.0" + "@remix-run/router": "1.13.1" }, "engines": { "node": ">=14.0.0" @@ -6845,13 +6935,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz", - "integrity": "sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==", + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.1.tgz", + "integrity": "sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==", "dev": true, "dependencies": { - "@remix-run/router": "1.15.0", - "react-router": "6.22.0" + "@remix-run/router": "1.13.1", + "react-router": "6.20.1" }, "engines": { "node": ">=14.0.0" @@ -6861,24 +6951,10 @@ "react-dom": ">=16.8" } }, - "node_modules/react-toastify": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.4.tgz", - "integrity": "sha512-etR3RgueY8pe88SA67wLm8rJmL1h+CLqUGHuAoNsseW35oTGJEri6eBTyaXnFKNQ80v/eO10hBYLgz036XRGgA==", - "dev": true, - "dependencies": { - "clsx": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dev": true, "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -6894,7 +6970,6 @@ "version": "1.0.20", "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.20.tgz", "integrity": "sha512-OdIyHwj4S4wyhbKHOKM1wLSj/UDXm839Z3Cvfg2a9j+He6yDa6i5p0qQvEiCnyQlGO/HyfSnigQwuxvYalaAXA==", - "dev": true, "peerDependencies": { "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" @@ -6904,7 +6979,6 @@ "version": "1.8.10", "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", "integrity": "sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" @@ -6946,7 +7020,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dev": true, "dependencies": { "@babel/runtime": "^7.9.2" } @@ -6955,7 +7028,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", - "dev": true, "peerDependencies": { "redux": "^4" } @@ -6964,7 +7036,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/redux-watch/-/redux-watch-1.2.0.tgz", "integrity": "sha512-Ws4Q+e5zFGMyy1H709c1Ws8apSd6MqoJRIzBDHbI4nikome/IZWVTYXdQNz+VJxPjyX/h2E+lYEo41fXgjCF8g==", - "dev": true, "dependencies": { "object-path": "^0.11.5" } @@ -6972,25 +7043,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/request": { "version": "2.88.2", @@ -7065,8 +7118,7 @@ "node_modules/reselect": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", - "dev": true + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, "node_modules/resolve": { "version": "1.22.4", @@ -7197,11 +7249,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0" } @@ -7274,20 +7330,6 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7296,14 +7338,12 @@ "node_modules/shallow-equal": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", - "dev": true + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, "node_modules/shell-quote": { "version": "1.8.1", @@ -7319,7 +7359,6 @@ "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, "dependencies": { "nanoid": "^2.1.0" } @@ -7327,8 +7366,7 @@ "node_modules/shortid/node_modules/nanoid": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", - "dev": true + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" }, "node_modules/side-channel": { "version": "1.0.4", @@ -7394,9 +7432,9 @@ "dev": true }, "node_modules/socket.io": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", - "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -7419,9 +7457,9 @@ } }, "node_modules/socket.io-client": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.4.tgz", - "integrity": "sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", + "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -7585,13 +7623,13 @@ "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "peer": true }, "node_modules/styled-components": { "version": "5.3.11", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", - "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.0.0", "@babel/traverse": "^7.4.5", @@ -7620,8 +7658,7 @@ "node_modules/styled-components/node_modules/@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "dev": true + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/stylis": { "version": "4.2.0", @@ -7633,7 +7670,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -7657,7 +7693,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7687,7 +7722,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/theming/-/theming-3.3.0.tgz", "integrity": "sha512-u6l4qTJRDaWZsqa8JugaNt7Xd8PPl9+gonZaIe28vAhqgHMIG/DOyFPqiKN/gQLQYj05tHv+YQdNILL4zoiAVA==", - "dev": true, "dependencies": { "hoist-non-react-statics": "^3.3.0", "prop-types": "^15.5.8", @@ -7704,14 +7738,12 @@ "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "dev": true + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -7777,8 +7809,7 @@ "node_modules/tsdef": { "version": "0.0.14", "resolved": "https://registry.npmjs.org/tsdef/-/tsdef-0.0.14.tgz", - "integrity": "sha512-UjMD4XKRWWFlFBfwKVQmGFT5YzW/ZaF8x6KpCDf92u9wgKeha/go3FU0e5WqDjXsCOdfiavCkfwfVHNDxRDGMA==", - "dev": true + "integrity": "sha512-UjMD4XKRWWFlFBfwKVQmGFT5YzW/ZaF8x6KpCDf92u9wgKeha/go3FU0e5WqDjXsCOdfiavCkfwfVHNDxRDGMA==" }, "node_modules/tslib": { "version": "2.5.0", @@ -7841,7 +7872,6 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -7875,6 +7905,32 @@ "punycode": "^2.1.0" } }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -7922,13 +7978,13 @@ } }, "node_modules/vite": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.1.tgz", - "integrity": "sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz", + "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==", "dev": true, "dependencies": { "esbuild": "^0.19.3", - "postcss": "^8.4.35", + "postcss": "^8.4.32", "rollup": "^4.2.0" }, "bin": { @@ -7990,6 +8046,24 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -8040,6 +8114,26 @@ } } }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlhttprequest-ssl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", @@ -8069,8 +8163,7 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index 3332706..62e7f28 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "minecluster", - "version": "0.0.1-alpha.1", + "version": "0.0.1-alpha.0", "description": "Minecraft Server management using Kubernetes", "type": "module", "scripts": { @@ -8,7 +8,7 @@ "start": "node dist/app.js", "dev:server": "nodemon dist/app.js", "dev:react": "vite", - "lint": "npx prettier -w src lib vite.config.js", + "kub": "nodemon lib/k8s.js", "start:dev": "concurrently -k \"MCL_DEV_PORT=52025 npm run dev:server\" \" MCL_VITE_DEV_PORT=52000 MCL_VITE_BACKEND_URL=http://localhost:52025 npm run dev:react\" -n s,v -p -c green,yellow", "start:dev:garden": "concurrently -k \"npm run dev:server\" \"npm run dev:react\" -n s,v -p -c green,yellow" }, @@ -22,44 +22,39 @@ "author": "Dunemask", "license": "LGPL-2.1", "devDependencies": { - "@emotion/react": "^11.11.3", + "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@mui/icons-material": "^5.15.9", - "@mui/material": "^5.15.9", - "@tanstack/react-query": "^5.20.1", + "@mui/icons-material": "^5.14.19", + "@mui/material": "^5.14.20", + "@tanstack/react-query": "^5.12.2", "@vitejs/plugin-react": "^4.2.1", - "chonky": "^2.3.2", - "chonky-icon-fontawesome": "^2.3.2", "concurrently": "^8.2.2", - "nodemon": "^3.0.3", - "prettier": "^3.2.5", + "nodemon": "^3.0.2", + "prettier": "^3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-quill": "^2.0.0", - "react-router-dom": "^6.22.0", - "react-toastify": "^10.0.4", - "socket.io-client": "^4.7.4", - "vite": "^5.1.1" + "react-router-dom": "^6.20.1", + "socket.io-client": "^4.7.2", + "vite": "^5.0.7" }, "dependencies": { - "@aws-sdk/client-s3": "^3.529.1", - "@aws-sdk/s3-request-presigner": "^3.529.1", "@kubernetes/client-node": "^0.20.0", + "aws-sdk": "^2.1514.0", "basic-ftp": "^5.0.4", "bcrypt": "^5.1.1", "chalk": "^5.3.0", + "chonky": "^2.3.2", + "chonky-icon-fontawesome": "^2.3.2", "express": "^4.18.2", - "express-bearer-token": "^2.4.0", "figlet": "^1.7.0", "js-yaml": "^4.1.0", - "moment": "^2.30.1", + "moment": "^2.29.4", "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", "pg-promise": "^11.5.4", "postgres-migrations": "^5.3.0", "rcon-client": "^4.2.4", - "react-dropzone": "^14.2.3", - "socket.io": "^4.7.4", + "socket.io": "^4.7.2", "uuid": "^9.0.1" } } diff --git a/public/icons/android-chrome-192x192.png b/public/icons/android-chrome-192x192.png deleted file mode 100644 index 5f91c4a..0000000 Binary files a/public/icons/android-chrome-192x192.png and /dev/null differ diff --git a/public/icons/android-chrome-512x512.png b/public/icons/android-chrome-512x512.png deleted file mode 100644 index ffad351..0000000 Binary files a/public/icons/android-chrome-512x512.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-120x120-precomposed.png b/public/icons/apple-touch-icon-120x120-precomposed.png deleted file mode 100644 index 1fae26b..0000000 Binary files a/public/icons/apple-touch-icon-120x120-precomposed.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-120x120.png b/public/icons/apple-touch-icon-120x120.png deleted file mode 100644 index 11e2054..0000000 Binary files a/public/icons/apple-touch-icon-120x120.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-152x152-precomposed.png b/public/icons/apple-touch-icon-152x152-precomposed.png deleted file mode 100644 index cbf2337..0000000 Binary files a/public/icons/apple-touch-icon-152x152-precomposed.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-152x152.png b/public/icons/apple-touch-icon-152x152.png deleted file mode 100644 index e6b3d43..0000000 Binary files a/public/icons/apple-touch-icon-152x152.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-180x180-precomposed.png b/public/icons/apple-touch-icon-180x180-precomposed.png deleted file mode 100644 index b3fc31a..0000000 Binary files a/public/icons/apple-touch-icon-180x180-precomposed.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-180x180.png b/public/icons/apple-touch-icon-180x180.png deleted file mode 100644 index 952340d..0000000 Binary files a/public/icons/apple-touch-icon-180x180.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-60x60-precomposed.png b/public/icons/apple-touch-icon-60x60-precomposed.png deleted file mode 100644 index 26178b4..0000000 Binary files a/public/icons/apple-touch-icon-60x60-precomposed.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-60x60.png b/public/icons/apple-touch-icon-60x60.png deleted file mode 100644 index c23ddf3..0000000 Binary files a/public/icons/apple-touch-icon-60x60.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-76x76-precomposed.png b/public/icons/apple-touch-icon-76x76-precomposed.png deleted file mode 100644 index 1e0a2f8..0000000 Binary files a/public/icons/apple-touch-icon-76x76-precomposed.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-76x76.png b/public/icons/apple-touch-icon-76x76.png deleted file mode 100644 index 954eb27..0000000 Binary files a/public/icons/apple-touch-icon-76x76.png and /dev/null differ diff --git a/public/icons/apple-touch-icon-precomposed.png b/public/icons/apple-touch-icon-precomposed.png deleted file mode 100644 index b3fc31a..0000000 Binary files a/public/icons/apple-touch-icon-precomposed.png and /dev/null differ diff --git a/public/icons/apple-touch-icon.png b/public/icons/apple-touch-icon.png deleted file mode 100644 index 952340d..0000000 Binary files a/public/icons/apple-touch-icon.png and /dev/null differ diff --git a/public/icons/browserconfig.xml b/public/icons/browserconfig.xml deleted file mode 100644 index 0502cdd..0000000 --- a/public/icons/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #00aba9 - - - diff --git a/public/icons/favicon-16x16.png b/public/icons/favicon-16x16.png deleted file mode 100644 index 821bb9f..0000000 Binary files a/public/icons/favicon-16x16.png and /dev/null differ diff --git a/public/icons/favicon-32x32.png b/public/icons/favicon-32x32.png deleted file mode 100644 index 2e5456d..0000000 Binary files a/public/icons/favicon-32x32.png and /dev/null differ diff --git a/public/icons/favicon.ico b/public/icons/favicon.ico deleted file mode 100644 index a19896d..0000000 Binary files a/public/icons/favicon.ico and /dev/null differ diff --git a/public/icons/mstile-150x150.png b/public/icons/mstile-150x150.png deleted file mode 100644 index f04e6ad..0000000 Binary files a/public/icons/mstile-150x150.png and /dev/null differ diff --git a/public/icons/safari-pinned-tab.svg b/public/icons/safari-pinned-tab.svg deleted file mode 100644 index ad6d511..0000000 --- a/public/icons/safari-pinned-tab.svg +++ /dev/null @@ -1,252 +0,0 @@ - - - - -Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - - - - - - - - - - - - - - diff --git a/public/icons/site.webmanifest b/public/icons/site.webmanifest deleted file mode 100644 index c008ad1..0000000 --- a/public/icons/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "Minecluster", - "short_name": "Minecluster", - "icons": [ - { - "src": "/icons/android-chrome-192x192.png?v=feb4-24-mineblock", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/icons/android-chrome-512x512.png?v=feb4-24-mineblock", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#249c6b", - "background_color": "#249c6b", - "display": "standalone" -} diff --git a/src/components/files/ChonkyStyledFileBrowser.jsx b/src/components/files/ChonkyStyledFileBrowser.jsx new file mode 100644 index 0000000..3273684 --- /dev/null +++ b/src/components/files/ChonkyStyledFileBrowser.jsx @@ -0,0 +1,42 @@ +// ChonkyFullFileBrowser.tsx +import { forwardRef, memo } from "react"; +import { + StylesProvider, + createGenerateClassName, +} from "@material-ui/core/styles"; + +import { + FileBrowser, + FileList, + FileContextMenu, + FileNavbar, + FileToolbar, + setChonkyDefaults, + FileBrowserHandle, + FileBrowserProps, +} from "chonky"; + +import { ChonkyIconFA } from "chonky-icon-fontawesome"; + +setChonkyDefaults({ iconComponent: ChonkyIconFA }); + +const muiJSSClassNameGenerator = createGenerateClassName({ + // Seed property is used to add a prefix classes generated by material ui. + seed: "chonky", +}); + +export default memo( + forwardRef((props, ref) => { + const { onScroll } = props; + return ( + + + + + + + + + ); + }), +); diff --git a/src/components/files/FilePreview.jsx b/src/components/files/FilePreview.jsx deleted file mode 100644 index c6e1002..0000000 --- a/src/components/files/FilePreview.jsx +++ /dev/null @@ -1,103 +0,0 @@ -import { useState, useEffect } from "react"; -import useMediaQuery from "@mui/material/useMediaQuery"; -import { useTheme } from "@mui/material/styles"; -import Button from "@mui/material/Button"; -import DialogTitle from "@mui/material/DialogTitle"; -import DialogContent from "@mui/material/DialogContent"; -import DialogActions from "@mui/material/DialogActions"; -import Dialog from "@mui/material/Dialog"; -import Toolbar from "@mui/material/Toolbar"; -import TextEditor from "./TextEditor.jsx"; -import { cairoAuthHeader } from "@mcl/util/auth.js"; - -const textFileTypes = [ - "properties", - "txt", - "yaml", - "yml", - "json", - "env", - "toml", - "tml", - "text", -]; -const imageFileTypes = ["png", "jpeg", "jpg"]; - -export const supportedFileTypes = [...textFileTypes, ...imageFileTypes]; - -export function useFilePreview(isOpen = false) { - const [open, setOpen] = useState(isOpen); - const dialogToggle = () => setOpen(!open); - return [open, dialogToggle]; -} - -export default function FilePreview(props) { - const [fileText, setFileText] = useState(); - const [modifiedText, setModifiedText] = useState(); - const theme = useTheme(); - const fullScreen = useMediaQuery(theme.breakpoints.down("md")); - - const { previewData, open, dialogToggle, server: serverId } = props; - const { fileData, name, filePath } = previewData ?? {}; - const ext = name ? name.split(".").pop() : null; - const isTextFile = textFileTypes.includes(ext); - - useEffect(() => { - onPreviewChange(); - }, [fileData]); - const editorChange = (v) => setModifiedText(v); - - async function onPreviewChange() { - if (!isTextFile) return; - const text = await fileData.text(); - setFileText(text); - } - - async function onSave() { - if (!isTextFile) return; - const formData = new FormData(); - const blob = new Blob([modifiedText], { type: "plain/text" }); - formData.append("file", blob, name); - formData.append("id", serverId); - formData.append("path", filePath); - await fetch("/api/files/upload", { - method: "POST", - body: formData, - headers: cairoAuthHeader(), - }); - dialogToggle(); - } - - return ( - - - {name} - - {isTextFile && } - - - - - - - ); -} diff --git a/src/components/files/MineclusterFiles.jsx b/src/components/files/MineclusterFiles.jsx index eb48283..6c0079d 100644 --- a/src/components/files/MineclusterFiles.jsx +++ b/src/components/files/MineclusterFiles.jsx @@ -1,7 +1,5 @@ import { useState, useEffect, useMemo, useRef } from "react"; import Box from "@mui/material/Box"; -import Dropzone from "react-dropzone"; - import { FileBrowser, FileContextMenu, @@ -18,12 +16,9 @@ import { createServerFolder, deleteServerItem, getServerItem, - moveServerItems, - previewServerItem, } from "@mcl/queries"; -import { cairoAuthHeader } from "@mcl/util/auth.js"; -import { supportedFileTypes } from "./FilePreview.jsx"; +import "@mcl/css/header.css"; export default function MineclusterFiles(props) { // Chonky configuration @@ -35,63 +30,46 @@ export default function MineclusterFiles(props) { ChonkyActions.DownloadFiles, ChonkyActions.CopyFiles, ChonkyActions.DeleteFiles, - ChonkyActions.MoveFiles, ], [], ); - const { server: serverId, changePreview } = props; + const { server: serverName } = props; const inputRef = useRef(null); const [dirStack, setDirStack] = useState(["."]); const [files, setFiles] = useState([]); - const updateFiles = () => { - const dir = dirStack.join("/"); - getServerFiles(serverId, dir) - .then((f) => { - const files = f.map((fi) => ({ ...fi, id: `${dir}/${fi.name}` })); - setFiles(files ?? []); - }) - .catch(() => - console.error( - "Couldn't update files, server likely hasn't started yet", - ), - ); - }; + const updateFiles = () => + getServerFiles(serverName, dirStack.join("/")).then((f) => + setFiles(f ?? []), + ); useEffect(() => { updateFiles(); }, [dirStack]); const getFolderChain = () => { - if (dirStack.length === 1) return [{ id: "./", name: "Home", isDir: true }]; - return dirStack.map((d, i) => ({ - id: `${dirStack.slice(0, i + 1).join("/")}`, - name: i === 0 ? "Home" : d, - isDir: true, - })); + if (dirStack.length === 1) return [{ id: "home", name: "/", isDir: true }]; + return dirStack.map((d, i) => ({ id: `${d}-${i}`, name: d, isDir: true })); }; const openParentFolder = () => setDirStack(dirStack.slice(0, -1)); - function openItem(payload) { + function openFolder(payload) { const { targetFile: file } = payload; - if (file && file.isDir) return setDirStack(file.id.split("/")); - if (!file || file.isDir) return; // Ensure file exists or is dir - if (supportedFileTypes.includes(file.name.split(".").pop())) - return previewFile(file); - return downloadFiles([file]); + if (!file || !file.isDir) return; + setDirStack([...dirStack, file.name]); } function createFolder() { const name = prompt("What is the name of the new folder?"); const path = [...dirStack, name].join("/"); - createServerFolder(serverId, path).then(updateFiles); + createServerFolder(serverName, path).then(updateFiles); } function deleteItems(files) { Promise.all( files.map((f) => - deleteServerItem(serverId, [...dirStack, f.name].join("/"), f.isDir), + deleteServerItem(serverName, [...dirStack, f.name].join("/"), f.isDir), ), ) .catch((e) => console.error("Error deleting some files!", e)) @@ -101,58 +79,35 @@ export default function MineclusterFiles(props) { function uploadFileSelection(e) { if (!e.target.files || e.target.files.length === 0) return; const { files } = e.target; - uploadMultipleFiles(files); - } - - function uploadMultipleFiles(files) { Promise.all([...files].map((f) => uploadFile(f))) .catch((e) => console.log("Error uploading a file", e)) .then(updateFiles); } async function uploadFile(file) { - const filePath = file.path.startsWith("/") ? file.path : `/${file.path}`; const formData = new FormData(); formData.append("file", file); - formData.append("id", serverId); - const path = `${[...dirStack].join("/")}${filePath}`; - formData.append("path", path); + formData.append("name", serverName); + formData.append("path", [...dirStack, name].join("/")); await fetch("/api/files/upload", { method: "POST", body: formData, - headers: cairoAuthHeader(), }); } async function downloadFiles(files) { Promise.all( files.map((f) => - getServerItem(serverId, f.name, [...dirStack, f.name].join("/")), + getServerItem(serverName, f.name, [...dirStack, f.name].join("/")), ), ) - .then(() => console.log("Done downloading files!")) + .then(() => console.log("Done")) .catch((e) => console.error("Error Downloading files!", e)); } - function previewFile(file) { - const { name } = file; - previewServerItem(serverId, [...dirStack, name].join("/")).then( - (fileData) => - changePreview(name, fileData, [...dirStack, name].join("/")), - ); - } - - function moveFile(movePayload) { - const { files: filePayload, destination: destinationPayload } = movePayload; - if (!destinationPayload.isDir || filePayload.length === 0) return; - const files = filePayload.map((f) => f.name); - const dest = destinationPayload.id; - const origin = dirStack.join("/"); - moveServerItems(serverId, files, dest, origin).then(updateFiles); - } - function fileClick(chonkyEvent) { const { id: clickEvent, payload } = chonkyEvent; + console.log(chonkyEvent); if (clickEvent === "open_parent_folder") return openParentFolder(); if (clickEvent === "create_folder") return createFolder(); if (clickEvent === "upload_files") return inputRef.current.click(); @@ -160,41 +115,32 @@ export default function MineclusterFiles(props) { return downloadFiles(chonkyEvent.state.selectedFilesForAction); if (clickEvent === "delete_files") return deleteItems(chonkyEvent.state.selectedFilesForAction); - if (clickEvent === "move_files") return moveFile(payload); - if (clickEvent !== "open_files") return; // console.log(clickEvent); - openItem(payload); + if (clickEvent !== "open_files") return console.log(clickEvent); + openFolder(payload); } - return ( - - {({ getRootProps }) => ( - - - - - - - - - - )} - + + + + + + + + + + ); } diff --git a/src/components/files/TextEditor.jsx b/src/components/files/TextEditor.jsx deleted file mode 100644 index 6151cf8..0000000 --- a/src/components/files/TextEditor.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import ReactQuill from "react-quill"; -import { useState, useEffect, useMemo, memo } from "react"; -import "react-quill/dist/quill.snow.css"; - -const buildDelta = (t) => { - if (!t) return; - const ops = t.split("\n").map((l) => ({ insert: `${l}\n` })); - return { ops }; -}; - -function TextEditor(props) { - const { text, onChange } = props; - const [delta, setDelta] = useState(); - const constructDelta = useMemo(() => buildDelta(text), [text]); - useEffect(() => setDelta(constructDelta), [text]); - - const onEditorChange = (c, d, s, editor) => onChange(editor.getText()); - - return ; -} -export default memo(TextEditor, (a, b) => a.text === b.text); diff --git a/src/components/server-options/BackupBucketOption.jsx b/src/components/server-options/BackupBucketOption.jsx deleted file mode 100644 index 7650187..0000000 --- a/src/components/server-options/BackupBucketOption.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import TextField from "@mui/material/TextField"; -export default function BackupBucketOption(props) { - const { value, onChange } = props; - - return ( - - ); -} diff --git a/src/components/server-options/BackupHostOption.jsx b/src/components/server-options/BackupHostOption.jsx deleted file mode 100644 index 5d96002..0000000 --- a/src/components/server-options/BackupHostOption.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import TextField from "@mui/material/TextField"; -export default function BackupHostOption(props) { - const { value, onChange } = props; - - return ( - - ); -} diff --git a/src/components/server-options/BackupIdOption.jsx b/src/components/server-options/BackupIdOption.jsx deleted file mode 100644 index 80b54b5..0000000 --- a/src/components/server-options/BackupIdOption.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import TextField from "@mui/material/TextField"; -export default function BackupIdOption(props) { - const { value, onChange } = props; - - return ( - - ); -} diff --git a/src/components/server-options/BackupIntervalOption.jsx b/src/components/server-options/BackupIntervalOption.jsx deleted file mode 100644 index 610c6fd..0000000 --- a/src/components/server-options/BackupIntervalOption.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import { useState } from "react"; -import Box from "@mui/material/Box"; -import MenuItem from "@mui/material/MenuItem"; -import TextField from "@mui/material/TextField"; - -const backupIntervalStepDisplay = ["Minutes", "Hours", "Days"]; -export const backupIntervalDefault = "1d"; -export const backupIntervalStepOptions = ["m", "h", "d"]; -export default function BackupIntervalOption(props) { - const { onChange } = props; - const [interval, setInterval] = useState(1); - const [intervalStep, setIntervalStep] = useState( - backupIntervalStepOptions[2], - ); - - const changeStep = (e) => { - setIntervalStep(e.target.value); - onChange({ target: { value: `${interval}${e.target.value}` } }); - }; - - const changeInterval = (e) => { - setInterval(e.target.value); - onChange({ target: { value: `${e.target.value}${intervalStep}` } }); - }; - - return ( - - - - {backupIntervalStepOptions.map((o, i) => ( - - {backupIntervalStepDisplay[i]} - - ))} - - - ); -} diff --git a/src/components/server-options/BackupKeyOption.jsx b/src/components/server-options/BackupKeyOption.jsx deleted file mode 100644 index 13cec43..0000000 --- a/src/components/server-options/BackupKeyOption.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import TextField from "@mui/material/TextField"; -export default function BackupKeyOption(props) { - const { value, onChange } = props; - - return ( - - ); -} diff --git a/src/components/server-options/CpuOption.jsx b/src/components/server-options/CpuOption.jsx deleted file mode 100644 index ebc812c..0000000 --- a/src/components/server-options/CpuOption.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import TextField from "@mui/material/TextField"; -import MenuItem from "@mui/material/MenuItem"; - -const maxCpuSupported = 8; -export const cpuOptions = new Array(2 * maxCpuSupported) - .fill(0) - .map((v, i) => (i + 1) * 0.5); - -export default function CpuOption(props) { - const { value, onChange } = props; - return ( - - {cpuOptions.map((o, i) => ( - {`${o} CPU`} - ))} - - ); -} diff --git a/src/components/server-options/ExtraPortsOption.jsx b/src/components/server-options/ExtraPortsOption.jsx deleted file mode 100644 index 893a067..0000000 --- a/src/components/server-options/ExtraPortsOption.jsx +++ /dev/null @@ -1,50 +0,0 @@ -import { useState } from "react"; -import TextField from "@mui/material/TextField"; -import Autocomplete from "@mui/material/Autocomplete"; -import Chip from "@mui/material/Chip"; - -const validatePort = (p) => - p !== "25565" && p !== "25575" && p.length < 6 && parseInt(p) < 60_000; - -export default function ExtraPortsOption(props) { - const { extraPorts: initExtraPorts } = props; - const [extraPorts, setExtraPorts] = useState(initExtraPorts ?? []); - const { onChange } = props; - - function portChange(e, val, optionType, changedValue) { - if (optionType === "clear") { - setExtraPorts([]); - onChange("extraPorts", []); - return; - } - if (!validatePort(changedValue.option)) - return alert("That port cannot be added/removed as an extra port!"); - setExtraPorts(val); - onChange("extraPorts", val); - } - - return ( - ( - - )} - renderTags={(value, getTagProps) => - value.map((option, index) => { - const defaultChipProps = getTagProps({ index }); - return ; - }) - } - /> - ); -} diff --git a/src/components/server-options/HostOption.jsx b/src/components/server-options/HostOption.jsx deleted file mode 100644 index 15d14e9..0000000 --- a/src/components/server-options/HostOption.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import TextField from "@mui/material/TextField"; -export default function HostOption(props) { - const { value, onChange, disabled } = props; - - function onTextChange(e) { - e.target.value = e.target.value.toLowerCase(); - onChange(e); - } - - return ( - - ); -} diff --git a/src/components/server-options/MemoryOption.jsx b/src/components/server-options/MemoryOption.jsx deleted file mode 100644 index 97fe871..0000000 --- a/src/components/server-options/MemoryOption.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import TextField from "@mui/material/TextField"; -import MenuItem from "@mui/material/MenuItem"; -const maxMemSupported = 10; -export const memoryOptions = new Array(2 * maxMemSupported) - .fill(0) - .map((v, i) => (i + 1) * 512); - -export default function Option(props) { - const { value, onChange } = props; - return ( - - {memoryOptions.map((o, i) => ( - {`${o / 1024} Gi`} - ))} - - ); -} diff --git a/src/components/server-options/NameOption.jsx b/src/components/server-options/NameOption.jsx deleted file mode 100644 index 18a0f0d..0000000 --- a/src/components/server-options/NameOption.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import TextField from "@mui/material/TextField"; -export default function NameOption(props) { - const { value, onChange } = props; - - return ( - - ); -} diff --git a/src/components/server-options/ServerTypeOption.jsx b/src/components/server-options/ServerTypeOption.jsx deleted file mode 100644 index f123528..0000000 --- a/src/components/server-options/ServerTypeOption.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import TextField from "@mui/material/TextField"; -import MenuItem from "@mui/material/MenuItem"; - -const displayOption = (o) => o.charAt(0) + o.toLowerCase().slice(1); - -export const serverTypeOptions = ["VANILLA", "FABRIC", "PAPER", "SPIGOT"]; -export default function ServerTypeOption(props) { - const { value, onChange } = props; - return ( - - {serverTypeOptions.map((o, i) => ( - - {displayOption(o)} - - ))} - - ); -} diff --git a/src/components/server-options/StorageOption.jsx b/src/components/server-options/StorageOption.jsx deleted file mode 100644 index d1b7ed2..0000000 --- a/src/components/server-options/StorageOption.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import TextField from "@mui/material/TextField"; -import MenuItem from "@mui/material/MenuItem"; - -const maxStorageSupported = 80; -export const storageOptions = new Array(2 * maxStorageSupported) - .fill(0) - .map((v, i) => (i + 1) * 0.5); - -export default function StorageOption(props) { - const { value, onChange } = props; - return ( - - No Storage - {storageOptions.map((o, i) => ( - {`${o} GB`} - ))} - - ); -} diff --git a/src/components/server-options/VersionOption.jsx b/src/components/server-options/VersionOption.jsx deleted file mode 100644 index 8293e0d..0000000 --- a/src/components/server-options/VersionOption.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import { useState, useEffect } from "react"; -import TextField from "@mui/material/TextField"; -import MenuItem from "@mui/material/MenuItem"; -import { useVersionList } from "@mcl/queries"; - -export default function VersionOption(props) { - const { value, onChange } = props; - const versionList = useVersionList(); - const [versions, setVersions] = useState(["latest"]); - - useEffect(() => { - if (!versionList.data) return; - setVersions([ - "latest", - ...versionList.data.versions - .filter(({ type: releaseType }) => releaseType === "release") - .map(({ id }) => id), - ]); - }, [versionList.data]); - - return ( - - {versions.map((v, k) => ( - - {v} - - ))} - - ); -} diff --git a/src/components/servers/BackupsDialog.jsx b/src/components/servers/BackupsDialog.jsx deleted file mode 100644 index dff558b..0000000 --- a/src/components/servers/BackupsDialog.jsx +++ /dev/null @@ -1,88 +0,0 @@ -import { useEffect, useState } from "react"; -import useMediaQuery from "@mui/material/useMediaQuery"; -import { useTheme } from "@mui/material/styles"; -import Button from "@mui/material/Button"; -import DialogTitle from "@mui/material/DialogTitle"; -import DialogContent from "@mui/material/DialogContent"; -import DialogActions from "@mui/material/DialogActions"; -import Dialog from "@mui/material/Dialog"; -import IconButton from "@mui/material/IconButton"; -import Toolbar from "@mui/material/Toolbar"; -import Typography from "@mui/material/Typography"; -import Stack from "@mui/material/Stack"; -import DownloadIcon from "@mui/icons-material/Download"; -import { getBackupUrl, getServerBackups } from "../../util/queries"; - -export function useBackupDialog(isOpen = false) { - const [open, setOpen] = useState(isOpen); - const dialogToggle = () => setOpen(!open); - return [open, dialogToggle]; -} - -export default function BackupDialog(props) { - const { serverId, open, dialogToggle } = props; - const theme = useTheme(); - const fullScreen = useMediaQuery(theme.breakpoints.down("md")); - const [backups, setBackups] = useState([]); - - function refreshUpdateList() { - getServerBackups(serverId).then(setBackups); - } - useEffect(() => { - if (!serverId) return; - refreshUpdateList(); - }, [serverId, open]); - - function normalizeLastModified(lastModified) { - const d = new Date(Date.parse(lastModified)); - return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()} ${d.getHours()}:${d.getMinutes()}`; - } - - const downloadBackup = (backup) => - async function openBackupLink() { - const { url } = await getBackupUrl(serverId, backup.path); - window.open(url, "_blank").focus(); - }; - - const normalizedSize = (size) => `${(size / Math.pow(1024, 3)).toFixed(2)}GB`; - - return ( - - - Backups - - {backups.map((backup, i) => ( - - - {backup.name} - - - {normalizeLastModified(backup.lastModified)} - - - {normalizedSize(backup.size)} - - - - - - - ))} - - - - - - ); -} diff --git a/src/components/servers/RconDialog.jsx b/src/components/servers/RconDialog.jsx index ad69761..5183d1a 100644 --- a/src/components/servers/RconDialog.jsx +++ b/src/components/servers/RconDialog.jsx @@ -16,23 +16,24 @@ export function useRconDialog(isOpen = false) { } export default function RconDialog(props) { - const { server, open, dialogToggle } = props; - const { name: serverName, id: serverId } = server ?? {}; + const { serverName, open, dialogToggle } = props; const theme = useTheme(); - const fullScreen = useMediaQuery(theme.breakpoints.down("md")); - + const fullScreen = useMediaQuery(theme.breakpoints.down("sm")); return ( - + RCON - {serverName} - - + + - )} - {!(rcon && rcon.rconLive && !rcon.rconError) && ( - - )} + ); diff --git a/src/components/servers/ServerCard.jsx b/src/components/servers/ServerCard.jsx index 0b6f724..4eec631 100644 --- a/src/components/servers/ServerCard.jsx +++ b/src/components/servers/ServerCard.jsx @@ -11,20 +11,20 @@ import Typography from "@mui/material/Typography"; import StopIcon from "@mui/icons-material/Stop"; import TerminalIcon from "@mui/icons-material/Terminal"; import PlayArrowIcon from "@mui/icons-material/PlayArrow"; +import PendingIcon from "@mui/icons-material/Pending"; import DeleteForeverIcon from "@mui/icons-material/DeleteForever"; import EditIcon from "@mui/icons-material/Edit"; import FolderIcon from "@mui/icons-material/Folder"; -import BackupIcon from "@mui/icons-material/Backup"; import { Link } from "react-router-dom"; export default function ServerCard(props) { - const { server, openRcon, openBackups } = props; - const { name, id, metrics, ftpAvailable, serverAvailable, services } = server; - const startServer = useStartServer(id); - const stopServer = useStopServer(id); - const deleteServer = useDeleteServer(id); + const { server, openRcon } = props; + const { name, metrics, started } = server; + const startServer = useStartServer(name); + const stopServer = useStopServer(name); + const deleteServer = useDeleteServer(name); function toggleRcon() { - if (!services.includes("server")) return; + if (!started) return; openRcon(); } @@ -60,26 +60,14 @@ export default function ServerCard(props) { )}
- {services.includes("server") && ( + {started && ( )} - {!services.includes("server") && ( + {!started && ( @@ -113,26 +101,16 @@ export default function ServerCard(props) { aria-label="Edit" size="large" component={Link} - to={`/mcl/edit?server=${id}`} - disabled={services.includes("server")} + to={`/mcl/edit?server=${name}`} > - - - diff --git a/src/css/header.css b/src/css/header.css new file mode 100644 index 0000000..15d51e4 --- /dev/null +++ b/src/css/header.css @@ -0,0 +1,31 @@ +.appbar-items { + font-size: 1.25rem; + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0075em; +} + +.view > header { + transition: box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + box-shadow: + 0px 2px 4px -1px rgba(0, 0, 0, 0.2), + 0px 4px 5px 0px rgba(0, 0, 0, 0.14), + 0px 1px 10px 0px rgba(0, 0, 0, 0.12); + display: flex; + flex-direction: column; + width: 100%; + box-sizing: border-box; + flex-shrink: 0; + position: fixed; + top: 0; + left: auto; + right: 0; + color: rgba(0, 0, 0, 0.87); + z-index: 1302; + background-color: black; +} +.view > header > div > div > a { + height: 40px; + width: 40px; +} diff --git a/src/css/rcon.css b/src/css/rcon.css index c4fb9e3..a6093ad 100644 --- a/src/css/rcon.css +++ b/src/css/rcon.css @@ -1,7 +1,8 @@ .rconLogsWrapper { overflow-y: scroll; - max-height: calc(100% - 6rem); + max-height: 20rem; word-wrap: break-word; + margin-bottom: 10px; } .rconActions { display: inline-flex; diff --git a/src/ctx/SettingsContext.jsx b/src/ctx/SettingsContext.jsx index 9d2ef57..e323177 100644 --- a/src/ctx/SettingsContext.jsx +++ b/src/ctx/SettingsContext.jsx @@ -10,7 +10,6 @@ const defaultSettings = { simplifiedControls: false, logAppDetails: true, defaultPage: "home", - cairoAuth: null, }; const settings = localSettings ? JSON.parse(localSettings) : defaultSettings; @@ -28,7 +27,6 @@ const settingsUpdater = (oldState, settingsUpdate) => { if (settingsUpdate[k] === undefined) continue; settingsToUpdate[k] = settingsUpdate[k]; } - console.log("SAVING", settingsToUpdate); localStorage.setItem("settings", JSON.stringify(settingsToUpdate)); }; diff --git a/src/nav/MCLMenu.jsx b/src/nav/MCLMenu.jsx index 6108f0a..3d6e7c2 100644 --- a/src/nav/MCLMenu.jsx +++ b/src/nav/MCLMenu.jsx @@ -13,7 +13,7 @@ import IconButton from "@mui/material/IconButton"; import Typography from "@mui/material/Typography"; import MenuIcon from "@mui/icons-material/Menu"; import Drawer from "@mui/material/Drawer"; -import ListItemIcon from "@mui/material/ListItemIcon"; +import HomeIcon from "@mui/icons-material/Home"; import ListItemText from "@mui/material/ListItemText"; import List from "@mui/material/List"; import ListItemButton from "@mui/material/ListItemButton"; @@ -36,52 +36,23 @@ export default function MCLMenu() { theme.zIndex.modal + 2 - (isDrawer ? 1 : 0); return ( - - + + - - + + - - - - - {pages.map( - (page, index) => - page.visible && ( - - {page.icon} - - - ), - )} - - - - + {navHeader()} - + diff --git a/src/nav/MCLPages.jsx b/src/nav/MCLPages.jsx index c2518c7..d13364e 100644 --- a/src/nav/MCLPages.jsx +++ b/src/nav/MCLPages.jsx @@ -1,7 +1,6 @@ import Home from "@mcl/pages/Home.jsx"; import Create from "@mcl/pages/Create.jsx"; import Files from "@mcl/pages/Files.jsx"; -import Edit from "@mcl/pages/Edit.jsx"; // Go To https://mui.com/material-ui/material-icons/ for more! import HomeIcon from "@mui/icons-material/Home"; import AddIcon from "@mui/icons-material/Add"; @@ -12,27 +11,17 @@ export default [ path: "/mcl/home", icon: , component: , - visible: true, }, { name: "Create", path: "/mcl/create", icon: , component: , - visible: true, - }, - { - name: "Files", - path: "/mcl/files", - icon: , - component: , - visible: false, }, { name: "Edit", - path: "/mcl/edit", + path: "/mcl/files", icon: , - component: , - visible: false, + component: , }, ]; diff --git a/src/nav/Viewport.jsx b/src/nav/Viewport.jsx index fabe10c..a6b7622 100644 --- a/src/nav/Viewport.jsx +++ b/src/nav/Viewport.jsx @@ -1,14 +1,13 @@ +import Box from "@mui/material/Box"; import Toolbar from "@mui/material/Toolbar"; import MCLPortal from "./MCLPortal.jsx"; +import Button from "@mui/material/Button"; +import SpeedDialIcon from "@mui/material/SpeedDialIcon"; // Import Navbar /*import Navbar from "./Navbar.jsx";*/ -import { useCairoAuth } from "@mcl/util/auth.js"; import MCLMenu from "./MCLMenu.jsx"; -import Auth from "@mcl/pages/Auth.jsx"; export default function Views() { - const auth = useCairoAuth(); - if (!auth) return ; return (
diff --git a/src/pages/Auth.jsx b/src/pages/Auth.jsx deleted file mode 100644 index e7278fa..0000000 --- a/src/pages/Auth.jsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useState, useEffect } from "react"; -import { useSearchParams, useNavigate } from "react-router-dom"; -import Box from "@mui/material/Box"; -import Button from "@mui/material/Button"; -import Typography from "@mui/material/Typography"; - -export default function Auth() { - const [searchParams] = useSearchParams(); - const currentServer = searchParams.get("token"); - - const nav = useNavigate(); - - const cairoLogin = () => - (window.location.href = `/api/auth/redirect?redirectUri=${window.location.href}`); - - return ( - theme.palette.primary.main, - }} - > - - - - - - - - - ); -} diff --git a/src/pages/Create.jsx b/src/pages/Create.jsx index b8e6963..b42e3fe 100644 --- a/src/pages/Create.jsx +++ b/src/pages/Create.jsx @@ -1,10 +1,11 @@ import Box from "@mui/material/Box"; -import CreateCoreOptions from "./CreateCoreOptions.jsx"; +import CreateOptions from "./CreateOptions.jsx"; export default function Create() { return ( + {/**/} - + ); diff --git a/src/pages/CreateCoreOptions.jsx b/src/pages/CreateCoreOptions.jsx deleted file mode 100644 index ad983ae..0000000 --- a/src/pages/CreateCoreOptions.jsx +++ /dev/null @@ -1,152 +0,0 @@ -import { useState } from "react"; -import { useNavigate } from "react-router-dom"; -import Box from "@mui/material/Box"; -import Button from "@mui/material/Button"; -import FormControl from "@mui/material/FormControl"; -import FormControlLabel from "@mui/material/FormControlLabel"; -import Switch from "@mui/material/Switch"; -import Typography from "@mui/material/Typography"; -import { useCreateServer } from "@mcl/queries"; - -// Core Options -import NameOption from "@mcl/components/server-options/NameOption.jsx"; -import HostOption from "@mcl/components/server-options/HostOption.jsx"; -import VersionOption from "@mcl/components/server-options/VersionOption.jsx"; -import ServerTypeOption, { - serverTypeOptions, -} from "@mcl/components/server-options/ServerTypeOption.jsx"; -import CpuOption, { - cpuOptions, -} from "@mcl/components/server-options/CpuOption.jsx"; -import MemoryOption, { - memoryOptions, -} from "@mcl/components/server-options/MemoryOption.jsx"; -import ExtraPortsOption from "@mcl/components/server-options/ExtraPortsOption.jsx"; -import StorageOption from "@mcl/components/server-options/StorageOption.jsx"; - -import BackupHostOption from "@mcl/components/server-options/BackupHostOption.jsx"; -import BackupBucketOption from "@mcl/components/server-options/BackupBucketOption.jsx"; -import BackupIdOption from "@mcl/components/server-options/BackupIdOption.jsx"; -import BackupKeyOption from "@mcl/components/server-options/BackupKeyOption.jsx"; -import BackupIntervalOption, { - backupIntervalDefault, -} from "@mcl/components/server-options/BackupIntervalOption.jsx"; - -const defaultServer = { - version: "latest", - serverType: serverTypeOptions[0], - cpu: cpuOptions[0], - memory: memoryOptions[2], // 1.5GB - storage: 0, - extraPorts: [], -}; - -export default function CreateCoreOptions() { - const [backupEnabled, setBackupEnabled] = useState(false); - const [spec, setSpec] = useState(defaultServer); - const nav = useNavigate(); - const createServer = useCreateServer(spec); - - const updateSpec = (attr, val) => { - const s = { ...spec }; - s[attr] = val; - setSpec(s); - }; - - const coreUpdate = (attr) => (e) => updateSpec(attr, e.target.value); - - async function upsertSpec() { - if (validateSpec() !== "validated") return; - createServer() - .then(() => nav("/")) - .catch(alert); - } - - function validateSpec() { - console.log("TODO CREATE VALIDATION"); - if (!spec.host) return alertValidationError("Host cannot be blank"); - if (!spec.name) return alertValidationError("Name not included"); - if (!spec.version) return alertValidationError("Version cannot be blank"); - return "validated"; - } - - function alertValidationError(reason) { - alert(`Could not validate spec because: ${reason}`); - } - - const toggleBackupEnabled = () => { - const s = { ...spec }; - if (!backupEnabled) { - (s.backupInterval = backupIntervalDefault), - (s.backupBucket = `/mcl/server-backups/${( - s.name ?? "my-server" - ).toLowerCase()}`); - } else for (var k in s) if (k.startsWith("backup")) delete s[k]; - setSpec(s); - setBackupEnabled(!backupEnabled); - }; - - return ( - - - - - - - - - - - {spec.storage !== 0 && ( - - } - label="Enable Backups?" - labelPlacement="start" - sx={{ mr: "auto" }} - /> - )} - {backupEnabled && spec.storage !== 0 && ( - - Backups - - - - - - - )} - - - - - ); -} diff --git a/src/pages/CreateOptionsFull.jsx b/src/pages/CreateOptions.jsx similarity index 97% rename from src/pages/CreateOptionsFull.jsx rename to src/pages/CreateOptions.jsx index 1d486f8..bb38323 100644 --- a/src/pages/CreateOptionsFull.jsx +++ b/src/pages/CreateOptions.jsx @@ -1,5 +1,4 @@ import { useState, useEffect } from "react"; -import { useNavigate } from "react-router-dom"; import Autocomplete from "@mui/material/Autocomplete"; import TextField from "@mui/material/TextField"; import Box from "@mui/material/Box"; @@ -25,7 +24,6 @@ export default function Create() { const [wl, setWl] = useState([]); const [ops, setOps] = useState([]); const [spec, setSpec] = useState(defaultServer); - const nav = useNavigate(); const versionList = useVersionList(); const [versions, setVersions] = useState(["latest"]); const createServer = useCreateServer(spec); @@ -88,11 +86,11 @@ export default function Create() { updateSpec("whitelist", newWl.join(",")); }; - async function upsertSpec() { + const opUpdate = (e) => alert("Op not implimented"); + + function upsertSpec() { if (validateSpec() !== "validated") return; - createServer(spec) - .then(() => nav("/")) - .catch(alert); + createServer(spec); } function validateSpec() { diff --git a/src/pages/Edit.jsx b/src/pages/Edit.jsx deleted file mode 100644 index c84429f..0000000 --- a/src/pages/Edit.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import { useSearchParams, useNavigate } from "react-router-dom"; -import Box from "@mui/material/Box"; -import EditCoreOptions from "./EditCoreOptions.jsx"; -export default function Edit() { - const [searchParams] = useSearchParams(); - const currentServer = searchParams.get("server"); - return ( - - - - - - ); -} diff --git a/src/pages/EditCoreOptions.jsx b/src/pages/EditCoreOptions.jsx deleted file mode 100644 index bda2c34..0000000 --- a/src/pages/EditCoreOptions.jsx +++ /dev/null @@ -1,137 +0,0 @@ -import { useState, useEffect } from "react"; -import { useNavigate } from "react-router-dom"; -import Box from "@mui/material/Box"; -import Button from "@mui/material/Button"; -import FormControl from "@mui/material/FormControl"; -import FormControlLabel from "@mui/material/FormControlLabel"; -import Switch from "@mui/material/Switch"; -import Typography from "@mui/material/Typography"; -import { useGetServer, useModifyServer } from "@mcl/queries"; - -// Core Options -import NameOption from "@mcl/components/server-options/NameOption.jsx"; -import HostOption from "@mcl/components/server-options/HostOption.jsx"; -import VersionOption from "@mcl/components/server-options/VersionOption.jsx"; -import ServerTypeOption, { - serverTypeOptions, -} from "@mcl/components/server-options/ServerTypeOption.jsx"; -import CpuOption, { - cpuOptions, -} from "@mcl/components/server-options/CpuOption.jsx"; -import MemoryOption, { - memoryOptions, -} from "@mcl/components/server-options/MemoryOption.jsx"; -import ExtraPortsOption from "@mcl/components/server-options/ExtraPortsOption.jsx"; - -import BackupHostOption from "@mcl/components/server-options/BackupHostOption.jsx"; -import BackupBucketOption from "@mcl/components/server-options/BackupBucketOption.jsx"; -import BackupIdOption from "@mcl/components/server-options/BackupIdOption.jsx"; -import BackupKeyOption from "@mcl/components/server-options/BackupKeyOption.jsx"; -import BackupIntervalOption, { - backupIntervalDefault, -} from "@mcl/components/server-options/BackupIntervalOption.jsx"; - -export default function EditCoreOptions(props) { - const { serverId } = props; - const [spec, setSpec] = useState(); - const modifyServer = useModifyServer(spec); - const nav = useNavigate(); - const { isLoading, data: serverBlueprint } = useGetServer(serverId); - - useEffect(() => setSpec(serverBlueprint), [serverBlueprint]); - - const updateSpec = (attr, val) => { - const s = { ...spec }; - s[attr] = val; - setSpec(s); - }; - - const coreUpdate = (attr) => (e) => updateSpec(attr, e.target.value); - - const upsertSpec = () => modifyServer().then(() => nav("/")); - - const toggleBackupEnabled = () => - updateSpec("backupEnabled", !spec.backupEnabled); - - function validateSpec() { - console.log("TODO CREATE VALIDATION"); - if (!spec.host) return alertValidationError("Host cannot be blank"); - if (!spec.name) return alertValidationError("Name not included"); - if (!spec.version) return alertValidationError("Version cannot be blank"); - return "validated"; - } - - function alertValidationError(reason) { - alert(`Could not validate spec because: ${reason}`); - } - - if (!spec) return; // TODO: Add loading for spec - return ( - - - - - - - - - - - {spec.backupEnabled !== null && ( - - } - label="Enable Backups?" - labelPlacement="start" - sx={{ mr: "auto" }} - /> - )} - - {/*spec.backupEnabled && ( // TODO: Disabled while secrets are insecure - - Backups - - - - - - - )*/} - - - - - ); -} diff --git a/src/pages/Files.jsx b/src/pages/Files.jsx index e970b7f..2794530 100644 --- a/src/pages/Files.jsx +++ b/src/pages/Files.jsx @@ -1,35 +1,20 @@ -import { useState, useEffect } from "react"; +import { useEffect } from "react"; import { useSearchParams, useNavigate } from "react-router-dom"; import Box from "@mui/material/Box"; -import FilePreview, { - useFilePreview, -} from "@mcl/components/files/FilePreview.jsx"; +import Typography from "@mui/material/Typography"; +import Toolbar from "@mui/material/Toolbar"; import MineclusterFiles from "@mcl/components/files/MineclusterFiles.jsx"; export default function Files() { - const [open, dialogToggle] = useFilePreview(); - const [previewData, setPreviewData] = useState(); const [searchParams] = useSearchParams(); const currentServer = searchParams.get("server"); const nav = useNavigate(); useEffect(() => { if (!currentServer) nav("/"); }, [currentServer]); - - function changePreview(name, fileData, filePath) { - setPreviewData({ name, fileData, filePath }); - dialogToggle(); - } - return ( - - + ); } diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index 47b5f6b..663a2b7 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -12,16 +12,12 @@ import SpeedDialIcon from "@mui/material/SpeedDialIcon"; import "@mcl/css/server-card.css"; import "@mcl/css/overview.css"; import { useServerInstances } from "@mcl/queries"; -import BackupDialog, { - useBackupDialog, -} from "../components/servers/BackupsDialog"; export default function Home() { const clusterMetrics = { cpu: 0, memory: 0 }; const [server, setServer] = useState(); const [servers, setServers] = useState([]); const [rdOpen, rconToggle] = useRconDialog(); - const [bkOpen, backupsToggle] = useBackupDialog(); const { isLoading, data: serversData } = useServerInstances(); const serverInstances = serversData ?? []; useEffect(() => { @@ -34,12 +30,6 @@ export default function Home() { setServer(s); rconToggle(); }; - - const openBackups = (s) => () => { - setServer(s); - backupsToggle(); - }; - return ( @@ -60,19 +50,14 @@ export default function Home() { {!isLoading && servers.map((s, k) => ( - + ))} - -