diff --git a/examples/app-pages-router/app/isr/page.tsx b/examples/app-pages-router/app/isr/page.tsx
index e88f677c8..3eadac36d 100644
--- a/examples/app-pages-router/app/isr/page.tsx
+++ b/examples/app-pages-router/app/isr/page.tsx
@@ -5,5 +5,5 @@ async function getTime() {
 export const revalidate = 10;
 export default async function ISR() {
   const time = getTime();
-  return <div>ISR: {time}</div>;
+  return <div>Time: {time}</div>;
 }
diff --git a/examples/app-pages-router/app/layout.tsx b/examples/app-pages-router/app/layout.tsx
index 85e1c420b..e49706e15 100644
--- a/examples/app-pages-router/app/layout.tsx
+++ b/examples/app-pages-router/app/layout.tsx
@@ -17,7 +17,10 @@ export default function RootLayout({
 }) {
   return (
     <html lang="en">
-      <body className={inter.className}>{children}</body>
+      <body className={inter.className}>
+        <header>Header</header>
+        {children}
+      </body>
     </html>
   );
 }
diff --git a/examples/app-pages-router/app/ssr/layout.tsx b/examples/app-pages-router/app/ssr/layout.tsx
new file mode 100644
index 000000000..3a8338f50
--- /dev/null
+++ b/examples/app-pages-router/app/ssr/layout.tsx
@@ -0,0 +1,10 @@
+import { PropsWithChildren } from "react";
+
+export default function Layout({ children }: PropsWithChildren) {
+  return (
+    <div>
+      <h1>SSR</h1>
+      {children}
+    </div>
+  );
+}
diff --git a/examples/app-pages-router/app/ssr/page.tsx b/examples/app-pages-router/app/ssr/page.tsx
index 394f6e148..ed3c0b22e 100644
--- a/examples/app-pages-router/app/ssr/page.tsx
+++ b/examples/app-pages-router/app/ssr/page.tsx
@@ -1,12 +1,23 @@
-import { wait } from "@open-next/utils";
+import React from "react";
+
+import { headers } from "next/headers";
+
+async function getTime() {
+  const res = await new Promise<string>((resolve) => {
+    setTimeout(() => {
+      resolve(new Date().toISOString());
+    }, 1500);
+  });
+  return res;
+}
 
-export const revalidate = 0;
 export default async function SSR() {
-  await wait(2000);
-  const time = new Date().toISOString();
+  const time = await getTime();
+  const headerList = headers();
   return (
     <div>
-      <h1>SSR {time}</h1>
+      <h1>Time: {time}</h1>
+      <div> {headerList.get("host")}</div>
     </div>
   );
 }
diff --git a/examples/app-pages-router/next.config.js b/examples/app-pages-router/next.config.js
index 6e0d91116..29f248fa7 100644
--- a/examples/app-pages-router/next.config.js
+++ b/examples/app-pages-router/next.config.js
@@ -1,6 +1,7 @@
 /** @type {import('next').NextConfig} */
 const nextConfig = {
   poweredByHeader: false,
+  cleanDistDir: true,
   transpilePackages: ["@example/shared"],
   output: "standalone",
   outputFileTracing: "../sst",
diff --git a/examples/app-pages-router/pages/pages_isr/index.tsx b/examples/app-pages-router/pages/pages_isr/index.tsx
index c5efe2352..08a953bba 100644
--- a/examples/app-pages-router/pages/pages_isr/index.tsx
+++ b/examples/app-pages-router/pages/pages_isr/index.tsx
@@ -12,5 +12,5 @@ export async function getStaticProps() {
 export default function Page({
   time,
 }: InferGetStaticPropsType<typeof getStaticProps>) {
-  return <div className="flex">ISR: {time}</div>;
+  return <div className="flex">Time: {time}</div>;
 }
diff --git a/examples/app-pages-router/pages/pages_ssr/index.tsx b/examples/app-pages-router/pages/pages_ssr/index.tsx
index 372da27a5..86627836a 100644
--- a/examples/app-pages-router/pages/pages_ssr/index.tsx
+++ b/examples/app-pages-router/pages/pages_ssr/index.tsx
@@ -11,5 +11,5 @@ export async function getServerSideProps() {
 export default function Page({
   time,
 }: InferGetServerSidePropsType<typeof getServerSideProps>) {
-  return <div className="flex">SSR: {time}</div>;
+  return <div className="flex">Time: {time}</div>;
 }
diff --git a/examples/app-router/app/api/sse/route.ts b/examples/app-router/app/api/sse/route.ts
new file mode 100644
index 000000000..375af9592
--- /dev/null
+++ b/examples/app-router/app/api/sse/route.ts
@@ -0,0 +1,47 @@
+import { wait } from "@open-next/utils";
+import { NextRequest } from "next/server";
+
+export const dynamic = "force-dynamic";
+
+export async function GET(request: NextRequest) {
+  const resStream = new TransformStream();
+  const writer = resStream.writable.getWriter();
+
+  const res = new Response(resStream.readable, {
+    headers: {
+      "Content-Type": "text/event-stream",
+      Connection: "keep-alive",
+      "Cache-Control": "no-cache, no-transform",
+    },
+  });
+
+  setTimeout(async () => {
+    writer.write(
+      `data: ${JSON.stringify({
+        message: "open",
+        time: new Date().toISOString(),
+      })}\n\n`,
+    );
+    for (let i = 1; i <= 4; i++) {
+      await wait(2000);
+      writer.write(
+        `data: ${JSON.stringify({
+          message: "hello:" + i,
+          time: new Date().toISOString(),
+        })}\n\n`,
+      );
+    }
+
+    await wait(2000); // Wait for 4 seconds
+    writer.write(
+      `data: ${JSON.stringify({
+        message: "close",
+        time: new Date().toISOString(),
+      })}\n\n`,
+    );
+    await wait(5000);
+    await writer.close();
+  }, 100);
+
+  return res;
+}
diff --git a/examples/app-router/app/isr/page.tsx b/examples/app-router/app/isr/page.tsx
index e88f677c8..3eadac36d 100644
--- a/examples/app-router/app/isr/page.tsx
+++ b/examples/app-router/app/isr/page.tsx
@@ -5,5 +5,5 @@ async function getTime() {
 export const revalidate = 10;
 export default async function ISR() {
   const time = getTime();
-  return <div>ISR: {time}</div>;
+  return <div>Time: {time}</div>;
 }
diff --git a/examples/app-router/app/page.tsx b/examples/app-router/app/page.tsx
index e2aa3b3e7..66da3ac80 100644
--- a/examples/app-router/app/page.tsx
+++ b/examples/app-router/app/page.tsx
@@ -26,7 +26,8 @@ export default function Home() {
           new timestamp
         </Nav>
         <Nav href={"/ssr"} title="SSR">
-          Server Side Render should generate a new timestamp on each load
+          Server Side Render should generate a new timestamp on each load.
+          Streaming support for loading...
         </Nav>
         <Nav href={"/api"} title="API">
           Calls an API endpoint defined in app/api/hello/route and middleware
@@ -40,6 +41,9 @@ export default function Home() {
         <Nav href={"/search-query"} title="Search Query">
           Search Query Params should be available in middleware
         </Nav>
+        <Nav href={"/sse"} title="Server Sent Events">
+          Server Sent Events via Streaming
+        </Nav>
       </main>
     </>
   );
diff --git a/examples/app-router/app/sse/page.tsx b/examples/app-router/app/sse/page.tsx
new file mode 100644
index 000000000..76e5582c5
--- /dev/null
+++ b/examples/app-router/app/sse/page.tsx
@@ -0,0 +1,36 @@
+"use client";
+
+import { useEffect, useState } from "react";
+
+export default function SSE() {
+  const [events, setEvents] = useState<any[]>([]);
+
+  useEffect(() => {
+    const e = new EventSource("/api/sse");
+
+    e.onmessage = (msg) => {
+      console.log(msg);
+      try {
+        const data = JSON.parse(msg.data);
+        if (data.message === "close") {
+          e.close();
+          console.log("closing");
+        }
+        setEvents((prev) => prev.concat(data));
+      } catch (err) {
+        console.log("failed to parse: ", err, msg);
+      }
+    };
+  }, []);
+
+  return (
+    <>
+      <h1>Server Sent Event</h1>
+      {events.map((e, i) => (
+        <div key={i}>
+          Message {i}: {JSON.stringify(e)}
+        </div>
+      ))}
+    </>
+  );
+}
diff --git a/examples/app-router/app/ssr/layout.tsx b/examples/app-router/app/ssr/layout.tsx
new file mode 100644
index 000000000..3a8338f50
--- /dev/null
+++ b/examples/app-router/app/ssr/layout.tsx
@@ -0,0 +1,10 @@
+import { PropsWithChildren } from "react";
+
+export default function Layout({ children }: PropsWithChildren) {
+  return (
+    <div>
+      <h1>SSR</h1>
+      {children}
+    </div>
+  );
+}
diff --git a/examples/app-router/app/ssr/page.tsx b/examples/app-router/app/ssr/page.tsx
index 394f6e148..ed3c0b22e 100644
--- a/examples/app-router/app/ssr/page.tsx
+++ b/examples/app-router/app/ssr/page.tsx
@@ -1,12 +1,23 @@
-import { wait } from "@open-next/utils";
+import React from "react";
+
+import { headers } from "next/headers";
+
+async function getTime() {
+  const res = await new Promise<string>((resolve) => {
+    setTimeout(() => {
+      resolve(new Date().toISOString());
+    }, 1500);
+  });
+  return res;
+}
 
-export const revalidate = 0;
 export default async function SSR() {
-  await wait(2000);
-  const time = new Date().toISOString();
+  const time = await getTime();
+  const headerList = headers();
   return (
     <div>
-      <h1>SSR {time}</h1>
+      <h1>Time: {time}</h1>
+      <div> {headerList.get("host")}</div>
     </div>
   );
 }
diff --git a/examples/app-router/middleware.ts b/examples/app-router/middleware.ts
index e1dcb9a58..747bab419 100644
--- a/examples/app-router/middleware.ts
+++ b/examples/app-router/middleware.ts
@@ -21,12 +21,14 @@ export function middleware(request: NextRequest) {
   }
 
   const requestHeaders = new Headers();
+  // Setting the Request Headers, this should be available in RSC
   requestHeaders.set("request-header", "request-header");
   requestHeaders.set(
     "search-params",
     `mw/${request.nextUrl.searchParams.get("searchParams") || ""}`,
   );
   const responseHeaders = new Headers();
+  // Response headers should show up in the client's response headers
   responseHeaders.set("response-header", "response-header");
 
   // Set the cache control header with custom swr
diff --git a/examples/app-router/next.config.js b/examples/app-router/next.config.js
index c9eddd23c..b9ae77d54 100644
--- a/examples/app-router/next.config.js
+++ b/examples/app-router/next.config.js
@@ -1,6 +1,7 @@
 /** @type {import('next').NextConfig} */
 const nextConfig = {
   poweredByHeader: false,
+  cleanDistDir: true,
   transpilePackages: ["@example/shared"],
   output: "standalone",
   outputFileTracing: "../sst",
diff --git a/examples/app-router/package.json b/examples/app-router/package.json
index 1db95a5bd..74efe54aa 100644
--- a/examples/app-router/package.json
+++ b/examples/app-router/package.json
@@ -3,7 +3,7 @@
   "version": "0.1.0",
   "private": true,
   "scripts": {
-    "openbuild": "node ../../packages/open-next/dist/index.js build --build-command \"npx turbo build\"",
+    "openbuild": "node ../../packages/open-next/dist/index.js build --streaming --build-command \"npx turbo build\"",
     "dev": "next dev --port 3001",
     "build": "next build",
     "start": "next start --port 3001",
diff --git a/examples/pages-router/next.config.js b/examples/pages-router/next.config.js
index 170a458a3..d9a441a89 100644
--- a/examples/pages-router/next.config.js
+++ b/examples/pages-router/next.config.js
@@ -1,6 +1,7 @@
 /** @type {import('next').NextConfig} */
 const nextConfig = {
   transpilePackages: ["@example/shared"],
+  cleanDistDir: true,
   reactStrictMode: true,
   output: "standalone",
   outputFileTracing: "../sst",
diff --git a/examples/pages-router/src/pages/isr/index.tsx b/examples/pages-router/src/pages/isr/index.tsx
index c5efe2352..08a953bba 100644
--- a/examples/pages-router/src/pages/isr/index.tsx
+++ b/examples/pages-router/src/pages/isr/index.tsx
@@ -12,5 +12,5 @@ export async function getStaticProps() {
 export default function Page({
   time,
 }: InferGetStaticPropsType<typeof getStaticProps>) {
-  return <div className="flex">ISR: {time}</div>;
+  return <div className="flex">Time: {time}</div>;
 }
diff --git a/examples/pages-router/src/pages/ssr/index.tsx b/examples/pages-router/src/pages/ssr/index.tsx
index 372da27a5..659f2302f 100644
--- a/examples/pages-router/src/pages/ssr/index.tsx
+++ b/examples/pages-router/src/pages/ssr/index.tsx
@@ -11,5 +11,10 @@ export async function getServerSideProps() {
 export default function Page({
   time,
 }: InferGetServerSidePropsType<typeof getServerSideProps>) {
-  return <div className="flex">SSR: {time}</div>;
+  return (
+    <>
+      <h1>SSR</h1>
+      <div className="flex">Time: {time}</div>
+    </>
+  );
 }
diff --git a/examples/sst/README.md b/examples/sst/README.md
index d5a4256b8..3daa8b739 100644
--- a/examples/sst/README.md
+++ b/examples/sst/README.md
@@ -1,3 +1,15 @@
 # sst
 
-This example contains the AppRouter, PagesRouter, and AppPagesRouter Stacks for the end to end tests to hit.
\ No newline at end of file
+This example contains the AppRouter, PagesRouter, and AppPagesRouter Stacks for the end to end tests to hit.
+
+## AppRouter
+
+This app uses the app router exclusively and it uses the streaming feature
+
+## PagesRouter
+
+This app uses the pages router exclusively
+
+## AppPagesRouter
+
+This app uses a mix of app and pages router and *DOES NOT* use the streaming feature
\ No newline at end of file
diff --git a/examples/sst/package.json b/examples/sst/package.json
index e7cdafa71..1aa38ed5d 100644
--- a/examples/sst/package.json
+++ b/examples/sst/package.json
@@ -11,6 +11,6 @@
   "devDependencies": {
     "aws-cdk-lib": "2.91.0",
     "constructs": "10.2.69",
-    "sst": "2.24.20"
+    "sst": "2.24.24"
   }
 }
diff --git a/examples/sst/stacks/AppPagesRouter.ts b/examples/sst/stacks/AppPagesRouter.ts
index d6dcddef5..80b8710ed 100644
--- a/examples/sst/stacks/AppPagesRouter.ts
+++ b/examples/sst/stacks/AppPagesRouter.ts
@@ -1,5 +1,6 @@
 import { NextjsSite } from "sst/constructs";
 
+// NOTE: App Pages Router doesn't do streaming
 export function AppPagesRouter({ stack }) {
   const site = new NextjsSite(stack, "apppagesrouter", {
     path: "../app-pages-router",
diff --git a/examples/sst/stacks/AppRouter.ts b/examples/sst/stacks/AppRouter.ts
index 07b74030f..f619ec30c 100644
--- a/examples/sst/stacks/AppRouter.ts
+++ b/examples/sst/stacks/AppRouter.ts
@@ -1,4 +1,4 @@
-import { NextjsSite } from "sst/constructs";
+import { NextjsSite } from "./NextjsSite";
 
 export function AppRouter({ stack }) {
   const site = new NextjsSite(stack, "approuter", {
@@ -6,6 +6,7 @@ export function AppRouter({ stack }) {
     buildCommand: "npm run openbuild",
     bind: [],
     environment: {},
+    timeout: "20 seconds",
   });
 
   stack.addOutputs({
diff --git a/examples/sst/stacks/NextjsSite.ts b/examples/sst/stacks/NextjsSite.ts
new file mode 100644
index 000000000..97b25abb1
--- /dev/null
+++ b/examples/sst/stacks/NextjsSite.ts
@@ -0,0 +1,7 @@
+import { NextjsSite as SSTNextSite } from "sst/constructs";
+// NOTE: Temporary class to add streaming
+export class NextjsSite extends SSTNextSite {
+  protected supportsStreaming(): boolean {
+    return true;
+  }
+}
diff --git a/packages/open-next/package.json b/packages/open-next/package.json
index dcbd8d03e..2b18008b2 100644
--- a/packages/open-next/package.json
+++ b/packages/open-next/package.json
@@ -3,7 +3,7 @@
     "access": "public"
   },
   "name": "open-next",
-  "version": "2.1.5",
+  "version": "2.2.2-rc.2",
   "bin": {
     "open-next": "./dist/index.js"
   },
@@ -41,7 +41,7 @@
     "@node-minify/core": "^8.0.6",
     "@node-minify/terser": "^8.0.6",
     "@tsconfig/node18": "^1.0.1",
-    "esbuild": "^0.18.18",
+    "esbuild": "0.19.2",
     "@esbuild-plugins/node-resolve": "0.2.2",
     "path-to-regexp": "^6.2.1",
     "promise.series": "^0.2.0"
diff --git a/packages/open-next/src/adapters/cache.ts b/packages/open-next/src/adapters/cache.ts
index 0db6aacf2..fce714213 100644
--- a/packages/open-next/src/adapters/cache.ts
+++ b/packages/open-next/src/adapters/cache.ts
@@ -16,8 +16,8 @@ import {
 // import { getDerivedTags } from "next/dist/server/lib/incremental-cache/utils";
 import path from "path";
 
+import { loadBuildId } from "./config/util.js";
 import { awsLogger, debug, error } from "./logger.js";
-import { loadBuildId } from "./util.js";
 
 // TODO: Remove this, temporary only to run some tests
 const getDerivedTags = (tags: string[]) => tags;
diff --git a/packages/open-next/src/adapters/config/index.ts b/packages/open-next/src/adapters/config/index.ts
new file mode 100644
index 000000000..c686074fa
--- /dev/null
+++ b/packages/open-next/src/adapters/config/index.ts
@@ -0,0 +1,27 @@
+import path from "path";
+
+import { debug } from "../logger";
+import {
+  loadAppPathsManifestKeys,
+  loadBuildId,
+  loadConfig,
+  loadConfigHeaders,
+  loadHtmlPages,
+  loadPrerenderManifest,
+  loadPublicAssets,
+  loadRoutesManifest,
+} from "./util.js";
+
+export const NEXT_DIR = path.join(__dirname, ".next");
+export const OPEN_NEXT_DIR = path.join(__dirname, ".open-next");
+
+debug({ NEXT_DIR, OPEN_NEXT_DIR });
+
+export const NextConfig = loadConfig(NEXT_DIR);
+export const BuildId = loadBuildId(NEXT_DIR);
+export const HtmlPages = loadHtmlPages(NEXT_DIR);
+export const PublicAssets = loadPublicAssets(OPEN_NEXT_DIR);
+export const RoutesManifest = loadRoutesManifest(NEXT_DIR);
+export const ConfigHeaders = loadConfigHeaders(NEXT_DIR);
+export const PrerenderManifest = loadPrerenderManifest(NEXT_DIR);
+export const AppPathsManifestKeys = loadAppPathsManifestKeys(NEXT_DIR);
diff --git a/packages/open-next/src/adapters/config/util.ts b/packages/open-next/src/adapters/config/util.ts
new file mode 100644
index 000000000..09e681ef3
--- /dev/null
+++ b/packages/open-next/src/adapters/config/util.ts
@@ -0,0 +1,100 @@
+import fs from "fs";
+import path from "path";
+
+import { PublicFiles } from "../../build";
+import {
+  NextConfig,
+  PrerenderManifest,
+  RoutesManifest,
+} from "../types/next-types";
+
+export function loadConfig(nextDir: string) {
+  const filePath = path.join(nextDir, "required-server-files.json");
+  const json = fs.readFileSync(filePath, "utf-8");
+  const { config } = JSON.parse(json);
+  return config as NextConfig;
+}
+export function loadBuildId(nextDir: string) {
+  const filePath = path.join(nextDir, "BUILD_ID");
+  return fs.readFileSync(filePath, "utf-8").trim();
+}
+
+export function loadHtmlPages(nextDir: string) {
+  const filePath = path.join(nextDir, "server", "pages-manifest.json");
+  const json = fs.readFileSync(filePath, "utf-8");
+  return Object.entries(JSON.parse(json))
+    .filter(([_, value]) => (value as string).endsWith(".html"))
+    .map(([key]) => key);
+}
+
+export function loadPublicAssets(openNextDir: string) {
+  const filePath = path.join(openNextDir, "public-files.json");
+  const json = fs.readFileSync(filePath, "utf-8");
+  return JSON.parse(json) as PublicFiles;
+}
+
+export function loadRoutesManifest(nextDir: string) {
+  const filePath = path.join(nextDir, "routes-manifest.json");
+  const json = fs.readFileSync(filePath, "utf-8");
+  const routesManifest = JSON.parse(json) as RoutesManifest;
+
+  const _dataRoutes = routesManifest.dataRoutes ?? [];
+  const dataRoutes = {
+    static: _dataRoutes.filter((r) => r.routeKeys === undefined),
+    dynamic: _dataRoutes.filter((r) => r.routeKeys !== undefined),
+  };
+
+  return {
+    rewrites: {
+      beforeFiles: routesManifest.rewrites.beforeFiles ?? [],
+      afterFiles: routesManifest.rewrites.afterFiles ?? [],
+      fallback: routesManifest.rewrites.fallback ?? [],
+    },
+    redirects: routesManifest.redirects ?? [],
+    routes: {
+      static: routesManifest.staticRoutes ?? [],
+      dynamic: routesManifest.dynamicRoutes ?? [],
+      data: dataRoutes,
+    },
+  };
+}
+
+export function loadConfigHeaders(nextDir: string) {
+  const filePath = path.join(nextDir, "routes-manifest.json");
+  const json = fs.readFileSync(filePath, "utf-8");
+  const routesManifest = JSON.parse(json) as RoutesManifest;
+  return routesManifest.headers;
+}
+
+export function loadPrerenderManifest(nextDir: string) {
+  const filePath = path.join(nextDir, "prerender-manifest.json");
+  const json = fs.readFileSync(filePath, "utf-8");
+  return JSON.parse(json) as PrerenderManifest;
+}
+
+export function loadAppPathsManifestKeys(nextDir: string) {
+  const appPathsManifestPath = path.join(
+    nextDir,
+    "server",
+    "app-paths-manifest.json",
+  );
+  const appPathsManifestJson = fs.existsSync(appPathsManifestPath)
+    ? fs.readFileSync(appPathsManifestPath, "utf-8")
+    : "{}";
+  const appPathsManifest = JSON.parse(appPathsManifestJson) as Record<
+    string,
+    string
+  >;
+  return Object.keys(appPathsManifest).map((key) => {
+    // Remove parallel route
+    let cleanedKey = key.replace(/\/@[^\/]+/g, "");
+
+    // Remove group routes
+    cleanedKey = cleanedKey.replace(/\/\((?!\.)[^\)]*\)/g, "");
+
+    // Remove /page suffix
+    cleanedKey = cleanedKey.replace(/\/page$/g, "");
+    // We need to check if the cleaned key is empty because it means it's the root path
+    return cleanedKey === "" ? "/" : cleanedKey;
+  });
+}
diff --git a/packages/open-next/src/adapters/event-mapper.ts b/packages/open-next/src/adapters/event-mapper.ts
index 38acc142b..b0a343c79 100644
--- a/packages/open-next/src/adapters/event-mapper.ts
+++ b/packages/open-next/src/adapters/event-mapper.ts
@@ -62,7 +62,6 @@ export function convertFrom(
   } else throw new Error("Unsupported event type");
 
   return internalEvent;
-  // return fixDataPage(internalEvent, buildId);
 }
 
 export function convertTo(
diff --git a/packages/open-next/src/adapters/http/index.ts b/packages/open-next/src/adapters/http/index.ts
new file mode 100644
index 000000000..82e9e9411
--- /dev/null
+++ b/packages/open-next/src/adapters/http/index.ts
@@ -0,0 +1,3 @@
+export * from "./request.js";
+export * from "./response.js";
+export * from "./responseStreaming.js";
diff --git a/packages/open-next/src/adapters/request.ts b/packages/open-next/src/adapters/http/request.ts
similarity index 100%
rename from packages/open-next/src/adapters/request.ts
rename to packages/open-next/src/adapters/http/request.ts
diff --git a/packages/open-next/src/adapters/response.ts b/packages/open-next/src/adapters/http/response.ts
similarity index 56%
rename from packages/open-next/src/adapters/response.ts
rename to packages/open-next/src/adapters/http/response.ts
index 51e6a07c8..9731f55d5 100644
--- a/packages/open-next/src/adapters/response.ts
+++ b/packages/open-next/src/adapters/http/response.ts
@@ -2,30 +2,21 @@
 // https://github.com/dougmoscrop/serverless-http/blob/master/lib/response.js
 // Licensed under the MIT License
 
-// @ts-nocheck
 import http from "node:http";
+import { Socket } from "node:net";
 
-const headerEnd = "\r\n\r\n";
+import {
+  convertHeader,
+  getString,
+  headerEnd,
+  NO_OP,
+  parseHeaders,
+} from "./util.js";
 
 const BODY = Symbol();
 const HEADERS = Symbol();
 
-function getString(data) {
-  // Note: use `ArrayBuffer.isView()` to check for Uint8Array. Using
-  //       `instanceof Uint8Array` returns false in some cases. For example,
-  //       when the buffer is created in middleware and passed to NextServer.
-  if (Buffer.isBuffer(data)) {
-    return data.toString("utf8");
-  } else if (ArrayBuffer.isView(data)) {
-    return Buffer.from(data).toString("utf8");
-  } else if (typeof data === "string") {
-    return data;
-  } else {
-    throw new Error(`response.getString() of unexpected type: ${typeof data}`);
-  }
-}
-
-function addData(stream, data) {
+function addData(stream: ServerlessResponse, data: Uint8Array | string) {
   if (
     Buffer.isBuffer(data) ||
     ArrayBuffer.isView(data) ||
@@ -37,77 +28,42 @@ function addData(stream, data) {
   }
 }
 
-export class ServerResponse extends http.ServerResponse {
-  static from(res) {
-    const response = new ServerResponse(res);
-
-    response.statusCode = res.statusCode;
-    response[HEADERS] = res.headers;
-    response[BODY] = [Buffer.from(res.body)];
-    response.end();
-
-    return response;
-  }
-
-  static body(res) {
-    return Buffer.concat(res[BODY]);
-  }
-
-  static headers(res) {
-    const headers =
-      typeof res.getHeaders === "function" ? res.getHeaders() : res._headers;
-
-    return Object.assign(headers, res[HEADERS]);
-  }
-
-  get headers() {
-    return this[HEADERS];
-  }
-
-  setHeader(key, value) {
-    if (this._wroteHeader) {
-      this[HEADERS][key] = value;
-    } else {
-      super.setHeader(key, value);
-    }
-    return this;
-  }
-
-  writeHead(statusCode, reason, obj) {
-    const headers = typeof reason === "string" ? obj : reason;
-
-    for (const name in headers) {
-      this.setHeader(name, headers[name]);
-
-      if (!this._wroteHeader) {
-        // we only need to initiate super.headers once
-        // writeHead will add the other headers itself
-        break;
-      }
-    }
+export interface ServerlessResponseProps {
+  method: string;
+  headers: Record<string, string | string[] | undefined>;
+}
 
-    return super.writeHead(statusCode, reason, obj);
-  }
+export class ServerlessResponse extends http.ServerResponse {
+  [BODY]: Buffer[];
+  [HEADERS]: Record<string, string>;
+  private _wroteHeader = false;
+  private _header = "";
+  private _initialHeaders: Record<string, string> = {};
 
-  constructor({ method, headers }) {
-    super({ method, headers });
+  constructor({ method, headers }: ServerlessResponseProps) {
+    super({ method, headers } as any);
 
     this[BODY] = [];
-    this[HEADERS] = headers || {};
+    this[HEADERS] = parseHeaders(headers) || {};
+    this._initialHeaders = this[HEADERS];
 
     this.useChunkedEncodingByDefault = false;
     this.chunkedEncoding = false;
     this._header = "";
 
-    this.assignSocket({
+    const socket: Partial<Socket> & { _writableState: any } = {
       _writableState: {},
       writable: true,
-      on: Function.prototype,
-      removeListener: Function.prototype,
-      destroy: Function.prototype,
-      cork: Function.prototype,
-      uncork: Function.prototype,
-      write: (data, encoding, cb) => {
+      on: NO_OP,
+      removeListener: NO_OP,
+      destroy: NO_OP,
+      cork: NO_OP,
+      uncork: NO_OP,
+      write: (
+        data: Uint8Array | string,
+        encoding?: string | null | (() => void),
+        cb?: () => void,
+      ) => {
         if (typeof encoding === "function") {
           cb = encoding;
           encoding = null;
@@ -133,11 +89,62 @@ export class ServerResponse extends http.ServerResponse {
         if (typeof cb === "function") {
           cb();
         }
+        return true;
       },
-    });
+    };
+
+    this.assignSocket(socket as Socket);
 
     this.once("finish", () => {
       this.emit("close");
     });
   }
+
+  static body(res: ServerlessResponse) {
+    return Buffer.concat(res[BODY]);
+  }
+
+  static headers(res: ServerlessResponse) {
+    const headers =
+      typeof res.getHeaders === "function" ? res.getHeaders() : res[HEADERS];
+
+    return {
+      ...parseHeaders(headers),
+      ...res[HEADERS],
+      ...res._initialHeaders,
+    };
+  }
+
+  get headers() {
+    return this[HEADERS];
+  }
+
+  setHeader(key: string, value: string | number | string[]): this {
+    if (this._wroteHeader) {
+      this[HEADERS][key] = convertHeader(value);
+    } else {
+      super.setHeader(key, value);
+    }
+    return this;
+  }
+
+  writeHead(
+    statusCode: number,
+    reason?: string | any | any[],
+    obj?: any | any[],
+  ) {
+    const headers = typeof reason === "string" ? obj : reason;
+
+    for (const name in headers) {
+      this.setHeader(name, headers[name]);
+
+      if (!this._wroteHeader) {
+        // we only need to initiate super.headers once
+        // writeHead will add the other headers itself
+        break;
+      }
+    }
+
+    return super.writeHead(statusCode, reason, obj);
+  }
 }
diff --git a/packages/open-next/src/adapters/http/responseStreaming.ts b/packages/open-next/src/adapters/http/responseStreaming.ts
new file mode 100644
index 000000000..233b27587
--- /dev/null
+++ b/packages/open-next/src/adapters/http/responseStreaming.ts
@@ -0,0 +1,268 @@
+import http from "node:http";
+import { Socket } from "node:net";
+import zlib from "node:zlib";
+
+import { debug, error } from "../logger.js";
+import type { ResponseStream } from "../types/aws-lambda.js";
+import { parseCookies } from "../util.js";
+import { convertHeader, getString, NO_OP, parseHeaders } from "./util.js";
+
+const HEADERS = Symbol();
+
+export interface StreamingServerResponseProps {
+  method?: string;
+  headers?: Record<string, string | string[] | undefined>;
+  responseStream: ResponseStream;
+  fixHeaders: (headers: Record<string, string>) => void;
+  onEnd: (headers: Record<string, string>) => Promise<void>;
+}
+export class StreamingServerResponse extends http.ServerResponse {
+  [HEADERS]: Record<string, string> = {};
+  responseStream: ResponseStream;
+  fixHeaders: (headers: Record<string, string>) => void;
+  onEnd: (headers: Record<string, string>) => Promise<void>;
+  private _wroteHeader = false;
+  private _hasWritten = false;
+  private _initialHeaders: Record<string, string> = {};
+  private _cookies: string[] = [];
+  private _compressed = false;
+
+  constructor({
+    method,
+    headers,
+    responseStream,
+    fixHeaders,
+    onEnd,
+  }: StreamingServerResponseProps) {
+    super({ method } as any);
+    if (headers && headers["set-cookie"]) {
+      this._cookies = parseCookies(headers["set-cookie"]) as string[];
+      delete headers["set-cookie"];
+    }
+    this[HEADERS] = parseHeaders(headers) || {};
+    this._initialHeaders = { ...this[HEADERS] };
+
+    this.fixHeaders = fixHeaders;
+    this.onEnd = onEnd;
+    this.responseStream = responseStream;
+
+    this.useChunkedEncodingByDefault = false;
+    this.chunkedEncoding = false;
+
+    this.responseStream.cork();
+
+    const socket: Partial<Socket> & { _writableState: any } = {
+      _writableState: {},
+      writable: true,
+      on: NO_OP,
+      removeListener: NO_OP,
+      destroy: NO_OP,
+      cork: NO_OP,
+      uncork: NO_OP,
+      write: (
+        data: Uint8Array | string,
+        encoding?: string | null | (() => void),
+        cb?: () => void,
+      ) => {
+        if (typeof encoding === "function") {
+          cb = encoding;
+          encoding = undefined;
+        }
+        const d = getString(data);
+        const isSse = d.endsWith("\n\n");
+        this.internalWrite(data, isSse, cb);
+
+        return !this.responseStream.writableNeedDrain;
+      },
+    };
+
+    this.assignSocket(socket as Socket);
+
+    this.responseStream.on("close", this.cancel.bind(this));
+    this.responseStream.on("error", this.cancel.bind(this));
+
+    this.on("close", this.cancel.bind(this));
+    this.on("error", this.cancel.bind(this));
+    this.once("finish", () => {
+      this.emit("close");
+    });
+  }
+
+  get headers() {
+    return this[HEADERS];
+  }
+
+  setHeader(key: string, value: string | number | string[]): this {
+    key = key.toLowerCase();
+    // There can be multiple set-cookie response headers
+    // They need to be returned as a special "cookies" array, eg:
+    // {statusCode: xxx, cookies: ['Cookie=Yum'], ...}
+    if (key === "set-cookie") {
+      this._cookies.push(convertHeader(value));
+    } else {
+      this[HEADERS][key] = convertHeader(value);
+    }
+    return this;
+  }
+
+  removeHeader(key: string): this {
+    key = key.toLowerCase();
+    if (key === "set-cookie") {
+      this._cookies.length = 0;
+    } else {
+      delete this[HEADERS][key];
+    }
+    return this;
+  }
+
+  writeHead(
+    statusCode: number,
+    _statusMessage?:
+      | string
+      | http.OutgoingHttpHeaders
+      | http.OutgoingHttpHeader[],
+    _headers?: http.OutgoingHttpHeaders | http.OutgoingHttpHeader[],
+  ): this {
+    const headers =
+      typeof _statusMessage === "string" ? _headers : _statusMessage;
+    const statusMessage =
+      typeof _statusMessage === "string" ? _statusMessage : undefined;
+    if (this._wroteHeader) {
+      return this;
+    }
+    try {
+      debug("writeHead", statusCode, statusMessage, headers);
+      const parsedHeaders = parseHeaders(headers);
+      this[HEADERS] = {
+        ...this[HEADERS],
+        ...parsedHeaders,
+      };
+
+      this.fixHeaders(this[HEADERS]);
+      this[HEADERS] = {
+        ...this[HEADERS],
+        ...this._initialHeaders,
+      };
+
+      this._compressed = this[HEADERS]["accept-encoding"]?.includes("br");
+      if (this._compressed) {
+        this[HEADERS]["content-encoding"] = "br";
+      }
+      delete this[HEADERS]["accept-encoding"];
+
+      debug("writeHead", this[HEADERS]);
+
+      this._wroteHeader = true;
+      // FIXME: This is extracted from the docker lambda node 18 runtime
+      // https://gist.github.com/conico974/13afd708af20711b97df439b910ceb53#file-index-mjs-L921-L932
+      // We replace their write with ours which are inside a setImmediate
+      // This way it seems to work all the time
+      // I think we can't ship this code as it is, it could break at anytime if they decide to change the runtime and they already did it in the past
+      this.responseStream.setContentType(
+        "application/vnd.awslambda.http-integration-response",
+      );
+      const prelude = JSON.stringify({
+        statusCode: statusCode as number,
+        cookies: this._cookies,
+        headers: this[HEADERS],
+      });
+
+      // Try to flush the buffer to the client to invoke
+      // the streaming. This does not work 100% of the time.
+      setImmediate(() => {
+        this.responseStream.write("\n\n");
+        this.responseStream.uncork();
+      });
+      setImmediate(() => {
+        this.responseStream.write(prelude);
+      });
+
+      setImmediate(() => {
+        this.responseStream.write(new Uint8Array(8));
+
+        // After headers are written, compress all writes
+        // using Brotli
+        if (this._compressed) {
+          const br = zlib.createBrotliCompress({
+            flush: zlib.constants.BROTLI_OPERATION_FLUSH,
+          });
+          br.setMaxListeners(100);
+          br.pipe(this.responseStream);
+          this.responseStream = br as unknown as ResponseStream;
+        }
+      });
+
+      debug("writeHead", this[HEADERS]);
+    } catch (e) {
+      this.responseStream.end();
+      error(e);
+    }
+
+    return this;
+  }
+
+  end(
+    _chunk?: Uint8Array | string | (() => void),
+    _encoding?: BufferEncoding | (() => void),
+    _cb?: (() => void) | undefined,
+  ): this {
+    const chunk = typeof _chunk === "function" ? undefined : _chunk;
+    const cb = typeof _cb === "function" ? _cb : undefined;
+
+    if (!this._wroteHeader) {
+      // When next directly returns with end, the writeHead is not called,
+      // so we need to call it here
+      this.writeHead(this.statusCode ?? 200);
+    }
+
+    if (!this._hasWritten && !chunk) {
+      // We need to send data here if there is none, otherwise the stream will not end at all
+      this.internalWrite(new Uint8Array(8), false, cb);
+    }
+
+    const _end = () => {
+      setImmediate(() => {
+        this.responseStream.end(_chunk, async () => {
+          if (this._compressed) {
+            (this.responseStream as unknown as zlib.BrotliCompress).flush(
+              zlib.constants.BROTLI_OPERATION_FINISH,
+            );
+          }
+          await this.onEnd(this[HEADERS]);
+          cb?.();
+        });
+      });
+    };
+
+    if (this.responseStream.writableNeedDrain) {
+      this.responseStream.once("drain", _end);
+    } else {
+      _end();
+    }
+    return this;
+  }
+
+  private internalWrite(chunk: any, isSse: boolean = false, cb?: () => void) {
+    this._hasWritten = true;
+    setImmediate(() => {
+      this.responseStream.write(chunk, cb);
+
+      // SSE need to flush to send to client ASAP
+      if (isSse) {
+        setImmediate(() => {
+          this.responseStream.write("\n\n");
+          this.responseStream.uncork();
+        });
+      }
+    });
+  }
+
+  cancel(error?: Error) {
+    this.responseStream.off("close", this.cancel.bind(this));
+    this.responseStream.off("error", this.cancel.bind(this));
+
+    if (error) {
+      this.responseStream.destroy(error);
+    }
+  }
+}
diff --git a/packages/open-next/src/adapters/http/util.ts b/packages/open-next/src/adapters/http/util.ts
new file mode 100644
index 000000000..132f6798b
--- /dev/null
+++ b/packages/open-next/src/adapters/http/util.ts
@@ -0,0 +1,50 @@
+import http from "node:http";
+
+export function getString(data: any) {
+  // Note: use `ArrayBuffer.isView()` to check for Uint8Array. Using
+  //       `instanceof Uint8Array` returns false in some cases. For example,
+  //       when the buffer is created in middleware and passed to NextServer.
+  if (Buffer.isBuffer(data)) {
+    return data.toString("utf8");
+  } else if (ArrayBuffer.isView(data)) {
+    //@ts-ignore
+    return Buffer.from(data).toString("utf8");
+  } else if (typeof data === "string") {
+    return data;
+  } else {
+    throw new Error(`response.getString() of unexpected type: ${typeof data}`);
+  }
+}
+
+export const headerEnd = "\r\n\r\n";
+
+export const NO_OP: (...args: any[]) => any = () => void 0;
+
+export const parseHeaders = (
+  headers?: http.OutgoingHttpHeader[] | http.OutgoingHttpHeaders,
+) => {
+  const result: Record<string, string> = {};
+  if (!headers) {
+    return result;
+  }
+
+  for (const [key, value] of Object.entries(headers)) {
+    if (value === undefined) {
+      continue;
+    } else {
+      result[key] = convertHeader(value);
+    }
+  }
+
+  return result;
+};
+
+export const convertHeader = (header: http.OutgoingHttpHeader) => {
+  if (typeof header === "string") {
+    return header;
+  } else if (Array.isArray(header)) {
+    return header.join(",");
+  } else {
+    return String(header);
+  }
+};
diff --git a/packages/open-next/src/adapters/image-optimization-adapter.ts b/packages/open-next/src/adapters/image-optimization-adapter.ts
index f0c5ea269..f5fbb26bc 100644
--- a/packages/open-next/src/adapters/image-optimization-adapter.ts
+++ b/packages/open-next/src/adapters/image-optimization-adapter.ts
@@ -21,8 +21,9 @@ import {
 // @ts-ignore
 import type { NextUrlWithParsedQuery } from "next/dist/server/request-meta";
 
+import { loadConfig } from "./config/util.js";
 import { awsLogger, debug, error } from "./logger.js";
-import { loadConfig, setNodeEnv } from "./util.js";
+import { setNodeEnv } from "./util.js";
 
 // Expected environment variables
 const { BUCKET_NAME, BUCKET_KEY_PREFIX } = process.env;
diff --git a/packages/open-next/src/adapters/next-types.ts b/packages/open-next/src/adapters/next-types.ts
index b2e26affc..c739765a5 100644
--- a/packages/open-next/src/adapters/next-types.ts
+++ b/packages/open-next/src/adapters/next-types.ts
@@ -1,8 +1,8 @@
 // NOTE: add more next config typings as they become relevant
 
 import { InternalEvent } from "./event-mapper.js";
-import { IncomingMessage } from "./request.js";
-import { ServerResponse } from "./response.js";
+import { IncomingMessage } from "./http/request.js";
+import { ServerlessResponse } from "./http/response.js";
 
 type RemotePattern = {
   protocol?: "http" | "https";
@@ -138,7 +138,7 @@ export type Options = {
 export interface PluginHandler {
   (
     req: IncomingMessage,
-    res: ServerResponse,
+    res: ServerlessResponse,
     options: Options,
-  ): Promise<ServerResponse | undefined>;
+  ): Promise<ServerlessResponse | undefined>;
 }
diff --git a/packages/open-next/src/adapters/plugins/13.5/serverHandler.ts b/packages/open-next/src/adapters/plugins/13.5/serverHandler.ts
index 83a66dc41..dc7f98647 100644
--- a/packages/open-next/src/adapters/plugins/13.5/serverHandler.ts
+++ b/packages/open-next/src/adapters/plugins/13.5/serverHandler.ts
@@ -1,7 +1,7 @@
 /*eslint-disable simple-import-sort/imports */
-import type { Options, PluginHandler } from "../../next-types.js";
-import type { IncomingMessage } from "../../request.js";
-import type { ServerResponse } from "../../response.js";
+import type { Options, PluginHandler } from "../../types/next-types.js";
+import type { IncomingMessage } from "../../http/request.js";
+import type { ServerlessResponse } from "../../http/response.js";
 //#override imports
 //@ts-ignore
 import { requestHandler } from "./util.js";
@@ -12,7 +12,7 @@ import { proxyRequest } from "./routing/util.js";
 //#override handler
 export const handler: PluginHandler = async (
   req: IncomingMessage,
-  res: ServerResponse,
+  res: ServerlessResponse,
   options: Options,
 ) => {
   if (options.isExternalRewrite) {
diff --git a/packages/open-next/src/adapters/plugins/13.5/util.ts b/packages/open-next/src/adapters/plugins/13.5/util.ts
index 4ef61fde6..4bf53b923 100644
--- a/packages/open-next/src/adapters/plugins/13.5/util.ts
+++ b/packages/open-next/src/adapters/plugins/13.5/util.ts
@@ -1,9 +1,4 @@
-// import path from "node:path";
-
 import { debug } from "../../logger.js";
-// import { loadConfig } from "../../util.js";
-
-// const NEXT_DIR = path.join(__dirname, ".next");
 
 //#override requireHooks
 debug("No need to override require hooks with next 13.4.20+");
diff --git a/packages/open-next/src/adapters/plugins/lambdaHandler.ts b/packages/open-next/src/adapters/plugins/lambdaHandler.ts
new file mode 100644
index 000000000..7d7a614e9
--- /dev/null
+++ b/packages/open-next/src/adapters/plugins/lambdaHandler.ts
@@ -0,0 +1,139 @@
+import {
+  APIGatewayProxyEvent,
+  APIGatewayProxyEventV2,
+  CloudFrontRequestEvent,
+} from "aws-lambda";
+
+import { BuildId, PublicAssets } from "../config";
+import { convertFrom, convertTo, InternalEvent } from "../event-mapper";
+import { type IncomingMessage, ServerlessResponse } from "../http";
+import { debug, error } from "../logger";
+import { CreateResponse } from "../types/plugin";
+import { generateUniqueId } from "../util";
+import { WarmerEvent, WarmerResponse } from "../warmer-function";
+//#override imports
+import {
+  postProcessResponse,
+  processInternalEvent,
+} from "./routing/default.js";
+//#endOverride
+import { handler as serverHandler } from "./serverHandler";
+
+const serverId = `server-${generateUniqueId()}`;
+
+//#override lambdaHandler
+export async function lambdaHandler(
+  event:
+    | APIGatewayProxyEventV2
+    | CloudFrontRequestEvent
+    | APIGatewayProxyEvent
+    | WarmerEvent,
+) {
+  debug("event", event);
+  // Handler warmer
+  if ("type" in event) {
+    return formatWarmerResponse(event);
+  }
+
+  // Parse Lambda event and create Next.js request
+  const internalEvent = convertFrom(event);
+
+  // WORKAROUND: Set `x-forwarded-host` header (AWS specific) — https://github.com/serverless-stack/open-next#workaround-set-x-forwarded-host-header-aws-specific
+  if (internalEvent.headers["x-forwarded-host"]) {
+    internalEvent.headers.host = internalEvent.headers["x-forwarded-host"];
+  }
+
+  // WORKAROUND: public/ static files served by the server function (AWS specific) — https://github.com/serverless-stack/open-next#workaround-public-static-files-served-by-the-server-function-aws-specific
+  // TODO: This is no longer required if each top-level file and folder in "/public"
+  //       is handled by a separate cache behavior. Leaving here for backward compatibility.
+  //       Remove this on next major release.
+  if (PublicAssets.files.includes(internalEvent.rawPath)) {
+    return internalEvent.type === "cf"
+      ? formatCloudFrontFailoverResponse(event as CloudFrontRequestEvent)
+      : formatAPIGatewayFailoverResponse();
+  }
+
+  const createServerResponse: CreateResponse<ServerlessResponse> = (
+    method,
+    headers,
+  ) => new ServerlessResponse({ method, headers });
+
+  const preprocessResult = await processInternalEvent(
+    internalEvent,
+    createServerResponse,
+  );
+  if ("type" in preprocessResult) {
+    return convertTo(preprocessResult);
+  } else {
+    const {
+      req,
+      res,
+      isExternalRewrite,
+      internalEvent: overwrittenInternalEvent,
+    } = preprocessResult;
+
+    await processRequest(req, res, overwrittenInternalEvent, isExternalRewrite);
+
+    const internalResult = await postProcessResponse({
+      internalEvent: overwrittenInternalEvent,
+      req,
+      res,
+      isExternalRewrite,
+    });
+
+    return convertTo(internalResult);
+  }
+}
+//#endOverride
+
+async function processRequest(
+  req: IncomingMessage,
+  res: ServerlessResponse,
+  internalEvent: InternalEvent,
+  isExternalRewrite?: boolean,
+) {
+  // @ts-ignore
+  // Next.js doesn't parse body if the property exists
+  // https://github.com/dougmoscrop/serverless-http/issues/227
+  delete req.body;
+
+  try {
+    // `serverHandler` is replaced at build time depending on user's
+    // nextjs version to patch Nextjs 13.4.x and future breaking changes.
+    await serverHandler(req, res, {
+      internalEvent,
+      buildId: BuildId,
+      isExternalRewrite,
+    });
+  } catch (e: any) {
+    error("NextJS request failed.", e);
+
+    res.setHeader("Content-Type", "application/json");
+    res.end(
+      JSON.stringify(
+        {
+          message: "Server failed to respond.",
+          details: e,
+        },
+        null,
+        2,
+      ),
+    );
+  }
+}
+
+function formatAPIGatewayFailoverResponse() {
+  return { statusCode: 503 };
+}
+
+function formatCloudFrontFailoverResponse(event: CloudFrontRequestEvent) {
+  return event.Records[0].cf.request;
+}
+
+function formatWarmerResponse(event: WarmerEvent) {
+  return new Promise<WarmerResponse>((resolve) => {
+    setTimeout(() => {
+      resolve({ serverId } satisfies WarmerResponse);
+    }, event.delay);
+  });
+}
diff --git a/packages/open-next/src/adapters/plugins/routing/default.replacement.ts b/packages/open-next/src/adapters/plugins/routing/default.replacement.ts
index 5d4f7ff79..8a21440c9 100644
--- a/packages/open-next/src/adapters/plugins/routing/default.replacement.ts
+++ b/packages/open-next/src/adapters/plugins/routing/default.replacement.ts
@@ -1,44 +1,51 @@
 /* eslint-disable simple-import-sort/imports */
-import type { PostProcessOptions, ProcessInternalEventResult } from "./types";
-import type { InternalEvent, InternalResult } from "../../event-mapper";
+import type {
+  PostProcessOptions,
+  ProcessInternalEvent,
+} from "../../types/plugin";
+import type { InternalResult } from "../../event-mapper";
 //#override imports
-import path from "node:path";
 
 import { debug } from "../../logger";
-import { IncomingMessage } from "../../request";
-import { ServerResponse } from "../../response";
+import { IncomingMessage } from "../../http/request";
 import {
   addNextConfigHeaders,
   fixDataPage,
+  handleFallbackFalse,
   handleRedirects,
   handleRewrites,
 } from "../../routing/matcher";
-import { loadBuildId, loadConfigHeaders, loadRoutesManifest } from "../../util";
 import {
   addOpenNextHeader,
   fixCacheHeaderForHtmlPages,
+  fixISRHeaders,
   fixSWRCacheHeader,
   revalidateIfRequired,
 } from "./util";
 import { convertRes } from "../../routing/util";
 import { handleMiddleware } from "../../routing/middleware";
+import { ServerlessResponse } from "../../http";
+import {
+  BuildId,
+  ConfigHeaders,
+  PrerenderManifest,
+  RoutesManifest,
+} from "../../config";
 
-const NEXT_DIR = path.join(__dirname, ".next");
-const buildId = loadBuildId(NEXT_DIR);
-const routesManifest = loadRoutesManifest(NEXT_DIR);
-const configHeaders = loadConfigHeaders(NEXT_DIR);
 //#endOverride
 
 //#override processInternalEvent
-export async function processInternalEvent(
-  event: InternalEvent,
-): Promise<ProcessInternalEventResult> {
-  const nextHeaders = addNextConfigHeaders(event, configHeaders) ?? {};
-  debug("nextHeaders", nextHeaders);
+export const processInternalEvent: ProcessInternalEvent = async (
+  event,
+  createResponse,
+) => {
+  const nextHeaders = addNextConfigHeaders(event, ConfigHeaders) ?? {};
+
+  let internalEvent = fixDataPage(event, BuildId);
 
-  let internalEvent = fixDataPage(event, buildId);
+  internalEvent = handleFallbackFalse(internalEvent, PrerenderManifest);
 
-  const redirect = handleRedirects(internalEvent, routesManifest.redirects);
+  const redirect = handleRedirects(internalEvent, RoutesManifest.redirects);
   if (redirect) {
     return redirect;
   }
@@ -56,12 +63,12 @@ export async function processInternalEvent(
   // First rewrite to be applied
   const beforeRewrites = handleRewrites(
     internalEvent,
-    routesManifest.rewrites.beforeFiles,
+    RoutesManifest.rewrites.beforeFiles,
   );
   internalEvent = beforeRewrites.internalEvent;
   isExternalRewrite = beforeRewrites.isExternalRewrite;
 
-  const isStaticRoute = routesManifest.routes.static.some((route) =>
+  const isStaticRoute = RoutesManifest.routes.static.some((route) =>
     new RegExp(route.regex).test(event.rawPath),
   );
 
@@ -69,20 +76,20 @@ export async function processInternalEvent(
     // Second rewrite to be applied
     const afterRewrites = handleRewrites(
       internalEvent,
-      routesManifest.rewrites.afterFiles,
+      RoutesManifest.rewrites.afterFiles,
     );
     internalEvent = afterRewrites.internalEvent;
     isExternalRewrite = afterRewrites.isExternalRewrite;
   }
 
-  const isDynamicRoute = routesManifest.routes.dynamic.some((route) =>
+  const isDynamicRoute = RoutesManifest.routes.dynamic.some((route) =>
     new RegExp(route.regex).test(event.rawPath),
   );
   if (!isDynamicRoute && !isStaticRoute && !isExternalRewrite) {
     // Fallback rewrite to be applied
     const fallbackRewrites = handleRewrites(
       internalEvent,
-      routesManifest.rewrites.fallback,
+      RoutesManifest.rewrites.fallback,
     );
     internalEvent = fallbackRewrites.internalEvent;
     isExternalRewrite = fallbackRewrites.isExternalRewrite;
@@ -102,17 +109,13 @@ export async function processInternalEvent(
   };
   debug("IncomingMessage constructor props", reqProps);
   const req = new IncomingMessage(reqProps);
-  const res = new ServerResponse({
-    method: reqProps.method,
-    // Next headers should be added first in case middleware modifies headers
-    headers: {
-      ...nextHeaders,
-      ...middlewareResponseHeaders,
-    },
+  const res = createResponse(reqProps.method, {
+    ...nextHeaders,
+    ...middlewareResponseHeaders,
   });
 
   return { internalEvent: internalEvent, req, res, isExternalRewrite };
-}
+};
 //#endOverride
 
 //#override postProcessResponse
@@ -122,7 +125,9 @@ export async function postProcessResponse({
   res,
   isExternalRewrite,
 }: PostProcessOptions): Promise<InternalResult> {
-  const { statusCode, headers, isBase64Encoded, body } = convertRes(res);
+  const { statusCode, headers, isBase64Encoded, body } = convertRes(
+    res as ServerlessResponse,
+  );
 
   debug("ServerResponse data", { statusCode, headers, isBase64Encoded, body });
 
@@ -130,6 +135,7 @@ export async function postProcessResponse({
     fixCacheHeaderForHtmlPages(internalEvent.rawPath, headers);
     fixSWRCacheHeader(headers);
     addOpenNextHeader(headers);
+    fixISRHeaders(headers);
 
     await revalidateIfRequired(
       internalEvent.headers.host,
diff --git a/packages/open-next/src/adapters/plugins/routing/default.ts b/packages/open-next/src/adapters/plugins/routing/default.ts
index 6c3998181..5f2694dad 100644
--- a/packages/open-next/src/adapters/plugins/routing/default.ts
+++ b/packages/open-next/src/adapters/plugins/routing/default.ts
@@ -1,23 +1,30 @@
 /* eslint-disable simple-import-sort/imports */
-import type { PostProcessOptions, ProcessInternalEventResult } from "./types";
+import type {
+  CreateResponse,
+  PostProcessOptions,
+  ProcessInternalEventResult,
+} from "../../types/plugin";
 import type { InternalEvent, InternalResult } from "../../event-mapper";
 //#override imports
 import { debug } from "../../logger";
-import { IncomingMessage } from "../../request";
-import { ServerResponse } from "../../response";
+import { IncomingMessage } from "../../http/request";
 import {
   addOpenNextHeader,
   fixCacheHeaderForHtmlPages,
+  fixISRHeaders,
   fixSWRCacheHeader,
   revalidateIfRequired,
 } from "./util";
 import { convertRes } from "../../routing/util";
+import { ServerlessResponse } from "../../http";
+import { ServerResponse } from "http";
 //#endOverride
 
 //#override processInternalEvent
-export async function processInternalEvent(
+export async function processInternalEvent<Response extends ServerResponse>(
   internalEvent: InternalEvent,
-): Promise<ProcessInternalEventResult> {
+  createResponse: CreateResponse<Response>,
+): Promise<ProcessInternalEventResult<Response>> {
   const reqProps = {
     method: internalEvent.method,
     url: internalEvent.url,
@@ -31,7 +38,7 @@ export async function processInternalEvent(
     remoteAddress: internalEvent.remoteAddress,
   };
   const req = new IncomingMessage(reqProps);
-  const res = new ServerResponse({ method: reqProps.method, headers: {} });
+  const res = createResponse(reqProps.method, {});
   return { internalEvent, req, res, isExternalRewrite: false };
 }
 //#endOverride
@@ -43,7 +50,9 @@ export async function postProcessResponse({
   res,
   isExternalRewrite,
 }: PostProcessOptions): Promise<InternalResult> {
-  const { statusCode, headers, isBase64Encoded, body } = convertRes(res);
+  const { statusCode, headers, isBase64Encoded, body } = convertRes(
+    res as ServerlessResponse,
+  );
 
   debug("ServerResponse data", { statusCode, headers, isBase64Encoded, body });
 
@@ -51,6 +60,7 @@ export async function postProcessResponse({
     fixCacheHeaderForHtmlPages(internalEvent.rawPath, headers);
     fixSWRCacheHeader(headers);
     addOpenNextHeader(headers);
+    fixISRHeaders(headers);
 
     await revalidateIfRequired(
       internalEvent.headers.host,
diff --git a/packages/open-next/src/adapters/plugins/routing/types.ts b/packages/open-next/src/adapters/plugins/routing/types.ts
deleted file mode 100644
index 194272d1e..000000000
--- a/packages/open-next/src/adapters/plugins/routing/types.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import type { InternalEvent, InternalResult } from "../../event-mapper";
-import { IncomingMessage } from "../../request";
-import { ServerResponse } from "../../response";
-
-export type ProcessInternalEventResult =
-  | {
-      internalEvent: InternalEvent;
-      req: IncomingMessage;
-      res: ServerResponse;
-      isExternalRewrite: boolean;
-    }
-  | InternalResult;
-
-export interface PostProcessOptions {
-  internalEvent: InternalEvent;
-  req: IncomingMessage;
-  res: ServerResponse;
-  isExternalRewrite?: boolean;
-}
diff --git a/packages/open-next/src/adapters/plugins/routing/util.ts b/packages/open-next/src/adapters/plugins/routing/util.ts
index abd6cab9b..2eb35e260 100644
--- a/packages/open-next/src/adapters/plugins/routing/util.ts
+++ b/packages/open-next/src/adapters/plugins/routing/util.ts
@@ -1,11 +1,10 @@
 import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs";
 import crypto from "crypto";
-import path from "path";
 
+import { BuildId, HtmlPages } from "../../config/index.js";
+import { IncomingMessage } from "../../http/request.js";
+import { ServerlessResponse } from "../../http/response.js";
 import { awsLogger, debug } from "../../logger.js";
-import { IncomingMessage } from "../../request.js";
-import { ServerResponse } from "../../response.js";
-import { loadBuildId, loadHtmlPages } from "../../util.js";
 
 enum CommonHeaders {
   CACHE_CONTROL = "cache-control",
@@ -13,16 +12,16 @@ enum CommonHeaders {
 
 // Expected environment variables
 const { REVALIDATION_QUEUE_REGION, REVALIDATION_QUEUE_URL } = process.env;
-const NEXT_DIR = path.join(__dirname, ".next");
-const htmlPages = loadHtmlPages(NEXT_DIR);
-const buildId = loadBuildId(NEXT_DIR);
 
 const sqsClient = new SQSClient({
   region: REVALIDATION_QUEUE_REGION,
   logger: awsLogger,
 });
 
-export async function proxyRequest(req: IncomingMessage, res: ServerResponse) {
+export async function proxyRequest(
+  req: IncomingMessage,
+  res: ServerlessResponse,
+) {
   const HttpProxy = require("next/dist/compiled/http-proxy") as any;
 
   const proxy = new HttpProxy({
@@ -52,7 +51,7 @@ export function fixCacheHeaderForHtmlPages(
   headers: Record<string, string | undefined>,
 ) {
   // WORKAROUND: `NextServer` does not set cache headers for HTML pages — https://github.com/serverless-stack/open-next#workaround-nextserver-does-not-set-cache-headers-for-html-pages
-  if (htmlPages.includes(rawPath) && headers[CommonHeaders.CACHE_CONTROL]) {
+  if (HtmlPages.includes(rawPath) && headers[CommonHeaders.CACHE_CONTROL]) {
     headers[CommonHeaders.CACHE_CONTROL] =
       "public, max-age=0, s-maxage=31536000, must-revalidate";
   }
@@ -62,12 +61,12 @@ export function fixSWRCacheHeader(
   headers: Record<string, string | string[] | undefined>,
 ) {
   // WORKAROUND: `NextServer` does not set correct SWR cache headers — https://github.com/serverless-stack/open-next#workaround-nextserver-does-not-set-correct-swr-cache-headers
-  let cacheControl = headers["cache-control"];
+  let cacheControl = headers[CommonHeaders.CACHE_CONTROL];
   if (!cacheControl) return;
   if (Array.isArray(cacheControl)) {
     cacheControl = cacheControl.join(",");
   }
-  headers["cache-control"] = cacheControl.replace(
+  headers[CommonHeaders.CACHE_CONTROL] = cacheControl.replace(
     /\bstale-while-revalidate(?!=)/,
     "stale-while-revalidate=2592000", // 30 days
   );
@@ -81,7 +80,7 @@ export async function revalidateIfRequired(
   host: string,
   rawPath: string,
   headers: Record<string, string | undefined>,
-  req: IncomingMessage,
+  req?: IncomingMessage,
 ) {
   // If the page has been revalidated via on demand revalidation, we need to remove the cache-control so that CloudFront doesn't cache the page
   if (headers["x-nextjs-cache"] === "REVALIDATED") {
@@ -102,7 +101,7 @@ export async function revalidateIfRequired(
   // - Link to Next.js doc: https://nextjs.org/docs/pages/building-your-application/data-fetching/incremental-static-regeneration#on-demand-revalidation
   // - Link to NextInternalRequestMeta: https://github.com/vercel/next.js/blob/57ab2818b93627e91c937a130fb56a36c41629c3/packages/next/src/server/request-meta.ts#L11
   // @ts-ignore
-  const internalMeta = req[Symbol.for("NextInternalRequestMeta")];
+  const internalMeta = req?.[Symbol.for("NextInternalRequestMeta")];
 
   // When using Pages Router, two requests will be received:
   // 1. one for the page: /foo
@@ -111,7 +110,7 @@ export async function revalidateIfRequired(
   // does not include the "/_next/data/" prefix. Need to add it.
   const revalidateUrl = internalMeta?._nextDidRewrite
     ? rawPath.startsWith("/_next/data/")
-      ? `/_next/data/${buildId}${internalMeta?._nextRewroteUrl}.json`
+      ? `/_next/data/${BuildId}${internalMeta?._nextRewroteUrl}.json`
       : internalMeta?._nextRewroteUrl
     : rawPath;
 
@@ -181,3 +180,19 @@ function cyrb128(str: string) {
   (h1 ^= h2 ^ h3 ^ h4), (h2 ^= h1), (h3 ^= h1), (h4 ^= h1);
   return h1 >>> 0;
 }
+
+export function fixISRHeaders(headers: Record<string, string | undefined>) {
+  if (headers["x-nextjs-cache"] === "REVALIDATED") {
+    headers[CommonHeaders.CACHE_CONTROL] =
+      "private, no-cache, no-store, max-age=0, must-revalidate";
+    return;
+  }
+  if (headers["x-nextjs-cache"] !== "STALE") return;
+
+  // If the cache is stale, we revalidate in the background
+  // In order for CloudFront SWR to work, we set the stale-while-revalidate value to 2 seconds
+  // This will cause CloudFront to cache the stale data for a short period of time while we revalidate in the background
+  // Once the revalidation is complete, CloudFront will serve the fresh data
+  headers[CommonHeaders.CACHE_CONTROL] =
+    "s-maxage=2, stale-while-revalidate=2592000";
+}
diff --git a/packages/open-next/src/adapters/plugins/serverHandler.replacement.ts b/packages/open-next/src/adapters/plugins/serverHandler.replacement.ts
index 3cb0648d7..1b311b0c1 100644
--- a/packages/open-next/src/adapters/plugins/serverHandler.replacement.ts
+++ b/packages/open-next/src/adapters/plugins/serverHandler.replacement.ts
@@ -1,9 +1,9 @@
 /*eslint-disable simple-import-sort/imports */
-import type { Options, PluginHandler } from "../next-types.js";
+import type { Options, PluginHandler } from "../types/next-types.js";
+import type { IncomingMessage } from "../http/request.js";
+import type { ServerlessResponse } from "../http/response.js";
 //#override imports
 
-import { IncomingMessage } from "../request.js";
-import { ServerResponse } from "../response.js";
 import { proxyRequest } from "./routing/util.js";
 import { requestHandler, setNextjsPrebundledReact } from "./util.js";
 //#endOverride
@@ -11,7 +11,7 @@ import { requestHandler, setNextjsPrebundledReact } from "./util.js";
 //#override handler
 export const handler: PluginHandler = async (
   req: IncomingMessage,
-  res: ServerResponse,
+  res: ServerlessResponse,
   options: Options,
 ) => {
   let { internalEvent } = options;
diff --git a/packages/open-next/src/adapters/plugins/serverHandler.ts b/packages/open-next/src/adapters/plugins/serverHandler.ts
index 2bd8670be..620e1e90a 100644
--- a/packages/open-next/src/adapters/plugins/serverHandler.ts
+++ b/packages/open-next/src/adapters/plugins/serverHandler.ts
@@ -1,6 +1,6 @@
-import type { Options, PluginHandler } from "../next-types.js";
-import type { IncomingMessage } from "../request.js";
-import type { ServerResponse } from "../response.js";
+import type { IncomingMessage } from "../http/request.js";
+import { ServerlessResponse } from "../http/response.js";
+import type { Options, PluginHandler } from "../types/next-types.js";
 //#override imports
 import { requestHandler, setNextjsPrebundledReact } from "./util.js";
 //#endOverride
@@ -8,7 +8,7 @@ import { requestHandler, setNextjsPrebundledReact } from "./util.js";
 //#override handler
 export const handler: PluginHandler = async (
   req: IncomingMessage,
-  res: ServerResponse,
+  res: ServerlessResponse,
   options: Options,
 ) => {
   setNextjsPrebundledReact(options.internalEvent.rawPath);
diff --git a/packages/open-next/src/adapters/plugins/streaming.replacement.ts b/packages/open-next/src/adapters/plugins/streaming.replacement.ts
new file mode 100644
index 000000000..7a3190247
--- /dev/null
+++ b/packages/open-next/src/adapters/plugins/streaming.replacement.ts
@@ -0,0 +1,104 @@
+/*eslint-disable simple-import-sort/imports */
+import type {
+  APIGatewayProxyEvent,
+  APIGatewayProxyEventV2,
+  CloudFrontRequestEvent,
+} from "aws-lambda";
+
+import { convertFrom } from "../event-mapper";
+import { debug } from "../logger";
+import type { ResponseStream } from "../types/aws-lambda";
+import type { WarmerEvent } from "../warmer-function";
+//#override imports
+import { StreamingServerResponse } from "../http/responseStreaming";
+import { processInternalEvent } from "./routing/default.js";
+import {
+  addOpenNextHeader,
+  fixCacheHeaderForHtmlPages,
+  fixISRHeaders,
+  fixSWRCacheHeader,
+  revalidateIfRequired,
+} from "./routing/util";
+import { CreateResponse } from "../types/plugin";
+//#endOverride
+
+//#override lambdaHandler
+export const lambdaHandler = awslambda.streamifyResponse(async function (
+  event:
+    | APIGatewayProxyEventV2
+    | CloudFrontRequestEvent
+    | APIGatewayProxyEvent
+    | WarmerEvent,
+  responseStream: ResponseStream,
+) {
+  debug("event", event);
+
+  // Handler warmer
+  if ("type" in event) {
+    // @ts-ignore formatWarmerResponse defined in lambdaHandler
+    const result = await formatWarmerResponse(event);
+    responseStream.end(Buffer.from(JSON.stringify(result)), "utf-8");
+    return;
+  }
+  // Parse Lambda event and create Next.js request
+  const internalEvent = convertFrom(event);
+
+  // WORKAROUND: Set `x-forwarded-host` header (AWS specific) — https://github.com/serverless-stack/open-next#workaround-set-x-forwarded-host-header-aws-specific
+  if (internalEvent.headers["x-forwarded-host"]) {
+    internalEvent.headers.host = internalEvent.headers["x-forwarded-host"];
+  }
+
+  const createServerResponse: CreateResponse<StreamingServerResponse> = (
+    method: string,
+    headers: Record<string, string | string[] | undefined>,
+  ) => {
+    // sets the accept-encoding for responseStreaming.ts to set "content-encoding"
+    headers["accept-encoding"] = internalEvent.headers["accept-encoding"];
+    return new StreamingServerResponse({
+      method,
+      headers,
+      responseStream,
+      // We need to fix the cache header before sending any response
+      fixHeaders: (headers) => {
+        fixCacheHeaderForHtmlPages(internalEvent.rawPath, headers);
+        fixSWRCacheHeader(headers);
+        addOpenNextHeader(headers);
+        fixISRHeaders(headers);
+      },
+      // This run in the callback of the response stream end
+      onEnd: async (headers) => {
+        await revalidateIfRequired(
+          internalEvent.headers.host,
+          internalEvent.rawPath,
+          headers,
+        );
+      },
+    });
+  };
+
+  const preprocessResult = await processInternalEvent(
+    internalEvent,
+    createServerResponse,
+  );
+  if ("type" in preprocessResult) {
+    const headers = preprocessResult.headers;
+    const res = createServerResponse("GET", headers);
+
+    setImmediate(() => {
+      res.writeHead(preprocessResult.statusCode, headers);
+      res.write(preprocessResult.body);
+      res.end();
+    });
+  } else {
+    const {
+      req,
+      res,
+      isExternalRewrite,
+      internalEvent: overwrittenInternalEvent,
+    } = preprocessResult;
+
+    //@ts-expect-error - processRequest is already defined in serverHandler.ts
+    await processRequest(req, res, overwrittenInternalEvent, isExternalRewrite);
+  }
+});
+//#endOverride
diff --git a/packages/open-next/src/adapters/plugins/util.replacement.ts b/packages/open-next/src/adapters/plugins/util.replacement.ts
index 87a3178fa..6d44b404a 100644
--- a/packages/open-next/src/adapters/plugins/util.replacement.ts
+++ b/packages/open-next/src/adapters/plugins/util.replacement.ts
@@ -1,22 +1,17 @@
-import path from "node:path";
+import { NextConfig } from "../config";
 
-import { loadConfig } from "../util.js";
-
-const NEXT_DIR = path.join(__dirname, ".next");
-
-const config = loadConfig(NEXT_DIR);
 //#override requestHandler
 // @ts-ignore
 export const requestHandler = new NextServer.default({
   conf: {
-    ...config,
+    ...NextConfig,
     // Next.js compression should be disabled because of a bug in the bundled
     // `compression` package — https://github.com/vercel/next.js/issues/11669
     compress: false,
     // By default, Next.js uses local disk to store ISR cache. We will use
     // our own cache handler to store the cache on S3.
     experimental: {
-      ...config.experimental,
+      ...NextConfig.experimental,
       // This uses the request.headers.host as the URL
       // https://github.com/vercel/next.js/blob/canary/packages/next/src/server/next-server.ts#L1749-L1754
       trustHostHeader: true,
diff --git a/packages/open-next/src/adapters/plugins/util.ts b/packages/open-next/src/adapters/plugins/util.ts
index c2543479c..5f8468978 100644
--- a/packages/open-next/src/adapters/plugins/util.ts
+++ b/packages/open-next/src/adapters/plugins/util.ts
@@ -4,24 +4,17 @@ import path from "node:path";
 // @ts-ignore
 import NextServer from "next/dist/server/next-server.js";
 
+import {
+  AppPathsManifestKeys,
+  NextConfig,
+  RoutesManifest,
+} from "../config/index.js";
 import { debug } from "../logger.js";
-import { MiddlewareManifest } from "../next-types.js";
 import {
   applyOverride as applyNextjsRequireHooksOverride,
   overrideHooks as overrideNextjsRequireHooks,
 } from "../require-hooks.js";
-import {
-  loadAppPathsManifestKeys,
-  loadConfig,
-  loadRoutesManifest,
-} from "../util.js";
-
-const NEXT_DIR = path.join(__dirname, ".next");
-
-const routesManifest = loadRoutesManifest(NEXT_DIR);
-const appPathsManifestKeys = loadAppPathsManifestKeys(NEXT_DIR);
-
-const config = loadConfig(NEXT_DIR);
+import { MiddlewareManifest } from "../types/next-types.js";
 
 // WORKAROUND: Set `__NEXT_PRIVATE_PREBUNDLED_REACT` to use prebundled React — https://github.com/serverless-stack/open-next#workaround-set-__next_private_prebundled_react-to-use-prebundled-react
 // Step 1: Need to override the require hooks for React before Next.js server
@@ -31,7 +24,7 @@ const config = loadConfig(NEXT_DIR);
 //         override that Next.js does is done at import time
 
 //#override requireHooks
-overrideNextjsRequireHooks(config);
+overrideNextjsRequireHooks(NextConfig);
 applyNextjsRequireHooksOverride();
 //#endOverride
 
@@ -41,14 +34,14 @@ export const requestHandler = new NextServer.default({
   hostname: "localhost",
   port: 3000,
   conf: {
-    ...config,
+    ...NextConfig,
     // Next.js compression should be disabled because of a bug in the bundled
     // `compression` package — https://github.com/vercel/next.js/issues/11669
     compress: false,
     // By default, Next.js uses local disk to store ISR cache. We will use
     // our own cache handler to store the cache on S3.
     experimental: {
-      ...config.experimental,
+      ...NextConfig.experimental,
       incrementalCacheHandlerPath: `${process.env.LAMBDA_TASK_ROOT}/cache.cjs`,
     },
   },
@@ -75,20 +68,20 @@ export function setNextjsPrebundledReact(rawPath: string) {
   // WORKAROUND: Set `__NEXT_PRIVATE_PREBUNDLED_REACT` to use prebundled React — https://github.com/serverless-stack/open-next#workaround-set-__next_private_prebundled_react-to-use-prebundled-react
 
   const routes = [
-    ...routesManifest.routes.static,
-    ...routesManifest.routes.dynamic,
+    ...RoutesManifest.routes.static,
+    ...RoutesManifest.routes.dynamic,
   ];
 
   const route = routes.find((route) =>
     new RegExp(route.regex).test(rawPath ?? ""),
   );
 
-  const isApp = appPathsManifestKeys.includes(route?.page ?? "");
+  const isApp = AppPathsManifestKeys.includes(route?.page ?? "");
   debug("setNextjsPrebundledReact", { url: rawPath, isApp, route });
 
   // app routes => use prebundled React
   if (isApp) {
-    process.env.__NEXT_PRIVATE_PREBUNDLED_REACT = config.experimental
+    process.env.__NEXT_PRIVATE_PREBUNDLED_REACT = NextConfig.experimental
       .serverActions
       ? "experimental"
       : "next";
diff --git a/packages/open-next/src/adapters/require-hooks.ts b/packages/open-next/src/adapters/require-hooks.ts
index c4914f573..255fe2f0f 100644
--- a/packages/open-next/src/adapters/require-hooks.ts
+++ b/packages/open-next/src/adapters/require-hooks.ts
@@ -3,7 +3,7 @@
 // Individually compiled modules are as defined for the compilation in bundles/webpack/packages/*.
 
 import { error } from "./logger.js";
-import type { NextConfig } from "./next-types.js";
+import type { NextConfig } from "./types/next-types.js";
 
 // This module will only be loaded once per process.
 
diff --git a/packages/open-next/src/adapters/routing/matcher.ts b/packages/open-next/src/adapters/routing/matcher.ts
index 5dedd3d1b..516e8b092 100644
--- a/packages/open-next/src/adapters/routing/matcher.ts
+++ b/packages/open-next/src/adapters/routing/matcher.ts
@@ -4,10 +4,11 @@ import { InternalEvent, InternalResult } from "../event-mapper";
 import { debug } from "../logger";
 import {
   Header,
+  PrerenderManifest,
   RedirectDefinition,
   RewriteDefinition,
   RouteHas,
-} from "../next-types";
+} from "../types/next-types";
 import { escapeRegex, unescapeRegex } from "../util";
 import { convertQuery, getUrlParts, isExternal } from "./util";
 
@@ -206,3 +207,30 @@ export function fixDataPage(internalEvent: InternalEvent, buildId: string) {
   }
   return internalEvent;
 }
+
+export function handleFallbackFalse(
+  internalEvent: InternalEvent,
+  prerenderManifest: PrerenderManifest,
+): InternalEvent {
+  const { rawPath } = internalEvent;
+  const { dynamicRoutes, routes } = prerenderManifest;
+  const routeFallback = Object.entries(dynamicRoutes)
+    .filter(([, { fallback }]) => fallback === false)
+    .some(([, { routeRegex }]) => {
+      const routeRegexExp = new RegExp(routeRegex);
+      return routeRegexExp.test(rawPath);
+    });
+  if (routeFallback && !Object.keys(routes).includes(rawPath)) {
+    return {
+      ...internalEvent,
+      rawPath: "/404",
+      url: "/404",
+      headers: {
+        ...internalEvent.headers,
+        "x-invoke-status": "404",
+      },
+    };
+  }
+
+  return internalEvent;
+}
diff --git a/packages/open-next/src/adapters/routing/middleware.ts b/packages/open-next/src/adapters/routing/middleware.ts
index 3e94bcfc5..a8b9c39f5 100644
--- a/packages/open-next/src/adapters/routing/middleware.ts
+++ b/packages/open-next/src/adapters/routing/middleware.ts
@@ -1,19 +1,15 @@
 import path from "node:path";
 
+import { NEXT_DIR, NextConfig } from "../config/index.js";
 import { InternalEvent, InternalResult } from "../event-mapper.js";
-import { IncomingMessage } from "../request.js";
-import { ServerResponse } from "../response.js";
-import { loadConfig } from "../util.js";
+import { IncomingMessage } from "../http/request.js";
+import { ServerlessResponse } from "../http/response.js";
 import {
   convertRes,
   getMiddlewareMatch,
   loadMiddlewareManifest,
 } from "./util.js";
 
-const NEXT_DIR = path.join(__dirname, ".next");
-
-const config = loadConfig(NEXT_DIR);
-
 const middlewareManifest = loadMiddlewareManifest(NEXT_DIR);
 
 const { run } = require("next/dist/server/web/sandbox");
@@ -43,7 +39,10 @@ export async function handleMiddleware(
   if (!hasMatch) return internalEvent;
 
   const req = new IncomingMessage(internalEvent);
-  const res = new ServerResponse({ method: req.method, headers: {} });
+  const res = new ServerlessResponse({
+    method: req.method ?? "GET",
+    headers: {},
+  });
 
   // NOTE: Next middleware was originally developed to support nested middlewares
   // but that was discarded for simplicity. The MiddlewareInfo type still has the original
@@ -75,9 +74,9 @@ export async function handleMiddleware(
       headers: req.headers,
       method: req.method || "GET",
       nextConfig: {
-        basePath: config.basePath,
-        i18n: config.i18n,
-        trailingSlash: config.trailingSlash,
+        basePath: NextConfig.basePath,
+        i18n: NextConfig.i18n,
+        trailingSlash: NextConfig.trailingSlash,
       },
       url,
       body: getCloneableBody(req),
diff --git a/packages/open-next/src/adapters/routing/util.ts b/packages/open-next/src/adapters/routing/util.ts
index de5d72337..b731c029a 100644
--- a/packages/open-next/src/adapters/routing/util.ts
+++ b/packages/open-next/src/adapters/routing/util.ts
@@ -2,8 +2,8 @@ import fs from "node:fs";
 import path from "node:path";
 
 import { isBinaryContentType } from "../binary";
-import { MiddlewareManifest } from "../next-types";
-import { ServerResponse } from "../response";
+import { ServerlessResponse } from "../http/response";
+import { MiddlewareManifest } from "../types/next-types";
 
 export function isExternal(url?: string) {
   if (!url) return false;
@@ -27,17 +27,17 @@ export function getUrlParts(url: string, isExternal: boolean) {
   };
 }
 
-export function convertRes(res: ServerResponse) {
+export function convertRes(res: ServerlessResponse) {
   // Format Next.js response to Lambda response
   const statusCode = res.statusCode || 200;
-  const headers = ServerResponse.headers(res);
+  const headers = ServerlessResponse.headers(res);
   const isBase64Encoded = isBinaryContentType(
     Array.isArray(headers["content-type"])
       ? headers["content-type"][0]
       : headers["content-type"],
   );
   const encoding = isBase64Encoded ? "base64" : "utf8";
-  const body = ServerResponse.body(res).toString(encoding);
+  const body = ServerlessResponse.body(res).toString(encoding);
   return {
     statusCode,
     headers,
diff --git a/packages/open-next/src/adapters/server-adapter.ts b/packages/open-next/src/adapters/server-adapter.ts
index feb21a113..a573dd1e0 100644
--- a/packages/open-next/src/adapters/server-adapter.ts
+++ b/packages/open-next/src/adapters/server-adapter.ts
@@ -1,106 +1,30 @@
-import path from "node:path";
-
-import type {
-  APIGatewayProxyEvent,
-  APIGatewayProxyEventV2,
-  CloudFrontRequestEvent,
-} from "aws-lambda";
-
-import { convertFrom, convertTo, InternalEvent } from "./event-mapper.js";
-import { debug, error } from "./logger.js";
+/* eslint-disable unused-imports/no-unused-imports */
+// We load every config here so that they are only loaded once
+// and during cold starts
 import {
-  postProcessResponse,
-  processInternalEvent,
-} from "./plugins/routing/default.js";
-import { handler as serverHandler } from "./plugins/serverHandler.js";
-import { IncomingMessage } from "./request.js";
-import { ServerResponse } from "./response.js";
-import {
-  generateUniqueId,
-  loadBuildId,
-  loadConfig,
-  loadPublicAssets,
-  setNodeEnv,
-} from "./util.js";
-import type { WarmerEvent, WarmerResponse } from "./warmer-function.js";
-
-export const NEXT_DIR = path.join(__dirname, ".next");
-export const OPEN_NEXT_DIR = path.join(__dirname, ".open-next");
-export const config = loadConfig(NEXT_DIR);
+  AppPathsManifestKeys,
+  BuildId,
+  ConfigHeaders,
+  HtmlPages,
+  NEXT_DIR,
+  NextConfig,
+  OPEN_NEXT_DIR,
+  PrerenderManifest,
+  PublicAssets,
+  RoutesManifest,
+} from "./config/index.js";
+import { lambdaHandler } from "./plugins/lambdaHandler.js";
+import { setNodeEnv } from "./util.js";
 
-debug({ NEXT_DIR, OPEN_NEXT_DIR });
-
-const buildId = loadBuildId(NEXT_DIR);
 setNodeEnv();
 setBuildIdEnv();
 setNextjsServerWorkingDirectory();
 
-const publicAssets = loadPublicAssets(OPEN_NEXT_DIR);
-// Generate a 6 letter unique server ID
-const serverId = `server-${generateUniqueId()}`;
-
 /////////////
 // Handler //
 /////////////
 
-export async function handler(
-  event:
-    | APIGatewayProxyEventV2
-    | CloudFrontRequestEvent
-    | APIGatewayProxyEvent
-    | WarmerEvent,
-) {
-  debug("event", event);
-  // Handler warmer
-  if ("type" in event) {
-    return formatWarmerResponse(event);
-  }
-
-  // Parse Lambda event and create Next.js request
-  const internalEvent = convertFrom(event);
-
-  process.env.OPEN_NEXT_ISR = internalEvent.headers["x-isr"]
-    ? "true"
-    : undefined;
-
-  // WORKAROUND: Set `x-forwarded-host` header (AWS specific) — https://github.com/serverless-stack/open-next#workaround-set-x-forwarded-host-header-aws-specific
-  if (internalEvent.headers["x-forwarded-host"]) {
-    internalEvent.headers.host = internalEvent.headers["x-forwarded-host"];
-  }
-
-  // WORKAROUND: public/ static files served by the server function (AWS specific) — https://github.com/serverless-stack/open-next#workaround-public-static-files-served-by-the-server-function-aws-specific
-  // TODO: This is no longer required if each top-level file and folder in "/public"
-  //       is handled by a separate cache behavior. Leaving here for backward compatibility.
-  //       Remove this on next major release.
-  if (publicAssets.files.includes(internalEvent.rawPath)) {
-    return internalEvent.type === "cf"
-      ? formatCloudFrontFailoverResponse(event as CloudFrontRequestEvent)
-      : formatAPIGatewayFailoverResponse();
-  }
-
-  const preprocessResult = await processInternalEvent(internalEvent);
-  if ("type" in preprocessResult) {
-    return convertTo(preprocessResult);
-  } else {
-    const {
-      req,
-      res,
-      isExternalRewrite,
-      internalEvent: overwrittenInternalEvent,
-    } = preprocessResult;
-
-    await processRequest(req, res, overwrittenInternalEvent, isExternalRewrite);
-
-    const internalResult = await postProcessResponse({
-      internalEvent: overwrittenInternalEvent,
-      req,
-      res,
-      isExternalRewrite,
-    });
-
-    return convertTo(internalResult);
-  }
-}
+export const handler = lambdaHandler;
 
 //////////////////////
 // Helper functions //
@@ -114,57 +38,5 @@ function setNextjsServerWorkingDirectory() {
 function setBuildIdEnv() {
   // This allows users to access the CloudFront invalidating path when doing on-demand
   // invalidations. ie. `/_next/data/${process.env.NEXT_BUILD_ID}/foo.json`
-  process.env.NEXT_BUILD_ID = buildId;
-}
-
-async function processRequest(
-  req: IncomingMessage,
-  res: ServerResponse,
-  internalEvent: InternalEvent,
-  isExternalRewrite?: boolean,
-) {
-  // @ts-ignore
-  // Next.js doesn't parse body if the property exists
-  // https://github.com/dougmoscrop/serverless-http/issues/227
-  delete req.body;
-
-  try {
-    // `serverHandler` is replaced at build time depending on user's
-    // nextjs version to patch Nextjs 13.4.x and future breaking changes.
-    await serverHandler(req, res, {
-      internalEvent,
-      buildId,
-      isExternalRewrite,
-    });
-  } catch (e: any) {
-    error("NextJS request failed.", e);
-
-    res.setHeader("Content-Type", "application/json");
-    res.end(
-      JSON.stringify(
-        {
-          message: "Server failed to respond.",
-          details: e,
-        },
-        null,
-        2,
-      ),
-    );
-  }
-}
-
-function formatAPIGatewayFailoverResponse() {
-  return { statusCode: 503 };
-}
-
-function formatCloudFrontFailoverResponse(event: CloudFrontRequestEvent) {
-  return event.Records[0].cf.request;
-}
-
-function formatWarmerResponse(event: WarmerEvent) {
-  return new Promise<WarmerResponse>((resolve) => {
-    setTimeout(() => {
-      resolve({ serverId } satisfies WarmerResponse);
-    }, event.delay);
-  });
+  process.env.NEXT_BUILD_ID = BuildId;
 }
diff --git a/packages/open-next/src/adapters/types/aws-lambda.ts b/packages/open-next/src/adapters/types/aws-lambda.ts
new file mode 100644
index 000000000..22d720587
--- /dev/null
+++ b/packages/open-next/src/adapters/types/aws-lambda.ts
@@ -0,0 +1,27 @@
+import { APIGatewayProxyEventV2, Context } from "aws-lambda";
+import { Writable } from "stream";
+
+export interface ResponseStream extends Writable {
+  getBufferedData(): Buffer;
+  setContentType(contentType: string): void;
+}
+
+type Handler = (
+  event: APIGatewayProxyEventV2,
+  responseStream: ResponseStream,
+  context?: Context,
+) => Promise<any>;
+
+interface Metadata {
+  statusCode: number;
+  headers: Record<string, string>;
+}
+
+declare global {
+  namespace awslambda {
+    function streamifyResponse(handler: Handler): Handler;
+    module HttpResponseStream {
+      function from(res: Writable, metadata: Metadata): ResponseStream;
+    }
+  }
+}
diff --git a/packages/open-next/src/adapters/types/next-types.ts b/packages/open-next/src/adapters/types/next-types.ts
new file mode 100644
index 000000000..0b5a33263
--- /dev/null
+++ b/packages/open-next/src/adapters/types/next-types.ts
@@ -0,0 +1,155 @@
+// NOTE: add more next config typings as they become relevant
+
+import { InternalEvent } from "../event-mapper.js";
+import { IncomingMessage } from "../http/request.js";
+import { ServerlessResponse } from "../http/response.js";
+
+type RemotePattern = {
+  protocol?: "http" | "https";
+  hostname: string;
+  port?: string;
+  pathname?: string;
+};
+declare type ImageFormat = "image/avif" | "image/webp";
+
+type ImageConfigComplete = {
+  deviceSizes: number[];
+  imageSizes: number[];
+  path: string;
+  loaderFile: string;
+  domains: string[];
+  disableStaticImages: boolean;
+  minimumCacheTTL: number;
+  formats: ImageFormat[];
+  dangerouslyAllowSVG: boolean;
+  contentSecurityPolicy: string;
+  contentDispositionType: "inline" | "attachment";
+  remotePatterns: RemotePattern[];
+  unoptimized: boolean;
+};
+type ImageConfig = Partial<ImageConfigComplete>;
+
+export type RouteHas =
+  | {
+      type: "header" | "query" | "cookie";
+      key: string;
+      value?: string;
+    }
+  | {
+      type: "host";
+      key?: undefined;
+      value: string;
+    };
+export type Rewrite = {
+  source: string;
+  destination: string;
+  basePath?: false;
+  locale?: false;
+  has?: RouteHas[];
+  missing?: RouteHas[];
+};
+export type Header = {
+  source: string;
+  regex: string;
+  basePath?: false;
+  locale?: false;
+  headers: Array<{
+    key: string;
+    value: string;
+  }>;
+  has?: RouteHas[];
+  missing?: RouteHas[];
+};
+export interface NextConfig {
+  basePath?: string;
+  trailingSlash?: string;
+  i18n?: {
+    locales: string[];
+  };
+  experimental: {
+    serverActions?: boolean;
+    appDir?: boolean;
+  };
+  images: ImageConfig;
+}
+
+export interface RouteDefinition {
+  page: string;
+  regex: string;
+}
+
+export interface DataRouteDefinition {
+  page: string;
+  dataRouteRegex: string;
+  routeKeys?: string;
+}
+
+export interface RewriteDefinition {
+  source: string;
+  destination: string;
+  has?: RouteHas[];
+  missing?: RouteHas[];
+  regex: string;
+}
+
+export interface RedirectDefinition extends RewriteDefinition {
+  internal?: boolean;
+  statusCode?: number;
+}
+
+export interface RoutesManifest {
+  dynamicRoutes: RouteDefinition[];
+  staticRoutes: RouteDefinition[];
+  dataRoutes: DataRouteDefinition[];
+  rewrites: {
+    beforeFiles: RewriteDefinition[];
+    afterFiles: RewriteDefinition[];
+    fallback: RewriteDefinition[];
+  };
+  redirects: RedirectDefinition[];
+  headers?: Header[];
+}
+
+export interface MiddlewareManifest {
+  sortedMiddleware: string[];
+  middleware: {
+    [key: string]: {
+      files: string[];
+      paths?: string[];
+      name: string;
+      page: string;
+      matchers: {
+        regexp: string;
+        originalSource: string;
+      }[];
+      wasm: string[];
+      assets: string[];
+    };
+  };
+  functions: { [key: string]: any };
+  version: number;
+}
+
+export interface PrerenderManifest {
+  routes: Record<string, never>;
+  dynamicRoutes: {
+    [route: string]: {
+      routeRegex: string;
+      fallback: string | false | null;
+      dataRouteRegex: string;
+    };
+  };
+}
+
+export type Options = {
+  internalEvent: InternalEvent;
+  buildId: string;
+  isExternalRewrite?: boolean;
+};
+export interface PluginHandler {
+  (
+    req: IncomingMessage,
+    res: ServerlessResponse,
+    options: Options,
+  ): Promise<ServerlessResponse | undefined>;
+}
diff --git a/packages/open-next/src/adapters/types/plugin.ts b/packages/open-next/src/adapters/types/plugin.ts
new file mode 100644
index 000000000..47c7ed3a0
--- /dev/null
+++ b/packages/open-next/src/adapters/types/plugin.ts
@@ -0,0 +1,36 @@
+import type { ServerResponse } from "http";
+
+import type { InternalEvent, InternalResult } from "../event-mapper";
+import type { IncomingMessage } from "../http/request";
+
+export type ProcessInternalEventResult<
+  Response extends ServerResponse = ServerResponse,
+> =
+  | {
+      internalEvent: InternalEvent;
+      req: IncomingMessage;
+      res: Response;
+      isExternalRewrite: boolean;
+    }
+  | InternalResult;
+
+export type ProcessInternalEvent<
+  Response extends ServerResponse = ServerResponse,
+> = (
+  internalEvent: InternalEvent,
+  createResponse: CreateResponse<Response>,
+) => Promise<ProcessInternalEventResult<Response>>;
+
+export interface PostProcessOptions<
+  Response extends ServerResponse = ServerResponse,
+> {
+  internalEvent: InternalEvent;
+  req: IncomingMessage;
+  res: Response;
+  isExternalRewrite?: boolean;
+}
+
+export type CreateResponse<Response extends ServerResponse = ServerResponse> = (
+  method: string,
+  headers: Record<string, string | string[] | undefined>,
+) => Response;
diff --git a/packages/open-next/src/adapters/util.ts b/packages/open-next/src/adapters/util.ts
index aae77c915..d2af979b5 100644
--- a/packages/open-next/src/adapters/util.ts
+++ b/packages/open-next/src/adapters/util.ts
@@ -1,9 +1,3 @@
-import fs from "node:fs";
-import path from "node:path";
-
-import type { PublicFiles } from "../build.js";
-import type { NextConfig, RoutesManifest } from "./next-types.js";
-
 export function setNodeEnv() {
   process.env.NODE_ENV = process.env.NODE_ENV ?? "production";
 }
@@ -12,91 +6,6 @@ export function generateUniqueId() {
   return Math.random().toString(36).slice(2, 8);
 }
 
-export function loadConfig(nextDir: string) {
-  const filePath = path.join(nextDir, "required-server-files.json");
-  const json = fs.readFileSync(filePath, "utf-8");
-  const { config } = JSON.parse(json);
-  return config as NextConfig;
-}
-export function loadBuildId(nextDir: string) {
-  const filePath = path.join(nextDir, "BUILD_ID");
-  return fs.readFileSync(filePath, "utf-8").trim();
-}
-
-export function loadHtmlPages(nextDir: string) {
-  const filePath = path.join(nextDir, "server", "pages-manifest.json");
-  const json = fs.readFileSync(filePath, "utf-8");
-  return Object.entries(JSON.parse(json))
-    .filter(([_, value]) => (value as string).endsWith(".html"))
-    .map(([key]) => key);
-}
-
-export function loadPublicAssets(openNextDir: string) {
-  const filePath = path.join(openNextDir, "public-files.json");
-  const json = fs.readFileSync(filePath, "utf-8");
-  return JSON.parse(json) as PublicFiles;
-}
-
-export function loadRoutesManifest(nextDir: string) {
-  const filePath = path.join(nextDir, "routes-manifest.json");
-  const json = fs.readFileSync(filePath, "utf-8");
-  const routesManifest = JSON.parse(json) as RoutesManifest;
-
-  const _dataRoutes = routesManifest.dataRoutes ?? [];
-  const dataRoutes = {
-    static: _dataRoutes.filter((r) => r.routeKeys === undefined),
-    dynamic: _dataRoutes.filter((r) => r.routeKeys !== undefined),
-  };
-
-  return {
-    rewrites: {
-      beforeFiles: routesManifest.rewrites.beforeFiles ?? [],
-      afterFiles: routesManifest.rewrites.afterFiles ?? [],
-      fallback: routesManifest.rewrites.fallback ?? [],
-    },
-    redirects: routesManifest.redirects ?? [],
-    routes: {
-      static: routesManifest.staticRoutes ?? [],
-      dynamic: routesManifest.dynamicRoutes ?? [],
-      data: dataRoutes,
-    },
-  };
-}
-
-export function loadConfigHeaders(nextDir: string) {
-  const filePath = path.join(nextDir, "routes-manifest.json");
-  const json = fs.readFileSync(filePath, "utf-8");
-  const routesManifest = JSON.parse(json) as RoutesManifest;
-  return routesManifest.headers;
-}
-
-export function loadAppPathsManifestKeys(nextDir: string) {
-  const appPathsManifestPath = path.join(
-    nextDir,
-    "server",
-    "app-paths-manifest.json",
-  );
-  const appPathsManifestJson = fs.existsSync(appPathsManifestPath)
-    ? fs.readFileSync(appPathsManifestPath, "utf-8")
-    : "{}";
-  const appPathsManifest = JSON.parse(appPathsManifestJson) as Record<
-    string,
-    string
-  >;
-  return Object.keys(appPathsManifest).map((key) => {
-    // Remove parallel route
-    let cleanedKey = key.replace(/\/@[^\/]+/g, "");
-
-    // Remove group routes
-    cleanedKey = cleanedKey.replace(/\/\((?!\.)[^\)]*\)/g, "");
-
-    // Remove /page suffix
-    cleanedKey = cleanedKey.replace(/\/page$/g, "");
-    // We need to check if the cleaned key is empty because it means it's the root path
-    return cleanedKey === "" ? "/" : cleanedKey;
-  });
-}
-
 export function escapeRegex(str: string) {
   let path = str.replace(/\(\.\)/g, "_µ1_");
 
diff --git a/packages/open-next/src/build.ts b/packages/open-next/src/build.ts
index 68f622636..610aa4faf 100644
--- a/packages/open-next/src/build.ts
+++ b/packages/open-next/src/build.ts
@@ -24,6 +24,11 @@ interface BuildOptions {
    * @default false
    */
   debug?: boolean;
+  /**
+   * Enable streaming mode.
+   * @default false
+   */
+  streaming?: boolean;
   /**
    * The command to build the Next.js app.
    * @default `npm run build`, `yarn build`, or `pnpm build` based on the lock file found in the app's directory or any of its parent directories.
@@ -78,7 +83,7 @@ export async function build(opts: BuildOptions = {}) {
   initOutputDir();
   createStaticAssets();
   createCacheAssets(monorepoRoot);
-  await createServerBundle(monorepoRoot);
+  await createServerBundle(monorepoRoot, opts.streaming);
   createRevalidationBundle();
   createImageOptimizationBundle();
   createWarmerBundle();
@@ -481,7 +486,7 @@ function createCacheAssets(monorepoRoot: string) {
 /* Server Helper Functions */
 /***************************/
 
-async function createServerBundle(monorepoRoot: string) {
+async function createServerBundle(monorepoRoot: string, streaming = false) {
   console.info(`Bundling server function...`);
 
   const { appPath, appBuildOutputPath, outputDir } = options;
@@ -514,6 +519,7 @@ async function createServerBundle(monorepoRoot: string) {
   // note: bundle in OpenNext package b/c the adapter relies on the
   //       "serverless-http" package which is not a dependency in user's
   //       Next.js app.
+
   let plugins =
     compareSemver(options.nextVersion, "13.4.13") >= 0
       ? [
@@ -555,7 +561,20 @@ async function createServerBundle(monorepoRoot: string) {
     ];
   }
 
-  if (plugins) {
+  if (streaming) {
+    const streamingPlugin = openNextPlugin({
+      name: "opennext-streaming",
+      target: /plugins\/lambdaHandler\.js/g,
+      replacements: ["./streaming.replacement.js"],
+    });
+    if (plugins) {
+      plugins.push(streamingPlugin);
+    } else {
+      plugins = [streamingPlugin];
+    }
+  }
+
+  if (plugins && plugins.length > 0) {
     console.log(
       `Applying plugins:: [${plugins
         .map(({ name }) => name)
diff --git a/packages/open-next/src/index.ts b/packages/open-next/src/index.ts
index 714a03f85..e52cd9bdc 100644
--- a/packages/open-next/src/index.ts
+++ b/packages/open-next/src/index.ts
@@ -13,6 +13,7 @@ build({
   buildOutputPath: args["--build-output-path"],
   appPath: args["--app-path"],
   minify: Object.keys(args).includes("--minify"),
+  streaming: Object.keys(args).includes("--streaming"),
 });
 
 function parseArgs() {
diff --git a/packages/tests-e2e/tests/appPagesRouter/isr.test.ts b/packages/tests-e2e/tests/appPagesRouter/isr.test.ts
index 60c46016b..b2f9bae14 100644
--- a/packages/tests-e2e/tests/appPagesRouter/isr.test.ts
+++ b/packages/tests-e2e/tests/appPagesRouter/isr.test.ts
@@ -7,7 +7,7 @@ test("Incremental Static Regeneration", async ({ page }) => {
   await page.locator('[href="/isr"]').click();
   // Load the page a couple times to regenerate ISR
 
-  let el = page.getByText("ISR");
+  let el = page.getByText("Time:");
   // Track the static time
   let time = await el.textContent();
   let newTime;
@@ -16,14 +16,14 @@ test("Incremental Static Regeneration", async ({ page }) => {
     await wait(1000);
     await page.reload();
     time = tempTime;
-    el = page.getByText("ISR");
+    el = page.getByText("Time:");
     newTime = await el.textContent();
     tempTime = newTime;
   } while (time !== newTime);
   await page.reload();
 
   await wait(1000);
-  el = page.getByText("ISR");
+  el = page.getByText("Time:");
   const midTime = await el.textContent();
   // Expect that the time is still stale
   expect(midTime).toEqual(newTime);
@@ -33,7 +33,7 @@ test("Incremental Static Regeneration", async ({ page }) => {
   let finalTime = newTime;
   do {
     await wait(2000);
-    el = page.getByText("ISR");
+    el = page.getByText("Time:");
     finalTime = await el.textContent();
     await page.reload();
   } while (newTime === finalTime);
diff --git a/packages/tests-e2e/tests/appPagesRouter/pages_isr.test.ts b/packages/tests-e2e/tests/appPagesRouter/pages_isr.test.ts
index d98ae9992..00887638d 100644
--- a/packages/tests-e2e/tests/appPagesRouter/pages_isr.test.ts
+++ b/packages/tests-e2e/tests/appPagesRouter/pages_isr.test.ts
@@ -9,7 +9,7 @@ test("Incremental Static Regeneration", async ({ page }) => {
   await page.waitForURL("/pages_isr");
   // Load the page a couple times to regenerate ISR
 
-  let el = page.getByText("ISR").first();
+  let el = page.getByText("Time:");
   // Track the static time
   let time = await el.textContent();
   let newTime;
@@ -18,13 +18,13 @@ test("Incremental Static Regeneration", async ({ page }) => {
     await wait(1000);
     await page.reload();
     time = tempTime;
-    el = page.getByText("ISR");
+    el = page.getByText("Time:");
     newTime = await el.textContent();
     tempTime = newTime;
   } while (time !== newTime);
   await page.reload();
   await wait(1000);
-  el = page.getByText("ISR");
+  el = page.getByText("Time:");
   const midTime = await el.textContent();
   // Expect that the time is still stale
   expect(midTime).toEqual(newTime);
@@ -34,7 +34,7 @@ test("Incremental Static Regeneration", async ({ page }) => {
   let finalTime = newTime;
   do {
     await wait(2000);
-    el = page.getByText("ISR");
+    el = page.getByText("Time:");
     finalTime = await el.textContent();
     await page.reload();
   } while (newTime === finalTime);
diff --git a/packages/tests-e2e/tests/appPagesRouter/pages_ssr.test.ts b/packages/tests-e2e/tests/appPagesRouter/pages_ssr.test.ts
index 9ebf1cff0..d1c9ef736 100644
--- a/packages/tests-e2e/tests/appPagesRouter/pages_ssr.test.ts
+++ b/packages/tests-e2e/tests/appPagesRouter/pages_ssr.test.ts
@@ -1,28 +1,24 @@
-// NOTE: loading.tsx is currently broken on open-next
-//  This works locally but not on deployed apps
-
 import { wait } from "@open-next/utils";
 import { expect, test } from "@playwright/test";
 
-// NOTE: We don't await page load b/c we want to see the Loading page
 test("Server Side Render", async ({ page }) => {
   await page.goto("/");
   await page.locator('[href="/pages_ssr"]').click();
 
   await page.waitForURL("/pages_ssr");
-  let el = page.getByText("SSR").first();
+  let el = page.getByText("Time:");
   await expect(el).toBeVisible();
   let time = await el.textContent();
 
   await page.reload();
 
-  el = page.getByText("SSR");
+  el = page.getByText("Time:");
   let newTime = await el.textContent();
   await expect(el).toBeVisible();
 
   for (let i = 0; i < 5; i++) {
     await page.reload();
-    el = page.getByText("SSR");
+    el = page.getByText("Time:");
     newTime = await el.textContent();
     await expect(el).toBeVisible();
     await expect(time).not.toEqual(newTime);
diff --git a/packages/tests-e2e/tests/appPagesRouter/ssr.test.ts b/packages/tests-e2e/tests/appPagesRouter/ssr.test.ts
index 123b8b930..6acf5b9d4 100644
--- a/packages/tests-e2e/tests/appPagesRouter/ssr.test.ts
+++ b/packages/tests-e2e/tests/appPagesRouter/ssr.test.ts
@@ -1,38 +1,28 @@
-// // NOTE: loading.tsx is currently broken on open - next
-// //  This works locally but not on deployed apps
-
-// import { test, expect } from "@playwright/test";
-// import { wait } from "@open-next/utils";
-
-// // NOTE: We don't await page load b/c we want to see the Loading page
-// test("Server Side Render and loading.tsx", async ({ page }) => {
-//   await page.goto("/");
-//   await page.getByRole("link", { name: "SSR" }).click();
-//   await page.waitForUrl('/ssr')
-
-//   let loading = page.getByText("Loading...");
-//   await expect(loading).toBeVisible();
-
-//   let el = page.getByText("SSR");
-//   await expect(el).toBeVisible();
-//   const time = await el.textContent();
-
-//   page.reload();
-//   loading = page.getByText("Loading...");
-//   await expect(loading).toBeVisible();
-
-//   el = page.getByText("SSR");
-//   let newTime = await el.textContent();
-//   await expect(el).toBeVisible();
-//   await expect(time).not.toEqual(newTime);
-
-//   await wait(5000);
-//   page.reload();
-//   loading = page.getByText("Loading...");
-//   await expect(loading).toBeVisible();
-
-//   el = page.getByText("SSR");
-//   newTime = await el.textContent();
-//   await expect(el).toBeVisible();
-//   await expect(time).not.toEqual(newTime);
-// });
+import { wait } from "@open-next/utils";
+import { expect, test } from "@playwright/test";
+
+test("Server Side Render", async ({ page }) => {
+  await page.goto("/");
+  await page.locator('[href="/ssr"]').click();
+
+  await page.waitForURL("/ssr");
+  let el = page.getByText("Time:");
+  await expect(el).toBeVisible();
+  let time = await el.textContent();
+
+  await page.reload();
+
+  el = page.getByText("Time:");
+  let newTime = await el.textContent();
+  await expect(el).toBeVisible();
+
+  for (let i = 0; i < 5; i++) {
+    await page.reload();
+    el = page.getByText("Time:");
+    newTime = await el.textContent();
+    await expect(el).toBeVisible();
+    await expect(time).not.toEqual(newTime);
+    time = newTime;
+    await wait(250);
+  }
+});
diff --git a/packages/tests-e2e/tests/appRouter/isr.test.ts b/packages/tests-e2e/tests/appRouter/isr.test.ts
index 38983c8c2..480250830 100644
--- a/packages/tests-e2e/tests/appRouter/isr.test.ts
+++ b/packages/tests-e2e/tests/appRouter/isr.test.ts
@@ -4,10 +4,10 @@ import { expect, test } from "@playwright/test";
 test("Incremental Static Regeneration", async ({ page }) => {
   test.setTimeout(45000);
   await page.goto("/");
-  await page.getByRole("link", { name: "ISR" }).click();
+  await page.locator("[href='/isr']").click();
   // Load the page a couple times to regenerate ISR
 
-  let el = page.getByText("ISR");
+  let el = page.getByText("Time:");
   // Track the static time
   let time = await el.textContent();
   let newTime;
@@ -16,14 +16,14 @@ test("Incremental Static Regeneration", async ({ page }) => {
     await wait(1000);
     await page.reload();
     time = tempTime;
-    el = page.getByText("ISR");
+    el = page.getByText("Time:");
     newTime = await el.textContent();
     tempTime = newTime;
   } while (time !== newTime);
   await page.reload();
 
   await wait(1000);
-  el = page.getByText("ISR");
+  el = page.getByText("Time:");
   const midTime = await el.textContent();
   // Expect that the time is still stale
   expect(midTime).toEqual(newTime);
@@ -33,7 +33,7 @@ test("Incremental Static Regeneration", async ({ page }) => {
   let finalTime = newTime;
   do {
     await wait(2000);
-    el = page.getByText("ISR");
+    el = page.getByText("Time:");
     finalTime = await el.textContent();
     await page.reload();
   } while (newTime === finalTime);
diff --git a/packages/tests-e2e/tests/appRouter/sse.test.ts b/packages/tests-e2e/tests/appRouter/sse.test.ts
new file mode 100644
index 000000000..e2102b43a
--- /dev/null
+++ b/packages/tests-e2e/tests/appRouter/sse.test.ts
@@ -0,0 +1,46 @@
+// NOTE: loading.tsx is currently broken on open - next
+//  This works locally but not on deployed apps
+
+import { wait } from "@open-next/utils";
+import { expect, test } from "@playwright/test";
+
+// NOTE: We don't await page load b/c we want to see the Loading page
+test("Server Sent Events", async ({ page }) => {
+  await page.goto("/");
+  await page.locator('[href="/sse"]').click();
+  await page.waitForURL("/sse");
+
+  const msg0 = page.getByText(`Message 0: {"message":"open"`);
+  await expect(msg0).toBeVisible();
+
+  // 2nd message shouldn't arrive yet
+  let msg2 = page.getByText(`Message 2: {"message":"hello:2"`);
+  await expect(msg2).not.toBeVisible();
+  await wait(2000);
+  // 2nd message should arrive after 2s
+  msg2 = page.getByText(`Message 2: {"message":"hello:2"`);
+  await expect(msg2).toBeVisible();
+
+  // 3rd message shouldn't arrive yet
+  let msg3 = page.getByText(`Message 3: {"message":"hello:3"`);
+  await expect(msg3).not.toBeVisible();
+  await wait(2000);
+  // 3rd message should arrive after 2s
+  msg3 = page.getByText(`Message 3: {"message":"hello:3"`);
+  await expect(msg3).toBeVisible();
+
+  // 4th message shouldn't arrive yet
+  let msg4 = page.getByText(`Message 4: {"message":"hello:4"`);
+  await expect(msg4).not.toBeVisible();
+  await wait(2000);
+  // 4th message should arrive after 2s
+  msg4 = page.getByText(`Message 4: {"message":"hello:4"`);
+  await expect(msg4).toBeVisible();
+
+  let close = page.getByText(`Message 5: {"message":"close"`);
+  await expect(close).not.toBeVisible();
+
+  await wait(2000);
+  close = page.getByText(`Message 5: {"message":"close"`);
+  await expect(close).toBeVisible();
+});
diff --git a/packages/tests-e2e/tests/appRouter/ssr.test.ts b/packages/tests-e2e/tests/appRouter/ssr.test.ts
index 123b8b930..0347a805f 100644
--- a/packages/tests-e2e/tests/appRouter/ssr.test.ts
+++ b/packages/tests-e2e/tests/appRouter/ssr.test.ts
@@ -1,38 +1,55 @@
-// // NOTE: loading.tsx is currently broken on open - next
-// //  This works locally but not on deployed apps
-
-// import { test, expect } from "@playwright/test";
-// import { wait } from "@open-next/utils";
-
-// // NOTE: We don't await page load b/c we want to see the Loading page
-// test("Server Side Render and loading.tsx", async ({ page }) => {
-//   await page.goto("/");
-//   await page.getByRole("link", { name: "SSR" }).click();
-//   await page.waitForUrl('/ssr')
-
-//   let loading = page.getByText("Loading...");
-//   await expect(loading).toBeVisible();
-
-//   let el = page.getByText("SSR");
-//   await expect(el).toBeVisible();
-//   const time = await el.textContent();
-
-//   page.reload();
-//   loading = page.getByText("Loading...");
-//   await expect(loading).toBeVisible();
-
-//   el = page.getByText("SSR");
-//   let newTime = await el.textContent();
-//   await expect(el).toBeVisible();
-//   await expect(time).not.toEqual(newTime);
-
-//   await wait(5000);
-//   page.reload();
-//   loading = page.getByText("Loading...");
-//   await expect(loading).toBeVisible();
-
-//   el = page.getByText("SSR");
-//   newTime = await el.textContent();
-//   await expect(el).toBeVisible();
-//   await expect(time).not.toEqual(newTime);
-// });
+// NOTE: loading.tsx is currently broken on open - next
+//  This works locally but not on deployed apps
+
+import { wait } from "@open-next/utils";
+import { expect, test } from "@playwright/test";
+
+// NOTE: We don't await page load b/c we want to see the Loading page
+test("Server Side Render and loading.tsx", async ({ page }) => {
+  test.setTimeout(600000);
+  await page.goto("/");
+  await page.getByRole("link", { name: "SSR" }).click();
+  await page.waitForURL("/ssr");
+
+  let loading: any;
+  let lastTime = "";
+
+  for (let i = 0; i < 5; i++) {
+    page.reload();
+
+    loading = page.getByText("Loading...");
+    await expect(loading).toBeVisible();
+    let el = page.getByText("Time:");
+    await expect(el).toBeVisible();
+    const time = await el.textContent();
+    expect(time).not.toEqual(lastTime);
+    lastTime = time!;
+    await wait(1000);
+  }
+
+  // let loading = page.getByText("Loading...");
+  // await expect(loading).toBeVisible();
+
+  // let el = page.getByText("Time:");
+  // await expect(el).toBeVisible();
+  // const time = await el.textContent();
+
+  // page.reload();
+  // loading = page.getByText("Loading...");
+  // await expect(loading).toBeVisible();
+
+  // el = page.getByText("Time:");
+  // let newTime = await el.textContent();
+  // await expect(el).toBeVisible();
+  // await expect(time).not.toEqual(newTime);
+
+  // await wait(5000);
+  // page.reload();
+  // loading = page.getByText("Loading...");
+  // await expect(loading).toBeVisible();
+
+  // el = page.getByText("Time:");
+  // newTime = await el.textContent();
+  // await expect(el).toBeVisible();
+  // await expect(time).not.toEqual(newTime);
+});
diff --git a/packages/tests-e2e/tests/pagesRouter/isr.test.ts b/packages/tests-e2e/tests/pagesRouter/isr.test.ts
index f4f4d1345..ebfc2a823 100644
--- a/packages/tests-e2e/tests/pagesRouter/isr.test.ts
+++ b/packages/tests-e2e/tests/pagesRouter/isr.test.ts
@@ -4,11 +4,11 @@ import { expect, test } from "@playwright/test";
 test("Incremental Static Regeneration", async ({ page }) => {
   test.setTimeout(45000);
   await page.goto("/");
-  await page.getByRole("link", { name: "/ISR" }).click();
+  await page.locator("[href='/isr']").click();
   await page.waitForURL("/isr");
   // Load the page a couple times to regenerate ISR
 
-  let el = page.getByText("ISR").first();
+  let el = page.getByText("Time:");
   // Track the static time
   let time = await el.textContent();
   let newTime;
@@ -17,13 +17,13 @@ test("Incremental Static Regeneration", async ({ page }) => {
     await wait(1000);
     await page.reload();
     time = tempTime;
-    el = page.getByText("ISR");
+    el = page.getByText("Time:");
     newTime = await el.textContent();
     tempTime = newTime;
   } while (time !== newTime);
   await page.reload();
   await wait(1000);
-  el = page.getByText("ISR");
+  el = page.getByText("Time:");
   const midTime = await el.textContent();
   // Expect that the time is still stale
   expect(midTime).toEqual(newTime);
@@ -33,7 +33,7 @@ test("Incremental Static Regeneration", async ({ page }) => {
   let finalTime = newTime;
   do {
     await wait(2000);
-    el = page.getByText("ISR");
+    el = page.getByText("Time:");
     finalTime = await el.textContent();
     await page.reload();
   } while (newTime === finalTime);
diff --git a/packages/tests-e2e/tests/pagesRouter/ssr.test.ts b/packages/tests-e2e/tests/pagesRouter/ssr.test.ts
index f8969ea3d..6acf5b9d4 100644
--- a/packages/tests-e2e/tests/pagesRouter/ssr.test.ts
+++ b/packages/tests-e2e/tests/pagesRouter/ssr.test.ts
@@ -1,27 +1,24 @@
-// NOTE: loading.tsx is currently broken on open-next
-//  This works locally but not on deployed apps
-
 import { wait } from "@open-next/utils";
 import { expect, test } from "@playwright/test";
 
-// NOTE: We don't await page load b/c we want to see the Loading page
 test("Server Side Render", async ({ page }) => {
   await page.goto("/");
-  await page.getByRole("link", { name: "/SSR" }).click();
+  await page.locator('[href="/ssr"]').click();
+
   await page.waitForURL("/ssr");
-  let el = page.getByText("SSR").first();
+  let el = page.getByText("Time:");
   await expect(el).toBeVisible();
   let time = await el.textContent();
 
   await page.reload();
 
-  el = page.getByText("SSR");
+  el = page.getByText("Time:");
   let newTime = await el.textContent();
   await expect(el).toBeVisible();
 
   for (let i = 0; i < 5; i++) {
     await page.reload();
-    el = page.getByText("SSR");
+    el = page.getByText("Time:");
     newTime = await el.textContent();
     await expect(el).toBeVisible();
     await expect(time).not.toEqual(newTime);
diff --git a/packages/tests-unit/coverage/base.css b/packages/tests-unit/coverage/base.css
new file mode 100644
index 000000000..f418035b4
--- /dev/null
+++ b/packages/tests-unit/coverage/base.css
@@ -0,0 +1,224 @@
+body, html {
+  margin:0; padding: 0;
+  height: 100%;
+}
+body {
+    font-family: Helvetica Neue, Helvetica, Arial;
+    font-size: 14px;
+    color:#333;
+}
+.small { font-size: 12px; }
+*, *:after, *:before {
+  -webkit-box-sizing:border-box;
+     -moz-box-sizing:border-box;
+          box-sizing:border-box;
+  }
+h1 { font-size: 20px; margin: 0;}
+h2 { font-size: 14px; }
+pre {
+    font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
+    margin: 0;
+    padding: 0;
+    -moz-tab-size: 2;
+    -o-tab-size:  2;
+    tab-size: 2;
+}
+a { color:#0074D9; text-decoration:none; }
+a:hover { text-decoration:underline; }
+.strong { font-weight: bold; }
+.space-top1 { padding: 10px 0 0 0; }
+.pad2y { padding: 20px 0; }
+.pad1y { padding: 10px 0; }
+.pad2x { padding: 0 20px; }
+.pad2 { padding: 20px; }
+.pad1 { padding: 10px; }
+.space-left2 { padding-left:55px; }
+.space-right2 { padding-right:20px; }
+.center { text-align:center; }
+.clearfix { display:block; }
+.clearfix:after {
+  content:'';
+  display:block;
+  height:0;
+  clear:both;
+  visibility:hidden;
+  }
+.fl { float: left; }
+@media only screen and (max-width:640px) {
+  .col3 { width:100%; max-width:100%; }
+  .hide-mobile { display:none!important; }
+}
+
+.quiet {
+  color: #7f7f7f;
+  color: rgba(0,0,0,0.5);
+}
+.quiet a { opacity: 0.7; }
+
+.fraction {
+  font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+  font-size: 10px;
+  color: #555;
+  background: #E8E8E8;
+  padding: 4px 5px;
+  border-radius: 3px;
+  vertical-align: middle;
+}
+
+div.path a:link, div.path a:visited { color: #333; }
+table.coverage {
+  border-collapse: collapse;
+  margin: 10px 0 0 0;
+  padding: 0;
+}
+
+table.coverage td {
+  margin: 0;
+  padding: 0;
+  vertical-align: top;
+}
+table.coverage td.line-count {
+    text-align: right;
+    padding: 0 5px 0 20px;
+}
+table.coverage td.line-coverage {
+    text-align: right;
+    padding-right: 10px;
+    min-width:20px;
+}
+
+table.coverage td span.cline-any {
+    display: inline-block;
+    padding: 0 5px;
+    width: 100%;
+}
+.missing-if-branch {
+    display: inline-block;
+    margin-right: 5px;
+    border-radius: 3px;
+    position: relative;
+    padding: 0 4px;
+    background: #333;
+    color: yellow;
+}
+
+.skip-if-branch {
+    display: none;
+    margin-right: 10px;
+    position: relative;
+    padding: 0 4px;
+    background: #ccc;
+    color: white;
+}
+.missing-if-branch .typ, .skip-if-branch .typ {
+    color: inherit !important;
+}
+.coverage-summary {
+  border-collapse: collapse;
+  width: 100%;
+}
+.coverage-summary tr { border-bottom: 1px solid #bbb; }
+.keyline-all { border: 1px solid #ddd; }
+.coverage-summary td, .coverage-summary th { padding: 10px; }
+.coverage-summary tbody { border: 1px solid #bbb; }
+.coverage-summary td { border-right: 1px solid #bbb; }
+.coverage-summary td:last-child { border-right: none; }
+.coverage-summary th {
+  text-align: left;
+  font-weight: normal;
+  white-space: nowrap;
+}
+.coverage-summary th.file { border-right: none !important; }
+.coverage-summary th.pct { }
+.coverage-summary th.pic,
+.coverage-summary th.abs,
+.coverage-summary td.pct,
+.coverage-summary td.abs { text-align: right; }
+.coverage-summary td.file { white-space: nowrap;  }
+.coverage-summary td.pic { min-width: 120px !important;  }
+.coverage-summary tfoot td { }
+
+.coverage-summary .sorter {
+    height: 10px;
+    width: 7px;
+    display: inline-block;
+    margin-left: 0.5em;
+    background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
+}
+.coverage-summary .sorted .sorter {
+    background-position: 0 -20px;
+}
+.coverage-summary .sorted-desc .sorter {
+    background-position: 0 -10px;
+}
+.status-line {  height: 10px; }
+/* yellow */
+.cbranch-no { background: yellow !important; color: #111; }
+/* dark red */
+.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
+.low .chart { border:1px solid #C21F39 }
+.highlighted,
+.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
+  background: #C21F39 !important;
+}
+/* medium red */
+.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
+/* light red */
+.low, .cline-no { background:#FCE1E5 }
+/* light green */
+.high, .cline-yes { background:rgb(230,245,208) }
+/* medium green */
+.cstat-yes { background:rgb(161,215,106) }
+/* dark green */
+.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
+.high .chart { border:1px solid rgb(77,146,33) }
+/* dark yellow (gold) */
+.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
+.medium .chart { border:1px solid #f9cd0b; }
+/* light yellow */
+.medium { background: #fff4c2; }
+
+.cstat-skip { background: #ddd; color: #111; }
+.fstat-skip { background: #ddd; color: #111 !important; }
+.cbranch-skip { background: #ddd !important; color: #111; }
+
+span.cline-neutral { background: #eaeaea; }
+
+.coverage-summary td.empty {
+    opacity: .5;
+    padding-top: 4px;
+    padding-bottom: 4px;
+    line-height: 1;
+    color: #888;
+}
+
+.cover-fill, .cover-empty {
+  display:inline-block;
+  height: 12px;
+}
+.chart {
+  line-height: 0;
+}
+.cover-empty {
+    background: white;
+}
+.cover-full {
+    border-right: none !important;
+}
+pre.prettyprint {
+    border: none !important;
+    padding: 0 !important;
+    margin: 0 !important;
+}
+.com { color: #999 !important; }
+.ignore-none { color: #999; font-weight: normal; }
+
+.wrapper {
+  min-height: 100%;
+  height: auto !important;
+  height: 100%;
+  margin: 0 auto -48px;
+}
+.footer, .push {
+  height: 48px;
+}
diff --git a/packages/tests-unit/coverage/block-navigation.js b/packages/tests-unit/coverage/block-navigation.js
new file mode 100644
index 000000000..cc1213023
--- /dev/null
+++ b/packages/tests-unit/coverage/block-navigation.js
@@ -0,0 +1,87 @@
+/* eslint-disable */
+var jumpToCode = (function init() {
+    // Classes of code we would like to highlight in the file view
+    var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
+
+    // Elements to highlight in the file listing view
+    var fileListingElements = ['td.pct.low'];
+
+    // We don't want to select elements that are direct descendants of another match
+    var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
+
+    // Selecter that finds elements on the page to which we can jump
+    var selector =
+        fileListingElements.join(', ') +
+        ', ' +
+        notSelector +
+        missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
+
+    // The NodeList of matching elements
+    var missingCoverageElements = document.querySelectorAll(selector);
+
+    var currentIndex;
+
+    function toggleClass(index) {
+        missingCoverageElements
+            .item(currentIndex)
+            .classList.remove('highlighted');
+        missingCoverageElements.item(index).classList.add('highlighted');
+    }
+
+    function makeCurrent(index) {
+        toggleClass(index);
+        currentIndex = index;
+        missingCoverageElements.item(index).scrollIntoView({
+            behavior: 'smooth',
+            block: 'center',
+            inline: 'center'
+        });
+    }
+
+    function goToPrevious() {
+        var nextIndex = 0;
+        if (typeof currentIndex !== 'number' || currentIndex === 0) {
+            nextIndex = missingCoverageElements.length - 1;
+        } else if (missingCoverageElements.length > 1) {
+            nextIndex = currentIndex - 1;
+        }
+
+        makeCurrent(nextIndex);
+    }
+
+    function goToNext() {
+        var nextIndex = 0;
+
+        if (
+            typeof currentIndex === 'number' &&
+            currentIndex < missingCoverageElements.length - 1
+        ) {
+            nextIndex = currentIndex + 1;
+        }
+
+        makeCurrent(nextIndex);
+    }
+
+    return function jump(event) {
+        if (
+            document.getElementById('fileSearch') === document.activeElement &&
+            document.activeElement != null
+        ) {
+            // if we're currently focused on the search input, we don't want to navigate
+            return;
+        }
+
+        switch (event.which) {
+            case 78: // n
+            case 74: // j
+                goToNext();
+                break;
+            case 66: // b
+            case 75: // k
+            case 80: // p
+                goToPrevious();
+                break;
+        }
+    };
+})();
+window.addEventListener('keydown', jumpToCode);
diff --git a/packages/tests-unit/coverage/clover.xml b/packages/tests-unit/coverage/clover.xml
new file mode 100644
index 000000000..57a69d27d
--- /dev/null
+++ b/packages/tests-unit/coverage/clover.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<coverage generated="1694385498800" clover="3.2.0">
+  <project timestamp="1694385498800" name="All files">
+    <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0" elements="0" coveredelements="0" complexity="0" loc="0" ncloc="0" packages="0" files="0" classes="0"/>
+  </project>
+</coverage>
diff --git a/packages/tests-unit/coverage/coverage-final.json b/packages/tests-unit/coverage/coverage-final.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/packages/tests-unit/coverage/coverage-final.json
@@ -0,0 +1 @@
+{}
diff --git a/packages/tests-unit/coverage/favicon.png b/packages/tests-unit/coverage/favicon.png
new file mode 100644
index 000000000..c1525b811
Binary files /dev/null and b/packages/tests-unit/coverage/favicon.png differ
diff --git a/packages/tests-unit/coverage/index.html b/packages/tests-unit/coverage/index.html
new file mode 100644
index 000000000..67f85d88f
--- /dev/null
+++ b/packages/tests-unit/coverage/index.html
@@ -0,0 +1,101 @@
+
+<!doctype html>
+<html lang="en">
+
+<head>
+    <title>Code coverage report for All files</title>
+    <meta charset="utf-8" />
+    <link rel="stylesheet" href="prettify.css" />
+    <link rel="stylesheet" href="base.css" />
+    <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
+    <meta name="viewport" content="width=device-width, initial-scale=1" />
+    <style type='text/css'>
+        .coverage-summary .sorter {
+            background-image: url(sort-arrow-sprite.png);
+        }
+    </style>
+</head>
+    
+<body>
+<div class='wrapper'>
+    <div class='pad1'>
+        <h1>All files</h1>
+        <div class='clearfix'>
+            
+            <div class='fl pad1y space-right2'>
+                <span class="strong">Unknown% </span>
+                <span class="quiet">Statements</span>
+                <span class='fraction'>0/0</span>
+            </div>
+        
+            
+            <div class='fl pad1y space-right2'>
+                <span class="strong">Unknown% </span>
+                <span class="quiet">Branches</span>
+                <span class='fraction'>0/0</span>
+            </div>
+        
+            
+            <div class='fl pad1y space-right2'>
+                <span class="strong">Unknown% </span>
+                <span class="quiet">Functions</span>
+                <span class='fraction'>0/0</span>
+            </div>
+        
+            
+            <div class='fl pad1y space-right2'>
+                <span class="strong">Unknown% </span>
+                <span class="quiet">Lines</span>
+                <span class='fraction'>0/0</span>
+            </div>
+        
+            
+        </div>
+        <p class="quiet">
+            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
+        </p>
+        <template id="filterTemplate">
+            <div class="quiet">
+                Filter:
+                <input oninput="onInput()" type="search" id="fileSearch">
+            </div>
+        </template>
+    </div>
+    <div class='status-line medium'></div>
+    <div class="pad1">
+<table class="coverage-summary">
+<thead>
+<tr>
+   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
+   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
+   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
+   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
+   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
+   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
+   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
+   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
+   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
+   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
+</tr>
+</thead>
+<tbody></tbody>
+</table>
+</div>
+                <div class='push'></div><!-- for sticky footer -->
+            </div><!-- /wrapper -->
+            <div class='footer quiet pad2 space-top1 center small'>
+                Code coverage generated by
+                <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
+                at 2023-09-10T22:38:18.797Z
+            </div>
+        <script src="prettify.js"></script>
+        <script>
+            window.onload = function () {
+                prettyPrint();
+            };
+        </script>
+        <script src="sorter.js"></script>
+        <script src="block-navigation.js"></script>
+    </body>
+</html>
+    
\ No newline at end of file
diff --git a/packages/tests-unit/coverage/prettify.css b/packages/tests-unit/coverage/prettify.css
new file mode 100644
index 000000000..b317a7cda
--- /dev/null
+++ b/packages/tests-unit/coverage/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
diff --git a/packages/tests-unit/coverage/prettify.js b/packages/tests-unit/coverage/prettify.js
new file mode 100644
index 000000000..b3225238f
--- /dev/null
+++ b/packages/tests-unit/coverage/prettify.js
@@ -0,0 +1,2 @@
+/* eslint-disable */
+window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
diff --git a/packages/tests-unit/coverage/sort-arrow-sprite.png b/packages/tests-unit/coverage/sort-arrow-sprite.png
new file mode 100644
index 000000000..6ed68316e
Binary files /dev/null and b/packages/tests-unit/coverage/sort-arrow-sprite.png differ
diff --git a/packages/tests-unit/coverage/sorter.js b/packages/tests-unit/coverage/sorter.js
new file mode 100644
index 000000000..2bb296a8c
--- /dev/null
+++ b/packages/tests-unit/coverage/sorter.js
@@ -0,0 +1,196 @@
+/* eslint-disable */
+var addSorting = (function() {
+    'use strict';
+    var cols,
+        currentSort = {
+            index: 0,
+            desc: false
+        };
+
+    // returns the summary table element
+    function getTable() {
+        return document.querySelector('.coverage-summary');
+    }
+    // returns the thead element of the summary table
+    function getTableHeader() {
+        return getTable().querySelector('thead tr');
+    }
+    // returns the tbody element of the summary table
+    function getTableBody() {
+        return getTable().querySelector('tbody');
+    }
+    // returns the th element for nth column
+    function getNthColumn(n) {
+        return getTableHeader().querySelectorAll('th')[n];
+    }
+
+    function onFilterInput() {
+        const searchValue = document.getElementById('fileSearch').value;
+        const rows = document.getElementsByTagName('tbody')[0].children;
+        for (let i = 0; i < rows.length; i++) {
+            const row = rows[i];
+            if (
+                row.textContent
+                    .toLowerCase()
+                    .includes(searchValue.toLowerCase())
+            ) {
+                row.style.display = '';
+            } else {
+                row.style.display = 'none';
+            }
+        }
+    }
+
+    // loads the search box
+    function addSearchBox() {
+        var template = document.getElementById('filterTemplate');
+        var templateClone = template.content.cloneNode(true);
+        templateClone.getElementById('fileSearch').oninput = onFilterInput;
+        template.parentElement.appendChild(templateClone);
+    }
+
+    // loads all columns
+    function loadColumns() {
+        var colNodes = getTableHeader().querySelectorAll('th'),
+            colNode,
+            cols = [],
+            col,
+            i;
+
+        for (i = 0; i < colNodes.length; i += 1) {
+            colNode = colNodes[i];
+            col = {
+                key: colNode.getAttribute('data-col'),
+                sortable: !colNode.getAttribute('data-nosort'),
+                type: colNode.getAttribute('data-type') || 'string'
+            };
+            cols.push(col);
+            if (col.sortable) {
+                col.defaultDescSort = col.type === 'number';
+                colNode.innerHTML =
+                    colNode.innerHTML + '<span class="sorter"></span>';
+            }
+        }
+        return cols;
+    }
+    // attaches a data attribute to every tr element with an object
+    // of data values keyed by column name
+    function loadRowData(tableRow) {
+        var tableCols = tableRow.querySelectorAll('td'),
+            colNode,
+            col,
+            data = {},
+            i,
+            val;
+        for (i = 0; i < tableCols.length; i += 1) {
+            colNode = tableCols[i];
+            col = cols[i];
+            val = colNode.getAttribute('data-value');
+            if (col.type === 'number') {
+                val = Number(val);
+            }
+            data[col.key] = val;
+        }
+        return data;
+    }
+    // loads all row data
+    function loadData() {
+        var rows = getTableBody().querySelectorAll('tr'),
+            i;
+
+        for (i = 0; i < rows.length; i += 1) {
+            rows[i].data = loadRowData(rows[i]);
+        }
+    }
+    // sorts the table using the data for the ith column
+    function sortByIndex(index, desc) {
+        var key = cols[index].key,
+            sorter = function(a, b) {
+                a = a.data[key];
+                b = b.data[key];
+                return a < b ? -1 : a > b ? 1 : 0;
+            },
+            finalSorter = sorter,
+            tableBody = document.querySelector('.coverage-summary tbody'),
+            rowNodes = tableBody.querySelectorAll('tr'),
+            rows = [],
+            i;
+
+        if (desc) {
+            finalSorter = function(a, b) {
+                return -1 * sorter(a, b);
+            };
+        }
+
+        for (i = 0; i < rowNodes.length; i += 1) {
+            rows.push(rowNodes[i]);
+            tableBody.removeChild(rowNodes[i]);
+        }
+
+        rows.sort(finalSorter);
+
+        for (i = 0; i < rows.length; i += 1) {
+            tableBody.appendChild(rows[i]);
+        }
+    }
+    // removes sort indicators for current column being sorted
+    function removeSortIndicators() {
+        var col = getNthColumn(currentSort.index),
+            cls = col.className;
+
+        cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
+        col.className = cls;
+    }
+    // adds sort indicators for current column being sorted
+    function addSortIndicators() {
+        getNthColumn(currentSort.index).className += currentSort.desc
+            ? ' sorted-desc'
+            : ' sorted';
+    }
+    // adds event listeners for all sorter widgets
+    function enableUI() {
+        var i,
+            el,
+            ithSorter = function ithSorter(i) {
+                var col = cols[i];
+
+                return function() {
+                    var desc = col.defaultDescSort;
+
+                    if (currentSort.index === i) {
+                        desc = !currentSort.desc;
+                    }
+                    sortByIndex(i, desc);
+                    removeSortIndicators();
+                    currentSort.index = i;
+                    currentSort.desc = desc;
+                    addSortIndicators();
+                };
+            };
+        for (i = 0; i < cols.length; i += 1) {
+            if (cols[i].sortable) {
+                // add the click event handler on the th so users
+                // dont have to click on those tiny arrows
+                el = getNthColumn(i).querySelector('.sorter').parentElement;
+                if (el.addEventListener) {
+                    el.addEventListener('click', ithSorter(i));
+                } else {
+                    el.attachEvent('onclick', ithSorter(i));
+                }
+            }
+        }
+    }
+    // adds sorting functionality to the UI
+    return function() {
+        if (!getTable()) {
+            return;
+        }
+        cols = loadColumns();
+        loadData();
+        addSearchBox();
+        addSortIndicators();
+        enableUI();
+    };
+})();
+
+window.addEventListener('load', addSorting);
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e4b64dc0a..3a9bb779f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -98,7 +98,7 @@ importers:
         version: link:../../packages/utils
       next:
         specifier: latest
-        version: 13.4.19(react-dom@18.2.0)(react@18.2.0)
+        version: 13.5.3(react-dom@18.2.0)(react@18.2.0)
       open-next:
         specifier: workspace:*
         version: link:../../packages/open-next
@@ -141,7 +141,7 @@ importers:
         version: link:../../packages/utils
       next:
         specifier: latest
-        version: 13.4.19(react-dom@18.2.0)(react@18.2.0)
+        version: 13.5.3(react-dom@18.2.0)(react@18.2.0)
       open-next:
         specifier: workspace:*
         version: link:../../packages/open-next
@@ -193,7 +193,7 @@ importers:
         version: 10.4.15(postcss@8.4.27)
       next:
         specifier: latest
-        version: 13.4.19(react-dom@18.2.0)(react@18.2.0)
+        version: 13.5.3(react-dom@18.2.0)(react@18.2.0)
       postcss:
         specifier: 8.4.27
         version: 8.4.27
@@ -232,26 +232,26 @@ importers:
         specifier: 10.2.69
         version: 10.2.69
       sst:
-        specifier: 2.24.20
-        version: 2.24.20
+        specifier: 2.24.24
+        version: 2.24.24
 
   packages/open-next:
     dependencies:
       '@aws-sdk/client-dynamodb':
         specifier: ^3.398.0
-        version: 3.398.0
+        version: 3.421.0
       '@aws-sdk/client-lambda':
         specifier: ^3.398.0
-        version: 3.398.0
+        version: 3.405.0
       '@aws-sdk/client-s3':
         specifier: ^3.398.0
-        version: 3.400.0(@aws-sdk/signature-v4-crt@3.398.0)
+        version: 3.405.0(@aws-sdk/signature-v4-crt@3.398.0)
       '@aws-sdk/client-sqs':
         specifier: ^3.398.0
-        version: 3.398.0
+        version: 3.405.0
       '@esbuild-plugins/node-resolve':
         specifier: 0.2.2
-        version: 0.2.2(esbuild@0.18.20)
+        version: 0.2.2(esbuild@0.19.2)
       '@node-minify/core':
         specifier: ^8.0.6
         version: 8.0.6
@@ -262,8 +262,8 @@ importers:
         specifier: ^1.0.1
         version: 1.0.3
       esbuild:
-        specifier: ^0.18.18
-        version: 0.18.20
+        specifier: 0.19.2
+        version: 0.19.2
       path-to-regexp:
         specifier: ^6.2.1
         version: 6.2.1
@@ -276,7 +276,7 @@ importers:
         version: 8.10.119
       '@types/node':
         specifier: ^18.16.1
-        version: 18.17.12
+        version: 18.17.13
       typescript:
         specifier: ^4.9.3
         version: 4.9.3
@@ -294,7 +294,7 @@ importers:
         version: 2.0.0
       ts-node:
         specifier: 10.9.1
-        version: 10.9.1(@types/node@18.17.12)(typescript@4.9.3)
+        version: 10.9.1(@types/node@18.17.13)(typescript@4.9.3)
 
   packages/tests-unit:
     dependencies:
@@ -530,7 +530,7 @@ packages:
     resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==}
     dependencies:
       '@aws-crypto/util': 3.0.0
-      '@aws-sdk/types': 3.398.0
+      '@aws-sdk/types': 3.418.0
       tslib: 1.14.1
 
   /@aws-crypto/crc32c@3.0.0:
@@ -563,7 +563,7 @@ packages:
       '@aws-crypto/sha256-js': 3.0.0
       '@aws-crypto/supports-web-crypto': 3.0.0
       '@aws-crypto/util': 3.0.0
-      '@aws-sdk/types': 3.398.0
+      '@aws-sdk/types': 3.418.0
       '@aws-sdk/util-locate-window': 3.310.0
       '@aws-sdk/util-utf8-browser': 3.259.0
       tslib: 1.14.1
@@ -572,7 +572,7 @@ packages:
     resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==}
     dependencies:
       '@aws-crypto/util': 3.0.0
-      '@aws-sdk/types': 3.398.0
+      '@aws-sdk/types': 3.418.0
       tslib: 1.14.1
 
   /@aws-crypto/sha256-js@5.0.0:
@@ -592,7 +592,7 @@ packages:
   /@aws-crypto/util@3.0.0:
     resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==}
     dependencies:
-      '@aws-sdk/types': 3.398.0
+      '@aws-sdk/types': 3.418.0
       '@aws-sdk/util-utf8-browser': 3.259.0
       tslib: 1.14.1
 
@@ -604,14 +604,14 @@ packages:
       tslib: 1.14.1
     dev: true
 
-  /@aws-sdk/client-cloudformation@3.398.0:
-    resolution: {integrity: sha512-NQAjm0FYmmMT9jn7y2kYpa5MtANwe2c+65IJATXCJC9YqmDxDveZce6YmOpZ3Qflf7Z1J2A7rYAwo0qO35/Zcg==}
+  /@aws-sdk/client-cloudformation@3.405.0:
+    resolution: {integrity: sha512-7tmE/r0FESVR8N6G6bRsVnAoUxmzv8c6C2oe4I6K9bQT9wHDv/DuFHNSkP28ReIwdr9iA7mzzTUQ6JyeqW/UuA==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -620,7 +620,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -630,7 +630,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -639,8 +639,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       '@smithy/util-waiter': 2.0.5
@@ -651,14 +651,14 @@ packages:
       - aws-crt
     dev: true
 
-  /@aws-sdk/client-cognito-identity@3.398.0:
-    resolution: {integrity: sha512-Pr/S1f8R2FsJ8DwBC6g0CSdtZNNV5dMHhlIi+t8YAmCJvP4KT+UhzFjbvQRINlBRLFuGUuP7p5vRcGVELD3+wA==}
+  /@aws-sdk/client-cognito-identity@3.405.0:
+    resolution: {integrity: sha512-kvmNAREFQbhaZoEMQzBOYTaN7cFIOLgk2DZYYlHh2ErUYXSbvbVOBUriMRW9hRDtKLooe3ZFBLO3sWKvQE/AfA==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -667,7 +667,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -677,7 +677,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -686,8 +686,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       tslib: 2.6.2
@@ -695,61 +695,62 @@ packages:
       - aws-crt
     dev: true
 
-  /@aws-sdk/client-dynamodb@3.398.0:
-    resolution: {integrity: sha512-INYklo7u16T0Gia983MqfLdx4feZ96xqowH23+1XSYe4VSersCSfdBM+yeChQ5naTCW0GqFybC9+BytZX5/klw==}
+  /@aws-sdk/client-dynamodb@3.421.0:
+    resolution: {integrity: sha512-TXyKvEYAxoz3LNpXSvPaLp139X06yzz35SNzKKNt/z7lfbmZ/jY7jVK4nur/Y5GSSlL+duW5yeS4iqq67kdl9Q==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
-      '@aws-sdk/middleware-endpoint-discovery': 3.398.0
-      '@aws-sdk/middleware-host-header': 3.398.0
-      '@aws-sdk/middleware-logger': 3.398.0
-      '@aws-sdk/middleware-recursion-detection': 3.398.0
-      '@aws-sdk/middleware-signing': 3.398.0
-      '@aws-sdk/middleware-user-agent': 3.398.0
-      '@aws-sdk/types': 3.398.0
-      '@aws-sdk/util-endpoints': 3.398.0
-      '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
-      '@smithy/config-resolver': 2.0.5
-      '@smithy/fetch-http-handler': 2.0.5
-      '@smithy/hash-node': 2.0.5
-      '@smithy/invalid-dependency': 2.0.5
-      '@smithy/middleware-content-length': 2.0.5
-      '@smithy/middleware-endpoint': 2.0.5
-      '@smithy/middleware-retry': 2.0.5
-      '@smithy/middleware-serde': 2.0.5
-      '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
-      '@smithy/node-http-handler': 2.0.5
-      '@smithy/protocol-http': 2.0.5
-      '@smithy/smithy-client': 2.0.5
-      '@smithy/types': 2.2.2
-      '@smithy/url-parser': 2.0.5
+      '@aws-sdk/client-sts': 3.421.0
+      '@aws-sdk/credential-provider-node': 3.421.0
+      '@aws-sdk/middleware-endpoint-discovery': 3.418.0
+      '@aws-sdk/middleware-host-header': 3.418.0
+      '@aws-sdk/middleware-logger': 3.418.0
+      '@aws-sdk/middleware-recursion-detection': 3.418.0
+      '@aws-sdk/middleware-signing': 3.418.0
+      '@aws-sdk/middleware-user-agent': 3.418.0
+      '@aws-sdk/region-config-resolver': 3.418.0
+      '@aws-sdk/types': 3.418.0
+      '@aws-sdk/util-endpoints': 3.418.0
+      '@aws-sdk/util-user-agent-browser': 3.418.0
+      '@aws-sdk/util-user-agent-node': 3.418.0
+      '@smithy/config-resolver': 2.0.11
+      '@smithy/fetch-http-handler': 2.2.0
+      '@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.8
+      '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
-      '@smithy/util-retry': 2.0.0
+      '@smithy/util-defaults-mode-browser': 2.0.12
+      '@smithy/util-defaults-mode-node': 2.0.14
+      '@smithy/util-retry': 2.0.3
       '@smithy/util-utf8': 2.0.0
-      '@smithy/util-waiter': 2.0.5
+      '@smithy/util-waiter': 2.0.10
       tslib: 2.6.2
       uuid: 8.3.2
     transitivePeerDependencies:
       - aws-crt
     dev: false
 
-  /@aws-sdk/client-ecs@3.398.0:
-    resolution: {integrity: sha512-bjLdxYs9fV6u5qZI5HssZrcrM2pD8JOxqo4ApHTo1ldhwtKiSsrsJv2nJ721bRT0iByDrtgI72EKfGMBysE+lA==}
+  /@aws-sdk/client-ecs@3.405.0:
+    resolution: {integrity: sha512-Yhp5ujk5V4iaX8mCkUnco4M3ltnJeLZoB5yY/7C8uCAn91rM+Z2UTHO24zYqO/NIh0PErqkR40K8MwEkI7QqAw==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -758,7 +759,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -768,7 +769,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -777,8 +778,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       '@smithy/util-waiter': 2.0.5
@@ -787,14 +788,14 @@ packages:
       - aws-crt
     dev: true
 
-  /@aws-sdk/client-eventbridge@3.398.0(@aws-sdk/signature-v4-crt@3.398.0):
-    resolution: {integrity: sha512-EmaRYvjdj+OaIjLmOlWjfAqG4hQuhEieJucRXNvdf1FShktDzN23kOHchvzBzn6e+EG5sOWhZx2ID/8YDRAPew==}
+  /@aws-sdk/client-eventbridge@3.405.0(@aws-sdk/signature-v4-crt@3.398.0):
+    resolution: {integrity: sha512-WCWXwFiWDwKFYehfOTmmrXZ2UTx+yPma0935eGGoOLzZ6Vn/IGedPiZOq8We+oqEHm2QFTb/n5gnp1WjnunMGg==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -804,7 +805,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -814,7 +815,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -823,8 +824,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       tslib: 2.6.2
@@ -833,14 +834,14 @@ packages:
       - aws-crt
     dev: true
 
-  /@aws-sdk/client-iam@3.398.0:
-    resolution: {integrity: sha512-wQEVjrS1f00NxZNCnAzGhn1HLmFlqkMjgCNRskRF2Qz/ppgSsdgUEc/D5msusWKNo+p9e2ixHKB8eATX03kUXQ==}
+  /@aws-sdk/client-iam@3.405.0:
+    resolution: {integrity: sha512-q2sIj1r6yZ6mhZEkSBVpwiwi0dTmDAeSSRBdwq/O8ekpuB4LNRaMuHba4qUEN4Xq9Gaykky7rzArJ5/+iUxVLg==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -849,7 +850,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -859,7 +860,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -868,8 +869,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       '@smithy/util-waiter': 2.0.5
@@ -879,14 +880,14 @@ packages:
       - aws-crt
     dev: true
 
-  /@aws-sdk/client-iot-data-plane@3.398.0:
-    resolution: {integrity: sha512-aURiQAnz/KVYdXDGN40ND67BiqdIMFpDypXGB7jOqBi+Ih3dO+htQaOPQUmkrB/5/mT1cnVgQvi4PNOiwfK1VQ==}
+  /@aws-sdk/client-iot-data-plane@3.405.0:
+    resolution: {integrity: sha512-D3KBFk2jEv/OyPUt4j5RGbW0MRmXcnj1nSCMosyY5ft/OVF1cDlpokaSrskjHeVAyUSWyVkcZAFEt7YHw/38IQ==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -895,7 +896,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -905,7 +906,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -914,8 +915,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-stream': 2.0.5
       '@smithy/util-utf8': 2.0.0
@@ -924,14 +925,14 @@ packages:
       - aws-crt
     dev: true
 
-  /@aws-sdk/client-iot@3.398.0:
-    resolution: {integrity: sha512-HWBEeRb4yq/6j9kldwFd+Hr31c1DI/a/vw9Kjb2OZwUOjWxcuEWaka4R2OfJ0PzjaKFnfey+2pqMB8WlLEMTxg==}
+  /@aws-sdk/client-iot@3.405.0:
+    resolution: {integrity: sha512-dtdRv2+TGvtmrnMbDDLUV3351QZp1fh66xN8Zk9clnDyLMQHjDTgs8RAozG5kM86/oJqlQWTUTo8XJZFcDPG/g==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -940,7 +941,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -950,7 +951,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -959,8 +960,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       tslib: 2.6.2
@@ -969,14 +970,14 @@ packages:
       - aws-crt
     dev: true
 
-  /@aws-sdk/client-lambda@3.398.0:
-    resolution: {integrity: sha512-f++i62vpdh/kUFBx2hWnAJRpb1IOGSqP6+2OP4c7WCpYrrGKleZCRPEZdsDTYnEG1ws987XYfDtal4CVVVL+nw==}
+  /@aws-sdk/client-lambda@3.405.0:
+    resolution: {integrity: sha512-q43LQCllmfIMbA8low6lNIJdD3HxfN08RpB4vIWQhzwHxXrj0GV15pxPQa4SQdzSF6OfKIoW58Z2M/IPYvlQhg==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -985,7 +986,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/eventstream-serde-browser': 2.0.5
       '@smithy/eventstream-serde-config-resolver': 2.0.5
@@ -998,7 +999,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -1007,8 +1008,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-stream': 2.0.5
       '@smithy/util-utf8': 2.0.0
@@ -1017,14 +1018,14 @@ packages:
     transitivePeerDependencies:
       - aws-crt
 
-  /@aws-sdk/client-rds-data@3.398.0:
-    resolution: {integrity: sha512-RfjHG2vHg5fqjPN1fNQa/hZ/yyEUkkI+THOQh1fW0e4sL4zPJtYG8j5Sc8IynPQFOQXUOppS0lyY+x4FqnYCWQ==}
+  /@aws-sdk/client-rds-data@3.405.0:
+    resolution: {integrity: sha512-PWfpBqmOzk3dAvweghRU57HhxI65ExFm5sKJk/dsRY4xv2pZif4yFKkGv7BTf0LNXZo0ynuZivfVQYLdjnCFVw==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -1033,7 +1034,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -1043,7 +1044,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -1052,8 +1053,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       tslib: 2.6.2
@@ -1061,16 +1062,16 @@ packages:
       - aws-crt
     dev: true
 
-  /@aws-sdk/client-s3@3.400.0(@aws-sdk/signature-v4-crt@3.398.0):
-    resolution: {integrity: sha512-lnv0pb79Czl8fCMs/z7yM56LvoKTri1I4jX/V33trHMFKPQDoy8i24wxG8+TZl3MUmnUyoQS7tlukh7IFkii1Q==}
+  /@aws-sdk/client-s3@3.405.0(@aws-sdk/signature-v4-crt@3.398.0):
+    resolution: {integrity: sha512-+LK6OCbKplR51zBZAtK/+RxaPsXcEklsA1+mmUA3M1h4KHl6GMiK5r/D9dlKht5DRntmmjCn3SI99QbfckqKXg==}
     engines: {node: '>=14.0.0'}
     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.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
-      '@aws-sdk/middleware-bucket-endpoint': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
+      '@aws-sdk/middleware-bucket-endpoint': 3.405.0
       '@aws-sdk/middleware-expect-continue': 3.398.0
       '@aws-sdk/middleware-flexible-checksums': 3.400.0
       '@aws-sdk/middleware-host-header': 3.398.0
@@ -1085,7 +1086,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@aws-sdk/xml-builder': 3.310.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/eventstream-serde-browser': 2.0.5
@@ -1102,7 +1103,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -1111,8 +1112,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-stream': 2.0.5
       '@smithy/util-utf8': 2.0.0
@@ -1123,14 +1124,14 @@ packages:
       - '@aws-sdk/signature-v4-crt'
       - aws-crt
 
-  /@aws-sdk/client-sqs@3.398.0:
-    resolution: {integrity: sha512-y5+QxwQEYbbrHWuJgGL4BnlgfQO/Jp3cLpd0p/idLccAfWia2TKO15rn6sBvMcpC7/nTPjtii3jPeUn6HkAGHQ==}
+  /@aws-sdk/client-sqs@3.405.0:
+    resolution: {integrity: sha512-mZ3nKrAK8OntS765pH2kslCpaxtuGIc5TdKcgaFi17p4FD5zP5uzEK1UmUl52Y7YVa1Qpixyzbnzy/lp0J8V/g==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -1140,7 +1141,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -1151,7 +1152,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -1160,8 +1161,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       fast-xml-parser: 4.2.5
@@ -1170,14 +1171,14 @@ packages:
       - aws-crt
     dev: false
 
-  /@aws-sdk/client-ssm@3.398.0:
-    resolution: {integrity: sha512-TlcY4wJzGinllmPtmZi7M8lUaXeUWHkpU1N5CFi8/Ef1A2o7Af9tG+1UgY7dFeoPv2pZsYp5Ettw/hRV+dt7fQ==}
+  /@aws-sdk/client-ssm@3.405.0:
+    resolution: {integrity: sha512-e47vcxHBveuPth/MRUOleR2iehV3xftP204nRzDkB5DSnQ28qdXvxWau1lLbTFRX2PzzJZPe5aI7+PZE/s+nwg==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -1186,7 +1187,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -1196,7 +1197,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -1205,8 +1206,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       '@smithy/util-waiter': 2.0.5
@@ -1216,8 +1217,8 @@ packages:
       - aws-crt
     dev: true
 
-  /@aws-sdk/client-sso@3.398.0:
-    resolution: {integrity: sha512-CygL0jhfibw4kmWXG/3sfZMFNjcXo66XUuPC4BqZBk8Rj5vFoxp1vZeMkDLzTIk97Nvo5J5Bh+QnXKhub6AckQ==}
+  /@aws-sdk/client-sso@3.405.0:
+    resolution: {integrity: sha512-z1ssydU07bDhe0tNXQwVO+rWh/iSfK48JI8s8vgpBNwH+NejMzIJ9r3AkjCiJ+LSAwlBZItUsNWwR0veIfgBiw==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
@@ -1229,7 +1230,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -1239,7 +1240,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -1248,21 +1249,63 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       tslib: 2.6.2
     transitivePeerDependencies:
       - aws-crt
 
-  /@aws-sdk/client-sts@3.398.0:
-    resolution: {integrity: sha512-/3Pa9wLMvBZipKraq3AtbmTfXW6q9kyvhwOno64f1Fz7kFb8ijQFMGoATS70B2pGEZTlxkUqJFWDiisT6Q6dFg==}
+  /@aws-sdk/client-sso@3.421.0:
+    resolution: {integrity: sha512-40CmW7K2/FZEn3CbOjbpRYeVjKu6aJQlpRHcAgEJGNoVEAnRA3YNH4H0BN2iWWITfYg3B7sIjMm5VE9fCIK1Ng==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-crypto/sha256-browser': 3.0.0
+      '@aws-crypto/sha256-js': 3.0.0
+      '@aws-sdk/middleware-host-header': 3.418.0
+      '@aws-sdk/middleware-logger': 3.418.0
+      '@aws-sdk/middleware-recursion-detection': 3.418.0
+      '@aws-sdk/middleware-user-agent': 3.418.0
+      '@aws-sdk/region-config-resolver': 3.418.0
+      '@aws-sdk/types': 3.418.0
+      '@aws-sdk/util-endpoints': 3.418.0
+      '@aws-sdk/util-user-agent-browser': 3.418.0
+      '@aws-sdk/util-user-agent-node': 3.418.0
+      '@smithy/config-resolver': 2.0.11
+      '@smithy/fetch-http-handler': 2.2.0
+      '@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.8
+      '@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.12
+      '@smithy/util-defaults-mode-node': 2.0.14
+      '@smithy/util-retry': 2.0.3
+      '@smithy/util-utf8': 2.0.0
+      tslib: 2.6.2
+    transitivePeerDependencies:
+      - aws-crt
+    dev: false
+
+  /@aws-sdk/client-sts@3.405.0:
+    resolution: {integrity: sha512-asVEpda3zu5QUO5ZNNjbLBS0718IhxxyUDVrNmVTKZoOhK1pMNouGZf+l49v0Lb5cOPbUds8cxsNaInj2MvIKw==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
       '@aws-crypto/sha256-js': 3.0.0
-      '@aws-sdk/credential-provider-node': 3.398.0
+      '@aws-sdk/credential-provider-node': 3.405.0
       '@aws-sdk/middleware-host-header': 3.398.0
       '@aws-sdk/middleware-logger': 3.398.0
       '@aws-sdk/middleware-recursion-detection': 3.398.0
@@ -1272,7 +1315,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -1282,7 +1325,7 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
       '@smithy/protocol-http': 2.0.5
       '@smithy/smithy-client': 2.0.5
@@ -1291,8 +1334,8 @@ packages:
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       fast-xml-parser: 4.2.5
@@ -1300,6 +1343,52 @@ packages:
     transitivePeerDependencies:
       - aws-crt
 
+  /@aws-sdk/client-sts@3.421.0:
+    resolution: {integrity: sha512-/92NOZMcdkBcvGrINk5B/l+6DGcVzYE4Ab3ME4vcY9y//u2gd0yNn5YYRSzzjVBLvhDP3u6CbTfLX2Bm4qihPw==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-crypto/sha256-browser': 3.0.0
+      '@aws-crypto/sha256-js': 3.0.0
+      '@aws-sdk/credential-provider-node': 3.421.0
+      '@aws-sdk/middleware-host-header': 3.418.0
+      '@aws-sdk/middleware-logger': 3.418.0
+      '@aws-sdk/middleware-recursion-detection': 3.418.0
+      '@aws-sdk/middleware-sdk-sts': 3.418.0
+      '@aws-sdk/middleware-signing': 3.418.0
+      '@aws-sdk/middleware-user-agent': 3.418.0
+      '@aws-sdk/region-config-resolver': 3.418.0
+      '@aws-sdk/types': 3.418.0
+      '@aws-sdk/util-endpoints': 3.418.0
+      '@aws-sdk/util-user-agent-browser': 3.418.0
+      '@aws-sdk/util-user-agent-node': 3.418.0
+      '@smithy/config-resolver': 2.0.11
+      '@smithy/fetch-http-handler': 2.2.0
+      '@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.8
+      '@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.12
+      '@smithy/util-defaults-mode-node': 2.0.14
+      '@smithy/util-retry': 2.0.3
+      '@smithy/util-utf8': 2.0.0
+      fast-xml-parser: 4.2.5
+      tslib: 2.6.2
+    transitivePeerDependencies:
+      - aws-crt
+    dev: false
+
   /@aws-sdk/config-resolver@3.374.0:
     resolution: {integrity: sha512-eTSbmpcgZ97o7PuFls8pH1344OS03nfqq1NO9HxxvoYoZ6DFfUO7kqKeNUhP9LxOF7slyHXajDT7eoPclGnTuw==}
     engines: {node: '>=14.0.0'}
@@ -1309,13 +1398,13 @@ packages:
       tslib: 2.6.2
     dev: true
 
-  /@aws-sdk/credential-provider-cognito-identity@3.398.0:
-    resolution: {integrity: sha512-MFUhy1YayHg5ypRTk4OTfDumQRP+OJBagaGv14kA8DzhKH1sNrU4HV7A7y2J4SvkN5hG/KnLJqxpakCtB2/O2g==}
+  /@aws-sdk/credential-provider-cognito-identity@3.405.0:
+    resolution: {integrity: sha512-tmu8r0kB3qHHIitQAwiziWzxoaGCv/vCh00EcabuW3x3UsKQUF71ZLuNcMOv5wqTsQw0Fmv3dKy2tzVmRm3Z5g==}
     engines: {node: '>=14.0.0'}
     dependencies:
-      '@aws-sdk/client-cognito-identity': 3.398.0
+      '@aws-sdk/client-cognito-identity': 3.405.0
       '@aws-sdk/types': 3.398.0
-      '@smithy/property-provider': 2.0.5
+      '@smithy/property-provider': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
     transitivePeerDependencies:
@@ -1327,95 +1416,178 @@ packages:
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-sdk/types': 3.398.0
-      '@smithy/property-provider': 2.0.5
+      '@smithy/property-provider': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
-  /@aws-sdk/credential-provider-ini@3.398.0:
-    resolution: {integrity: sha512-AsK1lStK3nB9Cn6S6ODb1ktGh7SRejsNVQVKX3t5d3tgOaX+aX1Iwy8FzM/ZEN8uCloeRifUGIY9uQFygg5mSw==}
+  /@aws-sdk/credential-provider-env@3.418.0:
+    resolution: {integrity: sha512-e74sS+x63EZUBO+HaI8zor886YdtmULzwKdctsZp5/37Xho1CVUNtEC+fYa69nigBD9afoiH33I4JggaHgrekQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@smithy/property-provider': 2.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
+  /@aws-sdk/credential-provider-ini@3.405.0:
+    resolution: {integrity: sha512-b4TqVsM4WQM96GDVs+TYOhU2/0SnUWzz6NH55qY1y2xyF8/pZEhc0XXdpvZtQQBLGdROhXCbxhBVye8GmTpgcg==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-sdk/credential-provider-env': 3.398.0
-      '@aws-sdk/credential-provider-process': 3.398.0
-      '@aws-sdk/credential-provider-sso': 3.398.0
+      '@aws-sdk/credential-provider-process': 3.405.0
+      '@aws-sdk/credential-provider-sso': 3.405.0
       '@aws-sdk/credential-provider-web-identity': 3.398.0
       '@aws-sdk/types': 3.398.0
-      '@smithy/credential-provider-imds': 2.0.5
-      '@smithy/property-provider': 2.0.5
-      '@smithy/shared-ini-file-loader': 2.0.5
+      '@smithy/credential-provider-imds': 2.0.7
+      '@smithy/property-provider': 2.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
     transitivePeerDependencies:
       - aws-crt
 
-  /@aws-sdk/credential-provider-node@3.398.0:
-    resolution: {integrity: sha512-odmI/DSKfuWUYeDnGTCEHBbC8/MwnF6yEq874zl6+owoVv0ZsYP8qBHfiJkYqrwg7wQ7Pi40sSAPC1rhesGwzg==}
+  /@aws-sdk/credential-provider-ini@3.421.0:
+    resolution: {integrity: sha512-J5yH/gkpAk6FMeH5F9u5Nr6oG+97tj1kkn5q49g3XMbtWw7GiynadxdtoRBCeIg1C7o2LOQx4B1AnhNhIw1z/g==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/credential-provider-env': 3.418.0
+      '@aws-sdk/credential-provider-process': 3.418.0
+      '@aws-sdk/credential-provider-sso': 3.421.0
+      '@aws-sdk/credential-provider-web-identity': 3.418.0
+      '@aws-sdk/types': 3.418.0
+      '@smithy/credential-provider-imds': 2.0.7
+      '@smithy/property-provider': 2.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    transitivePeerDependencies:
+      - aws-crt
+    dev: false
+
+  /@aws-sdk/credential-provider-node@3.405.0:
+    resolution: {integrity: sha512-AMmRP09nwYsft0MXDlHIxMQe7IloWW8As0lbZmPrG7Y7mK5RDmCIwD2yMDz77Zqlv09FsYt+9+cOK2fTNhim+Q==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-sdk/credential-provider-env': 3.398.0
-      '@aws-sdk/credential-provider-ini': 3.398.0
-      '@aws-sdk/credential-provider-process': 3.398.0
-      '@aws-sdk/credential-provider-sso': 3.398.0
+      '@aws-sdk/credential-provider-ini': 3.405.0
+      '@aws-sdk/credential-provider-process': 3.405.0
+      '@aws-sdk/credential-provider-sso': 3.405.0
       '@aws-sdk/credential-provider-web-identity': 3.398.0
       '@aws-sdk/types': 3.398.0
-      '@smithy/credential-provider-imds': 2.0.5
-      '@smithy/property-provider': 2.0.5
-      '@smithy/shared-ini-file-loader': 2.0.5
+      '@smithy/credential-provider-imds': 2.0.7
+      '@smithy/property-provider': 2.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
     transitivePeerDependencies:
       - aws-crt
 
-  /@aws-sdk/credential-provider-process@3.398.0:
-    resolution: {integrity: sha512-WrkBL1W7TXN508PA9wRXPFtzmGpVSW98gDaHEaa8GolAPHMPa5t2QcC/z/cFpglzrcVv8SA277zu9Z8tELdZhg==}
+  /@aws-sdk/credential-provider-node@3.421.0:
+    resolution: {integrity: sha512-g1dvdvfDj0u8B/gOsHR3o1arP4O4QE/dFm2IJBYr/eUdKISMUgbQULWtg4zdtAf0Oz4xN0723i7fpXAF1gTnRA==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/credential-provider-env': 3.418.0
+      '@aws-sdk/credential-provider-ini': 3.421.0
+      '@aws-sdk/credential-provider-process': 3.418.0
+      '@aws-sdk/credential-provider-sso': 3.421.0
+      '@aws-sdk/credential-provider-web-identity': 3.418.0
+      '@aws-sdk/types': 3.418.0
+      '@smithy/credential-provider-imds': 2.0.7
+      '@smithy/property-provider': 2.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    transitivePeerDependencies:
+      - aws-crt
+    dev: false
+
+  /@aws-sdk/credential-provider-process@3.405.0:
+    resolution: {integrity: sha512-EqAMcUVeZAICYHHL8x5Fi5CYPgCo9UCE7ScWmU5Sa2wAFY4XLyQ1mMxX3lKGYx9lBxWk3dqnhmvlcqdzN7AjyQ==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-sdk/types': 3.398.0
-      '@smithy/property-provider': 2.0.5
-      '@smithy/shared-ini-file-loader': 2.0.5
+      '@smithy/property-provider': 2.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
-  /@aws-sdk/credential-provider-sso@3.398.0:
-    resolution: {integrity: sha512-2Dl35587xbnzR/GGZqA2MnFs8+kS4wbHQO9BioU0okA+8NRueohNMdrdQmQDdSNK4BfIpFspiZmFkXFNyEAfgw==}
+  /@aws-sdk/credential-provider-process@3.418.0:
+    resolution: {integrity: sha512-xPbdm2WKz1oH6pTkrJoUmr3OLuqvvcPYTQX0IIlc31tmDwDWPQjXGGFD/vwZGIZIkKaFpFxVMgAzfFScxox7dw==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@smithy/property-provider': 2.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
+  /@aws-sdk/credential-provider-sso@3.405.0:
+    resolution: {integrity: sha512-fXqSgQHz7qcmIWMVguwSMSjqFkVfN2+XiNgiskcmeYiCS7mIGAgUnKABZc9Ds2+YW9ATYiY0BOD5aWxc8TX5fA==}
     engines: {node: '>=14.0.0'}
     dependencies:
-      '@aws-sdk/client-sso': 3.398.0
-      '@aws-sdk/token-providers': 3.398.0
+      '@aws-sdk/client-sso': 3.405.0
+      '@aws-sdk/token-providers': 3.405.0
       '@aws-sdk/types': 3.398.0
-      '@smithy/property-provider': 2.0.5
-      '@smithy/shared-ini-file-loader': 2.0.5
+      '@smithy/property-provider': 2.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
     transitivePeerDependencies:
       - aws-crt
 
+  /@aws-sdk/credential-provider-sso@3.421.0:
+    resolution: {integrity: sha512-f8T3L5rhImL6T6RTSvbOxaWw9k2fDOT2DZbNjcPz9ITWmwXj2NNbdHGWuRi3dv2HoY/nW2IJdNxnhdhbn6Fc1A==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/client-sso': 3.421.0
+      '@aws-sdk/token-providers': 3.418.0
+      '@aws-sdk/types': 3.418.0
+      '@smithy/property-provider': 2.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    transitivePeerDependencies:
+      - aws-crt
+    dev: false
+
   /@aws-sdk/credential-provider-web-identity@3.398.0:
     resolution: {integrity: sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-sdk/types': 3.398.0
-      '@smithy/property-provider': 2.0.5
+      '@smithy/property-provider': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
-  /@aws-sdk/credential-providers@3.398.0:
-    resolution: {integrity: sha512-355vXmImn2e85mIWSYDVb101AF2lIVHKNCaH6sV1U/8i0ZOXh2cJYNdkRYrxNt1ezDB0k97lSKvuDx7RDvJyRg==}
+  /@aws-sdk/credential-provider-web-identity@3.418.0:
+    resolution: {integrity: sha512-do7ang565n9p3dS1JdsQY01rUfRx8vkxQqz5M8OlcEHBNiCdi2PvSjNwcBdrv/FKkyIxZb0TImOfBSt40hVdxQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@smithy/property-provider': 2.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
+  /@aws-sdk/credential-providers@3.405.0:
+    resolution: {integrity: sha512-332QZ2Wrr5gfFUGPLwITcjhxnBD4y94fxKg7qerSBq7fjjIkl/OjnchZf5ReePrjpglxs6hgLdGrPYIYPC4Hhw==}
     engines: {node: '>=14.0.0'}
     dependencies:
-      '@aws-sdk/client-cognito-identity': 3.398.0
-      '@aws-sdk/client-sso': 3.398.0
-      '@aws-sdk/client-sts': 3.398.0
-      '@aws-sdk/credential-provider-cognito-identity': 3.398.0
+      '@aws-sdk/client-cognito-identity': 3.405.0
+      '@aws-sdk/client-sso': 3.405.0
+      '@aws-sdk/client-sts': 3.405.0
+      '@aws-sdk/credential-provider-cognito-identity': 3.405.0
       '@aws-sdk/credential-provider-env': 3.398.0
-      '@aws-sdk/credential-provider-ini': 3.398.0
-      '@aws-sdk/credential-provider-node': 3.398.0
-      '@aws-sdk/credential-provider-process': 3.398.0
-      '@aws-sdk/credential-provider-sso': 3.398.0
+      '@aws-sdk/credential-provider-ini': 3.405.0
+      '@aws-sdk/credential-provider-node': 3.405.0
+      '@aws-sdk/credential-provider-process': 3.405.0
+      '@aws-sdk/credential-provider-sso': 3.405.0
       '@aws-sdk/credential-provider-web-identity': 3.398.0
       '@aws-sdk/types': 3.398.0
-      '@smithy/credential-provider-imds': 2.0.5
-      '@smithy/property-provider': 2.0.5
+      '@smithy/credential-provider-imds': 2.0.7
+      '@smithy/property-provider': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
     transitivePeerDependencies:
@@ -1430,8 +1602,8 @@ packages:
       tslib: 2.6.2
     dev: false
 
-  /@aws-sdk/middleware-bucket-endpoint@3.398.0:
-    resolution: {integrity: sha512-+iDHiRofK/vIY94RWAXkSnR4rBPzc2dPHmLp+FDKywq1y708H9W7TOT37dpn+KSFeO4k2FfddFjzWBHsaeakCA==}
+  /@aws-sdk/middleware-bucket-endpoint@3.405.0:
+    resolution: {integrity: sha512-wKmHZi44NkbaGXXbMwassUm06/wDtSYucPbM4paU2cMbBUOnwFpndHWlrRYCNmj5Ty5A2HjdkGlhgla8nifHzQ==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-sdk/types': 3.398.0
@@ -1441,14 +1613,15 @@ packages:
       '@smithy/util-config-provider': 2.0.0
       tslib: 2.6.2
 
-  /@aws-sdk/middleware-endpoint-discovery@3.398.0:
-    resolution: {integrity: sha512-Gf5HPhgCbTwPkoYlp50DnQRATljaTW3S9og7E+PrIIXdsTPGeZrlVFausreFhTXy3UOVP/3iGG3ajBQl84yNtw==}
+  /@aws-sdk/middleware-endpoint-discovery@3.418.0:
+    resolution: {integrity: sha512-KRhvFQDzTrayXzswx6KhS+oBDH0NoDT+vERCqvFsGvus+/HhVGACVxINuOJ+b6mqdUPfipSD4Bje3XYunqxbSw==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-sdk/endpoint-cache': 3.310.0
-      '@aws-sdk/types': 3.398.0
-      '@smithy/protocol-http': 2.0.5
-      '@smithy/types': 2.2.2
+      '@aws-sdk/types': 3.418.0
+      '@smithy/node-config-provider': 2.0.13
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/types': 2.3.4
       tslib: 2.6.2
     dev: false
 
@@ -1483,6 +1656,16 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@aws-sdk/middleware-host-header@3.418.0:
+    resolution: {integrity: sha512-LrMTdzalkPw/1ujLCKPLwCGvPMCmT4P+vOZQRbSEVZPnlZk+Aj++aL/RaHou0jL4kJH3zl8iQepriBt4a7UvXQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@aws-sdk/middleware-location-constraint@3.398.0:
     resolution: {integrity: sha512-it+olJf1Lf2bmH8OL/N1jMOFB0zEVYs4rIzgFrluTRCuPatRuDi4LsXS8zqYxkBa05JE8JmqwW5gCzAmWyLLqw==}
     engines: {node: '>=14.0.0'}
@@ -1499,6 +1682,15 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@aws-sdk/middleware-logger@3.418.0:
+    resolution: {integrity: sha512-StKGmyPVfoO/wdNTtKemYwoJsqIl4l7oqarQY7VSf2Mp3mqaa+njLViHsQbirYpyqpgUEusOnuTlH5utxJ1NsQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@aws-sdk/middleware-recursion-detection@3.398.0:
     resolution: {integrity: sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==}
     engines: {node: '>=14.0.0'}
@@ -1508,6 +1700,16 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@aws-sdk/middleware-recursion-detection@3.418.0:
+    resolution: {integrity: sha512-kKFrIQglBLUFPbHSDy1+bbe3Na2Kd70JSUC3QLMbUHmqipXN8KeXRfAj7vTv97zXl0WzG0buV++WcNwOm1rFjg==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@aws-sdk/middleware-retry@3.374.0:
     resolution: {integrity: sha512-ZnT84qnT+Zmelv7y6hAqgAEaZgpGlrvf/+rchNWT0oG4duxI5bLWcRi9U88Jz7G8JgNQcGKJqPfC6oogCd7p8w==}
     engines: {node: '>=14.0.0'}
@@ -1548,18 +1750,41 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@aws-sdk/middleware-sdk-sts@3.418.0:
+    resolution: {integrity: sha512-cW8ijrCTP+mgihvcq4+TbhAcE/we5lFl4ydRqvTdtcSnYQAVQADg47rnTScQiFsPFEB3NKq7BGeyTJF9MKolPA==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/middleware-signing': 3.418.0
+      '@aws-sdk/types': 3.418.0
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@aws-sdk/middleware-signing@3.398.0:
     resolution: {integrity: sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-sdk/types': 3.398.0
-      '@smithy/property-provider': 2.0.5
+      '@smithy/property-provider': 2.0.6
       '@smithy/protocol-http': 2.0.5
       '@smithy/signature-v4': 2.0.5
       '@smithy/types': 2.2.2
       '@smithy/util-middleware': 2.0.0
       tslib: 2.6.2
 
+  /@aws-sdk/middleware-signing@3.418.0:
+    resolution: {integrity: sha512-onvs5KoYQE8OlOE740RxWBGtsUyVIgAo0CzRKOQO63ZEYqpL1Os+MS1CGzdNhvQnJgJruE1WW+Ix8fjN30zKPA==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@smithy/property-provider': 2.0.6
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/signature-v4': 2.0.5
+      '@smithy/types': 2.3.4
+      '@smithy/util-middleware': 2.0.3
+      tslib: 2.6.2
+    dev: false
+
   /@aws-sdk/middleware-ssec@3.398.0:
     resolution: {integrity: sha512-QtKr/hPcRugKSIZAH4+7hbUfdW7Lg+OQvD25nJn7ic1JHRZ+eDctEFxdsmnt68lE6aZxOcHCWHAW6/umcA93Dw==}
     engines: {node: '>=14.0.0'}
@@ -1578,6 +1803,28 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@aws-sdk/middleware-user-agent@3.418.0:
+    resolution: {integrity: sha512-Jdcztg9Tal9SEAL0dKRrnpKrm6LFlWmAhvuwv0dQ7bNTJxIxyEFbpqdgy7mpQHsLVZgq1Aad/7gT/72c9igyZw==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@aws-sdk/util-endpoints': 3.418.0
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
+  /@aws-sdk/region-config-resolver@3.418.0:
+    resolution: {integrity: sha512-lJRZ/9TjZU6yLz+mAwxJkcJZ6BmyYoIJVo1p5+BN//EFdEmC8/c0c9gXMRzfISV/mqWSttdtccpAyN4/goHTYA==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@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.6.2
+    dev: false
+
   /@aws-sdk/signature-v4-crt@3.398.0:
     resolution: {integrity: sha512-HAkVfsch52Kvjod2TRIH5oUIW03yFHsdOBMKg/ayZkV+WsxiJaKomErF8YgIVRBfQ24JZs1QCA+F046YpR8JAw==}
     engines: {node: '>=14.0.0'}
@@ -1618,8 +1865,8 @@ packages:
       tslib: 2.6.2
     dev: true
 
-  /@aws-sdk/token-providers@3.398.0:
-    resolution: {integrity: sha512-nrYgjzavGCKJL/48Vt0EL+OlIc5UZLfNGpgyUW9cv3XZwl+kXV0QB+HH0rHZZLfpbBgZ2RBIJR9uD5ieu/6hpQ==}
+  /@aws-sdk/token-providers@3.405.0:
+    resolution: {integrity: sha512-rVzC7ptf7TlV84M9w+Ds9isio1EY7bs1MRFv/6lmYstsyTri+DaZG10TwXSGfzIMwB0yVh11niCxO9wSjQ36zg==}
     engines: {node: '>=14.0.0'}
     dependencies:
       '@aws-crypto/sha256-browser': 3.0.0
@@ -1631,7 +1878,7 @@ packages:
       '@aws-sdk/types': 3.398.0
       '@aws-sdk/util-endpoints': 3.398.0
       '@aws-sdk/util-user-agent-browser': 3.398.0
-      '@aws-sdk/util-user-agent-node': 3.398.0
+      '@aws-sdk/util-user-agent-node': 3.405.0
       '@smithy/config-resolver': 2.0.5
       '@smithy/fetch-http-handler': 2.0.5
       '@smithy/hash-node': 2.0.5
@@ -1641,25 +1888,68 @@ packages:
       '@smithy/middleware-retry': 2.0.5
       '@smithy/middleware-serde': 2.0.5
       '@smithy/middleware-stack': 2.0.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/node-http-handler': 2.0.5
-      '@smithy/property-provider': 2.0.5
+      '@smithy/property-provider': 2.0.6
       '@smithy/protocol-http': 2.0.5
-      '@smithy/shared-ini-file-loader': 2.0.5
+      '@smithy/shared-ini-file-loader': 2.0.6
       '@smithy/smithy-client': 2.0.5
       '@smithy/types': 2.2.2
       '@smithy/url-parser': 2.0.5
       '@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.5
-      '@smithy/util-defaults-mode-node': 2.0.5
+      '@smithy/util-defaults-mode-browser': 2.0.6
+      '@smithy/util-defaults-mode-node': 2.0.7
       '@smithy/util-retry': 2.0.0
       '@smithy/util-utf8': 2.0.0
       tslib: 2.6.2
     transitivePeerDependencies:
       - aws-crt
 
+  /@aws-sdk/token-providers@3.418.0:
+    resolution: {integrity: sha512-9P7Q0VN0hEzTngy3Sz5eya2qEOEf0Q8qf1vB3um0gE6ID6EVAdz/nc/DztfN32MFxk8FeVBrCP5vWdoOzmd72g==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-crypto/sha256-browser': 3.0.0
+      '@aws-crypto/sha256-js': 3.0.0
+      '@aws-sdk/middleware-host-header': 3.418.0
+      '@aws-sdk/middleware-logger': 3.418.0
+      '@aws-sdk/middleware-recursion-detection': 3.418.0
+      '@aws-sdk/middleware-user-agent': 3.418.0
+      '@aws-sdk/types': 3.418.0
+      '@aws-sdk/util-endpoints': 3.418.0
+      '@aws-sdk/util-user-agent-browser': 3.418.0
+      '@aws-sdk/util-user-agent-node': 3.418.0
+      '@smithy/config-resolver': 2.0.11
+      '@smithy/fetch-http-handler': 2.2.0
+      '@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.6
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
+      '@smithy/smithy-client': 2.1.8
+      '@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.12
+      '@smithy/util-defaults-mode-node': 2.0.14
+      '@smithy/util-retry': 2.0.3
+      '@smithy/util-utf8': 2.0.0
+      tslib: 2.6.2
+    transitivePeerDependencies:
+      - aws-crt
+    dev: false
+
   /@aws-sdk/types@3.398.0:
     resolution: {integrity: sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==}
     engines: {node: '>=14.0.0'}
@@ -1667,6 +1957,13 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@aws-sdk/types@3.418.0:
+    resolution: {integrity: sha512-y4PQSH+ulfFLY0+FYkaK4qbIaQI9IJNMO2xsxukW6/aNoApNymN1D2FSi2la8Qbp/iPjNDKsG8suNPm9NtsWXQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+
   /@aws-sdk/util-arn-parser@3.310.0:
     resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==}
     engines: {node: '>=14.0.0'}
@@ -1680,6 +1977,14 @@ packages:
       '@aws-sdk/types': 3.398.0
       tslib: 2.6.2
 
+  /@aws-sdk/util-endpoints@3.418.0:
+    resolution: {integrity: sha512-sYSDwRTl7yE7LhHkPzemGzmIXFVHSsi3AQ1KeNEk84eBqxMHHcCc2kqklaBk2roXWe50QDgRMy1ikZUxvtzNHQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      tslib: 2.6.2
+    dev: false
+
   /@aws-sdk/util-locate-window@3.310.0:
     resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==}
     engines: {node: '>=14.0.0'}
@@ -1694,8 +1999,17 @@ packages:
       bowser: 2.11.0
       tslib: 2.6.2
 
-  /@aws-sdk/util-user-agent-node@3.398.0:
-    resolution: {integrity: sha512-RTVQofdj961ej4//fEkppFf4KXqKGMTCqJYghx3G0C/MYXbg7MGl7LjfNGtJcboRE8pfHHQ/TUWBDA7RIAPPlQ==}
+  /@aws-sdk/util-user-agent-browser@3.418.0:
+    resolution: {integrity: sha512-c4p4mc0VV/jIeNH0lsXzhJ1MpWRLuboGtNEpqE4s1Vl9ck2amv9VdUUZUmHbg+bVxlMgRQ4nmiovA4qIrqGuyg==}
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@smithy/types': 2.3.4
+      bowser: 2.11.0
+      tslib: 2.6.2
+    dev: false
+
+  /@aws-sdk/util-user-agent-node@3.405.0:
+    resolution: {integrity: sha512-6Ssld7aalKCnW6lSGfiiWpqwo2L+AmYq2oV3P9yYAo9ZL+Q78dXquabwj3uq3plJ4l2xE4Gfcf2FJ/1PZpqDvQ==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
       aws-crt: '>=1.0.0'
@@ -1704,10 +2018,25 @@ packages:
         optional: true
     dependencies:
       '@aws-sdk/types': 3.398.0
-      '@smithy/node-config-provider': 2.0.5
+      '@smithy/node-config-provider': 2.0.7
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@aws-sdk/util-user-agent-node@3.418.0:
+    resolution: {integrity: sha512-BXMskXFtg+dmzSCgmnWOffokxIbPr1lFqa1D9kvM3l3IFRiFGx2IyDg+8MAhq11aPDLvoa/BDuQ0Yqma5izOhg==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      aws-crt: '>=1.0.0'
+    peerDependenciesMeta:
+      aws-crt:
+        optional: true
+    dependencies:
+      '@aws-sdk/types': 3.418.0
+      '@smithy/node-config-provider': 2.0.13
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@aws-sdk/util-utf8-browser@3.259.0:
     resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==}
     dependencies:
@@ -2154,14 +2483,14 @@ packages:
       tslib: 2.6.2
     dev: true
 
-  /@esbuild-plugins/node-resolve@0.2.2(esbuild@0.18.20):
+  /@esbuild-plugins/node-resolve@0.2.2(esbuild@0.19.2):
     resolution: {integrity: sha512-+t5FdX3ATQlb53UFDBRb4nqjYBz492bIrnVWvpQHpzZlu9BQL5HasMZhqc409ygUwOWCXZhrWr6NyZ6T6Y+cxw==}
     peerDependencies:
       esbuild: '*'
     dependencies:
       '@types/resolve': 1.20.2
       debug: 4.3.4
-      esbuild: 0.18.20
+      esbuild: 0.19.2
       escape-string-regexp: 4.0.0
       resolve: 1.22.4
     transitivePeerDependencies:
@@ -2192,6 +2521,16 @@ packages:
     cpu: [arm64]
     os: [android]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm64@0.19.2:
+    resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/android-arm@0.16.13:
@@ -2218,6 +2557,16 @@ packages:
     cpu: [arm]
     os: [android]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm@0.19.2:
+    resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/android-x64@0.16.13:
@@ -2244,6 +2593,16 @@ packages:
     cpu: [x64]
     os: [android]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64@0.19.2:
+    resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/darwin-arm64@0.16.13:
@@ -2270,6 +2629,16 @@ packages:
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64@0.19.2:
+    resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/darwin-x64@0.16.13:
@@ -2296,6 +2665,16 @@ packages:
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64@0.19.2:
+    resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/freebsd-arm64@0.16.13:
@@ -2322,6 +2701,16 @@ packages:
     cpu: [arm64]
     os: [freebsd]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64@0.19.2:
+    resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/freebsd-x64@0.16.13:
@@ -2348,6 +2737,16 @@ packages:
     cpu: [x64]
     os: [freebsd]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64@0.19.2:
+    resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/linux-arm64@0.16.13:
@@ -2374,6 +2773,16 @@ packages:
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64@0.19.2:
+    resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/linux-arm@0.16.13:
@@ -2400,6 +2809,16 @@ packages:
     cpu: [arm]
     os: [linux]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm@0.19.2:
+    resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/linux-ia32@0.16.13:
@@ -2426,6 +2845,16 @@ packages:
     cpu: [ia32]
     os: [linux]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32@0.19.2:
+    resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/linux-loong64@0.16.13:
@@ -2452,6 +2881,16 @@ packages:
     cpu: [loong64]
     os: [linux]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64@0.19.2:
+    resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/linux-mips64el@0.16.13:
@@ -2478,6 +2917,16 @@ packages:
     cpu: [mips64el]
     os: [linux]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-mips64el@0.19.2:
+    resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/linux-ppc64@0.16.13:
@@ -2504,6 +2953,16 @@ packages:
     cpu: [ppc64]
     os: [linux]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64@0.19.2:
+    resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/linux-riscv64@0.16.13:
@@ -2530,6 +2989,16 @@ packages:
     cpu: [riscv64]
     os: [linux]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64@0.19.2:
+    resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/linux-s390x@0.16.13:
@@ -2556,6 +3025,16 @@ packages:
     cpu: [s390x]
     os: [linux]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x@0.19.2:
+    resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/linux-x64@0.16.13:
@@ -2582,6 +3061,16 @@ packages:
     cpu: [x64]
     os: [linux]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64@0.19.2:
+    resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/netbsd-x64@0.16.13:
@@ -2608,6 +3097,16 @@ packages:
     cpu: [x64]
     os: [netbsd]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64@0.19.2:
+    resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/openbsd-x64@0.16.13:
@@ -2634,6 +3133,16 @@ packages:
     cpu: [x64]
     os: [openbsd]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64@0.19.2:
+    resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/sunos-x64@0.16.13:
@@ -2660,6 +3169,16 @@ packages:
     cpu: [x64]
     os: [sunos]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64@0.19.2:
+    resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/win32-arm64@0.16.13:
@@ -2686,6 +3205,16 @@ packages:
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64@0.19.2:
+    resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/win32-ia32@0.16.13:
@@ -2712,6 +3241,16 @@ packages:
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.19.2:
+    resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@esbuild/win32-x64@0.16.13:
@@ -2738,6 +3277,16 @@ packages:
     cpu: [x64]
     os: [win32]
     requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64@0.19.2:
+    resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: false
     optional: true
 
   /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0):
@@ -2996,8 +3545,8 @@ packages:
     resolution: {integrity: sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==}
     dev: false
 
-  /@next/env@13.4.19:
-    resolution: {integrity: sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==}
+  /@next/env@13.5.3:
+    resolution: {integrity: sha512-X4te86vsbjsB7iO4usY9jLPtZ827Mbx+WcwNBGUOIuswuTAKQtzsuoxc/6KLxCMvogKG795MhrR1LDhYgDvasg==}
     dev: false
 
   /@next/eslint-plugin-next@13.4.19:
@@ -3015,8 +3564,8 @@ packages:
     dev: false
     optional: true
 
-  /@next/swc-darwin-arm64@13.4.19:
-    resolution: {integrity: sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==}
+  /@next/swc-darwin-arm64@13.5.3:
+    resolution: {integrity: sha512-6hiYNJxJmyYvvKGrVThzo4nTcqvqUTA/JvKim7Auaj33NexDqSNwN5YrrQu+QhZJCIpv2tULSHt+lf+rUflLSw==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [darwin]
@@ -3033,8 +3582,8 @@ packages:
     dev: false
     optional: true
 
-  /@next/swc-darwin-x64@13.4.19:
-    resolution: {integrity: sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==}
+  /@next/swc-darwin-x64@13.5.3:
+    resolution: {integrity: sha512-UpBKxu2ob9scbpJyEq/xPgpdrgBgN3aLYlxyGqlYX5/KnwpJpFuIHU2lx8upQQ7L+MEmz+fA1XSgesoK92ppwQ==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [darwin]
@@ -3051,8 +3600,8 @@ packages:
     dev: false
     optional: true
 
-  /@next/swc-linux-arm64-gnu@13.4.19:
-    resolution: {integrity: sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==}
+  /@next/swc-linux-arm64-gnu@13.5.3:
+    resolution: {integrity: sha512-5AzM7Yx1Ky+oLY6pHs7tjONTF22JirDPd5Jw/3/NazJ73uGB05NqhGhB4SbeCchg7SlVYVBeRMrMSZwJwq/xoA==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
@@ -3069,8 +3618,8 @@ packages:
     dev: false
     optional: true
 
-  /@next/swc-linux-arm64-musl@13.4.19:
-    resolution: {integrity: sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==}
+  /@next/swc-linux-arm64-musl@13.5.3:
+    resolution: {integrity: sha512-A/C1shbyUhj7wRtokmn73eBksjTM7fFQoY2v/0rTM5wehpkjQRLOXI8WJsag2uLhnZ4ii5OzR1rFPwoD9cvOgA==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
@@ -3087,8 +3636,8 @@ packages:
     dev: false
     optional: true
 
-  /@next/swc-linux-x64-gnu@13.4.19:
-    resolution: {integrity: sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==}
+  /@next/swc-linux-x64-gnu@13.5.3:
+    resolution: {integrity: sha512-FubPuw/Boz8tKkk+5eOuDHOpk36F80rbgxlx4+xty/U71e3wZZxVYHfZXmf0IRToBn1Crb8WvLM9OYj/Ur815g==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
@@ -3105,8 +3654,8 @@ packages:
     dev: false
     optional: true
 
-  /@next/swc-linux-x64-musl@13.4.19:
-    resolution: {integrity: sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==}
+  /@next/swc-linux-x64-musl@13.5.3:
+    resolution: {integrity: sha512-DPw8nFuM1uEpbX47tM3wiXIR0Qa+atSzs9Q3peY1urkhofx44o7E1svnq+a5Q0r8lAcssLrwiM+OyJJgV/oj7g==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
@@ -3123,8 +3672,8 @@ packages:
     dev: false
     optional: true
 
-  /@next/swc-win32-arm64-msvc@13.4.19:
-    resolution: {integrity: sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==}
+  /@next/swc-win32-arm64-msvc@13.5.3:
+    resolution: {integrity: sha512-zBPSP8cHL51Gub/YV8UUePW7AVGukp2D8JU93IHbVDu2qmhFAn9LWXiOOLKplZQKxnIPUkJTQAJDCWBWU4UWUA==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [win32]
@@ -3141,8 +3690,8 @@ packages:
     dev: false
     optional: true
 
-  /@next/swc-win32-ia32-msvc@13.4.19:
-    resolution: {integrity: sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==}
+  /@next/swc-win32-ia32-msvc@13.5.3:
+    resolution: {integrity: sha512-ONcL/lYyGUj4W37D4I2I450SZtSenmFAvapkJQNIJhrPMhzDU/AdfLkW98NvH1D2+7FXwe7yclf3+B7v28uzBQ==}
     engines: {node: '>= 10'}
     cpu: [ia32]
     os: [win32]
@@ -3159,8 +3708,8 @@ packages:
     dev: false
     optional: true
 
-  /@next/swc-win32-x64-msvc@13.4.19:
-    resolution: {integrity: sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==}
+  /@next/swc-win32-x64-msvc@13.5.3:
+    resolution: {integrity: sha512-2Vz2tYWaLqJvLcWbbTlJ5k9AN6JD7a5CN2pAeIzpbecK8ZF/yobA39cXtv6e+Z8c5UJuVOmaTldEAIxvsIux/Q==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [win32]
@@ -3325,6 +3874,14 @@ packages:
       tslib: 2.6.2
     dev: true
 
+  /@smithy/abort-controller@2.0.10:
+    resolution: {integrity: sha512-xn7PnFD3m4rQIG00h1lPuDVnC2QMtTFhzRLX3y56KkgFaCysS7vpNevNBgmNUtmJ4eVFc+66Zucwo2KDLdicOg==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/abort-controller@2.0.5:
     resolution: {integrity: sha512-byVZ2KWLMPYAZGKjRpniAzLcygJO4ruClZKdJTuB0eCB76ONFTdptBHlviHpAZXknRz7skYWPfcgO9v30A1SyA==}
     engines: {node: '>=14.0.0'}
@@ -3353,6 +3910,17 @@ packages:
       tslib: 2.6.2
     dev: true
 
+  /@smithy/config-resolver@2.0.11:
+    resolution: {integrity: sha512-q97FnlUmbai1c4JlQJgLVBsvSxgV/7Nvg/JK76E1nRq/U5UM56Eqo3dn2fY7JibqgJLg4LPsGdwtIyqyOk35CQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@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.6.2
+    dev: false
+
   /@smithy/config-resolver@2.0.5:
     resolution: {integrity: sha512-n0c2AXz+kjALY2FQr7Zy9zhYigXzboIh1AuUUVCqFBKFtdEvTwnwPXrTDoEehLiRTUHNL+4yzZ3s+D0kKYSLSg==}
     engines: {node: '>=14.0.0'}
@@ -3362,21 +3930,32 @@ packages:
       '@smithy/util-middleware': 2.0.0
       tslib: 2.6.2
 
-  /@smithy/credential-provider-imds@2.0.5:
-    resolution: {integrity: sha512-KFcf/e0meFkQNyteJ65f1G19sgUEY1e5zL7hyAEUPz2SEfBmC9B37WyRq87G3MEEsvmAWwCRu7nFFYUKtR3svQ==}
+  /@smithy/credential-provider-imds@2.0.13:
+    resolution: {integrity: sha512-/xe3wNoC4j+BeTemH9t2gSKLBfyZmk8LXB2pQm/TOEYi+QhBgT+PSolNDfNAhrR68eggNE17uOimsrnwSkCt4w==}
     engines: {node: '>=14.0.0'}
     dependencies:
-      '@smithy/node-config-provider': 2.0.5
-      '@smithy/property-provider': 2.0.5
-      '@smithy/types': 2.2.2
-      '@smithy/url-parser': 2.0.5
+      '@smithy/node-config-provider': 2.0.13
+      '@smithy/property-provider': 2.0.11
+      '@smithy/types': 2.3.4
+      '@smithy/url-parser': 2.0.10
+      tslib: 2.6.2
+    dev: false
+
+  /@smithy/credential-provider-imds@2.0.7:
+    resolution: {integrity: sha512-XivkZj/pipzpQPxgleE1odwJQ6oDsVViB4VUO/HRDI4EdEfZjud44USupOUOa/xOjS39/75DYB4zgTbyV+totw==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/node-config-provider': 2.0.13
+      '@smithy/property-provider': 2.0.6
+      '@smithy/types': 2.3.4
+      '@smithy/url-parser': 2.0.10
       tslib: 2.6.2
 
   /@smithy/eventstream-codec@2.0.5:
     resolution: {integrity: sha512-iqR6OuOV3zbQK8uVs9o+9AxhVk8kW9NAxA71nugwUB+kTY9C35pUd0A5/m4PRT0Y0oIW7W4kgnSR3fdYXQjECw==}
     dependencies:
       '@aws-crypto/crc32': 3.0.0
-      '@smithy/types': 2.2.2
+      '@smithy/types': 2.3.4
       '@smithy/util-hex-encoding': 2.0.0
       tslib: 2.6.2
 
@@ -3430,6 +4009,16 @@ packages:
       '@smithy/util-base64': 2.0.0
       tslib: 2.6.2
 
+  /@smithy/fetch-http-handler@2.2.0:
+    resolution: {integrity: sha512-P2808PM0CsEkXj3rnQAi3QyqRbAAi8iuePYUB5GveJ+dVd1WMv03NM+CYCI14IGXt1j/r7jHGvMJHO+Gv+kdMQ==}
+    dependencies:
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/querystring-builder': 2.0.10
+      '@smithy/types': 2.3.4
+      '@smithy/util-base64': 2.0.0
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/hash-blob-browser@2.0.5:
     resolution: {integrity: sha512-ZVAUBtJXGf9bEko4/RwWcTK6d3b/ZmQMxJMrxOOcQhVDiqny9zI0mzgstO4Oxz3135R7S3V/bbGw3w3woCYpQg==}
     dependencies:
@@ -3438,6 +4027,16 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@smithy/hash-node@2.0.10:
+    resolution: {integrity: sha512-jSTf6uzPk/Vf+8aQ7tVXeHfjxe9wRXSCqIZcBymSDTf7/YrVxniBdpyN74iI8ZUOx/Pyagc81OK5FROLaEjbXQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      '@smithy/util-buffer-from': 2.0.0
+      '@smithy/util-utf8': 2.0.0
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/hash-node@2.0.5:
     resolution: {integrity: sha512-mk551hIywBITT+kXruRNXk7f8Fy7DTzBjZJSr/V6nolYKmUHIG3w5QU6nO9qPYEQGKc/yEPtkpdS28ndeG93lA==}
     engines: {node: '>=14.0.0'}
@@ -3455,6 +4054,13 @@ packages:
       '@smithy/util-utf8': 2.0.0
       tslib: 2.6.2
 
+  /@smithy/invalid-dependency@2.0.10:
+    resolution: {integrity: sha512-zw9p/zsmJ2cFcW4KMz3CJoznlbRvEA6HG2mvEaX5eAca5dq4VGI2MwPDTfmteC/GsnURS4ogoMQ0p6aHM2SDVQ==}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/invalid-dependency@2.0.5:
     resolution: {integrity: sha512-0wEi+JT0hM+UUwrJVYbqjuGFhy5agY/zXyiN7BNAJ1XoCDjU5uaNSj8ekPWsXd/d4yM6NSe8UbPd8cOc1+3oBQ==}
     dependencies:
@@ -3481,6 +4087,15 @@ packages:
       '@smithy/util-utf8': 2.0.0
       tslib: 2.6.2
 
+  /@smithy/middleware-content-length@2.0.12:
+    resolution: {integrity: sha512-QRhJTo5TjG7oF7np6yY4ZO9GDKFVzU/GtcqUqyEa96bLHE3yZHgNmsolOQ97pfxPHmFhH4vDP//PdpAIN3uI1Q==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/middleware-content-length@2.0.5:
     resolution: {integrity: sha512-E7VwV5H02fgZIUGRli4GevBCAPvkyEI/fgl9SU47nPPi3DAAX3nEtUb8xfGbXjOcJ5BdSUoWWZn42tEd/blOqA==}
     engines: {node: '>=14.0.0'}
@@ -3489,6 +4104,17 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@smithy/middleware-endpoint@2.0.10:
+    resolution: {integrity: sha512-O6m4puZc16xfenotZUHL4bRlMrwf4gTp+0I5l954M5KNd3dOK18P+FA/IIUgnXF/dX6hlCUcJkBp7nAzwrePKA==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/middleware-serde': 2.0.10
+      '@smithy/types': 2.3.4
+      '@smithy/url-parser': 2.0.10
+      '@smithy/util-middleware': 2.0.3
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/middleware-endpoint@2.0.5:
     resolution: {integrity: sha512-tyzDuoNTbsMQCq5Xkc4QOt6e2GACUllQIV8SQ5fc59FtOIV9/vbf58/GxVjZm2o8+MMbdDBANjTDZe/ijZKfyA==}
     engines: {node: '>=14.0.0'}
@@ -3512,6 +4138,20 @@ packages:
       uuid: 8.3.2
     dev: true
 
+  /@smithy/middleware-retry@2.0.13:
+    resolution: {integrity: sha512-zuOva8xgWC7KYG8rEXyWIcZv2GWszO83DCTU6IKcf/FKu6OBmSE+EYv3EUcCGY+GfiwCX0EyJExC9Lpq9b0w5Q==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/node-config-provider': 2.0.13
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/service-error-classification': 2.0.3
+      '@smithy/types': 2.3.4
+      '@smithy/util-middleware': 2.0.3
+      '@smithy/util-retry': 2.0.3
+      tslib: 2.6.2
+      uuid: 8.3.2
+    dev: false
+
   /@smithy/middleware-retry@2.0.5:
     resolution: {integrity: sha512-ulIfbFyzQTVnJbLjUl1CTSi0etg6tej/ekwaLp0Gn8ybUkDkKYa+uB6CF/m2J5B6meRwyJlsryR+DjaOVyiicg==}
     engines: {node: '>=14.0.0'}
@@ -3524,6 +4164,14 @@ packages:
       tslib: 2.6.2
       uuid: 8.3.2
 
+  /@smithy/middleware-serde@2.0.10:
+    resolution: {integrity: sha512-+A0AFqs768256H/BhVEsBF6HijFbVyAwYRVXY/izJFkTalVWJOp4JA0YdY0dpXQd+AlW0tzs+nMQCE1Ew+DcgQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/middleware-serde@2.0.5:
     resolution: {integrity: sha512-in0AA5sous74dOfTGU9rMJBXJ0bDVNxwdXtEt5lh3FVd2sEyjhI+rqpLLRF1E4ixbw3RSEf80hfRpcPdjg4vvQ==}
     engines: {node: '>=14.0.0'}
@@ -3544,12 +4192,29 @@ packages:
     dependencies:
       tslib: 2.6.2
 
-  /@smithy/node-config-provider@2.0.5:
-    resolution: {integrity: sha512-LRtjV9WkhONe2lVy+ipB/l1GX60ybzBmFyeRUoLUXWKdnZ3o81jsnbKzMK8hKq8eFSWPk+Lmyx6ZzCQabGeLxg==}
+  /@smithy/middleware-stack@2.0.4:
+    resolution: {integrity: sha512-MW0KNKfh8ZGLagMZnxcLJWPNXoKqW6XV/st5NnCBmmA2e2JhrUjU0AJ5Ca/yjTyNEKs3xH7AQDwp1YmmpEpmQQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
+  /@smithy/node-config-provider@2.0.13:
+    resolution: {integrity: sha512-pPpLqYuJcOq1sj1EGu+DoZK47DUS4gepqSTNgRezmrjnzNlSU2/Dcc9Ebzs+WZ0Z5vXKazuE+k+NksFLo07/AA==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/property-provider': 2.0.11
+      '@smithy/shared-ini-file-loader': 2.0.12
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+
+  /@smithy/node-config-provider@2.0.7:
+    resolution: {integrity: sha512-GuLxhnf0aVQsfQp4ZWaM1TRCIndpQjAswyFcmDFRNf4yFqpxpLPDeV540+O0Z21Hmu3deoQm/dCPXbVn90PYzg==}
     engines: {node: '>=14.0.0'}
     dependencies:
-      '@smithy/property-provider': 2.0.5
-      '@smithy/shared-ini-file-loader': 2.0.5
+      '@smithy/property-provider': 2.0.6
+      '@smithy/shared-ini-file-loader': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
@@ -3574,11 +4239,29 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
-  /@smithy/property-provider@2.0.5:
-    resolution: {integrity: sha512-cAFSUhX6aiHcmpWfrCLKvwBtgN1F6A0N8qY/8yeSi0LRLmhGqsY1/YTxFE185MCVzYbqBGXVr9TBv4RUcIV4rA==}
+  /@smithy/node-http-handler@2.1.6:
+    resolution: {integrity: sha512-NspvD3aCwiUNtoSTcVHz0RZz1tQ/SaRIe1KPF+r0mAdCZ9eWuhIeJT8ZNPYa1ITn7/Lgg64IyFjqPynZ8KnYQw==}
     engines: {node: '>=14.0.0'}
     dependencies:
-      '@smithy/types': 2.2.2
+      '@smithy/abort-controller': 2.0.10
+      '@smithy/protocol-http': 3.0.6
+      '@smithy/querystring-builder': 2.0.10
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
+  /@smithy/property-provider@2.0.11:
+    resolution: {integrity: sha512-kzuOadu6XvrnlF1iXofpKXYmo4oe19st9/DE8f5gHNaFepb4eTkR8gD8BSdTnNnv7lxfv6uOwZPg4VS6hemX1w==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+
+  /@smithy/property-provider@2.0.6:
+    resolution: {integrity: sha512-CVem6ZkkWxbTnhjDLyLESY0oLA6IUZYtdqrCpGQKUXaFBOuc/izjm7fIFGBxEbjZ1EGcH9hHxrjqX36RWULNRg==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
       tslib: 2.6.2
 
   /@smithy/protocol-http@1.2.0:
@@ -3596,6 +4279,14 @@ packages:
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
+  /@smithy/protocol-http@3.0.6:
+    resolution: {integrity: sha512-F0jAZzwznMmHaggiZgc7YoS08eGpmLvhVktY/Taz6+OAOHfyIqWSDNgFqYR+WHW9z5fp2XvY4mEUrQgYMQ71jw==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/querystring-builder@1.1.0:
     resolution: {integrity: sha512-gDEi4LxIGLbdfjrjiY45QNbuDmpkwh9DX4xzrR2AzjjXpxwGyfSpbJaYhXARw9p17VH0h9UewnNQXNwaQyYMDA==}
     engines: {node: '>=14.0.0'}
@@ -3605,6 +4296,15 @@ packages:
       tslib: 2.6.2
     dev: true
 
+  /@smithy/querystring-builder@2.0.10:
+    resolution: {integrity: sha512-uujJGp8jzrrU1UHme8sUKEbawQTcTmUWsh8rbGXYD/lMwNLQ+9jQ9dMDWbbH9Hpoa9RER1BeL/38WzGrbpob2w==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      '@smithy/util-uri-escape': 2.0.0
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/querystring-builder@2.0.5:
     resolution: {integrity: sha512-4DCX9krxLzATj+HdFPC3i8pb7XTAWzzKqSw8aTZMjXjtQY+vhe4azMAqIvbb6g7JKwIkmkRAjK6EXO3YWSnJVQ==}
     engines: {node: '>=14.0.0'}
@@ -3613,6 +4313,13 @@ packages:
       '@smithy/util-uri-escape': 2.0.0
       tslib: 2.6.2
 
+  /@smithy/querystring-parser@2.0.10:
+    resolution: {integrity: sha512-WSD4EU60Q8scacT5PIpx4Bahn6nWpt+MiYLcBkFt6fOj7AssrNeaNIU2Z0g40ftVmrwLcEOIKGX92ynbVDb3ZA==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+
   /@smithy/querystring-parser@2.0.5:
     resolution: {integrity: sha512-C2stCULH0r54KBksv3AWcN8CLS3u9+WsEW8nBrvctrJ5rQTNa1waHkffpVaiKvcW2nP0aIMBPCobD/kYf/q9mA==}
     engines: {node: '>=14.0.0'}
@@ -3629,11 +4336,25 @@ packages:
     resolution: {integrity: sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==}
     engines: {node: '>=14.0.0'}
 
-  /@smithy/shared-ini-file-loader@2.0.5:
-    resolution: {integrity: sha512-Mvtk6FwMtfbKRC4YuSsIqRYp9WTxsSUJVVo2djgyhcacKGMqicHDWSAmgy3sDrKv+G/G6xTZCPwm6pJARtdxVg==}
+  /@smithy/service-error-classification@2.0.3:
+    resolution: {integrity: sha512-b+m4QCHXb7oKAkM/jHwHrl5gpqhFoMTHF643L0/vAEkegrcUWyh1UjyoHttuHcP5FnHVVy4EtpPtLkEYD+xMFw==}
     engines: {node: '>=14.0.0'}
     dependencies:
-      '@smithy/types': 2.2.2
+      '@smithy/types': 2.3.4
+    dev: false
+
+  /@smithy/shared-ini-file-loader@2.0.12:
+    resolution: {integrity: sha512-umi0wc4UBGYullAgYNUVfGLgVpxQyES47cnomTqzCKeKO5oudO4hyDNj+wzrOjqDFwK2nWYGVgS8Y0JgGietrw==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+
+  /@smithy/shared-ini-file-loader@2.0.6:
+    resolution: {integrity: sha512-NO6dHqho6APbVR0DxPtYoL4KXBqUeSM3Slsd103MOgL50YbzzsQmMLtDMZ87W8MlvvCN0tuiq+OrAO/rM7hTQg==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
       tslib: 2.6.2
 
   /@smithy/signature-v4@2.0.5:
@@ -3642,9 +4363,9 @@ packages:
     dependencies:
       '@smithy/eventstream-codec': 2.0.5
       '@smithy/is-array-buffer': 2.0.0
-      '@smithy/types': 2.2.2
+      '@smithy/types': 2.3.4
       '@smithy/util-hex-encoding': 2.0.0
-      '@smithy/util-middleware': 2.0.0
+      '@smithy/util-middleware': 2.0.3
       '@smithy/util-uri-escape': 2.0.0
       '@smithy/util-utf8': 2.0.0
       tslib: 2.6.2
@@ -3668,6 +4389,16 @@ packages:
       '@smithy/util-stream': 2.0.5
       tslib: 2.6.2
 
+  /@smithy/smithy-client@2.1.8:
+    resolution: {integrity: sha512-Puuc4wuhdTSs8wstkNJ/JtpaFwIh0qDE27zawfRVzzjpXprpT+4wROqO2+NVoZ+6GKv7kz7QgZx6AI5325bSeQ==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/middleware-stack': 2.0.4
+      '@smithy/types': 2.3.4
+      '@smithy/util-stream': 2.0.13
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/types@1.2.0:
     resolution: {integrity: sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==}
     engines: {node: '>=14.0.0'}
@@ -3681,6 +4412,19 @@ packages:
     dependencies:
       tslib: 2.6.2
 
+  /@smithy/types@2.3.4:
+    resolution: {integrity: sha512-D7xlM9FOMFyFw7YnMXn9dK2KuN6+JhnrZwVt1fWaIu8hCk5CigysweeIT/H/nCo4YV+s8/oqUdLfexbkPZtvqw==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      tslib: 2.6.2
+
+  /@smithy/url-parser@2.0.10:
+    resolution: {integrity: sha512-4TXQFGjHcqru8aH5VRB4dSnOFKCYNX6SR1Do6fwxZ+ExT2onLsh2W77cHpks7ma26W5jv6rI1u7d0+KX9F0aOw==}
+    dependencies:
+      '@smithy/querystring-parser': 2.0.10
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+
   /@smithy/url-parser@2.0.5:
     resolution: {integrity: sha512-OdMBvZhpckQSkugCXNJQCvqJ71wE7Ftxce92UOQLQ9pwF6hoS5PLL7wEfpnuEXtStzBqJYkzu1C1ZfjuFGOXAA==}
     dependencies:
@@ -3742,23 +4486,47 @@ packages:
     dependencies:
       tslib: 2.6.2
 
-  /@smithy/util-defaults-mode-browser@2.0.5:
-    resolution: {integrity: sha512-yciP6TPttLsj731aHTvekgyuCGXQrEAJibEwEWAh3kzaDsfGAVCuZSBlyvC2Dl3TZmHKCOQwHV8mIE7KQCTPuQ==}
+  /@smithy/util-defaults-mode-browser@2.0.12:
+    resolution: {integrity: sha512-BCsFPdNThMS2312/Zj3/TtFsXfO2BwkbDNsoWbdtZ0cAv9cE6vqGKllYXmq2Gj6u+Vv8V3wUgBUicNol6s/7Sg==}
     engines: {node: '>= 10.0.0'}
     dependencies:
-      '@smithy/property-provider': 2.0.5
+      '@smithy/property-provider': 2.0.11
+      '@smithy/smithy-client': 2.1.8
+      '@smithy/types': 2.3.4
+      bowser: 2.11.0
+      tslib: 2.6.2
+    dev: false
+
+  /@smithy/util-defaults-mode-browser@2.0.6:
+    resolution: {integrity: sha512-h8xyKTZIIom62DN4xbPUmL+RL1deZcK1qJGmCr4c2yXjOrs5/iZ1VtQQcl+xP78620ga/565AikZE1sktdg2yA==}
+    engines: {node: '>= 10.0.0'}
+    dependencies:
+      '@smithy/property-provider': 2.0.6
       '@smithy/types': 2.2.2
       bowser: 2.11.0
       tslib: 2.6.2
 
-  /@smithy/util-defaults-mode-node@2.0.5:
-    resolution: {integrity: sha512-M07t99rWasXt+IaDZDyP3BkcoEm/mgIE1RIMASrE49LKSNxaVN7PVcgGc77+4uu2kzBAyqJKy79pgtezuknyjQ==}
+  /@smithy/util-defaults-mode-node@2.0.14:
+    resolution: {integrity: sha512-EtomtYsWDkBGs0fLeF+7N2df+zIqGix+O4llWqQD+97rbo2hk+GBWeZzBkujKrzFeXNUbPkFqfvZPLdoq4S4XQ==}
+    engines: {node: '>= 10.0.0'}
+    dependencies:
+      '@smithy/config-resolver': 2.0.11
+      '@smithy/credential-provider-imds': 2.0.13
+      '@smithy/node-config-provider': 2.0.13
+      '@smithy/property-provider': 2.0.11
+      '@smithy/smithy-client': 2.1.8
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
+  /@smithy/util-defaults-mode-node@2.0.7:
+    resolution: {integrity: sha512-2C1YfmYJj9bpM/cRAgQppYNzPd8gDEXZ5XIVDuEQg3TmmIiinZaFf/HsHYo9NK/PMy5oawJVdIuR7SVriIo1AQ==}
     engines: {node: '>= 10.0.0'}
     dependencies:
       '@smithy/config-resolver': 2.0.5
-      '@smithy/credential-provider-imds': 2.0.5
-      '@smithy/node-config-provider': 2.0.5
-      '@smithy/property-provider': 2.0.5
+      '@smithy/credential-provider-imds': 2.0.7
+      '@smithy/node-config-provider': 2.0.7
+      '@smithy/property-provider': 2.0.6
       '@smithy/types': 2.2.2
       tslib: 2.6.2
 
@@ -3788,6 +4556,13 @@ packages:
     dependencies:
       tslib: 2.6.2
 
+  /@smithy/util-middleware@2.0.3:
+    resolution: {integrity: sha512-+FOCFYOxd2HO7v/0hkFSETKf7FYQWa08wh/x/4KUeoVBnLR4juw8Qi+TTqZI6E2h5LkzD9uOaxC9lAjrpVzaaA==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+
   /@smithy/util-retry@1.1.0:
     resolution: {integrity: sha512-ygQW5HBqYXpR3ua09UciS0sL7UGJzGiktrKkOuEJwARoUuzz40yaEGU6xd9Gs7KBmAaFC8gMfnghHtwZ2nyBCQ==}
     engines: {node: '>= 14.0.0'}
@@ -3803,6 +4578,15 @@ packages:
       '@smithy/service-error-classification': 2.0.0
       tslib: 2.6.2
 
+  /@smithy/util-retry@2.0.3:
+    resolution: {integrity: sha512-gw+czMnj82i+EaH7NL7XKkfX/ZKrCS2DIWwJFPKs76bMgkhf0y1C94Lybn7f8GkBI9lfIOUdPYtzm19zQOC8sw==}
+    engines: {node: '>= 14.0.0'}
+    dependencies:
+      '@smithy/service-error-classification': 2.0.3
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/util-stream@1.1.0:
     resolution: {integrity: sha512-w3lsdGsntaLQIrwDWJkIFKrFscgZXwU/oxsse09aSTNv5TckPhDeYea3LhsDrU5MGAG3vprhVZAKr33S45coVA==}
     engines: {node: '>=14.0.0'}
@@ -3817,6 +4601,20 @@ packages:
       tslib: 2.6.2
     dev: true
 
+  /@smithy/util-stream@2.0.13:
+    resolution: {integrity: sha512-aeua6pN0WMdQtZNRRJ8J+mop57fezLMsApYbk5Q3q11pyHwZypVPuKoelr7K9PMJZcuYk90dQyUsUAd7hTCeRg==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/fetch-http-handler': 2.2.0
+      '@smithy/node-http-handler': 2.1.6
+      '@smithy/types': 2.3.4
+      '@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.6.2
+    dev: false
+
   /@smithy/util-stream@2.0.5:
     resolution: {integrity: sha512-ylx27GwI05xLpYQ4hDIfS15vm+wYjNN0Sc2P0FxuzgRe8v0BOLHppGIQ+Bezcynk8C9nUzsUue3TmtRhjut43g==}
     engines: {node: '>=14.0.0'}
@@ -3858,6 +4656,15 @@ packages:
       '@smithy/util-buffer-from': 2.0.0
       tslib: 2.6.2
 
+  /@smithy/util-waiter@2.0.10:
+    resolution: {integrity: sha512-yQjwWVrwYw+/f3hFQccE3zZF7lk6N6xtNcA6jvhWFYhnyKAm6B2mX8Gzftl0TbgoPUpzCvKYlvhaEpVtRpVfVw==}
+    engines: {node: '>=14.0.0'}
+    dependencies:
+      '@smithy/abort-controller': 2.0.10
+      '@smithy/types': 2.3.4
+      tslib: 2.6.2
+    dev: false
+
   /@smithy/util-waiter@2.0.5:
     resolution: {integrity: sha512-1lkkUmI/bhaDX+LIT3RiUNAn+NzPmsWjE7beMq0oQ3H1/CffaILIN67riDA0aE1YBj6xll7uWMIy4tJqc+peXw==}
     engines: {node: '>=14.0.0'}
@@ -3872,6 +4679,12 @@ packages:
       tslib: 2.6.2
     dev: false
 
+  /@swc/helpers@0.5.2:
+    resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==}
+    dependencies:
+      tslib: 2.6.2
+    dev: false
+
   /@tootallnate/once@2.0.0:
     resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
     engines: {node: '>= 10'}
@@ -3972,8 +4785,8 @@ packages:
     resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==}
     dev: false
 
-  /@types/node@18.17.12:
-    resolution: {integrity: sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ==}
+  /@types/node@18.17.13:
+    resolution: {integrity: sha512-SlLPDDe6YQl1JnQQy4hgsuJeo5q5c1TBU4be4jeBLXsqpjoDbfb0HesSfhMwnaxfSJ4txtfzJzW5/x/43fkkfQ==}
 
   /@types/node@20.5.0:
     resolution: {integrity: sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==}
@@ -4039,7 +4852,7 @@ packages:
   /@types/ws@8.5.5:
     resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==}
     dependencies:
-      '@types/node': 18.17.12
+      '@types/node': 18.17.13
 
   /@types/yargs-parser@21.0.0:
     resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
@@ -4613,7 +5426,7 @@ packages:
     dependencies:
       browserslist: 4.21.10
       caniuse-lite: 1.0.30001525
-      fraction.js: 4.3.4
+      fraction.js: 4.3.6
       normalize-range: 0.1.2
       picocolors: 1.0.0
       postcss: 8.4.27
@@ -4721,8 +5534,8 @@ packages:
       - utf-8-validate
     dev: true
 
-  /aws-sdk@2.1448.0:
-    resolution: {integrity: sha512-15r8YKdAAXLgtPfQTAzD/qNxxgndF1SMEw6F+mXvLxZrLkG4BHnzOW2g2sQc3C2qG5yqCb3K6R+OrjbvGOAmdQ==}
+  /aws-sdk@2.1450.0:
+    resolution: {integrity: sha512-EfZLImJ0XNuIdlx5McHX0rJbOiQHz+vEjnpGV08gXSzaq2cN3vSjE+L2Dju7KmaIh85FTYvLOf2REUuCLDpSRg==}
     engines: {node: '>= 10.0.0'}
     dependencies:
       buffer: 4.9.2
@@ -4872,7 +5685,7 @@ packages:
     hasBin: true
     dependencies:
       caniuse-lite: 1.0.30001525
-      electron-to-chromium: 1.4.506
+      electron-to-chromium: 1.4.508
       node-releases: 2.0.13
       update-browserslist-db: 1.0.11(browserslist@4.21.10)
 
@@ -4991,7 +5804,7 @@ packages:
       '@aws-cdk/cloud-assembly-schema': 2.84.0
       '@aws-cdk/cx-api': 2.84.0(@aws-cdk/cloud-assembly-schema@2.84.0)
       archiver: 5.3.2
-      aws-sdk: 2.1448.0
+      aws-sdk: 2.1450.0
       glob: 7.2.3
       mime: 2.6.0
       yargs: 16.2.0
@@ -5005,7 +5818,7 @@ packages:
       '@aws-cdk/cloud-assembly-schema': 2.91.0
       '@aws-cdk/cx-api': 2.91.0(@aws-cdk/cloud-assembly-schema@2.91.0)
       archiver: 5.3.2
-      aws-sdk: 2.1448.0
+      aws-sdk: 2.1450.0
       glob: 7.2.3
       mime: 2.6.0
       yargs: 16.2.0
@@ -5637,8 +6450,8 @@ packages:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
     dev: true
 
-  /electron-to-chromium@1.4.506:
-    resolution: {integrity: sha512-xxGct4GPAKSRlrLBtJxJFYy74W11zX6PO9GyHgl/U+2s3Dp0ZEwAklDfNHXOWcvH7zWMpsmgbR0ggEuaYAVvHA==}
+  /electron-to-chromium@1.4.508:
+    resolution: {integrity: sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==}
 
   /emoji-regex@8.0.0:
     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -5866,6 +6679,37 @@ packages:
       '@esbuild/win32-arm64': 0.18.20
       '@esbuild/win32-ia32': 0.18.20
       '@esbuild/win32-x64': 0.18.20
+    dev: true
+
+  /esbuild@0.19.2:
+    resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/android-arm': 0.19.2
+      '@esbuild/android-arm64': 0.19.2
+      '@esbuild/android-x64': 0.19.2
+      '@esbuild/darwin-arm64': 0.19.2
+      '@esbuild/darwin-x64': 0.19.2
+      '@esbuild/freebsd-arm64': 0.19.2
+      '@esbuild/freebsd-x64': 0.19.2
+      '@esbuild/linux-arm': 0.19.2
+      '@esbuild/linux-arm64': 0.19.2
+      '@esbuild/linux-ia32': 0.19.2
+      '@esbuild/linux-loong64': 0.19.2
+      '@esbuild/linux-mips64el': 0.19.2
+      '@esbuild/linux-ppc64': 0.19.2
+      '@esbuild/linux-riscv64': 0.19.2
+      '@esbuild/linux-s390x': 0.19.2
+      '@esbuild/linux-x64': 0.19.2
+      '@esbuild/netbsd-x64': 0.19.2
+      '@esbuild/openbsd-x64': 0.19.2
+      '@esbuild/sunos-x64': 0.19.2
+      '@esbuild/win32-arm64': 0.19.2
+      '@esbuild/win32-ia32': 0.19.2
+      '@esbuild/win32-x64': 0.19.2
+    dev: false
 
   /escalade@3.1.1:
     resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
@@ -6534,8 +7378,8 @@ packages:
     engines: {node: '>= 0.6'}
     dev: true
 
-  /fraction.js@4.3.4:
-    resolution: {integrity: sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==}
+  /fraction.js@4.3.6:
+    resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==}
 
   /fresh@0.5.2:
     resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
@@ -7038,7 +7882,7 @@ packages:
   /inherits@2.0.4:
     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
 
-  /ink-spinner@5.0.0(ink@4.3.1)(react@18.2.0):
+  /ink-spinner@5.0.0(ink@4.4.0)(react@18.2.0):
     resolution: {integrity: sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA==}
     engines: {node: '>=14.16'}
     peerDependencies:
@@ -7046,12 +7890,12 @@ packages:
       react: '>=18.0.0'
     dependencies:
       cli-spinners: 2.9.0
-      ink: 4.3.1(react@18.2.0)
+      ink: 4.4.0(react@18.2.0)
       react: 18.2.0
     dev: true
 
-  /ink@4.3.1(react@18.2.0):
-    resolution: {integrity: sha512-XlH5AiZRLIC4cF+eMgZLsB/feHCDT7lUtHXK4pe8ULGrC6mNosrYidzJr8CRY0P+hK7UmZ1rLO+ufdox53+NQg==}
+  /ink@4.4.0(react@18.2.0):
+    resolution: {integrity: sha512-WEUkpgW6b/0yu30xYKNTxkpF90SzoTCzo0o96XEWZXQG+RmmadYC0nWgzmK0jy9pcsIDs1dqUBa+ihcJu1kfKQ==}
     engines: {node: '>=14.16'}
     peerDependencies:
       '@types/react': '>=18.0.0'
@@ -7537,8 +8381,8 @@ packages:
     engines: {node: '>= 0.6.0'}
     dev: true
 
-  /joi@17.10.0:
-    resolution: {integrity: sha512-hrazgRSlhzacZ69LdcKfhi3Vu13z2yFfoAzmEov3yFIJlatTdVGUW6vle1zjH8qkzdCn/qGw8rapjqsObbYXAg==}
+  /joi@17.10.1:
+    resolution: {integrity: sha512-vIiDxQKmRidUVp8KngT8MZSOcmRVm2zV7jbMjNYWuHcJWI0bUck3nRTGQjhpPlQenIQIBC5Vp9AhcnHbWQqafw==}
     dependencies:
       '@hapi/hoek': 9.3.0
       '@hapi/topo': 5.1.0
@@ -7747,23 +8591,23 @@ packages:
       minimist: 1.2.8
     dev: true
 
-  /kysely-data-api@0.2.1(@aws-sdk/client-rds-data@3.398.0)(kysely@0.23.5):
+  /kysely-data-api@0.2.1(@aws-sdk/client-rds-data@3.405.0)(kysely@0.23.5):
     resolution: {integrity: sha512-KmASvF1gmjVqyU9WOUXhCQlv29ofR+xc2DhjaIomz1+Bjd/VtR2/3g4ZuXwG1L4lWGKxMuo5iOvK3XyPbB4LdQ==}
     peerDependencies:
       '@aws-sdk/client-rds-data': 3.x
       kysely: 0.x
     dependencies:
-      '@aws-sdk/client-rds-data': 3.398.0
+      '@aws-sdk/client-rds-data': 3.405.0
       kysely: 0.23.5
     dev: true
 
-  /kysely-data-api@0.2.1(@aws-sdk/client-rds-data@3.398.0)(kysely@0.25.0):
+  /kysely-data-api@0.2.1(@aws-sdk/client-rds-data@3.405.0)(kysely@0.25.0):
     resolution: {integrity: sha512-KmASvF1gmjVqyU9WOUXhCQlv29ofR+xc2DhjaIomz1+Bjd/VtR2/3g4ZuXwG1L4lWGKxMuo5iOvK3XyPbB4LdQ==}
     peerDependencies:
       '@aws-sdk/client-rds-data': 3.x
       kysely: 0.x
     dependencies:
-      '@aws-sdk/client-rds-data': 3.398.0
+      '@aws-sdk/client-rds-data': 3.405.0
       kysely: 0.25.0
     dev: true
 
@@ -8394,9 +9238,9 @@ packages:
       - babel-plugin-macros
     dev: false
 
-  /next@13.4.19(react-dom@18.2.0)(react@18.2.0):
-    resolution: {integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==}
-    engines: {node: '>=16.8.0'}
+  /next@13.5.3(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-4Nt4HRLYDW/yRpJ/QR2t1v63UOMS55A38dnWv3UDOWGezuY0ZyFO1ABNbD7mulVzs9qVhgy2+ppjdsANpKP1mg==}
+    engines: {node: '>=16.14.0'}
     hasBin: true
     peerDependencies:
       '@opentelemetry/api': ^1.1.0
@@ -8409,8 +9253,8 @@ packages:
       sass:
         optional: true
     dependencies:
-      '@next/env': 13.4.19
-      '@swc/helpers': 0.5.1
+      '@next/env': 13.5.3
+      '@swc/helpers': 0.5.2
       busboy: 1.6.0
       caniuse-lite: 1.0.30001525
       postcss: 8.4.14
@@ -8420,15 +9264,15 @@ packages:
       watchpack: 2.4.0
       zod: 3.21.4
     optionalDependencies:
-      '@next/swc-darwin-arm64': 13.4.19
-      '@next/swc-darwin-x64': 13.4.19
-      '@next/swc-linux-arm64-gnu': 13.4.19
-      '@next/swc-linux-arm64-musl': 13.4.19
-      '@next/swc-linux-x64-gnu': 13.4.19
-      '@next/swc-linux-x64-musl': 13.4.19
-      '@next/swc-win32-arm64-msvc': 13.4.19
-      '@next/swc-win32-ia32-msvc': 13.4.19
-      '@next/swc-win32-x64-msvc': 13.4.19
+      '@next/swc-darwin-arm64': 13.5.3
+      '@next/swc-darwin-x64': 13.5.3
+      '@next/swc-linux-arm64-gnu': 13.5.3
+      '@next/swc-linux-arm64-musl': 13.5.3
+      '@next/swc-linux-x64-gnu': 13.5.3
+      '@next/swc-linux-x64-musl': 13.5.3
+      '@next/swc-win32-arm64-msvc': 13.5.3
+      '@next/swc-win32-ia32-msvc': 13.5.3
+      '@next/swc-win32-x64-msvc': 13.5.3
     transitivePeerDependencies:
       - '@babel/core'
       - babel-plugin-macros
@@ -9307,8 +10151,8 @@ packages:
       - supports-color
     dev: false
 
-  /remeda@1.25.2:
-    resolution: {integrity: sha512-rWYb4nTgOrgWfOJb7q2JFa/925M6XXf+wJ2n4T1ItviVPjyzqpSW+Qt6t9N/Qbciw9McNCqsgV4/gzJGfwhB5w==}
+  /remeda@1.26.0:
+    resolution: {integrity: sha512-v+Qbi2krvXknCvG60gviLUSBJQPxXUVBAvi64m3Awoua3X+ygAmPYPrbFgqwPpiM1tBHNBVrHPBKtza7if+HyQ==}
     dev: true
 
   /repeat-string@1.6.1:
@@ -9720,18 +10564,18 @@ packages:
       '@aws-cdk/cloud-assembly-schema': 2.84.0
       '@aws-cdk/cloudformation-diff': 2.84.0
       '@aws-cdk/cx-api': 2.84.0(@aws-cdk/cloud-assembly-schema@2.84.0)
-      '@aws-sdk/client-cloudformation': 3.398.0
-      '@aws-sdk/client-eventbridge': 3.398.0(@aws-sdk/signature-v4-crt@3.398.0)
-      '@aws-sdk/client-iam': 3.398.0
-      '@aws-sdk/client-iot': 3.398.0
-      '@aws-sdk/client-iot-data-plane': 3.398.0
-      '@aws-sdk/client-lambda': 3.398.0
-      '@aws-sdk/client-rds-data': 3.398.0
-      '@aws-sdk/client-s3': 3.400.0(@aws-sdk/signature-v4-crt@3.398.0)
-      '@aws-sdk/client-ssm': 3.398.0
-      '@aws-sdk/client-sts': 3.398.0
+      '@aws-sdk/client-cloudformation': 3.405.0
+      '@aws-sdk/client-eventbridge': 3.405.0(@aws-sdk/signature-v4-crt@3.398.0)
+      '@aws-sdk/client-iam': 3.405.0
+      '@aws-sdk/client-iot': 3.405.0
+      '@aws-sdk/client-iot-data-plane': 3.405.0
+      '@aws-sdk/client-lambda': 3.405.0
+      '@aws-sdk/client-rds-data': 3.405.0
+      '@aws-sdk/client-s3': 3.405.0(@aws-sdk/signature-v4-crt@3.398.0)
+      '@aws-sdk/client-ssm': 3.405.0
+      '@aws-sdk/client-sts': 3.405.0
       '@aws-sdk/config-resolver': 3.374.0
-      '@aws-sdk/credential-providers': 3.398.0
+      '@aws-sdk/credential-providers': 3.405.0
       '@aws-sdk/middleware-retry': 3.374.0
       '@aws-sdk/middleware-signing': 3.398.0
       '@aws-sdk/signature-v4-crt': 3.398.0
@@ -9743,7 +10587,7 @@ packages:
       adm-zip: 0.5.10
       aws-cdk-lib: 2.84.0(constructs@10.1.156)
       aws-iot-device-sdk: 2.2.12
-      aws-sdk: 2.1448.0
+      aws-sdk: 2.1450.0
       builtin-modules: 3.2.0
       cdk-assets: 2.84.0
       chalk: 5.3.0
@@ -9763,16 +10607,16 @@ packages:
       graphql: 16.8.0
       graphql-yoga: 3.9.1(graphql@16.8.0)
       immer: 9.0.21
-      ink: 4.3.1(react@18.2.0)
-      ink-spinner: 5.0.0(ink@4.3.1)(react@18.2.0)
+      ink: 4.4.0(react@18.2.0)
+      ink-spinner: 5.0.0(ink@4.4.0)(react@18.2.0)
       kysely: 0.23.5
       kysely-codegen: 0.10.1(kysely@0.23.5)
-      kysely-data-api: 0.2.1(@aws-sdk/client-rds-data@3.398.0)(kysely@0.23.5)
+      kysely-data-api: 0.2.1(@aws-sdk/client-rds-data@3.405.0)(kysely@0.23.5)
       minimatch: 6.2.0
       openid-client: 5.4.3
       ora: 6.3.1
       react: 18.2.0
-      remeda: 1.25.2
+      remeda: 1.26.0
       sst-aws-cdk: 2.84.0
       tree-kill: 1.2.2
       undici: 5.23.0
@@ -9793,8 +10637,8 @@ packages:
       - utf-8-validate
     dev: true
 
-  /sst@2.24.20:
-    resolution: {integrity: sha512-o+FkY8DierOY3+/zvL4PbeCI/0CEK6e2m0amEMPVoYlq37ajPwjXDjRCC5ZZlV9PKmUHwHHyXF99PJ1wruah/A==}
+  /sst@2.24.24:
+    resolution: {integrity: sha512-G8q6YwsNUACuNq7BUQmE1JB+nzWGoX1DcvFcD8MZiUjSOzpNN9d7Sxfgo8um10IWGuk60nkSuEyohEQMQl53Gw==}
     hasBin: true
     peerDependencies:
       '@sls-next/lambda-at-edge': ^3.7.0
@@ -9809,19 +10653,19 @@ packages:
       '@aws-cdk/cloudformation-diff': 2.91.0
       '@aws-cdk/cx-api': 2.91.0(@aws-cdk/cloud-assembly-schema@2.91.0)
       '@aws-crypto/sha256-js': 5.0.0
-      '@aws-sdk/client-cloudformation': 3.398.0
-      '@aws-sdk/client-ecs': 3.398.0
-      '@aws-sdk/client-eventbridge': 3.398.0(@aws-sdk/signature-v4-crt@3.398.0)
-      '@aws-sdk/client-iam': 3.398.0
-      '@aws-sdk/client-iot': 3.398.0
-      '@aws-sdk/client-iot-data-plane': 3.398.0
-      '@aws-sdk/client-lambda': 3.398.0
-      '@aws-sdk/client-rds-data': 3.398.0
-      '@aws-sdk/client-s3': 3.400.0(@aws-sdk/signature-v4-crt@3.398.0)
-      '@aws-sdk/client-ssm': 3.398.0
-      '@aws-sdk/client-sts': 3.398.0
+      '@aws-sdk/client-cloudformation': 3.405.0
+      '@aws-sdk/client-ecs': 3.405.0
+      '@aws-sdk/client-eventbridge': 3.405.0(@aws-sdk/signature-v4-crt@3.398.0)
+      '@aws-sdk/client-iam': 3.405.0
+      '@aws-sdk/client-iot': 3.405.0
+      '@aws-sdk/client-iot-data-plane': 3.405.0
+      '@aws-sdk/client-lambda': 3.405.0
+      '@aws-sdk/client-rds-data': 3.405.0
+      '@aws-sdk/client-s3': 3.405.0(@aws-sdk/signature-v4-crt@3.398.0)
+      '@aws-sdk/client-ssm': 3.405.0
+      '@aws-sdk/client-sts': 3.405.0
       '@aws-sdk/config-resolver': 3.374.0
-      '@aws-sdk/credential-providers': 3.398.0
+      '@aws-sdk/credential-providers': 3.405.0
       '@aws-sdk/middleware-retry': 3.374.0
       '@aws-sdk/middleware-signing': 3.398.0
       '@aws-sdk/signature-v4-crt': 3.398.0
@@ -9834,7 +10678,7 @@ packages:
       adm-zip: 0.5.10
       aws-cdk-lib: 2.91.0(constructs@10.2.69)
       aws-iot-device-sdk: 2.2.12
-      aws-sdk: 2.1448.0
+      aws-sdk: 2.1450.0
       builtin-modules: 3.2.0
       cdk-assets: 2.91.0
       chalk: 5.3.0
@@ -9854,16 +10698,16 @@ packages:
       graphql: 16.8.0
       graphql-yoga: 3.9.1(graphql@16.8.0)
       immer: 9.0.21
-      ink: 4.3.1(react@18.2.0)
-      ink-spinner: 5.0.0(ink@4.3.1)(react@18.2.0)
+      ink: 4.4.0(react@18.2.0)
+      ink-spinner: 5.0.0(ink@4.4.0)(react@18.2.0)
       kysely: 0.25.0
       kysely-codegen: 0.10.1(kysely@0.25.0)
-      kysely-data-api: 0.2.1(@aws-sdk/client-rds-data@3.398.0)(kysely@0.25.0)
+      kysely-data-api: 0.2.1(@aws-sdk/client-rds-data@3.405.0)(kysely@0.25.0)
       minimatch: 6.2.0
       openid-client: 5.4.3
       ora: 6.3.1
       react: 18.2.0
-      remeda: 1.25.2
+      remeda: 1.26.0
       sst-aws-cdk: 2.91.0
       tree-kill: 1.2.2
       undici: 5.23.0
@@ -10339,7 +11183,7 @@ packages:
   /ts-interface-checker@0.1.13:
     resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
 
-  /ts-node@10.9.1(@types/node@18.17.12)(typescript@4.9.3):
+  /ts-node@10.9.1(@types/node@18.17.13)(typescript@4.9.3):
     resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
     hasBin: true
     peerDependencies:
@@ -10358,7 +11202,7 @@ packages:
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.4
-      '@types/node': 18.17.12
+      '@types/node': 18.17.13
       acorn: 8.10.0
       acorn-walk: 8.2.0
       arg: 4.1.3
@@ -10939,7 +11783,7 @@ packages:
     hasBin: true
     dependencies:
       axios: 0.27.2(debug@4.3.4)
-      joi: 17.10.0
+      joi: 17.10.1
       lodash: 4.17.21
       minimist: 1.2.8
       rxjs: 7.8.1
