+
diff --git a/examples/blog/web/src/pages/index.astro b/examples/blog/web/src/pages/index.astro
new file mode 100644
index 0000000..29e7a93
--- /dev/null
+++ b/examples/blog/web/src/pages/index.astro
@@ -0,0 +1,10 @@
+---
+import Base from "@/layouts/Base.astro";
+import { ArticleList } from "@/components/Articles";
+---
+
+
+
+
+
+
diff --git a/examples/blog/web/tailwind.config.mjs b/examples/blog/web/tailwind.config.mjs
new file mode 100644
index 0000000..9667b43
--- /dev/null
+++ b/examples/blog/web/tailwind.config.mjs
@@ -0,0 +1,33 @@
+import typography from "@tailwindcss/typography";
+import { fontFamily } from "tailwindcss/defaultTheme";
+
+/**@type {import("tailwindcss").Config} */
+export default {
+ darkMode: "class",
+ content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"],
+ theme: {
+ backgroundSize: {
+ "gradient-dashed": "20px 2px, 100% 2px",
+ },
+ extend: {
+ boxShadow: {
+ "pacamara-shadow": "0px 25px 50px -12px rgba(0, 0, 0, 0.3)",
+ },
+ fontFamily: {
+ "pacamara-inter": ["Inter", ...fontFamily.sans],
+ "pacamara-space": ["Space Grotesk", ...fontFamily.sans],
+ },
+ colors: {
+ "pacamara-primary": "#003049",
+ "pacamara-secondary": "#B2A4FF",
+ "pacamara-accent": "#FFB4B4",
+ "pacamara-dark": "#000E14",
+ "pacamara-white": "#ffffff",
+ },
+ aspectRatio: {
+ "9/10": "9 / 16",
+ },
+ },
+ },
+ plugins: [typography],
+};
diff --git a/examples/blog/web/tsconfig.json b/examples/blog/web/tsconfig.json
new file mode 100644
index 0000000..88e9cd0
--- /dev/null
+++ b/examples/blog/web/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "compilerOptions": {
+ "strictNullChecks": true,
+ "jsx": "preserve",
+ "jsxImportSource": "solid-js",
+ "baseUrl": "./",
+ "paths": {
+ "@/*": ["./src/*"],
+ "@bindings/*": ["../../trailbase-core/bindings/*"],
+ "@schema/*": ["./types/*"]
+ }
+ },
+ "exclude": [
+ "dist",
+ "node_modules",
+ "types",
+ "public"
+ ]
+}
diff --git a/examples/blog/web/types/article.ts b/examples/blog/web/types/article.ts
new file mode 100644
index 0000000..f4927b0
--- /dev/null
+++ b/examples/blog/web/types/article.ts
@@ -0,0 +1,221 @@
+// To parse this data:
+//
+// import { Convert, Article } from "./file";
+//
+// const article = Convert.toArticle(json);
+//
+// These functions will throw an error if the JSON doesn't
+// match the expected interface, even if the JSON is valid.
+
+export interface Article {
+ author: string;
+ body: string;
+ created: number;
+ id: string;
+ image?: FileUpload;
+ intro: string;
+ tag: string;
+ title: string;
+ username: string;
+ [property: string]: any;
+}
+
+export interface FileUpload {
+ /**
+ * The file's user-provided content type.
+ */
+ content_type?: null | string;
+ /**
+ * The file's original file name.
+ */
+ filename?: null | string;
+ id: string;
+ /**
+ * The file's inferred mime type. Not user provided.
+ */
+ mime_type?: null | string;
+}
+
+// Converts JSON strings to/from your types
+// and asserts the results of JSON.parse at runtime
+export class Convert {
+ public static toArticle(json: string): Article {
+ return cast(JSON.parse(json), r("Article"));
+ }
+
+ public static articleToJson(value: Article): string {
+ return JSON.stringify(uncast(value, r("Article")), null, 2);
+ }
+}
+
+function invalidValue(typ: any, val: any, key: any, parent: any = ''): never {
+ const prettyTyp = prettyTypeName(typ);
+ const parentText = parent ? ` on ${parent}` : '';
+ const keyText = key ? ` for key "${key}"` : '';
+ throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
+}
+
+function prettyTypeName(typ: any): string {
+ if (Array.isArray(typ)) {
+ if (typ.length === 2 && typ[0] === undefined) {
+ return `an optional ${prettyTypeName(typ[1])}`;
+ } else {
+ return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
+ }
+ } else if (typeof typ === "object" && typ.literal !== undefined) {
+ return typ.literal;
+ } else {
+ return typeof typ;
+ }
+}
+
+function jsonToJSProps(typ: any): any {
+ if (typ.jsonToJS === undefined) {
+ const map: any = {};
+ typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ });
+ typ.jsonToJS = map;
+ }
+ return typ.jsonToJS;
+}
+
+function jsToJSONProps(typ: any): any {
+ if (typ.jsToJSON === undefined) {
+ const map: any = {};
+ typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ });
+ typ.jsToJSON = map;
+ }
+ return typ.jsToJSON;
+}
+
+function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any {
+ function transformPrimitive(typ: string, val: any): any {
+ if (typeof typ === typeof val) return val;
+ return invalidValue(typ, val, key, parent);
+ }
+
+ function transformUnion(typs: any[], val: any): any {
+ // val must validate against one typ in typs
+ const l = typs.length;
+ for (let i = 0; i < l; i++) {
+ const typ = typs[i];
+ try {
+ return transform(val, typ, getProps);
+ } catch (_) {}
+ }
+ return invalidValue(typs, val, key, parent);
+ }
+
+ function transformEnum(cases: string[], val: any): any {
+ if (cases.indexOf(val) !== -1) return val;
+ return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
+ }
+
+ function transformArray(typ: any, val: any): any {
+ // val must be an array with no invalid elements
+ if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
+ return val.map(el => transform(el, typ, getProps));
+ }
+
+ function transformDate(val: any): any {
+ if (val === null) {
+ return null;
+ }
+ const d = new Date(val);
+ if (isNaN(d.valueOf())) {
+ return invalidValue(l("Date"), val, key, parent);
+ }
+ return d;
+ }
+
+ function transformObject(props: { [k: string]: any }, additional: any, val: any): any {
+ if (val === null || typeof val !== "object" || Array.isArray(val)) {
+ return invalidValue(l(ref || "object"), val, key, parent);
+ }
+ const result: any = {};
+ Object.getOwnPropertyNames(props).forEach(key => {
+ const prop = props[key];
+ const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
+ result[prop.key] = transform(v, prop.typ, getProps, key, ref);
+ });
+ Object.getOwnPropertyNames(val).forEach(key => {
+ if (!Object.prototype.hasOwnProperty.call(props, key)) {
+ result[key] = transform(val[key], additional, getProps, key, ref);
+ }
+ });
+ return result;
+ }
+
+ if (typ === "any") return val;
+ if (typ === null) {
+ if (val === null) return val;
+ return invalidValue(typ, val, key, parent);
+ }
+ if (typ === false) return invalidValue(typ, val, key, parent);
+ let ref: any = undefined;
+ while (typeof typ === "object" && typ.ref !== undefined) {
+ ref = typ.ref;
+ typ = typeMap[typ.ref];
+ }
+ if (Array.isArray(typ)) return transformEnum(typ, val);
+ if (typeof typ === "object") {
+ return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
+ : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val)
+ : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val)
+ : invalidValue(typ, val, key, parent);
+ }
+ // Numbers can be parsed by Date but shouldn't be.
+ if (typ === Date && typeof val !== "number") return transformDate(val);
+ return transformPrimitive(typ, val);
+}
+
+function cast(val: any, typ: any): T {
+ return transform(val, typ, jsonToJSProps);
+}
+
+function uncast(val: T, typ: any): any {
+ return transform(val, typ, jsToJSONProps);
+}
+
+function l(typ: any) {
+ return { literal: typ };
+}
+
+function a(typ: any) {
+ return { arrayItems: typ };
+}
+
+function u(...typs: any[]) {
+ return { unionMembers: typs };
+}
+
+function o(props: any[], additional: any) {
+ return { props, additional };
+}
+
+function m(additional: any) {
+ return { props: [], additional };
+}
+
+function r(name: string) {
+ return { ref: name };
+}
+
+const typeMap: any = {
+ "Article": o([
+ { json: "author", js: "author", typ: "" },
+ { json: "body", js: "body", typ: "" },
+ { json: "created", js: "created", typ: 0 },
+ { json: "id", js: "id", typ: "" },
+ { json: "image", js: "image", typ: u(undefined, r("FileUpload")) },
+ { json: "intro", js: "intro", typ: "" },
+ { json: "tag", js: "tag", typ: "" },
+ { json: "title", js: "title", typ: "" },
+ { json: "username", js: "username", typ: "" },
+ ], "any"),
+ "FileUpload": o([
+ { json: "content_type", js: "content_type", typ: u(undefined, u(null, "")) },
+ { json: "filename", js: "filename", typ: u(undefined, u(null, "")) },
+ { json: "id", js: "id", typ: "" },
+ { json: "mime_type", js: "mime_type", typ: u(undefined, u(null, "")) },
+ ], false),
+};
diff --git a/examples/blog/web/types/new_profile.ts b/examples/blog/web/types/new_profile.ts
new file mode 100644
index 0000000..0653847
--- /dev/null
+++ b/examples/blog/web/types/new_profile.ts
@@ -0,0 +1,189 @@
+// To parse this data:
+//
+// import { Convert, NewProfile } from "./file";
+//
+// const newProfile = Convert.toNewProfile(json);
+//
+// These functions will throw an error if the JSON doesn't
+// match the expected interface, even if the JSON is valid.
+
+export interface NewProfile {
+ created?: number;
+ updated?: number;
+ user: string;
+ username: string;
+ [property: string]: any;
+}
+
+// Converts JSON strings to/from your types
+// and asserts the results of JSON.parse at runtime
+export class Convert {
+ public static toNewProfile(json: string): NewProfile {
+ return cast(JSON.parse(json), r("NewProfile"));
+ }
+
+ public static newProfileToJson(value: NewProfile): string {
+ return JSON.stringify(uncast(value, r("NewProfile")), null, 2);
+ }
+}
+
+function invalidValue(typ: any, val: any, key: any, parent: any = ''): never {
+ const prettyTyp = prettyTypeName(typ);
+ const parentText = parent ? ` on ${parent}` : '';
+ const keyText = key ? ` for key "${key}"` : '';
+ throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
+}
+
+function prettyTypeName(typ: any): string {
+ if (Array.isArray(typ)) {
+ if (typ.length === 2 && typ[0] === undefined) {
+ return `an optional ${prettyTypeName(typ[1])}`;
+ } else {
+ return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
+ }
+ } else if (typeof typ === "object" && typ.literal !== undefined) {
+ return typ.literal;
+ } else {
+ return typeof typ;
+ }
+}
+
+function jsonToJSProps(typ: any): any {
+ if (typ.jsonToJS === undefined) {
+ const map: any = {};
+ typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ });
+ typ.jsonToJS = map;
+ }
+ return typ.jsonToJS;
+}
+
+function jsToJSONProps(typ: any): any {
+ if (typ.jsToJSON === undefined) {
+ const map: any = {};
+ typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ });
+ typ.jsToJSON = map;
+ }
+ return typ.jsToJSON;
+}
+
+function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any {
+ function transformPrimitive(typ: string, val: any): any {
+ if (typeof typ === typeof val) return val;
+ return invalidValue(typ, val, key, parent);
+ }
+
+ function transformUnion(typs: any[], val: any): any {
+ // val must validate against one typ in typs
+ const l = typs.length;
+ for (let i = 0; i < l; i++) {
+ const typ = typs[i];
+ try {
+ return transform(val, typ, getProps);
+ } catch (_) {}
+ }
+ return invalidValue(typs, val, key, parent);
+ }
+
+ function transformEnum(cases: string[], val: any): any {
+ if (cases.indexOf(val) !== -1) return val;
+ return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
+ }
+
+ function transformArray(typ: any, val: any): any {
+ // val must be an array with no invalid elements
+ if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
+ return val.map(el => transform(el, typ, getProps));
+ }
+
+ function transformDate(val: any): any {
+ if (val === null) {
+ return null;
+ }
+ const d = new Date(val);
+ if (isNaN(d.valueOf())) {
+ return invalidValue(l("Date"), val, key, parent);
+ }
+ return d;
+ }
+
+ function transformObject(props: { [k: string]: any }, additional: any, val: any): any {
+ if (val === null || typeof val !== "object" || Array.isArray(val)) {
+ return invalidValue(l(ref || "object"), val, key, parent);
+ }
+ const result: any = {};
+ Object.getOwnPropertyNames(props).forEach(key => {
+ const prop = props[key];
+ const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
+ result[prop.key] = transform(v, prop.typ, getProps, key, ref);
+ });
+ Object.getOwnPropertyNames(val).forEach(key => {
+ if (!Object.prototype.hasOwnProperty.call(props, key)) {
+ result[key] = transform(val[key], additional, getProps, key, ref);
+ }
+ });
+ return result;
+ }
+
+ if (typ === "any") return val;
+ if (typ === null) {
+ if (val === null) return val;
+ return invalidValue(typ, val, key, parent);
+ }
+ if (typ === false) return invalidValue(typ, val, key, parent);
+ let ref: any = undefined;
+ while (typeof typ === "object" && typ.ref !== undefined) {
+ ref = typ.ref;
+ typ = typeMap[typ.ref];
+ }
+ if (Array.isArray(typ)) return transformEnum(typ, val);
+ if (typeof typ === "object") {
+ return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
+ : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val)
+ : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val)
+ : invalidValue(typ, val, key, parent);
+ }
+ // Numbers can be parsed by Date but shouldn't be.
+ if (typ === Date && typeof val !== "number") return transformDate(val);
+ return transformPrimitive(typ, val);
+}
+
+function cast(val: any, typ: any): T {
+ return transform(val, typ, jsonToJSProps);
+}
+
+function uncast(val: T, typ: any): any {
+ return transform(val, typ, jsToJSONProps);
+}
+
+function l(typ: any) {
+ return { literal: typ };
+}
+
+function a(typ: any) {
+ return { arrayItems: typ };
+}
+
+function u(...typs: any[]) {
+ return { unionMembers: typs };
+}
+
+function o(props: any[], additional: any) {
+ return { props, additional };
+}
+
+function m(additional: any) {
+ return { props: [], additional };
+}
+
+function r(name: string) {
+ return { ref: name };
+}
+
+const typeMap: any = {
+ "NewProfile": o([
+ { json: "created", js: "created", typ: u(undefined, 0) },
+ { json: "updated", js: "updated", typ: u(undefined, 0) },
+ { json: "user", js: "user", typ: "" },
+ { json: "username", js: "username", typ: "" },
+ ], "any"),
+};
diff --git a/examples/blog/web/types/profile.ts b/examples/blog/web/types/profile.ts
new file mode 100644
index 0000000..c8cd83a
--- /dev/null
+++ b/examples/blog/web/types/profile.ts
@@ -0,0 +1,193 @@
+// To parse this data:
+//
+// import { Convert, Profile } from "./file";
+//
+// const profile = Convert.toProfile(json);
+//
+// These functions will throw an error if the JSON doesn't
+// match the expected interface, even if the JSON is valid.
+
+export interface Profile {
+ avatar_url?: string;
+ created: number;
+ is_editor?: boolean;
+ updated: number;
+ user: string;
+ username: string;
+ [property: string]: any;
+}
+
+// Converts JSON strings to/from your types
+// and asserts the results of JSON.parse at runtime
+export class Convert {
+ public static toProfile(json: string): Profile {
+ return cast(JSON.parse(json), r("Profile"));
+ }
+
+ public static profileToJson(value: Profile): string {
+ return JSON.stringify(uncast(value, r("Profile")), null, 2);
+ }
+}
+
+function invalidValue(typ: any, val: any, key: any, parent: any = ''): never {
+ const prettyTyp = prettyTypeName(typ);
+ const parentText = parent ? ` on ${parent}` : '';
+ const keyText = key ? ` for key "${key}"` : '';
+ throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
+}
+
+function prettyTypeName(typ: any): string {
+ if (Array.isArray(typ)) {
+ if (typ.length === 2 && typ[0] === undefined) {
+ return `an optional ${prettyTypeName(typ[1])}`;
+ } else {
+ return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
+ }
+ } else if (typeof typ === "object" && typ.literal !== undefined) {
+ return typ.literal;
+ } else {
+ return typeof typ;
+ }
+}
+
+function jsonToJSProps(typ: any): any {
+ if (typ.jsonToJS === undefined) {
+ const map: any = {};
+ typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ });
+ typ.jsonToJS = map;
+ }
+ return typ.jsonToJS;
+}
+
+function jsToJSONProps(typ: any): any {
+ if (typ.jsToJSON === undefined) {
+ const map: any = {};
+ typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ });
+ typ.jsToJSON = map;
+ }
+ return typ.jsToJSON;
+}
+
+function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any {
+ function transformPrimitive(typ: string, val: any): any {
+ if (typeof typ === typeof val) return val;
+ return invalidValue(typ, val, key, parent);
+ }
+
+ function transformUnion(typs: any[], val: any): any {
+ // val must validate against one typ in typs
+ const l = typs.length;
+ for (let i = 0; i < l; i++) {
+ const typ = typs[i];
+ try {
+ return transform(val, typ, getProps);
+ } catch (_) {}
+ }
+ return invalidValue(typs, val, key, parent);
+ }
+
+ function transformEnum(cases: string[], val: any): any {
+ if (cases.indexOf(val) !== -1) return val;
+ return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
+ }
+
+ function transformArray(typ: any, val: any): any {
+ // val must be an array with no invalid elements
+ if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
+ return val.map(el => transform(el, typ, getProps));
+ }
+
+ function transformDate(val: any): any {
+ if (val === null) {
+ return null;
+ }
+ const d = new Date(val);
+ if (isNaN(d.valueOf())) {
+ return invalidValue(l("Date"), val, key, parent);
+ }
+ return d;
+ }
+
+ function transformObject(props: { [k: string]: any }, additional: any, val: any): any {
+ if (val === null || typeof val !== "object" || Array.isArray(val)) {
+ return invalidValue(l(ref || "object"), val, key, parent);
+ }
+ const result: any = {};
+ Object.getOwnPropertyNames(props).forEach(key => {
+ const prop = props[key];
+ const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
+ result[prop.key] = transform(v, prop.typ, getProps, key, ref);
+ });
+ Object.getOwnPropertyNames(val).forEach(key => {
+ if (!Object.prototype.hasOwnProperty.call(props, key)) {
+ result[key] = transform(val[key], additional, getProps, key, ref);
+ }
+ });
+ return result;
+ }
+
+ if (typ === "any") return val;
+ if (typ === null) {
+ if (val === null) return val;
+ return invalidValue(typ, val, key, parent);
+ }
+ if (typ === false) return invalidValue(typ, val, key, parent);
+ let ref: any = undefined;
+ while (typeof typ === "object" && typ.ref !== undefined) {
+ ref = typ.ref;
+ typ = typeMap[typ.ref];
+ }
+ if (Array.isArray(typ)) return transformEnum(typ, val);
+ if (typeof typ === "object") {
+ return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
+ : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val)
+ : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val)
+ : invalidValue(typ, val, key, parent);
+ }
+ // Numbers can be parsed by Date but shouldn't be.
+ if (typ === Date && typeof val !== "number") return transformDate(val);
+ return transformPrimitive(typ, val);
+}
+
+function cast(val: any, typ: any): T {
+ return transform(val, typ, jsonToJSProps);
+}
+
+function uncast(val: T, typ: any): any {
+ return transform(val, typ, jsToJSONProps);
+}
+
+function l(typ: any) {
+ return { literal: typ };
+}
+
+function a(typ: any) {
+ return { arrayItems: typ };
+}
+
+function u(...typs: any[]) {
+ return { unionMembers: typs };
+}
+
+function o(props: any[], additional: any) {
+ return { props, additional };
+}
+
+function m(additional: any) {
+ return { props: [], additional };
+}
+
+function r(name: string) {
+ return { ref: name };
+}
+
+const typeMap: any = {
+ "Profile": o([
+ { json: "avatar_url", js: "avatar_url", typ: u(undefined, "") },
+ { json: "created", js: "created", typ: 0 },
+ { json: "is_editor", js: "is_editor", typ: u(undefined, true) },
+ { json: "updated", js: "updated", typ: 0 },
+ { json: "user", js: "user", typ: "" },
+ { json: "username", js: "username", typ: "" },
+ ], "any"),
+};
diff --git a/examples/custom-binary/Cargo.toml b/examples/custom-binary/Cargo.toml
new file mode 100644
index 0000000..2030a5e
--- /dev/null
+++ b/examples/custom-binary/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "custom-binary"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+axum = { version = "^0.7.5" }
+env_logger = "^0.11.3"
+tokio = { version = "^1.38.0", features=["macros", "rt-multi-thread"] }
+tracing-subscriber = "0.3.18"
+trailbase-core = { path = "../../trailbase-core" }
diff --git a/examples/custom-binary/src/main.rs b/examples/custom-binary/src/main.rs
new file mode 100644
index 0000000..ecd5863
--- /dev/null
+++ b/examples/custom-binary/src/main.rs
@@ -0,0 +1,63 @@
+use axum::{
+ extract::State,
+ response::{Html, IntoResponse, Response},
+ routing::{get, Router},
+};
+use tracing_subscriber::{filter, prelude::*};
+use trailbase_core::{AppState, Server, ServerOptions, User};
+
+type BoxError = Box;
+
+pub async fn handler(State(_state): State, user: Option) -> Response {
+ Html(format!(
+ "
Hello, {}!
",
+ user.map_or("World".to_string(), |user| user.email)
+ ))
+ .into_response()
+}
+
+#[tokio::main]
+async fn main() -> Result<(), BoxError> {
+ env_logger::init_from_env(
+ env_logger::Env::new().default_filter_or("info,trailbase_core=debug,refinery_core=warn"),
+ );
+
+ let custom_routes: Router = Router::new().route("/", get(handler));
+
+ let app = Server::init_with_custom_routes_and_initializer(
+ ServerOptions {
+ address: "localhost:4004".to_string(),
+ ..Default::default()
+ },
+ Some(custom_routes),
+ |state: AppState| async move {
+ println!("Data dir: {:?}", state.data_dir());
+ Ok(())
+ },
+ )
+ .await?;
+
+ let filter = || {
+ filter::Targets::new()
+ .with_target("tower_http::trace::on_response", filter::LevelFilter::DEBUG)
+ .with_target("tower_http::trace::on_request", filter::LevelFilter::DEBUG)
+ .with_target("tower_http::trace::make_span", filter::LevelFilter::DEBUG)
+ .with_default(filter::LevelFilter::INFO)
+ };
+
+ // This declares **where** tracing is being logged to, e.g. stderr, file, sqlite.
+ let layer = tracing_subscriber::registry()
+ .with(trailbase_core::logging::SqliteLogLayer::new(app.state()).with_filter(filter()));
+
+ let _ = layer
+ .with(
+ tracing_subscriber::fmt::layer()
+ .compact()
+ .with_filter(filter()),
+ )
+ .try_init();
+
+ app.serve().await?;
+
+ return Ok(());
+}
diff --git a/examples/tutorial/Makefile b/examples/tutorial/Makefile
new file mode 100644
index 0000000..ef9dede
--- /dev/null
+++ b/examples/tutorial/Makefile
@@ -0,0 +1,4 @@
+clean:
+ rm -rf traildepot/data
+
+.PHONY: clean
diff --git a/examples/tutorial/README.md b/examples/tutorial/README.md
new file mode 100644
index 0000000..6788d69
--- /dev/null
+++ b/examples/tutorial/README.md
@@ -0,0 +1,152 @@
+# TrailBase Tutorial
+
+In this tutorial, we'll set up a database with an IMDB test dataset, spin up
+TrailBase and write a small program to access the data.
+
+In an effort to demonstrate TrailBase's loose coupling and the possibility of
+simply trying out TrailBase with an existing SQLite-based data analysis
+project, we will also offer a alternative path to bootstrapping the database
+using the vanilla `sqlite3` CLI.
+
+## Create the Schema
+
+By simply starting TrailBase, the migrations in `traildepot/migrations` will be
+applied, including `U1728810800__create_table_movies.sql`:
+
+```sql
+CREATE TABLE movies IF NOT EXISTS (
+ rank INTEGER PRIMARY KEY,
+ name TEXT NOT NULL,
+ year ANY NOT NULL,
+ watch_time INTEGER NOT NULL,
+ rating REAL NOT NULL,
+ metascore ANY,
+ gross ANY,
+ votes TEXT NOT NULL,
+ description TEXT NOT NULL
+) STRICT;
+```
+
+Note that the only schema requirement for exposing an API is: `STRICT` typing
+and an integer (or UUIDv7) primary key column.
+
+The main benefit of relying on TrailBase to apply the above schema as migrations
+over manually applying the schema yourself, is to:
+ * document your database's schema alongside your code and
+ * even more importantly, letting TrailBase bootstrap from scratch and
+ sync-up databases across your dev setup, your colleague's, every time
+ integration tests run, QA stages, and in production.
+
+That said, TrailBase will happily work on existing datasets, in which
+case it is your responsibility to provide a SQLite database file that
+meets expectations expressed as configured TrailBase API endpoints.
+
+Feel free to run:
+
+```bash
+$ mkdir traildepot/data
+$ sqlite3 traildepot/data/main.db < traildepot/migrations/U1728810800__create_table_movies.sql
+```
+
+before starting TrailBase the first time, if you prefer bootstrapping the
+database yourself.
+
+## Importing the Data
+
+After creating the schema above, either manually or starting TrailBase to apply
+migrations, we're ready to import the IMDB test dataset.
+We could now expose an API endpoint and write a small program to first read the
+CSV file to then write movie database records... and we'll do that in a little
+later.
+For now, let's start by harnessing the fact that SQLite databases are simply a
+local file and import the data using the `sqlite3` CLI side-stepping TrailBase:
+
+```
+$ sqlite3 traildepot/data/main.db
+sqlite> .mode csv
+sqlite> .import ./data/Top_1000_IMDb_movies_New_version.csv movies
+```
+
+There will be a warning for the first line of the CSV, which contains textual
+table headers rather than data matching our schema. That's expected.
+We can validate that we successfully imported 1000 movies by running:
+
+```sql
+sqlite> SELECT COUNT(*) FROM movies;
+1000
+```
+
+## Accessing the Data
+
+With TrailBase up and running (`trail run`), the easiest way to explore your
+data is go to the admin dashboard under
+[http://localhost:4000](http://localhost:4000)
+and log in with the admin credentials provided to you in the terminal upon
+first start (you can also use the `trail` CLI to reset the password `trail user
+reset-password admin@localhost`).
+
+In this tutorial we want to explore more programmatic access and using
+TrailBase record APIs.
+
+```textproto
+record_apis: [
+ # ...
+ {
+ name: "movies"
+ table_name: "movies"
+ acl_world: [READ]
+ acl_authenticated: [CREATE, READ, UPDATE, DELETE]
+ }
+]
+```
+
+By adding the above snippet to your configuration (which is already the case
+for the checked-in configuration) you expose a world-readable API. We're using
+the config here but you can also configure the API using the admin dashboard
+via the
+[tables view](http://localhost:4000/_/admin/tables?pageIndex=0&pageSize=20&table=movies)
+and the "Record API" settings in the top right.
+
+Let's try it out by querying the top-3 ranked movies with less than 120min
+watch time:
+
+```bash
+curl -g 'localhost:4000/api/records/v1/movies?limit=3&order=rank&watch_time[lt]=120'
+```
+
+You can also use your browser. Either way, you should see some JSON output with
+the respective movies.
+
+## Type-safe APIs and Mutations
+
+Finally, let's authenticate and use privileged APIs to first delete all movies
+and then add them pack using type-safe APIs rather than `sqlite3`.
+
+Let's first create the JSON Schema type definitions from the database schema we
+added above. Note, that the type definition for creation, reading, and updating
+are all different. Creating a new record requires values for all `NOT NULL`
+columns w/o a default value, while reads guarantees values for all `NOT NULL`
+columns, and updates only require values for columns that are being updated.
+In this tutorial we'll "cheat" by using the same type definition for reading
+existing and creating new records, since our schema doesn't define any default
+values (except implicitly for the primary key), they're almost identical.
+
+In preparation for deleting and re-adding the movies, let's run:
+
+```bash
+$ trail schema movies --mode insert
+```
+
+This will output a standard JSON schema type definition file. There's quite a few
+code-generators you can use to generate bindings for your favorite language.
+For this example we'll use *quicktype* to generate *TypeScript* definitions,
+which also happens to support some other ~25 languages. You can install it, but
+for the tutorial we'll stick with the [browser](https://app.quicktype.io/)
+version and copy&paste the JSON schema from above.
+
+With the generated types, we can use the TrailBase TypeScript client to write
+the following program:
+
+```ts
+# scripts/src/fill.ts
+```
diff --git a/examples/tutorial/data/README.md b/examples/tutorial/data/README.md
new file mode 100644
index 0000000..70dfe4e
--- /dev/null
+++ b/examples/tutorial/data/README.md
@@ -0,0 +1,35 @@
+# About the Dataset.
+
+This dataset was originally compiled from [IMDB
+data](https://developer.imdb.com/non-commercial-datasets/) and is subject to
+their terms of use and any applicable legal restrictions..
+
+The compilation is provided by
+[kaggle](https://www.kaggle.com/datasets/inductiveanks/top-1000-imdb-movies-dataset/data)
+and can be downloaded via:
+
+```bash
+curl -o archive.zip https://www.kaggle.com/api/v1/datasets/download/inductiveanks/top-1000-imdb-movies-dataset
+```
+
+## Schema
+
+```sql
+CREATE TABLE movies (
+ rank INTEGER PRIMARY KEY,
+ name TEXT NOT NULL,
+
+ -- Year cannot be INTEGER, since some are like "I 2016".
+ year ANY NOT NULL,
+ watch_time INTEGER NOT NULL, -- in minutes
+ rating REAL NOT NULL,
+
+ -- Ideally nullable integer, however sqlite assumes empty to be text.
+ metascore ANY,
+
+ -- Ideally nullable real, however sqlite assumes empty to be text.
+ gross ANY,
+ votes TEXT NOT NULL,
+ description TEXT NOT NULL
+) STRICT;
+```
diff --git a/examples/tutorial/data/Top_1000_IMDb_movies_New_version.csv b/examples/tutorial/data/Top_1000_IMDb_movies_New_version.csv
new file mode 100644
index 0000000..1aee012
--- /dev/null
+++ b/examples/tutorial/data/Top_1000_IMDb_movies_New_version.csv
@@ -0,0 +1,1001 @@
+Rank,Movie Name,Year of Release,Watch Time,Movie Rating,Metascore of movie,Gross,Votes,Description
+0,The Shawshank Redemption,1994,142,9.3,82,28.34,"27,77,378","Over the course of several years, two convicts form a friendship, seeking consolation and, eventually, redemption through basic compassion."
+1,The Godfather,1972,175,9.2,100,134.97,"19,33,588","Don Vito Corleone, head of a mafia family, decides to hand over his empire to his youngest son Michael. However, his decision unintentionally puts the lives of his loved ones in grave danger."
+2,The Dark Knight,2008,152,9,84,534.86,"27,54,087","When the menace known as the Joker wreaks havoc and chaos on the people of Gotham, Batman must accept one of the greatest psychological and physical tests of his ability to fight injustice."
+3,Schindler's List,1993,195,9,95,96.9,"13,97,886","In German-occupied Poland during World War II, industrialist Oskar Schindler gradually becomes concerned for his Jewish workforce after witnessing their persecution by the Nazis."
+4,12 Angry Men,1957,96,9,97,4.36,"8,24,211",The jury in a New York City murder trial is frustrated by a single member whose skeptical caution forces them to more carefully consider the evidence before jumping to a hasty verdict.
+5,The Lord of the Rings: The Return of the King,2003,201,9,94,377.85,"19,04,166",Gandalf and Aragorn lead the World of Men against Sauron's army to draw his gaze from Frodo and Sam as they approach Mount Doom with the One Ring.
+6,The Godfather Part II,1974,202,9,90,57.3,"13,14,609","The early life and career of Vito Corleone in 1920s New York City is portrayed, while his son, Michael, expands and tightens his grip on the family crime syndicate."
+7,Spider-Man: Across the Spider-Verse,2023,140,8.9,86,15,"1,98,031","Miles Morales catapults across the Multiverse, where he encounters a team of Spider-People charged with protecting its very existence. When the heroes clash on how to handle a new threat, Miles must redefine what it means to be a hero."
+8,Pulp Fiction,1994,154,8.9,95,107.93,"21,31,189","The lives of two mob hitmen, a boxer, a gangster and his wife, and a pair of diner bandits intertwine in four tales of violence and redemption."
+9,Inception,2010,148,8.8,74,292.58,"24,44,816","A thief who steals corporate secrets through the use of dream-sharing technology is given the inverse task of planting an idea into the mind of a C.E.O., but his tragic past may doom the project and his team to disaster."
+10,Fight Club,1999,139,8.8,67,37.03,"22,12,960",An insomniac office worker and a devil-may-care soap maker form an underground fight club that evolves into much more.
+11,The Lord of the Rings: The Fellowship of the Ring,2001,178,8.8,92,315.54,"19,32,439",A meek Hobbit from the Shire and eight companions set out on a journey to destroy the powerful One Ring and save Middle-earth from the Dark Lord Sauron.
+12,Forrest Gump,1994,142,8.8,82,330.25,"21,60,038","The history of the United States from the 1950s to the '70s unfolds from the perspective of an Alabama man with an IQ of 75, who yearns to be reunited with his childhood sweetheart."
+13,"Il buono, il brutto, il cattivo",1966,161,8.8,90,6.1,"7,84,276",A bounty hunting scam joins two men in an uneasy alliance against a third in a race to find a fortune in gold buried in a remote cemetery.
+14,The Lord of the Rings: The Two Towers,2002,179,8.8,87,342.55,"17,18,332","While Frodo and Sam edge closer to Mordor with the help of the shifty Gollum, the divided fellowship makes a stand against Sauron's new ally, Saruman, and his hordes of Isengard."
+15,Jai Bhim,2021,164,8.8,,219,"2,08,742","When a tribal man is arrested for a case of alleged theft, his wife turns to a human-rights lawyer to help bring justice."
+16,777 Charlie,2022,136,8.8,,,"35,870",Dharma is stuck in a rut with his negative and lonely lifestyle and spends each day in the comfort of his loneliness. A pup named Charlie enters his life and gives him a new perspective towards it.
+17,Oppenheimer,2023,180,8.7,88,29,"2,66,774","The story of American scientist, J. Robert Oppenheimer, and his role in the development of the atomic bomb."
+18,Interstellar,2014,169,8.7,74,188.02,"19,56,197","When Earth becomes uninhabitable in the future, a farmer and ex-NASA pilot, Joseph Cooper, is tasked to pilot a spacecraft, along with a team of researchers, to find a new planet for humans."
+19,GoodFellas,1990,145,8.7,92,46.84,"12,05,052","The story of Henry Hill and his life in the mafia, covering his relationship with his wife Karen and his mob partners Jimmy Conway and Tommy DeVito."
+20,One Flew Over the Cuckoo's Nest,1975,133,8.7,84,112,"10,37,205","In the Fall of 1963, a Korean War veteran and criminal pleads insanity and is admitted to a mental institution, where he rallies up the scared patients against the tyrannical nurse."
+21,The Matrix,1999,136,8.7,73,171.48,"19,76,616","When a beautiful stranger leads computer hacker Neo to a forbidding underworld, he discovers the shocking truth--the life he knows is the elaborate deception of an evil cyber-intelligence."
+22,Star Wars: Episode V - The Empire Strikes Back,1980,124,8.7,82,290.48,"13,33,333","After the Rebels are overpowered by the Empire, Luke Skywalker begins his Jedi training with Yoda, while his friends are pursued across the galaxy by Darth Vader and bounty hunter Boba Fett."
+23,Rocketry: The Nambi Effect,2022,157,8.7,,,"54,505","Based on the life of Indian Space Research Organization scientist Nambi Narayanan, who was framed for being a spy and arrested in 1994. Though free, he continues to fight for justice against the officials who falsely implicated him."
+24,Soorarai Pottru,2020,153,8.7,,,"1,20,200","Nedumaaran Rajangam ""Maara"" sets out to make the common man fly and in the process takes on the world's most capital intensive industry and several enemies who stand in his way."
+25,Se7en,1995,127,8.6,65,100.13,"17,18,303","Two detectives, a rookie and a veteran, hunt a serial killer who uses the seven deadly sins as his motives."
+26,Saving Private Ryan,1998,169,8.6,91,216.54,"14,38,634","Following the Normandy Landings, a group of U.S. soldiers go behind enemy lines to retrieve a paratrooper whose brothers have been killed in action."
+27,The Silence of the Lambs,1991,118,8.6,86,130.74,"14,81,889","A young F.B.I. cadet must receive the help of an incarcerated and manipulative cannibal killer to help catch another serial killer, a madman who skins his victims."
+28,Terminator 2: Judgment Day,1991,137,8.6,75,204.84,"11,34,147","A cyborg, identical to the one who failed to kill Sarah Connor, must now protect her ten year old son John from an even more advanced and powerful cyborg."
+29,The Green Mile,1999,189,8.6,61,136.8,"13,49,946","A tale set on death row in a Southern jail, where gentle giant John possesses the mysterious power to heal people's ailments. When the lead guard, Paul, recognizes John's gift, he tries to help stave off the condemned man's execution."
+30,Star Wars,1977,121,8.6,90,322.74,"14,05,392","Luke Skywalker joins forces with a Jedi Knight, a cocky pilot, a Wookiee and two droids to save the galaxy from the Empire's world-destroying battle station, while also attempting to rescue Princess Leia from the mysterious Darth Vader."
+31,Cidade de Deus,2002,130,8.6,79,7.56,"7,77,054","In the slums of Rio, two kids' paths diverge as one struggles to become a photographer and the other a kingpin."
+32,Sen to Chihiro no kamikakushi,2001,125,8.6,96,10.06,"8,01,486","During her family's move to the suburbs, a sullen 10-year-old girl wanders into a world ruled by gods, witches and spirits, a world where humans are changed into beasts."
+33,La vita è bella,1997,116,8.6,59,57.6,"7,17,512","When an open-minded Jewish waiter and his son become victims of the Holocaust, he uses a perfect mixture of will, humor and imagination to protect his son from the dangers around their camp."
+34,Shichinin no samurai,1954,207,8.6,98,0.27,"3,55,780","Farmers from a village exploited by bandits hire a veteran samurai for protection, who gathers six other samurai to join him."
+35,It's a Wonderful Life,1946,130,8.6,89,21,"4,76,152",An angel is sent from Heaven to help a desperately frustrated businessman by showing him what life would have been like if he had never existed.
+36,Seppuku,1962,133,8.6,85,47,"62,597","When a ronin requesting seppuku at a feudal lord's palace is told of the brutal suicide of another ronin who previously visited, he reveals how their pasts are intertwined - and in doing so challenges the clan's integrity."
+37,Sita Ramam,2022,163,8.6,,,"61,758","An orphan soldier, Lieutenant Ram's life changes, after he gets a letter from a girl named Sita. He meets her and love blossoms between them. When he comes back to his camp in Kashmir,After he gets caught in jail, he sends a letter to Sita which won't reach her."
+38,The Prestige,2006,130,8.5,66,53.09,"13,82,402","After a tragic accident, two stage magicians in 1890s London engage in a battle to create the ultimate illusion while sacrificing everything they have to outwit each other."
+39,Back to the Future,1985,116,8.5,87,210.61,"12,53,518","Marty McFly, a 17-year-old high school student, is accidentally sent 30 years into the past in a time-traveling DeLorean invented by his close friend, the maverick scientist Doc Brown."
+40,Gisaengchung,2019,132,8.5,96,53.37,"8,73,956",Greed and class discrimination threaten the newly formed symbiotic relationship between the wealthy Park family and the destitute Kim clan.
+41,Gladiator,2000,155,8.5,67,187.71,"15,50,619",A former Roman General sets out to exact vengeance against the corrupt emperor who murdered his family and sent him into slavery.
+42,The Departed,2006,151,8.5,85,132.38,"13,69,934",An undercover cop and a mole in the police attempt to identify each other while infiltrating an Irish gang in South Boston.
+43,Alien,1979,117,8.5,89,78.9,"9,12,280",The crew of a commercial spacecraft encounters a deadly lifeform after investigating an unknown transmission.
+44,Whiplash,2014,106,8.5,89,13.09,"9,20,655",A promising young drummer enrolls at a cut-throat music conservatory where his dreams of greatness are mentored by an instructor who will stop at nothing to realize a student's potential.
+45,Léon,1994,110,8.5,64,19.5,"12,00,839","12-year-old Mathilda is reluctantly taken in by Léon, a professional assassin, after her family is murdered. An unusual relationship forms as she becomes his protégée and learns the assassin's trade."
+46,The Pianist,2002,150,8.5,85,32.57,"8,67,989",A Polish Jewish musician struggles to survive the destruction of the Warsaw ghetto of World War II.
+47,The Usual Suspects,1995,106,8.5,77,23.34,"11,12,608",The sole survivor of a pier shoot-out tells the story of how a notorious criminal influenced the events that began with five criminals meeting in a seemingly random police lineup.
+48,The Lion King,1994,88,8.5,88,422.78,"10,97,285","Lion prince Simba and his father are targeted by his bitter uncle, who wants to ascend the throne himself."
+49,American History X,1998,119,8.5,62,6.72,"11,51,761","Living a life marked by violence, neo-Nazi Derek finally goes to prison after killing two black youths. Upon his release, Derek vows to change; he hopes to prevent his brother, Danny, who idolizes Derek, from following in his footsteps."
+50,Hotaru no haka,1988,89,8.5,94,46,"2,91,861",A young boy and his little sister struggle to survive in Japan during World War II.
+51,The Intouchables,2011,112,8.5,57,13.18,"8,90,758","After he becomes a quadriplegic from a paragliding accident, an aristocrat hires a young man from the projects to be his caregiver."
+52,Psycho,1960,109,8.5,97,32,"6,93,868","A Phoenix secretary embezzles $40,000 from her employer's client, goes on the run and checks into a remote motel run by a young man under the domination of his mother."
+53,Casablanca,1942,102,8.5,100,1.02,"5,88,497",A cynical expatriate American cafe owner struggles to decide whether or not to help his former lover and her fugitive husband escape the Nazis in French Morocco.
+54,Once Upon a Time in the West,1968,165,8.5,82,5.32,"3,39,755",A mysterious stranger with a harmonica joins forces with a notorious desperado to protect a beautiful widow from a ruthless assassin working for the railroad.
+55,Rear Window,1954,112,8.5,100,36.76,"5,05,881","A photographer in a wheelchair spies on his neighbors from his Greenwich Village courtyard apartment window, and becomes convinced one of them has committed murder, despite the skepticism of his fashion-model girlfriend."
+56,Nuovo Cinema Paradiso,1988,155,8.5,80,11.99,"2,71,463",A filmmaker recalls his childhood when falling in love with the pictures at the cinema of his home village and forms a deep friendship with the cinema's projectionist.
+57,City Lights,1931,87,8.5,99,0.02,"1,90,158","With the aid of a wealthy erratic tippler, a dewy-eyed tramp who has fallen in love with a sightless flower girl accumulates money to be able to help her medically."
+58,Modern Times,1936,87,8.5,96,0.16,"2,50,746",The Tramp struggles to live in modern industrial society with the help of a young homeless woman.
+59,96,II 2018,158,8.5,,,"33,646",Two high school sweethearts meet at a reunion after 22 years and reminisce about their past.
+60,Memento,2000,113,8.4,83,25.54,"12,77,091",A man with short-term memory loss attempts to track down his wife's murderer.
+61,The Dark Knight Rises,2012,164,8.4,78,448.14,"17,61,545","Eight years after the Joker's reign of chaos, Batman is coerced out of exile with the assistance of the mysterious Selina Kyle in order to defend Gotham City from the vicious guerrilla terrorist Bane."
+62,Spider-Man: Into the Spider-Verse,2018,117,8.4,87,190.24,"6,15,401",Teen Miles Morales becomes the Spider-Man of his universe and must join with five spider-powered individuals from other dimensions to stop a threat for all realities.
+63,Raiders of the Lost Ark,1981,115,8.4,85,248.16,"10,06,763","In 1936, archaeologist and adventurer Indiana Jones is hired by the U.S. government to find the Ark of the Covenant before the Nazis can obtain its awesome powers."
+64,Django Unchained,2012,165,8.4,81,162.81,"16,19,946","With the help of a German bounty-hunter, a freed slave sets out to rescue his wife from a brutal plantation owner in Mississippi."
+65,Joker,I 2019,122,8.4,59,335.45,"13,81,002","The rise of Arthur Fleck, from aspiring stand-up comedian and pariah to Gotham's clown prince and leader of the revolution."
+66,Avengers: Endgame,2019,181,8.4,78,858.37,"12,00,821","After the devastating events of Avengers: Infinity War (2018), the universe is in ruins. With the help of remaining allies, the Avengers assemble once more in order to reverse Thanos' actions and restore balance to the universe."
+67,The Shining,1980,146,8.4,66,44.02,"10,60,625","A family heads to an isolated hotel for the winter where a sinister presence influences the father into violence, while his psychic son sees horrific forebodings from both past and future."
+68,Aliens,1986,137,8.4,84,85.16,"7,38,697","Decades after surviving the Nostromo incident, Ellen Ripley is sent out to re-establish contact with a terraforming colony but finds herself battling the Alien Queen and her offspring."
+69,Oldeuboi,2003,101,8.4,77,0.71,"6,03,564","After being kidnapped and imprisoned for fifteen years, Oh Dae-Su is released, only to find that he must find his captor in five days."
+70,Avengers: Infinity War,2018,149,8.4,68,678.82,"11,42,664",The Avengers and their allies must be willing to sacrifice all in an attempt to defeat the powerful Thanos before his blitz of devastation and ruin puts an end to the universe.
+71,Apocalypse Now,1979,147,8.4,94,83.47,"6,87,709",A U.S. Army officer serving in Vietnam is tasked with assassinating a renegade Special Forces Colonel who sees himself as a god.
+72,Amadeus,1984,160,8.4,87,51.97,"4,13,533","The life, success and troubles of Wolfgang Amadeus Mozart, as told by Antonio Salieri, the contemporaneous composer who was deeply jealous of Mozart's talent and claimed to have murdered him."
+73,Idi i smotri,1985,142,8.4,,91,"88,282","After finding an old rifle, a young boy joins the Soviet resistance movement against ruthless German forces and experiences the horrors of World War II."
+74,Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb,1964,95,8.4,97,0.28,"5,03,942","An insane American general orders a bombing attack on the Soviet Union, triggering a path to nuclear holocaust that a war room full of politicians and generals frantically tries to stop."
+75,The Lives of Others,2006,137,8.4,89,11.29,"3,99,279","In 1984 East Berlin, an agent of the secret police, conducting surveillance on a writer and his lover, finds himself becoming increasingly absorbed by their lives."
+76,Kimi no na wa.,2016,106,8.4,81,5.02,"2,93,932","Two teenagers share a profound, magical connection upon discovering they are swapping bodies. Things manage to become even more complicated when the boy and girl decide to meet in person."
+77,Coco,I 2017,105,8.4,81,209.73,"5,46,380","Aspiring musician Miguel, confronted with his family's ancestral ban on music, enters the Land of the Dead to find his great-great-grandfather, a legendary singer."
+78,WALL·E,2008,98,8.4,95,223.81,"11,55,638","In the distant future, a small waste-collecting robot inadvertently embarks on a space journey that will ultimately decide the fate of mankind."
+79,Capharnaüm,2018,126,8.4,75,1.66,"97,339","While serving a five-year sentence for a violent crime, a 12-year-old boy sues his parents for neglect."
+80,3 Idiots,2009,170,8.4,67,6.53,"4,15,008","Two friends are searching for their long lost companion. They revisit their college days and recall the memories of their friend who inspired them to think differently, even as the rest of the world called them ""idiots""."
+81,Das Boot,1981,149,8.4,86,11.49,"2,57,484",A German U-boat stalks the frigid waters of the North Atlantic as its young crew experience the sheer terror and claustrophobic life of a submariner in World War II.
+82,Paths of Glory,1957,88,8.4,90,62,"2,04,364","After refusing to attack an enemy position, a general accuses the soldiers of cowardice and their commanding officer must defend them."
+83,Sunset Blvd.,1950,110,8.4,94,61,"2,28,990",A screenwriter develops a dangerous relationship with a faded film star determined to make a triumphant return.
+84,Witness for the Prosecution,1957,116,8.4,76,8.18,"1,31,199",A veteran British barrister must defend his client in a murder trial that has surprise after surprise.
+85,The Great Dictator,1940,125,8.4,,0.29,"2,30,579",Dictator Adenoid Hynkel tries to expand his empire while a poor Jewish barber tries to avoid persecution from Hynkel's regime.
+86,Tengoku to jigoku,1963,143,8.4,90,87,"48,880",An executive of a Yokohama shoe company becomes a victim of extortion when his chauffeur's son is kidnapped by mistake and held for ransom.
+87,Kaithi,2019,145,8.4,,,"36,952","Dilli, an ex-convict, endeavours to meet his daughter for the first time after leaving prison. However, his attempts are interrupted due to a drug raid planned by Inspector Bejoy."
+88,Sardar Udham,2021,164,8.4,,,"44,711","A biopic detailing the 2 decades that Punjabi Sikh revolutionary, Udham Singh, spent planning the assassination of the man responsible for the Jallianwala Bagh massacre."
+89,Asuran,2019,141,8.4,,,"31,622","The teenage son of a farmer from an underprivileged caste kills a rich, upper caste landlord. How the pacifist farmer saves his hot-blooded son is the rest of the story."
+90,Drishyam 2,2021,152,8.4,,,"39,387",A gripping tale of an investigation and a family which is threatened by it. Will Georgekutty be able to protect his family this time?
+91,Top Gun: Maverick,2022,130,8.3,78,718.73,"6,16,792","After thirty years, Maverick is still pushing the envelope as a top naval aviator, but must confront ghosts of his past when he leads TOP GUN's elite graduates on a mission that demands the ultimate sacrifice from those chosen to fly it."
+92,Braveheart,1995,178,8.3,68,75.6,"10,62,862",Scottish warrior William Wallace leads his countrymen in a rebellion to free his homeland from the tyranny of King Edward I of England.
+93,Inglourious Basterds,2009,153,8.3,69,120.54,"15,10,473","In Nazi-occupied France during World War II, a plan to assassinate Nazi leaders by a group of Jewish U.S. soldiers coincides with a theatre owner's vengeful plans for the same."
+94,Heat,1995,170,8.3,76,67.44,"6,85,676",A group of high-end professional thieves start to feel the heat from the LAPD when they unknowingly leave a clue at their latest heist.
+95,American Beauty,1999,122,8.3,84,130.1,"11,80,519",A sexually frustrated suburban father has a mid-life crisis after becoming infatuated with his daughter's best friend.
+96,Requiem for a Dream,2000,102,8.3,71,3.64,"8,68,981",The drug-induced utopias of four Coney Island people are shattered when their addictions run deep.
+97,Good Will Hunting,1997,126,8.3,70,138.43,"10,14,823","Will Hunting, a janitor at M.I.T., has a gift for mathematics, but needs help from a psychologist to find direction in his life."
+98,2001: A Space Odyssey,1968,149,8.3,84,56.95,"6,92,341","After uncovering a mysterious artifact buried beneath the Lunar surface, a spacecraft is sent to Jupiter to find its origins - a spacecraft manned by two men and the supercomputer H.A.L. 9000."
+99,To Kill a Mockingbird,1962,129,8.3,88,113,"3,24,539","Atticus Finch, a widowed lawyer in Depression-era Alabama, defends a Black man against an undeserved rape charge, and tries to educate his young children against prejudice."
+100,Reservoir Dogs,1992,99,8.3,81,2.83,"10,52,277","When a simple jewelry heist goes horribly wrong, the surviving criminals begin to suspect that one of them is a police informant."
+101,A Clockwork Orange,1971,136,8.3,77,6.21,"8,54,641","In the future, a sadistic gang leader is imprisoned and volunteers for a conduct-aversion experiment, but it doesn't go as planned."
+102,Scarface,1983,170,8.3,65,45.6,"8,76,738","In 1980 Miami, a determined Cuban immigrant takes over a drug cartel and succumbs to greed."
+103,Eternal Sunshine of the Spotless Mind,2004,108,8.3,89,34.4,"10,39,917","When their relationship turns sour, a couple undergoes a medical procedure to have each other erased from their memories for ever."
+104,Jagten,2012,115,8.3,77,0.69,"3,45,981","A teacher lives a lonely life, all the while struggling over his son's custody. His life slowly gets better as he finds love and receives good news from his son, but his new luck is about to be brutally shattered by an innocent little lie."
+105,Full Metal Jacket,1987,116,8.3,78,46.36,"7,65,283",A pragmatic U.S. Marine observes the dehumanizing effects the Vietnam War has on his fellow recruits from their brutal boot camp training to the bloody street fighting in Hue.
+106,Once Upon a Time in America,1984,229,8.3,75,5.32,"3,63,889","A former Prohibition-era Jewish gangster returns to the Lower East Side of Manhattan 35 years later, where he must once again confront the ghosts and regrets of his old life."
+107,Toy Story,1995,81,8.3,96,191.8,"10,29,621",A cowboy doll is profoundly threatened and jealous when a new spaceman action figure supplants him as top toy in a boy's bedroom.
+108,Hamilton,2020,160,8.3,89,110,"1,04,182","The real life of one of America's foremost founding fathers and first Secretary of the Treasury, Alexander Hamilton. Captured live on Broadway from the Richard Rodgers Theater with the original Broadway cast."
+109,Up,2009,96,8.3,88,293,"10,81,937","78-year-old Carl Fredricksen travels to Paradise Falls in his house equipped with balloons, inadvertently taking a young stowaway."
+110,Incendies,2010,131,8.3,80,6.86,"1,86,891",Twins journey to the Middle East to discover their family history and fulfill their mother's last wishes.
+111,Lawrence of Arabia,1962,218,8.3,100,44.82,"3,03,804","The story of T.E. Lawrence, the English officer who successfully united and led the diverse, often warring, Arab tribes during World War I in order to fight the Turks."
+112,Toy Story 3,2010,103,8.3,92,415,"8,63,855","The toys are mistakenly delivered to a day-care center instead of the attic right before Andy leaves for college, and it's up to Woody to convince the other toys that they weren't abandoned and to return home."
+113,Le fabuleux destin d'Amélie Poulain,2001,122,8.3,69,33.23,"7,74,411","Despite being caught in her imaginative world, Amelie, a young waitress, decides to help people find happiness. Her quest to spread joy leads her on a journey where she finds true love."
+114,Star Wars: Episode VI - Return of the Jedi,1983,131,8.3,58,309.13,"10,86,887","After rescuing Han Solo from Jabba the Hutt, the Rebels attempt to destroy the second Death Star, while Luke struggles to help Darth Vader back from the dark side."
+115,Mononoke-hime,1997,134,8.3,76,2.38,"4,11,777","On a journey to find the cure for a Tatarigami's curse, Ashitaka finds himself in the middle of a war between the forest gods and Tatara, a mining colony. In this quest he also meets San, the Mononoke Hime."
+116,Vertigo,1958,128,8.3,100,3.2,"4,14,047","A former San Francisco police detective juggles wrestling with his personal demons and becoming obsessed with the hauntingly beautiful woman he has been hired to trail, who may be deeply disturbed."
+117,Citizen Kane,1941,119,8.3,100,1.59,"4,53,840","Following the death of publishing tycoon Charles Foster Kane, reporters scramble to uncover the meaning of his final utterance: 'Rosebud.'"
+118,Singin' in the Rain,1952,103,8.3,99,8.82,"2,51,337",A silent film star falls for a chorus girl just as he and his delusionally jealous screen partner are trying to make the difficult transition to talking pictures in 1920s Hollywood.
+119,Metropolis,1927,153,8.3,98,1.24,"1,79,702","In a futuristic city sharply divided between the working class and the city planners, the son of the city's mastermind falls in love with a working-class prophet who predicts the coming of a savior to mediate their differences."
+120,North by Northwest,1959,136,8.3,98,13.28,"3,37,022","A New York City advertising executive goes on the run after being mistaken for a government agent by a group of foreign spies, and falls for a woman whose loyalties he begins to doubt."
+121,Jodaeiye Nader az Simin,2011,123,8.3,95,7.1,"2,51,368",A married couple are faced with a difficult decision - to improve the life of their child by moving to another country or to stay in Iran and look after a deteriorating parent who has Alzheimer's disease.
+122,The Sting,1973,129,8.3,83,159.6,"2,71,443",Two grifters team up to pull off the ultimate con.
+123,The Apartment,1960,125,8.3,94,18.6,"1,88,581","A Manhattan insurance clerk tries to rise in his company by letting its executives use his apartment for trysts, but complications and a romance of his own ensue."
+124,Judgment at Nuremberg,1961,179,8.3,60,136,"81,006","In 1948, an American court in occupied Germany tries four Nazis judged for war crimes."
+125,Dangal,2016,161,8.3,,12.39,"1,99,773",Former wrestler Mahavir Singh Phogat and his two wrestler daughters struggle towards glory at the Commonwealth Games in the face of societal oppression.
+126,M - Eine Stadt sucht einen Mörder,1931,117,8.3,,0.03,"1,63,105","When the police in a German city are unable to catch a child-murderer, other criminals join in the manhunt."
+127,Ikiru,1952,143,8.3,92,0.06,"83,069",A bureaucrat tries to find meaning in his life after he discovers he has terminal cancer.
+128,Double Indemnity,1944,107,8.3,95,5.72,"1,62,166","A Los Angeles insurance representative lets an alluring housewife seduce him into a scheme of insurance fraud and murder that arouses the suspicion of his colleague, an insurance investigator."
+129,Kantara,2022,148,8.3,,,"97,182","When greed paves the way for betrayal, scheming and murder, a young tribal reluctantly dons the traditions of his ancestors to seek justice."
+130,Taare Zameen Par,2007,165,8.3,,1.22,"2,00,039","An eight-year-old boy is thought to be a lazy trouble-maker, until the new art teacher has the patience and compassion to discover the real problem behind his struggles in school."
+131,Ladri di biciclette,1948,89,8.3,,0.33,"1,69,175","In post-war Italy, a working-class man's bicycle is stolen, endangering his efforts to find work. He and his son set out to find it."
+132,K.G.F: Chapter 2,2022,168,8.3,,6.6,"1,41,399","In the blood-soaked Kolar Gold Fields, Rocky's name strikes fear into his foes. While his allies look up to him, the government sees him as a threat to law and order. Rocky must battle threats from all sides for unchallenged supremacy."
+133,Ayla: The Daughter of War,2017,125,8.3,,,"42,060","Sergeant Süleyman finds a little girl on a battlefield during the Korean War. He takes her and names her Ayla. Fifteen months later, Süleyman's brigade is told they will be returning to Turkey, and he is reluctant to leave her behind."
+134,Vikram,2022,175,8.3,,,"65,063","A special investigator assigned a case of serial killings discovers the case is not what it seems to be, and leading down this path is only going to end in a war between everyone involved."
+135,The Kid,1921,68,8.3,,5.45,"1,30,534","The Tramp cares for an abandoned child, but events put their relationship in jeopardy."
+136,Chhichhore,2019,143,8.3,,0.9,"58,946","A tragic incident forces Anirudh, a middle-aged man, to take a trip down memory lane and reminisce his college days along with his friends, who were labelled as losers."
+137,Shershaah,2021,135,8.3,,,"1,25,763","Shershaah is the story of PVC awardee Indian soldier Capt. Vikram Batra, whose bravery and unflinching courage in chasing the Pakistani soldiers out of Indian territory contributed immensely in India finally winning the Kargil War in 1999."
+138,Ratsasan,2018,170,8.3,,,"47,613",A sub-inspector sets out in pursuit of a mysterious serial killer who targets teen school girls and murders them brutally.
+139,Drishyam,2013,160,8.3,,,"42,884",A man goes to extreme lengths to save his family from punishment after the family commits an accidental crime.
+140,The Wolf of Wall Street,2013,180,8.2,75,116.9,"14,87,540","Based on the true story of Jordan Belfort, from his rise to a wealthy stock-broker living the high life to his fall involving crime, corruption and the federal government."
+141,Batman Begins,2005,140,8.2,70,206.85,"15,21,333","After witnessing his parents' death, Bruce learns the art of fighting to confront injustice. When he returns to Gotham as Batman, he must stop a secret society that intends to destroy the city."
+142,Spider-Man: No Way Home,2021,148,8.2,71,804.75,"8,18,919","With Spider-Man's identity now revealed, Peter asks Doctor Strange for help. When a spell goes wrong, dangerous foes from other worlds start to appear, forcing Peter to discover what it truly means to be Spider-Man."
+143,No Country for Old Men,2007,122,8.2,92,74.28,"10,13,709",Violence and mayhem ensue after a hunter stumbles upon a drug deal gone wrong and more than two million dollars in cash near the Rio Grande.
+144,Indiana Jones and the Last Crusade,1989,127,8.2,65,197.17,"7,86,608","In 1938, after his father goes missing while pursuing the Holy Grail, Indiana Jones finds himself up against the Nazis again to stop them from obtaining its powers."
+145,Shutter Island,2010,138,8.2,63,128.01,"13,80,885","Teddy Daniels and Chuck Aule, two US marshals, are sent to an asylum on a remote island in order to investigate the disappearance of a patient, where Teddy uncovers a shocking truth about the place."
+146,Jurassic Park,1993,127,8.2,68,402.45,"10,26,143",A pragmatic paleontologist touring an almost complete theme park on an island in Central America is tasked with protecting a couple of kids after a power failure causes the park's cloned dinosaurs to run loose.
+147,There Will Be Blood,2007,158,8.2,93,40.22,"6,12,354","A story of family, religion, hatred, oil and madness, focusing on a turn-of-the-century prospector in the early days of the business."
+148,The Truman Show,1998,103,8.2,90,125.62,"11,33,421",An insurance salesman discovers his whole life is actually a reality TV show.
+149,Taxi Driver,1976,114,8.2,94,28.26,"8,76,254","A mentally unstable veteran works as a nighttime taxi driver in New York City, where the perceived decadence and sleaze fuels his urge for violent action."
+150,1917,2019,119,8.2,78,159.23,"6,33,431","April 6th, 1917. As an infantry battalion assembles to wage war deep in enemy territory, two soldiers are assigned to race against time and deliver a message that will stop 1,600 men from walking straight into a deadly trap."
+151,Snatch,2000,104,8.2,55,30.33,"8,80,917","Unscrupulous boxing promoters, violent bookmakers, a Russian gangster, incompetent amateur robbers and supposedly Jewish jewelers fight to track down a priceless stolen diamond."
+152,Kill Bill: Vol. 1,2003,111,8.2,69,70.1,"11,50,722","After awakening from a four-year coma, a former assassin wreaks vengeance on the team of assassins who betrayed her."
+153,The Thing,1982,109,8.2,57,13.78,"4,43,632",A research team in Antarctica is hunted by a shape-shifting alien that assumes the appearance of its victims.
+154,Die Hard,1988,132,8.2,72,83.01,"9,08,004",A New York City police officer tries to save his estranged wife and several others taken hostage by terrorists during a Christmas party at the Nakatomi Plaza in Los Angeles.
+155,Casino,1995,178,8.2,73,42.44,"5,40,865","In Las Vegas, two best friends - a casino executive and a mafia enforcer - compete for a gambling empire and a fast-living, fast-loving socialite."
+156,Green Book,2018,130,8.2,69,85.08,"5,28,465",A working-class Italian-American bouncer becomes the driver for an African-American classical pianist on a tour of venues through the 1960s American South.
+157,The Sixth Sense,1999,107,8.2,64,293.51,"10,18,597","Malcolm Crowe, a child psychologist, starts treating a young boy, Cole, who encounters dead people and convinces him to help them. In turn, Cole helps Malcolm reconcile with his estranged wife."
+158,A Beautiful Mind,2001,135,8.2,72,170.74,"9,57,506","After John Nash, a brilliant but asocial mathematician, accepts secret work in cryptography, his life takes a turn for the nightmarish."
+159,Hauru no ugoku shiro,2004,119,8.2,82,4.71,"4,18,993","When an unconfident young woman is cursed with an old body by a spiteful witch, her only chance of breaking the spell lies with a self-indulgent yet insecure young wizard and his companions in his legged, walking castle."
+160,Finding Nemo,2003,100,8.2,90,380.84,"10,76,596","After his son is captured in the Great Barrier Reef and taken to Sydney, a timid clownfish sets out on a journey to bring him home."
+161,L.A. Confidential,1997,138,8.2,91,64.62,"5,97,783","As corruption grows in 1950s Los Angeles, three policemen - one strait-laced, one brutal, and one sleazy - investigate a series of murders with their own brand of justice."
+162,V for Vendetta,2005,132,8.2,62,70.51,"11,48,235","In a future British dystopian society, a shadowy freedom fighter, known only by the alias of ""V"", plots to overthrow the tyrannical government - with the help of a young woman."
+163,The Father,I 2020,97,8.2,88,132,"1,73,861","A man refuses all assistance from his daughter as he ages. As he tries to make sense of his changing circumstances, he begins to doubt his loved ones, his own mind and even the fabric of his reality."
+164,Der Untergang,2004,156,8.2,82,5.51,"3,64,966","Traudl Junge, the final secretary for Adolf Hitler, tells of the Nazi dictator's final days in his Berlin bunker at the end of WWII."
+165,Pan's Labyrinth,2006,118,8.2,98,37.63,"6,85,345","In the Falangist Spain of 1944, the bookish young stepdaughter of a sadistic army officer escapes into an eerie but captivating fantasy world."
+166,Chinatown,1974,130,8.2,92,157,"3,37,525","A private detective hired to expose an adulterer in 1930s Los Angeles finds himself caught up in a web of deceit, corruption, and murder."
+167,Gone with the Wind,1939,238,8.2,97,198.68,"3,24,841",A sheltered and manipulative Southern belle and a roguish profiteer face off in a turbulent romance as the society around them crumbles with the end of slavery and is rebuilt during the Civil War and Reconstruction periods.
+168,Unforgiven,1992,130,8.2,85,101.16,"4,24,008","Retired Old West gunslinger William Munny reluctantly takes on one last job, with the help of his old partner Ned Logan and a young man, The ""Schofield Kid."""
+169,Monty Python and the Holy Grail,1975,91,8.2,91,1.23,"5,55,708","King Arthur and his Knights of the Round Table embark on a surreal, low-budget search for the Holy Grail, encountering many, very silly obstacles."
+170,The Great Escape,1963,172,8.2,86,12.1,"2,51,447",Allied prisoners of war plan for several hundred of their number to escape from a German camp during World War II.
+171,The Elephant Man,1980,124,8.2,78,156,"2,50,169","A Victorian surgeon rescues a heavily disfigured man who is mistreated while scraping a living as a side-show freak. Behind his monstrous façade, there is revealed a person of kindness, intelligence and sophistication."
+172,Some Like It Hot,1959,121,8.2,98,25,"2,75,260","After two male musicians witness a mob hit, they flee the state in an all-female band disguised as women, but further complications set in."
+173,Per qualche dollaro in più,1965,132,8.2,74,15,"2,65,277",Two bounty hunters with the same intentions team up to track down an escaped Mexican outlaw.
+174,El secreto de sus ojos,2009,129,8.2,80,6.39,"2,15,764",A retired legal counselor writes a novel hoping to find closure for one of his past unresolved homicide cases and for his unreciprocated love with his superior - both of which still haunt him decades later.
+175,Ran,1985,162,8.2,97,4.14,"1,30,734","In Medieval Japan, an elderly warlord retires, handing over his empire to his three sons. However, he vastly underestimates how the new-found power will corrupt them and cause them to turn on each other...and him."
+176,Tumbbad,2018,104,8.2,,,"54,234",A mythological story about a goddess who created the entire universe. The plot revolves around the consequences when humans build a temple for her first-born.
+177,Kimetsu no Yaiba: Mugen Ressha-Hen,2020,117,8.2,72,47.7,"66,551","After his family was brutally murdered and his sister turned into a demon, Tanjiro Kamado's journey as a demon slayer began. Tanjiro and his comrades embark on a new mission aboard the Mugen Train, on track to despair."
+178,Dial M for Murder,1954,105,8.2,75,0.01,"1,82,353",A former tennis star arranges the murder of his adulterous wife.
+179,Drishyam 2,2022,140,8.2,,,"39,024",A gripping tale of an investigation and a family which is threatened by it. Will Vijay Salgaonkar be able to protect his family this time?
+180,Klaus,2019,96,8.2,65,177,"1,69,477","A simple act of kindness always sparks another, even in a frozen, faraway place. When Smeerensburg's new postman, Jesper, befriends toymaker Klaus, their gifts melt an age-old feud and deliver a sleigh full of holiday traditions."
+181,To Be or Not to Be,1942,99,8.2,86,231,"40,338","During the Nazi occupation of Poland, an acting troupe becomes embroiled in a Polish soldier's efforts to track down a German spy."
+182,All About Eve,1950,138,8.2,98,0.01,"1,35,047",A seemingly timid but secretly ruthless ingénue insinuates herself into the lives of an aging Broadway star and her circle of theater friends.
+183,Gangs of Wasseypur,2012,321,8.2,89,,"1,00,060","A clash between Sultan and Shahid Khan leads to the expulsion of Khan from Wasseypur, and ignites a deadly blood feud spanning three generations."
+184,Rashômon,1950,88,8.2,98,0.1,"1,74,325","The rape of a bride and the murder of her samurai husband are recalled from the perspectives of a bandit, the bride, the samurai's ghost and a woodcutter."
+185,Le salaire de la peur,1953,131,8.2,85,196,"63,827","In a decrepit South American village, four men are hired to transport an urgent nitroglycerine shipment without the equipment that would make it safe."
+186,Tôkyô monogatari,1953,136,8.2,100,208,"64,996","An old couple visit their children and grandchildren in the city, but receive little attention."
+187,Miracle in Cell No. 7,2019,132,8.2,,,"52,462",A story of love between a mentally-ill father who was wrongly accused of murder and his lovely six year old daughter. Prison will be their home. Based on the 2013 Korean movie 7-beon-bang-ui seon-mul (2013).
+188,Yôjinbô,1961,110,8.2,93,148,"1,27,057",A crafty ronin comes to a town divided by two criminal gangs and decides to play them against each other to free the town.
+189,Drishyam,2015,163,8.2,,0.74,"89,690","Desperate measures are taken by a man who tries to save his family from the dark side of the law, after they commit an unexpected crime."
+190,Z,1969,127,8.2,86,0.08,"30,273",The public murder of a prominent politician and doctor amid a violent demonstration is covered up by military and government officials. A tenacious magistrate is determined not to let them get away with it.
+191,Zindagi Na Milegi Dobara,2011,155,8.2,,3.11,"82,331",Three friends decide to turn their fantasy vacation into reality after one of their friends gets engaged.
+192,Bacheha-Ye aseman,1997,89,8.2,77,0.93,"77,610","After a boy loses his sister's pair of shoes, he goes on a series of adventures in order to find them. When he can't, he tries a new way to ""win"" a new pair."
+193,The Treasure of the Sierra Madre,1948,126,8.2,98,5.01,"1,29,010",Two down-on-their-luck Americans searching for work in 1920s Mexico convince an old prospector to help them mine for gold in the Sierra Madre Mountains.
+194,Andhadhun,2018,139,8.2,,1.37,"98,180","A series of mysterious events change the life of a blind pianist, who must now report a crime that he should technically know nothing of."
+195,Pather Panchali,1955,125,8.2,,0.54,"35,764","Impoverished priest Harihar Ray, dreaming of a better life for himself and his family, leaves his rural Bengal village in search of work."
+196,"Swades: We, the People",2004,210,8.2,,1.22,"94,253",A successful Indian scientist returns to an Indian village to take his nanny to America with him and in the process rediscovers his roots.
+197,K.G.F: Chapter 1,2018,156,8.2,,,"92,842","In the 1970s, a gangster named Rocky goes undercover as a slave to assassinate the owner of a notorious gold mine known as the K.G.F."
+198,Baahubali 2: The Conclusion,2017,167,8.2,,20.19,"1,08,380","Amarendra Baahubali, the heir apparent to the throne of Mahishmati, finds his life and relationships endangered as his adoptive brother Bhallaladeva conspires to claim the throne."
+199,La passion de Jeanne d'Arc,1928,110,8.2,98,0.02,"57,981","In 1431, Jeanne d'Arc is placed on trial on charges of heresy. The ecclesiastical jurists attempt to force Jeanne to recant her claims of holy visions."
+200,Dersu Uzala,1975,142,8.2,,,"32,234",The Russian army sends an explorer on an expedition to the snowy Siberian wilderness where he makes friends with a seasoned local hunter.
+201,Babam ve Oglum,2005,112,8.2,,233,"89,109",The family of a left-wing journalist is torn apart after the military coup of Turkey in 1980.
+202,Sherlock Jr.,1924,45,8.2,,0.98,"53,380","A film projectionist longs to be a detective, and puts his meagre skills to work when he is framed by a rival for stealing his girlfriend's father's pocketwatch."
+203,Rangasthalam,2018,170,8.2,,3.51,"26,427",Chitti Babu begins to suspect his elder brother's life is in danger after they team up to lock horns with their village president and overthrow his unlawful 30 year old regime.
+204,Uri: The Surgical Strike,2019,138,8.2,,4.19,"68,515","Indian army special forces execute a covert operation, avenging the killing of fellow army men at their base by a terrorist group."
+205,Umberto D.,1952,89,8.2,92,0.07,"27,087",An elderly man and his dog struggle to survive on his government pension in Rome.
+206,Vikram Vedha,2017,147,8.2,,,"48,347","Vikram, a no-nonsense police officer, accompanied by Simon, his partner, is on the hunt to capture Vedha, a smuggler and a murderer. Vedha tries to change Vikram's life, which leads to a conflict."
+207,Bhaag Milkha Bhaag,2013,186,8.2,,1.63,"70,260","The truth behind the ascension of Milkha Singh, who was scarred by of the India-Pakistan partition."
+208,Paan Singh Tomar,2012,135,8.2,,0.04,"37,210","The story of Paan Singh Tomar, an Indian athlete and seven-time national steeplechase champion who becomes one of the most feared dacoits in Chambal Valley after his retirement."
+209,Guardians of the Galaxy Vol. 3,2023,150,8.1,64,,"2,42,729","Still reeling from the loss of Gamora, Peter Quill rallies his team to defend the universe and one of their own - a mission that could mean the end of the Guardians if not successful."
+210,The Exorcist,1973,122,8.1,81,232.91,"4,26,238","When a teenage girl is possessed by a mysterious entity, her mother seeks the help of two priests to save her daughter."
+211,Jaws,1975,124,8.1,87,260,"6,33,517","When a killer shark unleashes chaos on a beach community off Cape Cod, it's up to a local sheriff, a marine biologist, and an old seafarer to hunt the beast down."
+212,Prisoners,2013,153,8.1,70,61,"7,60,272","When Keller Dover's daughter and her friend go missing, he takes matters into his own hands as the police pursue multiple leads and the pressure mounts."
+213,Gone Girl,2014,149,8.1,79,167.77,"10,20,071","With his wife's disappearance having become the focus of an intense media circus, a man sees the spotlight turned on him when it's suspected that he may not be innocent."
+214,The Grand Budapest Hotel,2014,99,8.1,88,59.1,"8,50,285","A writer encounters the owner of an aging high-class hotel, who tells him of his early years serving as a lobby boy in the hotel's glorious years under an exceptional concierge."
+215,Mad Max: Fury Road,2015,120,8.1,90,154.06,"10,40,507","In a post-apocalyptic wasteland, a woman rebels against a tyrannical ruler in search for her homeland with the aid of a group of female prisoners, a psychotic worshiper and a drifter named Max."
+216,Pirates of the Caribbean: The Curse of the Black Pearl,2003,143,8.1,63,305.41,"11,65,615","Blacksmith Will Turner teams up with eccentric pirate ""Captain"" Jack Sparrow to save his love, the governor's daughter, from Jack's former pirate allies, who are now undead."
+217,Blade Runner,1982,117,8.1,84,32.87,"7,95,309",A blade runner must pursue and terminate four replicants who stole a ship in space and have returned to Earth to find their creator.
+218,Hacksaw Ridge,2016,139,8.1,71,67.21,"5,59,469","World War II American Army Medic Desmond T. Doss, who served during the Battle of Okinawa, refuses to kill people and becomes the first man in American history to receive the Medal of Honor without firing a shot."
+219,The Terminator,1984,107,8.1,84,38.4,"8,94,223","A human soldier is sent from 2029 to 1984 to stop an almost indestructible cyborg killing machine, sent from the same year, which has been programmed to execute a young woman whose unborn son is the key to humanity's future salvation."
+220,Stand by Me,1986,89,8.1,75,52.29,"4,22,177","After the death of one of his friends, a writer recounts a childhood journey with his friends to find the body of a missing boy."
+221,Catch Me If You Can,2002,141,8.1,75,164.62,"10,36,993","Barely 21 yet, Frank is a skilled forger who has passed as a doctor, lawyer and pilot. FBI agent Carl becomes obsessed with tracking down the con man, who only revels in the pursuit."
+222,Ford v Ferrari,2019,152,8.1,81,117.62,"4,29,128",American car designer Carroll Shelby and driver Ken Miles battle corporate interference and the laws of physics to build a revolutionary race car for Ford in order to defeat Ferrari at the 24 Hours of Le Mans in 1966.
+223,The Big Lebowski,1998,117,8.1,71,17.5,"8,33,531","Jeff ""The Dude"" Lebowski, mistaken for a millionaire of the same name, seeks restitution for his ruined rug and enlists his bowling buddies to help get it."
+224,Harry Potter and the Deathly Hallows: Part 2,2011,130,8.1,85,381.01,"9,10,308","Harry, Ron, and Hermione search for Voldemort's remaining Horcruxes in their effort to destroy the Dark Lord as the final battle rages on at Hogwarts."
+225,Ah-ga-ssi,2016,145,8.1,85,2.01,"1,60,072","A woman is hired as a handmaiden to a Japanese heiress, but secretly she is involved in a plot to defraud her."
+226,Ratatouille,2007,111,8.1,96,206.45,"7,79,088",A rat who can cook makes an unusual alliance with a young kitchen worker at a famous Paris restaurant.
+227,La haine,1995,98,8.1,,0.31,"1,84,444",24 hours in the lives of three young men in the French suburbs the day after a violent riot.
+228,The Help,2011,146,8.1,62,169.71,"4,76,372","An aspiring author during the civil rights movement of the 1960s decides to write a book detailing the African American maids' point of view on the white families for which they work, and the hardships they go through on a daily basis."
+229,Logan,2017,137,8.1,77,226.28,"7,97,391","In a future where mutants are nearly extinct, an elderly and weary Logan leads a quiet life. But when Laura, a mutant child pursued by scientists, comes to him for help, he must get her to safety."
+230,"Three Billboards Outside Ebbing, Missouri",2017,115,8.1,88,54.51,"5,31,697",A mother personally challenges the local authorities to solve her daughter's murder when they fail to catch the culprit.
+231,Fargo,1996,98,8.1,86,24.61,"6,98,098",Minnesota car salesman Jerry Lundegaard's inept crime falls apart due to his and his henchmen's bungling and the persistent police work of the quite pregnant Marge Gunderson.
+232,Inside Out,I 2015,95,8.1,94,356.46,"7,46,886","After young Riley is uprooted from her Midwest life and moved to San Francisco, her emotions - Joy, Fear, Anger, Disgust and Sadness - conflict on how best to navigate a new city, house, and school."
+233,Rocky,1976,120,8.1,70,117.24,"6,05,128",A small-time Philadelphia boxer gets a supremely rare chance to fight the world heavyweight champion in a bout in which he strives to go the distance for his self-respect.
+234,Dead Poets Society,1989,128,8.1,79,95.86,"5,16,660",Maverick teacher John Keating uses poetry to embolden his boarding school students to new heights of self-expression.
+235,The Wizard of Oz,1939,102,8.1,92,2.08,"4,14,083","Young Dorothy Gale and her dog Toto are swept away by a tornado from their Kansas farm to the magical Land of Oz, and embark on a quest with three new friends to see the Wizard, who can return her to her home and fulfill the others' wishes."
+236,Salinui chueok,2003,131,8.1,82,0.01,"1,99,792","In a small Korean province in 1986, two detectives struggle with the case of multiple young women being found raped and murdered by an unknown culprit."
+237,Into the Wild,2007,148,8.1,73,18.35,"6,39,564","After graduating from Emory University, top student and athlete Christopher McCandless abandons his possessions, gives his entire $24,000 savings account to charity and hitchhikes to Alaska to live in the wilderness. Along the way, Christopher encounters a series of characters that shape his life."
+238,Warrior,2011,140,8.1,71,13.66,"4,85,065","The youngest son of an alcoholic former boxer returns home, where he's trained by his father for competition in a mixed martial arts tournament - a path that puts the fighter on a collision course with his estranged, older brother."
+239,Trainspotting,1996,93,8.1,83,16.5,"7,05,757","Renton, deeply immersed in the Edinburgh drug scene, tries to clean up and get out, despite the allure of the drugs and influence of friends."
+240,Spotlight,I 2015,129,8.1,93,45.06,"4,86,300","The true story of how the Boston Globe uncovered the massive scandal of child molestation and cover-up within the local Catholic Archdiocese, shaking the entire Catholic Church to its core."
+241,Platoon,1986,120,8.1,92,138.53,"4,26,296","Chris Taylor, a neophyte recruit in Vietnam, finds himself caught in a battle of wills between two sergeants, one good and the other evil. A shrewd examination of the brutality of war and the duality of man in conflict."
+242,"Monsters, Inc.",2001,92,8.1,79,289.92,"9,42,241","In order to power the city, monsters have to scare children so that they scream. However, the children are toxic to the monsters, and after a child gets through, two monsters realize things may not be what they think."
+243,Before Sunrise,1995,101,8.1,77,5.54,"3,24,483","A young man and woman meet on a train in Europe, and wind up spending one evening together in Vienna. Unfortunately, both know that this will probably be their only night together."
+244,Rush,I 2013,123,8.1,74,26.95,"4,95,815",The merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.
+245,"Lock, Stock and Two Smoking Barrels",1998,107,8.1,66,3.9,"5,99,221","Eddy persuades his three pals to pool money for a vital poker game against a powerful local mobster, Hatchet Harry. Eddy loses, after which Harry gives him a week to pay back 500,000 pounds."
+246,Room,I 2015,118,8.1,86,14.68,"4,35,564","A little boy is held captive in a room with his mother since his birth, so he has never known the world outside."
+247,Portrait de la jeune fille en feu,2019,122,8.1,95,3.76,"1,00,794","On an isolated island in Brittany at the end of the eighteenth century, a female painter is obliged to paint a wedding portrait of a young woman."
+248,The Deer Hunter,1978,183,8.1,86,48.98,"3,49,246",An in-depth examination of the ways in which the Vietnam War impacts and disrupts the lives of several friends in a small steel mill town in Pennsylvania.
+249,The Sound of Music,1965,172,8.1,63,163.21,"2,47,286",A young novice is sent by her convent in 1930s Austria to become a governess to the seven children of a widowed naval officer.
+250,How to Train Your Dragon,2010,98,8.1,75,217.58,"7,69,718","A hapless young Viking who aspires to hunt dragons becomes the unlikely friend of a young dragon himself, and learns there may be more to the creatures than he assumed."
+251,12 Years a Slave,2013,134,8.1,96,56.67,"7,21,010","In the antebellum United States, Solomon Northup, a free black man from upstate New York, is abducted and sold into slavery."
+252,Barry Lyndon,1975,185,8.1,89,188,"1,75,642",An Irish rogue wins the heart of a rich widow and assumes her dead husband's aristocratic position in 18th-century England.
+253,Cool Hand Luke,1967,127,8.1,92,16.22,"1,83,447","A laid-back Southern man is sentenced to two years in a rural prison, but refuses to conform."
+254,Raging Bull,1980,129,8.1,90,23.38,"3,66,488","The life of boxer Jake LaMotta, whose violence and temper that led him to the top in the ring destroyed his life outside of it."
+255,Million Dollar Baby,2004,132,8.1,86,100.49,"7,04,185","Frankie, an ill-tempered old coach, reluctantly agrees to train aspiring boxer Maggie. Impressed with her determination and talent, he helps her become the best and the two soon form a close bond."
+256,"Paris, Texas",1984,145,8.1,81,2.18,"1,11,924","Travis Henderson, an aimless drifter who has been missing for four years, wanders out of the desert and must reconnect with society, himself, his life, and his family."
+257,Gran Torino,2008,116,8.1,72,148.1,"7,94,579","After a Hmong teenager tries to steal his prized 1972 Gran Torino, a disgruntled, prejudiced Korean War veteran seeks to redeem both the boy and himself."
+258,Fa yeung nin wah,2000,98,8.1,87,2.73,"1,58,620","Two neighbors form a strong bond after both suspect extramarital activities of their spouses. However, they agree to keep their bond platonic so as not to commit similar wrongs."
+259,Stalker,1979,162,8.1,85,0.23,"1,39,553",A guide leads two men through an area known as the Zone to find a room that grants wishes.
+260,Tonari no Totoro,1988,86,8.1,86,1.11,"3,57,787","When two girls move to the country to be near their ailing mother, they have adventures with the wondrous forest spirits who live nearby."
+261,The Red Shoes,1948,135,8.1,,10.9,"37,278",A young ballet dancer is torn between the man she loves and her pursuit to become a prima ballerina.
+262,In the Name of the Father,1993,133,8.1,84,25.01,"1,81,367",A man's coerced confession to an I.R.A. bombing he did not commit results in the imprisonment of his father as well. An English lawyer fights to free them.
+263,Hachi: A Dog's Tale,2009,93,8.1,,236,"2,98,283",A college professor bonds with an abandoned dog he takes into his home.
+264,Network,1976,121,8.1,83,#222,"1,64,777","A television network cynically exploits a deranged former anchor's ravings and revelations about the news media for its own profit, but finds that his message may be difficult to control."
+265,Ben-Hur,1959,212,8.1,90,74.7,"2,46,746","After a Jewish prince is betrayed and sent into slavery by a Roman friend in 1st-century Jerusalem, he regains his freedom and comes back for revenge."
+266,The Iron Giant,1999,86,8.1,85,23.16,"2,13,283",A young boy befriends a giant robot from outer space that a paranoid government agent wants to destroy.
+267,Det sjunde inseglet,1957,96,8.1,88,206,"1,91,678","A knight returning to Sweden after the Crusades seeks answers about life, death, and the existence of God as he plays chess against the Grim Reaper during the Black Plague."
+268,Before Sunset,2004,80,8.1,91,5.82,"2,76,929","Nine years after Jesse and Celine first met, they encounter each other again on the French leg of Jesse's book tour."
+269,Relatos salvajes,2014,122,8.1,77,3.11,"2,07,584",Six short stories that explore the extremities of human behavior involving people in distress.
+270,Koe no katachi,2016,130,8.1,78,,"92,088","A young man is ostracized by his classmates after he bullies a deaf girl to the point where she moves away. Years later, he sets off on a path for redemption."
+271,Persona,1966,85,8.1,86,246,"1,25,251",A nurse is put in charge of a mute actress and finds that their personae are melding together.
+272,The Third Man,1949,104,8.1,97,0.45,"1,76,630","Pulp novelist Holly Martins travels to shadowy, postwar Vienna, only to find himself investigating the mysterious death of an old friend, Harry Lime."
+273,On the Waterfront,1954,108,8.1,91,9.6,"1,59,807","An ex-prize fighter turned New Jersey longshoreman struggles to stand up to his corrupt union bosses, including his older brother, as he starts to connect with the grieving sister of one of the syndicate's victims."
+274,The Bridge on the River Kwai,1957,161,8.1,87,44.91,"2,27,269","British POWs are forced to build a railway bridge across the river Kwai for their Japanese captors in occupied Burma, not knowing that the allied forces are planning a daring commando raid through the jungle to destroy it."
+275,Amores perros,2000,154,8.1,83,5.38,"2,46,958","A horrific car accident connects three stories, each involving characters dealing with loss, regret, and life's harsh realities, all in the name of love."
+276,Rebecca,1940,130,8.1,86,4.36,"1,41,999",A self-conscious woman juggles adjusting to her new role as an aristocrat's wife and avoiding being intimidated by his first wife's spectral presence.
+277,"Shin seiki Evangelion Gekijô-ban: Air/Magokoro wo, kimi ni",1997,87,8.1,,,"59,685",Concurrent theatrical ending of the TV series Shinseiki Evangelion (1995).
+278,Hotel Rwanda,2004,121,8.1,79,23.53,"3,64,032","Paul Rusesabagina, a hotel manager, houses over a thousand Tutsi refugees during their struggle against the Hutu militia in Rwanda, Africa."
+279,The Man Who Shot Liberty Valance,1962,123,8.1,94,,"79,606",A senator returns to a Western town for the funeral of an old friend and tells the story of his origins.
+280,Paper Moon,1973,102,8.1,77,30.93,"50,319","During the Great Depression, a con man finds himself saddled with a young girl who may or may not be his daughter, and the two forge an unlikely partnership."
+281,Smultronstället,1957,91,8.1,88,193,"1,11,057","After living a life marked by coldness, an aging professor is forced to confront the emptiness of his existence."
+282,It Happened One Night,1934,105,8.1,87,4.36,"1,08,280","A renegade reporter trailing a young runaway heiress for a big story joins her on a bus heading from Florida to New York, and they end up stuck with each other when the bus leaves them behind at one of the stops."
+283,Mary and Max.,2009,92,8.1,,204,"1,82,146","A tale of friendship between two unlikely pen pals: Mary, a lonely, eight-year-old girl living in the suburbs of Melbourne, and Max, a forty-four-year old, severely obese man living in New York."
+284,The Best Years of Our Lives,1946,170,8.1,93,23.65,"67,840","Three World War II veterans, two of them traumatized or disabled, return home to the American midwest to discover that they and their families have been irreparably changed."
+285,Festen,1998,105,8.1,82,1.65,"90,734","At Helge's 60th birthday party, some unpleasant family truths are revealed."
+286,PK,2014,153,8.1,,10.62,"1,94,559",An alien on Earth loses the only device he can use to communicate with his spaceship. His innocent nature and child-like questions force the country to evaluate the impact of there religious views on there people.
+287,All Quiet on the Western Front,1930,152,8.1,91,3.27,"65,838","A German youth eagerly enters World War I, but his enthusiasm wanes as he gets a firsthand view of the horror."
+288,Fanny och Alexander,1982,188,8.1,100,4.97,"65,764","Two young Swedish children in the 1900s experience the many comedies and tragedies of their lively and affectionate theatrical family, the Ekdahls."
+289,Les quatre cents coups,1959,99,8.1,,244,"1,23,388","A young boy, left without attention, delves into a life of petty crime."
+290,The Grapes of Wrath,1940,129,8.1,96,0.06,"96,978","An Oklahoma family, driven off their farm by the poverty and hopelessness of the Dust Bowl, joins the westward migration to California, suffering the misfortunes of the homeless in the Great Depression."
+291,Trois couleurs: Rouge,1994,99,8.1,100,4.04,"1,07,010",A model discovers a retired judge is keen on invading people's privacy.
+292,A Woman Under the Influence,1974,155,8.1,88,13.34,"27,173","Although wife and mother Mabel is loved by her husband Nick, her mental illness places a strain on the marriage."
+293,Yi yi,2000,173,8.1,94,1.14,"26,696",Each member of a middle-class Taipei family seeks to reconcile past and present relationships within their daily lives.
+294,Andrei Rublev,1966,205,8.1,,0.1,"55,562","The life, times and afflictions of the fifteenth-century Russian iconographer St. Andrei Rublev."
+295,The Message,1976,177,8.1,,,"49,399",This epic historical drama chronicles the life and times of Prophet Muhammad and serves as an introduction to early Islamic history.
+296,Underground,1995,170,8.1,79,0.17,"59,881","A group of Serbian socialists prepares for the war in a surreal underground filled by parties, tragedies, love, and hate."
+297,Masaan,2015,109,8.1,,,"29,630","Along India's Ganges River, four people face prejudice, a strict moral code and a punishing caste system as they confront personal tragedies."
+298,Lagaan: Once Upon a Time in India,2001,224,8.1,84,0.07,"1,17,612",The people of a small village in Victorian India stake their future on a game of cricket against their ruthless British rulers.
+299,La battaglia di Algeri,1966,121,8.1,96,0.06,"63,112","In the 1950s, fear and violence escalate as the people of Algiers fight for independence from the French government."
+300,Inherit the Wind,1960,128,8.1,75,,"31,726","Based on a real-life case in 1925, two great lawyers argue the case for and against a Tennessee science teacher accused of the crime of teaching evolution."
+301,Ôkami kodomo no Ame to Yuki,2012,117,8.1,71,,"47,386","After her werewolf lover unexpectedly dies in an accident while hunting for food for their children, a young woman must find ways to raise the werewolf son and daughter that she had with him while keeping their trait hidden from society."
+302,Ba wang bie ji,1993,171,8.1,83,5.22,"31,226",Two boys meet at an opera training school in Peking in 1924. Their resulting friendship will span nearly 70 years and will endure some of the most troublesome times in China's history.
+303,Kis Uykusu,2014,196,8.1,88,0.17,"53,610",A hotel owner and landlord in a remote Turkish village deals with conflicts within his family and a tenant behind on his rent.
+304,Mr. Smith Goes to Washington,1939,129,8.1,73,9.6,"1,18,422","A naive youth leader is appointed to fill a vacancy in the U.S. Senate. His idealistic plans promptly collide with corruption at home and subterfuge from his hero in Washington, but he tries to forge ahead despite attacks on his character."
+305,White Heat,1949,114,8.1,,,"34,583",A psychopathic criminal with a mother complex makes a daring break from prison and leads his old gang in a chemical plant payroll heist.
+306,The General,1926,78,8.1,,1.03,"94,849","After being rejected by the Confederate military, not realizing it was due to his crucial civilian role, an engineer must single-handedly recapture his beloved locomotive after it is seized by Union spies and return it through enemy lines."
+307,Kakushi-toride no san-akunin,1958,139,8.1,89,,"40,781","Lured by gold, two greedy peasants unknowingly escort a princess and her general across enemy lines."
+308,Kumonosu-jô,1957,110,8.1,,,"54,212","A war-hardened general, egged on by his ambitious wife, works to fulfill a prophecy that he would become lord of Spider's Web Castle."
+309,Le notti di Cabiria,1957,110,8.1,,0.75,"50,686",A waifish prostitute wanders the streets of Rome looking for true love but finds only heartbreak.
+310,Jungfrukällan,1960,89,8.1,,1.53,"30,615","In 14th-century Sweden, an innocent yet pampered teenage girl and her family's pregnant and jealous servant set out from their farm to deliver candles to church, but only one returns from events that transpire in the woods along the way."
+311,Dil Chahta Hai,2001,183,8.1,,0.3,"74,200","Three inseparable childhood friends are just out of college. Nothing comes between them - until they each fall in love, and their wildly different approaches to relationships creates tension."
+312,Ace in the Hole,1951,111,8.1,72,3.97,"37,836","A frustrated former big-city journalist now stuck working for an Albuquerque newspaper exploits a story about a man trapped in a cave to rekindle his career, but the situation quickly escalates into an out-of-control circus."
+313,Talvar,2015,132,8.1,,0.34,"36,804",An experienced investigator confronts several conflicting theories about the perpetrators of a violent double homicide.
+314,Du rififi chez les hommes,1955,118,8.1,97,0.06,"35,854","Four men plan a technically perfect crime, but the human element intervenes..."
+315,Barfi!,2012,151,8.1,,2.8,"84,517",Three young people learn that love can neither be defined nor contained by society's definition of normal and abnormal.
+316,Udaan,2010,134,8.1,,0.01,"46,115","Expelled from his school, a 16-year old boy returns home to his abusive and oppressive father."
+317,Les diaboliques,1955,117,8.1,,1.09,"67,729",The wife and mistress of a loathed school principal plan to murder him with what they believe is the perfect alibi.
+318,The Gold Rush,1925,95,8.1,,5.45,"1,14,932","A prospector goes to the Klondike during the 1890s gold rush in hopes of making his fortune, and is smitten with a girl he sees in a dance hall."
+319,Höstsonaten,1978,99,8.1,,,"36,229","A devoted wife is visited by her mother, a successful concert pianist who had little time for her when she was young."
+320,Bajrangi Bhaijaan,2015,163,8.1,,8.18,"92,930",An Indian man with a magnanimous heart takes a young mute Pakistani girl back to her homeland to reunite her with her family.
+321,A Wednesday,2008,104,8.1,,,"80,579",A retiring police officer reminisces about the most astounding day of his career. About a case that was never filed but continues to haunt him in his memories - the case of a man and a Wednesday.
+322,Rang De Basanti,2006,167,8.1,,2.2,"1,20,874","The story of six young Indians who assist an English woman to film a documentary on the freedom fighters from their past, and the events that lead them to relive the long-forgotten saga of freedom."
+323,Kahaani,2012,122,8.1,,1.04,"64,355","A pregnant woman's search for her missing husband takes her from London to Kolkata, but everyone she questions denies having ever met him."
+324,Sholay,1975,204,8.1,,,"57,436","After his family is murdered by a notorious and ruthless bandit, a former police officer enlists the services of two outlaws to capture the bandit."
+325,Sunrise: A Song of Two Humans,1927,94,8.1,95,0.54,"52,638","A sophisticated city woman seduces a farmer and convinces him to murder his wife and join her in the city, but he ends up rekindling his romance with his wife when he changes his mind at the last moment."
+326,Da hong denglong gaogao gua,1991,125,8.1,,2.6,"34,188","A young woman becomes the fourth wife of a wealthy lord, and must learn to live with the strict rules and tensions within the household."
+327,Dom za vesanje,1988,142,8.1,,0.28,"31,880","In this luminous tale set in the area around Sarajevo and in Italy, Perhan, an engaging young Romany (gypsy) with telekinetic powers, is seduced by the quick-cash world of petty crime, which threatens to destroy him and those he loves."
+328,Queen,2013,146,8.1,,1.43,"67,312",A Delhi girl from a traditional family sets out on a solo honeymoon after her marriage gets cancelled.
+329,La Grande Illusion,1937,113,8.1,,0.17,"37,887","During WWI, two French soldiers are captured and imprisoned in a German P.O.W. camp. Several escape attempts follow until they are eventually sent to a seemingly inescapable fortress."
+330,Article 15,2019,130,8.1,,,"35,490","In the rural heartlands of India, an upright police officer sets out on a crusade against violent caste-based crimes and discrimination."
+331,OMG: Oh My God!,2012,125,8.1,,0.92,"61,292",A shopkeeper takes God to court when his shop is destroyed by an earthquake.
+332,Pink,III 2016,136,8.1,,1.24,"46,744","When three young women are implicated in a crime, a retired lawyer steps forward to help them clear their names."
+333,Jean de Florette,1986,120,8.1,,4.94,"26,827",A greedy landowner and his backward nephew conspire to block the only water source for an adjoining property in order to bankrupt the owner and force him to sell.
+334,Munna Bhai M.B.B.S.,2003,156,8.1,,,"85,192",A gangster sets out to fulfill his father's dream of becoming a doctor.
+335,Mandariinid,2013,87,8.1,73,0.14,"47,771","In 1992, war rages in Abkhazia, a breakaway region of Georgia. An Estonian man Ivo has decided to stay behind and harvest his crops of tangerines. In a bloody conflict at his door, a wounded man is left behind, and Ivo takes him in."
+336,Sarfarosh,1999,174,8.1,,,"26,353","After his brother is killed and father severely injured by terrorists, a young med student quits his studies to join the Indian Police Service to wipe out the terrorists."
+337,The Circus,1928,72,8.1,90,,"35,081",The Tramp finds work and the girl of his dreams at a circus.
+338,Hera Pheri,2000,156,8.1,,,"70,007","Three unemployed men look for answers to all their money problems - but when their opportunity arrives, will they know what to do with it?"
+339,Eskiya,1996,128,8.1,,,"71,111","Baran the Bandit, released from prison after 35 years, searches for vengeance and his lover."
+340,Chak De! India,2007,153,8.1,68,1.11,"82,653","Kabir Khan, the coach of the Indian Women's National Hockey Team, dreams of making his all-girls team emerge victorious against all odds."
+341,Black,2005,122,8.1,,0.73,"35,570","The cathartic tale of a young woman who can't see, hear, or speak, and the teacher who brings a ray of light into her dark world."
+342,Her Sey Çok Güzel Olacak,1998,107,8.1,,,"26,551","When Altan swipes prescription drugs from his brother Nuri's pharmacy, they soon find themselves on a dangerous but funny road trip to get rid of the stuff and escape the mafiosi Altan ... See full summary »"
+343,Anand,1971,122,8.1,,,"34,607","The story of a terminally ill man who wishes to live life to the fullest before the inevitable occurs, as told by his best friend."
+344,Mission: Impossible - Dead Reckoning Part One,2023,163,8,81,,"1,10,366",Ethan Hunt and his IMF team must track down a dangerous weapon before it falls into the wrong hands.
+345,Dune: Part One,2021,155,8,74,108.33,"7,00,476",A noble family becomes embroiled in a war for control over the galaxy's most valuable asset while its heir becomes troubled by visions of a dark future.
+346,Blade Runner 2049,2017,164,8,81,92.05,"6,15,385","Young Blade Runner K's discovery of a long-buried secret leads him to track down former Blade Runner Rick Deckard, who's been missing for thirty years."
+347,La La Land,2016,128,8,94,151.1,"6,25,365","While navigating their careers in Los Angeles, a pianist and an actress fall in love while attempting to reconcile their aspirations for the future."
+348,Guardians of the Galaxy,2014,121,8,76,333.18,"12,33,511",A group of intergalactic criminals must pull together to stop a fanatical warrior with plans to purge the universe.
+349,The Imitation Game,2014,114,8,71,91.13,"7,96,469","During World War II, the English mathematical genius Alan Turing tries to crack the German Enigma code with help from fellow mathematicians while attempting to come to terms with his troubled private life."
+350,The Revenant,I 2015,156,8,76,183.64,"8,36,807",A frontiersman on a fur trading expedition in the 1820s fights for survival after being mauled by a bear and left for dead by members of his own hunting team.
+351,The Martian,2015,144,8,80,228.43,"8,88,025","An astronaut becomes stranded on Mars after his team assume him dead, and must rely on his ingenuity to find a way to signal to Earth that he is alive and can survive until a potential rescue."
+352,Deadpool,2016,108,8,65,363.07,"10,79,838","A wisecracking mercenary gets experimented on and becomes immortal yet hideously scarred, and sets out to track down the man who ruined his looks."
+353,The Princess Bride,1987,98,8,77,30.86,"4,38,629","A bedridden boy's grandfather reads him the story of a farmboy-turned-pirate who encounters numerous obstacles, enemies and allies in his quest to be reunited with his true love."
+354,CODA,2021,111,8,72,,"1,49,834","As a CODA (Child of Deaf Adults) Ruby is the only hearing person in her deaf family. When the family's fishing business is threatened, Ruby finds herself torn between pursuing her passion at Berklee College of Music and her fear of abandoning her parents."
+355,Black Swan,2010,108,8,79,106.95,"7,95,010","Nina is a talented but unstable ballerina on the verge of stardom. Pushed to the breaking point by her artistic director and a seductive rival, Nina's grip on reality slips, plunging her into a waking nightmare."
+356,Donnie Darko,2001,113,8,88,1.48,"8,25,457","After narrowly escaping a bizarre accident, a troubled teenager is plagued by visions of a man in a large rabbit suit who manipulates him to commit a series of crimes."
+357,Rosemary's Baby,1968,137,8,96,,"2,25,405","A young couple trying for a baby moves into an aging, ornate apartment building on Central Park West, where they find themselves surrounded by peculiar neighbors."
+358,The Avengers,2012,143,8,69,623.28,"14,26,050",Earth's mightiest heroes must come together and learn to fight as a team if they are going to stop the mischievous Loki and his alien army from enslaving humanity.
+359,Her,2013,126,8,91,25.57,"6,42,655","In a near future, a lonely writer develops an unlikely relationship with an operating system designed to meet his every need."
+360,JFK,1991,189,8,72,70.41,"1,63,659",New Orleans District Attorney Jim Garrison discovers there's more to the Kennedy assassination than the official story.
+361,Zootopia,2016,108,8,78,341.27,"5,22,567","In a city of anthropomorphic animals, a rookie bunny cop and a cynical con artist fox must work together to uncover a conspiracy."
+362,The Incredibles,2004,115,8,90,261.44,"7,72,122","While trying to lead a quiet suburban life, a family of undercover superheroes are forced into action to save the world."
+363,Sin City,2005,124,8,74,74.1,"7,81,917","An exploration of the dark and miserable Basin City and three of its residents, all of whom are caught up in violent corruption."
+364,Casino Royale,2006,144,8,80,167.45,"6,75,695","After earning 00 status and a licence to kill, secret agent James Bond sets out on his first mission as 007. Bond must defeat a private banker funding terrorists in a high-stakes game of poker at Casino Royale, Montenegro."
+365,Rain Man,1988,133,8,65,178.8,"5,30,976","After a selfish L.A. yuppie learns his estranged father left a fortune to an autistic-savant brother in Ohio that he didn't know existed, he absconds with his brother and sets out across the country, hoping to gain a larger inheritance."
+366,Scent of a Woman,1992,156,8,59,63.9,"3,14,155","A prep school student needing money agrees to ""babysit"" a blind man, but the job is not at all what he anticipated."
+367,Magnolia,1999,188,8,78,22.46,"3,21,223","An epic mosaic of interrelated characters in search of love, forgiveness and meaning in the San Fernando Valley."
+368,Dances with Wolves,1990,181,8,72,184.21,"2,79,380","Lieutenant John Dunbar, assigned to a remote western Civil War outpost, finds himself engaging with a neighbouring Sioux settlement, causing him to question his own purpose."
+369,Soul,2020,100,8,83,,"3,52,258","After landing the gig of a lifetime, a New York jazz pianist suddenly finds himself trapped in a strange land between Earth and the afterlife."
+370,The Pursuit of Happyness,2006,117,8,64,163.57,"5,37,225",A struggling salesman takes custody of his son as he's poised to begin a life-changing professional career.
+371,Big Fish,2003,125,8,58,66.26,"4,50,162",A frustrated son tries to determine the fact from fiction in his dying father's life.
+372,Aladdin,1992,90,8,86,217.35,"4,43,751",A kind-hearted street urchin and a power-hungry Grand Vizier vie for a magic lamp that has the power to make their deepest wishes come true.
+373,Groundhog Day,1993,101,8,72,70.91,"6,57,183","A narcissistic, self-centered weatherman finds himself in a time loop on Groundhog Day, and the day keeps repeating until he gets it right."
+374,Twelve Monkeys,1995,129,8,74,57.14,"6,32,578","In a future world devastated by disease, a convict is sent back in time to gather information about the man-made virus that wiped out most of the human population on the planet."
+375,Planet of the Apes,1968,112,8,79,33.4,"1,86,673",An astronaut crew crash-lands on a planet where highly intelligent non-human ape species are dominant and humans are enslaved.
+376,Young Frankenstein,1974,106,8,83,86.3,"1,63,912","An American grandson of the infamous scientist, struggling to prove that his grandfather was not as insane as people believe, is invited to Transylvania, where he discovers the process that reanimates a dead body."
+377,Kill Bill: Vol. 2,2004,137,8,83,66.21,"7,79,726","The Bride continues her quest of vengeance against her former boss and lover Bill, the reclusive bouncer Budd, and the treacherous, one-eyed Elle."
+378,Pâfekuto burû,1997,81,8,67,0.78,"86,050","A pop singer gives up her career to become an actress, but she slowly goes insane when she starts being stalked by an obsessed fan and what seems to be a ghost of her past."
+379,The Graduate,1967,106,8,83,104.95,"2,82,028",A disillusioned college graduate finds himself torn between his older lover and her daughter.
+380,The King's Speech,2010,118,8,88,138.8,"6,94,785","The story of King George VI, his unexpected ascension to the throne of the British Empire in 1936, and the speech therapist who helped the unsure monarch overcome his stammer."
+381,Blood Diamond,2006,143,8,64,57.37,"5,68,384","A fisherman, a smuggler, and a syndicate of businessmen match wits over the possession of a priceless diamond."
+382,Slumdog Millionaire,2008,120,8,84,141.32,"8,62,246","A Mumbai teenager reflects on his life after being accused of cheating on the Indian version of ""Who Wants to be a Millionaire?""."
+383,Contratiempo,2016,106,8,,,"1,84,819",A successful entrepreneur accused of murder and a witness preparation expert have less than three hours to come up with an impregnable defense.
+384,Dog Day Afternoon,1975,125,8,86,50,"2,66,106","Three amateur bank robbers plan to hold up a bank. A nice simple robbery: Walk in, take the money, and run. Unfortunately, the supposedly uncomplicated heist suddenly becomes a bizarre nightmare as everything that could go wrong does."
+385,Beauty and the Beast,1991,84,8,95,218.97,"4,67,789",A prince cursed to spend his days as a hideous monster sets out to regain his humanity by earning a young woman's love.
+386,Akira,1988,124,8,67,0.55,"1,95,907","A secret military project endangers Neo-Tokyo when it turns a biker gang member into a rampaging psychic psychopath who can only be stopped by a teenager, his gang of biker friends and a group of psychics."
+387,Do the Right Thing,1989,120,8,93,27.55,"1,07,768","On the hottest day of the year on a street in the Bedford-Stuyvesant section of Brooklyn, everyone's hate and bigotry smolders and builds until it explodes into violence."
+388,The Bourne Ultimatum,2007,115,8,85,227.47,"6,47,042",Jason Bourne dodges a ruthless C.I.A. official and his Agents from a new assassination program while searching for the origins of his life as a trained killer.
+389,Dogville,2003,178,8,61,1.53,"1,54,110","A woman on the run from the mob is reluctantly accepted in a small Colorado community in exchange for labor, but when a search visits the town she finds out that their support has a price."
+390,Life of Brian,1979,94,8,77,20.05,"4,12,019","Born on the original Christmas in the stable next door to Jesus Christ, Brian of Nazareth spends his life being mistaken for a messiah."
+391,Papillon,1973,151,8,58,53.27,"1,34,978","A French convict in the 1930s befriends a fellow criminal as the two of them begin serving their sentence in the South American penal colony on Devil's Island, which inspires the man to plot his escape."
+392,Lion,2016,118,8,69,51.74,"2,44,006","A five-year-old Indian boy is adopted by an Australian couple after getting lost hundreds of kilometers from home. 25 years later, he sets out to find his lost family."
+393,Chung Hing sam lam,1994,102,8,78,0.6,"89,420","Two melancholy Hong Kong policemen fall in love: one with a mysterious female underworld figure, the other with a beautiful and ethereal waitress at a late-night restaurant he frequents."
+394,Butch Cassidy and the Sundance Kid,1969,110,8,66,102.31,"2,21,995","Wyoming, early 1900s. Butch Cassidy and The Sundance Kid are the leaders of a band of outlaws. After a train robbery goes wrong they find themselves on the run with a posse hard on their heels. Their solution - escape to Bolivia."
+395,Mommy,I 2014,139,8,74,3.49,"59,678","A widowed single mother, raising her violent son alone, finds new hope when a mysterious neighbor inserts herself into their household."
+396,Annie Hall,1977,93,8,92,39.2,"2,71,517","Alvy Singer, a divorced Jewish comedian, reflects on his relationship with ex-lover Annie Hall, an aspiring nightclub singer, which ended abruptly just like his previous marriages."
+397,Ip Man,2008,106,8,59,,"2,29,635","During the Japanese invasion of China, a wealthy martial artist is forced to leave his home when his city is occupied. With little means of providing for themselves, Ip Man and the remaining members of the city must find a way to survive."
+398,Sling Blade,1996,135,8,84,24.48,"96,594","Karl Childers, a simple man hospitalized since his childhood murder of his mother and her lover, is released to start a new life in a small town."
+399,The Last Picture Show,1971,118,8,93,29.13,"50,454","In 1951, a group of high schoolers come of age in a bleak, isolated, atrophied North Texas town that is slowly dying, both culturally and economically."
+400,The Hustler,1961,134,8,90,8.28,"84,722",An up-and-coming pool player plays a long-time champion in a single high-stakes match.
+401,Rio Bravo,1959,141,8,93,12.54,"65,766","A small-town sheriff in the American West enlists the help of a disabled man, a drunk, and a young gunfighter in his efforts to hold in jail the brother of the local bad guy."
+402,Kaze no tani no Naushika,1984,117,8,86,0.5,"1,75,613",Warrior and pacifist Princess Nausicaä desperately struggles to prevent two warring nations from destroying themselves and their dying planet.
+403,Roman Holiday,1953,118,8,78,,"1,43,403",A bored and sheltered princess escapes her guardians and falls in love with an American newsman in Rome.
+404,Solaris,1972,167,8,93,,"95,182",A psychologist is sent to a station orbiting a distant planet in order to discover what has caused the crew to go insane.
+405,Tenkû no shiro Rapyuta,1986,125,8,78,,"1,73,834",A young boy and a girl with a magic crystal must race against pirates and foreign agents in a search for a legendary floating castle.
+406,Cinderella Man,2005,144,8,69,61.65,"1,93,322","The story of James J. Braddock, a supposedly washed-up boxer who came back to challenge for the heavyweight championship of the world."
+407,Gandhi,1982,191,8,79,52.77,"2,36,927",The life of the lawyer who became the famed leader of the Indian revolts against the British rule through his philosophy of nonviolent protest.
+408,The Night of the Hunter,1955,92,8,97,0.65,"93,289","A religious fanatic marries a gullible widow whose young children are reluctant to tell him where their real daddy hid the $10,000 he'd stolen in a robbery."
+409,Fiddler on the Roof,1971,181,8,67,80.5,"45,855","In pre-revolutionary Russia, a Jewish peasant with traditional values contends with marrying off three of his daughters with modern romantic ideals while growing anti-Semitic sentiment threatens his village."
+410,Pink Floyd: The Wall,1982,95,8,47,22.24,"83,482",A confined but troubled rock star descends into madness in the midst of his physical and social isolation from everyone.
+411,Zerkalo,1975,107,8,82,0.18,"49,732","A dying man in his forties remembers his past. His childhood, his mother, the war, personal moments and things that tell of the recent history of all the Russian nation."
+412,High Noon,1952,85,8,89,9.45,"1,07,588","A town Marshal, despite the disagreements of his newlywed bride and the townspeople around him, must face a gang of deadly killers alone at ""high noon"" when the gang leader, an outlaw he ""sent up"" years ago, arrives on the noon train."
+413,The Maltese Falcon,1941,100,8,97,2.11,"1,63,160","San Francisco private detective Sam Spade takes on a case that involves him with three eccentric criminals, a gorgeous liar and their quest for a priceless statuette, with the stakes rising after his partner is murdered."
+414,La dolce vita,1960,174,8,95,19.52,"76,010",A series of stories following a week in the life of a philandering tabloid journalist living in Rome.
+415,What Ever Happened to Baby Jane?,1962,134,8,75,4.05,"59,319",A former child star torments her paraplegic sister in their decaying Hollywood mansion.
+416,8½,1963,138,8,93,0.05,"1,21,910",A harried movie director retreats into his memories and fantasies.
+417,Der Himmel über Berlin,1987,128,8,79,3.33,"73,924","An angel tires of his purely ethereal life of merely overseeing the human activity of Berlin's residents, and longs for the tangible joys of physical existence when he falls in love with a mortal."
+418,The Straight Story,1999,112,8,86,6.2,"93,802",An old man makes a long journey by lawnmower to mend his relationship with an ill brother.
+419,Fitzcarraldo,1982,158,8,,,"36,896","The story of Brian Sweeney Fitzgerald, an extremely determined man who intends to build an opera house in the middle of a jungle."
+420,Anatomy of a Murder,1959,161,8,95,11.9,"68,884","An upstate Michigan lawyer defends a soldier who claims he killed an innkeeper due to temporary insanity after the victim raped his wife. What is the truth, and will he win his case?"
+421,WolfWalkers,2020,103,8,87,,"35,961",A young apprentice hunter and her father journey to Ireland to help wipe out the last wolf pack. But everything changes when she befriends a free-spirited girl from a mysterious tribe rumored to transform into wolves by night.
+422,Mou gaan dou,2002,101,8,75,0.17,"1,28,324","A story between a mole in the police department and an undercover cop. Their objectives are the same: to find out who is the mole, and who is the cop."
+423,Kaguya-hime no monogatari,2013,137,8,89,1.51,"50,445","Found inside a shining stalk of bamboo by an old bamboo cutter and his wife, a tiny girl grows rapidly into an exquisite young lady. The mysterious young princess enthralls all who encounter her, but ultimately she must confront her fate, the punishment for her crime."
+424,"Quo vadis, Aida?",2020,101,8,97,,"36,359","Aida is a translator for the UN in the small town of Srebrenica. When the Serbian army takes over the town, her family is among the thousands of citizens looking for shelter in the UN camp."
+425,Who's Afraid of Virginia Woolf?,1966,131,8,75,,"77,992","A bitter, aging couple, with the help of alcohol, use their young houseguests to fuel anguish and emotional pain towards each other over the course of a distressing night."
+426,Secrets & Lies,1996,136,8,91,13.42,"45,460","Following the death of her adoptive parents, a successful young black optometrist establishes contact with her biological mother -- a lonely white factory worker living in poverty in East London."
+427,Bãhubali: The Beginning,2015,159,8,,6.74,"1,31,308","A child from the Mahishmati kingdom is raised by tribal people and one day learns about his royal heritage, his father's bravery in battle and a mission to overthrow the incumbent ruler."
+428,Il gattopardo,1963,186,8,100,,"27,615","The Prince of Salina, a noble aristocrat of impeccable integrity, tries to preserve his family and class amid the tumultuous social upheavals of 1860s Sicily."
+429,Das Cabinet des Dr. Caligari,1920,76,8,,,"67,190","Hypnotist Dr. Caligari uses a somnambulist, Cesare, to commit murders."
+430,Touch of Evil,1958,95,8,99,2.24,"1,07,423","A stark, perverse story of murder, kidnapping and police corruption in a Mexican border town."
+431,La leggenda del pianista sull'oceano,1998,169,8,58,0.26,"67,190","A baby boy discovered on an ocean liner in 1900 grows into a musical prodigy, never setting foot on land."
+432,Nostalgia,1983,125,8,,0.01,"28,799","A Russian poet and his interpreter travel to Italy researching the life of an 18th-century composer, and instead meet a ruminative madman who tells the poet how the world may be saved."
+433,Tropa de Elite,2007,115,8,33,0.01,"1,07,348","In 1997 Rio de Janeiro, Captain Nascimento has to find a substitute for his position while trying to take down drug dealers and criminals before the Pope visits."
+434,Le Samouraï,1967,105,8,,0.04,"54,192",After professional hitman Jef Costello is seen by witnesses his efforts to provide himself an alibi drive him further into a corner.
+435,Dare mo shiranai,2004,141,8,88,0.68,"29,750","In a small Tokyo apartment, twelve-year-old Akira must care for his younger siblings after their mother leaves them and shows no sign of returning."
+436,Song of the Sea,2014,93,8,85,0.86,"61,161","Ben, a young Irish boy, and his little sister Saoirse, a girl who can turn into a seal, go on an adventure to free the fairies and save the spirit world."
+437,Out of the Past,1947,97,8,85,,"39,347","A private eye escapes his past to run a gas station in a small town, but his past catches up with him. Now he must return to the big city world of danger, corruption, double crosses, and duplicitous dames."
+438,Le scaphandre et le papillon,2007,112,8,92,5.99,"1,09,134",The true story of Elle editor Jean-Dominique Bauby who suffers a stroke and has to live with an almost totally paralyzed body; only his left eye isn't paralyzed.
+439,Brief Encounter,1945,86,8,92,,"42,316","Meeting a stranger in a railway station, a woman is tempted to cheat on her husband."
+440,Au revoir les enfants,1987,104,8,88,4.54,"35,164","A French boarding school run by priests seems to be a haven from World War II until a new student arrives. Occupying the next bed in the dormitory to the top student in his class, the two young boys begin to form a bond."
+441,Yeopgijeogin geunyeo,2001,137,8,,,"49,515","A young man sees a drunk, cute woman standing too close to the tracks at a metro station in Seoul and pulls her back. She ends up getting him into trouble repeatedly after that, starting on the train."
+442,Sleuth,1972,138,8,,4.08,"49,065","A man who loves games and theater invites his wife's lover to meet him, setting up a battle of wits with potentially deadly results."
+443,Sweet Smell of Success,1957,96,8,100,,"34,241",Powerful but unethical Broadway columnist J.J. Hunsecker coerces unscrupulous press agent Sidney Falco into breaking up his sister's romance with a jazz musician.
+444,Mar adentro,I 2004,126,8,74,2.09,"83,743","The factual story of Spaniard Ramon Sampedro, who fought a 28-year campaign in favor of euthanasia and his own right to die."
+445,Viskningar och rop,1972,91,8,,1.74,"35,743","When a woman dying of cancer in early twentieth-century Sweden is visited by her two sisters, long-repressed feelings between the siblings rise to the surface."
+446,Persepolis,2007,96,8,90,4.45,"97,675",A precocious and outspoken Iranian girl grows up during the Islamic Revolution.
+447,Stalag 17,1953,120,8,84,,"57,352","After two Americans are killed while escaping from a German P.O.W. camp in World War II, the barracks black marketeer, J.J. Sefton, is suspected of being an informer."
+448,Ivanovo detstvo,1962,95,8,,,"38,428","During WWII, Soviet orphan Ivan Bondarev strikes up a friendship with three sympathetic Soviet officers while working as a scout behind the German lines."
+449,Sanjuro,1962,96,8,,,"39,803","A crafty samurai helps a young man and his fellow clansmen trying to save his uncle, who has been framed and imprisoned by a corrupt superintendent."
+450,Okuribito,2008,130,8,68,1.5,"53,737",A newly unemployed cellist takes a job preparing the dead for funerals.
+451,"Crna macka, beli macor",1998,127,8,73,0.35,"55,338",Matko and his son Zare live on the banks of the Danube river and get by through hustling and basically doing anything to make a living. In order to pay off a business debt Matko agrees to marry off Zare to the sister of a local gangster.
+452,Dilwale Dulhania Le Jayenge,1995,189,8,,,"73,603","When Raj meets Simran in Europe, it isn't love at first sight but when Simran moves to India for an arranged marriage, love makes its presence felt."
+453,Kind Hearts and Coronets,1949,106,8,,,"38,738",A distant poor relative of the Duke D'Ascoyne plots to inherit the title by murdering the eight other heirs who stand ahead of him in the line of succession.
+454,Bom yeoreum gaeul gyeoul geurigo bom,2003,103,8,85,2.38,"85,120",A boy is raised by a Buddhist monk in an isolated floating temple where the years pass like the seasons.
+455,La strada,1954,108,8,,,"65,154","A care-free girl is sold to a traveling entertainer, consequently enduring physical and emotional pain along the way."
+456,M.S. Dhoni: The Untold Story,2016,184,8,,1.78,"64,196",The untold story of Mahendra Singh Dhoni's journey from ticket collector to trophy collector - the world-cup-winning captain of the Indian Cricket Team.
+457,Haider,2014,160,8,,0.9,"56,336","A young man returns to Kashmir after his father's disappearance to confront his uncle, whom he suspects of playing a role in his father's fate."
+458,The Shop Around the Corner,1940,99,8,96,0.2,"35,776","Two employees at a gift shop can barely stand each other, without realizing that they are falling in love through the post as each other's anonymous pen pal."
+459,Ahlat Agaci,2018,188,8,86,0.03,"25,989","An unpublished writer returns to his hometown after graduating, where he seeks sponsors to publish his book while dealing with his father's deteriorating indulgence into gambling."
+460,El ángel exterminador,1962,95,8,,,"34,423",The guests at an upper-class dinner party find themselves unable to leave.
+461,Central do Brasil,1998,110,8,80,5.6,"41,117","The emotive journey of a former schoolteacher who writes letters for illiterate people, and a young boy whose mother has just died, as they search for the father he never knew."
+462,Taegukgi hwinalrimyeo,2004,140,8,64,1.11,"40,502","When two brothers are forced to fight in the Korean War, the elder decides to take the riskiest missions if it will help shield the younger from battle."
+463,Tropa de Elite 2: O Inimigo Agora é Outro,2010,115,8,71,0.1,"85,101","After a prison riot, former-Captain Nascimento, now a high ranking security officer in Rio de Janeiro, is swept into a bloody political dispute that involves government officials and paramilitary groups."
+464,Roma città aperta,1945,103,8,,,"27,934","During the Nazi occupation of Rome in 1944, the Resistance leader, Giorgio Manfredi, is chased by the Nazis as he seeks refuge and a way to escape."
+465,G.O.R.A.,2004,127,8,,,"64,984",A slick young Turk kidnapped by extraterrestrials shows his great « humanitarian spirit » by outwitting the evil commander-in-chief of the planet of G.O.R.A.
+466,Nattvardsgästerna,1963,81,8,,,"26,171",A small-town priest struggles with his faith.
+467,Vizontele,2001,110,8,,,"37,844","Lives of residents in a small, Anatolian village change when television is introduced to them."
+468,Lage Raho Munna Bhai,2006,144,8,,2.22,"48,408",Munna Bhai embarks on a journey with Mahatma Gandhi in order to fight against a corrupt property dealer.
+469,Special Chabbis,2013,144,8,,1.08,"57,762",A gang of con-men rob prominent rich businessmen and politicians by posing as C.B.I and income tax officers.
+470,Nefes: Vatan Sagolsun,2009,128,8,,,"34,552",Story of 40-man Turkish task force who must defend a relay station.
+471,Andaz Apna Apna,1994,160,8,,,"54,402",Two slackers competing for the affections of an heiress inadvertently become her protectors from an evil criminal.
+472,Puss in Boots: The Last Wish,2022,102,7.9,73,168.46,"1,46,066","When Puss in Boots discovers that his passion for adventure has taken its toll and he has burned through eight of his nine lives, he launches an epic journey to restore them by finding the mythical Last Wish."
+473,Titanic,1997,194,7.9,75,659.33,"12,38,632","A seventeen-year-old aristocrat falls in love with a kind but poor artist aboard the luxurious, ill-fated R.M.S. Titanic."
+474,Zack Snyder's Justice League,2021,242,7.9,54,,"4,20,074","Determined to ensure that Superman's ultimate sacrifice wasn't in vain, Bruce Wayne recruits a team of metahumans to protect the world from an approaching threat of catastrophic proportions."
+475,Avatar,2009,162,7.9,83,760.51,"13,55,689",A paraplegic Marine dispatched to the moon Pandora on a unique mission becomes torn between following his orders and protecting the world he feels is his home.
+476,Arrival,II 2016,116,7.9,81,100.55,"7,28,588",A linguist works with the military to communicate with alien lifeforms after twelve mysterious spacecraft appear around the world.
+477,Knives Out,2019,130,7.9,82,165.36,"7,35,106","A detective investigates the death of the patriarch of an eccentric, combative family."
+478,Edge of Tomorrow,2014,113,7.9,71,100.21,"7,07,149","A soldier fighting aliens gets to relive the same day over and over again, the day restarting every time he dies."
+479,Bohemian Rhapsody,2018,134,7.9,49,216.43,"5,62,655","The story of the legendary British rock band Queen and lead singer Freddie Mercury, leading up to their famous performance at Live Aid (1985)."
+480,Iron Man,2008,126,7.9,79,318.41,"10,91,753","After being held captive in an Afghan cave, billionaire engineer Tony Stark creates a unique weaponized suit of armor to fight evil."
+481,Star Trek,2009,127,7.9,82,257.73,"6,12,641",The brash James T. Kirk tries to live up to his father's legacy with Mr. Spock keeping him in check as a vengeful Romulan from the future creates black holes to destroy the Federation one planet at a time.
+482,Harry Potter and the Prisoner of Azkaban,2004,142,7.9,82,249.36,"6,62,076","Harry Potter, Ron and Hermione return to Hogwarts School of Witchcraft and Wizardry for their third year of study, where they delve into the mystery surrounding an escaped prisoner who poses a dangerous threat to the young wizard."
+483,Fantastic Mr. Fox,2009,87,7.9,83,21,"2,52,714",An urbane fox cannot resist returning to his farm raiding ways and then must help his community survive the farmers' retaliation.
+484,Thor: Ragnarok,2017,130,7.9,74,315.06,"7,85,526","Imprisoned on the planet Sakaar, Thor must race against time to return to Asgard and stop Ragnarök, the destruction of his world, at the hands of the powerful and ruthless villain Hela."
+485,Mulholland Dr.,2001,147,7.9,86,7.22,"3,70,038","After a car wreck on the winding Mulholland Drive renders a woman amnesiac, she and a perky Hollywood-hopeful search for clues and answers across Los Angeles in a twisting venture beyond dreams and reality."
+486,True Romance,1993,119,7.9,59,12.28,"2,35,012","In Detroit, a pop culture nerd steals cocaine from his new wife's pimp and tries to sell it in Hollywood, prompting the mobsters who own the drugs to pursue the couple."
+487,Boogie Nights,1997,155,7.9,85,26.4,"2,74,418","Back when sex was safe, pleasure was a business and business was booming, an idealistic porn producer aspires to elevate his craft to an art when he discovers a hot young talent."
+488,Jojo Rabbit,2019,108,7.9,58,33.37,"4,16,416",A young German boy in the Hitler Youth whose hero and imaginary friend is the country's dictator is shocked to discover that his mother is hiding a Jewish girl in their home.
+489,The Perks of Being a Wallflower,2012,103,7.9,67,17.74,"5,31,126","Charlie, a 15-year-old introvert, enters high school and is nervous about his new life. When he befriends his seniors, he learns to cope with his friend's suicide and his tumultuous past."
+490,The Blues Brothers,1980,133,7.9,60,57.23,"2,07,336","Jake Blues rejoins with his brother Elwood after being released from prison, but the duo has just days to reunite their old R&B band and save the Catholic home where the two were raised, outrunning the police as they tear through Chicago."
+491,Almost Famous,2000,122,7.9,90,32.53,"2,85,714",A high-school boy in the early 1970s is given the chance to write a story for Rolling Stone magazine about an up-and-coming rock band as he accompanies them on their concert tour.
+492,Marriage Story,2019,137,7.9,94,2,"3,28,893",Noah Baumbach's incisive and compassionate look at a marriage breaking up and a family staying together.
+493,The Bourne Identity,2002,119,7.9,68,121.66,"5,62,285","A man is picked up by a fishing boat, bullet-riddled and suffering from amnesia, before racing to elude assassins and attempting to regain his memory."
+494,E.T. the Extra-Terrestrial,1982,115,7.9,92,435.11,"4,24,017",A troubled child summons the courage to help a friendly alien escape from Earth and return to his home planet.
+495,Shrek,2001,90,7.9,84,267.67,"7,06,312","A mean lord exiles fairytale creatures to the swamp of a grumpy ogre, who must go on a quest and rescue a princess for the lord in order to get his land back."
+496,In Bruges,2008,107,7.9,67,7.76,"4,48,373","Guilt-stricken after a job gone wrong, hitman Ray and his partner await orders from their ruthless boss in Bruges, Belgium, the last place in the world Ray wants to be."
+497,In the Heat of the Night,1967,110,7.9,76,24.38,"80,282","A black Philadelphia police detective is mistakenly suspected of a local murder while passing through a racially hostile Mississippi town, and after being cleared is reluctantly asked by the police chief to investigate the case."
+498,Shaun of the Dead,2004,99,7.9,76,13.54,"5,75,899","The uneventful, aimless lives of a London electronics salesman and his layabout roommate are disrupted by the zombie apocalypse."
+499,X-Men: Days of Future Past,2014,132,7.9,75,233.92,"7,29,460",The X-Men send Wolverine to the past in a desperate effort to change history and prevent an event that results in doom for both humans and mutants.
+500,Children of Men,2006,109,7.9,84,35.55,"5,14,552","In 2027, in a chaotic world in which women have somehow become infertile, a former activist agrees to help transport a miraculously pregnant woman to a sanctuary at sea."
+501,Wonder,I 2017,113,7.9,66,132.42,"1,72,027","Based on the New York Times bestseller, this movie tells the incredibly inspiring and heartwarming story of August Pullman, a boy with facial differences who enters the fifth grade, attending a mainstream elementary school for the first time."
+502,District 9,2009,112,7.9,81,115.65,"6,99,157",Violence ensues after an extraterrestrial race forced to live in slum-like conditions on Earth finds a kindred spirit in a government agent exposed to their biotechnology.
+503,Mystic River,2003,138,7.9,84,90.14,"4,70,600",The lives of three men who were childhood friends are shattered when one of them has a family tragedy.
+504,The Philadelphia Story,1940,112,7.9,96,,"71,905","When a rich woman's ex-husband and a tabloid-type reporter turn up just before her planned remarriage, she begins to learn the truth about herself."
+505,Dallas Buyers Club,2013,117,7.9,77,27.3,"5,04,335","In 1985 Dallas, electrician and hustler Ron Woodroof works around the system to help AIDS patients get the medication they need after he is diagnosed with the disease."
+506,Life of Pi,2012,127,7.9,79,124.99,"6,49,664","A young man who survives a disaster at sea is hurtled into an epic journey of adventure and discovery. While cast away, he forms an unexpected connection with another survivor: a fearsome Bengal tiger."
+507,Edward Scissorhands,1990,105,7.9,74,56.36,"5,06,750",The solitary life of an artificial man - who was incompletely constructed and has scissors for hands - is upended when he is taken in by a suburban family.
+508,This Is Spinal Tap,1984,82,7.9,92,4.74,"1,43,552","Spinal Tap, one of England's loudest bands, is chronicled by film director Marty DiBergi on what proves to be a fateful tour."
+509,Boyhood,I 2014,165,7.9,100,25.38,"3,61,538","The life of Mason, from early childhood to his arrival at college."
+510,Toy Story 2,1999,92,7.9,88,245.85,"6,00,951","When Woody is stolen by a toy collector, Buzz and his friends set out on a rescue mission to save Woody before he becomes a museum toy property with his roundup gang Jessie, Prospector, and Bullseye."
+511,Carlito's Way,1993,144,7.9,66,36.95,"2,25,948","A Puerto Rican former convict, just released from prison, pledges to stay away from drugs and violence despite the pressure around him and lead on to a better life outside of N.Y.C."
+512,Brazil,1985,132,7.9,84,9.93,"2,06,294",A bureaucrat in a dystopic society becomes an enemy of the state as he pursues the woman of his dreams.
+513,Spartacus,1960,197,7.9,87,30,"1,39,331","The slave Spartacus survives brutal training as a gladiator and leads a violent revolt against the decadent Roman Republic, as the ambitious Crassus seeks to gain power by crushing the uprising."
+514,The Nightmare Before Christmas,1993,76,7.9,82,75.08,"3,54,263","Jack Skellington, king of Halloween Town, discovers Christmas Town, but his attempts to bring Christmas to his home causes confusion."
+515,Per un pugno di dollari,1964,99,7.9,65,14.5,"2,25,217","A wandering gunfighter plays two rival families against each other in a town torn apart by greed, pride, and revenge."
+516,The Ten Commandments,1956,220,7.9,,93.74,"74,769","Moses, raised as a prince of Egypt in the Pharaoh's household, learns of his true heritage as a Hebrew and his divine mission as the deliverer of his people from slavery."
+517,Charade,1963,113,7.9,83,13.47,"81,967",Romance and suspense ensue in Paris as a woman is pursued by several men who want a fortune her murdered husband had stolen. Whom can she trust?
+518,Kôkaku kidôtai,1995,83,7.9,76,0.52,"1,50,058",A cyborg policewoman and her partner hunt a mysterious and powerful hacker called the Puppet Master.
+519,Wo hu cang long,2000,120,7.9,94,128.08,"2,76,811",A young Chinese warrior steals a sword from a famed swordsman and then escapes into a world of romantic adventure with a mysterious man in the frontier of the nation.
+520,Låt den rätte komma in,2008,114,7.9,82,2.12,"2,22,219","Oskar, an overlooked and bullied boy, finds love and revenge through Eli, a beautiful but peculiar girl."
+521,The Wrestler,2008,109,7.9,80,26.24,"3,14,231","A faded professional wrestler must retire, but finds his quest for a new life outside the ring a dispiriting struggle."
+522,All the President's Men,1976,138,7.9,84,70.6,"1,21,618","""The Washington Post"" reporters Bob Woodward and Carl Bernstein uncover the details of the Watergate scandal that leads to President Richard Nixon's resignation."
+523,Before Midnight,2013,109,7.9,94,8.11,"1,66,107",We meet Jesse and Celine nine years on in Greece. Almost two decades have passed since their first meeting on that train bound for Vienna.
+524,Bound by Honor,1993,180,7.9,47,4.5,"32,929","Based on the true life experiences of poet Jimmy Santiago Baca, the film focuses on step-brothers Paco and Cruz, and their bi-racial cousin Miklo."
+525,Doctor Zhivago,1965,197,7.9,69,111.72,"79,911","The life of a Russian physician and poet who, although married to another, falls in love with a political activist's wife and experiences hardship during World War I and then the October Revolution."
+526,Nosferatu,1922,94,7.9,,,"1,01,519",Vampire Count Orlok expresses interest in a new residence and real estate agent Hutter's wife.
+527,Notorious,1946,102,7.9,100,10.46,"1,04,350",The daughter of a convicted Nazi spy is asked by American agents to gather information on a ring of Nazi scientists in South America. How far will she have to go to ingratiate herself with them?
+528,Manbiki kazoku,2018,121,7.9,93,3.31,"81,707","On the margins of Tokyo, a dysfunctional band of outsiders are united by loyalty, a penchant for petty theft and playful grifting. When the young son is arrested, secrets are exposed that upend their tenuous, below-the-radar existence."
+529,Ying xiong,2002,120,7.9,85,53.71,"1,85,034","A defense officer, Nameless, was summoned by the King of Qin regarding his success of terminating three warriors."
+530,The Killing,1956,84,7.9,91,,"93,578",Crook Johnny Clay assembles a five-man team to plan and execute a daring racetrack robbery.
+531,Being There,1979,130,7.9,83,30.18,"75,363","After the death of his employer forces him out of the only home he's ever known, a simpleminded, sheltered gardener becomes an unlikely trusted advisor to a powerful tycoon and an insider in Washington politics."
+532,Serbuan maut 2: Berandal,2014,150,7.9,71,2.63,"1,28,092","Only a short time after the first raid, Rama goes undercover with the thugs of Jakarta and plans to bring down the syndicate and uncover the corruption within his police force."
+533,The Searchers,1956,119,7.9,94,,"93,390",An American Civil War veteran embarks on a years-long journey to rescue his niece from the Comanches after the rest of his brother's family is massacred in a raid on their Texas farm.
+534,A Streetcar Named Desire,1951,122,7.9,97,8,"1,11,818",Disturbed Blanche DuBois moves in with her sister in New Orleans and is tormented by her brutish brother-in-law while her reality crumbles around her.
+535,The Wild Bunch,1969,145,7.9,98,12.06,"87,997","An aging group of outlaws look for one last big score as the ""traditional"" American West is disappearing around them."
+536,King Kong,1933,100,7.9,92,10,"88,428","A film crew goes to a tropical island for a location shoot, where they capture a colossal ape who takes a shine to their blonde starlet, and bring him back to New York City."
+537,Dancer in the Dark,2000,140,7.9,63,4.18,"1,13,668",An Eastern European US immigrant with a love for musicals has to cope with the gradual loss of her vision.
+538,A Christmas Story,1983,93,7.9,77,20.61,"1,61,373","In the 1940s, a young boy named Ralphie Parker attempts to convince his parents, teacher, and Santa Claus that a Red Ryder Range 200 Shot BB gun really is the perfect Christmas gift."
+539,Patton,1970,172,7.9,86,61.7,"1,05,637",The World War II phase of the career of controversial American general George S. Patton.
+540,Togo,2019,113,7.9,69,,"52,579","The story of Togo, the sled dog who led the 1925 serum run despite being considered too small and weak to lead such an intense race."
+541,Harold and Maude,1971,91,7.9,62,,"79,950","Young, rich, and obsessed with death, Harold finds himself changed forever when he meets lively septuagenarian Maude at a funeral."
+542,Sing Street,2016,106,7.9,79,3.24,"97,925",A boy growing up in Dublin during the 1980s escapes his strained family life by starting a band to impress the mysterious girl he likes.
+543,The Artist,I 2011,100,7.9,89,44.67,"2,45,519",An egomaniacal film star develops a relationship with a young dancer against the backdrop of Hollywood's silent era.
+544,The Manchurian Candidate,1962,126,7.9,94,,"77,664",An American POW in the Korean War is brainwashed as an unwitting assassin for an international Communist conspiracy.
+545,The Big Sleep,1946,114,7.9,86,6.54,"88,413","Private detective Philip Marlowe is hired by a wealthy family. Before the complex case is over, he's seen murder, blackmail and what might be love."
+546,Trois couleurs: Bleu,1993,94,7.9,87,1.32,"1,06,876",A woman struggles to find a way to live her life after the death of her husband and child.
+547,Once Were Warriors,1994,102,7.9,77,2.2,"35,797",A family descended from Maori warriors is bedeviled by a violent father and the societal problems of being treated as outcasts.
+548,Short Term 12,2013,96,7.9,82,1.01,"89,975",A 20-something supervising staff member of a residential treatment facility navigates the troubled waters of that world alongside her co-worker and longtime boyfriend.
+549,Harvey,1950,104,7.9,,,"57,092","Due to his insistence that he has an invisible six foot-tall rabbit for a best friend, a whimsical middle-aged man is thought by his family to be insane - but he may be wiser than anyone knows."
+550,The Lion in Winter,1968,134,7.9,,22.28,"32,913","1183 A.D.: King Henry II's three sons all want to inherit the throne, but he won't commit to a choice. When he allows his imprisoned wife Eleanor of Aquitaine out for a Christmas visit, they all variously plot to force him into a decision."
+551,Rope,1948,80,7.9,73,,"1,48,933",Two men attempt to prove they committed the perfect crime by hosting a dinner party after strangling their former classmate to death.
+552,Strangers on a Train,1951,101,7.9,88,7.63,"1,37,645",A psychopath forces a tennis star to comply with his theory that two strangers can get away with murder.
+553,In Cold Blood,1967,134,7.9,89,,"27,918","Two ex-cons murder a family in a robbery attempt, before going on the run from the authorities. The police try to piece together the details of the murder in an attempt to track down the killers."
+554,Hable con ella,2002,112,7.9,86,9.36,"1,15,402",Two men share an odd friendship while they care for two women who are both in deep comas.
+555,Il conformista,1970,113,7.9,100,0.54,"32,373","A weak-willed Italian man becomes a fascist flunky who goes abroad to arrange the assassination of his old teacher, now a political dissident."
+556,Sacrifice,1986,149,7.9,,0.3,"29,863","At the dawn of World War III, a man searches for a way to restore peace to the world and finds he must give something in return."
+557,Bin-jip,2004,88,7.9,72,0.24,"56,869",A transient young man breaks into empty homes to partake of the vacationing residents' lives for a few days.
+558,Gegen die Wand,2004,121,7.9,78,,"56,154","With the intention to break free from the strict familial restrictions, a suicidal young woman sets up a marriage of convenience with a forty-year-old addict, an act that will lead to an outburst of envious love."
+559,Cat on a Hot Tin Roof,1958,108,7.9,84,17.57,"51,866",Brick is an alcoholic ex-football player who drinks his days away and resists the affections of his wife. A reunion with his terminal father jogs a host of memories and revelations for both father and son.
+560,Arsenic and Old Lace,1944,118,7.9,,,"73,105",A Brooklyn writer of books on the futility of marriage risks his reputation after he decides to tie the knot. Things get even more complicated when he learns on his wedding day that his beloved maiden aunts are habitual murderers.
+561,Amour,2012,127,7.9,95,6.74,"1,03,400","Georges and Anne are an octogenarian couple. They are cultivated, retired music teachers. Their daughter, also a musician, lives in Britain with her family. One day, Anne has a stroke, and the couple's bond of love is severely tested."
+562,Le cercle rouge,1970,140,7.9,92,0.37,"26,928","After leaving prison, master thief Corey crosses paths with a notorious escapee and an alcoholic former policeman. The trio proceed to plot an elaborate heist."
+563,Kagemusha,1980,180,7.9,84,,"37,080",A petty thief with an utter resemblance to a samurai warlord is hired as the lord's double. When the warlord later dies the thief is forced to take up arms in his place.
+564,Laura,1944,88,7.9,,4.36,"49,418",A police detective falls in love with the woman whose murder he is investigating.
+565,The Adventures of Robin Hood,1938,102,7.9,97,3.98,"53,115","When Prince John and the Norman Lords begin oppressing the Saxon masses in King Richard's absence in 1190s England, a Saxon lord fights back as the outlaw leader of a resistance movement."
+566,My Name Is Khan,2010,165,7.9,50,4.02,"1,11,629",An Indian Muslim man with Asperger's syndrome takes a challenge to speak to the President of the United States seriously and embarks on a cross-country journey.
+567,Taeksi woonjunsa,2017,137,7.9,69,1.53,"28,077","A widowed father and taxi driver who drives a German reporter from Seoul to Gwangju to cover the 1980 uprising, soon finds himself regretting his decision after being caught in the violence around him."
+568,Hiroshima mon amour,1959,90,7.9,,0.09,"34,371",A French actress filming an anti-war film in Hiroshima has an affair with a married Japanese architect as they share their differing perspectives on war.
+569,Darbareye Elly,2009,119,7.9,87,0.11,"55,529",The mysterious disappearance of a kindergarten teacher during a picnic in the north of Iran is followed by a series of misadventures for her fellow travelers.
+570,Mildred Pierce,1945,111,7.9,88,,"27,604",A hard-working mother inches towards disaster as she divorces her husband and starts a successful restaurant business to support her spoiled daughter.
+571,Amarcord,1973,123,7.9,,0.58,"45,440",A series of comedic and nostalgic vignettes set in a 1930s Italian coastal town.
+572,Kal Ho Naa Ho,2003,186,7.9,54,1.79,"72,406","Naina, an introverted, perpetually depressed girl's life changes when she meets Aman. But Aman has a secret of his own which changes their lives forever. Embroiled in all this is Rohit, Naina's best friend who conceals his love for her."
+573,Miracle on 34th Street,1947,96,7.9,88,2.65,"51,389","After a divorced New York mother hires a nice old man to play Santa Claus at Macy's, she is startled by his claim to be the genuine article. When his sanity is questioned, a lawyer defends him in court by arguing that he's not mistaken."
+574,In a Lonely Place,1950,94,7.9,,,"33,546","A potentially violent screenwriter is a murder suspect until his lovely neighbor clears him. However, she soon starts to have her doubts."
+575,The Thin Man,1934,91,7.9,86,,"31,518","Former detective Nick Charles and his wealthy wife Nora investigate a murder case, mostly for the fun of it."
+576,Ascenseur pour l'échafaud,1958,91,7.9,94,0.11,"27,413","A self-assured businessman murders his employer, the husband of his mistress, which unintentionally provokes an ill-fated chain of events."
+577,The Big Heat,1953,89,7.9,,,"27,922",Tough cop Dave Bannion takes on a politically powerful crime syndicate.
+578,The Lost Weekend,1945,101,7.9,,9.46,"38,956",The desperate life of a chronic alcoholic is followed through a four-day drinking bout.
+579,Sullivan's Travels,1941,90,7.9,,,"27,728",Hollywood director John L. Sullivan sets out to experience life as a homeless person in order to gain relevant life experience for his next movie.
+580,Hoje Eu Quero Voltar Sozinho,2014,96,7.9,71,0.1,"26,780","Leonardo is a blind teenager searching for independence. His everyday life, the relationship with his best friend Giovana, and the way he sees the world change completely with the arrival of Gabriel."
+581,"4 luni, 3 saptamâni si 2 zile",2007,113,7.9,97,1.19,"62,141",A woman assists her friend in arranging an illegal abortion in 1980s Romania.
+582,Gully Boy,2019,154,7.9,65,5.57,"41,774",A coming-of-age story based on the lives of street rappers in Mumbai.
+583,La Belle et la Bête,1946,96,7.9,92,0.3,"27,365","A beautiful young woman takes her father's place as the prisoner of a mysterious beast, who wishes to marry her."
+584,Bronenosets Potemkin,1925,75,7.9,97,0.05,"59,862","In the midst of the Russian Revolution of 1905, the crew of the battleship Potemkin mutiny against the brutal, tyrannical regime of the vessel's officers. The resulting street demonstration in Odessa brings on a police massacre."
+585,Jab We Met,2007,138,7.9,,0.41,"56,156",A depressed wealthy businessman finds his life changing after he meets a spunky and care-free young woman.
+586,Vozvrashchenie,2003,110,7.9,82,0.5,"46,543","In the Russian wilderness, two brothers face a range of new, conflicting emotions when their father - a man they know only through a single photograph - resurfaces."
+587,Nueve reinas,2000,114,7.9,80,1.22,"55,207","Two con artists try to swindle a stamp collector by selling him a sheet of counterfeit rare stamps (the ""nine queens"")."
+588,C.R.A.Z.Y.,2005,129,7.9,81,,"33,683","A young French Canadian, one of five boys in a conservative family in the 1960s and 1970s, struggles to reconcile his emerging identity with his father's values."
+589,Såsom i en spegel,1961,90,7.9,84,,"26,523","Recently released from a mental hospital, Karin rejoins her emotionally disconnected family in their island home, only to slip from reality as she begins to believe she is being visited by God."
+590,La règle du jeu,1939,110,7.9,99,,"30,374","A bourgeois life in France at the onset of World War II, as the rich and their poor servants meet up at a French chateau."
+591,Dev.D,2009,144,7.9,,0.01,"31,570","After breaking up with his childhood sweetheart, a young man finds solace in drugs. Meanwhile, a teenage girl is caught in the world of prostitution. Will they be destroyed, or will they find redemption?"
+592,No Man's Land,I 2001,98,7.9,84,1.06,"48,084","Bosnia and Herzegovina during 1993 at the time of the heaviest fighting between the two warring sides. Two soldiers from opposing sides in the conflict, Nino and Ciki, become trapped in no man's land, whilst a third soldier becomes a living booby trap."
+593,Super 30,2019,154,7.9,,2.27,"34,529",Based on the life of Patna-based mathematician Anand Kumar who runs the famed Super 30 program for IIT aspirants in Patna.
+594,Badhaai ho,2018,124,7.9,,,"36,357",A man is embarrassed when he finds out his mother is pregnant.
+595,Padman,2018,140,7.9,,1.66,"27,518","Upon realizing the extent to which women are affected by their menses, a man sets out to create a sanitary pad machine and to provide inexpensive sanitary pads to the women of rural India."
+596,Baby,I 2015,159,7.9,,,"59,034","An elite counter-intelligence unit learns of a plot, masterminded by a maniacal madman. With the clock ticking, it's up to them to track the terrorists' international tentacles and prevent them from striking at the heart of India."
+597,Airlift,2016,130,7.9,,,"58,010","When Iraq invades Kuwait in August 1990, a callous Indian businessman becomes the spokesperson for more than 170,000 stranded countrymen."
+598,Dunkirk,2017,106,7.8,94,188.37,"6,98,509","Allied soldiers from Belgium, the British Commonwealth and Empire, and France are surrounded by the German Army and evacuated during a fierce battle in World War II."
+599,John Wick: Chapter 4,2023,169,7.8,78,,"2,53,713","John Wick uncovers a path to defeating The High Table. But before he can earn his freedom, Wick must face off against a new enemy with powerful alliances across the globe and forces that turn old friends into foes."
+600,The Batman,2022,176,7.8,72,369.35,"7,16,891","When a sadistic serial killer begins murdering key political figures in Gotham, Batman is forced to investigate the city's hidden corruption and question his family's involvement."
+601,Everything Everywhere All at Once,2022,139,7.8,81,72.86,"4,67,995",A middle-aged Chinese immigrant is swept up into an insane adventure in which she alone can save existence by exploring other universes and connecting with the lives she could have led.
+602,Little Women,2019,135,7.8,91,108.1,"2,24,357","Jo March reflects back and forth on her life, telling the beloved story of the March sisters - four young women, each determined to live life on her own terms."
+603,Pride & Prejudice,2005,129,7.8,82,38.41,"3,12,693","Sparks fly when spirited Elizabeth Bennet meets single, rich, and proud Mr. Darcy. But Mr. Darcy reluctantly finds himself falling in love with a woman beneath his class. Can each overcome their own pride and prejudice?"
+604,Drive,I 2011,100,7.8,78,35.06,"6,74,111",A mysterious Hollywood action film stuntman gets in trouble with gangsters when he tries to help his neighbor's husband rob a pawn shop while serving as his getaway driver.
+605,The Notebook,2004,123,7.8,53,81,"5,93,448","A poor yet passionate young man falls in love with a rich young woman, giving her a sense of freedom. However, social differences soon get in the way."
+606,The Big Short,2015,130,7.8,81,70.26,"4,54,190","In 2006-2007 a group of investors bet against the United States mortgage market. In their research, they discover how flawed and corrupt the market is."
+607,The Gentlemen,2019,113,7.8,51,36.47,"3,66,423","An American expat tries to sell off his highly profitable marijuana empire in London, triggering plots, schemes, bribery and blackmail in an attempt to steal his domain out from under him."
+608,Im Westen nichts Neues,2022,148,7.8,76,,"2,15,899",A young German soldier's terrifying experiences and distress on the western front during World War I.
+609,About Time,I 2013,123,7.8,55,15.32,"3,68,517","At the age of 21, Tim discovers he can travel in time and change what happens and has happened in his own life. His decision to make his world a better place by getting a girlfriend turns out not to be as easy as you might think."
+610,The Breakfast Club,1985,97,7.8,66,45.88,"4,19,768",Five high school students meet in Saturday detention and discover how they have a great deal more in common than they thought.
+611,Willy Wonka & the Chocolate Factory,1971,100,7.8,67,4,"2,11,951",A poor but hopeful boy seeks one of the five coveted golden tickets that will send him on a tour of Willy Wonka's mysterious chocolate factory.
+612,The Hateful Eight,2015,168,7.8,68,54.12,"6,30,884","In the dead of a Wyoming winter, a bounty hunter and his prisoner find shelter in a cabin currently inhabited by a collection of nefarious characters."
+613,Back to the Future Part II,1989,108,7.8,57,118.5,"5,53,871","After visiting 2015, Marty McFly must repeat his visit to 1955 to prevent disastrous changes to 1985...without interfering with his first trip."
+614,Call Me by Your Name,2017,132,7.8,94,18.1,"2,93,275","In 1980s Italy, romance blossoms between a seventeen-year-old student and the older man hired as his father's research assistant."
+615,Get Out,I 2017,104,7.8,85,176.04,"6,49,440","A young African-American visits his White girlfriend's parents for the weekend, where his simmering uneasiness about their reception of him eventually reaches a boiling point."
+616,Atonement,2007,123,7.8,85,50.93,"2,89,972",Thirteen-year-old fledgling writer Briony Tallis irrevocably changes the course of several lives when she accuses her older sister's lover of a crime he did not commit.
+617,The Irishman,2019,209,7.8,94,7,"4,09,097","An illustration of Frank Sheeran's life, from W.W.II veteran to hit-man for the Bufalino crime family and his alleged assassination of his close friend Jimmy Hoffa."
+618,Tombstone,1993,130,7.8,50,56.51,"1,57,941","A successful lawman's plans to retire anonymously in Tombstone, Arizona are disrupted by the kind of outlaws he was famous for eliminating."
+619,Ghostbusters,1984,105,7.8,71,238.63,"4,28,989","Three parapsychologists forced out of their university funding set up shop as a unique ghost removal service in New York City, attracting frightened yet skeptical customers."
+620,RRR (Rise Roar Revolt),2022,187,7.8,83,14.5,"1,54,291",A fictitious story about two legendary revolutionaries and their journey away from home before they started fighting for their country in the 1920s.
+621,Hot Fuzz,2007,121,7.8,81,23.64,"5,21,270","A skilled London police officer, after irritating superiors with his embarrassing effectiveness, is transferred to a village where the easygoing officers object to his fervor for regulations, as a string of grisly murders strikes the town."
+622,Apocalypto,2006,139,7.8,68,50.87,"3,22,116","As the Mayan kingdom faces its decline, a young man is taken on a perilous journey to a world ruled by fear and oppression."
+623,The Social Network,2010,120,7.8,95,96.96,"7,30,242","As Harvard student Mark Zuckerberg creates the social networking site that would become known as Facebook, he is sued by the twins who claimed he stole their idea and by the co-founder who was later squeezed out of the business."
+624,Nightcrawler,2014,117,7.8,76,32.38,"5,77,227","When Louis Bloom, a con man desperate for work, muscles into the world of L.A. crime journalism, he blurs the line between observer and participant to become the star of his own story."
+625,Hidden Figures,2016,127,7.8,74,169.61,"2,43,640",The story of a team of female African-American mathematicians who served a vital role in NASA during the early years of the U.S. space program.
+626,Rogue One,2016,133,7.8,65,532.18,"6,62,973","In a time of conflict, a group of unlikely heroes band together on a mission to steal the plans to the Death Star, the Empire's ultimate weapon of destruction."
+627,The Curious Case of Benjamin Button,2008,166,7.8,70,127.51,"6,73,710","Tells the story of Benjamin Button, a man who starts aging backwards with consequences."
+628,The Girl with the Dragon Tattoo,2011,158,7.8,71,102.52,"4,77,967",Journalist Mikael Blomkvist is aided in his search for a woman who has been missing for 40 years by young computer hacker Lisbeth Salander.
+629,Predator,1987,107,7.8,47,59.74,"4,38,305",A team of commandos on a mission in a Central American jungle find themselves hunted by an extraterrestrial warrior.
+630,The Hobbit: An Unexpected Journey,2012,169,7.8,58,303,"8,48,998","A reluctant Hobbit, Bilbo Baggins, sets out to the Lonely Mountain with a spirited group of dwarves to reclaim their mountain home, and the gold within it from the dragon Smaug."
+631,Little Miss Sunshine,2006,101,7.8,80,59.89,"5,00,734",A family determined to get their young daughter into the finals of a beauty pageant take a cross-country trip in their VW bus.
+632,The Sandlot,1993,101,7.8,55,32.42,"98,129","In the summer of 1962, a new kid in town is taken under the wing of a young baseball prodigy and his rowdy team, resulting in many adventures."
+633,Manchester by the Sea,2016,137,7.8,96,47.7,"2,97,099",A depressed uncle is asked to take care of his teenage nephew after the boy's father dies.
+634,The Untouchables,1987,119,7.8,79,76.27,"3,21,305","During Prohibition, Treasury agent Eliot Ness sets out to stop ruthless Chicago gangster Al Capone, and assembles a small, incorruptible team to help him."
+635,Star Wars: Episode VII - The Force Awakens,2015,138,7.8,80,936.66,"9,52,718","As a new threat to the galaxy rises, Rey, a desert scavenger, and Finn, an ex-stormtrooper, must join Han Solo and Chewbacca to search for the one hope of restoring peace."
+636,Ferris Bueller's Day Off,1986,103,7.8,61,70.14,"3,73,042","A popular high school student, admired by his peers, decides to take a day off from school, and goes to extreme lengths to it pull off, to the chagrin of his Principal who'll do anything to stop him."
+637,Remember the Titans,2000,113,7.8,48,115.65,"2,24,242",The true story of a newly appointed African-American coach and his high school team on their first season as a racially integrated unit.
+638,Cast Away,2000,143,7.8,73,233.63,"6,15,383",A FedEx executive undergoes a physical and emotional transformation after crash landing on a deserted island.
+639,Moonrise Kingdom,2012,94,7.8,84,45.51,"3,60,026","A pair of young lovers flee their New England town, which causes a local search party to fan out to find them."
+640,Close,I 2022,104,7.8,81,,"26,078","The intense friendship between two thirteen-year old boys Leo and Remi suddenly gets disrupted. Struggling to understand what has happened, Léo approaches Sophie, Rémi's mother. ""Close"" is a film about friendship and responsibility."
+641,A Bronx Tale,1993,121,7.8,80,17.27,"1,51,710",A father becomes worried when a local gangster befriends his son in the Bronx in the 1960s.
+642,Skyfall,2012,143,7.8,81,304.36,"7,14,083","James Bond's loyalty to M is tested when her past comes back to haunt her. When MI6 comes under attack, 007 must track down and destroy the threat, no matter how personal the cost."
+643,Taken,I 2008,90,7.8,51,145,"6,18,149","A retired CIA agent travels across Europe and relies on his old skills to save his estranged daughter, who has been kidnapped while on a trip to Paris."
+644,Verdens verste menneske,2021,128,7.8,90,,"82,883","The chronicles of four years in the life of Julie, a young woman who navigates the troubled waters of her love life and struggles to find her career path, leading her to take a realistic look at who she really is."
+645,Captain America: Civil War,2016,147,7.8,75,408.08,"8,20,591",Political involvement in the Avengers' affairs causes a rift between Captain America and Iron Man.
+646,Misery,1990,107,7.8,75,61.28,"2,23,326","After a famous author is rescued from a car crash by a fan of his novels, he comes to realize that the care he is receiving is only the beginning of a nightmare of captivity and abuse."
+647,Captain Fantastic,2016,118,7.8,72,5.88,"2,27,323","In the forests of the Pacific Northwest, a father devoted to raising his six kids with a rigorous physical and intellectual education is forced to leave his paradise and enter the world, challenging his idea of what it means to be a parent."
+648,The Last Samurai,2003,154,7.8,55,111.11,"4,55,812",An American military advisor embraces the Samurai culture he was hired to destroy after he is captured in battle.
+649,The Fugitive,1993,130,7.8,87,183.88,"3,07,181","Dr. Richard Kimble, unjustly accused of murdering his wife, must find the real killer while being the target of a nationwide manhunt led by a seasoned U.S. Marshal."
+650,The Man from Earth,2007,87,7.8,,,"1,93,908",An impromptu goodbye party for Professor John Oldman becomes a mysterious interrogation after the retiring scholar reveals to his colleagues he has a longer and stranger past than they can imagine.
+651,Isle of Dogs,2018,101,7.8,82,32.02,"1,81,265","Set in Japan, Isle of Dogs follows a boy's odyssey in search of his lost dog."
+652,Moon,2009,97,7.8,67,5.01,"3,68,507","Astronaut Sam Bell has a quintessentially personal encounter toward the end of his three-year stint on the Moon, where he, working alongside his computer, GERTY, sends back to Earth parcels of a resource that has helped diminish our planet's power problems."
+653,Midnight Cowboy,1969,113,7.8,79,44.79,"1,15,986","A naive hustler travels from Texas to New York City to seek personal fortune, finding a new friend in the process."
+654,Captain Phillips,2013,134,7.8,82,107.1,"4,77,897","The true story of Captain Richard Phillips and the 2009 hijacking by Somali pirates of the U.S.-flagged MV Maersk Alabama, the first American cargo ship to be hijacked in two hundred years."
+655,Captain America: The Winter Soldier,2014,136,7.8,70,259.77,"8,74,310","As Steve Rogers struggles to embrace his role in the modern world, he teams up with a fellow Avenger and S.H.I.E.L.D agent, Black Widow, to battle a new threat from history: an assassin known as the Winter Soldier."
+656,American Gangster,2007,157,7.8,76,130.16,"4,39,617","An outcast New York City cop is charged with bringing down Harlem drug lord Frank Lucas, whose real life inspired this partly biographical film."
+657,Awakenings,1990,121,7.8,74,52.1,"1,51,004","The victims of an encephalitis epidemic many years ago have been catatonic ever since, but now a new drug offers the prospect of reviving them."
+658,Thirteen Lives,2022,147,7.8,66,,"62,461",A rescue mission is assembled in Thailand where a group of young boys and their soccer coach are trapped in a system of underground caves that are flooding.
+659,The Hobbit: The Desolation of Smaug,2013,161,7.8,66,258.37,"6,83,596","The dwarves, along with Bilbo Baggins and Gandalf the Grey, continue their quest to reclaim Erebor, their homeland, from Smaug. Bilbo Baggins is in possession of a mysterious and magical ring."
+660,The Fighter,I 2010,116,7.8,79,93.62,"3,79,574","Based on the story of Micky Ward, a fledgling boxer who tries to escape the shadow of his more famous but troubled older boxing brother and get his own shot at greatness."
+661,Serenity,2005,119,7.8,74,25.51,"3,01,365",The crew of the ship Serenity try to evade an assassin sent to recapture telepath River.
+662,Big Hero 6,2014,102,7.8,74,222.53,"4,82,096","A special bond develops between plus-sized inflatable robot Baymax and prodigy Hiro Hamada, who together team up with a group of friends to form a band of high-tech heroes."
+663,Ang-ma-reul bo-at-da,2010,144,7.8,67,0.13,"1,38,894",A secret agent exacts revenge on a serial killer through a series of captures and releases.
+664,Mary Poppins,1964,139,7.8,88,102.27,"1,79,683","In turn of the century London, a magical nanny employs music and adventure to help two neglected children become closer to their father."
+665,Straight Outta Compton,2015,147,7.8,72,161.2,"2,10,992","The rap group NWA emerges from the mean streets of Compton in Los Angeles, California, in the mid-1980s and revolutionizes Hip Hop culture with their music and tales about life in the hood."
+666,Boyz n the Hood,1991,112,7.8,76,57.5,"1,47,882","Follows the lives of three young males living in the Crenshaw ghetto of Los Angeles, dissecting questions of race, relationships, violence, and future prospects."
+667,Paddington 2,2017,103,7.8,88,40.44,"86,386","Paddington, now happily settled with the Brown family and a popular member of the local community, picks up a series of odd jobs to buy the perfect present for his Aunt Lucy's 100th birthday, only for the gift to be stolen."
+668,Gekijouban Jujutsu Kaisen 0,2021,105,7.8,71,34.54,"26,180","Yuta Okkotsu, a high schooler who gains control of an extremely powerful Cursed Spirit and gets enrolled in the Tokyo Prefectural Jujutsu High School by Jujutsu Sorcerers to help him control his power and keep an eye on him."
+669,GATTACA,1997,106,7.8,64,12.34,"3,14,373",A genetically inferior man assumes the identity of a superior one in order to pursue his lifelong dream of space travel.
+670,The Fall,I 2006,117,7.8,64,2.28,"1,14,753","In a hospital on the outskirts of 1920s Los Angeles, an injured stuntman begins to tell a fellow patient, a little girl with a broken arm, a fantastic story of five mythical heroes. Thanks to his fractured state of mind and her vivid imagination, the line between fiction and reality blurs as the tale advances."
+671,La montaña sagrada,1973,114,7.8,76,0.06,"45,907","In a corrupt, greed-fueled world, a powerful alchemist leads a messianic character and seven materialistic figures to the Holy Mountain, where they hope to achieve enlightenment."
+672,Walk the Line,2005,136,7.8,72,119.52,"2,59,051","A chronicle of country music legend Johnny Cash's life, from his early days on an Arkansas cotton farm to his rise to fame with Sun Records in Memphis, where he recorded alongside Elvis Presley, Jerry Lee Lewis, and Carl Perkins."
+673,The Day of the Jackal,1973,143,7.8,80,16.06,"42,949","In the aftermath of France allowing Algeria's independence, a group of resentful military veterans hire a professional assassin codenamed ""Jackal"" to kill President Charles de Gaulle."
+674,Kramer vs. Kramer,1979,105,7.8,77,106.26,"1,50,521","After his wife leaves him, a work-obsessed Manhattan advertising executive is forced to learn long-neglected parenting skills, but a heated custody battle over the couple's young son deepens the wounds left by the separation."
+675,The Remains of the Day,1993,134,7.8,86,22.95,"79,562",A butler who sacrificed body and soul to service in the years leading up to World War II realizes too late how misguided his loyalty was to his lordly employer.
+676,The Insider,1999,157,7.8,84,28.97,"1,75,847",A research chemist comes under personal and professional attack when he decides to appear in a 60 Minutes exposé on Big Tobacco.
+677,Män som hatar kvinnor,2009,152,7.8,76,10.1,"2,20,269",A journalist is aided by a young female hacker in his search for the killer of a woman who has been dead for forty years.
+678,Glory,1989,122,7.8,78,26.83,"1,40,071","Robert Gould Shaw leads the U.S. Civil War's first all-black volunteer company, fighting prejudices from both his own Union Army, and the Confederates."
+679,How to Train Your Dragon 2,2014,102,7.8,77,177,"3,51,114","When Hiccup and Toothless discover an ice cave that is home to hundreds of new wild dragons and the mysterious Dragon Rider, the two friends find themselves at the center of a battle to protect the peace."
+680,Mississippi Burning,1988,128,7.8,65,34.6,"1,05,287",Two F.B.I. Agents with wildly different styles arrive in Mississippi to investigate the disappearance of some civil rights activists.
+681,Majo no takkyûbin,1989,103,7.8,85,,"1,54,293","A young witch, on her mandatory year of independent life, finds fitting into a new community difficult while she supports herself by running an air courier service."
+682,Hunt for the Wilderpeople,2016,101,7.8,81,5.2,"1,36,291",A national manhunt is ordered for a rebellious kid and his foster uncle who go missing in the wild New Zealand bush.
+683,The King of Comedy,1982,109,7.8,73,2.5,"1,11,083","Rupert Pupkin is a passionate yet unsuccessful comic who craves nothing more than to be in the spotlight and to achieve this, he stalks and kidnaps his idol to take the spotlight for himself."
+684,The Conversation,1974,113,7.8,87,4.42,"1,16,744","A paranoid, secretive surveillance expert has a crisis of conscience when he suspects that the couple he is spying on will be murdered."
+685,Dawn of the Dead,1978,127,7.8,71,5.1,"1,24,891","During an escalating zombie epidemic, two Philadelphia SWAT team members, a traffic reporter and his TV executive girlfriend seek refuge in a secluded shopping mall."
+686,Changeling,2008,141,7.8,63,35.74,"2,60,921",Grief-stricken mother Christine Collins takes on the L.A.P.D. to her own detriment when they try to pass off an obvious impostor as her missing child.
+687,Night of the Living Dead,1968,96,7.8,89,0.09,"1,34,134",A ragtag group of Pennsylvanians barricade themselves in an old farmhouse to remain safe from a horde of flesh-eating ghouls that are ravaging the East Coast of the United States.
+688,Gaslight,1944,114,7.8,78,,"31,733","Ten years after her aunt was murdered in their London home, a woman returns from Italy in the 1880s to resume residence with her new husband. His obsessive interest in the home rises from a secret that may require driving his wife insane."
+689,La migliore offerta,2013,131,7.8,49,0.09,"1,24,280",A lonely art expert working for a mysterious and reclusive heiress finds not only her art worth examining.
+690,The Right Stuff,1983,193,7.8,91,21.5,"63,750","The U.S. space program's development from the breaking of the sound barrier to selection of the Mercury 7 astronauts, from a group of test pilots with a more seat-of-the-pants approach than the program's more cautious engineers preferred."
+691,Letters from Iwo Jima,2006,141,7.8,89,13.76,"1,67,040","The story of the battle of Iwo Jima between the United States and Imperial Japan during World War II, as told from the perspective of the Japanese who fought it."
+692,The Killing Fields,1984,141,7.8,76,34.7,"57,641","A journalist is trapped in Cambodia during tyrant Pol Pot's bloody 'Year Zero' cleansing campaign, which claimed the lives of two million 'undesirable' civilians."
+693,Les parapluies de Cherbourg,1964,91,7.8,86,0.03,"29,619",A young woman separated from her lover by war faces a life-altering decision.
+694,All That Jazz,1979,123,7.8,72,37.82,"33,742","Director/choreographer Bob Fosse tells his own life story as he details the sordid career of Joe Gideon, a womanizing, drug-using dancer."
+695,Ed Wood,1994,127,7.8,70,5.89,"1,80,542",Ambitious but troubled movie director Edward D. Wood Jr. tries his best to fulfill his dreams despite his lack of talent.
+696,My Fair Lady,1964,170,7.8,95,72,"98,938","In 1910s London, snobbish phonetics professor Henry Higgins agrees to a wager that he can make crude flower girl, Eliza Doolittle, presentable in high society."
+697,October Sky,1999,108,7.8,71,32.48,"95,181","The true story of Homer Hickam, a coal miner's son who was inspired by the first Sputnik launch to take up rocketry against his father's wishes."
+698,Cabaret,1972,124,7.8,80,42.77,"57,486",A female girlie club entertainer in Weimar Republic era Berlin romances two men while the Nazi Party rises to power around them.
+699,Days of Heaven,1978,94,7.8,93,,"60,617",A hot-tempered farm laborer convinces the woman he loves to marry their rich but dying boss so that they can have a claim to his fortune.
+700,The Outlaw Josey Wales,1976,135,7.8,69,31.8,"77,266",Missouri farmer Josey Wales joins a Confederate guerrilla unit and winds up on the run from the Union soldiers who murdered his family.
+701,My Left Foot: The Story of Christy Brown,1989,103,7.8,97,14.74,"77,442","Christy Brown, born with cerebral palsy, learns to paint and write with his only controllable limb - his left foot."
+702,The Day the Earth Stood Still,1951,92,7.8,83,,"84,093","An alien lands in Washington, D.C. and tells the people of Earth that they must live peacefully or be destroyed as a danger to other planets."
+703,Manhattan,1979,96,7.8,83,45.7,"1,43,735",The life of a divorced television writer dating a teenage girl is further complicated when he falls in love with his best friend's mistress.
+704,Batman: Mask of the Phantasm,1993,76,7.8,65,5.62,"54,175",Batman is wrongly implicated in a series of murders of mob bosses actually committed by a new vigilante assassin.
+705,Breaking the Waves,1996,159,7.8,81,4.04,"69,609","Oilman Jan is paralyzed in an accident. His wife, who prayed for his return, feels guilty; even more, when Jan urges her to have sex with another."
+706,Once,I 2007,86,7.8,90,9.44,"1,19,263","A modern-day musical about a busker and an immigrant and their eventful week in Dublin, as they write, rehearse and record songs that tell their love story."
+707,Guess Who's Coming to Dinner,1967,108,7.8,63,56.7,"47,432",A couple's attitudes are challenged when their daughter introduces them to her African-American fiancé.
+708,East of Eden,1955,118,7.8,72,,"47,506","Two brothers in 1910s California struggle to maintain their strict, Bible-toting father's favor as an old secret about their long-absent mother comes to light."
+709,Loving Vincent,2017,94,7.8,62,6.74,"60,975","In a story depicted in oil painted animation, a young man comes to the last hometown of painter Vincent van Gogh to deliver the troubled artist's final letter and ends up investigating his final days there."
+710,Mimi wo sumaseba,1995,111,7.8,75,,"67,650","A love story between a girl who loves reading books, and a boy who has previously checked out all of the library books she chooses."
+711,Pride,I 2014,119,7.8,79,,"60,002",U.K. gay activists work to help miners during their lengthy strike of the National Union of Mineworkers in the summer of 1984.
+712,Freaks,1932,64,7.8,80,0.63,"48,616","A circus' beautiful trapeze artist agrees to marry the leader of side-show performers, but his deformed friends discover she is only marrying him for his inheritance."
+713,Lilja 4-ever,2002,109,7.8,83,0.18,"47,527","Sixteen-year-old Lilja and her only friend, the young boy Volodja, live in Russia, fantasizing about a better life. One day, Lilja falls in love with Andrej, who is going to Sweden, and invites Lilja to come along and start a new life."
+714,Chugyeokja,2008,125,7.8,64,,"69,807",A disgraced ex-policeman who runs a small ring of prostitutes finds himself in a race against time when one of his women goes missing.
+715,Hannah and Her Sisters,1986,107,7.8,90,40.08,"73,918","Between two Thanksgivings two years apart, Hannah's husband falls in love with her sister Lee, while her hypochondriac ex-husband rekindles his relationship with her sister Holly."
+716,"Aguirre, der Zorn Gottes",1972,95,7.8,,,"59,643","In the 16th century, the ruthless and insane Don Lope de Aguirre leads a Spanish expedition in search of El Dorado."
+717,Bringing Up Baby,1938,102,7.8,91,,"64,291","While trying to secure a $1 million donation for his museum, a befuddled paleontologist is pursued by a flighty and often irritating heiress and her pet leopard, Baby."
+718,Stagecoach,1939,96,7.8,93,,"51,716",A group of people traveling on a stagecoach find their journey complicated by the threat of Geronimo and learn something about each other in the process.
+719,Frankenstein,1931,70,7.8,91,,"76,170",Dr. Frankenstein dares to tamper with life and death by creating a human monster out of lifeless body parts.
+720,Todo sobre mi madre,1999,101,7.8,87,8.26,"1,00,215","Pedro Almodovar's Oscar-winning comedy (Best Foreign Film, 1999) about a bereaved mother, and overwrought actress, her jealous lover and a pregnant nun."
+721,"I, Daniel Blake",2016,100,7.8,78,0.26,"62,566","After surviving a heart-attack, a 59-year-old carpenter must fight bureaucratic forces to receive Employment and Support Allowance."
+722,The Man Who Would Be King,1975,129,7.8,91,,"50,768","Two former British soldiers in 1880s India decide to set themselves up as Kings in Kafiristan, a land where no white man has set foot since Alexander the Great."
+723,Red River,1948,133,7.8,96,,"32,948","Dunson leads a cattle drive, the culmination of over 14 years of work, to its destination in Missouri. But his tyrannical behavior along the way causes a mutiny, led by his adopted son."
+724,Jûbê ninpûchô,1993,94,7.8,,,"39,216",A vagabond swordsman is aided by a kunoichi and a spy in battling a demonic clan of killers - led by a ghost from his past - who are bent on overthrowing the Tokugawa Shogunate.
+725,L'avventura,1960,144,7.8,,,"31,536","A woman disappears during a Mediterranean boating trip. During the search, her lover and her best friend become attracted to each other."
+726,Un prophète,2009,155,7.8,90,2.08,"1,00,583",A young Algerian man is sent to a French prison.
+727,His Girl Friday,1940,92,7.8,,0.3,"61,282",A newspaper editor uses every trick in the book to keep his ace reporter ex-wife from remarrying.
+728,Shadow of a Doubt,1943,108,7.8,94,,"68,196","A teenage girl, overjoyed when her favorite uncle comes to visit the family in their quiet California town, slowly begins to suspect that he is in fact the ""Merry Widow"" killer sought by the authorities."
+729,Das weiße Band - Eine deutsche Kindergeschichte,2009,144,7.8,84,2.22,"75,814","Strange events happen in a small village in the north of Germany during the years before World War I, which seem to be ritual punishment. Who is responsible?"
+730,Under sandet,2015,100,7.8,75,0.44,"43,733","In post-World War II Denmark, a group of young German POWs are forced to clear a beach of thousands of land mines under the watch of a Danish Sergeant who slowly learns to appreciate their plight."
+731,The Lunchbox,2013,104,7.8,76,4.23,"58,820",A mistaken delivery in Mumbai's famously efficient lunchbox delivery system connects a young housewife to an older man in the dusk of his life as they build a fantasy world together through notes in the lunchbox.
+732,The World's Fastest Indian,2005,127,7.8,68,5.13,"56,786","The story of New Zealander Burt Munro, who spent years rebuilding a 1920 Indian motorcycle, which helped him set the land speed world record at Utah's Bonneville Salt Flats in 1967."
+733,To Have and Have Not,1944,100,7.8,90,,"36,804","During World War II, American expatriate Harry Morgan helps transport a French Resistance leader and his beautiful wife to Martinique while romancing a sensuous lounge singer."
+734,Il postino,1994,108,7.8,81,21.85,"37,976","A simple Italian postman learns to love poetry while delivering mail to a famous poet, and then uses this to woo local beauty Beatrice."
+735,Le charme discret de la bourgeoisie,1972,102,7.8,93,0.2,"45,180","A surreal, virtually plotless series of dreams centered around six middle-class people and their consistently interrupted attempts to have a meal together."
+736,The Innocents,1961,100,7.8,88,2.62,"31,894",A young governess for two children becomes convinced that the house and grounds are haunted.
+737,Cowboy Bebop: Tengoku no tobira,2001,115,7.8,61,1,"51,069","A terrorist explosion releases a deadly virus on the masses, and it's up to the bounty-hunting Bebop crew to catch the cold-blooded culprit."
+738,Les choristes,2004,97,7.8,56,3.64,"65,066",The new teacher at a severely administered boys' boarding school works to positively affect the students' lives through music.
+739,The Asphalt Jungle,1950,112,7.8,85,,"28,739","A major heist goes off as planned, but then double crosses, bad luck and solid police work cause everything to unravel."
+740,Bride of Frankenstein,1935,75,7.8,95,4.36,"50,855","Mary Shelley reveals the main characters of her novel survived: Dr. Frankenstein, goaded by an even madder scientist, builds his monster a mate."
+741,You Can't Take It with You,1938,126,7.8,,4.66,"26,941","The son of a snobbish Wall Street banker becomes engaged to a woman from a good-natured but decidedly eccentric family, not realizing that his father is trying to force her family from their home for a real estate development."
+742,Dip huet seung hung,1989,111,7.8,82,,"49,837",A disillusioned assassin accepts one last hit in hopes of using his earnings to restore vision to a singer he accidentally blinded.
+743,Bir Zamanlar Anadolu'da,2011,157,7.8,82,0.14,"48,298",A group of men set out in search of a dead body in the Anatolian steppes.
+744,Soshite chichi ni naru,2013,121,7.8,73,0.28,"26,733","Ryota is a successful workaholic businessman. When he learns that his biological son was switched with another boy after birth, he faces the difficult decision to choose his true son or the boy he and his wife have raised as their own."
+745,Crimes and Misdemeanors,1989,104,7.8,77,18.25,"59,616",An ophthalmologist's mistress threatens to reveal their affair to his wife while a married documentary filmmaker is infatuated with another woman.
+746,Vivre sa vie: Film en douze tableaux,1962,80,7.8,,,"33,775",Twelve episodic tales in the life of a Parisian woman and her slow descent into prostitution.
+747,Tôkyô goddofâzâzu,2003,92,7.8,74,0.13,"43,664","On Christmas Eve, three homeless people living on the streets of Tokyo discover a newborn baby among the trash and set out to find its parents."
+748,Sennen joyû,2001,87,7.8,70,0.19,"30,127",A TV interviewer and his cameraman meet a former actress and travel through her memories and career.
+749,Veer-Zaara,2004,192,7.8,67,2.92,"55,254","""Veer-Zaara"" is a saga of love, separation, courage, and sacrifice. A love story that is an inspiration and will remain a legend forever."
+750,Duck Soup,1933,69,7.8,93,,"61,657","Rufus T. Firefly is named the dictator of bankrupt Freedonia and declares war on neighboring Sylvania over the love of his wealthy backer Mrs. Teasdale, contending with two inept spies who can't seem to keep straight which side they're on."
+751,Ma vie de Courgette,2016,66,7.8,85,0.29,"27,386","After losing his mother, a young boy is sent to an orphanage with other orphans his age where he begins to learn the meaning of trust and true love."
+752,Knockin' on Heaven's Door,1997,87,7.8,,0,"32,399","Two terminally ill patients escape from a hospital, steal a car and rush towards the sea."
+753,English Vinglish,2012,134,7.8,,1.67,"37,783","A quiet, sweet tempered housewife endures small slights from her well-educated husband and daughter every day because of her inability to speak and understand English."
+754,A Night at the Opera,1935,96,7.8,,2.54,"33,900",A sly business manager and the wacky friends of two opera singers in Italy help them achieve success in America while humiliating their stuffy and snobbish enemies.
+755,Vicky Donor,2012,126,7.8,,0.17,"44,538","A man is brought in by an infertility doctor to supply him with his sperm, where he becomes the biggest sperm donor for his clinic."
+756,Hindi Medium,2017,132,7.8,,,"30,887",A couple from Chandni Chowk aspire to give their daughter the best education and thus be a part of and accepted by the elite of Delhi.
+757,Mission: Impossible - Fallout,2018,147,7.7,86,220.16,"3,58,868","Ethan Hunt and his IMF team, along with some familiar allies, race against time after a mission gone wrong."
+758,The Whale,2022,117,7.7,60,,"1,65,969","A reclusive, morbidly obese English teacher attempts to reconnect with his estranged teenage daughter."
+759,The Banshees of Inisherin,2022,114,7.7,87,,"2,20,025","Two lifelong friends find themselves at an impasse when one abruptly ends their relationship, with alarming consequences for both of them."
+760,Aftersun,II 2022,102,7.7,95,,"70,047",Sophie reflects on the shared joy and private melancholy of a holiday she took with her father twenty years earlier. Memories real and imagined fill the gaps between as she tries to reconcile the father she knew with the man she didn't...
+761,Sicario,2015,121,7.7,82,46.89,"4,50,770",An idealistic FBI agent is enlisted by a government task force to aid in the escalating war against drugs at the border area between the U.S. and Mexico.
+762,The Goonies,1985,114,7.7,62,61.5,"2,87,606",A group of young misfits called The Goonies discover an ancient map and set out on an adventure to find a legendary pirate's long-lost treasure.
+763,Man on Fire,2004,146,7.7,47,77.91,"3,75,044","In Mexico City, a former CIA operative swears vengeance on those who committed an unspeakable act against the family he was hired to protect."
+764,Kingsman: The Secret Service,2014,129,7.7,60,128.26,"6,92,994","A spy organisation recruits a promising street kid into the agency's training program, while a global threat emerges from a twisted tech genius."
+765,Harry Potter and the Goblet of Fire,2005,157,7.7,81,290.01,"6,53,157","Harry Potter finds himself competing in a hazardous tournament between rival schools of magic, but he is distracted by recurring nightmares."
+766,Zodiac,2007,157,7.7,79,33.08,"5,68,990","Between 1968 and 1983, a San Francisco cartoonist becomes an amateur detective obsessed with tracking down the Zodiac Killer, an unidentified individual who terrorizes Northern California with a killing spree."
+767,(500) Days of Summer,2009,95,7.7,76,32.39,"5,35,849","After being dumped by the girl he believes to be his soulmate, hopeless romantic Tom Hansen reflects on their relationship to try and figure out where things went wrong and how he can win her back."
+768,Wind River,2017,107,7.7,73,33.8,"2,65,418","A wildlife officer, who is haunted by a tragedy that happened because of him, teams up with an FBI agent in solving a murder of a young woman on a Wyoming Native American reservation and hopes to get redemption from his past regrets."
+769,Ocean's Eleven,2001,116,7.7,74,183.42,"5,97,168",Danny Ocean and his ten accomplices plan to rob three Las Vegas casinos simultaneously.
+770,The Hangover,2009,100,7.7,73,277.32,"8,15,484","Three buddies wake up from a bachelor party in Las Vegas, with no memory of the previous night and the bachelor missing. They make their way around the city in order to find their friend before his wedding."
+771,Black Hawk Down,2001,144,7.7,74,108.64,"4,10,773","The story of 160 elite U.S. soldiers who dropped into Mogadishu in October 1993 to capture two top lieutenants of a renegade warlord, but found themselves in a desperate battle with a large force of heavily armed Somalis."
+772,Druk,2020,117,7.7,79,,"1,78,084",Four high-school teachers consume alcohol on a daily basis to see how it affects their social and professional lives.
+773,Airplane!,1980,88,7.7,78,83.4,"2,50,962","After the crew becomes sick with food poisoning, a neurotic ex-fighter pilot must land a commercial airplane full of passengers safely."
+774,The Count of Monte Cristo,2002,131,7.7,61,54.23,"1,44,051","A young man, falsely imprisoned by his jealous ""friend"", escapes and uses a hidden treasure to exact his revenge."
+775,Coraline,2009,100,7.7,80,75.29,"2,47,216","An adventurous 11-year-old girl finds another world that is a strangely idealized version of her frustrating home, but it has sinister secrets."
+776,La vie d'Adèle,2013,180,7.7,90,2.2,"1,58,327","Adèle's life is changed when she meets Emma, a young woman with blue hair, who will allow her to discover desire and to assert herself as a woman and as an adult. In front of others, Adèle grows, seeks herself, loses herself, and ultimately finds herself through love and loss."
+777,A Few Good Men,1992,138,7.7,62,141.34,"2,76,504",Military lawyer Lieutenant Daniel Kaffee defends Marines accused of murder. They contend they were acting under orders.
+778,Home Alone,1990,103,7.7,63,285.76,"6,08,894","An eight-year-old troublemaker, mistakenly left home alone, must defend his home against a pair of burglars on Christmas eve."
+779,Primal Fear,1996,129,7.7,47,56.12,"2,35,790","An altar boy is accused of murdering a priest, and the truth is buried several layers deep."
+780,Star Trek Into Darkness,2013,132,7.7,72,228.78,"4,91,195","After the crew of the Enterprise find an unstoppable force of terror from within their own organization, Captain Kirk leads a manhunt to a war-zone world to capture a one-man weapon of mass destruction."
+781,Harry Potter and the Deathly Hallows: Part 1,2010,146,7.7,65,295.98,"5,73,642","As Harry, Ron and Hermione race against time and evil to destroy the Horcruxes, they uncover the existence of the three most powerful objects in the wizarding world: the Deathly Hallows."
+782,Ex Machina,2014,108,7.7,78,25.44,"5,66,200",A young programmer is selected to participate in a ground-breaking experiment in synthetic intelligence by evaluating the human qualities of a highly advanced humanoid A.I.
+783,Deliverance,1972,109,7.7,80,7.06,"1,15,449","Intent on seeing the Cahulawassee River before it's dammed and turned into a lake, outdoor fanatic Lewis Medlock takes his friends on a canoeing trip they'll never forget into the dangerous American back-country."
+784,The Game,1997,129,7.7,63,48.32,"4,12,820","After a wealthy San Francisco banker is given an opportunity to participate in a mysterious game, his life is turned upside down as he begins to question if it might really be a concealed conspiracy to destroy him."
+785,Blue Velvet,1986,120,7.7,76,8.55,"2,07,984","The discovery of a severed human ear found in a field leads a young man on an investigation related to a beautiful, mysterious nightclub singer and a group of psychopathic criminals who have kidnapped her child."
+786,Apollo 13,I 1995,140,7.7,77,173.84,"3,05,800",NASA must devise a strategy to return Apollo 13 to Earth safely after the spacecraft undergoes massive internal damage putting the lives of the three astronauts on board in jeopardy.
+787,3:10 to Yuma,2007,122,7.7,76,53.61,"3,22,981",A small-time rancher agrees to hold a captured outlaw who's awaiting a train to go to court in Yuma. A battle of wills ensues as the outlaw tries to psych out the rancher.
+788,Brokeback Mountain,2005,134,7.7,87,83.04,"3,70,434",Ennis and Jack are two shepherds who develop a sexual and emotional relationship. Their relationship becomes complicated when both of them get married to their respective girlfriends.
+789,Training Day,2001,122,7.7,69,76.63,"4,53,998",A rookie cop spends his first day as a Los Angeles narcotics officer with a rogue detective who isn't what he appears to be.
+790,Silver Linings Playbook,2012,122,7.7,81,132.09,"7,25,800","After a stint in a mental institution, former teacher Pat Solitano moves back in with his parents and tries to reconcile with his ex-wife. Things get more challenging when Pat meets Tiffany, a mysterious girl with problems of her own."
+791,Mr. Nobody,2009,141,7.7,63,0,"2,40,388","A boy stands on a station platform as a train is about to leave. Should he go with his mother or stay with his father? Infinite possibilities arise from this decision. As long as he doesn't choose, anything is possible."
+792,The Last of the Mohicans,1992,112,7.7,76,75.51,"1,79,305",Three trappers protect the daughters of a British Colonel in the midst of the French and Indian War.
+793,Tangled,2010,100,7.7,71,200.82,"4,74,295","The magically long-haired Rapunzel has spent her entire life in a tower, but now that a runaway thief has stumbled upon her, she is about to discover the world for the first time, and who she really is."
+794,Y tu mamá también,2001,106,7.7,89,13.62,"1,26,393","In Mexico, two teenage boys and an attractive older woman embark on a road trip and learn a thing or two about life, friendship, sex, and each other."
+795,The Lego Movie,2014,100,7.7,83,257.76,"3,74,806","An ordinary LEGO construction worker, thought to be the prophesied as ""special"", is recruited to join a quest to stop an evil tyrant from gluing the LEGO universe into eternal stasis."
+796,Lost in Translation,2003,102,7.7,91,44.59,"4,70,517",A faded movie star and a neglected young woman form an unlikely bond after crossing paths in Tokyo.
+797,Blazing Saddles,1974,93,7.7,73,119.5,"1,46,288","In order to ruin a western town, a corrupt politician appoints a black Sheriff, who promptly becomes his most formidable adversary."
+798,Halloween,1978,91,7.7,87,47,"2,90,938","Fifteen years after murdering his sister on Halloween night 1963, Michael Myers escapes from a mental hospital and returns to the small town of Haddonfield, Illinois to kill again."
+799,Birdman or (The Unexpected Virtue of Ignorance),2014,119,7.7,87,42.34,"6,49,400","A washed-up superhero actor attempts to revive his fading career by writing, directing, and starring in a Broadway production."
+800,The Boondock Saints,1999,108,7.7,44,0.03,"2,44,623",Two Irish Catholic brothers become vigilantes and wipe out Boston's criminal underworld in the name of God.
+801,X: First Class,2011,131,7.7,65,146.41,"7,08,854","In the 1960s, superpowered humans Charles Xavier and Erik Lensherr work together to find others like them, but Erik's vengeful pursuit of an ambitious mutant who ruined his life causes a schism to divide them."
+802,Gravity,2013,91,7.7,96,274.09,"8,44,759",Two astronauts work together to survive after an accident leaves them stranded in space.
+803,First Blood,1982,93,7.7,61,47.21,"2,64,762",A veteran Green Beret is forced by a cruel Sheriff and his deputies to flee into the mountains and wage an escalating one-man war against his pursuers.
+804,"O Brother, Where Art Thou?",2000,107,7.7,69,45.51,"3,22,083","In the deep south during the 1930s, three escaped convicts search for hidden treasure while a relentless lawman pursues them."
+805,Donnie Brasco,1997,127,7.7,76,41.91,"3,19,607","An FBI undercover agent infiltrates the mob and finds himself identifying more with the mafia life, at the expense of his regular one."
+806,Toy Story 4,2019,100,7.7,84,434.04,"2,66,236","When a new toy called ""Forky"" joins Woody and the gang, a road trip alongside old and new friends reveals how big the world can be for a toy."
+807,The Bourne Supremacy,2004,108,7.7,73,176.24,"4,76,210","When Jason Bourne is framed for a CIA operation gone awry, he is forced to resume his former life as a trained assassin to survive."
+808,Midnight in Paris,2011,94,7.7,81,56.82,"4,37,729","While on a trip to Paris with his fiancée's family, a nostalgic screenwriter finds himself mysteriously going back to the 1920s every day at midnight."
+809,Argo,2012,120,7.7,86,136.03,"6,27,864","Acting under the cover of a Hollywood producer scouting a location for a science fiction film, a CIA agent launches a dangerous operation to rescue six Americans in Tehran during the U.S. hostage crisis in Iran in 1979."
+810,What's Eating Gilbert Grape,1993,118,7.7,73,9.17,"2,45,980",A young man in a small Midwestern town struggles to care for his mentally-disabled younger brother and morbidly obese mother while attempting to pursue his own happiness.
+811,Who Framed Roger Rabbit,1988,104,7.7,83,156.45,"2,09,862",A toon-hating detective is a cartoon rabbit's only hope to prove his innocence when he is accused of murder.
+812,Crash,I 2004,112,7.7,66,54.58,"4,43,653","Los Angeles citizens with vastly separate lives collide in interweaving stories of race, loss and redemption."
+813,Detachment,2011,98,7.7,52,0.07,"93,233",A substitute teacher who drifts from classroom to classroom finds a connection to the students and teachers during his latest assignment.
+814,Wreck-It Ralph,2012,101,7.7,72,189.42,"4,41,831","A video game villain wants to be a hero and sets out to fulfill his dream, but his quest brings havoc to the whole arcade where he lives."
+815,Sound of Metal,2019,120,7.7,82,,"1,39,693",A heavy metal drummer's life is turned upside down when he begins to lose his hearing and he must confront a future filled with silence.
+816,Road to Perdition,2002,117,7.7,72,104.45,"2,77,525","A mob enforcer's son in 1930s Illinois witnesses a murder, forcing him and his father to take to the road, and his father down a path of redemption and revenge."
+817,Sense and Sensibility,1995,136,7.7,84,43.18,"1,21,065","Rich Mr. Dashwood dies, leaving his second wife and her three daughters poor by the rules of inheritance. The two eldest daughters are the title opposites."
+818,The Color Purple,1985,154,7.7,78,98.47,"91,590",A black Southern woman struggles to find her identity after suffering abuse from her father and others over four decades.
+819,The Fault in Our Stars,2014,126,7.7,69,124.87,"3,90,241",Two teenage cancer patients begin a life-affirming journey to visit a reclusive author in Amsterdam.
+820,The Theory of Everything,2014,123,7.7,71,35.89,"4,67,384",A look at the relationship between the famous physicist Stephen Hawking and his wife.
+821,As Good as It Gets,1997,139,7.7,67,148.48,"3,09,535","A single mother and waitress, a misanthropic author, and a gay artist form an unlikely friendship after the artist is assaulted in a robbery."
+822,The Boy in the Striped Pajamas,2008,94,7.7,55,9.03,"2,32,837","Through the innocent eyes of Bruno, the eight-year-old son of the commandant at a German concentration camp, a forbidden friendship with a Jewish boy on the other side of the camp fence has startling and unexpected consequences."
+823,En man som heter Ove,2015,116,7.7,70,3.48,"64,544","Ove, an ill-tempered, isolated retiree who spends his days enforcing block association rules and visiting his wife's grave, has finally given up on life just as an unlikely friendship develops with his boisterous new neighbors."
+824,Philadelphia,1993,125,7.7,66,77.32,"2,50,665","When a man with HIV is fired by his law firm because of his condition, he hires a homophobic small time lawyer as the only willing advocate for a wrongful dismissal suit."
+825,Naked,1993,131,7.7,85,1.77,"41,947",An unemployed Mancunian vents his rage on unsuspecting strangers as he embarks on a nocturnal London odyssey.
+826,The Trial of the Chicago 7,2020,129,7.7,76,,"1,86,208","The story of 7 people on trial stemming from various charges surrounding the uprising at the 1968 Democratic National Convention in Chicago, Illinois."
+827,Lucky Number Slevin,2006,110,7.7,53,22.49,"3,20,308","A case of mistaken identity lands Slevin into the middle of a war being plotted by two of the city's most rival crime bosses. Under constant surveillance by Detective Brikowski and assassin Goodkat, he must get them before they get him."
+828,Empire of the Sun,1987,153,7.7,62,22.24,"1,30,914",A young English boy struggles to survive under Japanese occupation of China during World War II.
+829,Fried Green Tomatoes,1991,130,7.7,64,82.42,"78,729",A housewife who is unhappy with her life befriends an old lady at a nursing home and is enthralled by the tales she tells of people she used to know.
+830,Serpico,1973,130,7.7,81,29.8,"1,29,465",An honest New York cop named Frank Serpico blows the whistle on rampant corruption in the force only to have his comrades turn against him.
+831,Dirty Harry,1971,102,7.7,87,35.9,"1,63,225","When a man calling himself ""the Scorpio Killer"" menaces San Francisco, tough-as-nails Police Inspector ""Dirty"" Harry Callahan is assigned to track down the crazed psychopath."
+832,When Harry Met Sally...,1989,95,7.7,76,92.82,"2,30,346","Harry and Sally have known each other for years, and are very good friends, but they fear sex would ruin the friendship."
+833,Flipped,I 2010,90,7.7,45,1.75,"94,218",Two eighth-graders start to have feelings for each other despite being total opposites.
+834,Glengarry Glen Ross,1992,100,7.7,82,10.73,"1,11,613",An examination of the machinations behind the scenes at a real estate office.
+835,The Magnificent Seven,1960,128,7.7,74,4.91,"99,132",Seven gunfighters are hired by Mexican peasants to liberate their village from oppressive bandits.
+836,The French Connection,1971,104,7.7,94,15.63,"1,29,016","A pair of NYPD detectives in the Narcotics Bureau stumble onto a heroin smuggling ring based in Marseilles, but stopping them and capturing their leaders proves an elusive goal."
+837,Being John Malkovich,1999,113,7.7,90,22.86,"3,45,794",A puppeteer discovers a portal that leads literally into the head of movie star John Malkovich.
+838,Ray,I 2004,152,7.7,73,75.33,"1,53,269","The story of the life and career of the legendary rhythm and blues musician Ray Charles, from his humble beginnings in the South, where he went blind at age seven, to his meteoric rise to stardom during the 1950s and 1960s."
+839,This Is England,2006,101,7.7,86,0.33,"1,25,743","A young boy becomes friends with a gang of skinheads. Friends soon become like family, and relationships will be pushed to the very limit."
+840,Goldfinger,1964,110,7.7,87,51.08,"1,96,952","While investigating a gold magnate's smuggling, James Bond uncovers a plot to contaminate the Fort Knox gold reserve."
+841,Ordinary People,1980,124,7.7,86,54.8,"54,849","The accidental death of the older son of an affluent family deeply strains the relationships among the bitter mother, the good-natured father and the guilt-ridden younger son."
+842,Der Name der Rose,1986,130,7.7,54,7.15,"1,12,550",An intellectually nonconformist friar investigates a series of mysterious deaths in an isolated abbey.
+843,Evil Dead II,1987,84,7.7,72,5.92,"1,75,393",The lone survivor of an onslaught of flesh-possessing spirits holes up in a cabin with a group of strangers while the demons continue their attack.
+844,Adaptation.,2002,115,7.7,83,22.25,"1,98,206",A lovelorn screenwriter becomes desperate as he tries and fails to adapt 'The Orchid Thief' by Susan Orlean for the screen.
+845,Kung fu,2004,99,7.7,78,17.11,"1,45,849","In Shanghai, China in the 1940s, a wannabe gangster aspires to join the notorious ""Axe Gang"" while residents of a housing complex exhibit extraordinary powers in defending their turf."
+846,Happiness,1998,134,7.7,81,2.81,"72,600","The lives of several individuals intertwine as they go about their lives in their own unique ways, engaging in acts which society as a whole might find disturbing in a desperate search for human connection."
+847,Clerks,1994,92,7.7,70,3.15,"2,28,218","A day in the lives of two convenience clerks named Dante and Randal as they annoy customers, discuss movies, and play hockey on the store roof."
+848,Star Trek II: The Wrath of Khan,1982,113,7.7,68,78.91,"1,26,179","With the assistance of the Enterprise crew, Admiral Kirk must stop an old nemesis, Khan Noonien Singh, from using the life-generating Genesis Device as the ultimate weapon."
+849,Malcolm X,1992,202,7.7,73,48.17,"98,857","Biographical epic of the controversial and influential Black Nationalist leader, from his early life and career as a small-time gangster, to his ministry as a member of the Nation of Islam and his eventual assassination."
+850,Wait Until Dark,1967,108,7.7,81,17.55,"32,432",A recently blinded woman is terrorized by a trio of thugs while they search for a heroin-stuffed doll they believe is in her apartment.
+851,The Verdict,1982,129,7.7,77,54,"43,615","An outcast, alcoholic Boston lawyer sees the chance to salvage his career and self-respect by taking a medical malpractice case to trial rather than settling."
+852,Roma,2018,135,7.7,96,,"1,64,825",A year in the life of a middle-class family's maid in Mexico City in the early 1970s.
+853,Kaze tachinu,2013,126,7.7,83,5.21,"91,714","A look at the life of Jiro Horikoshi, the man who designed Japanese fighter planes during World War II."
+854,Billy Elliot,2000,110,7.7,74,22,"1,39,205",A talented young boy becomes torn between his unexpected love of dance and the disintegration of his family.
+855,Paprika,2006,90,7.7,81,0.88,"89,070","When a machine that allows therapists to enter their patients' dreams is stolen, all hell breaks loose. Only a young female therapist, Paprika, can stop it."
+856,Bonnie and Clyde,1967,111,7.7,86,,"1,17,290","Bored waitress Bonnie Parker falls in love with an ex-con named Clyde Barrow and together they start a violent crime spree through the country, stealing cars and robbing banks."
+857,Lola rennt,1998,81,7.7,77,7.27,"2,03,153","After a botched money delivery, Lola has 20 minutes to come up with 100,000 Deutschmarks."
+858,La grande bellezza,2013,141,7.7,86,2.85,"94,723","Jep Gambardella has seduced his way through the lavish nightlife of Rome for decades, but after his 65th birthday and a shock from the past, Jep looks past the nightclubs and parties to find a timeless landscape of absurd, exquisite beauty."
+859,Miller's Crossing,1990,115,7.7,66,5.08,"1,38,907","Tom Reagan, an advisor to a Prohibition-era crime boss, tries to keep the peace between warring mobs but gets caught in divided loyalties."
+860,The Longest Day,1962,178,7.7,75,39.1,"57,799","The events of D-Day, told on a grand scale from both the Allied and German points of view."
+861,The Dirty Dozen,1967,150,7.7,73,45.3,"76,680","During World War II, a rebellious U.S. Army Major is assigned a dozen convicted murderers to train and lead them into a mass assassination mission of German officers."
+862,Belle de jour,1967,100,7.7,,0.03,"46,947",A frigid young housewife decides to spend her midweek afternoons as a prostitute.
+863,"South Park: Bigger, Longer & Uncut",1999,81,7.7,73,52.04,"2,10,750","When Stan Marsh and his friends go see an R-rated movie, they start cursing and their parents think that Canada is to blame."
+864,Badlands,1973,94,7.7,93,,"75,961","An impressionable teenage girl from a dead-end town, and her older greaser boyfriend, embark on a killing spree in the South Dakota Badlands."
+865,Finding Neverland,2004,106,7.7,67,51.68,"2,09,543",The story of Sir J.M. Barrie's friendship with a family who inspired him to create Peter Pan.
+866,La planète sauvage,1973,72,7.7,73,0.19,"34,683","On a faraway planet where blue giants rule, oppressed humanoids rebel against their machine-like leaders."
+867,Madeo,2009,129,7.7,79,0.55,"68,369",A mother desperately searches for the killer who framed her son for a girl's horrific murder.
+868,Kubo and the Two Strings,2016,101,7.7,84,48.02,"1,34,870",A young boy named Kubo must locate a magical suit of armour worn by his late father in order to defeat a vengeful spirit from the past.
+869,Zulu,1964,138,7.7,77,,"41,266",Outnumbered British soldiers do battle with Zulu warriors at Rorke's Drift.
+870,The Quiet Man,1952,129,7.7,85,10.55,"40,776","A retired American boxer returns to the village of his birth in 1920s Ireland, where he falls for a spirited redhead whose brother is contemptuous of their union."
+871,The Last Emperor,1987,163,7.7,76,43.98,"1,07,977","Bernardo Bertolucci's Oscar-winning dramatisation of the life story of China's last emperor, Pu Yi."
+872,Beasts of No Nation,2015,137,7.7,79,0.08,"84,576","A drama based on the experiences of Agu, a child soldier fighting in the civil war of an unnamed African country."
+873,Me and Earl and the Dying Girl,2015,105,7.7,74,6.74,"1,35,367","High schooler Greg, who spends most of his time making parodies of classic movies with his co-worker Earl, finds his outlook forever altered after befriending a classmate who has just been diagnosed with cancer."
+874,Fantasia,1940,124,7.7,96,76.41,"1,00,586","A collection of animated interpretations of great works of Western classical music, ranging from the abstract to depictions of mythology and fantasy, and settings including the prehistoric, supernatural and sacred."
+875,Abre los ojos,1997,119,7.7,,0.37,"71,612","A very handsome man finds the love of his life, but he suffers an accident and needs to have his face rebuilt by surgery after it is severely disfigured."
+876,Hamlet,1996,242,7.7,,4.41,"39,146","Hamlet, Prince of Denmark, returns home to find his father murdered and his mother remarrying the murderer, his uncle. Meanwhile, war is brewing."
+877,Short Cuts,1993,188,7.7,81,6.11,"46,382",The day-to-day lives of several suburban Los Angeles residents.
+878,Zwartboek,2006,145,7.7,71,4.4,"78,822","In the Nazi-occupied Netherlands during World War II, a Jewish singer infiltrates the regional Gestapo headquarters for the Dutch resistance."
+879,The African Queen,1951,105,7.7,91,0.54,"81,934","In WWI East Africa, a gin-swilling Canadian riverboat captain is persuaded by a strait-laced English missionary to undertake a trip up a treacherous river and use his boat to attack a German gunship."
+880,Perfetti sconosciuti,2016,96,7.7,,,"68,671","Seven long-time friends meet for dinner. They decide to share their text messages, emails and phone calls. Secrets are unveiled. Harmony trembles."
+881,Kurenai no buta,1992,94,7.7,83,,"95,476","In 1930s Italy, a veteran World War I pilot is cursed to look like an anthropomorphic pig."
+882,À bout de souffle,1960,90,7.7,,0.34,"85,255","A small-time thief steals a car and impulsively murders a motorcycle policeman. Wanted by the authorities, he reunites with a hip American journalism student and attempts to persuade her to run away with him to Italy."
+883,Ajeossi,2010,119,7.7,,0.01,"72,490",A quiet pawnshop keeper with a violent past takes on a drug-and-organ trafficking ring in hope of saving the child who is his only friend.
+884,Spoorloos,1988,107,7.7,,,"41,351","Rex and Saskia, a young couple in love, are on vacation. They stop at a busy service station and Saskia is abducted. After three years and no sign of Saskia, Rex begins receiving letters from the abductor."
+885,Down by Law,1986,107,7.7,75,1.44,"53,716","Two men are framed and sent to jail, where they meet a murderer who helps them escape and leave the state."
+886,Nebraska,2013,115,7.7,86,17.65,"1,20,726","An aging, booze-addled father makes the trip from Montana to Nebraska with his estranged son in order to claim a million-dollar Mega Sweepstakes Marketing prize."
+887,The Magdalene Sisters,2002,114,7.7,83,4.89,"27,922",Three young Irish women struggle to maintain their spirits while they endure dehumanizing abuse as inmates of a Magdalene Sisters Asylum.
+888,Invasion of the Body Snatchers,1956,80,7.7,92,,"52,615",A small-town doctor learns that the population of his community is being replaced by emotionless alien duplicates.
+889,Jules et Jim,1962,105,7.7,97,,"43,269",Decades of a love triangle concerning two friends and an impulsive woman.
+890,Waking Life,2001,99,7.7,84,2.89,"65,826",A man shuffles through a dream meeting various people and discussing the meanings and purposes of the universe.
+891,Omoide no Marnie,2014,103,7.7,72,0.77,"44,442","Due to 12 y.o. Anna's asthma, she's sent to stay with relatives of her guardian in the Japanese countryside. She likes to be alone, sketching. She befriends Marnie. Who is the mysterious, blonde Marnie."
+892,Lat sau san taam,1992,128,7.7,,,"52,501",A tough-as-nails cop teams up with an undercover agent to shut down a sinister mobster and his crew.
+893,Hedwig and the Angry Inch,2001,95,7.7,85,3.03,"36,707",A gender-queer punk-rock singer from East Berlin tours the U.S. with her band as she tells her life story and follows the former lover/band-mate who stole her songs.
+894,Cape Fear,1962,106,7.7,76,,"30,574",A lawyer's family is stalked by a man he once helped put in jail.
+895,La double vie de Véronique,1991,98,7.7,86,2,"51,202","Two parallel stories about two identical women; one living in Poland, the other in France. They don't know each other, but their lives are nevertheless profoundly connected."
+896,Night on Earth,1991,129,7.7,68,2.02,"63,486",An anthology of 5 different cab drivers in 5 American and European cities and their remarkable fares on the same eventful night.
+897,Chun gwong cha sit,1997,96,7.7,70,0.19,"32,154",A couple take a trip to Argentina but both men find their lives drifting apart in opposite directions.
+898,Good Bye Lenin!,2003,121,7.7,68,4.06,"1,49,887","In 1990, to protect his fragile mother from a fatal shock after a long coma, a young man must keep her from learning that her beloved nation of East Germany as she knew it has disappeared."
+899,A Man for All Seasons,1966,120,7.7,72,28.35,"36,131","The story of Sir Thomas More, who stood up to King Henry VIII when the King rejected the Roman Catholic Church to obtain a divorce and remarry."
+900,Black Narcissus,1947,101,7.7,86,,"26,424","A group of nuns struggle to establish a convent in the Himalayas, while isolation, extreme weather, altitude, and culture clashes all conspire to drive the well-intentioned missionaries mad."
+901,The Broken Circle Breakdown,2012,111,7.7,70,0.18,"42,208","Elise and Didier fall in love at first sight, in spite of their differences. He talks, she listens. He's a romantic atheist, she's a religious realist. When their daughter becomes seriously ill, their love is put on trial."
+902,Frost/Nixon,2008,122,7.7,80,18.59,"1,10,599",A dramatic retelling of the post-Watergate television interviews between British talk-show host David Frost and former president Richard Nixon.
+903,Forushande,2016,124,7.7,85,2.4,"62,893","While Ranaa and Emad, a married couple, are participating in a production of ""Death of a Salesman,"" she is assaulted in their new home, which leaves him determined to find the perpetrator over his wife's traumatized objections."
+904,Le Petit Prince,2015,108,7.7,70,1.34,"64,710","A little girl lives in a very grown-up world with her mother, who tries to prepare her for it. Her neighbor, the Aviator, introduces the girl to an extraordinary world where anything is possible, the world of the Little Prince."
+905,Scarface,1932,93,7.7,90,,"29,289","An ambitious and nearly insane violent gangster climbs the ladder of success in the mob, but his weaknesses prove to be his downfall."
+906,The Caine Mutiny,1954,124,7.7,63,21.75,"28,896","When a U.S. Naval captain shows signs of mental instability that jeopardises the ship, the first officer is urged to consider relieving him of command."
+907,Les triplettes de Belleville,2003,80,7.7,91,7,"56,004","When her grandson is kidnapped during the Tour de France, Madame Souza and her beloved pooch Bruno team up with the Belleville Sisters--an aged song-and-dance team from the days of Fred Astaire--to rescue him."
+908,Ondskan,2003,113,7.7,61,0.02,"40,377","A teenage boy expelled from school for fighting arrives at a boarding school where the systematic bullying of younger students is encouraged as a means to maintain discipline, and decides to fight back."
+909,Key Largo,1948,100,7.7,,,"42,823","A man visits his war buddy's family hotel and finds a gangster running things. As a hurricane approaches, the two end up confronting each other."
+910,Diarios de motocicleta,2004,126,7.7,75,16.78,"1,03,329",The dramatization of a motorcycle road trip Che Guevara went on in his youth that showed him his life's calling.
+911,Adams æbler,2005,94,7.7,51,0,"52,776",A neo-Nazi sentenced to community service at a church clashes with the blindly devoted minister.
+912,Yume,1990,119,7.7,,1.96,"27,829",A collection of tales based upon eight of director Akira Kurosawa's recurring dreams.
+913,Kokuhaku,2010,106,7.7,,,"40,817",A psychological thriller of a grieving mother turned cold-blooded avenger with a twisty master plan to pay back those who were responsible for her daughter's death.
+914,The Lady Vanishes,1938,96,7.7,98,,"55,167","While travelling in continental Europe, a rich young playgirl realizes that an elderly lady seems to have disappeared from the train."
+915,In America,2002,105,7.7,76,15.54,"43,824",A family of Irish immigrants adjust to life on the mean streets of Hell's Kitchen while also grieving the death of a child.
+916,Gongdong gyeongbi guyeok JSA,2000,110,7.7,58,,"32,604","After a shooting incident at the North/South Korean border/DMZ leaves 2 North Korean soldiers dead, a neutral Swiss/Swedish team investigates, what actually happened."
+917,Marty,1955,90,7.7,82,,"25,813",A middle-aged butcher and a school teacher who have given up on the idea of love meet at a dance and fall for each other.
+918,Ta'm e guilass,1997,95,7.7,80,0.31,"33,855",An Iranian man drives his car in search of someone who will quietly bury him under a cherry tree after he commits suicide.
+919,Toki o kakeru shôjo,2006,98,7.7,66,,"68,847","A high-school girl named Makoto acquires the power to travel back in time, and decides to use it for her own personal benefits. Little does she know that she is affecting the lives of others just as much as she is her own."
+920,Das Experiment,2001,120,7.7,60,0.14,"95,170","For two weeks, 20 male participants are hired to play prisoners and guards in a prison. The ""prisoners"" have to follow seemingly mild rules, and the ""guards"" are told to retain order without using physical violence."
+921,Efter brylluppet,2006,120,7.7,78,0.41,"35,931","A manager of an orphanage in India is sent to Copenhagen, Denmark, where he discovers a life-altering family secret."
+922,The Purple Rose of Cairo,1985,82,7.7,75,10.63,"53,373","In 1935 New Jersey, a movie character walks off the screen and into the real world."
+923,Hana-bi,1997,103,7.7,83,0.23,"31,963","Nishi leaves the police in the face of harrowing personal and professional difficulties. Spiraling into depression, he makes questionable decisions."
+924,The Muppet Christmas Carol,1992,85,7.7,64,27.28,"64,507",The Muppets present their own touching rendition of Charles Dickens' classic tale.
+925,Love and Death,1975,85,7.7,89,,"39,838","In czarist Russia, a neurotic soldier and his distant cousin formulate a plot to assassinate Napoleon."
+926,The Breadwinner,2017,94,7.7,78,0.31,"27,280","In 2001, Afghanistan is under the control of the Taliban. When her father is captured, a determined young girl disguises herself as a boy in order to provide for her family."
+927,Le passé,2013,130,7.7,85,1.33,"50,016","An Iranian man deserts his French wife and her two children to return to his homeland. Meanwhile, his wife starts up a new relationship, a reality her husband confronts upon his wife's request for a divorce."
+928,Zelig,1983,79,7.7,,11.8,"43,232","""Documentary"" about a man who can look and act like whoever he's around, and meets various famous people."
+929,Auf der anderen Seite,2007,122,7.7,85,0.74,"32,878",A Turkish man travels to Istanbul to find the daughter of his father's former girlfriend.
+930,Once Upon a Time in... Hollywood,2019,161,7.6,83,142.5,"7,90,687",A faded television actor and his stunt double strive to achieve fame and success in the final years of Hollywood's Golden Age in 1969 Los Angeles.
+931,Harry Potter and the Sorcerer's Stone,2001,152,7.6,65,317.58,"8,17,964","An orphaned boy enrolls in a school of wizardry, where he learns the truth about himself, his family and the terrible evil that haunts the magical world."
+932,American Psycho,2000,102,7.6,64,15.07,"6,67,815","A wealthy New York City investment banking executive, Patrick Bateman, hides his alternate psychopathic ego from his co-workers and friends as he delves deeper into his violent, hedonistic fantasies."
+933,Watchmen,2009,162,7.6,56,107.51,"5,66,739","In 1985 where former superheroes exist, the murder of a colleague sends active vigilante Rorschach into his own sprawling investigation, uncovering something that could completely change the course of history as we know it."
+934,Superbad,2007,113,7.6,76,121.46,"6,06,639",Two co-dependent high school seniors are forced to deal with separation anxiety after their plan to stage a booze-soaked party goes awry.
+935,Saw,2004,103,7.6,46,56,"4,39,407","Two strangers awaken in a room with no recollection of how they got there, and soon discover they're pawns in a deadly game perpetrated by a notorious serial killer."
+936,Guardians of the Galaxy Vol. 2,2017,136,7.6,67,389.81,"7,27,247","The Guardians struggle to keep together as a team while dealing with their personal family issues, notably Star-Lord's encounter with his father, the ambitious celestial being Ego."
+937,300,2006,117,7.6,52,210.61,"8,42,283",King Leonidas of Sparta and a force of 300 men fight the Persians at Thermopylae in 480 B.C.
+938,Deadpool 2,2018,119,7.6,66,324.59,"6,13,542","Foul-mouthed mutant mercenary Wade Wilson (a.k.a. Deadpool) assembles a team of fellow mutant rogues to protect a young boy with supernatural abilities from the brutal, time-traveling cyborg Cable."
+939,RoboCop,1987,102,7.6,70,53.42,"2,70,139","In a dystopic and crime-ridden Detroit, a terminally wounded cop returns to the force as a powerful cyborg haunted by submerged memories."
+940,The Fifth Element,1997,126,7.6,52,63.54,"4,89,404","In the colorful future, a cab driver unwittingly becomes the central figure in the search for a legendary cosmic weapon to keep Evil and Mr. Zorg at bay."
+941,The Butterfly Effect,2004,113,7.6,30,57.94,"5,05,912","Evan Treborn suffers blackouts during significant events of his life. As he grows up, he finds a way to remember these lost memories and a supernatural way to alter his life by reading his journal."
+942,Kick-Ass,2010,117,7.6,66,48.07,"5,79,158","Dave Lizewski is an unnoticed high school student and comic book fan who one day decides to become a superhero, even though he has no powers, training or meaningful reason to do so."
+943,A Star Is Born,2018,136,7.6,88,215.29,"4,02,218",A musician helps a young singer find fame as age and alcoholism send his own career into a downward spiral.
+944,The Thin Red Line,1998,170,7.6,78,36.4,"1,94,239","Adaptation of James Jones' autobiographical 1962 novel, focusing on the conflict at Guadalcanal during the second World War."
+945,Office Space,1999,89,7.6,68,10.82,"2,78,187",Three company workers who hate their jobs decide to rebel against their greedy boss.
+946,Moneyball,2011,133,7.6,87,75.61,"4,44,941",Oakland A's general manager Billy Beane's successful attempt to assemble a baseball team on a lean budget by employing computer-generated analysis to acquire new players.
+947,What We Do in the Shadows,2014,86,7.6,76,3.33,"1,91,888","Viago, Deacon, and Vladislav are vampires who are struggling with the mundane aspects of modern life, like paying rent, keeping up with the chore wheel, trying to get into nightclubs, and overcoming flatmate conflicts."
+948,Stardust,2007,127,7.6,66,38.63,"2,78,725","In a countryside town bordering on a magical land, a young man makes a promise to his beloved that he'll retrieve a fallen star by venturing into the magical realm."
+949,Minority Report,2002,145,7.6,80,132.07,"5,69,049","In a future where a special police unit is able to arrest murderers before they commit their crimes, an officer from that unit is himself accused of a future murder."
+950,Hell or High Water,II 2016,102,7.6,88,26.86,"2,41,177","Toby is a divorced father who's trying to make a better life. His brother is an ex-con with a short temper and a loose trigger finger. Together, they plan a series of heists against the bank that's about to foreclose on their family ranch."
+951,Kung Fu Panda,2008,92,7.6,74,215.43,"4,94,504","To everyone's surprise, including his own, Po, an overweight, clumsy panda, is chosen as protector of the Valley of Peace. His suitability will soon be tested as the valley's arch-enemy is on his way."
+952,My Cousin Vinny,1992,120,7.6,68,52.93,"1,34,043","Two New Yorkers accused of murder in rural Alabama while on their way back to college call in the help of one of their cousins, a loudmouth lawyer with no trial experience."
+953,Star Wars: Episode III - Revenge of the Sith,2005,140,7.6,68,380.26,"8,18,468","Three years into the Clone Wars, Obi-Wan pursues a new threat, while Anakin is lured by Chancellor Palpatine into a sinister plot to rule the galaxy."
+954,The Blind Side,2009,129,7.6,53,255.96,"3,48,096","The story of Michael Oher, a homeless and traumatized boy who became an All-American football player and first-round NFL draft pick with the help of a caring woman and her family."
+955,The Others,2001,101,7.6,74,96.52,"3,79,382","During World War II, a woman who lives with her two photosensitive children on her darkened old family estate in the Channel Islands becomes convinced that the home is haunted."
+956,Enter the Dragon,1973,102,7.6,83,25,"1,08,868",A Shaolin martial artist travels to an island fortress to spy on an opium lord - who is also a former monk from his temple - under the guise of attending a fighting tournament.
+957,The Royal Tenenbaums,2001,110,7.6,76,52.36,"3,04,538",The eccentric members of a dysfunctional family reluctantly gather under the same roof for various reasons.
+958,The Machinist,2004,101,7.6,61,1.08,"4,04,123",An industrial worker who hasn't slept in a year begins to doubt his own sanity.
+959,Lethal Weapon,1987,109,7.6,68,65.21,"2,68,356",Two newly paired cops who are complete opposites must put aside their differences in order to catch a gang of drug smugglers.
+960,True Grit,2010,110,7.6,80,171.24,"3,49,326",A stubborn teenager enlists the help of a tough U.S. Marshal to track down her father's murderer.
+961,Mulan,1998,87,7.6,71,120.62,"3,02,791","To save her father from death in the army, a young maiden secretly goes in his place and becomes one of China's greatest heroines in the process."
+962,The Mitchells vs the Machines,2021,114,7.6,81,,"1,18,830","A quirky, dysfunctional family's road trip is upended when they find themselves in the middle of the robot apocalypse and suddenly become humanity's unlikeliest last hope."
+963,After Hours,I 1985,97,7.6,90,10.6,"75,226",An ordinary word processor has the worst night of his life after he agrees to visit a girl in Soho he met that evening at a coffee shop.
+964,The Fly,1986,96,7.6,79,40.46,"1,92,980",A brilliant but eccentric scientist begins to transform into a giant man/fly hybrid after one of his experiments goes horribly wrong.
+965,Gone Baby Gone,2007,114,7.6,72,20.3,"2,81,830","Two Boston area detectives investigate a little girl's kidnapping, which ultimately turns into a crisis both professionally and personally."
+966,Die Hard with a Vengeance,1995,128,7.6,58,100.01,"3,98,139","John McClane and a Harlem store owner are targeted by German terrorist Simon in New York City, where he plans to rob the Federal Reserve Building."
+967,Mad Max 2,1981,96,7.6,77,12.47,"1,87,560","In the post-apocalyptic Australian wasteland, a cynical drifter agrees to help a small, gasoline-rich community escape a horde of bandits."
+968,Searching,III 2018,102,7.6,71,26.02,"1,74,340","After his teenage daughter goes missing, a desperate father tries to find clues on her laptop."
+969,Despicable Me,2010,95,7.6,72,251.51,"5,65,343","When a criminal mastermind uses a trio of orphan girls as pawns for a grand scheme, he finds their love is profoundly changing him for the better."
+970,Snow White and the Seven Dwarfs,1937,83,7.6,96,184.93,"2,07,946","Exiled into the dangerous forest by her wicked stepmother, a princess is rescued by seven dwarf miners who make her part of their household."
+971,Eastern Promises,2007,100,7.6,83,17.11,"2,52,676",A teenager who dies during childbirth leaves clues in her journal that could tie her child to a rape involving a violent Russian mob family.
+972,Rushmore,1998,93,7.6,86,17.11,"1,92,763","A teenager at Rushmore Academy falls for a much older teacher and befriends a middle-aged industrialist. Later, he finds out that his love interest and his friend are having an affair, which prompts him to begin a vendetta."
+973,La piel que habito,2011,120,7.6,70,3.19,"1,59,821","A brilliant plastic surgeon, haunted by past tragedies, creates a type of synthetic skin that withstands any kind of damage. His guinea pig: a mysterious and volatile woman who holds the key to his obsession."
+974,Serbuan maut,2011,101,7.6,73,4.11,"2,11,624",A S.W.A.T. team becomes trapped in a tenement run by a ruthless mobster and his army of killers and thugs.
+975,End of Watch,2012,109,7.6,68,41,"2,58,654","Shot documentary-style, this film follows the daily grind of two young police officers in LA who are partners and friends and what happens when they meet criminal forces greater than themselves."
+976,Dawn of the Planet of the Apes,2014,130,7.6,79,208.55,"4,54,534",The fragile peace between apes and humans is threatened as mistrust and betrayal threaten to plunge both tribes into a war for dominance over the Earth.
+977,The Jungle Book,1967,78,7.6,65,141.84,"1,91,875",Bagheera the Panther and Baloo the Bear have a difficult time trying to convince a boy to leave the jungle for human civilization.
+978,Match Point,2005,124,7.6,72,23.09,"2,23,380","At a turning point in his life, a former tennis pro falls for an actress who happens to be dating his friend and soon-to-be brother-in-law."
+979,Dark Waters,2019,126,7.6,73,,"94,877",A corporate defense attorney takes on an environmental lawsuit against a chemical company that exposes a lengthy history of pollution.
+980,Gake no ue no Ponyo,2008,101,7.6,86,15.09,"1,53,091","A five-year-old boy develops a relationship with Ponyo, a young goldfish princess who longs to become a human after falling in love with him."
+981,The Birds,1963,119,7.6,90,11.4,"1,97,671",A wealthy San Francisco socialite pursues a potential boyfriend to a small Northern California town that slowly takes a turn for the bizarre when birds of all kinds suddenly begin to attack people.
+982,From Here to Eternity,1953,118,7.6,85,30.5,"49,249","At a U.S. Army base in 1941 Hawaii, a private is cruelly punished for not boxing on his unit's team, while his commanding officer's wife and top aide begin a tentative affair."
+983,Rebel Without a Cause,1955,111,7.6,89,,"94,956","A rebellious young man with a troubled past comes to a new town, finding friends and enemies."
+984,I Am Sam,2001,132,7.6,28,40.31,"1,52,927",A mentally handicapped man fights for custody of his 7-year-old daughter and in the process teaches his cold-hearted lawyer the value of love and family.
+985,The Bridges of Madison County,1995,135,7.6,69,71.52,"85,715",Photographer Robert Kincaid wanders into the life of housewife Francesca Johnson for four days in the 1960s.
+986,The Last King of Scotland,2006,123,7.6,74,17.61,"1,91,771",Based on the events of the brutal Ugandan dictator Idi Amin's regime as seen by his personal physician during the 1970s.
+987,Sabrina,1954,113,7.6,72,,"68,022","A playboy becomes interested in the daughter of his family's chauffeur, but it's his more serious brother who would be the better man for her."
+988,25th Hour,2002,135,7.6,69,13.06,"1,82,220","Cornered by the DEA, convicted New York drug dealer Montgomery Brogan reevaluates his life in the 24 remaining hours before facing a seven-year jail term."
+989,United 93,2006,111,7.6,90,31.57,"1,08,852","A real-time account of the events on United Flight 93, one of the planes hijacked on September 11th, 2001 that crashed near Shanksville, Pennsylvania when passengers foiled the terrorist plot."
+990,50/50,2011,100,7.6,72,35.01,"3,37,291","Inspired by a true story, a comedy centered on a 27-year-old guy who learns of his cancer diagnosis and his subsequent struggle to beat the disease."
+991,Barton Fink,1991,116,7.6,69,6.15,"1,26,032",A renowned New York playwright is enticed to California to write for the movies and discovers the hellish truth of Hollywood.
+992,21 Grams,2003,124,7.6,70,16.29,"2,41,941","A freak accident brings together a critically ill mathematician, a grieving mother, and a born-again ex-con."
+993,The Taking of Pelham One Two Three,1974,104,7.6,68,2.49,"33,299","Four armed men hijack a New York City subway car and demand a ransom for the passengers. The city's police are faced with a conundrum: Even if it's paid, how could they get away?"
+994,Control,2007,122,7.6,78,0.87,"67,244","A profile of Ian Curtis, the enigmatic singer of Joy Division whose personal, professional, and romantic troubles led him to commit suicide at the age of 23."
+995,Philomena,2013,98,7.6,77,37.71,"1,02,336","A world-weary political journalist picks up the story of a woman's search for her son, who was taken away from her decades ago after she became pregnant and was forced to live in a convent."
+996,Un long dimanche de fiançailles,2004,133,7.6,76,6.17,"75,004","Tells the story of a young woman's relentless search for her fiancé, who has disappeared from the trenches of the Somme during World War One."
+997,Shine,1996,105,7.6,87,35.81,"55,589","Pianist David Helfgott, driven by his father and teachers, has a breakdown. Years later he returns to the piano, to popular if not critical acclaim."
+998,The Invisible Man,1933,71,7.6,87,,"37,822","A scientist finds a way of becoming invisible, but in doing so, he becomes murderously insane."
+999,Celda 211,2009,113,7.6,,,"69,464","The story of two men on different sides of a prison riot -- the inmate leading the rebellion and the young guard trapped in the revolt, who poses as a prisoner in a desperate attempt to survive the ordeal."
diff --git a/examples/tutorial/scripts/.gitignore b/examples/tutorial/scripts/.gitignore
new file mode 100644
index 0000000..b947077
--- /dev/null
+++ b/examples/tutorial/scripts/.gitignore
@@ -0,0 +1,2 @@
+node_modules/
+dist/
diff --git a/examples/tutorial/scripts/Makefile b/examples/tutorial/scripts/Makefile
new file mode 100644
index 0000000..f52870e
--- /dev/null
+++ b/examples/tutorial/scripts/Makefile
@@ -0,0 +1,12 @@
+default: types/movie.ts
+
+types/movie.ts: schema/movie.json
+ pnpm quicktype -s schema $< -o $@
+
+schema/movie.json:
+ cargo run -- --data-dir=../traildepot schema movies --mode insert > $@
+
+clean:
+ rm -f types/* schema/*
+
+.PHONY: clean
diff --git a/examples/tutorial/scripts/eslint.config.mjs b/examples/tutorial/scripts/eslint.config.mjs
new file mode 100644
index 0000000..640b6d5
--- /dev/null
+++ b/examples/tutorial/scripts/eslint.config.mjs
@@ -0,0 +1,28 @@
+import pluginJs from "@eslint/js";
+import tseslint from "typescript-eslint";
+
+export default [
+ pluginJs.configs.recommended,
+ ...tseslint.configs.recommended,
+ {
+ ignores: ["dist/", "node_modules/", "types"],
+ },
+ {
+ files: ["scripts/*.{js,mjs,cjs,mts,ts,tsx,jsx}"],
+ rules: {
+ // https://typescript-eslint.io/rules/no-explicit-any/
+ "@typescript-eslint/no-explicit-any": "warn",
+ // http://eslint.org/docs/rules/no-unused-vars
+ "@typescript-eslint/no-unused-vars": [
+ "error",
+ {
+ vars: "all",
+ args: "after-used",
+ argsIgnorePattern: "^_",
+ varsIgnorePattern: "^_",
+ },
+ ],
+ "no-empty": ["error", { allowEmptyCatch: true }],
+ },
+ },
+];
diff --git a/examples/tutorial/scripts/package.json b/examples/tutorial/scripts/package.json
new file mode 100644
index 0000000..c72413e
--- /dev/null
+++ b/examples/tutorial/scripts/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "examples_tutorial_scripts",
+ "version": "0.0.1",
+ "description": "",
+ "type": "module",
+ "scripts": {
+ "build": "tsc",
+ "format": "prettier -w src",
+ "read": "tsc && node dist/src/index.js",
+ "fill": "tsc && node dist/src/fill.js",
+ "check": "tsc --noEmit --skipLibCheck && eslint"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.13.0",
+ "@types/node": "^22.8.2",
+ "eslint": "^9.13.0",
+ "prettier": "^3.3.3",
+ "quicktype": "^23.0.170",
+ "typescript": "^5.6.3",
+ "typescript-eslint": "^8.12.1"
+ },
+ "dependencies": {
+ "csv-parse": "^5.5.6",
+ "trailbase": "workspace:*"
+ }
+}
diff --git a/examples/tutorial/scripts/schema/movie.json b/examples/tutorial/scripts/schema/movie.json
new file mode 100644
index 0000000..2706a5e
--- /dev/null
+++ b/examples/tutorial/scripts/schema/movie.json
@@ -0,0 +1,63 @@
+{
+ "$defs": {},
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "gross": {
+ "type": [
+ "number",
+ "string",
+ "boolean",
+ "object",
+ "array",
+ "null"
+ ]
+ },
+ "metascore": {
+ "type": [
+ "number",
+ "string",
+ "boolean",
+ "object",
+ "array",
+ "null"
+ ]
+ },
+ "name": {
+ "type": "string"
+ },
+ "rank": {
+ "type": "integer"
+ },
+ "rating": {
+ "type": "number"
+ },
+ "votes": {
+ "type": "string"
+ },
+ "watch_time": {
+ "type": "integer"
+ },
+ "year": {
+ "type": [
+ "number",
+ "string",
+ "boolean",
+ "object",
+ "array",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "name",
+ "year",
+ "watch_time",
+ "rating",
+ "votes",
+ "description"
+ ],
+ "title": "movies",
+ "type": "object"
+}
diff --git a/examples/tutorial/scripts/src/fill.ts b/examples/tutorial/scripts/src/fill.ts
new file mode 100644
index 0000000..f2564e3
--- /dev/null
+++ b/examples/tutorial/scripts/src/fill.ts
@@ -0,0 +1,43 @@
+import { readFile } from "node:fs/promises";
+import { parse } from "csv-parse/sync";
+
+import { Client } from "trailbase";
+import type { Movie } from "@schema/movie";
+
+const client = new Client("http://localhost:4000");
+await client.login("admin@localhost", "secret");
+const api = client.records("movies");
+
+let movies = [];
+do {
+ movies = await api.list({
+ pagination: {
+ limit: 100,
+ },
+ });
+
+ for (const movie of movies) {
+ await api.delete(movie.rank!);
+ }
+} while (movies.length > 0);
+
+const file = await readFile("../data/Top_1000_IMDb_movies_New_version.csv");
+const records = parse(file, {
+ fromLine: 2,
+ // prettier-ignore
+ columns: [ "rank", "name", "year", "watch_time", "rating", "metascore", "gross", "votes", "description" ],
+});
+
+for (const movie of records) {
+ await api.create({
+ rank: parseInt(movie.rank),
+ name: movie.name,
+ year: movie.year,
+ watch_time: parseInt(movie.watch_time),
+ rating: parseInt(movie.rating),
+ metascore: movie.metascore,
+ gross: movie.gross,
+ votes: movie.votes,
+ description: movie.description,
+ });
+}
diff --git a/examples/tutorial/scripts/src/index.ts b/examples/tutorial/scripts/src/index.ts
new file mode 100644
index 0000000..71260db
--- /dev/null
+++ b/examples/tutorial/scripts/src/index.ts
@@ -0,0 +1,15 @@
+import { Client } from "trailbase";
+
+const client = new Client("http://localhost:4000");
+await client.login("admin@localhost", "secret");
+
+const movies = client.records("movies");
+const m = await movies.list({
+ pagination: {
+ limit: 3,
+ },
+ order: ["rank"],
+ filters: ["watch_time[lt]=120"],
+});
+
+console.log(m);
diff --git a/examples/tutorial/scripts/tsconfig.json b/examples/tutorial/scripts/tsconfig.json
new file mode 100644
index 0000000..8d8dd18
--- /dev/null
+++ b/examples/tutorial/scripts/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "extends": "../../../ui/common/tsconfig.base.json",
+ "compilerOptions": {
+ "noEmit": true,
+ "paths": {
+ "@/*": ["./src/*"],
+ "@schema/*": ["./types/*"],
+ "@bindings/*": ["../../../trailbase-core/bindings/*"]
+ }
+ },
+ "include": ["src/**/*"],
+ "exclude": [
+ "dist",
+ "node_modules"
+ ]
+}
diff --git a/examples/tutorial/scripts/types/movie.ts b/examples/tutorial/scripts/types/movie.ts
new file mode 100644
index 0000000..f0a6974
--- /dev/null
+++ b/examples/tutorial/scripts/types/movie.ts
@@ -0,0 +1,199 @@
+// To parse this data:
+//
+// import { Convert, Movie } from "./file";
+//
+// const movie = Convert.toMovie(json);
+//
+// These functions will throw an error if the JSON doesn't
+// match the expected interface, even if the JSON is valid.
+
+export interface Movie {
+ description: string;
+ gross?: any[] | boolean | number | { [key: string]: any } | null | string;
+ metascore?: any[] | boolean | number | { [key: string]: any } | null | string;
+ name: string;
+ rank?: number;
+ rating: number;
+ votes: string;
+ watch_time: number;
+ year: any[] | boolean | number | { [key: string]: any } | null | string;
+ [property: string]: any;
+}
+
+// Converts JSON strings to/from your types
+// and asserts the results of JSON.parse at runtime
+export class Convert {
+ public static toMovie(json: string): Movie {
+ return cast(JSON.parse(json), r("Movie"));
+ }
+
+ public static movieToJson(value: Movie): string {
+ return JSON.stringify(uncast(value, r("Movie")), null, 2);
+ }
+}
+
+function invalidValue(typ: any, val: any, key: any, parent: any = ''): never {
+ const prettyTyp = prettyTypeName(typ);
+ const parentText = parent ? ` on ${parent}` : '';
+ const keyText = key ? ` for key "${key}"` : '';
+ throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
+}
+
+function prettyTypeName(typ: any): string {
+ if (Array.isArray(typ)) {
+ if (typ.length === 2 && typ[0] === undefined) {
+ return `an optional ${prettyTypeName(typ[1])}`;
+ } else {
+ return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
+ }
+ } else if (typeof typ === "object" && typ.literal !== undefined) {
+ return typ.literal;
+ } else {
+ return typeof typ;
+ }
+}
+
+function jsonToJSProps(typ: any): any {
+ if (typ.jsonToJS === undefined) {
+ const map: any = {};
+ typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ });
+ typ.jsonToJS = map;
+ }
+ return typ.jsonToJS;
+}
+
+function jsToJSONProps(typ: any): any {
+ if (typ.jsToJSON === undefined) {
+ const map: any = {};
+ typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ });
+ typ.jsToJSON = map;
+ }
+ return typ.jsToJSON;
+}
+
+function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any {
+ function transformPrimitive(typ: string, val: any): any {
+ if (typeof typ === typeof val) return val;
+ return invalidValue(typ, val, key, parent);
+ }
+
+ function transformUnion(typs: any[], val: any): any {
+ // val must validate against one typ in typs
+ const l = typs.length;
+ for (let i = 0; i < l; i++) {
+ const typ = typs[i];
+ try {
+ return transform(val, typ, getProps);
+ } catch (_) {}
+ }
+ return invalidValue(typs, val, key, parent);
+ }
+
+ function transformEnum(cases: string[], val: any): any {
+ if (cases.indexOf(val) !== -1) return val;
+ return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
+ }
+
+ function transformArray(typ: any, val: any): any {
+ // val must be an array with no invalid elements
+ if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
+ return val.map(el => transform(el, typ, getProps));
+ }
+
+ function transformDate(val: any): any {
+ if (val === null) {
+ return null;
+ }
+ const d = new Date(val);
+ if (isNaN(d.valueOf())) {
+ return invalidValue(l("Date"), val, key, parent);
+ }
+ return d;
+ }
+
+ function transformObject(props: { [k: string]: any }, additional: any, val: any): any {
+ if (val === null || typeof val !== "object" || Array.isArray(val)) {
+ return invalidValue(l(ref || "object"), val, key, parent);
+ }
+ const result: any = {};
+ Object.getOwnPropertyNames(props).forEach(key => {
+ const prop = props[key];
+ const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
+ result[prop.key] = transform(v, prop.typ, getProps, key, ref);
+ });
+ Object.getOwnPropertyNames(val).forEach(key => {
+ if (!Object.prototype.hasOwnProperty.call(props, key)) {
+ result[key] = transform(val[key], additional, getProps, key, ref);
+ }
+ });
+ return result;
+ }
+
+ if (typ === "any") return val;
+ if (typ === null) {
+ if (val === null) return val;
+ return invalidValue(typ, val, key, parent);
+ }
+ if (typ === false) return invalidValue(typ, val, key, parent);
+ let ref: any = undefined;
+ while (typeof typ === "object" && typ.ref !== undefined) {
+ ref = typ.ref;
+ typ = typeMap[typ.ref];
+ }
+ if (Array.isArray(typ)) return transformEnum(typ, val);
+ if (typeof typ === "object") {
+ return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
+ : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val)
+ : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val)
+ : invalidValue(typ, val, key, parent);
+ }
+ // Numbers can be parsed by Date but shouldn't be.
+ if (typ === Date && typeof val !== "number") return transformDate(val);
+ return transformPrimitive(typ, val);
+}
+
+function cast(val: any, typ: any): T {
+ return transform(val, typ, jsonToJSProps);
+}
+
+function uncast(val: T, typ: any): any {
+ return transform(val, typ, jsToJSONProps);
+}
+
+function l(typ: any) {
+ return { literal: typ };
+}
+
+function a(typ: any) {
+ return { arrayItems: typ };
+}
+
+function u(...typs: any[]) {
+ return { unionMembers: typs };
+}
+
+function o(props: any[], additional: any) {
+ return { props, additional };
+}
+
+function m(additional: any) {
+ return { props: [], additional };
+}
+
+function r(name: string) {
+ return { ref: name };
+}
+
+const typeMap: any = {
+ "Movie": o([
+ { json: "description", js: "description", typ: "" },
+ { json: "gross", js: "gross", typ: u(undefined, u(a("any"), true, 3.14, m("any"), null, "")) },
+ { json: "metascore", js: "metascore", typ: u(undefined, u(a("any"), true, 3.14, m("any"), null, "")) },
+ { json: "name", js: "name", typ: "" },
+ { json: "rank", js: "rank", typ: u(undefined, 0) },
+ { json: "rating", js: "rating", typ: 3.14 },
+ { json: "votes", js: "votes", typ: "" },
+ { json: "watch_time", js: "watch_time", typ: 0 },
+ { json: "year", js: "year", typ: u(a("any"), true, 3.14, m("any"), null, "") },
+ ], "any"),
+};
diff --git a/examples/tutorial/traildepot/config.textproto b/examples/tutorial/traildepot/config.textproto
new file mode 100644
index 0000000..fabb5f1
--- /dev/null
+++ b/examples/tutorial/traildepot/config.textproto
@@ -0,0 +1,30 @@
+# Auto-generated config.Config textproto
+email {}
+server {
+ application_name: "TrailBase-Tutorial"
+ site_url: "http://localhost:4000"
+ logs_retention_sec: 604800
+}
+auth {
+ auth_token_ttl_sec: 86400
+ refresh_token_ttl_sec: 2592000
+}
+record_apis: [
+ {
+ name: "_user_avatar"
+ table_name: "_user_avatar"
+ conflict_resolution: REPLACE
+ autofill_missing_user_id_columns: true
+ acl_world: [READ]
+ acl_authenticated: [CREATE, READ, UPDATE, DELETE]
+ create_access_rule: "_REQ_.user IS NULL OR _REQ_.user = _USER_.id"
+ update_access_rule: "_ROW_.user = _USER_.id"
+ delete_access_rule: "_ROW_.user = _USER_.id"
+ },
+ {
+ name: "movies"
+ table_name: "movies"
+ acl_world: [READ]
+ acl_authenticated: [CREATE, READ, UPDATE, DELETE]
+ }
+]
diff --git a/examples/tutorial/traildepot/migrations/U1725019360__add_admin_user.sql b/examples/tutorial/traildepot/migrations/U1725019360__add_admin_user.sql
new file mode 100644
index 0000000..8e0fa57
--- /dev/null
+++ b/examples/tutorial/traildepot/migrations/U1725019360__add_admin_user.sql
@@ -0,0 +1,5 @@
+-- Create admin user with "secret" password.
+INSERT INTO _user
+ (email, password_hash, verified, admin)
+VALUES
+ ('admin@localhost', (hash_password('secret')), TRUE, TRUE);
diff --git a/examples/tutorial/traildepot/migrations/U1728810800__create_table_movies.sql b/examples/tutorial/traildepot/migrations/U1728810800__create_table_movies.sql
new file mode 100644
index 0000000..14c7fe1
--- /dev/null
+++ b/examples/tutorial/traildepot/migrations/U1728810800__create_table_movies.sql
@@ -0,0 +1,16 @@
+-- A table schema to hold the IMDB test dataset from:
+-- https://www.kaggle.com/datasets/inductiveanks/top-1000-imdb-movies-dataset/data
+--
+-- The only TrailBase API requirements are: "STRICT" typing and a INTEGER (or
+-- UUIDv7) PRIMARY KEY column.
+CREATE TABLE IF NOT EXISTS movies (
+ rank INTEGER PRIMARY KEY,
+ name TEXT NOT NULL,
+ year ANY NOT NULL,
+ watch_time INTEGER NOT NULL,
+ rating REAL NOT NULL,
+ metascore ANY,
+ gross ANY,
+ votes TEXT NOT NULL,
+ description TEXT NOT NULL
+) STRICT;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..367bf57
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,9579 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ client/trailbase-ts:
+ dependencies:
+ jwt-decode:
+ specifier: ^4.0.0
+ version: 4.0.0
+ uuid:
+ specifier: ^11.0.2
+ version: 11.0.2
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.13.0
+ version: 9.13.0
+ eslint:
+ specifier: ^9.13.0
+ version: 9.13.0(jiti@2.3.3)
+ execa:
+ specifier: ^9.5.1
+ version: 9.5.1
+ globals:
+ specifier: ^15.11.0
+ version: 15.11.0
+ http-status:
+ specifier: ^2.0.0
+ version: 2.0.0
+ jsdom:
+ specifier: ^25.0.1
+ version: 25.0.1
+ prettier:
+ specifier: ^3.3.3
+ version: 3.3.3
+ tinybench:
+ specifier: ^3.0.0
+ version: 3.0.0
+ typescript:
+ specifier: ^5.6.3
+ version: 5.6.3
+ typescript-eslint:
+ specifier: ^8.12.1
+ version: 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+ vite-node:
+ specifier: ^2.1.4
+ version: 2.1.4(@types/node@22.8.2)
+ vitest:
+ specifier: ^2.1.4
+ version: 2.1.4(@types/node@22.8.2)(happy-dom@15.7.4)(jsdom@25.0.1)
+
+ docs:
+ dependencies:
+ '@astrojs/check':
+ specifier: ^0.9.4
+ version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.6.3)
+ '@astrojs/starlight':
+ specifier: ^0.28.4
+ version: 0.28.4(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))
+ '@astrojs/starlight-tailwind':
+ specifier: ^2.0.3
+ version: 2.0.3(@astrojs/starlight@0.28.4(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3)))(@astrojs/tailwind@5.1.2(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))
+ '@astrojs/tailwind':
+ specifier: ^5.1.2
+ version: 5.1.2(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+ '@iconify-json/tabler':
+ specifier: ^1.2.6
+ version: 1.2.6
+ astro:
+ specifier: ^4.16.7
+ version: 4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3)
+ astro-icon:
+ specifier: ^1.1.1
+ version: 1.1.1
+ chart.js:
+ specifier: ^4.4.6
+ version: 4.4.6
+ chartjs-chart-error-bars:
+ specifier: ^4.4.3
+ version: 4.4.3(chart.js@4.4.6)
+ chartjs-plugin-deferred:
+ specifier: ^2.0.0
+ version: 2.0.0(chart.js@4.4.6)
+ sharp:
+ specifier: ^0.33.5
+ version: 0.33.5
+ solid-js:
+ specifier: ^1.9.3
+ version: 1.9.3
+ tailwindcss:
+ specifier: ^3.4.14
+ version: 3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+ typescript:
+ specifier: ^5.6.3
+ version: 5.6.3
+ devDependencies:
+ '@astrojs/sitemap':
+ specifier: ^3.2.1
+ version: 3.2.1
+ '@astrojs/solid-js':
+ specifier: ^4.4.2
+ version: 4.4.2(solid-devtools@0.30.1(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2)))(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2))
+ astro-robots-txt:
+ specifier: ^1.0.0
+ version: 1.0.0
+ prettier:
+ specifier: ^3.3.3
+ version: 3.3.3
+ prettier-plugin-astro:
+ specifier: ^0.14.1
+ version: 0.14.1
+
+ examples/blog/web:
+ dependencies:
+ '@astrojs/mdx':
+ specifier: ^3.1.8
+ version: 3.1.8(astro@4.16.7(@types/node@16.18.115)(rollup@4.24.2)(typescript@4.9.4))
+ '@astrojs/tailwind':
+ specifier: ^5.1.2
+ version: 5.1.2(astro@4.16.7(@types/node@16.18.115)(rollup@4.24.2)(typescript@4.9.4))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4)))(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4))
+ '@nanostores/persistent':
+ specifier: ^0.10.2
+ version: 0.10.2(nanostores@0.11.3)
+ '@nanostores/solid':
+ specifier: ^0.5.0
+ version: 0.5.0(nanostores@0.11.3)(solid-js@1.9.3)
+ astro:
+ specifier: ^4.16.7
+ version: 4.16.7(@types/node@16.18.115)(rollup@4.24.2)(typescript@4.9.4)
+ astro-icon:
+ specifier: ^1.1.1
+ version: 1.1.1
+ nanostores:
+ specifier: ^0.11.3
+ version: 0.11.3
+ solid-icons:
+ specifier: ^1.1.0
+ version: 1.1.0(solid-js@1.9.3)
+ solid-js:
+ specifier: ^1.9.3
+ version: 1.9.3
+ tailwindcss:
+ specifier: ^3.4.14
+ version: 3.4.14(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4))
+ trailbase:
+ specifier: workspace:*
+ version: link:../../../client/trailbase-ts
+ devDependencies:
+ '@astrojs/solid-js':
+ specifier: ^4.4.2
+ version: 4.4.2(solid-devtools@0.30.1(solid-js@1.9.3)(vite@5.4.10(@types/node@16.18.115)))(solid-js@1.9.3)(vite@5.4.10(@types/node@16.18.115))
+ '@iconify-json/tabler':
+ specifier: ^1.2.6
+ version: 1.2.6
+ '@tailwindcss/typography':
+ specifier: ^0.5.15
+ version: 0.5.15(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4)))
+ '@types/dateformat':
+ specifier: ^5.0.2
+ version: 5.0.2
+ prettier:
+ specifier: ^3.3.3
+ version: 3.3.3
+ prettier-plugin-astro:
+ specifier: ^0.14.1
+ version: 0.14.1
+ quicktype:
+ specifier: ^23.0.170
+ version: 23.0.170
+ sharp:
+ specifier: ^0.33.5
+ version: 0.33.5
+
+ examples/tutorial/scripts:
+ dependencies:
+ csv-parse:
+ specifier: ^5.5.6
+ version: 5.5.6
+ trailbase:
+ specifier: workspace:*
+ version: link:../../../client/trailbase-ts
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.13.0
+ version: 9.13.0
+ '@types/node':
+ specifier: ^22.8.2
+ version: 22.8.2
+ eslint:
+ specifier: ^9.13.0
+ version: 9.13.0(jiti@2.3.3)
+ prettier:
+ specifier: ^3.3.3
+ version: 3.3.3
+ quicktype:
+ specifier: ^23.0.170
+ version: 23.0.170
+ typescript:
+ specifier: ^5.6.3
+ version: 5.6.3
+ typescript-eslint:
+ specifier: ^8.12.1
+ version: 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+
+ ui/admin:
+ dependencies:
+ '@bufbuild/protobuf':
+ specifier: ^2.2.1
+ version: 2.2.1
+ '@codemirror/commands':
+ specifier: ^6.7.1
+ version: 6.7.1
+ '@codemirror/lang-sql':
+ specifier: ^6.8.0
+ version: 6.8.0(@codemirror/view@6.34.1)
+ '@codemirror/language':
+ specifier: ^6.10.3
+ version: 6.10.3
+ '@codemirror/state':
+ specifier: ^6.4.1
+ version: 6.4.1
+ '@codemirror/view':
+ specifier: ^6.34.1
+ version: 6.34.1
+ '@corvu/resizable':
+ specifier: ^0.2.3
+ version: 0.2.3(solid-js@1.9.3)
+ '@kobalte/core':
+ specifier: ^0.13.7
+ version: 0.13.7(solid-js@1.9.3)
+ '@kobalte/utils':
+ specifier: ^0.9.1
+ version: 0.9.1(solid-js@1.9.3)
+ '@nanostores/persistent':
+ specifier: ^0.10.2
+ version: 0.10.2(nanostores@0.11.3)
+ '@nanostores/solid':
+ specifier: ^0.5.0
+ version: 0.5.0(nanostores@0.11.3)(solid-js@1.9.3)
+ '@solid-primitives/memo':
+ specifier: ^1.3.10
+ version: 1.3.10(solid-js@1.9.3)
+ '@solidjs/router':
+ specifier: ^0.14.10
+ version: 0.14.10(solid-js@1.9.3)
+ '@tanstack/solid-form':
+ specifier: ^0.34.1
+ version: 0.34.1(solid-js@1.9.3)
+ '@tanstack/solid-query':
+ specifier: ^5.59.16
+ version: 5.59.16(solid-js@1.9.3)
+ '@tanstack/solid-table':
+ specifier: ^8.20.5
+ version: 8.20.5(solid-js@1.9.3)
+ '@tanstack/table-core':
+ specifier: ^8.20.5
+ version: 8.20.5
+ chart.js:
+ specifier: ^4.4.6
+ version: 4.4.6
+ class-variance-authority:
+ specifier: ^0.7.0
+ version: 0.7.0
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ long:
+ specifier: ^5.2.3
+ version: 5.2.3
+ nanostores:
+ specifier: ^0.11.3
+ version: 0.11.3
+ protobufjs:
+ specifier: ^7.4.0
+ version: 7.4.0
+ solid-icons:
+ specifier: ^1.1.0
+ version: 1.1.0(solid-js@1.9.3)
+ solid-js:
+ specifier: ^1.9.3
+ version: 1.9.3
+ tailwind-merge:
+ specifier: ^2.5.4
+ version: 2.5.4
+ tailwindcss:
+ specifier: ^3.4.14
+ version: 3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))
+ trailbase:
+ specifier: workspace:*
+ version: link:../../client/trailbase-ts
+ uuid:
+ specifier: ^11.0.2
+ version: 11.0.2
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.13.0
+ version: 9.13.0
+ '@iconify-json/tabler':
+ specifier: ^1.2.6
+ version: 1.2.6
+ '@tailwindcss/typography':
+ specifier: ^0.5.15
+ version: 0.5.15(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))
+ '@types/wicg-file-system-access':
+ specifier: ^2023.10.5
+ version: 2023.10.5
+ autoprefixer:
+ specifier: ^10.4.20
+ version: 10.4.20(postcss@8.4.47)
+ eslint:
+ specifier: ^9.13.0
+ version: 9.13.0(jiti@2.3.3)
+ globals:
+ specifier: ^15.11.0
+ version: 15.11.0
+ jsdom:
+ specifier: ^25.0.1
+ version: 25.0.1
+ postcss:
+ specifier: ^8.4.47
+ version: 8.4.47
+ prettier:
+ specifier: ^3.3.3
+ version: 3.3.3
+ ts-proto:
+ specifier: ^2.2.5
+ version: 2.2.5
+ typescript:
+ specifier: ^5.6.3
+ version: 5.6.3
+ typescript-eslint:
+ specifier: ^8.12.1
+ version: 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+ vite:
+ specifier: ^5.4.10
+ version: 5.4.10(@types/node@22.8.2)
+ vite-plugin-solid:
+ specifier: ^2.10.2
+ version: 2.10.2(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2))
+ vite-tsconfig-paths:
+ specifier: ^5.0.1
+ version: 5.0.1(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.2))
+ vitest:
+ specifier: ^2.1.4
+ version: 2.1.4(@types/node@22.8.2)(happy-dom@15.7.4)(jsdom@25.0.1)
+
+ ui/auth:
+ dependencies:
+ '@astrojs/check':
+ specifier: ^0.9.4
+ version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.6.3)
+ '@astrojs/solid-js':
+ specifier: ^4.4.2
+ version: 4.4.2(solid-devtools@0.30.1(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2)))(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2))
+ '@astrojs/tailwind':
+ specifier: ^5.1.2
+ version: 5.1.2(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+ '@kobalte/core':
+ specifier: ^0.13.7
+ version: 0.13.7(solid-js@1.9.3)
+ astro:
+ specifier: ^4.16.7
+ version: 4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3)
+ astro-icon:
+ specifier: ^1.1.1
+ version: 1.1.1
+ class-variance-authority:
+ specifier: ^0.7.0
+ version: 0.7.0
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ solid-icons:
+ specifier: ^1.1.0
+ version: 1.1.0(solid-js@1.9.3)
+ solid-js:
+ specifier: ^1.9.3
+ version: 1.9.3
+ tailwind-merge:
+ specifier: ^2.5.4
+ version: 2.5.4
+ tailwindcss:
+ specifier: ^3.4.14
+ version: 3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))
+ trailbase:
+ specifier: workspace:*
+ version: link:../../client/trailbase-ts
+ devDependencies:
+ '@iconify-json/tabler':
+ specifier: ^1.2.6
+ version: 1.2.6
+ '@tailwindcss/typography':
+ specifier: ^0.5.15
+ version: 0.5.15(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))
+ prettier:
+ specifier: ^3.3.3
+ version: 3.3.3
+ prettier-plugin-astro:
+ specifier: ^0.14.1
+ version: 0.14.1
+ sharp:
+ specifier: ^0.33.5
+ version: 0.33.5
+ ts-proto:
+ specifier: ^2.2.5
+ version: 2.2.5
+ typescript:
+ specifier: ^5.6.3
+ version: 5.6.3
+
+packages:
+
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@antfu/install-pkg@0.4.1':
+ resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==}
+
+ '@antfu/utils@0.7.10':
+ resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+
+ '@astrojs/check@0.9.4':
+ resolution: {integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+
+ '@astrojs/compiler@2.10.3':
+ resolution: {integrity: sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==}
+
+ '@astrojs/internal-helpers@0.4.1':
+ resolution: {integrity: sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==}
+
+ '@astrojs/language-server@2.15.4':
+ resolution: {integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==}
+ hasBin: true
+ peerDependencies:
+ prettier: ^3.0.0
+ prettier-plugin-astro: '>=0.11.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+
+ '@astrojs/markdown-remark@5.3.0':
+ resolution: {integrity: sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==}
+
+ '@astrojs/mdx@3.1.8':
+ resolution: {integrity: sha512-4o/+pvgoLFG0eG96cFs4t3NzZAIAOYu57fKAprWHXJrnq/qdBV0av6BYDjoESxvxNILUYoj8sdZVWtlPWVDLog==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0}
+ peerDependencies:
+ astro: ^4.8.0
+
+ '@astrojs/prism@3.1.0':
+ resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0}
+
+ '@astrojs/sitemap@3.2.1':
+ resolution: {integrity: sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA==}
+
+ '@astrojs/solid-js@4.4.2':
+ resolution: {integrity: sha512-E41gipjC2kp3wr7QdFW5EszPOwxDBUlsNsIohKRxkC9RskiQk9a8F56dEvpeBMXUXtmsAtNUBJHdKRTxHtOgDw==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0}
+ peerDependencies:
+ solid-devtools: ^0.30.1
+ solid-js: ^1.8.5
+ peerDependenciesMeta:
+ solid-devtools:
+ optional: true
+
+ '@astrojs/starlight-tailwind@2.0.3':
+ resolution: {integrity: sha512-ZwbdXS/9rxYlo3tKZoTZoBPUnaaqek02b341dHwOkmMT0lIR2w+8k0mRUGxnRaYtPdMcaL+nYFd8RUa8sjdyRg==}
+ peerDependencies:
+ '@astrojs/starlight': '>=0.9.0'
+ '@astrojs/tailwind': ^5.0.0
+ tailwindcss: ^3.3.3
+
+ '@astrojs/starlight@0.28.4':
+ resolution: {integrity: sha512-SU0vgCQCQZ6AuA84doxpGr5Aowr9L/PalddUbeDWSzkjE/YierFcvmBg78cSB0pdL0Q1v4k4l+wqhz176wHmTA==}
+ peerDependencies:
+ astro: ^4.14.0
+
+ '@astrojs/tailwind@5.1.2':
+ resolution: {integrity: sha512-IvOF0W/dtHElcXvhrPR35nHmhyV3cfz1EzPitMGtU7sYy9Hci3BNK1To6FWmVuuNKPxza1IgCGetSynJZL7fOg==}
+ peerDependencies:
+ astro: ^3.0.0 || ^4.0.0 || ^5.0.0-beta.0
+ tailwindcss: ^3.0.24
+
+ '@astrojs/telemetry@3.1.0':
+ resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0}
+
+ '@astrojs/yaml2ts@0.2.2':
+ resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==}
+
+ '@babel/code-frame@7.26.0':
+ resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.26.0':
+ resolution: {integrity: sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.26.0':
+ resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.26.0':
+ resolution: {integrity: sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.25.9':
+ resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.25.9':
+ resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.18.6':
+ resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.25.9':
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.26.0':
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.25.9':
+ resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.25.9':
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.25.9':
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.25.9':
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.26.0':
+ resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.26.1':
+ resolution: {integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-jsx@7.25.9':
+ resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.25.9':
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx@7.25.9':
+ resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.26.0':
+ resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.25.9':
+ resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.25.9':
+ resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.26.0':
+ resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
+ engines: {node: '>=6.9.0'}
+
+ '@bufbuild/protobuf@2.2.1':
+ resolution: {integrity: sha512-gdWzq7eX017a1kZCU/bP/sbk4e0GZ6idjsXOcMrQwODCb/rx985fHJJ8+hCu79KpuG7PfZh7bo3BBjPH37JuZw==}
+
+ '@codemirror/autocomplete@6.18.1':
+ resolution: {integrity: sha512-iWHdj/B1ethnHRTwZj+C1obmmuCzquH29EbcKr0qIjA9NfDeBDJ7vs+WOHsFeLeflE4o+dHfYndJloMKHUkWUA==}
+ peerDependencies:
+ '@codemirror/language': ^6.0.0
+ '@codemirror/state': ^6.0.0
+ '@codemirror/view': ^6.0.0
+ '@lezer/common': ^1.0.0
+
+ '@codemirror/commands@6.7.1':
+ resolution: {integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==}
+
+ '@codemirror/lang-sql@6.8.0':
+ resolution: {integrity: sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg==}
+
+ '@codemirror/language@6.10.3':
+ resolution: {integrity: sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A==}
+
+ '@codemirror/state@6.4.1':
+ resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==}
+
+ '@codemirror/view@6.34.1':
+ resolution: {integrity: sha512-t1zK/l9UiRqwUNPm+pdIT0qzJlzuVckbTEMVNFhfWkGiBQClstzg+78vedCvLSX0xJEZ6lwZbPpnljL7L6iwMQ==}
+
+ '@corvu/resizable@0.2.3':
+ resolution: {integrity: sha512-UwpObxqKlx1mc3G496Daz9NjK25Gx1V5fB8zIGazbq5tJs7aU8RjPW4png5OoNpMyxV7GQWjQtVc59zaAEVAJg==}
+ peerDependencies:
+ solid-js: ^1.8
+
+ '@corvu/utils@0.4.2':
+ resolution: {integrity: sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA==}
+ peerDependencies:
+ solid-js: ^1.8
+
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+
+ '@ctrl/tinycolor@4.1.0':
+ resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==}
+ engines: {node: '>=14'}
+
+ '@emmetio/abbreviation@2.3.3':
+ resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==}
+
+ '@emmetio/css-abbreviation@2.1.8':
+ resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==}
+
+ '@emmetio/css-parser@0.4.0':
+ resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==}
+
+ '@emmetio/html-matcher@1.3.0':
+ resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==}
+
+ '@emmetio/scanner@1.0.4':
+ resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==}
+
+ '@emmetio/stream-reader-utils@0.1.0':
+ resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==}
+
+ '@emmetio/stream-reader@2.2.0':
+ resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==}
+
+ '@emnapi/runtime@1.3.1':
+ resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
+
+ '@esbuild/aix-ppc64@0.21.5':
+ resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.21.5':
+ resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.21.5':
+ resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.21.5':
+ resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.21.5':
+ resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.21.5':
+ resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.21.5':
+ resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.21.5':
+ resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.21.5':
+ resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.21.5':
+ resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.21.5':
+ resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.21.5':
+ resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.21.5':
+ resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.21.5':
+ resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.21.5':
+ resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.21.5':
+ resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.21.5':
+ resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.21.5':
+ resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-x64@0.21.5':
+ resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.21.5':
+ resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.21.5':
+ resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.21.5':
+ resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.21.5':
+ resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.4.1':
+ resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.18.0':
+ resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.7.0':
+ resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.1.0':
+ resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.13.0':
+ resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.4':
+ resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.2.2':
+ resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@expressive-code/core@0.35.6':
+ resolution: {integrity: sha512-xGqCkmfkgT7lr/rvmfnYdDSeTdCSp1otAHgoFS6wNEeO7wGDPpxdosVqYiIcQ8CfWUABh/pGqWG90q+MV3824A==}
+
+ '@expressive-code/plugin-frames@0.35.6':
+ resolution: {integrity: sha512-CqjSWjDJ3wabMJZfL9ZAzH5UAGKg7KWsf1TBzr4xvUbZvWoBtLA/TboBML0U1Ls8h/4TRCIvR4VEb8dv5+QG3w==}
+
+ '@expressive-code/plugin-shiki@0.35.6':
+ resolution: {integrity: sha512-xm+hzi9BsmhkDUGuyAWIydOAWer7Cs9cj8FM0t4HXaQ+qCubprT6wJZSKUxuvFJIUsIOqk1xXFaJzGJGnWtKMg==}
+
+ '@expressive-code/plugin-text-markers@0.35.6':
+ resolution: {integrity: sha512-/k9eWVZSCs+uEKHR++22Uu6eIbHWEciVHbIuD8frT8DlqTtHYaaiwHPncO6KFWnGDz5i/gL7oyl6XmOi/E6GVg==}
+
+ '@floating-ui/core@1.6.8':
+ resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
+
+ '@floating-ui/dom@1.6.11':
+ resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==}
+
+ '@floating-ui/utils@0.2.8':
+ resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+
+ '@glideapps/ts-necessities@2.2.3':
+ resolution: {integrity: sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w==}
+
+ '@glideapps/ts-necessities@2.3.2':
+ resolution: {integrity: sha512-tOXo3SrEeLu+4X2q6O2iNPXdGI1qoXEz/KrbkElTsWiWb69tFH4GzWz2K++0nBD6O3qO2Ft1C4L4ZvUfE2QDlQ==}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.6':
+ resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.3.1':
+ resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+ engines: {node: '>=18.18'}
+
+ '@iconify-json/tabler@1.2.6':
+ resolution: {integrity: sha512-+LjRsbx4tqaLNorQldahZRCepYVAC8Fj6hpkHuZFWB0xj81YasACT0f9JGtavG4+LePdvkXRTuz5RQOU6YcnXA==}
+
+ '@iconify/tools@4.0.7':
+ resolution: {integrity: sha512-zOJxKIfZn96ZRGGvIWzDRLD9vb2CsxjcLuM+QIdvwWbv6SWhm49gECzUnd4d2P0sq9sfodT7yCNobWK8nvavxQ==}
+
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/utils@2.1.33':
+ resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==}
+
+ '@img/sharp-darwin-arm64@0.33.5':
+ resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.33.5':
+ resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.33.5':
+ resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.33.5':
+ resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.33.5':
+ resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.33.5':
+ resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.33.5':
+ resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.33.5':
+ resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.33.5':
+ resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-ia32@0.33.5':
+ resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.33.5':
+ resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@internationalized/date@3.5.6':
+ resolution: {integrity: sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw==}
+
+ '@internationalized/number@3.5.4':
+ resolution: {integrity: sha512-h9huwWjNqYyE2FXZZewWqmCdkw1HeFds5q4Siuoms3hUQC5iPJK3aBmkFZoDSLN4UD0Bl8G22L/NdHpeOr+/7A==}
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@jridgewell/gen-mapping@0.3.5':
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
+ '@kobalte/core@0.13.7':
+ resolution: {integrity: sha512-COhjWk1KnCkl3qMJDvdrOsvpTlJ9gMLdemkAn5SWfbPn/lxJYabejnNOk+b/ILGg7apzQycgbuo48qb8ppqsAg==}
+ peerDependencies:
+ solid-js: ^1.8.15
+
+ '@kobalte/utils@0.9.1':
+ resolution: {integrity: sha512-eeU60A3kprIiBDAfv9gUJX1tXGLuZiKMajUfSQURAF2pk4ZoMYiqIzmrMBvzcxP39xnYttgTyQEVLwiTZnrV4w==}
+ peerDependencies:
+ solid-js: ^1.8.8
+
+ '@kurkle/color@0.3.2':
+ resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==}
+
+ '@lezer/common@1.2.3':
+ resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==}
+
+ '@lezer/highlight@1.2.1':
+ resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==}
+
+ '@lezer/lr@1.4.2':
+ resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==}
+
+ '@mark.probst/typescript-json-schema@0.55.0':
+ resolution: {integrity: sha512-jI48mSnRgFQxXiE/UTUCVCpX8lK3wCFKLF1Ss2aEreboKNuLQGt3e0/YFqWVHe/WENxOaqiJvwOz+L/SrN2+qQ==}
+ hasBin: true
+
+ '@mdx-js/mdx@3.1.0':
+ resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==}
+
+ '@nanostores/persistent@0.10.2':
+ resolution: {integrity: sha512-BEndnLhRC+yP7gXTESepBbSj8XNl8OXK9hu4xAgKC7MWJHKXnEqJMqY47LUyHxK6vYgFnisyHmqq+vq8AUFyIg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ peerDependencies:
+ nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0
+
+ '@nanostores/solid@0.5.0':
+ resolution: {integrity: sha512-bui454Om+smaCFK259D618i01Rb0w+o9uVcwZWlZqMOOQZXuqPR6azyF7tA++skBUlTDty4sB9XDt/1HDsh/CA==}
+ peerDependencies:
+ nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0
+ solid-js: ^1.6.0
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@nothing-but/utils@0.12.1':
+ resolution: {integrity: sha512-1qZU1Q5El0IjE7JT/ucvJNzdr2hL3W8Rm27xNf1p6gb3Nw8pGnZmxp6/GEW9h+I1k1cICxXNq25hBwknTQ7yhg==}
+
+ '@oslojs/encoding@1.1.0':
+ resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
+
+ '@pagefind/darwin-arm64@1.1.1':
+ resolution: {integrity: sha512-tZ9tysUmQpFs2EqWG2+E1gc+opDAhSyZSsgKmFzhnWfkK02YHZhvL5XJXEZDqYy3s1FAKhwjTg8XDxneuBlDZQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@pagefind/darwin-x64@1.1.1':
+ resolution: {integrity: sha512-ChohLQ39dLwaxQv0jIQB/SavP3TM5K5ENfDTqIdzLkmfs3+JlzSDyQKcJFjTHYcCzQOZVeieeGq8PdqvLJxJxQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@pagefind/default-ui@1.1.1':
+ resolution: {integrity: sha512-ZM0zDatWDnac/VGHhQCiM7UgA4ca8jpjA+VfuTJyHJBaxGqZMQnm4WoTz9E0KFcue1Bh9kxpu7uWFZfwpZZk0A==}
+
+ '@pagefind/linux-arm64@1.1.1':
+ resolution: {integrity: sha512-H5P6wDoCoAbdsWp0Zx0DxnLUrwTGWGLu/VI1rcN2CyFdY2EGSvPQsbGBMrseKRNuIrJDFtxHHHyjZ7UbzaM9EA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@pagefind/linux-x64@1.1.1':
+ resolution: {integrity: sha512-yJs7tTYbL2MI3HT+ngs9E1BfUbY9M4/YzA0yEM5xBo4Xl8Yu8Qg2xZTOQ1/F6gwvMrjCUFo8EoACs6LRDhtMrQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@pagefind/windows-x64@1.1.1':
+ resolution: {integrity: sha512-b7/qPqgIl+lMzkQ8fJt51SfguB396xbIIR+VZ3YrL2tLuyifDJ1wL5mEm+ddmHxJ2Fki340paPcDan9en5OmAw==}
+ cpu: [x64]
+ os: [win32]
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@protobufjs/aspromise@1.1.2':
+ resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
+
+ '@protobufjs/base64@1.1.2':
+ resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
+
+ '@protobufjs/codegen@2.0.4':
+ resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
+
+ '@protobufjs/eventemitter@1.1.0':
+ resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
+
+ '@protobufjs/fetch@1.1.0':
+ resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
+
+ '@protobufjs/float@1.0.2':
+ resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
+
+ '@protobufjs/inquire@1.1.0':
+ resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
+
+ '@protobufjs/path@1.1.2':
+ resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
+
+ '@protobufjs/pool@1.1.0':
+ resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
+
+ '@protobufjs/utf8@1.1.0':
+ resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+
+ '@rollup/pluginutils@5.1.3':
+ resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.24.2':
+ resolution: {integrity: sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.24.2':
+ resolution: {integrity: sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.24.2':
+ resolution: {integrity: sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.24.2':
+ resolution: {integrity: sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.24.2':
+ resolution: {integrity: sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.24.2':
+ resolution: {integrity: sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.24.2':
+ resolution: {integrity: sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.24.2':
+ resolution: {integrity: sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.24.2':
+ resolution: {integrity: sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.24.2':
+ resolution: {integrity: sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.24.2':
+ resolution: {integrity: sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.24.2':
+ resolution: {integrity: sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.24.2':
+ resolution: {integrity: sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.24.2':
+ resolution: {integrity: sha512-jOG/0nXb3z+EM6SioY8RofqqmZ+9NKYvJ6QQaa9Mvd3RQxlH68/jcB/lpyVt4lCiqr04IyaC34NzhUqcXbB5FQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.24.2':
+ resolution: {integrity: sha512-XAo7cJec80NWx9LlZFEJQxqKOMz/lX3geWs2iNT5CHIERLFfd90f3RYLLjiCBm1IMaQ4VOX/lTC9lWfzzQm14Q==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-win32-arm64-msvc@4.24.2':
+ resolution: {integrity: sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.24.2':
+ resolution: {integrity: sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.24.2':
+ resolution: {integrity: sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@sec-ant/readable-stream@0.4.1':
+ resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
+
+ '@shikijs/core@1.22.2':
+ resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==}
+
+ '@shikijs/engine-javascript@1.22.2':
+ resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==}
+
+ '@shikijs/engine-oniguruma@1.22.2':
+ resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==}
+
+ '@shikijs/types@1.22.2':
+ resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==}
+
+ '@shikijs/vscode-textmate@9.3.0':
+ resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==}
+
+ '@sindresorhus/merge-streams@4.0.0':
+ resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+ engines: {node: '>=18'}
+
+ '@solid-devtools/debugger@0.23.4':
+ resolution: {integrity: sha512-EfTB1Eo313wztQYGJ4Ec/wE70Ay2d603VCXfT3RlyqO5QfLrQGRHX5NXC07hJpQTJJJ3tbNgzO7+ZKo76MM5uA==}
+ peerDependencies:
+ solid-js: ^1.8.0
+
+ '@solid-devtools/shared@0.13.2':
+ resolution: {integrity: sha512-Y4uaC4EfTVwBR537MZwfaY/eiWAh+hW4mbtnwNuUw/LFmitHSkQhNQTUlLQv/S0chtwrYWQBxvXos1dC7e8R9g==}
+ peerDependencies:
+ solid-js: ^1.8.0
+
+ '@solid-primitives/bounds@0.0.118':
+ resolution: {integrity: sha512-Qj42w8LlnhJ3r/t+t0c0vrdwIvvQMPgjEFGmLiwREaA85ojLbgL9lSBq2tKvljeLCvRVkgj10KEUf+vc99VCIg==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/cursor@0.0.112':
+ resolution: {integrity: sha512-TAtU7qD7ipSLSXHnq8FhhosAPVX+dnOCb/ITcGcLlj8e/C9YKcxDhgBHJ3R/d1xDRb5/vO/szJtEz6fnQD311Q==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/event-bus@1.0.11':
+ resolution: {integrity: sha512-bSwVA4aI2aNHomSbEroUnisMSyDDXJbrw4U8kFEvrcYdlLrJX5i6QeCFx+vj/zdQQw62KAllrEIyWP8KMpPVnQ==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/event-listener@2.3.3':
+ resolution: {integrity: sha512-DAJbl+F0wrFW2xmcV8dKMBhk9QLVLuBSW+TR4JmIfTaObxd13PuL7nqaXnaYKDWOYa6otB00qcCUIGbuIhSUgQ==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/keyboard@1.2.8':
+ resolution: {integrity: sha512-pJtcbkjozS6L1xvTht9rPpyPpX55nAkfBzbFWdf3y0Suwh6qClTibvvObzKOf7uzQ+8aZRDH4LsoGmbTKXtJjQ==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/keyed@1.2.3':
+ resolution: {integrity: sha512-Tlm2wCKcXEVxqd1speWjPhGvDhuuo/VeWSvNF6r2h77BUOHRKmNwz9uVKKMQmYSaLwiptJTp+fPZY2dOVPWQRQ==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/map@0.4.13':
+ resolution: {integrity: sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/media@2.2.9':
+ resolution: {integrity: sha512-QUmU62D4/d9YWx/4Dvr/UZasIkIpqNXz7wosA5GLmesRW9XlPa3G5M6uOmTw73SByHNTCw0D6x8bSdtvvLgzvQ==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/memo@1.3.10':
+ resolution: {integrity: sha512-S4cNjjKINVC4KiY3ovP1oagbTVQI77VvSRMNsInFIi7T4hM/N5InJk5k+W0zD4lt+SUYrWF04BMbZyMy17vfUw==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/platform@0.1.2':
+ resolution: {integrity: sha512-sSxcZfuUrtxcwV0vdjmGnZQcflACzMfLriVeIIWXKp8hzaS3Or3tO6EFQkTd3L8T5dTq+kTtLvPscXIpL0Wzdg==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/props@3.1.11':
+ resolution: {integrity: sha512-jZAKWwvDRHjiydIumDgMj68qviIbowQ1ci7nkEAgzgvanNkhKSQV8iPgR2jMk1uv7S2ZqXYHslVQTgJel/TEyg==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/refs@1.0.8':
+ resolution: {integrity: sha512-+jIsWG8/nYvhaCoG2Vg6CJOLgTmPKFbaCrNQKWfChalgUf9WrVxWw0CdJb3yX15n5lUcQ0jBo6qYtuVVmBLpBw==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/resize-observer@2.0.26':
+ resolution: {integrity: sha512-KbPhwal6ML9OHeUTZszBbt6PYSMj89d4wVCLxlvDYL4U0+p+xlCEaqz6v9dkCwm/0Lb+Wed7W5T1dQZCP3JUUw==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/rootless@1.4.5':
+ resolution: {integrity: sha512-GFJE9GC3ojx0aUKqAUZmQPyU8fOVMtnVNrkdk2yS4kd17WqVSpXpoTmo9CnOwA+PG7FTzdIkogvfLQSLs4lrww==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/scheduled@1.4.4':
+ resolution: {integrity: sha512-BTGdFP7t+s7RSak+s1u0eTix4lHP23MrbGkgQTFlt1E+4fmnD/bEx3ZfNW7Grylz3GXgKyXrgDKA7jQ/wuWKgA==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/static-store@0.0.5':
+ resolution: {integrity: sha512-ssQ+s/wrlFAEE4Zw8GV499yBfvWx7SMm+ZVc11wvao4T5xg9VfXCL9Oa+x4h+vPMvSV/Knv5LrsLiUa+wlJUXQ==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/static-store@0.0.8':
+ resolution: {integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/styles@0.0.111':
+ resolution: {integrity: sha512-1mBxOGAPXmfD5oYCvqjKBDN7SuNjz2qz7RdH7KtsuNLQh6lpuSKadtHnLvru0Y8Vz1InqTJisBIy/6P5kyDmPw==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/trigger@1.1.0':
+ resolution: {integrity: sha512-00BbAiXV66WwjHuKZc3wr0+GLb9C24mMUmi3JdTpNFgHBbrQGrIHubmZDg36c5/7wH+E0GQtOOanwQS063PO+A==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/utils@6.2.3':
+ resolution: {integrity: sha512-CqAwKb2T5Vi72+rhebSsqNZ9o67buYRdEJrIFzRXz3U59QqezuuxPsyzTSVCacwS5Pf109VRsgCJQoxKRoECZQ==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solidjs/router@0.14.10':
+ resolution: {integrity: sha512-5B8LVgvvXijfXyXWPVLUm7RQ05BhjIpAyRkYVDZtrR3OaSvftXobWc6qSEwk4ICLoGi/IE9CUp2LUdCBIs9AXg==}
+ peerDependencies:
+ solid-js: ^1.8.6
+
+ '@swc/helpers@0.5.13':
+ resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==}
+
+ '@tailwindcss/typography@0.5.15':
+ resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20'
+
+ '@tanstack/form-core@0.34.1':
+ resolution: {integrity: sha512-W8xRWcvlK5oek9V/JPblUyBf/cRb06nxqJTdEf7wZ6HxPnB0V9nNwZlWxvSfkMrbSkV+/H972Evy3cVc6WBB7g==}
+
+ '@tanstack/query-core@5.59.16':
+ resolution: {integrity: sha512-crHn+G3ltqb5JG0oUv6q+PMz1m1YkjpASrXTU+sYWW9pLk0t2GybUHNRqYPZWhxgjPaVGC4yp92gSFEJgYEsPw==}
+
+ '@tanstack/solid-form@0.34.1':
+ resolution: {integrity: sha512-sZBc8HbFI0oaf7wZzkeMFNEj7CUbU0lU4I3ufQ/ovlTMXcjXPRJ+rgfu/nrq83/DzRlfSbIoPv1efeMUKUx3cQ==}
+ peerDependencies:
+ solid-js: ^1.6.0
+
+ '@tanstack/solid-query@5.59.16':
+ resolution: {integrity: sha512-GWUbwAbIj8oLuj7zPEiHTIWp3SB/2+fSlVRpiHlTPpi7iH4Sb5inczxr+F/0y0DBKV6Wq/zo9ju5wdHQGEu31g==}
+ peerDependencies:
+ solid-js: ^1.6.0
+
+ '@tanstack/solid-store@0.5.6':
+ resolution: {integrity: sha512-YvRT++wB4keAnI67mlxB7FNoT9kI5+2zylDZA0b33bauOwhxVugHVvNv+tUwXCly/8G8kY8EE0peN9Wcv5vhVA==}
+ peerDependencies:
+ solid-js: ^1.6.0
+
+ '@tanstack/solid-table@8.20.5':
+ resolution: {integrity: sha512-LsB/g/24CjBpccOcok+u+tfyqtU9SIQg5wf7ne54jRdEsy5YQnrpb5ATWZileHBduIG0p/1oE7UOA+DyjtnbDQ==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ solid-js: '>=1.3'
+
+ '@tanstack/store@0.5.5':
+ resolution: {integrity: sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==}
+
+ '@tanstack/table-core@8.20.5':
+ resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==}
+ engines: {node: '>=12'}
+
+ '@trysound/sax@0.2.0':
+ resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+ engines: {node: '>=10.13.0'}
+
+ '@tsconfig/node10@1.0.11':
+ resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
+
+ '@tsconfig/node12@1.0.11':
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+ '@tsconfig/node14@1.0.3':
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+ '@tsconfig/node16@1.0.4':
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+
+ '@types/acorn@4.0.6':
+ resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.6.8':
+ resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.20.6':
+ resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+
+ '@types/cookie@0.6.0':
+ resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
+
+ '@types/dateformat@5.0.2':
+ resolution: {integrity: sha512-M95hNBMa/hnwErH+a+VOD/sYgTmo15OTYTM2Hr52/e0OdOuY+Crag+kd3/ioZrhg0WGbl9Sm3hR7UU+MH6rfOw==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/mdx@2.0.13':
+ resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
+
+ '@types/ms@0.7.34':
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+
+ '@types/nlcst@2.0.3':
+ resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
+
+ '@types/node@16.18.115':
+ resolution: {integrity: sha512-NF5ajYn+dq0tRfswdyp8Df75h7D9z+L8TCIwrXoh46ZLK6KZVXkRhf/luXaZytvm/keUo9vU4m1Bg39St91a5w==}
+
+ '@types/node@17.0.45':
+ resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
+
+ '@types/node@22.8.2':
+ resolution: {integrity: sha512-NzaRNFV+FZkvK/KLCsNdTvID0SThyrs5SHB6tsD/lajr22FGC73N2QeDPM2wHtVde8mgcXuSsHQkH5cX1pbPLw==}
+
+ '@types/sax@1.2.7':
+ resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
+
+ '@types/tar@6.1.13':
+ resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==}
+
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ '@types/wicg-file-system-access@2023.10.5':
+ resolution: {integrity: sha512-e9kZO9kCdLqT2h9Tw38oGv9UNzBBWaR1MzuAavxPcsV/7FJ3tWbU6RI3uB+yKIDPGLkGVbplS52ub0AcRLvrhA==}
+
+ '@types/yauzl@2.10.3':
+ resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
+
+ '@typescript-eslint/eslint-plugin@8.12.1':
+ resolution: {integrity: sha512-gNg/inLRcPoBsKKIe4Vv38SVSOhk4BKWNO0T56sVff33gRqtTpOsrhHtiOKD1lmIOmCtZMPaW2x/h2FlM+sCEg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/parser@8.12.1':
+ resolution: {integrity: sha512-I/I9Bg7qFa8rOgBnUUHIWTgzbB5wVkSLX+04xGUzTcJUtdq/I2uHWR9mbW6qUYJG/UmkuDcTax5JHvoEWOAHOQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/scope-manager@8.12.1':
+ resolution: {integrity: sha512-bma6sD1iViTt+y9MAwDlBdPTMCqoH/BNdcQk4rKhIZWv3eM0xHmzeSrPJA663PAqFqfpOmtdugycpr0E1mZDVA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/type-utils@8.12.1':
+ resolution: {integrity: sha512-zJzrvbDVjIzVKV2TGHcjembEhws8RWXJhmqfO9hS2gRXBN0gDwGhRPEdJ6AZglzfJ+YA1q09EWpSLSXjBJpIMQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/types@8.12.1':
+ resolution: {integrity: sha512-anMS4es5lxBe4UVcDXOkcDb3csnm5BvaNIbOFfvy/pJEohorsggdVB8MFbl5EZiEuBnZZ0ei1z7W5b6FdFiV1Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.12.1':
+ resolution: {integrity: sha512-k/o9khHOckPeDXilFTIPsP9iAYhhdMh3OsOL3i2072PNpFqhqzRHx472/0DeC8H/WZee3bZG0z2ddGRSPgeOKw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/utils@8.12.1':
+ resolution: {integrity: sha512-sDv9yFHrhKe1WN8EYuzfhKCh/sFRupe9P+m/lZ5YgVvPoCUGHNN50IO4llSu7JAbftUM/QcCh+GeCortXPrBYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+
+ '@typescript-eslint/visitor-keys@8.12.1':
+ resolution: {integrity: sha512-2RwdwnNGuOQKdGjuhujQHUqBZhEuodg2sLVPvOfWktvA9sOXOVqARjOyHSyhN2LiJGKxV6c8oOcmOtRcAnEeFw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@ungap/structured-clone@1.2.0':
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+
+ '@vitest/expect@2.1.4':
+ resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==}
+
+ '@vitest/mocker@2.1.4':
+ resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==}
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^5.0.0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+
+ '@vitest/pretty-format@2.1.4':
+ resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==}
+
+ '@vitest/runner@2.1.4':
+ resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==}
+
+ '@vitest/snapshot@2.1.4':
+ resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==}
+
+ '@vitest/spy@2.1.4':
+ resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==}
+
+ '@vitest/utils@2.1.4':
+ resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==}
+
+ '@volar/kit@2.4.8':
+ resolution: {integrity: sha512-HY+HTP9sSqj0St9j1N8l85YMu4w0GxCtelzkzZWuq2GVz0+QRYwlyc0mPH7749OknUAdtsdozBR5Ecez55Ncug==}
+ peerDependencies:
+ typescript: '*'
+
+ '@volar/language-core@2.4.8':
+ resolution: {integrity: sha512-K/GxMOXGq997bO00cdFhTNuR85xPxj0BEEAy+BaqqayTmy9Tmhfgmq2wpJcVspRhcwfgPoE2/mEJa26emUhG/g==}
+
+ '@volar/language-server@2.4.8':
+ resolution: {integrity: sha512-3Jd9Y+0Zhwi/zfdRxqoNrm7AxP6lgTsw4Ni9r6eCyWYGVsTnpVwGmlcbiZyDja6anoKZxnaeDatX1jkaHHWaRQ==}
+
+ '@volar/language-service@2.4.8':
+ resolution: {integrity: sha512-9y8X4cdUxXmy4s5HoB8jmOpDIZG7XVFu4iEFvouhZlJX2leCq0pbq5h7dhA+O8My0fne3vtE6cJ4t9nc+8UBZw==}
+
+ '@volar/source-map@2.4.8':
+ resolution: {integrity: sha512-jeWJBkC/WivdelMwxKkpFL811uH/jJ1kVxa+c7OvG48DXc3VrP7pplSWPP2W1dLMqBxD+awRlg55FQQfiup4cA==}
+
+ '@volar/typescript@2.4.8':
+ resolution: {integrity: sha512-6xkIYJ5xxghVBhVywMoPMidDDAFT1OoQeXwa27HSgJ6AiIKRe61RXLoik+14Z7r0JvnblXVsjsRLmCr42SGzqg==}
+
+ '@vscode/emmet-helper@2.9.3':
+ resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==}
+
+ '@vscode/l10n@0.0.18':
+ resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
+
+ abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn-walk@8.3.4:
+ resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
+ engines: {node: '>=0.4.0'}
+
+ acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@7.1.1:
+ resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
+ engines: {node: '>= 14'}
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+ ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-back@3.1.0:
+ resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==}
+ engines: {node: '>=6'}
+
+ array-back@6.2.2:
+ resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==}
+ engines: {node: '>=12.17'}
+
+ array-iterate@2.0.1:
+ resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
+
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
+
+ astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+ hasBin: true
+
+ astro-expressive-code@0.35.6:
+ resolution: {integrity: sha512-1U4KrvFuodaCV3z4I1bIR16SdhQlPkolGsYTtiANxPZUVv/KitGSCTjzksrkPonn1XuwVqvnwmUUVzTLWngnBA==}
+ peerDependencies:
+ astro: ^4.0.0-beta || ^3.3.0
+
+ astro-icon@1.1.1:
+ resolution: {integrity: sha512-HKBesWk2Faw/0+klLX+epQVqdTfSzZz/9+5vxXUjTJaN/HnpDf608gRPgHh7ZtwBPNJMEFoU5GLegxoDcT56OQ==}
+
+ astro-robots-txt@1.0.0:
+ resolution: {integrity: sha512-6JQSLid4gMhoWjOm85UHLkgrw0+hHIjnJVIUqxjU2D6feKlVyYukMNYjH44ZDZBK1P8hNxd33PgWlHzCASvedA==}
+
+ astro@4.16.7:
+ resolution: {integrity: sha512-nON+8MUEkWTFwXbS4zsQIq4t0Fs42eulM4x236AL+qNnWfqNAOOqAnFxO1dxfJ1q+XopIBbbT9Mtev+0zH47PQ==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
+ hasBin: true
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ autoprefixer@10.4.20:
+ resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
+ axios@1.7.7:
+ resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==}
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ babel-plugin-jsx-dom-expressions@0.39.3:
+ resolution: {integrity: sha512-6RzmSu21zYPlV2gNwzjGG9FgODtt9hIWnx7L//OIioIEuRcnpDZoY8Tr+I81Cy1SrH4qoDyKpwHHo6uAMAeyPA==}
+ peerDependencies:
+ '@babel/core': ^7.20.12
+
+ babel-preset-solid@1.9.3:
+ resolution: {integrity: sha512-jvlx5wDp8s+bEF9sGFw/84SInXOA51ttkUEroQziKMbxplXThVKt83qB6bDTa1HuLNatdU9FHpFOiQWs1tLQIg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ base-64@1.0.0:
+ resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ bcp-47-match@2.0.3:
+ resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==}
+
+ bcp-47@2.1.0:
+ resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ boxen@8.0.1:
+ resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==}
+ engines: {node: '>=18'}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browser-or-node@3.0.0:
+ resolution: {integrity: sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ==}
+
+ browserslist@4.24.2:
+ resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-crc32@0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+
+ camelcase@8.0.0:
+ resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
+ engines: {node: '>=16'}
+
+ caniuse-lite@1.0.30001674:
+ resolution: {integrity: sha512-jOsKlZVRnzfhLojb+Ykb+gyUSp9Xb57So+fAiFlLzzTKpqg8xxSav0e40c8/4F/v9N8QSvrRRaLeVzQbLqomYw==}
+
+ case-anything@2.1.13:
+ resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==}
+ engines: {node: '>=12.13'}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+ chai@5.1.2:
+ resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==}
+ engines: {node: '>=12'}
+
+ chalk-template@0.4.0:
+ resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==}
+ engines: {node: '>=12'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+
+ chart.js@4.4.6:
+ resolution: {integrity: sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA==}
+ engines: {pnpm: '>=8'}
+
+ chartjs-chart-error-bars@4.4.3:
+ resolution: {integrity: sha512-oM9jmH9G4mpdEyBE8V5jxSH3NtBaL4Vymfy7yXlnkV9niijuZQCzZvN8NtXP8x3wqcrv6HhSwRLGJznVCv4uAA==}
+ peerDependencies:
+ chart.js: ^4.1.0
+
+ chartjs-plugin-deferred@2.0.0:
+ resolution: {integrity: sha512-jq6b8Wt23WS6zxiX8oVB1MXq4uaJX2KGTyiqnq6xo4ctZPgFkT/FuIEKpJjsF1WkYv7ZQrqrrRg1fLw6O5ZEfQ==}
+ peerDependencies:
+ chart.js: '>= 3.0.0'
+
+ check-error@2.1.1:
+ resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+ engines: {node: '>= 16'}
+
+ cheerio-select@2.1.0:
+ resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
+
+ cheerio@1.0.0:
+ resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==}
+ engines: {node: '>=18.17'}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ chokidar@4.0.1:
+ resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==}
+ engines: {node: '>= 14.16.0'}
+
+ chownr@2.0.0:
+ resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
+ engines: {node: '>=10'}
+
+ ci-info@4.0.0:
+ resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==}
+ engines: {node: '>=8'}
+
+ class-variance-authority@0.7.0:
+ resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
+
+ cli-boxes@3.0.0:
+ resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+ engines: {node: '>=10'}
+
+ cli-cursor@5.0.0:
+ resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+ engines: {node: '>=18'}
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ clsx@2.0.0:
+ resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==}
+ engines: {node: '>=6'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ collapse-white-space@2.1.0:
+ resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
+
+ collection-utils@1.0.1:
+ resolution: {integrity: sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ command-line-args@5.2.1:
+ resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==}
+ engines: {node: '>=4.0.0'}
+
+ command-line-usage@7.0.3:
+ resolution: {integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==}
+ engines: {node: '>=12.20.0'}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ common-ancestor-path@1.0.1:
+ resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
+ create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+
+ cross-fetch@4.0.0:
+ resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==}
+
+ cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+
+ css-select@5.1.0:
+ resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
+
+ css-selector-parser@3.0.5:
+ resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==}
+
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ css-tree@2.3.1:
+ resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-what@6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ cssstyle@4.1.0:
+ resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==}
+ engines: {node: '>=18'}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ csv-parse@5.5.6:
+ resolution: {integrity: sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A==}
+
+ data-urls@5.0.0:
+ resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
+ engines: {node: '>=18'}
+
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decimal.js@10.4.3:
+ resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
+
+ decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+
+ deep-eql@5.0.2:
+ resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+ engines: {node: '>=6'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ detect-libc@1.0.3:
+ resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
+ detect-libc@2.0.3:
+ resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
+ engines: {node: '>=8'}
+
+ deterministic-object-hash@2.0.2:
+ resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==}
+ engines: {node: '>=18'}
+
+ devalue@5.1.1:
+ resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+
+ diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+
+ diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+ engines: {node: '>=0.3.1'}
+
+ direction@2.0.1:
+ resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==}
+ hasBin: true
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.1.0:
+ resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+
+ dprint-node@1.0.8:
+ resolution: {integrity: sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==}
+
+ dset@3.1.4:
+ resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
+ engines: {node: '>=4'}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ electron-to-chromium@1.5.49:
+ resolution: {integrity: sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==}
+
+ emmet@2.4.11:
+ resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==}
+
+ emoji-regex@10.4.0:
+ resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ encoding-sniffer@0.2.0:
+ resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==}
+
+ end-of-stream@1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ es-module-lexer@1.5.4:
+ resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+
+ esast-util-from-estree@2.0.0:
+ resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
+
+ esast-util-from-js@2.0.1:
+ resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
+
+ esbuild@0.21.5:
+ resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ eslint-scope@8.1.0:
+ resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.1.0:
+ resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.13.0:
+ resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.2.0:
+ resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-util-attach-comments@3.0.0:
+ resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==}
+
+ estree-util-build-jsx@3.0.1:
+ resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==}
+
+ estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+
+ estree-util-scope@1.0.0:
+ resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==}
+
+ estree-util-to-js@2.0.0:
+ resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==}
+
+ estree-util-visit@2.0.0:
+ resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ execa@9.5.1:
+ resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==}
+ engines: {node: ^18.19.0 || >=20.5.0}
+
+ expect-type@1.1.0:
+ resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==}
+ engines: {node: '>=12.0.0'}
+
+ expressive-code@0.35.6:
+ resolution: {integrity: sha512-+mx+TPTbMqgo0mL92Xh9QgjW0kSQIsEivMgEcOnaqKqL7qCw8Vkqc5Rg/di7ZYw4aMUSr74VTc+w8GQWu05j1g==}
+
+ extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ extract-zip@2.0.1:
+ resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
+ engines: {node: '>= 10.17.0'}
+ hasBin: true
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-uri@3.0.3:
+ resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==}
+
+ fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+
+ fd-slicer@1.1.0:
+ resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+
+ figures@6.1.0:
+ resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
+ engines: {node: '>=18'}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ filename-reserved-regex@3.0.0:
+ resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-replace@3.0.0:
+ resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==}
+ engines: {node: '>=4.0.0'}
+
+ find-up-simple@1.0.0:
+ resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==}
+ engines: {node: '>=18'}
+
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ find-yarn-workspace-root2@1.2.16:
+ resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.3.1:
+ resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+
+ flattie@1.1.1:
+ resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
+ engines: {node: '>=8'}
+
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+ engines: {node: '>=14'}
+
+ form-data@4.0.1:
+ resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
+ engines: {node: '>= 6'}
+
+ fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+ fs-minipass@2.1.0:
+ resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
+ engines: {node: '>= 8'}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.3.0:
+ resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+ engines: {node: '>=18'}
+
+ get-stream@5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+
+ get-stream@9.0.1:
+ resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
+ engines: {node: '>=18'}
+
+ github-slugger@2.0.0:
+ resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@10.4.5:
+ resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+ hasBin: true
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@15.11.0:
+ resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==}
+ engines: {node: '>=18'}
+
+ globrex@0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ graphql@0.11.7:
+ resolution: {integrity: sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==}
+
+ gray-matter@4.0.3:
+ resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
+ engines: {node: '>=6.0'}
+
+ happy-dom@15.7.4:
+ resolution: {integrity: sha512-r1vadDYGMtsHAAsqhDuk4IpPvr6N8MGKy5ntBo7tSdim+pWDxus2PNqOcOt8LuDZ4t3KJHE+gCuzupcx/GKnyQ==}
+ engines: {node: '>=18.0.0'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hast-util-embedded@3.0.0:
+ resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==}
+
+ hast-util-format@1.1.0:
+ resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==}
+
+ hast-util-from-html@2.0.3:
+ resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
+
+ hast-util-from-parse5@8.0.1:
+ resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
+
+ hast-util-has-property@3.0.0:
+ resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==}
+
+ hast-util-is-body-ok-link@3.0.1:
+ resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==}
+
+ hast-util-is-element@3.0.0:
+ resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
+
+ hast-util-minify-whitespace@1.0.1:
+ resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==}
+
+ hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
+ hast-util-phrasing@3.0.1:
+ resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==}
+
+ hast-util-raw@9.0.4:
+ resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==}
+
+ hast-util-select@6.0.3:
+ resolution: {integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ==}
+
+ hast-util-to-estree@3.1.0:
+ resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==}
+
+ hast-util-to-html@9.0.3:
+ resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==}
+
+ hast-util-to-jsx-runtime@2.3.2:
+ resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==}
+
+ hast-util-to-parse5@8.0.0:
+ resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
+
+ hast-util-to-string@3.0.1:
+ resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==}
+
+ hast-util-to-text@4.0.2:
+ resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
+
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
+ hastscript@8.0.0:
+ resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
+
+ hastscript@9.0.0:
+ resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==}
+
+ html-encoding-sniffer@4.0.0:
+ resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
+ engines: {node: '>=18'}
+
+ html-entities@2.3.3:
+ resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==}
+
+ html-escaper@3.0.3:
+ resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
+
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
+ html-whitespace-sensitive-tag-names@3.0.1:
+ resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==}
+
+ htmlparser2@9.1.0:
+ resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
+
+ http-cache-semantics@4.1.1:
+ resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
+
+ http-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+ engines: {node: '>= 14'}
+
+ http-status@2.0.0:
+ resolution: {integrity: sha512-fmtDiMjseYigum9OwVYJD2RD6tRYV4tzRrT92/aLSOS2bNPvz3jx8aHFqJ4Nq4ZLydalwuyh2Q6VuHg7qbCbJQ==}
+ engines: {node: '>= 0.4.0'}
+
+ https-proxy-agent@7.0.5:
+ resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
+ engines: {node: '>= 14'}
+
+ human-signals@8.0.0:
+ resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==}
+ engines: {node: '>=18.18.0'}
+
+ i18next@23.16.4:
+ resolution: {integrity: sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ import-meta-resolve@4.1.0:
+ resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ inline-style-parser@0.1.1:
+ resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
+
+ inline-style-parser@0.2.4:
+ resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
+
+ is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
+
+ is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
+
+ is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-core-module@2.15.1:
+ resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
+ engines: {node: '>= 0.4'}
+
+ is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
+
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+
+ is-interactive@2.0.0:
+ resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+ engines: {node: '>=12'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+
+ is-stream@4.0.1:
+ resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
+ engines: {node: '>=18'}
+
+ is-unicode-supported@1.3.0:
+ resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
+ engines: {node: '>=12'}
+
+ is-unicode-supported@2.1.0:
+ resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
+ engines: {node: '>=18'}
+
+ is-url@1.2.4:
+ resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
+
+ is-what@4.1.16:
+ resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
+ engines: {node: '>=12.13'}
+
+ is-wsl@3.1.0:
+ resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
+ engines: {node: '>=16'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ iterall@1.1.3:
+ resolution: {integrity: sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ jiti@1.21.6:
+ resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
+ hasBin: true
+
+ jiti@2.3.3:
+ resolution: {integrity: sha512-EX4oNDwcXSivPrw2qKH2LB5PoFxEvgtv2JgwW0bU858HoLQ+kutSvjLMUqBd0PeJYEinLWhoI9Ol0eYMqj/wNQ==}
+ hasBin: true
+
+ js-base64@3.7.7:
+ resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsdom@25.0.1:
+ resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ canvas: ^2.11.2
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+
+ jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonc-parser@2.3.1:
+ resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==}
+
+ jsonc-parser@3.3.1:
+ resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+
+ jwt-decode@4.0.0:
+ resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==}
+ engines: {node: '>=18'}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+
+ lilconfig@3.1.2:
+ resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
+ engines: {node: '>=14'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ load-yaml-file@0.2.0:
+ resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==}
+ engines: {node: '>=6'}
+
+ local-pkg@0.5.0:
+ resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
+ engines: {node: '>=14'}
+
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+ lodash.castarray@4.4.0:
+ resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
+
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ log-symbols@6.0.0:
+ resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
+ engines: {node: '>=18'}
+
+ long@5.2.3:
+ resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
+
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ loupe@3.1.2:
+ resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ magic-string@0.30.12:
+ resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
+
+ magicast@0.3.5:
+ resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
+
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+ markdown-extensions@2.0.0:
+ resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
+ engines: {node: '>=16'}
+
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+ mdast-util-definitions@6.0.0:
+ resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==}
+
+ mdast-util-directive@3.0.0:
+ resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==}
+
+ mdast-util-find-and-replace@3.0.1:
+ resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
+
+ mdast-util-from-markdown@2.0.2:
+ resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+ mdast-util-gfm-footnote@2.0.0:
+ resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+ mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+ mdast-util-gfm@3.0.0:
+ resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
+
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+ mdast-util-mdx-jsx@3.1.3:
+ resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==}
+
+ mdast-util-mdx@3.0.0:
+ resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
+
+ mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-hast@13.2.0:
+ resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
+
+ mdast-util-to-markdown@2.1.0:
+ resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+ mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+
+ merge-anything@5.1.7:
+ resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==}
+ engines: {node: '>=12.13'}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromark-core-commonmark@2.0.1:
+ resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==}
+
+ micromark-extension-directive@3.0.2:
+ resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==}
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+ micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+ micromark-extension-gfm-table@2.1.0:
+ resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==}
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+ micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+ micromark-extension-mdx-expression@3.0.0:
+ resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==}
+
+ micromark-extension-mdx-jsx@3.0.1:
+ resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==}
+
+ micromark-extension-mdx-md@2.0.0:
+ resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
+
+ micromark-extension-mdxjs@3.0.0:
+ resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
+
+ micromark-factory-destination@2.0.0:
+ resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
+
+ micromark-factory-label@2.0.0:
+ resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
+
+ micromark-factory-mdx-expression@2.0.2:
+ resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==}
+
+ micromark-factory-space@2.0.0:
+ resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
+
+ micromark-factory-title@2.0.0:
+ resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
+
+ micromark-factory-whitespace@2.0.0:
+ resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
+
+ micromark-util-character@2.1.0:
+ resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==}
+
+ micromark-util-chunked@2.0.0:
+ resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
+
+ micromark-util-classify-character@2.0.0:
+ resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
+
+ micromark-util-combine-extensions@2.0.0:
+ resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
+
+ micromark-util-decode-numeric-character-reference@2.0.1:
+ resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==}
+
+ micromark-util-decode-string@2.0.0:
+ resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
+
+ micromark-util-encode@2.0.0:
+ resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+
+ micromark-util-events-to-acorn@2.0.2:
+ resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==}
+
+ micromark-util-html-tag-name@2.0.0:
+ resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
+
+ micromark-util-normalize-identifier@2.0.0:
+ resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
+
+ micromark-util-resolve-all@2.0.0:
+ resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
+
+ micromark-util-sanitize-uri@2.0.0:
+ resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
+
+ micromark-util-subtokenize@2.0.1:
+ resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==}
+
+ micromark-util-symbol@2.0.0:
+ resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
+
+ micromark-util-types@2.0.0:
+ resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
+
+ micromark@4.0.0:
+ resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minipass@3.3.6:
+ resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
+ engines: {node: '>=8'}
+
+ minipass@4.2.8:
+ resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==}
+ engines: {node: '>=8'}
+
+ minipass@5.0.0:
+ resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
+ engines: {node: '>=8'}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minizlib@2.1.2:
+ resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
+ engines: {node: '>= 8'}
+
+ mkdirp@1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ mlly@1.7.2:
+ resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==}
+
+ moment@2.30.1:
+ resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
+
+ mrmime@2.0.0:
+ resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
+ engines: {node: '>=10'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+ nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ nanostores@0.11.3:
+ resolution: {integrity: sha512-TUes3xKIX33re4QzdxwZ6tdbodjmn3tWXCEc1uokiEmo14sI1EaGYNs2k3bU2pyyGNmBqFGAVl6jAGWd06AVIg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ neotraverse@0.6.18:
+ resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==}
+ engines: {node: '>= 10'}
+
+ nlcst-to-string@4.0.0:
+ resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ node-releases@2.0.18:
+ resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-run-path@6.0.0:
+ resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
+ engines: {node: '>=18'}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ nwsapi@2.2.13:
+ resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@7.0.0:
+ resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+ engines: {node: '>=18'}
+
+ oniguruma-to-js@0.4.3:
+ resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ ora@8.1.0:
+ resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==}
+ engines: {node: '>=18'}
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-limit@6.1.0:
+ resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==}
+ engines: {node: '>=18'}
+
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-queue@8.0.1:
+ resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==}
+ engines: {node: '>=18'}
+
+ p-timeout@6.1.3:
+ resolution: {integrity: sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==}
+ engines: {node: '>=14.16'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ package-manager-detector@0.2.2:
+ resolution: {integrity: sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==}
+
+ pagefind@1.1.1:
+ resolution: {integrity: sha512-U2YR0dQN5B2fbIXrLtt/UXNS0yWSSYfePaad1KcBPTi0p+zRtsVjwmoPaMQgTks5DnHNbmDxyJUL5TGaLljK3A==}
+ hasBin: true
+
+ pako@0.2.9:
+ resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
+
+ pako@1.0.11:
+ resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-entities@4.0.1:
+ resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
+
+ parse-latin@7.0.0:
+ resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
+
+ parse-ms@4.0.0:
+ resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
+ engines: {node: '>=18'}
+
+ parse5-htmlparser2-tree-adapter@7.1.0:
+ resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==}
+
+ parse5-parser-stream@7.1.2:
+ resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==}
+
+ parse5@7.2.1:
+ resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
+
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+ path-equal@1.2.5:
+ resolution: {integrity: sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+ pathval@2.0.0:
+ resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+ engines: {node: '>= 14.16'}
+
+ pend@1.2.0:
+ resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.2:
+ resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ engines: {node: '>=12'}
+
+ pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+
+ pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+
+ pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
+
+ pkg-dir@4.2.0:
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+ engines: {node: '>=8'}
+
+ pkg-types@1.2.1:
+ resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
+
+ pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+
+ postcss-import@15.1.0:
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+
+ postcss-js@4.0.1:
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.4.21
+
+ postcss-load-config@4.0.2:
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+
+ postcss-nested@6.2.0:
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+
+ postcss-selector-parser@6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.4.47:
+ resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ preferred-pm@4.0.0:
+ resolution: {integrity: sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==}
+ engines: {node: '>=18.12'}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-plugin-astro@0.14.1:
+ resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==}
+ engines: {node: ^14.15.0 || >=16.0.0}
+
+ prettier@2.8.7:
+ resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ prettier@3.3.3:
+ resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ pretty-ms@9.1.0:
+ resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==}
+ engines: {node: '>=18'}
+
+ prismjs@1.29.0:
+ resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
+ engines: {node: '>=6'}
+
+ process@0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+
+ property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
+ protobufjs@7.4.0:
+ resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==}
+ engines: {node: '>=12.0.0'}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ pump@3.0.2:
+ resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ quicktype-core@23.0.170:
+ resolution: {integrity: sha512-ZsjveG0yJUIijUx4yQshzyQ5EAXKbFSBTQJHnJ+KoSZVxcS+m3GcmDpzrdUIRYMhgLaF11ZGvLSYi5U0xcwemw==}
+
+ quicktype-graphql-input@23.0.170:
+ resolution: {integrity: sha512-L0xPKdIFZFChwups9oqJuQw/vwEbRVKBvU9L5jAs0Z/aLyfdsuxDpKGMJXnNWa2yE7NhPX/UDX8ytxn8uc8hdQ==}
+
+ quicktype-typescript-input@23.0.170:
+ resolution: {integrity: sha512-lckhc//Mc95f/puRFKv4BFs7VpUUJXhw/psh+5ZAMiErxOWgoF87XthGusmaqoXNzjmEy1AVwGgMCG2pp/tJ/w==}
+
+ quicktype@23.0.170:
+ resolution: {integrity: sha512-3gFyS7w36ktxrttEv1gMfuUlGairepnSpLN0cp7JVevkKX2N6Uk8AyMlDS2Puki09MY6PB6ch90plThvACtEHA==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+
+ read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readable-stream@4.5.2:
+ resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ readdirp@4.0.2:
+ resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==}
+ engines: {node: '>= 14.16.0'}
+
+ recma-build-jsx@1.0.0:
+ resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
+
+ recma-jsx@1.0.0:
+ resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==}
+
+ recma-parse@1.0.0:
+ resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
+
+ recma-stringify@1.0.0:
+ resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ regex@4.3.3:
+ resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==}
+
+ rehype-expressive-code@0.35.6:
+ resolution: {integrity: sha512-pPdE+pRcRw01kxMOwHQjuRxgwlblZt5+wAc3w2aPGgmcnn57wYjn07iKO7zaznDxYVxMYVvYlnL+R3vWFQS4Gw==}
+
+ rehype-format@5.0.1:
+ resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==}
+
+ rehype-parse@9.0.1:
+ resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
+
+ rehype-raw@7.0.0:
+ resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
+
+ rehype-recma@1.0.0:
+ resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
+
+ rehype-stringify@10.0.1:
+ resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
+
+ rehype@13.0.2:
+ resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==}
+
+ remark-directive@3.0.0:
+ resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==}
+
+ remark-gfm@4.0.0:
+ resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==}
+
+ remark-mdx@3.1.0:
+ resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==}
+
+ remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+ remark-rehype@11.1.1:
+ resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==}
+
+ remark-smartypants@3.0.2:
+ resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==}
+ engines: {node: '>=16.0.0'}
+
+ remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+ request-light@0.5.8:
+ resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==}
+
+ request-light@0.7.0:
+ resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
+
+ restore-cursor@5.1.0:
+ resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+ engines: {node: '>=18'}
+
+ retext-latin@4.0.0:
+ resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==}
+
+ retext-smartypants@6.2.0:
+ resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==}
+
+ retext-stringify@4.0.0:
+ resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==}
+
+ retext@9.0.0:
+ resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==}
+
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rollup@4.24.2:
+ resolution: {integrity: sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ rrweb-cssom@0.7.1:
+ resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ s.color@0.0.15:
+ resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ sass-formatter@0.7.9:
+ resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==}
+
+ sax@1.4.1:
+ resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+
+ saxes@6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
+
+ section-matter@1.0.0:
+ resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
+ engines: {node: '>=4'}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ seroval-plugins@1.1.1:
+ resolution: {integrity: sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ seroval: ^1.0
+
+ seroval@1.1.1:
+ resolution: {integrity: sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==}
+ engines: {node: '>=10'}
+
+ sharp@0.33.5:
+ resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ shiki@1.22.2:
+ resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==}
+
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ sitemap@8.0.0:
+ resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==}
+ engines: {node: '>=14.0.0', npm: '>=6.0.0'}
+ hasBin: true
+
+ solid-devtools@0.30.1:
+ resolution: {integrity: sha512-axpXL4JV1dnGhuei+nSGS8ewGeNkmIgFDsAlO90YyYY5t8wU1R0aYAQtL+I+5KICLKPBvfkzdcFa2br7AV4lAw==}
+ peerDependencies:
+ solid-js: ^1.8.0
+ solid-start: ^0.3.0
+ vite: ^2.2.3 || ^3.0.0 || ^4.0.0 || ^5.0.0
+ peerDependenciesMeta:
+ solid-start:
+ optional: true
+ vite:
+ optional: true
+
+ solid-icons@1.1.0:
+ resolution: {integrity: sha512-IesTfr/F1ElVwH2E1110s2RPXH4pujKfSs+koT8rwuTAdleO5s26lNSpqJV7D1+QHooJj18mcOiz2PIKs0ic+A==}
+ peerDependencies:
+ solid-js: '*'
+
+ solid-js@1.9.3:
+ resolution: {integrity: sha512-5ba3taPoZGt9GY3YlsCB24kCg0Lv/rie/HTD4kG6h4daZZz7+yK02xn8Vx8dLYBc9i6Ps5JwAbEiqjmKaLB3Ag==}
+
+ solid-presence@0.1.8:
+ resolution: {integrity: sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA==}
+ peerDependencies:
+ solid-js: ^1.8
+
+ solid-prevent-scroll@0.1.10:
+ resolution: {integrity: sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw==}
+ peerDependencies:
+ solid-js: ^1.8
+
+ solid-refresh@0.6.3:
+ resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==}
+ peerDependencies:
+ solid-js: ^1.3
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+ std-env@3.7.0:
+ resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
+
+ stdin-discarder@0.2.2:
+ resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
+ engines: {node: '>=18'}
+
+ stream-chain@2.2.5:
+ resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==}
+
+ stream-json@1.8.0:
+ resolution: {integrity: sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==}
+
+ stream-replace-string@2.0.0:
+ resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==}
+
+ string-to-stream@3.0.1:
+ resolution: {integrity: sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-bom-string@1.0.0:
+ resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
+ engines: {node: '>=0.10.0'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-final-newline@4.0.0:
+ resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
+ engines: {node: '>=18'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ style-mod@4.1.2:
+ resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==}
+
+ style-to-object@0.4.4:
+ resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
+
+ style-to-object@1.0.8:
+ resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==}
+
+ sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ suf-log@2.5.3:
+ resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ svgo@3.3.2:
+ resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ symbol-tree@3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+
+ table-layout@4.1.1:
+ resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==}
+ engines: {node: '>=12.17'}
+
+ tailwind-merge@2.5.4:
+ resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==}
+
+ tailwindcss-animate@1.0.7:
+ resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
+
+ tailwindcss@3.4.14:
+ resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ tar@6.2.1:
+ resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
+ engines: {node: '>=10'}
+
+ text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+ tiny-inflate@1.0.3:
+ resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
+
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+ tinybench@3.0.0:
+ resolution: {integrity: sha512-931sGm66Zjp7c4o/DePaq8AKlCdq/ZldpS1b8O7r3SxSuxJpqoqeUprTOsW2CBhrw54U3mTmcS97LsBqPXEQLw==}
+ engines: {node: '>=18.0.0'}
+
+ tinyexec@0.3.1:
+ resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==}
+
+ tinypool@1.0.1:
+ resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+
+ tinyrainbow@1.2.0:
+ resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
+ engines: {node: '>=14.0.0'}
+
+ tinyspy@3.0.2:
+ resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+ engines: {node: '>=14.0.0'}
+
+ tldts-core@6.1.57:
+ resolution: {integrity: sha512-lXnRhuQpx3zU9EONF9F7HfcRLvN1uRYUBIiKL+C/gehC/77XTU+Jye6ui86GA3rU6FjlJ0triD1Tkjt2F/2lEg==}
+
+ tldts@6.1.57:
+ resolution: {integrity: sha512-Oy7yDXK8meJl8vPMOldzA+MtueAJ5BrH4l4HXwZuj2AtfoQbLjmTJmjNWPUcAo+E/ibHn7QlqMS0BOcXJFJyHQ==}
+ hasBin: true
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ tough-cookie@5.0.0:
+ resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==}
+ engines: {node: '>=16'}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ tr46@5.0.0:
+ resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
+ engines: {node: '>=18'}
+
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ ts-api-utils@1.3.0:
+ resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ typescript: '>=4.2.0'
+
+ ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+ ts-node@10.9.2:
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+
+ ts-poet@6.9.0:
+ resolution: {integrity: sha512-roe6W6MeZmCjRmppyfOURklO5tQFQ6Sg7swURKkwYJvV7dbGCrK28um5+51iW3twdPRKtwarqFAVMU6G1mvnuQ==}
+
+ ts-proto-descriptors@2.0.0:
+ resolution: {integrity: sha512-wHcTH3xIv11jxgkX5OyCSFfw27agpInAd6yh89hKG6zqIXnjW9SYqSER2CVQxdPj4czeOhGagNvZBEbJPy7qkw==}
+
+ ts-proto@2.2.5:
+ resolution: {integrity: sha512-P7arWANOAO2Jpzhey8x55H8mnK4XHzwepQph13eNf9nu93+lAB/JUIxKaIu18YnUQBpm3ZgHL0pTVPWa6dVqrQ==}
+ hasBin: true
+
+ tsconfck@3.1.4:
+ resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ tslib@2.8.0:
+ resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@4.26.1:
+ resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==}
+ engines: {node: '>=16'}
+
+ typesafe-path@0.2.2:
+ resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==}
+
+ typescript-auto-import-cache@0.3.5:
+ resolution: {integrity: sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==}
+
+ typescript-eslint@8.12.1:
+ resolution: {integrity: sha512-SsKedZnq4TStkrpqnk+OqTnmkC9CkYBRNKjQ965CLpFruGcRkPF5UhKxbcbF6c/m2r6YAgKw/UtQxdlMjh3mug==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ typescript@4.9.4:
+ resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+
+ typescript@4.9.5:
+ resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+
+ typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typical@4.0.0:
+ resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==}
+ engines: {node: '>=8'}
+
+ typical@7.2.0:
+ resolution: {integrity: sha512-W1+HdVRUl8fS3MZ9ogD51GOb46xMmhAZzR0WPw5jcgIZQJVvkddYzAl4YTU6g5w33Y1iRQLdIi2/1jhi2RNL0g==}
+ engines: {node: '>=12.17'}
+
+ ufo@1.5.4:
+ resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+ undici@6.20.1:
+ resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==}
+ engines: {node: '>=18.17'}
+
+ unicode-properties@1.4.1:
+ resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==}
+
+ unicode-trie@2.0.0:
+ resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==}
+
+ unicorn-magic@0.3.0:
+ resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+ engines: {node: '>=18'}
+
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unist-util-find-after@5.0.0:
+ resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
+
+ unist-util-is@6.0.0:
+ resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+
+ unist-util-modify-children@4.0.0:
+ resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==}
+
+ unist-util-position-from-estree@2.0.0:
+ resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-remove-position@5.0.0:
+ resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-children@3.0.0:
+ resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==}
+
+ unist-util-visit-parents@6.0.1:
+ resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
+ unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
+ update-browserslist-db@1.1.1:
+ resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ urijs@1.19.11:
+ resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ uuid@11.0.2:
+ resolution: {integrity: sha512-14FfcOJmqdjbBPdDjFQyk/SdT4NySW4eM0zcG+HqbHP5jzuH56xO3J1DGhgs/cEMCfwYi3HQI1gnTO62iaG+tQ==}
+ hasBin: true
+
+ v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
+ valid-filename@4.0.0:
+ resolution: {integrity: sha512-VEYTpTVPMgO799f2wI7zWf0x2C54bPX6NAfbZ2Z8kZn76p+3rEYCTYVYzMUcVSMvakxMQTriBf24s3+WeXJtEg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ validate-html-nesting@1.2.2:
+ resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==}
+
+ vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
+ vfile-message@4.0.2:
+ resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+ vite-node@2.1.4:
+ resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+
+ vite-plugin-solid@2.10.2:
+ resolution: {integrity: sha512-AOEtwMe2baBSXMXdo+BUwECC8IFHcKS6WQV/1NEd+Q7vHPap5fmIhLcAzr+DUJ04/KHx/1UBU0l1/GWP+rMAPQ==}
+ peerDependencies:
+ '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.*
+ solid-js: ^1.7.2
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0
+ peerDependenciesMeta:
+ '@testing-library/jest-dom':
+ optional: true
+
+ vite-tsconfig-paths@5.0.1:
+ resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==}
+ peerDependencies:
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vite@5.4.10:
+ resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ vitefu@0.2.5:
+ resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vitefu@1.0.3:
+ resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vitest@2.1.4:
+ resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/node': ^18.0.0 || >=20.0.0
+ '@vitest/browser': 2.1.4
+ '@vitest/ui': 2.1.4
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
+ volar-service-css@0.0.62:
+ resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-emmet@0.0.62:
+ resolution: {integrity: sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-html@0.0.62:
+ resolution: {integrity: sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-prettier@0.0.62:
+ resolution: {integrity: sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ prettier: ^2.2 || ^3.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+ prettier:
+ optional: true
+
+ volar-service-typescript-twoslash-queries@0.0.62:
+ resolution: {integrity: sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-typescript@0.0.62:
+ resolution: {integrity: sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ volar-service-yaml@0.0.62:
+ resolution: {integrity: sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
+ optional: true
+
+ vscode-css-languageservice@6.3.1:
+ resolution: {integrity: sha512-1BzTBuJfwMc3A0uX4JBdJgoxp74cjj4q2mDJdp49yD/GuAq4X0k5WtK6fNcMYr+FfJ9nqgR6lpfCSZDkARJ5qQ==}
+
+ vscode-html-languageservice@5.3.1:
+ resolution: {integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==}
+
+ vscode-json-languageservice@4.1.8:
+ resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==}
+ engines: {npm: '>=7.0.0'}
+
+ vscode-jsonrpc@6.0.0:
+ resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==}
+ engines: {node: '>=8.0.0 || >=10.0.0'}
+
+ vscode-jsonrpc@8.2.0:
+ resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
+ engines: {node: '>=14.0.0'}
+
+ vscode-languageserver-protocol@3.16.0:
+ resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==}
+
+ vscode-languageserver-protocol@3.17.5:
+ resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
+
+ vscode-languageserver-textdocument@1.0.12:
+ resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==}
+
+ vscode-languageserver-types@3.16.0:
+ resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==}
+
+ vscode-languageserver-types@3.17.5:
+ resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
+
+ vscode-languageserver@7.0.0:
+ resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==}
+ hasBin: true
+
+ vscode-languageserver@9.0.1:
+ resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
+ hasBin: true
+
+ vscode-nls@5.2.0:
+ resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==}
+
+ vscode-uri@2.1.2:
+ resolution: {integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==}
+
+ vscode-uri@3.0.8:
+ resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
+
+ w3c-keyname@2.2.8:
+ resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
+
+ w3c-xmlserializer@5.0.0:
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+ engines: {node: '>=18'}
+
+ web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ webidl-conversions@7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+
+ whatwg-encoding@3.1.1:
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+ engines: {node: '>=18'}
+
+ whatwg-mimetype@3.0.0:
+ resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+ engines: {node: '>=12'}
+
+ whatwg-mimetype@4.0.0:
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+ engines: {node: '>=18'}
+
+ whatwg-url@14.0.0:
+ resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
+ engines: {node: '>=18'}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ which-pm-runs@1.1.0:
+ resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==}
+ engines: {node: '>=4'}
+
+ which-pm@3.0.0:
+ resolution: {integrity: sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==}
+ engines: {node: '>=18.12'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ widest-line@5.0.0:
+ resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
+ engines: {node: '>=18'}
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wordwrap@1.0.0:
+ resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
+
+ wordwrapjs@5.1.0:
+ resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==}
+ engines: {node: '>=12.17'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ wrap-ansi@9.0.0:
+ resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ ws@8.18.0:
+ resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ xml-name-validator@5.0.0:
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ engines: {node: '>=18'}
+
+ xmlchars@2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+
+ xxhash-wasm@1.0.2:
+ resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml-language-server@1.15.0:
+ resolution: {integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==}
+ hasBin: true
+
+ yaml@2.2.2:
+ resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==}
+ engines: {node: '>= 14'}
+
+ yaml@2.6.0:
+ resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==}
+ engines: {node: '>= 14'}
+ hasBin: true
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yauzl@2.10.0:
+ resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+
+ yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ yocto-queue@1.1.1:
+ resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
+ engines: {node: '>=12.20'}
+
+ yoctocolors@2.1.1:
+ resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==}
+ engines: {node: '>=18'}
+
+ zod-to-json-schema@3.23.5:
+ resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==}
+ peerDependencies:
+ zod: ^3.23.3
+
+ zod-to-ts@1.2.0:
+ resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==}
+ peerDependencies:
+ typescript: ^4.9.4 || ^5.0.2
+ zod: ^3
+
+ zod@3.23.8:
+ resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@alloc/quick-lru@5.2.0': {}
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@antfu/install-pkg@0.4.1':
+ dependencies:
+ package-manager-detector: 0.2.2
+ tinyexec: 0.3.1
+
+ '@antfu/utils@0.7.10': {}
+
+ '@astrojs/check@0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.6.3)':
+ dependencies:
+ '@astrojs/language-server': 2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.6.3)
+ chokidar: 4.0.1
+ kleur: 4.1.5
+ typescript: 5.6.3
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - prettier
+ - prettier-plugin-astro
+
+ '@astrojs/compiler@2.10.3': {}
+
+ '@astrojs/internal-helpers@0.4.1': {}
+
+ '@astrojs/language-server@2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.6.3)':
+ dependencies:
+ '@astrojs/compiler': 2.10.3
+ '@astrojs/yaml2ts': 0.2.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@volar/kit': 2.4.8(typescript@5.6.3)
+ '@volar/language-core': 2.4.8
+ '@volar/language-server': 2.4.8
+ '@volar/language-service': 2.4.8
+ fast-glob: 3.3.2
+ muggle-string: 0.4.1
+ volar-service-css: 0.0.62(@volar/language-service@2.4.8)
+ volar-service-emmet: 0.0.62(@volar/language-service@2.4.8)
+ volar-service-html: 0.0.62(@volar/language-service@2.4.8)
+ volar-service-prettier: 0.0.62(@volar/language-service@2.4.8)(prettier@3.3.3)
+ volar-service-typescript: 0.0.62(@volar/language-service@2.4.8)
+ volar-service-typescript-twoslash-queries: 0.0.62(@volar/language-service@2.4.8)
+ volar-service-yaml: 0.0.62(@volar/language-service@2.4.8)
+ vscode-html-languageservice: 5.3.1
+ vscode-uri: 3.0.8
+ optionalDependencies:
+ prettier: 3.3.3
+ prettier-plugin-astro: 0.14.1
+ transitivePeerDependencies:
+ - typescript
+
+ '@astrojs/markdown-remark@5.3.0':
+ dependencies:
+ '@astrojs/prism': 3.1.0
+ github-slugger: 2.0.0
+ hast-util-from-html: 2.0.3
+ hast-util-to-text: 4.0.2
+ import-meta-resolve: 4.1.0
+ mdast-util-definitions: 6.0.0
+ rehype-raw: 7.0.0
+ rehype-stringify: 10.0.1
+ remark-gfm: 4.0.0
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.1
+ remark-smartypants: 3.0.2
+ shiki: 1.22.2
+ unified: 11.0.5
+ unist-util-remove-position: 5.0.0
+ unist-util-visit: 5.0.0
+ unist-util-visit-parents: 6.0.1
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/mdx@3.1.8(astro@4.16.7(@types/node@16.18.115)(rollup@4.24.2)(typescript@4.9.4))':
+ dependencies:
+ '@astrojs/markdown-remark': 5.3.0
+ '@mdx-js/mdx': 3.1.0(acorn@8.14.0)
+ acorn: 8.14.0
+ astro: 4.16.7(@types/node@16.18.115)(rollup@4.24.2)(typescript@4.9.4)
+ es-module-lexer: 1.5.4
+ estree-util-visit: 2.0.0
+ gray-matter: 4.0.3
+ hast-util-to-html: 9.0.3
+ kleur: 4.1.5
+ rehype-raw: 7.0.0
+ remark-gfm: 4.0.0
+ remark-smartypants: 3.0.2
+ source-map: 0.7.4
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/mdx@3.1.8(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))':
+ dependencies:
+ '@astrojs/markdown-remark': 5.3.0
+ '@mdx-js/mdx': 3.1.0(acorn@8.14.0)
+ acorn: 8.14.0
+ astro: 4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3)
+ es-module-lexer: 1.5.4
+ estree-util-visit: 2.0.0
+ gray-matter: 4.0.3
+ hast-util-to-html: 9.0.3
+ kleur: 4.1.5
+ rehype-raw: 7.0.0
+ remark-gfm: 4.0.0
+ remark-smartypants: 3.0.2
+ source-map: 0.7.4
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/prism@3.1.0':
+ dependencies:
+ prismjs: 1.29.0
+
+ '@astrojs/sitemap@3.2.1':
+ dependencies:
+ sitemap: 8.0.0
+ stream-replace-string: 2.0.0
+ zod: 3.23.8
+
+ '@astrojs/solid-js@4.4.2(solid-devtools@0.30.1(solid-js@1.9.3)(vite@5.4.10(@types/node@16.18.115)))(solid-js@1.9.3)(vite@5.4.10(@types/node@16.18.115))':
+ dependencies:
+ solid-js: 1.9.3
+ vite-plugin-solid: 2.10.2(solid-js@1.9.3)(vite@5.4.10(@types/node@16.18.115))
+ optionalDependencies:
+ solid-devtools: 0.30.1(solid-js@1.9.3)(vite@5.4.10(@types/node@16.18.115))
+ transitivePeerDependencies:
+ - '@testing-library/jest-dom'
+ - supports-color
+ - vite
+
+ '@astrojs/solid-js@4.4.2(solid-devtools@0.30.1(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2)))(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2))':
+ dependencies:
+ solid-js: 1.9.3
+ vite-plugin-solid: 2.10.2(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2))
+ optionalDependencies:
+ solid-devtools: 0.30.1(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2))
+ transitivePeerDependencies:
+ - '@testing-library/jest-dom'
+ - supports-color
+ - vite
+
+ '@astrojs/starlight-tailwind@2.0.3(@astrojs/starlight@0.28.4(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3)))(@astrojs/tailwind@5.1.2(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))':
+ dependencies:
+ '@astrojs/starlight': 0.28.4(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))
+ '@astrojs/tailwind': 5.1.2(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+ tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+
+ '@astrojs/starlight@0.28.4(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))':
+ dependencies:
+ '@astrojs/mdx': 3.1.8(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))
+ '@astrojs/sitemap': 3.2.1
+ '@pagefind/default-ui': 1.1.1
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ astro: 4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3)
+ astro-expressive-code: 0.35.6(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))
+ bcp-47: 2.1.0
+ hast-util-from-html: 2.0.3
+ hast-util-select: 6.0.3
+ hast-util-to-string: 3.0.1
+ hastscript: 9.0.0
+ i18next: 23.16.4
+ mdast-util-directive: 3.0.0
+ mdast-util-to-markdown: 2.1.0
+ mdast-util-to-string: 4.0.0
+ pagefind: 1.1.1
+ rehype: 13.0.2
+ rehype-format: 5.0.1
+ remark-directive: 3.0.0
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/tailwind@5.1.2(astro@4.16.7(@types/node@16.18.115)(rollup@4.24.2)(typescript@4.9.4))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4)))(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4))':
+ dependencies:
+ astro: 4.16.7(@types/node@16.18.115)(rollup@4.24.2)(typescript@4.9.4)
+ autoprefixer: 10.4.20(postcss@8.4.47)
+ postcss: 8.4.47
+ postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4))
+ tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4))
+ transitivePeerDependencies:
+ - ts-node
+
+ '@astrojs/tailwind@5.1.2(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3))(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))':
+ dependencies:
+ astro: 4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3)
+ autoprefixer: 10.4.20(postcss@8.4.47)
+ postcss: 8.4.47
+ postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+ tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+ transitivePeerDependencies:
+ - ts-node
+
+ '@astrojs/telemetry@3.1.0':
+ dependencies:
+ ci-info: 4.0.0
+ debug: 4.3.7
+ dlv: 1.1.3
+ dset: 3.1.4
+ is-docker: 3.0.0
+ is-wsl: 3.1.0
+ which-pm-runs: 1.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/yaml2ts@0.2.2':
+ dependencies:
+ yaml: 2.6.0
+
+ '@babel/code-frame@7.26.0':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.26.0': {}
+
+ '@babel/core@7.26.0':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.26.0
+ '@babel/generator': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helpers': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ convert-source-map: 2.0.0
+ debug: 4.3.7
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.26.0':
+ dependencies:
+ '@babel/parser': 7.26.1
+ '@babel/types': 7.26.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 3.0.2
+
+ '@babel/helper-annotate-as-pure@7.25.9':
+ dependencies:
+ '@babel/types': 7.26.0
+
+ '@babel/helper-compilation-targets@7.25.9':
+ dependencies:
+ '@babel/compat-data': 7.26.0
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.2
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-module-imports@7.18.6':
+ dependencies:
+ '@babel/types': 7.26.0
+
+ '@babel/helper-module-imports@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.25.9': {}
+
+ '@babel/helper-string-parser@7.25.9': {}
+
+ '@babel/helper-validator-identifier@7.25.9': {}
+
+ '@babel/helper-validator-option@7.25.9': {}
+
+ '@babel/helpers@7.26.0':
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+
+ '@babel/parser@7.26.1':
+ dependencies:
+ '@babel/types': 7.26.0
+
+ '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ optional: true
+
+ '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/runtime@7.26.0':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/template@7.25.9':
+ dependencies:
+ '@babel/code-frame': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/types': 7.26.0
+
+ '@babel/traverse@7.25.9':
+ dependencies:
+ '@babel/code-frame': 7.26.0
+ '@babel/generator': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+ debug: 4.3.7
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.26.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+
+ '@bufbuild/protobuf@2.2.1': {}
+
+ '@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.3)':
+ dependencies:
+ '@codemirror/language': 6.10.3
+ '@codemirror/state': 6.4.1
+ '@codemirror/view': 6.34.1
+ '@lezer/common': 1.2.3
+
+ '@codemirror/commands@6.7.1':
+ dependencies:
+ '@codemirror/language': 6.10.3
+ '@codemirror/state': 6.4.1
+ '@codemirror/view': 6.34.1
+ '@lezer/common': 1.2.3
+
+ '@codemirror/lang-sql@6.8.0(@codemirror/view@6.34.1)':
+ dependencies:
+ '@codemirror/autocomplete': 6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.3)
+ '@codemirror/language': 6.10.3
+ '@codemirror/state': 6.4.1
+ '@lezer/common': 1.2.3
+ '@lezer/highlight': 1.2.1
+ '@lezer/lr': 1.4.2
+ transitivePeerDependencies:
+ - '@codemirror/view'
+
+ '@codemirror/language@6.10.3':
+ dependencies:
+ '@codemirror/state': 6.4.1
+ '@codemirror/view': 6.34.1
+ '@lezer/common': 1.2.3
+ '@lezer/highlight': 1.2.1
+ '@lezer/lr': 1.4.2
+ style-mod: 4.1.2
+
+ '@codemirror/state@6.4.1': {}
+
+ '@codemirror/view@6.34.1':
+ dependencies:
+ '@codemirror/state': 6.4.1
+ style-mod: 4.1.2
+ w3c-keyname: 2.2.8
+
+ '@corvu/resizable@0.2.3(solid-js@1.9.3)':
+ dependencies:
+ '@corvu/utils': 0.4.2(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@corvu/utils@0.4.2(solid-js@1.9.3)':
+ dependencies:
+ '@floating-ui/dom': 1.6.11
+ solid-js: 1.9.3
+
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
+ '@ctrl/tinycolor@4.1.0': {}
+
+ '@emmetio/abbreviation@2.3.3':
+ dependencies:
+ '@emmetio/scanner': 1.0.4
+
+ '@emmetio/css-abbreviation@2.1.8':
+ dependencies:
+ '@emmetio/scanner': 1.0.4
+
+ '@emmetio/css-parser@0.4.0':
+ dependencies:
+ '@emmetio/stream-reader': 2.2.0
+ '@emmetio/stream-reader-utils': 0.1.0
+
+ '@emmetio/html-matcher@1.3.0':
+ dependencies:
+ '@emmetio/scanner': 1.0.4
+
+ '@emmetio/scanner@1.0.4': {}
+
+ '@emmetio/stream-reader-utils@0.1.0': {}
+
+ '@emmetio/stream-reader@2.2.0': {}
+
+ '@emnapi/runtime@1.3.1':
+ dependencies:
+ tslib: 2.8.0
+ optional: true
+
+ '@esbuild/aix-ppc64@0.21.5':
+ optional: true
+
+ '@esbuild/android-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/android-arm@0.21.5':
+ optional: true
+
+ '@esbuild/android-x64@0.21.5':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/darwin-x64@0.21.5':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-arm@0.21.5':
+ optional: true
+
+ '@esbuild/linux-ia32@0.21.5':
+ optional: true
+
+ '@esbuild/linux-loong64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.21.5':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-s390x@0.21.5':
+ optional: true
+
+ '@esbuild/linux-x64@0.21.5':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/sunos-x64@0.21.5':
+ optional: true
+
+ '@esbuild/win32-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/win32-ia32@0.21.5':
+ optional: true
+
+ '@esbuild/win32-x64@0.21.5':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.4.1(eslint@9.13.0(jiti@2.3.3))':
+ dependencies:
+ eslint: 9.13.0(jiti@2.3.3)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/config-array@0.18.0':
+ dependencies:
+ '@eslint/object-schema': 2.1.4
+ debug: 4.3.7
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/core@0.7.0': {}
+
+ '@eslint/eslintrc@3.1.0':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.7
+ espree: 10.2.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.13.0': {}
+
+ '@eslint/object-schema@2.1.4': {}
+
+ '@eslint/plugin-kit@0.2.2':
+ dependencies:
+ levn: 0.4.1
+
+ '@expressive-code/core@0.35.6':
+ dependencies:
+ '@ctrl/tinycolor': 4.1.0
+ hast-util-select: 6.0.3
+ hast-util-to-html: 9.0.3
+ hast-util-to-text: 4.0.2
+ hastscript: 9.0.0
+ postcss: 8.4.47
+ postcss-nested: 6.2.0(postcss@8.4.47)
+ unist-util-visit: 5.0.0
+ unist-util-visit-parents: 6.0.1
+
+ '@expressive-code/plugin-frames@0.35.6':
+ dependencies:
+ '@expressive-code/core': 0.35.6
+
+ '@expressive-code/plugin-shiki@0.35.6':
+ dependencies:
+ '@expressive-code/core': 0.35.6
+ shiki: 1.22.2
+
+ '@expressive-code/plugin-text-markers@0.35.6':
+ dependencies:
+ '@expressive-code/core': 0.35.6
+
+ '@floating-ui/core@1.6.8':
+ dependencies:
+ '@floating-ui/utils': 0.2.8
+
+ '@floating-ui/dom@1.6.11':
+ dependencies:
+ '@floating-ui/core': 1.6.8
+ '@floating-ui/utils': 0.2.8
+
+ '@floating-ui/utils@0.2.8': {}
+
+ '@glideapps/ts-necessities@2.2.3': {}
+
+ '@glideapps/ts-necessities@2.3.2': {}
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.6':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.3.1
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.3.1': {}
+
+ '@iconify-json/tabler@1.2.6':
+ dependencies:
+ '@iconify/types': 2.0.0
+
+ '@iconify/tools@4.0.7':
+ dependencies:
+ '@iconify/types': 2.0.0
+ '@iconify/utils': 2.1.33
+ '@types/tar': 6.1.13
+ axios: 1.7.7
+ cheerio: 1.0.0
+ domhandler: 5.0.3
+ extract-zip: 2.0.1
+ local-pkg: 0.5.0
+ pathe: 1.1.2
+ svgo: 3.3.2
+ tar: 6.2.1
+ transitivePeerDependencies:
+ - debug
+ - supports-color
+
+ '@iconify/types@2.0.0': {}
+
+ '@iconify/utils@2.1.33':
+ dependencies:
+ '@antfu/install-pkg': 0.4.1
+ '@antfu/utils': 0.7.10
+ '@iconify/types': 2.0.0
+ debug: 4.3.7
+ kolorist: 1.8.0
+ local-pkg: 0.5.0
+ mlly: 1.7.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@img/sharp-darwin-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.0.5
+ optional: true
+
+ '@img/sharp-linux-s390x@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.0.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-wasm32@0.33.5':
+ dependencies:
+ '@emnapi/runtime': 1.3.1
+ optional: true
+
+ '@img/sharp-win32-ia32@0.33.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.33.5':
+ optional: true
+
+ '@internationalized/date@3.5.6':
+ dependencies:
+ '@swc/helpers': 0.5.13
+
+ '@internationalized/number@3.5.4':
+ dependencies:
+ '@swc/helpers': 0.5.13
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@jridgewell/gen-mapping@0.3.5':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@kobalte/core@0.13.7(solid-js@1.9.3)':
+ dependencies:
+ '@floating-ui/dom': 1.6.11
+ '@internationalized/date': 3.5.6
+ '@internationalized/number': 3.5.4
+ '@kobalte/utils': 0.9.1(solid-js@1.9.3)
+ '@solid-primitives/props': 3.1.11(solid-js@1.9.3)
+ '@solid-primitives/resize-observer': 2.0.26(solid-js@1.9.3)
+ solid-js: 1.9.3
+ solid-presence: 0.1.8(solid-js@1.9.3)
+ solid-prevent-scroll: 0.1.10(solid-js@1.9.3)
+
+ '@kobalte/utils@0.9.1(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3)
+ '@solid-primitives/keyed': 1.2.3(solid-js@1.9.3)
+ '@solid-primitives/map': 0.4.13(solid-js@1.9.3)
+ '@solid-primitives/media': 2.2.9(solid-js@1.9.3)
+ '@solid-primitives/props': 3.1.11(solid-js@1.9.3)
+ '@solid-primitives/refs': 1.0.8(solid-js@1.9.3)
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@kurkle/color@0.3.2': {}
+
+ '@lezer/common@1.2.3': {}
+
+ '@lezer/highlight@1.2.1':
+ dependencies:
+ '@lezer/common': 1.2.3
+
+ '@lezer/lr@1.4.2':
+ dependencies:
+ '@lezer/common': 1.2.3
+
+ '@mark.probst/typescript-json-schema@0.55.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+ '@types/node': 16.18.115
+ glob: 7.2.3
+ path-equal: 1.2.5
+ safe-stable-stringify: 2.5.0
+ ts-node: 10.9.2(@types/node@16.18.115)(typescript@4.9.4)
+ typescript: 4.9.4
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+
+ '@mdx-js/mdx@3.1.0(acorn@8.14.0)':
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdx': 2.0.13
+ collapse-white-space: 2.1.0
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-util-scope: 1.0.0
+ estree-walker: 3.0.3
+ hast-util-to-jsx-runtime: 2.3.2
+ markdown-extensions: 2.0.0
+ recma-build-jsx: 1.0.0
+ recma-jsx: 1.0.0(acorn@8.14.0)
+ recma-stringify: 1.0.0
+ rehype-recma: 1.0.0
+ remark-mdx: 3.1.0
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.1
+ source-map: 0.7.4
+ unified: 11.0.5
+ unist-util-position-from-estree: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - acorn
+ - supports-color
+
+ '@nanostores/persistent@0.10.2(nanostores@0.11.3)':
+ dependencies:
+ nanostores: 0.11.3
+
+ '@nanostores/solid@0.5.0(nanostores@0.11.3)(solid-js@1.9.3)':
+ dependencies:
+ nanostores: 0.11.3
+ solid-js: 1.9.3
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+
+ '@nothing-but/utils@0.12.1':
+ optional: true
+
+ '@oslojs/encoding@1.1.0': {}
+
+ '@pagefind/darwin-arm64@1.1.1':
+ optional: true
+
+ '@pagefind/darwin-x64@1.1.1':
+ optional: true
+
+ '@pagefind/default-ui@1.1.1': {}
+
+ '@pagefind/linux-arm64@1.1.1':
+ optional: true
+
+ '@pagefind/linux-x64@1.1.1':
+ optional: true
+
+ '@pagefind/windows-x64@1.1.1':
+ optional: true
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@protobufjs/aspromise@1.1.2': {}
+
+ '@protobufjs/base64@1.1.2': {}
+
+ '@protobufjs/codegen@2.0.4': {}
+
+ '@protobufjs/eventemitter@1.1.0': {}
+
+ '@protobufjs/fetch@1.1.0':
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/inquire': 1.1.0
+
+ '@protobufjs/float@1.0.2': {}
+
+ '@protobufjs/inquire@1.1.0': {}
+
+ '@protobufjs/path@1.1.2': {}
+
+ '@protobufjs/pool@1.1.0': {}
+
+ '@protobufjs/utf8@1.1.0': {}
+
+ '@rollup/pluginutils@5.1.3(rollup@4.24.2)':
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-walker: 2.0.2
+ picomatch: 4.0.2
+ optionalDependencies:
+ rollup: 4.24.2
+
+ '@rollup/rollup-android-arm-eabi@4.24.2':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.24.2':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.24.2':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.24.2':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.24.2':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.24.2':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.24.2':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.24.2':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.24.2':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.24.2':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.24.2':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.24.2':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.24.2':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.24.2':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.24.2':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.24.2':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.24.2':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.24.2':
+ optional: true
+
+ '@sec-ant/readable-stream@0.4.1': {}
+
+ '@shikijs/core@1.22.2':
+ dependencies:
+ '@shikijs/engine-javascript': 1.22.2
+ '@shikijs/engine-oniguruma': 1.22.2
+ '@shikijs/types': 1.22.2
+ '@shikijs/vscode-textmate': 9.3.0
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.3
+
+ '@shikijs/engine-javascript@1.22.2':
+ dependencies:
+ '@shikijs/types': 1.22.2
+ '@shikijs/vscode-textmate': 9.3.0
+ oniguruma-to-js: 0.4.3
+
+ '@shikijs/engine-oniguruma@1.22.2':
+ dependencies:
+ '@shikijs/types': 1.22.2
+ '@shikijs/vscode-textmate': 9.3.0
+
+ '@shikijs/types@1.22.2':
+ dependencies:
+ '@shikijs/vscode-textmate': 9.3.0
+ '@types/hast': 3.0.4
+
+ '@shikijs/vscode-textmate@9.3.0': {}
+
+ '@sindresorhus/merge-streams@4.0.0': {}
+
+ '@solid-devtools/debugger@0.23.4(solid-js@1.9.3)':
+ dependencies:
+ '@nothing-but/utils': 0.12.1
+ '@solid-devtools/shared': 0.13.2(solid-js@1.9.3)
+ '@solid-primitives/bounds': 0.0.118(solid-js@1.9.3)
+ '@solid-primitives/cursor': 0.0.112(solid-js@1.9.3)
+ '@solid-primitives/event-bus': 1.0.11(solid-js@1.9.3)
+ '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3)
+ '@solid-primitives/keyboard': 1.2.8(solid-js@1.9.3)
+ '@solid-primitives/platform': 0.1.2(solid-js@1.9.3)
+ '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3)
+ '@solid-primitives/scheduled': 1.4.4(solid-js@1.9.3)
+ '@solid-primitives/static-store': 0.0.5(solid-js@1.9.3)
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optional: true
+
+ '@solid-devtools/shared@0.13.2(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/event-bus': 1.0.11(solid-js@1.9.3)
+ '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3)
+ '@solid-primitives/media': 2.2.9(solid-js@1.9.3)
+ '@solid-primitives/refs': 1.0.8(solid-js@1.9.3)
+ '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3)
+ '@solid-primitives/scheduled': 1.4.4(solid-js@1.9.3)
+ '@solid-primitives/static-store': 0.0.5(solid-js@1.9.3)
+ '@solid-primitives/styles': 0.0.111(solid-js@1.9.3)
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optional: true
+
+ '@solid-primitives/bounds@0.0.118(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3)
+ '@solid-primitives/resize-observer': 2.0.26(solid-js@1.9.3)
+ '@solid-primitives/static-store': 0.0.5(solid-js@1.9.3)
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optional: true
+
+ '@solid-primitives/cursor@0.0.112(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optional: true
+
+ '@solid-primitives/event-bus@1.0.11(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optional: true
+
+ '@solid-primitives/event-listener@2.3.3(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/keyboard@1.2.8(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3)
+ '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3)
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optional: true
+
+ '@solid-primitives/keyed@1.2.3(solid-js@1.9.3)':
+ dependencies:
+ solid-js: 1.9.3
+
+ '@solid-primitives/map@0.4.13(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/trigger': 1.1.0(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/media@2.2.9(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3)
+ '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3)
+ '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3)
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/memo@1.3.10(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/scheduled': 1.4.4(solid-js@1.9.3)
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/platform@0.1.2(solid-js@1.9.3)':
+ dependencies:
+ solid-js: 1.9.3
+ optional: true
+
+ '@solid-primitives/props@3.1.11(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/refs@1.0.8(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/resize-observer@2.0.26(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.3)
+ '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3)
+ '@solid-primitives/static-store': 0.0.8(solid-js@1.9.3)
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/rootless@1.4.5(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/scheduled@1.4.4(solid-js@1.9.3)':
+ dependencies:
+ solid-js: 1.9.3
+
+ '@solid-primitives/static-store@0.0.5(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optional: true
+
+ '@solid-primitives/static-store@0.0.8(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/styles@0.0.111(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/rootless': 1.4.5(solid-js@1.9.3)
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optional: true
+
+ '@solid-primitives/trigger@1.1.0(solid-js@1.9.3)':
+ dependencies:
+ '@solid-primitives/utils': 6.2.3(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@solid-primitives/utils@6.2.3(solid-js@1.9.3)':
+ dependencies:
+ solid-js: 1.9.3
+
+ '@solidjs/router@0.14.10(solid-js@1.9.3)':
+ dependencies:
+ solid-js: 1.9.3
+
+ '@swc/helpers@0.5.13':
+ dependencies:
+ tslib: 2.8.0
+
+ '@tailwindcss/typography@0.5.15(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4)))':
+ dependencies:
+ lodash.castarray: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4))
+
+ '@tailwindcss/typography@0.5.15(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)))':
+ dependencies:
+ lodash.castarray: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+
+ '@tanstack/form-core@0.34.1':
+ dependencies:
+ '@tanstack/store': 0.5.5
+
+ '@tanstack/query-core@5.59.16': {}
+
+ '@tanstack/solid-form@0.34.1(solid-js@1.9.3)':
+ dependencies:
+ '@tanstack/form-core': 0.34.1
+ '@tanstack/solid-store': 0.5.6(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ '@tanstack/solid-query@5.59.16(solid-js@1.9.3)':
+ dependencies:
+ '@tanstack/query-core': 5.59.16
+ solid-js: 1.9.3
+
+ '@tanstack/solid-store@0.5.6(solid-js@1.9.3)':
+ dependencies:
+ '@tanstack/store': 0.5.5
+ solid-js: 1.9.3
+
+ '@tanstack/solid-table@8.20.5(solid-js@1.9.3)':
+ dependencies:
+ '@tanstack/table-core': 8.20.5
+ solid-js: 1.9.3
+
+ '@tanstack/store@0.5.5': {}
+
+ '@tanstack/table-core@8.20.5': {}
+
+ '@trysound/sax@0.2.0': {}
+
+ '@tsconfig/node10@1.0.11': {}
+
+ '@tsconfig/node12@1.0.11': {}
+
+ '@tsconfig/node14@1.0.3': {}
+
+ '@tsconfig/node16@1.0.4': {}
+
+ '@types/acorn@4.0.6':
+ dependencies:
+ '@types/estree': 1.0.6
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.26.1
+ '@babel/types': 7.26.0
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.6
+
+ '@types/babel__generator@7.6.8':
+ dependencies:
+ '@babel/types': 7.26.0
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.26.1
+ '@babel/types': 7.26.0
+
+ '@types/babel__traverse@7.20.6':
+ dependencies:
+ '@babel/types': 7.26.0
+
+ '@types/cookie@0.6.0': {}
+
+ '@types/dateformat@5.0.2': {}
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 0.7.34
+
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.6
+
+ '@types/estree@1.0.6': {}
+
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/mdx@2.0.13': {}
+
+ '@types/ms@0.7.34': {}
+
+ '@types/nlcst@2.0.3':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/node@16.18.115': {}
+
+ '@types/node@17.0.45': {}
+
+ '@types/node@22.8.2':
+ dependencies:
+ undici-types: 6.19.8
+
+ '@types/sax@1.2.7':
+ dependencies:
+ '@types/node': 22.8.2
+
+ '@types/tar@6.1.13':
+ dependencies:
+ '@types/node': 22.8.2
+ minipass: 4.2.8
+
+ '@types/unist@2.0.11': {}
+
+ '@types/unist@3.0.3': {}
+
+ '@types/wicg-file-system-access@2023.10.5': {}
+
+ '@types/yauzl@2.10.3':
+ dependencies:
+ '@types/node': 22.8.2
+ optional: true
+
+ '@typescript-eslint/eslint-plugin@8.12.1(@typescript-eslint/parser@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+ '@typescript-eslint/scope-manager': 8.12.1
+ '@typescript-eslint/type-utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.12.1
+ eslint: 9.13.0(jiti@2.3.3)
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 1.3.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.12.1
+ '@typescript-eslint/types': 8.12.1
+ '@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.12.1
+ debug: 4.3.7
+ eslint: 9.13.0(jiti@2.3.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.12.1':
+ dependencies:
+ '@typescript-eslint/types': 8.12.1
+ '@typescript-eslint/visitor-keys': 8.12.1
+
+ '@typescript-eslint/type-utils@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+ debug: 4.3.7
+ ts-api-utils: 1.3.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+
+ '@typescript-eslint/types@8.12.1': {}
+
+ '@typescript-eslint/typescript-estree@8.12.1(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.12.1
+ '@typescript-eslint/visitor-keys': 8.12.1
+ debug: 4.3.7
+ fast-glob: 3.3.2
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ ts-api-utils: 1.3.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.13.0(jiti@2.3.3))
+ '@typescript-eslint/scope-manager': 8.12.1
+ '@typescript-eslint/types': 8.12.1
+ '@typescript-eslint/typescript-estree': 8.12.1(typescript@5.6.3)
+ eslint: 9.13.0(jiti@2.3.3)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@typescript-eslint/visitor-keys@8.12.1':
+ dependencies:
+ '@typescript-eslint/types': 8.12.1
+ eslint-visitor-keys: 3.4.3
+
+ '@ungap/structured-clone@1.2.0': {}
+
+ '@vitest/expect@2.1.4':
+ dependencies:
+ '@vitest/spy': 2.1.4
+ '@vitest/utils': 2.1.4
+ chai: 5.1.2
+ tinyrainbow: 1.2.0
+
+ '@vitest/mocker@2.1.4(vite@5.4.10(@types/node@22.8.2))':
+ dependencies:
+ '@vitest/spy': 2.1.4
+ estree-walker: 3.0.3
+ magic-string: 0.30.12
+ optionalDependencies:
+ vite: 5.4.10(@types/node@22.8.2)
+
+ '@vitest/pretty-format@2.1.4':
+ dependencies:
+ tinyrainbow: 1.2.0
+
+ '@vitest/runner@2.1.4':
+ dependencies:
+ '@vitest/utils': 2.1.4
+ pathe: 1.1.2
+
+ '@vitest/snapshot@2.1.4':
+ dependencies:
+ '@vitest/pretty-format': 2.1.4
+ magic-string: 0.30.12
+ pathe: 1.1.2
+
+ '@vitest/spy@2.1.4':
+ dependencies:
+ tinyspy: 3.0.2
+
+ '@vitest/utils@2.1.4':
+ dependencies:
+ '@vitest/pretty-format': 2.1.4
+ loupe: 3.1.2
+ tinyrainbow: 1.2.0
+
+ '@volar/kit@2.4.8(typescript@5.6.3)':
+ dependencies:
+ '@volar/language-service': 2.4.8
+ '@volar/typescript': 2.4.8
+ typesafe-path: 0.2.2
+ typescript: 5.6.3
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-uri: 3.0.8
+
+ '@volar/language-core@2.4.8':
+ dependencies:
+ '@volar/source-map': 2.4.8
+
+ '@volar/language-server@2.4.8':
+ dependencies:
+ '@volar/language-core': 2.4.8
+ '@volar/language-service': 2.4.8
+ '@volar/typescript': 2.4.8
+ path-browserify: 1.0.1
+ request-light: 0.7.0
+ vscode-languageserver: 9.0.1
+ vscode-languageserver-protocol: 3.17.5
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-uri: 3.0.8
+
+ '@volar/language-service@2.4.8':
+ dependencies:
+ '@volar/language-core': 2.4.8
+ vscode-languageserver-protocol: 3.17.5
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-uri: 3.0.8
+
+ '@volar/source-map@2.4.8': {}
+
+ '@volar/typescript@2.4.8':
+ dependencies:
+ '@volar/language-core': 2.4.8
+ path-browserify: 1.0.1
+ vscode-uri: 3.0.8
+
+ '@vscode/emmet-helper@2.9.3':
+ dependencies:
+ emmet: 2.4.11
+ jsonc-parser: 2.3.1
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-languageserver-types: 3.17.5
+ vscode-uri: 2.1.2
+
+ '@vscode/l10n@0.0.18': {}
+
+ abort-controller@3.0.0:
+ dependencies:
+ event-target-shim: 5.0.1
+
+ acorn-jsx@5.3.2(acorn@8.14.0):
+ dependencies:
+ acorn: 8.14.0
+
+ acorn-walk@8.3.4:
+ dependencies:
+ acorn: 8.14.0
+
+ acorn@8.14.0: {}
+
+ agent-base@7.1.1:
+ dependencies:
+ debug: 4.3.7
+ transitivePeerDependencies:
+ - supports-color
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.17.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.0.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ ansi-align@3.0.1:
+ dependencies:
+ string-width: 4.2.3
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.1.0: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.1: {}
+
+ any-promise@1.3.0: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ arg@4.1.3: {}
+
+ arg@5.0.2: {}
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ aria-query@5.3.2: {}
+
+ array-back@3.1.0: {}
+
+ array-back@6.2.2: {}
+
+ array-iterate@2.0.1: {}
+
+ assertion-error@2.0.1: {}
+
+ astring@1.9.0: {}
+
+ astro-expressive-code@0.35.6(astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3)):
+ dependencies:
+ astro: 4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3)
+ rehype-expressive-code: 0.35.6
+
+ astro-icon@1.1.1:
+ dependencies:
+ '@iconify/tools': 4.0.7
+ '@iconify/types': 2.0.0
+ '@iconify/utils': 2.1.33
+ transitivePeerDependencies:
+ - debug
+ - supports-color
+
+ astro-robots-txt@1.0.0:
+ dependencies:
+ valid-filename: 4.0.0
+ zod: 3.23.8
+
+ astro@4.16.7(@types/node@16.18.115)(rollup@4.24.2)(typescript@4.9.4):
+ dependencies:
+ '@astrojs/compiler': 2.10.3
+ '@astrojs/internal-helpers': 0.4.1
+ '@astrojs/markdown-remark': 5.3.0
+ '@astrojs/telemetry': 3.1.0
+ '@babel/core': 7.26.0
+ '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ '@oslojs/encoding': 1.1.0
+ '@rollup/pluginutils': 5.1.3(rollup@4.24.2)
+ '@types/babel__core': 7.20.5
+ '@types/cookie': 0.6.0
+ acorn: 8.14.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ boxen: 8.0.1
+ ci-info: 4.0.0
+ clsx: 2.1.1
+ common-ancestor-path: 1.0.1
+ cookie: 0.7.2
+ cssesc: 3.0.0
+ debug: 4.3.7
+ deterministic-object-hash: 2.0.2
+ devalue: 5.1.1
+ diff: 5.2.0
+ dlv: 1.1.3
+ dset: 3.1.4
+ es-module-lexer: 1.5.4
+ esbuild: 0.21.5
+ estree-walker: 3.0.3
+ fast-glob: 3.3.2
+ flattie: 1.1.1
+ github-slugger: 2.0.0
+ gray-matter: 4.0.3
+ html-escaper: 3.0.3
+ http-cache-semantics: 4.1.1
+ js-yaml: 4.1.0
+ kleur: 4.1.5
+ magic-string: 0.30.12
+ magicast: 0.3.5
+ micromatch: 4.0.8
+ mrmime: 2.0.0
+ neotraverse: 0.6.18
+ ora: 8.1.0
+ p-limit: 6.1.0
+ p-queue: 8.0.1
+ preferred-pm: 4.0.0
+ prompts: 2.4.2
+ rehype: 13.0.2
+ semver: 7.6.3
+ shiki: 1.22.2
+ tinyexec: 0.3.1
+ tsconfck: 3.1.4(typescript@4.9.4)
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ vite: 5.4.10(@types/node@16.18.115)
+ vitefu: 1.0.3(vite@5.4.10(@types/node@16.18.115))
+ which-pm: 3.0.0
+ xxhash-wasm: 1.0.2
+ yargs-parser: 21.1.1
+ zod: 3.23.8
+ zod-to-json-schema: 3.23.5(zod@3.23.8)
+ zod-to-ts: 1.2.0(typescript@4.9.4)(zod@3.23.8)
+ optionalDependencies:
+ sharp: 0.33.5
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - rollup
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - typescript
+
+ astro@4.16.7(@types/node@22.8.2)(rollup@4.24.2)(typescript@5.6.3):
+ dependencies:
+ '@astrojs/compiler': 2.10.3
+ '@astrojs/internal-helpers': 0.4.1
+ '@astrojs/markdown-remark': 5.3.0
+ '@astrojs/telemetry': 3.1.0
+ '@babel/core': 7.26.0
+ '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ '@oslojs/encoding': 1.1.0
+ '@rollup/pluginutils': 5.1.3(rollup@4.24.2)
+ '@types/babel__core': 7.20.5
+ '@types/cookie': 0.6.0
+ acorn: 8.14.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ boxen: 8.0.1
+ ci-info: 4.0.0
+ clsx: 2.1.1
+ common-ancestor-path: 1.0.1
+ cookie: 0.7.2
+ cssesc: 3.0.0
+ debug: 4.3.7
+ deterministic-object-hash: 2.0.2
+ devalue: 5.1.1
+ diff: 5.2.0
+ dlv: 1.1.3
+ dset: 3.1.4
+ es-module-lexer: 1.5.4
+ esbuild: 0.21.5
+ estree-walker: 3.0.3
+ fast-glob: 3.3.2
+ flattie: 1.1.1
+ github-slugger: 2.0.0
+ gray-matter: 4.0.3
+ html-escaper: 3.0.3
+ http-cache-semantics: 4.1.1
+ js-yaml: 4.1.0
+ kleur: 4.1.5
+ magic-string: 0.30.12
+ magicast: 0.3.5
+ micromatch: 4.0.8
+ mrmime: 2.0.0
+ neotraverse: 0.6.18
+ ora: 8.1.0
+ p-limit: 6.1.0
+ p-queue: 8.0.1
+ preferred-pm: 4.0.0
+ prompts: 2.4.2
+ rehype: 13.0.2
+ semver: 7.6.3
+ shiki: 1.22.2
+ tinyexec: 0.3.1
+ tsconfck: 3.1.4(typescript@5.6.3)
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ vite: 5.4.10(@types/node@22.8.2)
+ vitefu: 1.0.3(vite@5.4.10(@types/node@22.8.2))
+ which-pm: 3.0.0
+ xxhash-wasm: 1.0.2
+ yargs-parser: 21.1.1
+ zod: 3.23.8
+ zod-to-json-schema: 3.23.5(zod@3.23.8)
+ zod-to-ts: 1.2.0(typescript@5.6.3)(zod@3.23.8)
+ optionalDependencies:
+ sharp: 0.33.5
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - rollup
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - typescript
+
+ asynckit@0.4.0: {}
+
+ autoprefixer@10.4.20(postcss@8.4.47):
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001674
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.1
+ postcss: 8.4.47
+ postcss-value-parser: 4.2.0
+
+ axios@1.7.7:
+ dependencies:
+ follow-redirects: 1.15.9
+ form-data: 4.0.1
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ axobject-query@4.1.0: {}
+
+ babel-plugin-jsx-dom-expressions@0.39.3(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ html-entities: 2.3.3
+ parse5: 7.2.1
+ validate-html-nesting: 1.2.2
+
+ babel-preset-solid@1.9.3(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ babel-plugin-jsx-dom-expressions: 0.39.3(@babel/core@7.26.0)
+
+ bail@2.0.2: {}
+
+ balanced-match@1.0.2: {}
+
+ base-64@1.0.0: {}
+
+ base64-js@1.5.1: {}
+
+ bcp-47-match@2.0.3: {}
+
+ bcp-47@2.1.0:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+
+ binary-extensions@2.3.0: {}
+
+ boolbase@1.0.0: {}
+
+ boxen@8.0.1:
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 8.0.0
+ chalk: 5.3.0
+ cli-boxes: 3.0.0
+ string-width: 7.2.0
+ type-fest: 4.26.1
+ widest-line: 5.0.0
+ wrap-ansi: 9.0.0
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.1:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browser-or-node@3.0.0: {}
+
+ browserslist@4.24.2:
+ dependencies:
+ caniuse-lite: 1.0.30001674
+ electron-to-chromium: 1.5.49
+ node-releases: 2.0.18
+ update-browserslist-db: 1.1.1(browserslist@4.24.2)
+
+ buffer-crc32@0.2.13: {}
+
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ cac@6.7.14: {}
+
+ callsites@3.1.0: {}
+
+ camelcase-css@2.0.1: {}
+
+ camelcase@8.0.0: {}
+
+ caniuse-lite@1.0.30001674: {}
+
+ case-anything@2.1.13: {}
+
+ ccount@2.0.1: {}
+
+ chai@5.1.2:
+ dependencies:
+ assertion-error: 2.0.1
+ check-error: 2.1.1
+ deep-eql: 5.0.2
+ loupe: 3.1.2
+ pathval: 2.0.0
+
+ chalk-template@0.4.0:
+ dependencies:
+ chalk: 4.1.2
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chalk@5.3.0: {}
+
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@2.0.2: {}
+
+ character-reference-invalid@2.0.1: {}
+
+ chart.js@4.4.6:
+ dependencies:
+ '@kurkle/color': 0.3.2
+
+ chartjs-chart-error-bars@4.4.3(chart.js@4.4.6):
+ dependencies:
+ chart.js: 4.4.6
+
+ chartjs-plugin-deferred@2.0.0(chart.js@4.4.6):
+ dependencies:
+ chart.js: 4.4.6
+
+ check-error@2.1.1: {}
+
+ cheerio-select@2.1.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-select: 5.1.0
+ css-what: 6.1.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+
+ cheerio@1.0.0:
+ dependencies:
+ cheerio-select: 2.1.0
+ dom-serializer: 2.0.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ encoding-sniffer: 0.2.0
+ htmlparser2: 9.1.0
+ parse5: 7.2.1
+ parse5-htmlparser2-tree-adapter: 7.1.0
+ parse5-parser-stream: 7.1.2
+ undici: 6.20.1
+ whatwg-mimetype: 4.0.0
+
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ chokidar@4.0.1:
+ dependencies:
+ readdirp: 4.0.2
+
+ chownr@2.0.0: {}
+
+ ci-info@4.0.0: {}
+
+ class-variance-authority@0.7.0:
+ dependencies:
+ clsx: 2.0.0
+
+ cli-boxes@3.0.0: {}
+
+ cli-cursor@5.0.0:
+ dependencies:
+ restore-cursor: 5.1.0
+
+ cli-spinners@2.9.2: {}
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ clsx@2.0.0: {}
+
+ clsx@2.1.1: {}
+
+ collapse-white-space@2.1.0: {}
+
+ collection-utils@1.0.1: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+
+ color@4.2.3:
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ comma-separated-tokens@2.0.3: {}
+
+ command-line-args@5.2.1:
+ dependencies:
+ array-back: 3.1.0
+ find-replace: 3.0.0
+ lodash.camelcase: 4.3.0
+ typical: 4.0.0
+
+ command-line-usage@7.0.3:
+ dependencies:
+ array-back: 6.2.2
+ chalk-template: 0.4.0
+ table-layout: 4.1.1
+ typical: 7.2.0
+
+ commander@4.1.1: {}
+
+ commander@7.2.0: {}
+
+ common-ancestor-path@1.0.1: {}
+
+ concat-map@0.0.1: {}
+
+ confbox@0.1.8: {}
+
+ convert-source-map@2.0.0: {}
+
+ cookie@0.7.2: {}
+
+ create-require@1.1.1: {}
+
+ cross-fetch@4.0.0:
+ dependencies:
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+
+ cross-spawn@7.0.3:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ css-select@5.1.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ nth-check: 2.1.1
+
+ css-selector-parser@3.0.5: {}
+
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
+ css-tree@2.3.1:
+ dependencies:
+ mdn-data: 2.0.30
+ source-map-js: 1.2.1
+
+ css-what@6.1.0: {}
+
+ cssesc@3.0.0: {}
+
+ csso@5.0.5:
+ dependencies:
+ css-tree: 2.2.1
+
+ cssstyle@4.1.0:
+ dependencies:
+ rrweb-cssom: 0.7.1
+
+ csstype@3.1.3: {}
+
+ csv-parse@5.5.6: {}
+
+ data-urls@5.0.0:
+ dependencies:
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.0.0
+
+ debug@4.3.7:
+ dependencies:
+ ms: 2.1.3
+
+ decimal.js@10.4.3: {}
+
+ decode-named-character-reference@1.0.2:
+ dependencies:
+ character-entities: 2.0.2
+
+ deep-eql@5.0.2: {}
+
+ deep-is@0.1.4: {}
+
+ delayed-stream@1.0.0: {}
+
+ dequal@2.0.3: {}
+
+ detect-libc@1.0.3: {}
+
+ detect-libc@2.0.3: {}
+
+ deterministic-object-hash@2.0.2:
+ dependencies:
+ base-64: 1.0.0
+
+ devalue@5.1.1: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ didyoumean@1.2.2: {}
+
+ diff@4.0.2: {}
+
+ diff@5.2.0: {}
+
+ direction@2.0.1: {}
+
+ dlv@1.1.3: {}
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.1.0:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dprint-node@1.0.8:
+ dependencies:
+ detect-libc: 1.0.3
+
+ dset@3.1.4: {}
+
+ eastasianwidth@0.2.0: {}
+
+ electron-to-chromium@1.5.49: {}
+
+ emmet@2.4.11:
+ dependencies:
+ '@emmetio/abbreviation': 2.3.3
+ '@emmetio/css-abbreviation': 2.1.8
+
+ emoji-regex@10.4.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ encoding-sniffer@0.2.0:
+ dependencies:
+ iconv-lite: 0.6.3
+ whatwg-encoding: 3.1.1
+
+ end-of-stream@1.4.4:
+ dependencies:
+ once: 1.4.0
+
+ entities@4.5.0: {}
+
+ es-module-lexer@1.5.4: {}
+
+ esast-util-from-estree@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ unist-util-position-from-estree: 2.0.0
+
+ esast-util-from-js@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ acorn: 8.14.0
+ esast-util-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ esbuild@0.21.5:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.21.5
+ '@esbuild/android-arm': 0.21.5
+ '@esbuild/android-arm64': 0.21.5
+ '@esbuild/android-x64': 0.21.5
+ '@esbuild/darwin-arm64': 0.21.5
+ '@esbuild/darwin-x64': 0.21.5
+ '@esbuild/freebsd-arm64': 0.21.5
+ '@esbuild/freebsd-x64': 0.21.5
+ '@esbuild/linux-arm': 0.21.5
+ '@esbuild/linux-arm64': 0.21.5
+ '@esbuild/linux-ia32': 0.21.5
+ '@esbuild/linux-loong64': 0.21.5
+ '@esbuild/linux-mips64el': 0.21.5
+ '@esbuild/linux-ppc64': 0.21.5
+ '@esbuild/linux-riscv64': 0.21.5
+ '@esbuild/linux-s390x': 0.21.5
+ '@esbuild/linux-x64': 0.21.5
+ '@esbuild/netbsd-x64': 0.21.5
+ '@esbuild/openbsd-x64': 0.21.5
+ '@esbuild/sunos-x64': 0.21.5
+ '@esbuild/win32-arm64': 0.21.5
+ '@esbuild/win32-ia32': 0.21.5
+ '@esbuild/win32-x64': 0.21.5
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ eslint-scope@8.1.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.1.0: {}
+
+ eslint@9.13.0(jiti@2.3.3):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.13.0(jiti@2.3.3))
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.18.0
+ '@eslint/core': 0.7.0
+ '@eslint/eslintrc': 3.1.0
+ '@eslint/js': 9.13.0
+ '@eslint/plugin-kit': 0.2.2
+ '@humanfs/node': 0.16.6
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.3.1
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.7
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.1.0
+ eslint-visitor-keys: 4.1.0
+ espree: 10.2.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ text-table: 0.2.0
+ optionalDependencies:
+ jiti: 2.3.3
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.2.0:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 4.1.0
+
+ esprima@4.0.1: {}
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ estree-util-attach-comments@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+
+ estree-util-build-jsx@3.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-walker: 3.0.3
+
+ estree-util-is-identifier-name@3.0.0: {}
+
+ estree-util-scope@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+
+ estree-util-to-js@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ astring: 1.9.0
+ source-map: 0.7.4
+
+ estree-util-visit@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/unist': 3.0.3
+
+ estree-walker@2.0.2: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.6
+
+ esutils@2.0.3: {}
+
+ event-target-shim@5.0.1: {}
+
+ eventemitter3@5.0.1: {}
+
+ events@3.3.0: {}
+
+ execa@9.5.1:
+ dependencies:
+ '@sindresorhus/merge-streams': 4.0.0
+ cross-spawn: 7.0.3
+ figures: 6.1.0
+ get-stream: 9.0.1
+ human-signals: 8.0.0
+ is-plain-obj: 4.1.0
+ is-stream: 4.0.1
+ npm-run-path: 6.0.0
+ pretty-ms: 9.1.0
+ signal-exit: 4.1.0
+ strip-final-newline: 4.0.0
+ yoctocolors: 2.1.1
+
+ expect-type@1.1.0: {}
+
+ expressive-code@0.35.6:
+ dependencies:
+ '@expressive-code/core': 0.35.6
+ '@expressive-code/plugin-frames': 0.35.6
+ '@expressive-code/plugin-shiki': 0.35.6
+ '@expressive-code/plugin-text-markers': 0.35.6
+
+ extend-shallow@2.0.1:
+ dependencies:
+ is-extendable: 0.1.1
+
+ extend@3.0.2: {}
+
+ extract-zip@2.0.1:
+ dependencies:
+ debug: 4.3.7
+ get-stream: 5.2.0
+ yauzl: 2.10.0
+ optionalDependencies:
+ '@types/yauzl': 2.10.3
+ transitivePeerDependencies:
+ - supports-color
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.2:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-uri@3.0.3: {}
+
+ fastq@1.17.1:
+ dependencies:
+ reusify: 1.0.4
+
+ fd-slicer@1.1.0:
+ dependencies:
+ pend: 1.2.0
+
+ figures@6.1.0:
+ dependencies:
+ is-unicode-supported: 2.1.0
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ filename-reserved-regex@3.0.0: {}
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-replace@3.0.0:
+ dependencies:
+ array-back: 3.1.0
+
+ find-up-simple@1.0.0: {}
+
+ find-up@4.1.0:
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ find-yarn-workspace-root2@1.2.16:
+ dependencies:
+ micromatch: 4.0.8
+ pkg-dir: 4.2.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.1
+ keyv: 4.5.4
+
+ flatted@3.3.1: {}
+
+ flattie@1.1.1: {}
+
+ follow-redirects@1.15.9: {}
+
+ foreground-child@3.3.0:
+ dependencies:
+ cross-spawn: 7.0.3
+ signal-exit: 4.1.0
+
+ form-data@4.0.1:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
+ fraction.js@4.3.7: {}
+
+ fs-minipass@2.1.0:
+ dependencies:
+ minipass: 3.3.6
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.3.0: {}
+
+ get-stream@5.2.0:
+ dependencies:
+ pump: 3.0.2
+
+ get-stream@9.0.1:
+ dependencies:
+ '@sec-ant/readable-stream': 0.4.1
+ is-stream: 4.0.1
+
+ github-slugger@2.0.0: {}
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@10.4.5:
+ dependencies:
+ foreground-child: 3.3.0
+ jackspeak: 3.4.3
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ globals@11.12.0: {}
+
+ globals@14.0.0: {}
+
+ globals@15.11.0: {}
+
+ globrex@0.1.2: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ graphql@0.11.7:
+ dependencies:
+ iterall: 1.1.3
+
+ gray-matter@4.0.3:
+ dependencies:
+ js-yaml: 3.14.1
+ kind-of: 6.0.3
+ section-matter: 1.0.0
+ strip-bom-string: 1.0.0
+
+ happy-dom@15.7.4:
+ dependencies:
+ entities: 4.5.0
+ webidl-conversions: 7.0.0
+ whatwg-mimetype: 3.0.0
+ optional: true
+
+ has-flag@4.0.0: {}
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ hast-util-embedded@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-is-element: 3.0.0
+
+ hast-util-format@1.1.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-minify-whitespace: 1.0.1
+ hast-util-phrasing: 3.0.1
+ hast-util-whitespace: 3.0.0
+ html-whitespace-sensitive-tag-names: 3.0.1
+ unist-util-visit-parents: 6.0.1
+
+ hast-util-from-html@2.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ devlop: 1.1.0
+ hast-util-from-parse5: 8.0.1
+ parse5: 7.2.1
+ vfile: 6.0.3
+ vfile-message: 4.0.2
+
+ hast-util-from-parse5@8.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 8.0.0
+ property-information: 6.5.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
+
+ hast-util-has-property@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-is-body-ok-link@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-is-element@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-minify-whitespace@1.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-is-element: 3.0.0
+ hast-util-whitespace: 3.0.0
+ unist-util-is: 6.0.0
+
+ hast-util-parse-selector@4.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-phrasing@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-has-property: 3.0.0
+ hast-util-is-body-ok-link: 3.0.1
+ hast-util-is-element: 3.0.0
+
+ hast-util-raw@9.0.4:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ '@ungap/structured-clone': 1.2.0
+ hast-util-from-parse5: 8.0.1
+ hast-util-to-parse5: 8.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.0
+ parse5: 7.2.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-select@6.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ bcp-47-match: 2.0.3
+ comma-separated-tokens: 2.0.3
+ css-selector-parser: 3.0.5
+ devlop: 1.1.0
+ direction: 2.0.1
+ hast-util-has-property: 3.0.0
+ hast-util-to-string: 3.0.1
+ hast-util-whitespace: 3.0.0
+ nth-check: 2.1.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ hast-util-to-estree@3.1.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-attach-comments: 3.0.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 0.4.4
+ unist-util-position: 5.0.0
+ zwitch: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-html@9.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-to-jsx-runtime@2.3.2:
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 1.0.8
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-parse5@8.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-to-string@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-to-text@4.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ hast-util-is-element: 3.0.0
+ unist-util-find-after: 5.0.0
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hastscript@8.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+
+ hastscript@9.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+
+ html-encoding-sniffer@4.0.0:
+ dependencies:
+ whatwg-encoding: 3.1.1
+
+ html-entities@2.3.3: {}
+
+ html-escaper@3.0.3: {}
+
+ html-void-elements@3.0.0: {}
+
+ html-whitespace-sensitive-tag-names@3.0.1: {}
+
+ htmlparser2@9.1.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ entities: 4.5.0
+
+ http-cache-semantics@4.1.1: {}
+
+ http-proxy-agent@7.0.2:
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.3.7
+ transitivePeerDependencies:
+ - supports-color
+
+ http-status@2.0.0: {}
+
+ https-proxy-agent@7.0.5:
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.3.7
+ transitivePeerDependencies:
+ - supports-color
+
+ human-signals@8.0.0: {}
+
+ i18next@23.16.4:
+ dependencies:
+ '@babel/runtime': 7.26.0
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ import-fresh@3.3.0:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ import-meta-resolve@4.1.0: {}
+
+ imurmurhash@0.1.4: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ inline-style-parser@0.1.1: {}
+
+ inline-style-parser@0.2.4: {}
+
+ is-alphabetical@2.0.1: {}
+
+ is-alphanumerical@2.0.1:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
+
+ is-arrayish@0.3.2: {}
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-core-module@2.15.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-decimal@2.0.1: {}
+
+ is-docker@3.0.0: {}
+
+ is-extendable@0.1.1: {}
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-hexadecimal@2.0.1: {}
+
+ is-inside-container@1.0.0:
+ dependencies:
+ is-docker: 3.0.0
+
+ is-interactive@2.0.0: {}
+
+ is-number@7.0.0: {}
+
+ is-plain-obj@4.1.0: {}
+
+ is-potential-custom-element-name@1.0.1: {}
+
+ is-stream@4.0.1: {}
+
+ is-unicode-supported@1.3.0: {}
+
+ is-unicode-supported@2.1.0: {}
+
+ is-url@1.2.4: {}
+
+ is-what@4.1.16: {}
+
+ is-wsl@3.1.0:
+ dependencies:
+ is-inside-container: 1.0.0
+
+ isexe@2.0.0: {}
+
+ iterall@1.1.3: {}
+
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ jiti@1.21.6: {}
+
+ jiti@2.3.3:
+ optional: true
+
+ js-base64@3.7.7: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@3.14.1:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsdom@25.0.1:
+ dependencies:
+ cssstyle: 4.1.0
+ data-urls: 5.0.0
+ decimal.js: 10.4.3
+ form-data: 4.0.1
+ html-encoding-sniffer: 4.0.0
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.5
+ is-potential-custom-element-name: 1.0.1
+ nwsapi: 2.2.13
+ parse5: 7.2.1
+ rrweb-cssom: 0.7.1
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 5.0.0
+ w3c-xmlserializer: 5.0.0
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 3.1.1
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.0.0
+ ws: 8.18.0
+ xml-name-validator: 5.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ jsesc@3.0.2: {}
+
+ json-buffer@3.0.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@2.2.3: {}
+
+ jsonc-parser@2.3.1: {}
+
+ jsonc-parser@3.3.1: {}
+
+ jwt-decode@4.0.0: {}
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ kind-of@6.0.3: {}
+
+ kleur@3.0.3: {}
+
+ kleur@4.1.5: {}
+
+ kolorist@1.8.0: {}
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lilconfig@2.1.0: {}
+
+ lilconfig@3.1.2: {}
+
+ lines-and-columns@1.2.4: {}
+
+ load-yaml-file@0.2.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ js-yaml: 3.14.1
+ pify: 4.0.1
+ strip-bom: 3.0.0
+
+ local-pkg@0.5.0:
+ dependencies:
+ mlly: 1.7.2
+ pkg-types: 1.2.1
+
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash.camelcase@4.3.0: {}
+
+ lodash.castarray@4.4.0: {}
+
+ lodash.isplainobject@4.0.6: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash@4.17.21: {}
+
+ log-symbols@6.0.0:
+ dependencies:
+ chalk: 5.3.0
+ is-unicode-supported: 1.3.0
+
+ long@5.2.3: {}
+
+ longest-streak@3.1.0: {}
+
+ loupe@3.1.2: {}
+
+ lru-cache@10.4.3: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ magic-string@0.30.12:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ magicast@0.3.5:
+ dependencies:
+ '@babel/parser': 7.26.1
+ '@babel/types': 7.26.0
+ source-map-js: 1.2.1
+
+ make-error@1.3.6: {}
+
+ markdown-extensions@2.0.0: {}
+
+ markdown-table@3.0.4: {}
+
+ mdast-util-definitions@6.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.0.0
+
+ mdast-util-directive@3.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.0
+ parse-entities: 4.0.1
+ stringify-entities: 4.0.4
+ unist-util-visit-parents: 6.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-find-and-replace@3.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ mdast-util-from-markdown@2.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-decode-string: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.1
+ micromark-util-character: 2.1.0
+
+ mdast-util-gfm-footnote@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.0
+ micromark-util-normalize-identifier: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-table@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm@3.0.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.0.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-expression@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-jsx@3.1.3:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.0
+ parse-entities: 4.0.1
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx@3.0.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
+ mdast-util-mdxjs-esm: 2.0.1
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdxjs-esm@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.0
+
+ mdast-util-to-hast@13.2.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.2.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.0
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+
+ mdast-util-to-markdown@2.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-decode-string: 2.0.0
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ mdn-data@2.0.28: {}
+
+ mdn-data@2.0.30: {}
+
+ merge-anything@5.1.7:
+ dependencies:
+ is-what: 4.1.16
+
+ merge2@1.4.1: {}
+
+ micromark-core-commonmark@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.0
+ micromark-factory-label: 2.0.0
+ micromark-factory-space: 2.0.0
+ micromark-factory-title: 2.0.0
+ micromark-factory-whitespace: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-html-tag-name: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-subtokenize: 2.0.1
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-directive@3.0.2:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-factory-whitespace: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ parse-entities: 4.0.1
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.1
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-table@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm@3.0.0:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.0
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-mdx-expression@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ micromark-factory-mdx-expression: 2.0.2
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-mdx-jsx@3.0.1:
+ dependencies:
+ '@types/acorn': 4.0.6
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ micromark-factory-mdx-expression: 2.0.2
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ vfile-message: 4.0.2
+
+ micromark-extension-mdx-md@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.0
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.1
+ micromark-util-character: 2.1.0
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ micromark-extension-mdxjs@3.0.0:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ micromark-extension-mdx-expression: 3.0.0
+ micromark-extension-mdx-jsx: 3.0.1
+ micromark-extension-mdx-md: 2.0.0
+ micromark-extension-mdxjs-esm: 3.0.0
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-destination@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-label@2.0.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-mdx-expression@2.0.2:
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ micromark-factory-space@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-title@2.0.0:
+ dependencies:
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-whitespace@2.0.0:
+ dependencies:
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-character@2.1.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-chunked@2.0.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-classify-character@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-combine-extensions@2.0.0:
+ dependencies:
+ micromark-util-chunked: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-decode-numeric-character-reference@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-decode-string@2.0.0:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 2.1.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-encode@2.0.0: {}
+
+ micromark-util-events-to-acorn@2.0.2:
+ dependencies:
+ '@types/acorn': 4.0.6
+ '@types/estree': 1.0.6
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ vfile-message: 4.0.2
+
+ micromark-util-html-tag-name@2.0.0: {}
+
+ micromark-util-normalize-identifier@2.0.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-resolve-all@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.0
+
+ micromark-util-sanitize-uri@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-encode: 2.0.0
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-subtokenize@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-symbol@2.0.0: {}
+
+ micromark-util-types@2.0.0: {}
+
+ micromark@4.0.0:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.3.7
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.1
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-encode: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-subtokenize: 2.0.1
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mimic-function@5.0.1: {}
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minipass@3.3.6:
+ dependencies:
+ yallist: 4.0.0
+
+ minipass@4.2.8: {}
+
+ minipass@5.0.0: {}
+
+ minipass@7.1.2: {}
+
+ minizlib@2.1.2:
+ dependencies:
+ minipass: 3.3.6
+ yallist: 4.0.0
+
+ mkdirp@1.0.4: {}
+
+ mlly@1.7.2:
+ dependencies:
+ acorn: 8.14.0
+ pathe: 1.1.2
+ pkg-types: 1.2.1
+ ufo: 1.5.4
+
+ moment@2.30.1: {}
+
+ mrmime@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ muggle-string@0.4.1: {}
+
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+
+ nanoid@3.3.7: {}
+
+ nanostores@0.11.3: {}
+
+ natural-compare@1.4.0: {}
+
+ neotraverse@0.6.18: {}
+
+ nlcst-to-string@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ node-releases@2.0.18: {}
+
+ normalize-path@3.0.0: {}
+
+ normalize-range@0.1.2: {}
+
+ npm-run-path@6.0.0:
+ dependencies:
+ path-key: 4.0.0
+ unicorn-magic: 0.3.0
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ nwsapi@2.2.13: {}
+
+ object-assign@4.1.1: {}
+
+ object-hash@3.0.0: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@7.0.0:
+ dependencies:
+ mimic-function: 5.0.1
+
+ oniguruma-to-js@0.4.3:
+ dependencies:
+ regex: 4.3.3
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ ora@8.1.0:
+ dependencies:
+ chalk: 5.3.0
+ cli-cursor: 5.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 2.1.0
+ log-symbols: 6.0.0
+ stdin-discarder: 0.2.2
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-limit@6.1.0:
+ dependencies:
+ yocto-queue: 1.1.1
+
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-queue@8.0.1:
+ dependencies:
+ eventemitter3: 5.0.1
+ p-timeout: 6.1.3
+
+ p-timeout@6.1.3: {}
+
+ p-try@2.2.0: {}
+
+ package-json-from-dist@1.0.1: {}
+
+ package-manager-detector@0.2.2: {}
+
+ pagefind@1.1.1:
+ optionalDependencies:
+ '@pagefind/darwin-arm64': 1.1.1
+ '@pagefind/darwin-x64': 1.1.1
+ '@pagefind/linux-arm64': 1.1.1
+ '@pagefind/linux-x64': 1.1.1
+ '@pagefind/windows-x64': 1.1.1
+
+ pako@0.2.9: {}
+
+ pako@1.0.11: {}
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-entities@4.0.1:
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities: 2.0.2
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.0.2
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
+ parse-latin@7.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ '@types/unist': 3.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-modify-children: 4.0.0
+ unist-util-visit-children: 3.0.0
+ vfile: 6.0.3
+
+ parse-ms@4.0.0: {}
+
+ parse5-htmlparser2-tree-adapter@7.1.0:
+ dependencies:
+ domhandler: 5.0.3
+ parse5: 7.2.1
+
+ parse5-parser-stream@7.1.2:
+ dependencies:
+ parse5: 7.2.1
+
+ parse5@7.2.1:
+ dependencies:
+ entities: 4.5.0
+
+ path-browserify@1.0.1: {}
+
+ path-equal@1.2.5: {}
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ pathe@1.1.2: {}
+
+ pathval@2.0.0: {}
+
+ pend@1.2.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.2: {}
+
+ pify@2.3.0: {}
+
+ pify@4.0.1: {}
+
+ pirates@4.0.6: {}
+
+ pkg-dir@4.2.0:
+ dependencies:
+ find-up: 4.1.0
+
+ pkg-types@1.2.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.7.2
+ pathe: 1.1.2
+
+ pluralize@8.0.0: {}
+
+ postcss-import@15.1.0(postcss@8.4.47):
+ dependencies:
+ postcss: 8.4.47
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.8
+
+ postcss-js@4.0.1(postcss@8.4.47):
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.47
+
+ postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4)):
+ dependencies:
+ lilconfig: 3.1.2
+ yaml: 2.6.0
+ optionalDependencies:
+ postcss: 8.4.47
+ ts-node: 10.9.2(@types/node@16.18.115)(typescript@4.9.4)
+
+ postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)):
+ dependencies:
+ lilconfig: 3.1.2
+ yaml: 2.6.0
+ optionalDependencies:
+ postcss: 8.4.47
+ ts-node: 10.9.2(@types/node@22.8.2)(typescript@5.6.3)
+
+ postcss-nested@6.2.0(postcss@8.4.47):
+ dependencies:
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
+
+ postcss-selector-parser@6.0.10:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.4.47:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ preferred-pm@4.0.0:
+ dependencies:
+ find-up-simple: 1.0.0
+ find-yarn-workspace-root2: 1.2.16
+ which-pm: 3.0.0
+
+ prelude-ls@1.2.1: {}
+
+ prettier-plugin-astro@0.14.1:
+ dependencies:
+ '@astrojs/compiler': 2.10.3
+ prettier: 3.3.3
+ sass-formatter: 0.7.9
+
+ prettier@2.8.7:
+ optional: true
+
+ prettier@3.3.3: {}
+
+ pretty-ms@9.1.0:
+ dependencies:
+ parse-ms: 4.0.0
+
+ prismjs@1.29.0: {}
+
+ process@0.11.10: {}
+
+ prompts@2.4.2:
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+
+ property-information@6.5.0: {}
+
+ protobufjs@7.4.0:
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/base64': 1.1.2
+ '@protobufjs/codegen': 2.0.4
+ '@protobufjs/eventemitter': 1.1.0
+ '@protobufjs/fetch': 1.1.0
+ '@protobufjs/float': 1.0.2
+ '@protobufjs/inquire': 1.1.0
+ '@protobufjs/path': 1.1.2
+ '@protobufjs/pool': 1.1.0
+ '@protobufjs/utf8': 1.1.0
+ '@types/node': 22.8.2
+ long: 5.2.3
+
+ proxy-from-env@1.1.0: {}
+
+ pump@3.0.2:
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+
+ punycode@2.3.1: {}
+
+ queue-microtask@1.2.3: {}
+
+ quicktype-core@23.0.170:
+ dependencies:
+ '@glideapps/ts-necessities': 2.2.3
+ browser-or-node: 3.0.0
+ collection-utils: 1.0.1
+ cross-fetch: 4.0.0
+ is-url: 1.2.4
+ js-base64: 3.7.7
+ lodash: 4.17.21
+ pako: 1.0.11
+ pluralize: 8.0.0
+ readable-stream: 4.5.2
+ unicode-properties: 1.4.1
+ urijs: 1.19.11
+ wordwrap: 1.0.0
+ yaml: 2.6.0
+ transitivePeerDependencies:
+ - encoding
+
+ quicktype-graphql-input@23.0.170:
+ dependencies:
+ collection-utils: 1.0.1
+ graphql: 0.11.7
+ quicktype-core: 23.0.170
+ transitivePeerDependencies:
+ - encoding
+
+ quicktype-typescript-input@23.0.170:
+ dependencies:
+ '@mark.probst/typescript-json-schema': 0.55.0
+ quicktype-core: 23.0.170
+ typescript: 4.9.5
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+ - encoding
+
+ quicktype@23.0.170:
+ dependencies:
+ '@glideapps/ts-necessities': 2.3.2
+ chalk: 4.1.2
+ collection-utils: 1.0.1
+ command-line-args: 5.2.1
+ command-line-usage: 7.0.3
+ cross-fetch: 4.0.0
+ graphql: 0.11.7
+ lodash: 4.17.21
+ moment: 2.30.1
+ quicktype-core: 23.0.170
+ quicktype-graphql-input: 23.0.170
+ quicktype-typescript-input: 23.0.170
+ readable-stream: 4.5.2
+ stream-json: 1.8.0
+ string-to-stream: 3.0.1
+ typescript: 4.9.5
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+ - encoding
+
+ read-cache@1.0.0:
+ dependencies:
+ pify: 2.3.0
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readable-stream@4.5.2:
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ string_decoder: 1.3.0
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ readdirp@4.0.2: {}
+
+ recma-build-jsx@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-util-build-jsx: 3.0.1
+ vfile: 6.0.3
+
+ recma-jsx@1.0.0(acorn@8.14.0):
+ dependencies:
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ estree-util-to-js: 2.0.0
+ recma-parse: 1.0.0
+ recma-stringify: 1.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - acorn
+
+ recma-parse@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ esast-util-from-js: 2.0.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ recma-stringify@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-util-to-js: 2.0.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ regenerator-runtime@0.14.1: {}
+
+ regex@4.3.3: {}
+
+ rehype-expressive-code@0.35.6:
+ dependencies:
+ expressive-code: 0.35.6
+
+ rehype-format@5.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-format: 1.1.0
+
+ rehype-parse@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-from-html: 2.0.3
+ unified: 11.0.5
+
+ rehype-raw@7.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-raw: 9.0.4
+ vfile: 6.0.3
+
+ rehype-recma@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/hast': 3.0.4
+ hast-util-to-estree: 3.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ rehype-stringify@10.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.3
+ unified: 11.0.5
+
+ rehype@13.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ rehype-parse: 9.0.1
+ rehype-stringify: 10.0.1
+ unified: 11.0.5
+
+ remark-directive@3.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-directive: 3.0.0
+ micromark-extension-directive: 3.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-gfm@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.0.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-mdx@3.1.0:
+ dependencies:
+ mdast-util-mdx: 3.0.0
+ micromark-extension-mdxjs: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-parse@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ micromark-util-types: 2.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-rehype@11.1.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ remark-smartypants@3.0.2:
+ dependencies:
+ retext: 9.0.0
+ retext-smartypants: 6.2.0
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+
+ remark-stringify@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.0
+ unified: 11.0.5
+
+ request-light@0.5.8: {}
+
+ request-light@0.7.0: {}
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve@1.22.8:
+ dependencies:
+ is-core-module: 2.15.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ restore-cursor@5.1.0:
+ dependencies:
+ onetime: 7.0.0
+ signal-exit: 4.1.0
+
+ retext-latin@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ parse-latin: 7.0.0
+ unified: 11.0.5
+
+ retext-smartypants@6.2.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-visit: 5.0.0
+
+ retext-stringify@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unified: 11.0.5
+
+ retext@9.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ retext-latin: 4.0.0
+ retext-stringify: 4.0.0
+ unified: 11.0.5
+
+ reusify@1.0.4: {}
+
+ rollup@4.24.2:
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.24.2
+ '@rollup/rollup-android-arm64': 4.24.2
+ '@rollup/rollup-darwin-arm64': 4.24.2
+ '@rollup/rollup-darwin-x64': 4.24.2
+ '@rollup/rollup-freebsd-arm64': 4.24.2
+ '@rollup/rollup-freebsd-x64': 4.24.2
+ '@rollup/rollup-linux-arm-gnueabihf': 4.24.2
+ '@rollup/rollup-linux-arm-musleabihf': 4.24.2
+ '@rollup/rollup-linux-arm64-gnu': 4.24.2
+ '@rollup/rollup-linux-arm64-musl': 4.24.2
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.24.2
+ '@rollup/rollup-linux-riscv64-gnu': 4.24.2
+ '@rollup/rollup-linux-s390x-gnu': 4.24.2
+ '@rollup/rollup-linux-x64-gnu': 4.24.2
+ '@rollup/rollup-linux-x64-musl': 4.24.2
+ '@rollup/rollup-win32-arm64-msvc': 4.24.2
+ '@rollup/rollup-win32-ia32-msvc': 4.24.2
+ '@rollup/rollup-win32-x64-msvc': 4.24.2
+ fsevents: 2.3.3
+
+ rrweb-cssom@0.7.1: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ s.color@0.0.15: {}
+
+ safe-buffer@5.2.1: {}
+
+ safe-stable-stringify@2.5.0: {}
+
+ safer-buffer@2.1.2: {}
+
+ sass-formatter@0.7.9:
+ dependencies:
+ suf-log: 2.5.3
+
+ sax@1.4.1: {}
+
+ saxes@6.0.0:
+ dependencies:
+ xmlchars: 2.2.0
+
+ section-matter@1.0.0:
+ dependencies:
+ extend-shallow: 2.0.1
+ kind-of: 6.0.3
+
+ semver@6.3.1: {}
+
+ semver@7.6.3: {}
+
+ seroval-plugins@1.1.1(seroval@1.1.1):
+ dependencies:
+ seroval: 1.1.1
+
+ seroval@1.1.1: {}
+
+ sharp@0.33.5:
+ dependencies:
+ color: 4.2.3
+ detect-libc: 2.0.3
+ semver: 7.6.3
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.33.5
+ '@img/sharp-darwin-x64': 0.33.5
+ '@img/sharp-libvips-darwin-arm64': 1.0.4
+ '@img/sharp-libvips-darwin-x64': 1.0.4
+ '@img/sharp-libvips-linux-arm': 1.0.5
+ '@img/sharp-libvips-linux-arm64': 1.0.4
+ '@img/sharp-libvips-linux-s390x': 1.0.4
+ '@img/sharp-libvips-linux-x64': 1.0.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.0.4
+ '@img/sharp-linux-arm': 0.33.5
+ '@img/sharp-linux-arm64': 0.33.5
+ '@img/sharp-linux-s390x': 0.33.5
+ '@img/sharp-linux-x64': 0.33.5
+ '@img/sharp-linuxmusl-arm64': 0.33.5
+ '@img/sharp-linuxmusl-x64': 0.33.5
+ '@img/sharp-wasm32': 0.33.5
+ '@img/sharp-win32-ia32': 0.33.5
+ '@img/sharp-win32-x64': 0.33.5
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ shiki@1.22.2:
+ dependencies:
+ '@shikijs/core': 1.22.2
+ '@shikijs/engine-javascript': 1.22.2
+ '@shikijs/engine-oniguruma': 1.22.2
+ '@shikijs/types': 1.22.2
+ '@shikijs/vscode-textmate': 9.3.0
+ '@types/hast': 3.0.4
+
+ siginfo@2.0.0: {}
+
+ signal-exit@4.1.0: {}
+
+ simple-swizzle@0.2.2:
+ dependencies:
+ is-arrayish: 0.3.2
+
+ sisteransi@1.0.5: {}
+
+ sitemap@8.0.0:
+ dependencies:
+ '@types/node': 17.0.45
+ '@types/sax': 1.2.7
+ arg: 5.0.2
+ sax: 1.4.1
+
+ solid-devtools@0.30.1(solid-js@1.9.3)(vite@5.4.10(@types/node@16.18.115)):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ '@solid-devtools/debugger': 0.23.4(solid-js@1.9.3)
+ '@solid-devtools/shared': 0.13.2(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optionalDependencies:
+ vite: 5.4.10(@types/node@16.18.115)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ solid-devtools@0.30.1(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2)):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ '@solid-devtools/debugger': 0.23.4(solid-js@1.9.3)
+ '@solid-devtools/shared': 0.13.2(solid-js@1.9.3)
+ solid-js: 1.9.3
+ optionalDependencies:
+ vite: 5.4.10(@types/node@22.8.2)
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ solid-icons@1.1.0(solid-js@1.9.3):
+ dependencies:
+ solid-js: 1.9.3
+
+ solid-js@1.9.3:
+ dependencies:
+ csstype: 3.1.3
+ seroval: 1.1.1
+ seroval-plugins: 1.1.1(seroval@1.1.1)
+
+ solid-presence@0.1.8(solid-js@1.9.3):
+ dependencies:
+ '@corvu/utils': 0.4.2(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ solid-prevent-scroll@0.1.10(solid-js@1.9.3):
+ dependencies:
+ '@corvu/utils': 0.4.2(solid-js@1.9.3)
+ solid-js: 1.9.3
+
+ solid-refresh@0.6.3(solid-js@1.9.3):
+ dependencies:
+ '@babel/generator': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/types': 7.26.0
+ solid-js: 1.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ source-map-js@1.2.1: {}
+
+ source-map@0.7.4: {}
+
+ space-separated-tokens@2.0.2: {}
+
+ sprintf-js@1.0.3: {}
+
+ stackback@0.0.2: {}
+
+ std-env@3.7.0: {}
+
+ stdin-discarder@0.2.2: {}
+
+ stream-chain@2.2.5: {}
+
+ stream-json@1.8.0:
+ dependencies:
+ stream-chain: 2.2.5
+
+ stream-replace-string@2.0.0: {}
+
+ string-to-stream@3.0.1:
+ dependencies:
+ readable-stream: 3.6.2
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.4.0
+ get-east-asian-width: 1.3.0
+ strip-ansi: 7.1.0
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.1.0
+
+ strip-bom-string@1.0.0: {}
+
+ strip-bom@3.0.0: {}
+
+ strip-final-newline@4.0.0: {}
+
+ strip-json-comments@3.1.1: {}
+
+ style-mod@4.1.2: {}
+
+ style-to-object@0.4.4:
+ dependencies:
+ inline-style-parser: 0.1.1
+
+ style-to-object@1.0.8:
+ dependencies:
+ inline-style-parser: 0.2.4
+
+ sucrase@3.35.0:
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ commander: 4.1.1
+ glob: 10.4.5
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.6
+ ts-interface-checker: 0.1.13
+
+ suf-log@2.5.3:
+ dependencies:
+ s.color: 0.0.15
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ svgo@3.3.2:
+ dependencies:
+ '@trysound/sax': 0.2.0
+ commander: 7.2.0
+ css-select: 5.1.0
+ css-tree: 2.3.1
+ css-what: 6.1.0
+ csso: 5.0.5
+ picocolors: 1.1.1
+
+ symbol-tree@3.2.4: {}
+
+ table-layout@4.1.1:
+ dependencies:
+ array-back: 6.2.2
+ wordwrapjs: 5.1.0
+
+ tailwind-merge@2.5.4: {}
+
+ tailwindcss-animate@1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))):
+ dependencies:
+ tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+
+ tailwindcss@3.4.14(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4)):
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ arg: 5.0.2
+ chokidar: 3.6.0
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.2
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.6
+ lilconfig: 2.1.0
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.4.47
+ postcss-import: 15.1.0(postcss@8.4.47)
+ postcss-js: 4.0.1(postcss@8.4.47)
+ postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4))
+ postcss-nested: 6.2.0(postcss@8.4.47)
+ postcss-selector-parser: 6.1.2
+ resolve: 1.22.8
+ sucrase: 3.35.0
+ transitivePeerDependencies:
+ - ts-node
+
+ tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3)):
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ arg: 5.0.2
+ chokidar: 3.6.0
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.2
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.6
+ lilconfig: 2.1.0
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.4.47
+ postcss-import: 15.1.0(postcss@8.4.47)
+ postcss-js: 4.0.1(postcss@8.4.47)
+ postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))
+ postcss-nested: 6.2.0(postcss@8.4.47)
+ postcss-selector-parser: 6.1.2
+ resolve: 1.22.8
+ sucrase: 3.35.0
+ transitivePeerDependencies:
+ - ts-node
+
+ tar@6.2.1:
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 5.0.0
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+
+ text-table@0.2.0: {}
+
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
+ tiny-inflate@1.0.3: {}
+
+ tinybench@2.9.0: {}
+
+ tinybench@3.0.0: {}
+
+ tinyexec@0.3.1: {}
+
+ tinypool@1.0.1: {}
+
+ tinyrainbow@1.2.0: {}
+
+ tinyspy@3.0.2: {}
+
+ tldts-core@6.1.57: {}
+
+ tldts@6.1.57:
+ dependencies:
+ tldts-core: 6.1.57
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ tough-cookie@5.0.0:
+ dependencies:
+ tldts: 6.1.57
+
+ tr46@0.0.3: {}
+
+ tr46@5.0.0:
+ dependencies:
+ punycode: 2.3.1
+
+ trim-lines@3.0.1: {}
+
+ trough@2.2.0: {}
+
+ ts-api-utils@1.3.0(typescript@5.6.3):
+ dependencies:
+ typescript: 5.6.3
+
+ ts-interface-checker@0.1.13: {}
+
+ ts-node@10.9.2(@types/node@16.18.115)(typescript@4.9.4):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 16.18.115
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 4.9.4
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+
+ ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 22.8.2
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.6.3
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ optional: true
+
+ ts-poet@6.9.0:
+ dependencies:
+ dprint-node: 1.0.8
+
+ ts-proto-descriptors@2.0.0:
+ dependencies:
+ '@bufbuild/protobuf': 2.2.1
+
+ ts-proto@2.2.5:
+ dependencies:
+ '@bufbuild/protobuf': 2.2.1
+ case-anything: 2.1.13
+ ts-poet: 6.9.0
+ ts-proto-descriptors: 2.0.0
+
+ tsconfck@3.1.4(typescript@4.9.4):
+ optionalDependencies:
+ typescript: 4.9.4
+
+ tsconfck@3.1.4(typescript@5.6.3):
+ optionalDependencies:
+ typescript: 5.6.3
+
+ tslib@2.8.0: {}
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-fest@4.26.1: {}
+
+ typesafe-path@0.2.2: {}
+
+ typescript-auto-import-cache@0.3.5:
+ dependencies:
+ semver: 7.6.3
+
+ typescript-eslint@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.12.1(@typescript-eslint/parser@8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+ '@typescript-eslint/parser': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.12.1(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+
+ typescript@4.9.4: {}
+
+ typescript@4.9.5: {}
+
+ typescript@5.6.3: {}
+
+ typical@4.0.0: {}
+
+ typical@7.2.0: {}
+
+ ufo@1.5.4: {}
+
+ undici-types@6.19.8: {}
+
+ undici@6.20.1: {}
+
+ unicode-properties@1.4.1:
+ dependencies:
+ base64-js: 1.5.1
+ unicode-trie: 2.0.0
+
+ unicode-trie@2.0.0:
+ dependencies:
+ pako: 0.2.9
+ tiny-inflate: 1.0.3
+
+ unicorn-magic@0.3.0: {}
+
+ unified@11.0.5:
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ unist-util-find-after@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
+ unist-util-is@6.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-modify-children@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ array-iterate: 2.0.1
+
+ unist-util-position-from-estree@2.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-remove-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.0.0
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-children@3.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
+ unist-util-visit@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ update-browserslist-db@1.1.1(browserslist@4.24.2):
+ dependencies:
+ browserslist: 4.24.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ urijs@1.19.11: {}
+
+ util-deprecate@1.0.2: {}
+
+ uuid@11.0.2: {}
+
+ v8-compile-cache-lib@3.0.1: {}
+
+ valid-filename@4.0.0:
+ dependencies:
+ filename-reserved-regex: 3.0.0
+
+ validate-html-nesting@1.2.2: {}
+
+ vfile-location@5.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+
+ vfile-message@4.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.2
+
+ vite-node@2.1.4(@types/node@22.8.2):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.3.7
+ pathe: 1.1.2
+ vite: 5.4.10(@types/node@22.8.2)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ vite-plugin-solid@2.10.2(solid-js@1.9.3)(vite@5.4.10(@types/node@16.18.115)):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@types/babel__core': 7.20.5
+ babel-preset-solid: 1.9.3(@babel/core@7.26.0)
+ merge-anything: 5.1.7
+ solid-js: 1.9.3
+ solid-refresh: 0.6.3(solid-js@1.9.3)
+ vite: 5.4.10(@types/node@16.18.115)
+ vitefu: 0.2.5(vite@5.4.10(@types/node@16.18.115))
+ transitivePeerDependencies:
+ - supports-color
+
+ vite-plugin-solid@2.10.2(solid-js@1.9.3)(vite@5.4.10(@types/node@22.8.2)):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@types/babel__core': 7.20.5
+ babel-preset-solid: 1.9.3(@babel/core@7.26.0)
+ merge-anything: 5.1.7
+ solid-js: 1.9.3
+ solid-refresh: 0.6.3(solid-js@1.9.3)
+ vite: 5.4.10(@types/node@22.8.2)
+ vitefu: 0.2.5(vite@5.4.10(@types/node@22.8.2))
+ transitivePeerDependencies:
+ - supports-color
+
+ vite-tsconfig-paths@5.0.1(typescript@5.6.3)(vite@5.4.10(@types/node@22.8.2)):
+ dependencies:
+ debug: 4.3.7
+ globrex: 0.1.2
+ tsconfck: 3.1.4(typescript@5.6.3)
+ optionalDependencies:
+ vite: 5.4.10(@types/node@22.8.2)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ vite@5.4.10(@types/node@16.18.115):
+ dependencies:
+ esbuild: 0.21.5
+ postcss: 8.4.47
+ rollup: 4.24.2
+ optionalDependencies:
+ '@types/node': 16.18.115
+ fsevents: 2.3.3
+
+ vite@5.4.10(@types/node@22.8.2):
+ dependencies:
+ esbuild: 0.21.5
+ postcss: 8.4.47
+ rollup: 4.24.2
+ optionalDependencies:
+ '@types/node': 22.8.2
+ fsevents: 2.3.3
+
+ vitefu@0.2.5(vite@5.4.10(@types/node@16.18.115)):
+ optionalDependencies:
+ vite: 5.4.10(@types/node@16.18.115)
+
+ vitefu@0.2.5(vite@5.4.10(@types/node@22.8.2)):
+ optionalDependencies:
+ vite: 5.4.10(@types/node@22.8.2)
+
+ vitefu@1.0.3(vite@5.4.10(@types/node@16.18.115)):
+ optionalDependencies:
+ vite: 5.4.10(@types/node@16.18.115)
+
+ vitefu@1.0.3(vite@5.4.10(@types/node@22.8.2)):
+ optionalDependencies:
+ vite: 5.4.10(@types/node@22.8.2)
+
+ vitest@2.1.4(@types/node@22.8.2)(happy-dom@15.7.4)(jsdom@25.0.1):
+ dependencies:
+ '@vitest/expect': 2.1.4
+ '@vitest/mocker': 2.1.4(vite@5.4.10(@types/node@22.8.2))
+ '@vitest/pretty-format': 2.1.4
+ '@vitest/runner': 2.1.4
+ '@vitest/snapshot': 2.1.4
+ '@vitest/spy': 2.1.4
+ '@vitest/utils': 2.1.4
+ chai: 5.1.2
+ debug: 4.3.7
+ expect-type: 1.1.0
+ magic-string: 0.30.12
+ pathe: 1.1.2
+ std-env: 3.7.0
+ tinybench: 2.9.0
+ tinyexec: 0.3.1
+ tinypool: 1.0.1
+ tinyrainbow: 1.2.0
+ vite: 5.4.10(@types/node@22.8.2)
+ vite-node: 2.1.4(@types/node@22.8.2)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/node': 22.8.2
+ happy-dom: 15.7.4
+ jsdom: 25.0.1
+ transitivePeerDependencies:
+ - less
+ - lightningcss
+ - msw
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ volar-service-css@0.0.62(@volar/language-service@2.4.8):
+ dependencies:
+ vscode-css-languageservice: 6.3.1
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-uri: 3.0.8
+ optionalDependencies:
+ '@volar/language-service': 2.4.8
+
+ volar-service-emmet@0.0.62(@volar/language-service@2.4.8):
+ dependencies:
+ '@emmetio/css-parser': 0.4.0
+ '@emmetio/html-matcher': 1.3.0
+ '@vscode/emmet-helper': 2.9.3
+ vscode-uri: 3.0.8
+ optionalDependencies:
+ '@volar/language-service': 2.4.8
+
+ volar-service-html@0.0.62(@volar/language-service@2.4.8):
+ dependencies:
+ vscode-html-languageservice: 5.3.1
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-uri: 3.0.8
+ optionalDependencies:
+ '@volar/language-service': 2.4.8
+
+ volar-service-prettier@0.0.62(@volar/language-service@2.4.8)(prettier@3.3.3):
+ dependencies:
+ vscode-uri: 3.0.8
+ optionalDependencies:
+ '@volar/language-service': 2.4.8
+ prettier: 3.3.3
+
+ volar-service-typescript-twoslash-queries@0.0.62(@volar/language-service@2.4.8):
+ dependencies:
+ vscode-uri: 3.0.8
+ optionalDependencies:
+ '@volar/language-service': 2.4.8
+
+ volar-service-typescript@0.0.62(@volar/language-service@2.4.8):
+ dependencies:
+ path-browserify: 1.0.1
+ semver: 7.6.3
+ typescript-auto-import-cache: 0.3.5
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-nls: 5.2.0
+ vscode-uri: 3.0.8
+ optionalDependencies:
+ '@volar/language-service': 2.4.8
+
+ volar-service-yaml@0.0.62(@volar/language-service@2.4.8):
+ dependencies:
+ vscode-uri: 3.0.8
+ yaml-language-server: 1.15.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.8
+
+ vscode-css-languageservice@6.3.1:
+ dependencies:
+ '@vscode/l10n': 0.0.18
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-languageserver-types: 3.17.5
+ vscode-uri: 3.0.8
+
+ vscode-html-languageservice@5.3.1:
+ dependencies:
+ '@vscode/l10n': 0.0.18
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-languageserver-types: 3.17.5
+ vscode-uri: 3.0.8
+
+ vscode-json-languageservice@4.1.8:
+ dependencies:
+ jsonc-parser: 3.3.1
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-languageserver-types: 3.17.5
+ vscode-nls: 5.2.0
+ vscode-uri: 3.0.8
+
+ vscode-jsonrpc@6.0.0: {}
+
+ vscode-jsonrpc@8.2.0: {}
+
+ vscode-languageserver-protocol@3.16.0:
+ dependencies:
+ vscode-jsonrpc: 6.0.0
+ vscode-languageserver-types: 3.16.0
+
+ vscode-languageserver-protocol@3.17.5:
+ dependencies:
+ vscode-jsonrpc: 8.2.0
+ vscode-languageserver-types: 3.17.5
+
+ vscode-languageserver-textdocument@1.0.12: {}
+
+ vscode-languageserver-types@3.16.0: {}
+
+ vscode-languageserver-types@3.17.5: {}
+
+ vscode-languageserver@7.0.0:
+ dependencies:
+ vscode-languageserver-protocol: 3.16.0
+
+ vscode-languageserver@9.0.1:
+ dependencies:
+ vscode-languageserver-protocol: 3.17.5
+
+ vscode-nls@5.2.0: {}
+
+ vscode-uri@2.1.2: {}
+
+ vscode-uri@3.0.8: {}
+
+ w3c-keyname@2.2.8: {}
+
+ w3c-xmlserializer@5.0.0:
+ dependencies:
+ xml-name-validator: 5.0.0
+
+ web-namespaces@2.0.1: {}
+
+ webidl-conversions@3.0.1: {}
+
+ webidl-conversions@7.0.0: {}
+
+ whatwg-encoding@3.1.1:
+ dependencies:
+ iconv-lite: 0.6.3
+
+ whatwg-mimetype@3.0.0:
+ optional: true
+
+ whatwg-mimetype@4.0.0: {}
+
+ whatwg-url@14.0.0:
+ dependencies:
+ tr46: 5.0.0
+ webidl-conversions: 7.0.0
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which-pm-runs@1.1.0: {}
+
+ which-pm@3.0.0:
+ dependencies:
+ load-yaml-file: 0.2.0
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ why-is-node-running@2.3.0:
+ dependencies:
+ siginfo: 2.0.0
+ stackback: 0.0.2
+
+ widest-line@5.0.0:
+ dependencies:
+ string-width: 7.2.0
+
+ word-wrap@1.2.5: {}
+
+ wordwrap@1.0.0: {}
+
+ wordwrapjs@5.1.0: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+
+ wrap-ansi@9.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
+ wrappy@1.0.2: {}
+
+ ws@8.18.0: {}
+
+ xml-name-validator@5.0.0: {}
+
+ xmlchars@2.2.0: {}
+
+ xxhash-wasm@1.0.2: {}
+
+ y18n@5.0.8: {}
+
+ yallist@3.1.1: {}
+
+ yallist@4.0.0: {}
+
+ yaml-language-server@1.15.0:
+ dependencies:
+ ajv: 8.17.1
+ lodash: 4.17.21
+ request-light: 0.5.8
+ vscode-json-languageservice: 4.1.8
+ vscode-languageserver: 7.0.0
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-languageserver-types: 3.17.5
+ vscode-nls: 5.2.0
+ vscode-uri: 3.0.8
+ yaml: 2.2.2
+ optionalDependencies:
+ prettier: 2.8.7
+
+ yaml@2.2.2: {}
+
+ yaml@2.6.0: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+
+ yauzl@2.10.0:
+ dependencies:
+ buffer-crc32: 0.2.13
+ fd-slicer: 1.1.0
+
+ yn@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
+
+ yocto-queue@1.1.1: {}
+
+ yoctocolors@2.1.1: {}
+
+ zod-to-json-schema@3.23.5(zod@3.23.8):
+ dependencies:
+ zod: 3.23.8
+
+ zod-to-ts@1.2.0(typescript@4.9.4)(zod@3.23.8):
+ dependencies:
+ typescript: 4.9.4
+ zod: 3.23.8
+
+ zod-to-ts@1.2.0(typescript@5.6.3)(zod@3.23.8):
+ dependencies:
+ typescript: 5.6.3
+ zod: 3.23.8
+
+ zod@3.23.8: {}
+
+ zwitch@2.0.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 0000000..1e64cda
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,10 @@
+packages:
+ - 'client/trailbase-ts'
+ - 'docs'
+ - 'ui/admin'
+ - 'ui/auth'
+ - 'examples/blog/web'
+ - 'examples/tutorial/scripts'
+options:
+ prefer-workspace-packages: true
+ strict-peer-dependencies: true
diff --git a/proto/config.proto b/proto/config.proto
new file mode 100644
index 0000000..fe898db
--- /dev/null
+++ b/proto/config.proto
@@ -0,0 +1,185 @@
+syntax = "proto2";
+
+import "google/protobuf/descriptor.proto";
+
+package config;
+
+extend google.protobuf.FieldOptions { optional bool secret = 50000; }
+
+message EmailTemplate {
+ optional string subject = 1;
+ optional string body = 2;
+}
+
+message EmailConfig {
+ optional string smtp_host = 1;
+ optional uint32 smtp_port = 2;
+ optional string smtp_username = 3;
+ optional string smtp_password = 4 [ (secret) = true ];
+
+ optional string sender_name = 11;
+ optional string sender_address = 12;
+
+ optional EmailTemplate user_verification_template = 21;
+ optional EmailTemplate password_reset_template = 22;
+ optional EmailTemplate change_email_template = 23;
+}
+
+enum OAuthProviderId {
+ OAUTH_PROVIDER_ID_UNDEFINED = 0;
+ CUSTOM = 1;
+ DISCORD = 10;
+ GITLAB = 11;
+ GOOGLE = 12;
+}
+
+message OAuthProviderConfig {
+ optional string client_id = 1;
+ optional string client_secret = 2 [ (secret) = true ];
+ optional OAuthProviderId provider_id = 3;
+
+ optional string display_name = 11;
+ optional string auth_url = 12;
+ optional string token_url = 13;
+ optional string user_api_url = 14;
+ optional bool pkce = 15;
+}
+
+message AuthConfig {
+ optional int64 auth_token_ttl_sec = 1;
+ optional int64 refresh_token_ttl_sec = 2;
+
+ map oauth_providers = 11;
+}
+
+message ServerConfig {
+ /// Application name presented to users, e.g. when sending emails. Default:
+ /// "TrailBase".
+ optional string application_name = 1;
+
+ /// Your final, deployed URL. This url is used to build canonical urls
+ /// for emails, OAuth redirects, ... . Default: "http://localhost:4000".
+ optional string site_url = 2;
+
+ /// Max age of logs that will be retained during period logs cleanup. Note
+ /// that this implies that some older logs may persist until the cleanup job
+ /// reruns. Default: 7 days.
+ optional int64 logs_retention_sec = 11;
+
+ /// Interval at which backups are persisted. Setting it to 0 will disable
+ /// backups. Default: 0.
+ optional int64 backup_interval_sec = 12;
+}
+
+/// Sqlite specific (as opposed to standard SQL) constrained-violation
+/// resolution strategy upon insert.
+enum ConflictResolutionStrategy {
+ CONFLICT_RESOLUTION_STRATEGY_UNDEFINED = 0;
+ /// SQL default: Keep transaction open and abort the current statement.
+ ABORT = 1;
+ /// Abort entire transaction.
+ ROLLBACK = 2;
+ /// Similar to Abort but doesn't roll back the current statement, i.e. if the
+ /// current statement affects multiple rows, changes by that statement prior
+ /// to the failure are not rolled back.
+ FAIL = 3;
+ /// Skip the statement and continue.
+ IGNORE = 4;
+ /// Replaces the conflicting row in case of a collision (e.g. unique
+ /// constraint).
+ REPLACE = 5;
+}
+
+enum PermissionFlag {
+ PERMISSION_FLAG_UNDEFINED = 0;
+
+ // Database record insert.
+ CREATE = 1;
+ // Database record read/list, i.e. select.
+ READ = 2;
+ // Database record update.
+ UPDATE = 4;
+ // Database record delete.
+ DELETE = 8;
+ /// Lookup JSON schema for the given record api .
+ SCHEMA = 16;
+}
+
+message RecordApiConfig {
+ optional string name = 1;
+ optional string table_name = 2;
+
+ optional ConflictResolutionStrategy conflict_resolution = 5;
+ optional bool autofill_missing_user_id_columns = 6;
+
+ // Access control lists.
+ repeated PermissionFlag acl_world = 7;
+ repeated PermissionFlag acl_authenticated = 8;
+
+ optional string create_access_rule = 11;
+ optional string read_access_rule = 12;
+ optional string update_access_rule = 13;
+ optional string delete_access_rule = 14;
+ optional string schema_access_rule = 15;
+}
+
+enum QueryApiParameterType {
+ TEXT = 1;
+ BLOB = 2;
+ INTEGER = 3;
+ REAL = 4;
+}
+
+message QueryApiParameter {
+ optional string name = 1;
+ optional QueryApiParameterType type = 2;
+}
+
+enum QueryApiAcl {
+ QUERY_API_ACL_UNDEFINED = 0;
+ WORLD = 1;
+ AUTHENTICATED = 2;
+}
+
+/// Configuration schema for Query APIs.
+///
+/// Note that unlike record APIs, query APIs are read-only,
+/// which simplifies authorization.
+/// That said, query APIs are backed by virtual tables, thus in theory, they
+/// could allow writes (unlike views) in the future for module implementations
+/// that allow it such as SQLite's R*-tree.
+message QueryApiConfig {
+ optional string name = 1;
+ optional string virtual_table_name = 2;
+
+ /// Query parameters the Query API will accept and forward to the virtual
+ /// table (function) as argument expressions.
+ repeated QueryApiParameter params = 3;
+
+
+ // Read access control.
+ optional QueryApiAcl acl = 8;
+ optional string access_rule = 9;
+
+ // TODO: We might want to consider requiring or allowing to specify an
+ // optional JSON schema for query APIs to allow generating client bindings.
+}
+
+message JsonSchemaConfig {
+ optional string name = 1;
+ optional string schema = 2;
+}
+
+message Config {
+ // NOTE: These top-level fields currently have to be `required` due to the
+ // overly simple approach on how we do config merging (from env vars and
+ // vault).
+ required EmailConfig email = 2;
+ required ServerConfig server = 3;
+ required AuthConfig auth = 4;
+
+ repeated RecordApiConfig record_apis = 11;
+ repeated QueryApiConfig query_apis = 12;
+
+ repeated JsonSchemaConfig schemas = 21;
+}
diff --git a/proto/config_api.proto b/proto/config_api.proto
new file mode 100644
index 0000000..2f75854
--- /dev/null
+++ b/proto/config_api.proto
@@ -0,0 +1,16 @@
+syntax = "proto2";
+
+import "config.proto";
+
+package config;
+
+
+message GetConfigResponse {
+ optional Config config = 1;
+ optional string hash = 2;
+}
+
+message UpdateConfigRequest {
+ optional Config config = 1;
+ optional string hash = 2;
+}
diff --git a/proto/vault.proto b/proto/vault.proto
new file mode 100644
index 0000000..152b2fc
--- /dev/null
+++ b/proto/vault.proto
@@ -0,0 +1,7 @@
+syntax = "proto2";
+
+package config;
+
+message Vault {
+ map secrets = 1;
+}
diff --git a/trailbase-cli/Cargo.toml b/trailbase-cli/Cargo.toml
new file mode 100644
index 0000000..6e78685
--- /dev/null
+++ b/trailbase-cli/Cargo.toml
@@ -0,0 +1,27 @@
+[package]
+name = "trailbase-cli"
+version = "0.1.0"
+edition = "2021"
+
+[[bin]]
+name = "trail"
+
+[features]
+openapi = ["dep:utoipa", "dep:utoipa-swagger-ui"]
+
+[dependencies]
+axum = { version = "^0.7.5", features=["multipart"] }
+chrono = "^0.4.38"
+clap = { version = "^4.4.11", features=["derive", "env"] }
+env_logger = "^0.11.3"
+trailbase-core = { path = "../trailbase-core" }
+libsql = { workspace = true }
+log = "^0.4.21"
+mimalloc = { version = "^0.1.41", default-features = false }
+serde = { version = "^1.0.203", features = ["derive"] }
+serde_json = "^1.0.117"
+tokio = { version = "^1.38.0", features=["macros", "rt-multi-thread", "fs", "signal"] }
+tracing-subscriber = "0.3.18"
+utoipa = { version = "5.0.0-beta.0", features = ["axum_extras"], optional = true }
+utoipa-swagger-ui = { version = "8.0.1", features = ["axum"], optional = true }
+uuid = { version = "^1.8.0", features = ["v4", "serde"] }
diff --git a/trailbase-cli/src/args.rs b/trailbase-cli/src/args.rs
new file mode 100644
index 0000000..ffc04fa
--- /dev/null
+++ b/trailbase-cli/src/args.rs
@@ -0,0 +1,188 @@
+use clap::{Args, Parser, Subcommand, ValueEnum};
+
+use trailbase_core::api::JsonSchemaMode;
+use trailbase_core::DataDir;
+use trailbase_core::ServerOptions;
+
+#[derive(ValueEnum, Clone, Copy, Debug)]
+pub enum JsonSchemaModeArg {
+ /// Insert mode.
+ Insert,
+ /// Read/Select mode.
+ Select,
+ /// Update mode.
+ Update,
+}
+
+impl From for JsonSchemaMode {
+ fn from(value: JsonSchemaModeArg) -> Self {
+ match value {
+ JsonSchemaModeArg::Insert => Self::Insert,
+ JsonSchemaModeArg::Select => Self::Select,
+ JsonSchemaModeArg::Update => Self::Update,
+ }
+ }
+}
+
+/// Command line arguments for TrailBase's CLI.
+///
+/// NOTE: a good rule of thumb for thinking of proto config vs CLI options: if it requires a
+/// server restart, it should probably be a CLI option and a config option otherwise.
+#[derive(Parser, Debug, Clone, Default)]
+#[command(version, about, long_about = None)]
+pub struct DefaultCommandLineArgs {
+ /// Directory for runtime files including the database. Will be created by TrailBase if dir
+ /// doesn't exist.
+ #[arg(long, env, default_value = DataDir::DEFAULT)]
+ pub data_dir: std::path::PathBuf,
+
+ #[command(subcommand)]
+ pub cmd: Option,
+}
+
+#[derive(Subcommand, Debug, Clone)]
+pub enum SubCommands {
+ /// Starts the HTTP server.
+ Run(ServerArgs),
+ /// Export JSON Schema definitions.
+ Schema(JsonSchemaArgs),
+ #[cfg(feature = "openapi")]
+ /// Export OpenAPI definitions.
+ OpenApi {
+ #[command(subcommand)]
+ cmd: Option,
+ },
+ /// Creates new empty migration file.
+ Migration {
+ /// Optional suffix used for the generated migration file: U__.sql.
+ suffix: Option,
+ },
+ /// Simple admin management (use dashboard for everything else).
+ Admin {
+ #[command(subcommand)]
+ cmd: Option,
+ },
+ /// Simple user management (use dashboard for everything else).
+ User {
+ #[command(subcommand)]
+ cmd: Option,
+ },
+ /// Programmatically send emails.
+ Email(EmailArgs),
+}
+
+#[derive(Args, Clone, Debug)]
+pub struct ServerArgs {
+ /// Address the HTTP server binds to (Default: localhost:4000).
+ #[arg(short, long, env, default_value = "127.0.0.1:4000")]
+ address: String,
+
+ #[arg(long, env)]
+ admin_address: Option,
+
+ /// Optional path to static assets that will be served at the HTTP root.
+ #[arg(long, env)]
+ public_dir: Option,
+
+ /// Sets CORS policies to permissive in order to allow cross-origin requests
+ /// when developing the UI using a separate dev server.
+ #[arg(long)]
+ pub dev: bool,
+
+ #[arg(long, default_value_t = false)]
+ pub stderr_logging: bool,
+
+ /// Disable the built-in public authentication (login, logout, ...) UI.
+ #[arg(long, default_value_t = false)]
+ disable_auth_ui: bool,
+
+ /// Limit the set of allowed origins the HTTP server will answer to.
+ #[arg(long, default_value = "*")]
+ cors_allowed_origins: Vec,
+}
+
+#[derive(Args, Clone, Debug)]
+pub struct JsonSchemaArgs {
+ /// Name of the table to infer the JSON Schema from.
+ pub table: String,
+
+ /// Use-case for the type that determines which columns/fields will be required [Default:
+ /// Insert].
+ #[arg(long, env)]
+ pub mode: Option,
+}
+
+#[derive(Args, Clone, Debug)]
+pub struct EmailArgs {
+ /// Receiver address, e.g. foo@bar.baz.
+ #[arg(long, env)]
+ pub to: String,
+
+ /// Subject line of the email to be sent.
+ #[arg(long, env)]
+ pub subject: String,
+
+ /// Email body, i.e. the actual message.
+ #[arg(long, env)]
+ pub body: String,
+}
+
+#[cfg(feature = "openapi")]
+#[derive(Subcommand, Debug, Clone)]
+pub enum OpenApiSubCommands {
+ Print,
+ Run {
+ #[arg(long, default_value_t = 4004)]
+ port: u16,
+ },
+}
+
+#[derive(Subcommand, Debug, Clone)]
+pub enum AdminSubCommands {
+ /// Lists admin users.
+ List,
+ /// Demotes admin user to normal user.
+ Demote {
+ /// E-mail of the admin who's demoted.
+ email: String,
+ },
+ /// Promotes user to admin.
+ Promote {
+ /// E-mail of the user who's promoted to admin.
+ email: String,
+ },
+}
+
+#[derive(Subcommand, Debug, Clone)]
+pub enum UserSubCommands {
+ // TODO: create new user. Low prio, use dashboard.
+ /// Resets a users password.
+ ResetPassword {
+ /// E-mail of the user who's password is being reset.
+ email: String,
+ /// Password to set.
+ password: String,
+ },
+ /// Mint auth tokens for the given user.
+ MintToken { email: String },
+}
+
+impl TryFrom for ServerOptions {
+ type Error = &'static str;
+
+ fn try_from(value: DefaultCommandLineArgs) -> Result {
+ let Some(SubCommands::Run(args)) = value.cmd else {
+ return Err("Trying to initialize server w/o the \"run\" sub command being passed.");
+ };
+
+ return Ok(ServerOptions {
+ data_dir: DataDir(value.data_dir),
+ address: args.address,
+ admin_address: args.admin_address,
+ public_dir: args.public_dir.map(|p| p.into()),
+ dev: args.dev,
+ disable_auth_ui: args.disable_auth_ui,
+ cors_allowed_origins: args.cors_allowed_origins,
+ });
+ }
+}
diff --git a/trailbase-cli/src/bin/trail.rs b/trailbase-cli/src/bin/trail.rs
new file mode 100644
index 0000000..46fe785
--- /dev/null
+++ b/trailbase-cli/src/bin/trail.rs
@@ -0,0 +1,294 @@
+#![allow(clippy::needless_return)]
+
+#[global_allocator]
+static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
+
+use chrono::TimeZone;
+use clap::{CommandFactory, Parser};
+use libsql::{de, params};
+use log::*;
+use serde::Deserialize;
+use tokio::{fs, io::AsyncWriteExt};
+use tracing_subscriber::{filter, prelude::*};
+use trailbase_core::{
+ api::{self, init_app_state, query_one_row, Email, TokenClaims},
+ constants::USER_TABLE,
+ DataDir, Server,
+};
+
+use trailbase_cli::{
+ AdminSubCommands, DefaultCommandLineArgs, JsonSchemaModeArg, SubCommands, UserSubCommands,
+};
+
+type BoxError = Box;
+
+fn init_logger(dev: bool) {
+ env_logger::init_from_env(if dev {
+ env_logger::Env::new().default_filter_or("info,trailbase_core=debug,refinery_core=warn")
+ } else {
+ env_logger::Env::new().default_filter_or("info,refinery_core=warn")
+ });
+}
+
+#[derive(Deserialize)]
+struct DbUser {
+ id: [u8; 16],
+ email: String,
+ verified: bool,
+ created: i64,
+ updated: i64,
+}
+
+impl DbUser {
+ fn uuid(&self) -> uuid::Uuid {
+ uuid::Uuid::from_bytes(self.id)
+ }
+}
+
+async fn get_user_by_email(conn: &libsql::Connection, email: &str) -> Result {
+ return Ok(de::from_row(
+ &query_one_row(
+ conn,
+ &format!("SELECT * FROM {USER_TABLE} WHERE email = $1"),
+ params!(email),
+ )
+ .await?,
+ )?);
+}
+
+#[tokio::main]
+async fn main() -> Result<(), BoxError> {
+ let args = DefaultCommandLineArgs::parse();
+
+ match args.cmd {
+ Some(SubCommands::Run(ref cmd)) => {
+ init_logger(cmd.dev);
+
+ let stderr_logging = cmd.dev || cmd.stderr_logging;
+
+ let app = Server::init(args.try_into()?).await?;
+
+ let filter = || {
+ filter::Targets::new()
+ .with_target("tower_http::trace::on_response", filter::LevelFilter::DEBUG)
+ .with_target("tower_http::trace::on_request", filter::LevelFilter::DEBUG)
+ .with_target("tower_http::trace::make_span", filter::LevelFilter::DEBUG)
+ .with_default(filter::LevelFilter::INFO)
+ };
+
+ // This declares **where** tracing is being logged to, e.g. stderr, file, sqlite.
+ //
+ // NOTE: the try_init() will actually fail because the tracing system was already initialized
+ // by the env_logger above.
+ // FIXME: Without the sqlite logger here, logging is broken despite us trying to initialize
+ // in app.server() as well.
+ let layer = tracing_subscriber::registry()
+ .with(trailbase_core::logging::SqliteLogLayer::new(app.state()).with_filter(filter()));
+
+ if stderr_logging {
+ let _ = layer
+ .with(
+ tracing_subscriber::fmt::layer()
+ .compact()
+ .with_filter(filter()),
+ )
+ .try_init();
+ } else {
+ let _ = layer.try_init();
+ }
+
+ app.serve().await?;
+ }
+ #[cfg(feature = "openapi")]
+ Some(SubCommands::OpenApi { cmd }) => {
+ init_logger(false);
+
+ use trailbase_cli::OpenApiSubCommands;
+ use utoipa::OpenApi;
+ use utoipa_swagger_ui::SwaggerUi;
+
+ let run_server = |port: u16| async move {
+ let router = axum::Router::new().merge(
+ SwaggerUi::new("/docs").url("/api/openapi.json", trailbase_core::openapi::Doc::openapi()),
+ );
+
+ let addr = format!("localhost:{port}");
+ let listener = tokio::net::TcpListener::bind(addr.clone()).await.unwrap();
+ log::info!("docs @ http://{addr}/docs 🚀");
+
+ axum::serve(listener, router).await.unwrap();
+ };
+
+ match cmd {
+ Some(OpenApiSubCommands::Print) => {
+ let json = trailbase_core::openapi::Doc::openapi().to_pretty_json()?;
+ println!("{json}");
+ }
+ Some(OpenApiSubCommands::Run { port }) => {
+ run_server(port).await;
+ }
+ None => {
+ run_server(4004).await;
+ }
+ }
+ }
+ Some(SubCommands::Schema(ref cmd)) => {
+ init_logger(false);
+
+ let data_dir = DataDir(args.data_dir);
+ let conn = api::connect_sqlite(Some(data_dir.main_db_path()), None).await?;
+ let table_metadata = api::TableMetadataCache::new(conn.clone()).await?;
+
+ let table_name = &cmd.table;
+ if let Some(table) = table_metadata.get(table_name) {
+ let (_validator, schema) = trailbase_core::api::build_json_schema(
+ table.name(),
+ &*table,
+ cmd.mode.unwrap_or(JsonSchemaModeArg::Insert).into(),
+ )?;
+
+ println!("{}", serde_json::to_string_pretty(&schema)?);
+ } else if let Some(view) = table_metadata.get_view(table_name) {
+ let (_validator, schema) = trailbase_core::api::build_json_schema(
+ view.name(),
+ &*view,
+ cmd.mode.unwrap_or(JsonSchemaModeArg::Insert).into(),
+ )?;
+
+ println!("{}", serde_json::to_string_pretty(&schema)?);
+ } else {
+ return Err(format!("Could not find table: '{table_name}'").into());
+ }
+ }
+ Some(SubCommands::Migration { suffix }) => {
+ init_logger(false);
+
+ let data_dir = DataDir(args.data_dir);
+ let filename = api::new_unique_migration_filename(suffix.as_deref().unwrap_or("update"));
+ let path = data_dir.migrations_path().join(filename);
+
+ let mut migration_file = fs::File::create_new(&path).await?;
+ migration_file
+ .write_all(b"-- new database migration\n")
+ .await?;
+
+ println!("Created empty migration file: {path:?}");
+ }
+ Some(SubCommands::Admin { cmd }) => {
+ init_logger(false);
+
+ let data_dir = DataDir(args.data_dir);
+ let conn = api::connect_sqlite(Some(data_dir.main_db_path()), None).await?;
+
+ match cmd {
+ Some(AdminSubCommands::List) => {
+ let mut rows = conn
+ .query(&format!("SELECT * FROM {USER_TABLE} WHERE admin > 0"), ())
+ .await?;
+
+ println!("{: >36}\temail\tcreated\tupdated", "id");
+ while let Some(row) = rows.next().await? {
+ let user: DbUser = de::from_row(&row)?;
+ let id = user.uuid();
+
+ println!(
+ "{id}\t{}\t{created:?}\t{updated:?}",
+ user.email,
+ created = chrono::Utc.timestamp_opt(user.created, 0),
+ updated = chrono::Utc.timestamp_opt(user.updated, 0),
+ );
+ }
+ }
+ Some(AdminSubCommands::Demote { email }) => {
+ conn
+ .execute(
+ &format!("UPDATE {USER_TABLE} SET admin = FALSE WHERE email = $1"),
+ params!(email.clone()),
+ )
+ .await?;
+
+ println!("'{email}' has been demoted");
+ }
+ Some(AdminSubCommands::Promote { email }) => {
+ conn
+ .execute(
+ &format!("UPDATE {USER_TABLE} SET admin = TRUE WHERE email = $1"),
+ params!(email.clone()),
+ )
+ .await?;
+
+ println!("'{email}' is now an admin");
+ }
+ None => {
+ DefaultCommandLineArgs::command()
+ .find_subcommand_mut("admin")
+ .map(|cmd| cmd.print_help());
+ }
+ };
+ }
+ Some(SubCommands::User { cmd }) => {
+ init_logger(false);
+
+ let data_dir = DataDir(args.data_dir);
+ let conn = api::connect_sqlite(Some(data_dir.main_db_path()), None).await?;
+
+ match cmd {
+ Some(UserSubCommands::ResetPassword { email, password }) => {
+ if get_user_by_email(&conn, &email).await.is_err() {
+ return Err(format!("User with email='{email}' not found.").into());
+ }
+ api::force_password_reset(&conn, email.clone(), password).await?;
+
+ println!("Password updated for '{email}'");
+ }
+ Some(UserSubCommands::MintToken { email }) => {
+ let user = get_user_by_email(&conn, &email).await?;
+ let jwt = api::JwtHelper::init_from_path(&data_dir).await?;
+
+ if !user.verified {
+ warn!("User '{email}' not verified");
+ }
+
+ let claims = TokenClaims::new(
+ user.verified,
+ user.uuid(),
+ user.email,
+ chrono::Duration::hours(12),
+ );
+ let token = jwt.encode(&claims)?;
+
+ println!("Bearer {token}");
+ }
+ None => {
+ DefaultCommandLineArgs::command()
+ .find_subcommand_mut("user")
+ .map(|cmd| cmd.print_help());
+ }
+ };
+ }
+ Some(SubCommands::Email(ref cmd)) => {
+ init_logger(false);
+
+ let (to, subject, body) = (cmd.to.clone(), cmd.subject.clone(), cmd.body.clone());
+
+ let (_new_db, state) = init_app_state(DataDir(args.data_dir), None, false).await?;
+ let email = Email::new(&state, to, subject, body)?;
+ email.send().await?;
+
+ let c = state.get_config().email;
+ match (c.smtp_host, c.smtp_port, c.smtp_username, c.smtp_password) {
+ (Some(host), Some(port), Some(username), Some(_)) => {
+ println!("Sent email using: {username}@{host}:{port}");
+ }
+ _ => {
+ println!("Sent email using system's sendmail");
+ }
+ };
+ }
+ None => {
+ let _ = DefaultCommandLineArgs::command().print_help();
+ }
+ }
+
+ Ok(())
+}
diff --git a/trailbase-cli/src/lib.rs b/trailbase-cli/src/lib.rs
new file mode 100644
index 0000000..a084798
--- /dev/null
+++ b/trailbase-cli/src/lib.rs
@@ -0,0 +1,11 @@
+#![allow(clippy::needless_return)]
+
+mod args;
+
+pub use args::{
+ AdminSubCommands, DefaultCommandLineArgs, EmailArgs, JsonSchemaModeArg, SubCommands,
+ UserSubCommands,
+};
+
+#[cfg(feature = "openapi")]
+pub use args::OpenApiSubCommands;
diff --git a/trailbase-core/Cargo.toml b/trailbase-core/Cargo.toml
new file mode 100644
index 0000000..1b44b75
--- /dev/null
+++ b/trailbase-core/Cargo.toml
@@ -0,0 +1,85 @@
+[package]
+name = "trailbase-core"
+version = "0.1.0"
+edition = "2021"
+
+[[bench]]
+name = "benchmark"
+harness = false
+
+[features]
+default = []
+
+[dependencies]
+arc-swap = "1.7.1"
+argon2 = { version = "^0.5.3", default-features = false, features = ["alloc", "password-hash"] }
+async-trait = "0.1.80"
+axum = { version = "^0.7.5", features=["multipart"] }
+axum-client-ip = "0.6.0"
+axum-extra = { version = "^0.9.3", default-features = false, features=["protobuf"] }
+base64 = { version = "0.22.1", default-features = false }
+chrono = "^0.4.38"
+cookie = "0.18.1"
+ed25519-dalek = { version = "2.1.1", features=["pkcs8", "pem", "rand_core"] }
+env_logger = "^0.11.3"
+fallible-iterator = "0.3.0"
+form_urlencoded = "1.2.1"
+futures = "0.3.30"
+indexmap = "2.6.0"
+indoc = "2.0.5"
+itertools = "0.13.0"
+jsonschema = { version = "0.26.0", default-features = false }
+jsonwebtoken = { version = "^9.3.0", default-features = false, features = ["use_pem"] }
+lazy_static = "1.4.0"
+lettre = { version = "^0.11.7", default-features = false, features = ["tokio1-rustls-tls", "sendmail-transport", "smtp-transport", "builder"] }
+libsql = { workspace = true }
+log = "^0.4.21"
+minijinja = "2.1.2"
+oauth2 = { version = "5.0.0-alpha.4", default-features = false, features = ["reqwest", "rustls-tls"] }
+object_store = { version = "0.11.0", default-features = false }
+parking_lot = "0.12.3"
+prost = "^0.12.6"
+prost-reflect = { version = "^0.13.0", features = ["derive", "text-format"] }
+rand = "0.8.5"
+refinery = { workspace = true }
+refinery-libsql = { workspace = true }
+regex = "1.11.0"
+reqwest = { version = "0.12.5", default-features = false, features = ["rustls-tls", "json"] }
+rusqlite = { workspace = true }
+rust-embed = { version = "8.4.0", default-features = false, features = ["mime-guess"] }
+serde = { version = "^1.0.203", features = ["derive"] }
+serde_json = "^1.0.117"
+serde_path_to_error = "0.1.16"
+serde_urlencoded = "0.7.1"
+sha2 = "0.10.8"
+sqlformat = "0.2.4"
+sqlite3-parser = "0.13.0"
+thiserror = "1.0.61"
+tokio = { version = "^1.38.0", features=["macros", "rt-multi-thread", "fs", "signal"] }
+tower-cookies = { version = "0.10.0" }
+tower-http = { version = "^0.6.0", features=["cors", "trace", "fs", "limit"] }
+tower-service = "0.3.3"
+tracing = "0.1.40"
+tracing-subscriber = "0.3.18"
+trailbase-sqlite = { path = "../trailbase-sqlite" }
+ts-rs = { version = "10", features=["uuid-impl", "serde-json-impl"] }
+url = "2.5.2"
+utoipa = { version = "5.0.0-beta.0", features = ["axum_extras"] }
+uuid = { version = "^1.8.0", features = ["v4", "serde"] }
+validator = { version = "0.18.1", default-features = false }
+
+[build-dependencies]
+env_logger = "^0.11.3"
+log = "^0.4.21"
+prost-build = "0.13.1"
+prost-reflect-build = "0.14.0"
+
+[dev-dependencies]
+anyhow = "^1.0.86"
+axum-test = "16.0.0"
+criterion = { version = "0.5", features = ["html_reports", "async_tokio"] }
+trailbase-extension = { path = "../trailbase-extension" }
+quoted_printable = "0.5.1"
+schemars = "0.8.21"
+temp-dir = "0.1.13"
+tower = { version = "0.5.0", features = ["util"] }
diff --git a/trailbase-core/benches/benchmark.rs b/trailbase-core/benches/benchmark.rs
new file mode 100644
index 0000000..e4be178
--- /dev/null
+++ b/trailbase-core/benches/benchmark.rs
@@ -0,0 +1,242 @@
+#![allow(clippy::needless_return)]
+
+use criterion::{criterion_group, criterion_main, Criterion};
+
+use axum::body::Body;
+use axum::extract::{Json, State};
+use axum::http::{self, Request};
+use base64::prelude::*;
+use libsql::{params, Connection};
+use std::sync::{Arc, Mutex};
+use tower::{Service, ServiceExt};
+use trailbase_core::config::proto::PermissionFlag;
+use trailbase_core::records::Acls;
+
+use trailbase_core::api::{
+ create_user_handler, login_with_password, query_one_row, CreateUserRequest,
+};
+use trailbase_core::constants::RECORD_API_PATH;
+use trailbase_core::records::{add_record_api, AccessRules};
+use trailbase_core::{DataDir, Server, ServerOptions};
+
+async fn create_chat_message_app_tables(conn: &Connection) -> Result<(), libsql::Error> {
+ // Create a messages, chat room and members tables.
+ conn
+ .execute_batch(
+ r#"
+ CREATE TABLE room (
+ id BLOB PRIMARY KEY NOT NULL CHECK(is_uuid_v7(id)) DEFAULT(uuid_v7()),
+ name TEXT
+ ) STRICT;
+
+ CREATE TABLE message (
+ id INTEGER PRIMARY KEY,
+ _owner BLOB NOT NULL,
+ room BLOB NOT NULL,
+ data TEXT NOT NULL DEFAULT 'empty',
+
+ -- on user delete, toombstone it.
+ FOREIGN KEY(_owner) REFERENCES _user(id) ON DELETE SET NULL,
+ -- On chatroom delete, delete message
+ FOREIGN KEY(room) REFERENCES room(id) ON DELETE CASCADE
+ ) STRICT;
+
+ CREATE TABLE room_members (
+ user BLOB NOT NULL,
+ room BLOB NOT NULL,
+
+ FOREIGN KEY(room) REFERENCES room(id) ON DELETE CASCADE,
+ FOREIGN KEY(user) REFERENCES _user(id) ON DELETE CASCADE
+ ) STRICT;
+ "#,
+ )
+ .await?;
+
+ return Ok(());
+}
+
+async fn add_room(conn: &Connection, name: &str) -> Result<[u8; 16], libsql::Error> {
+ let room: [u8; 16] = query_one_row(
+ conn,
+ "INSERT INTO room (name) VALUES ($1) RETURNING id",
+ params!(name),
+ )
+ .await?
+ .get(0)?;
+
+ return Ok(room);
+}
+
+async fn add_user_to_room(
+ conn: &Connection,
+ user: [u8; 16],
+ room: [u8; 16],
+) -> Result<(), libsql::Error> {
+ conn
+ .execute(
+ "INSERT INTO room_members (user, room) VALUES ($1, $2)",
+ params!(user, room),
+ )
+ .await?;
+ return Ok(());
+}
+
+struct SetupResult {
+ app: Server,
+
+ room: [u8; 16],
+ user_x: [u8; 16],
+ user_x_token: String,
+}
+
+async fn setup_app() -> Result {
+ let data_dir = temp_dir::TempDir::new()?;
+
+ let app = Server::init(ServerOptions {
+ data_dir: DataDir(data_dir.path().to_path_buf()),
+ ..Default::default()
+ })
+ .await?;
+
+ let state = app.state();
+ let conn = state.conn();
+
+ create_chat_message_app_tables(conn).await?;
+ state.refresh_table_cache().await?;
+
+ let room = add_room(conn, "room0").await?;
+ let password = "Secret!1!!";
+
+ let create_access_rule =
+ r#"(SELECT 1 FROM room_members WHERE user = _USER_.id AND room = _REQ_.room)"#;
+
+ add_record_api(
+ &state,
+ "messages_api",
+ "message",
+ Acls {
+ authenticated: vec![PermissionFlag::Read, PermissionFlag::Create],
+ ..Default::default()
+ },
+ AccessRules {
+ create: Some(create_access_rule.to_string()),
+ ..Default::default()
+ },
+ )
+ .await?;
+
+ let email = "user_x@bar.com";
+ let user_x = create_user_handler(
+ State(state.clone()),
+ Json(CreateUserRequest {
+ email: email.to_string(),
+ password: password.to_string(),
+ verified: true,
+ admin: false,
+ }),
+ )
+ .await?
+ .id
+ .into_bytes();
+
+ let user_x_token = login_with_password(&state, email, password)
+ .await?
+ .auth_token;
+
+ add_user_to_room(conn, user_x, room).await?;
+
+ return Ok(SetupResult {
+ app,
+ room,
+ user_x,
+ user_x_token,
+ });
+}
+
+fn criterion_benchmark(c: &mut Criterion) {
+ let runtime = tokio::runtime::Builder::new_current_thread()
+ .build()
+ .unwrap();
+
+ let mut setup: Option = None;
+ runtime.block_on(async {
+ let result = setup_app().await.unwrap();
+ let mut router = result.app.router().clone();
+
+ ServiceExt::>::ready(&mut router)
+ .await
+ .unwrap();
+
+ let response = router
+ .call(
+ Request::builder()
+ .method(http::Method::GET)
+ .uri("/api/healthcheck")
+ .body(Body::from(vec![]))
+ .unwrap(),
+ )
+ .await
+ .unwrap();
+
+ let bytes = axum::body::to_bytes(response.into_body(), usize::MAX)
+ .await
+ .unwrap();
+
+ assert_eq!(bytes.to_vec(), b"Ok");
+
+ setup = Some(result);
+ });
+
+ let setup = Arc::new(Mutex::new(setup.take().unwrap()));
+
+ c.bench_function("iter create message", move |b| {
+ let mut bencher = b.to_async(&runtime);
+
+ let setup = setup.clone();
+
+ let (body, user_x_token) = {
+ let s = setup.lock().unwrap();
+ let request = serde_json::json!({
+ "_owner": BASE64_URL_SAFE.encode(s.user_x),
+ "room": BASE64_URL_SAFE.encode(s.room),
+ "data": "user_x message to room",
+ });
+
+ let body = serde_json::to_vec(&request).unwrap();
+
+ (body, s.user_x_token.clone())
+ };
+
+ bencher.iter(move || {
+ let setup = setup.clone();
+ let body = body.clone();
+ let auth = format!("Bearer {user_x_token}");
+
+ async move {
+ let mut router = setup.lock().unwrap().app.router().clone();
+ let response = router
+ .call(
+ Request::builder()
+ .method(http::Method::POST)
+ .uri(&format!("/{RECORD_API_PATH}/messages_api"))
+ .header(http::header::CONTENT_TYPE, "application/json")
+ .header(http::header::AUTHORIZATION, &auth)
+ .body(Body::from(body))
+ .unwrap(),
+ )
+ .await
+ .unwrap();
+
+ if response.status() != http::StatusCode::OK {
+ let body = axum::body::to_bytes(response.into_body(), usize::MAX)
+ .await
+ .unwrap();
+ assert!(false, "{body:?}");
+ }
+ }
+ });
+ });
+}
+
+criterion_group!(benches, criterion_benchmark);
+criterion_main!(benches);
diff --git a/trailbase-core/bindings/.gitignore b/trailbase-core/bindings/.gitignore
new file mode 100644
index 0000000..a6c7c28
--- /dev/null
+++ b/trailbase-core/bindings/.gitignore
@@ -0,0 +1 @@
+*.js
diff --git a/trailbase-core/bindings/AlterIndexRequest.ts b/trailbase-core/bindings/AlterIndexRequest.ts
new file mode 100644
index 0000000..ab21976
--- /dev/null
+++ b/trailbase-core/bindings/AlterIndexRequest.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { TableIndex } from "./TableIndex";
+
+export type AlterIndexRequest = { source_schema: TableIndex, target_schema: TableIndex, };
diff --git a/trailbase-core/bindings/AlterTableRequest.ts b/trailbase-core/bindings/AlterTableRequest.ts
new file mode 100644
index 0000000..1872c93
--- /dev/null
+++ b/trailbase-core/bindings/AlterTableRequest.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Table } from "./Table";
+
+export type AlterTableRequest = { source_schema: Table, target_schema: Table, };
diff --git a/trailbase-core/bindings/AuthCodeToTokenRequest.ts b/trailbase-core/bindings/AuthCodeToTokenRequest.ts
new file mode 100644
index 0000000..bd544cc
--- /dev/null
+++ b/trailbase-core/bindings/AuthCodeToTokenRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type AuthCodeToTokenRequest = { authorization_code: string | null, pkce_code_verifier: string | null, };
diff --git a/trailbase-core/bindings/ChangeEmailRequest.ts b/trailbase-core/bindings/ChangeEmailRequest.ts
new file mode 100644
index 0000000..a115368
--- /dev/null
+++ b/trailbase-core/bindings/ChangeEmailRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type ChangeEmailRequest = { csrf_token: string, old_email: string | null, new_email: string, };
diff --git a/trailbase-core/bindings/ChangePasswordRequest.ts b/trailbase-core/bindings/ChangePasswordRequest.ts
new file mode 100644
index 0000000..bd1d638
--- /dev/null
+++ b/trailbase-core/bindings/ChangePasswordRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type ChangePasswordRequest = { old_password: string, new_password: string, new_password_repeat: string, };
diff --git a/trailbase-core/bindings/Column.ts b/trailbase-core/bindings/Column.ts
new file mode 100644
index 0000000..68292fa
--- /dev/null
+++ b/trailbase-core/bindings/Column.ts
@@ -0,0 +1,5 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { ColumnDataType } from "./ColumnDataType";
+import type { ColumnOption } from "./ColumnOption";
+
+export type Column = { name: string, data_type: ColumnDataType, options: Array, };
diff --git a/trailbase-core/bindings/ColumnDataType.ts b/trailbase-core/bindings/ColumnDataType.ts
new file mode 100644
index 0000000..4caf5c7
--- /dev/null
+++ b/trailbase-core/bindings/ColumnDataType.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type ColumnDataType = "Null" | "Any" | "Blob" | "Text" | "Integer" | "Real" | "Numeric" | "JSON" | "JSONB" | "Int" | "TinyInt" | "SmallInt" | "MediumInt" | "BigInt" | "UnignedBigInt" | "Int2" | "Int4" | "Int8" | "Character" | "Varchar" | "VaryingCharacter" | "NChar" | "NativeCharacter" | "NVarChar" | "Clob" | "Double" | "DoublePrecision" | "Float" | "Boolean" | "Decimal" | "Date" | "DateTime";
diff --git a/trailbase-core/bindings/ColumnOption.ts b/trailbase-core/bindings/ColumnOption.ts
new file mode 100644
index 0000000..eaf7a67
--- /dev/null
+++ b/trailbase-core/bindings/ColumnOption.ts
@@ -0,0 +1,5 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { GeneratedExpressionMode } from "./GeneratedExpressionMode";
+import type { ReferentialAction } from "./ReferentialAction";
+
+export type ColumnOption = "Null" | "NotNull" | { "Default": string } | { "Unique": { is_primary: boolean, } } | { "ForeignKey": { foreign_table: string, referred_columns: Array, on_delete: ReferentialAction | null, on_update: ReferentialAction | null, } } | { "Check": string } | { "OnUpdate": string } | { "Generated": { expr: string, mode: GeneratedExpressionMode | null, } };
diff --git a/trailbase-core/bindings/ColumnOrder.ts b/trailbase-core/bindings/ColumnOrder.ts
new file mode 100644
index 0000000..3483a9d
--- /dev/null
+++ b/trailbase-core/bindings/ColumnOrder.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type ColumnOrder = { column_name: string, ascending: boolean | null, nulls_first: boolean | null, };
diff --git a/trailbase-core/bindings/ConfiguredOAuthProvidersResponse.ts b/trailbase-core/bindings/ConfiguredOAuthProvidersResponse.ts
new file mode 100644
index 0000000..7e0072d
--- /dev/null
+++ b/trailbase-core/bindings/ConfiguredOAuthProvidersResponse.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type ConfiguredOAuthProvidersResponse = { providers: Array<[string, string]>, };
diff --git a/trailbase-core/bindings/CreateIndexRequest.ts b/trailbase-core/bindings/CreateIndexRequest.ts
new file mode 100644
index 0000000..8c83736
--- /dev/null
+++ b/trailbase-core/bindings/CreateIndexRequest.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { TableIndex } from "./TableIndex";
+
+export type CreateIndexRequest = { schema: TableIndex, dry_run: boolean | null, };
diff --git a/trailbase-core/bindings/CreateIndexResponse.ts b/trailbase-core/bindings/CreateIndexResponse.ts
new file mode 100644
index 0000000..a7b8cde
--- /dev/null
+++ b/trailbase-core/bindings/CreateIndexResponse.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type CreateIndexResponse = { sql: string, };
diff --git a/trailbase-core/bindings/CreateTableRequest.ts b/trailbase-core/bindings/CreateTableRequest.ts
new file mode 100644
index 0000000..5a9cd9a
--- /dev/null
+++ b/trailbase-core/bindings/CreateTableRequest.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Table } from "./Table";
+
+export type CreateTableRequest = { schema: Table, dry_run: boolean | null, };
diff --git a/trailbase-core/bindings/CreateTableResponse.ts b/trailbase-core/bindings/CreateTableResponse.ts
new file mode 100644
index 0000000..02b735f
--- /dev/null
+++ b/trailbase-core/bindings/CreateTableResponse.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type CreateTableResponse = { sql: string, };
diff --git a/trailbase-core/bindings/CreateUserRequest.ts b/trailbase-core/bindings/CreateUserRequest.ts
new file mode 100644
index 0000000..f508f40
--- /dev/null
+++ b/trailbase-core/bindings/CreateUserRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type CreateUserRequest = { email: string, password: string, verified: boolean, admin: boolean, };
diff --git a/trailbase-core/bindings/DeleteRowRequest.ts b/trailbase-core/bindings/DeleteRowRequest.ts
new file mode 100644
index 0000000..3e3d3bb
--- /dev/null
+++ b/trailbase-core/bindings/DeleteRowRequest.ts
@@ -0,0 +1,8 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type DeleteRowRequest = { primary_key_column: string,
+/**
+ * The primary key (of any type since we're in row instead of RecordApi land) of rows that
+ * shall be deleted.
+ */
+value: Object, };
diff --git a/trailbase-core/bindings/DeleteRowsRequest.ts b/trailbase-core/bindings/DeleteRowsRequest.ts
new file mode 100644
index 0000000..fa5cba5
--- /dev/null
+++ b/trailbase-core/bindings/DeleteRowsRequest.ts
@@ -0,0 +1,12 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type DeleteRowsRequest = {
+/**
+ * Name of the primary key column we use to identify which rows to delete.
+ */
+primary_key_column: string,
+/**
+ * A list of primary keys (of any type since we're in row instead of RecordApi land)
+ * of rows that shall be deleted.
+ */
+values: Object[], };
diff --git a/trailbase-core/bindings/DropIndexRequest.ts b/trailbase-core/bindings/DropIndexRequest.ts
new file mode 100644
index 0000000..43d3ce7
--- /dev/null
+++ b/trailbase-core/bindings/DropIndexRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type DropIndexRequest = { name: string, };
diff --git a/trailbase-core/bindings/DropTableRequest.ts b/trailbase-core/bindings/DropTableRequest.ts
new file mode 100644
index 0000000..0eb8e56
--- /dev/null
+++ b/trailbase-core/bindings/DropTableRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type DropTableRequest = { name: string, };
diff --git a/trailbase-core/bindings/ForeignKey.ts b/trailbase-core/bindings/ForeignKey.ts
new file mode 100644
index 0000000..780639d
--- /dev/null
+++ b/trailbase-core/bindings/ForeignKey.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { ReferentialAction } from "./ReferentialAction";
+
+export type ForeignKey = { name: string | null, columns: Array, foreign_table: string, referred_columns: Array, on_delete: ReferentialAction | null, on_update: ReferentialAction | null, };
diff --git a/trailbase-core/bindings/GeneratedExpressionMode.ts b/trailbase-core/bindings/GeneratedExpressionMode.ts
new file mode 100644
index 0000000..41dde66
--- /dev/null
+++ b/trailbase-core/bindings/GeneratedExpressionMode.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type GeneratedExpressionMode = "Virtual" | "Stored";
diff --git a/trailbase-core/bindings/JsonSchema.ts b/trailbase-core/bindings/JsonSchema.ts
new file mode 100644
index 0000000..07153fd
--- /dev/null
+++ b/trailbase-core/bindings/JsonSchema.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type JsonSchema = { name: string, schema: string, builtin: boolean, };
diff --git a/trailbase-core/bindings/ListJsonSchemasResponse.ts b/trailbase-core/bindings/ListJsonSchemasResponse.ts
new file mode 100644
index 0000000..8ef7a41
--- /dev/null
+++ b/trailbase-core/bindings/ListJsonSchemasResponse.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { JsonSchema } from "./JsonSchema";
+
+export type ListJsonSchemasResponse = { schemas: Array, };
diff --git a/trailbase-core/bindings/ListLogsResponse.ts b/trailbase-core/bindings/ListLogsResponse.ts
new file mode 100644
index 0000000..4aa584c
--- /dev/null
+++ b/trailbase-core/bindings/ListLogsResponse.ts
@@ -0,0 +1,5 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { LogJson } from "./LogJson";
+import type { Stats } from "./Stats";
+
+export type ListLogsResponse = { total_row_count: bigint, cursor: string | null, entries: Array, stats: Stats | null, };
diff --git a/trailbase-core/bindings/ListRowsResponse.ts b/trailbase-core/bindings/ListRowsResponse.ts
new file mode 100644
index 0000000..d2cd0a0
--- /dev/null
+++ b/trailbase-core/bindings/ListRowsResponse.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Column } from "./Column";
+
+export type ListRowsResponse = { total_row_count: bigint, cursor: string | null, columns: Array, rows: Object[][], };
diff --git a/trailbase-core/bindings/ListSchemasResponse.ts b/trailbase-core/bindings/ListSchemasResponse.ts
new file mode 100644
index 0000000..0e6bd6d
--- /dev/null
+++ b/trailbase-core/bindings/ListSchemasResponse.ts
@@ -0,0 +1,7 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Table } from "./Table";
+import type { TableIndex } from "./TableIndex";
+import type { TableTrigger } from "./TableTrigger";
+import type { View } from "./View";
+
+export type ListSchemasResponse = { tables: Array
, indexes: Array, triggers: Array, views: Array, };
diff --git a/trailbase-core/bindings/ListUsersResponse.ts b/trailbase-core/bindings/ListUsersResponse.ts
new file mode 100644
index 0000000..9ed0efb
--- /dev/null
+++ b/trailbase-core/bindings/ListUsersResponse.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { UserJson } from "./UserJson";
+
+export type ListUsersResponse = { total_row_count: bigint, cursor: string | null, users: Array, };
diff --git a/trailbase-core/bindings/LogJson.ts b/trailbase-core/bindings/LogJson.ts
new file mode 100644
index 0000000..120ea5c
--- /dev/null
+++ b/trailbase-core/bindings/LogJson.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type LogJson = { id: string, created: number, type: number, level: number, status: number, method: string, url: string, latency_ms: number, client_ip: string, referer: string, user_agent: string, data: Object | undefined, };
diff --git a/trailbase-core/bindings/LoginRequest.ts b/trailbase-core/bindings/LoginRequest.ts
new file mode 100644
index 0000000..18bd4f5
--- /dev/null
+++ b/trailbase-core/bindings/LoginRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type LoginRequest = { email: string, password: string, redirect_to: string | null, response_type: string | null, pkce_code_challenge: string | null, };
diff --git a/trailbase-core/bindings/LoginResponse.ts b/trailbase-core/bindings/LoginResponse.ts
new file mode 100644
index 0000000..5896df3
--- /dev/null
+++ b/trailbase-core/bindings/LoginResponse.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type LoginResponse = { auth_token: string, refresh_token: string, csrf_token: string, };
diff --git a/trailbase-core/bindings/LoginStatusResponse.ts b/trailbase-core/bindings/LoginStatusResponse.ts
new file mode 100644
index 0000000..411b98d
--- /dev/null
+++ b/trailbase-core/bindings/LoginStatusResponse.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type LoginStatusResponse = { auth_token: string | null, refresh_token: string | null, csrf_token: string | null, };
diff --git a/trailbase-core/bindings/LogoutRequest.ts b/trailbase-core/bindings/LogoutRequest.ts
new file mode 100644
index 0000000..b77a3d9
--- /dev/null
+++ b/trailbase-core/bindings/LogoutRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type LogoutRequest = { refresh_token: string, };
diff --git a/trailbase-core/bindings/Mode.ts b/trailbase-core/bindings/Mode.ts
new file mode 100644
index 0000000..89c3a63
--- /dev/null
+++ b/trailbase-core/bindings/Mode.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type Mode = "Expression" | "Statement";
diff --git a/trailbase-core/bindings/OAuthProviderEntry.ts b/trailbase-core/bindings/OAuthProviderEntry.ts
new file mode 100644
index 0000000..bdb1853
--- /dev/null
+++ b/trailbase-core/bindings/OAuthProviderEntry.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type OAuthProviderEntry = { id: number, name: string, display_name: string, };
diff --git a/trailbase-core/bindings/OAuthProviderResponse.ts b/trailbase-core/bindings/OAuthProviderResponse.ts
new file mode 100644
index 0000000..5d43ff0
--- /dev/null
+++ b/trailbase-core/bindings/OAuthProviderResponse.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { OAuthProviderEntry } from "./OAuthProviderEntry";
+
+export type OAuthProviderResponse = { providers: Array, };
diff --git a/trailbase-core/bindings/ParseRequest.ts b/trailbase-core/bindings/ParseRequest.ts
new file mode 100644
index 0000000..1b486e8
--- /dev/null
+++ b/trailbase-core/bindings/ParseRequest.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Mode } from "./Mode";
+
+export type ParseRequest = { query: string, mode: Mode | null, };
diff --git a/trailbase-core/bindings/ParseResponse.ts b/trailbase-core/bindings/ParseResponse.ts
new file mode 100644
index 0000000..01db64f
--- /dev/null
+++ b/trailbase-core/bindings/ParseResponse.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type ParseResponse = { ok: boolean, message: string | null, };
diff --git a/trailbase-core/bindings/QueryRequest.ts b/trailbase-core/bindings/QueryRequest.ts
new file mode 100644
index 0000000..be793bf
--- /dev/null
+++ b/trailbase-core/bindings/QueryRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type QueryRequest = { query: string, };
diff --git a/trailbase-core/bindings/QueryResponse.ts b/trailbase-core/bindings/QueryResponse.ts
new file mode 100644
index 0000000..3dc8d96
--- /dev/null
+++ b/trailbase-core/bindings/QueryResponse.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Column } from "./Column";
+
+export type QueryResponse = { columns: Array | null, rows: Object[][], };
diff --git a/trailbase-core/bindings/ReadFilesRequest.ts b/trailbase-core/bindings/ReadFilesRequest.ts
new file mode 100644
index 0000000..cdac0f1
--- /dev/null
+++ b/trailbase-core/bindings/ReadFilesRequest.ts
@@ -0,0 +1,8 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type ReadFilesRequest = { pk_column: string,
+/**
+ * The primary key (of any type since we're in row instead of RecordAPI land) of rows that
+ * shall be deleted.
+ */
+pk_value: Object, file_column_name: string, file_index: number | null, };
diff --git a/trailbase-core/bindings/ReferentialAction.ts b/trailbase-core/bindings/ReferentialAction.ts
new file mode 100644
index 0000000..527c88e
--- /dev/null
+++ b/trailbase-core/bindings/ReferentialAction.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type ReferentialAction = "Restrict" | "Cascade" | "SetNull" | "NoAction" | "SetDefault";
diff --git a/trailbase-core/bindings/RefreshRequest.ts b/trailbase-core/bindings/RefreshRequest.ts
new file mode 100644
index 0000000..e80e5c4
--- /dev/null
+++ b/trailbase-core/bindings/RefreshRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type RefreshRequest = { refresh_token: string, };
diff --git a/trailbase-core/bindings/RefreshResponse.ts b/trailbase-core/bindings/RefreshResponse.ts
new file mode 100644
index 0000000..a6bc170
--- /dev/null
+++ b/trailbase-core/bindings/RefreshResponse.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type RefreshResponse = { auth_token: string, csrf_token: string, };
diff --git a/trailbase-core/bindings/Stats.ts b/trailbase-core/bindings/Stats.ts
new file mode 100644
index 0000000..f19acc5
--- /dev/null
+++ b/trailbase-core/bindings/Stats.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type Stats = { rate: Array<[bigint, number]>, };
diff --git a/trailbase-core/bindings/Table.ts b/trailbase-core/bindings/Table.ts
new file mode 100644
index 0000000..4012f3a
--- /dev/null
+++ b/trailbase-core/bindings/Table.ts
@@ -0,0 +1,6 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Column } from "./Column";
+import type { ForeignKey } from "./ForeignKey";
+import type { UniqueConstraint } from "./UniqueConstraint";
+
+export type Table = { name: string, strict: boolean, columns: Array, foreign_keys: Array, unique: Array, virtual_table: boolean, temporary: boolean, };
diff --git a/trailbase-core/bindings/TableIndex.ts b/trailbase-core/bindings/TableIndex.ts
new file mode 100644
index 0000000..158185a
--- /dev/null
+++ b/trailbase-core/bindings/TableIndex.ts
@@ -0,0 +1,4 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { ColumnOrder } from "./ColumnOrder";
+
+export type TableIndex = { name: string, table_name: string, columns: Array, unique: boolean, predicate: string | null, };
diff --git a/trailbase-core/bindings/TableTrigger.ts b/trailbase-core/bindings/TableTrigger.ts
new file mode 100644
index 0000000..cd7703b
--- /dev/null
+++ b/trailbase-core/bindings/TableTrigger.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type TableTrigger = { name: string, table_name: string, sql: string, };
diff --git a/trailbase-core/bindings/UniqueConstraint.ts b/trailbase-core/bindings/UniqueConstraint.ts
new file mode 100644
index 0000000..d8d9dee
--- /dev/null
+++ b/trailbase-core/bindings/UniqueConstraint.ts
@@ -0,0 +1,8 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type UniqueConstraint = { name: string | null,
+/**
+ * Identifiers of the columns that are unique.
+ * TODO: Should be indexed/ordered column.
+ */
+columns: Array, };
diff --git a/trailbase-core/bindings/UpdateJsonSchemaRequest.ts b/trailbase-core/bindings/UpdateJsonSchemaRequest.ts
new file mode 100644
index 0000000..b310524
--- /dev/null
+++ b/trailbase-core/bindings/UpdateJsonSchemaRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type UpdateJsonSchemaRequest = { name: string, schema: Object | undefined, };
diff --git a/trailbase-core/bindings/UpdateRowRequest.ts b/trailbase-core/bindings/UpdateRowRequest.ts
new file mode 100644
index 0000000..ddf36ec
--- /dev/null
+++ b/trailbase-core/bindings/UpdateRowRequest.ts
@@ -0,0 +1,10 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type UpdateRowRequest = { primary_key_column: string, primary_key_value: Object,
+/**
+ * This is expected to be a map from column name to value.
+ *
+ * Note that using an array here wouldn't make sense. The map allows for sparseness and only
+ * updating specific cells.
+ */
+row: { [key: string]: Object | undefined }, };
diff --git a/trailbase-core/bindings/UpdateUserRequest.ts b/trailbase-core/bindings/UpdateUserRequest.ts
new file mode 100644
index 0000000..2fdcad0
--- /dev/null
+++ b/trailbase-core/bindings/UpdateUserRequest.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type UpdateUserRequest = { id: string, email: string | null, password: string | null, verified: boolean | null, };
diff --git a/trailbase-core/bindings/UserJson.ts b/trailbase-core/bindings/UserJson.ts
new file mode 100644
index 0000000..37f825b
--- /dev/null
+++ b/trailbase-core/bindings/UserJson.ts
@@ -0,0 +1,3 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+
+export type UserJson = { id: string, email: string, verified: boolean, admin: boolean, provider_id: bigint, provider_user_id: string | null, email_verification_code: string, };
diff --git a/trailbase-core/bindings/View.ts b/trailbase-core/bindings/View.ts
new file mode 100644
index 0000000..9793d69
--- /dev/null
+++ b/trailbase-core/bindings/View.ts
@@ -0,0 +1,12 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Column } from "./Column";
+
+export type View = { name: string,
+/**
+ * Columns may be inferred from a view's query.
+ *
+ * Views can be defined with arbitrary queries referencing arbitrary sources: tables, views,
+ * functions, ..., which makes them inherently not type safe and therefore their columns not
+ * well defined.
+ */
+columns: Array | null, query: string, temporary: boolean, };
diff --git a/trailbase-core/build.rs b/trailbase-core/build.rs
new file mode 100644
index 0000000..b1e32bd
--- /dev/null
+++ b/trailbase-core/build.rs
@@ -0,0 +1,113 @@
+#![allow(clippy::needless_return)]
+
+use log::*;
+use std::env;
+use std::fs::{self};
+use std::io::{Result, Write};
+use std::path::{Path, PathBuf};
+
+#[allow(unused)]
+fn copy_dir(src: impl AsRef, dst: impl AsRef) -> Result<()> {
+ fs::create_dir_all(&dst)?;
+ for entry in fs::read_dir(src)? {
+ let entry = entry?;
+ if entry.file_name().to_str().unwrap().starts_with(".") {
+ continue;
+ }
+
+ if entry.file_type()?.is_dir() {
+ copy_dir(entry.path(), dst.as_ref().join(entry.file_name()))?;
+ } else {
+ fs::copy(entry.path(), dst.as_ref().join(entry.file_name()))?;
+ }
+ }
+
+ return Ok(());
+}
+
+fn build_ui(path: &str) -> Result<()> {
+ let pnpm_run = |args: &[&str]| -> Result {
+ let output = std::process::Command::new("pnpm")
+ .current_dir("..")
+ .args(args)
+ .output()?;
+
+ std::io::stdout().write_all(&output.stdout).unwrap();
+ std::io::stderr().write_all(&output.stderr).unwrap();
+
+ Ok(output)
+ };
+
+ let _ = pnpm_run(&["--dir", path, "install", "--frozen-lockfile"]);
+
+ let output = pnpm_run(&["--dir", path, "build"])?;
+ if !output.status.success() {
+ // NOTE: We don't want to break backend-builds on frontend errors, at least for dev builds.
+ if Ok("release") == env::var("PROFILE").as_deref() {
+ panic!(
+ "Failed to build ui '{path}': {}",
+ String::from_utf8_lossy(&output.stderr)
+ );
+ }
+ warn!(
+ "Failed to build ui '{path}': {}",
+ String::from_utf8_lossy(&output.stderr)
+ );
+ }
+
+ return Ok(());
+}
+
+fn build_protos() -> Result<()> {
+ const PROTO_PATH: &str = "../proto";
+ println!("cargo::rerun-if-changed={PROTO_PATH}");
+
+ let prost_config = {
+ let mut config = prost_build::Config::new();
+ config.enum_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]");
+ config
+ };
+
+ // "descriptor.proto" is provided by "libprotobuf-dev" on Debian and lives in:
+ // /usr/include/google/protobuf/descriptor.proto
+ let includes = vec![PathBuf::from("/usr/include"), PathBuf::from(PROTO_PATH)];
+ let proto_files = vec![
+ PathBuf::from(format!("{PROTO_PATH}/config.proto")),
+ PathBuf::from(format!("{PROTO_PATH}/config_api.proto")),
+ PathBuf::from(format!("{PROTO_PATH}/vault.proto")),
+ ];
+
+ prost_reflect_build::Builder::new()
+ .descriptor_pool("crate::DESCRIPTOR_POOL")
+ //.file_descriptor_set_bytes("crate::FILE_DESCRIPTOR_SET")
+ .compile_protos_with_config(prost_config, &proto_files, &includes)?;
+
+ return Ok(());
+}
+
+fn main() -> Result<()> {
+ env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
+
+ build_protos().unwrap();
+
+ // WARN: watching non-existent paths will also trigger rebuilds.
+ println!("cargo::rerun-if-changed=../client/trailbase-ts/src/");
+
+ {
+ let path = "ui/admin";
+ println!("cargo::rerun-if-changed=../{path}/src/components/");
+ println!("cargo::rerun-if-changed=../{path}/src/lib/");
+ let _ = build_ui(path);
+ }
+
+ {
+ let path = "ui/auth";
+ println!("cargo::rerun-if-changed=../{path}/src/components/");
+ println!("cargo::rerun-if-changed=../{path}/src/lib/");
+ println!("cargo::rerun-if-changed=../{path}/src/pages/");
+ println!("cargo::rerun-if-changed=../{path}/src/layouts/");
+ let _ = build_ui("ui/auth");
+ }
+
+ return Ok(());
+}
diff --git a/trailbase-core/migrations/logs/V1__initial.sql b/trailbase-core/migrations/logs/V1__initial.sql
new file mode 100644
index 0000000..d8b133a
--- /dev/null
+++ b/trailbase-core/migrations/logs/V1__initial.sql
@@ -0,0 +1,28 @@
+CREATE TABLE IF NOT EXISTS _logs (
+ -- NOTE: We're skipping the CHECK(is_uuid_v7) here as mostly inconsequential
+ -- micro-optimization but we also don't wanna expose the logs via RecordAPIs,
+ -- so there's not strict need.
+ id BLOB PRIMARY KEY DEFAULT (uuid_v7()) NOT NULL,
+ -- Timestamp in seconds with fractional millisecond resolution.
+ created REAL DEFAULT (UNIXEPOCH('subsec')) NOT NULL,
+ -- Entry type. We could probably also split by table :shrug:
+ type INTEGER DEFAULT 0 NOT NULL,
+
+ level INTEGER DEFAULT 0 NOT NULL,
+ status INTEGER DEFAULT 0 NOT NULL,
+ method TEXT DEFAULT '' NOT NULL,
+ url TEXT DEFAULT '' NOT NULL,
+
+ latency REAL DEFAULT 0 NOT NULL,
+
+ client_ip TEXT DEFAULT '' NOT NULL,
+ referer TEXT DEFAULT '' NOT NULL,
+ user_agent TEXT DEFAULT '' NOT NULL,
+
+ data BLOB
+) strict;
+
+CREATE INDEX IF NOT EXISTS __logs__level_index ON _logs (level);
+CREATE INDEX IF NOT EXISTS __logs__created_index ON _logs (created);
+CREATE INDEX IF NOT EXISTS __logs__status_index ON _logs (status);
+CREATE INDEX IF NOT EXISTS __logs__method_index ON _logs (method);
diff --git a/trailbase-core/migrations/main/V1__initial.sql b/trailbase-core/migrations/main/V1__initial.sql
new file mode 100644
index 0000000..64b9062
--- /dev/null
+++ b/trailbase-core/migrations/main/V1__initial.sql
@@ -0,0 +1,84 @@
+--
+-- User table.
+--
+CREATE TABLE _user (
+ id BLOB PRIMARY KEY NOT NULL CHECK(is_uuid_v7(id)) DEFAULT (uuid_v7()),
+ email TEXT NOT NULL CHECK(is_email(email)),
+ password_hash TEXT DEFAULT '' NOT NULL,
+ verified INTEGER DEFAULT FALSE NOT NULL,
+ admin INTEGER DEFAULT FALSE NOT NULL,
+
+ created INTEGER DEFAULT (UNIXEPOCH()) NOT NULL,
+ updated INTEGER DEFAULT (UNIXEPOCH()) NOT NULL,
+
+ -- Ephemeral data for auth flows.
+ --
+ -- Email change/verification flow.
+ email_verification_code TEXT,
+ email_verification_code_sent_at INTEGER,
+ -- Change email flow.
+ pending_email TEXT CHECK(is_email(pending_email)),
+ -- Reset forgotten password flow.
+ password_reset_code TEXT,
+ password_reset_code_sent_at INTEGER,
+ -- Authorization Code Flow (optionally with PKCE proof key).
+ authorization_code TEXT,
+ authorization_code_sent_at INTEGER,
+ pkce_code_challenge TEXT,
+
+ -- OAuth metadata
+ --
+ -- provider_id maps to proto.config.OAuthProviderId enum.
+ provider_id INTEGER DEFAULT 0 NOT NULL,
+ -- The external provider's id for the user.
+ provider_user_id TEXT,
+ -- Link to an external avatar image for oauth providers only.
+ provider_avatar_url TEXT
+) STRICT;
+
+CREATE UNIQUE INDEX __user__email_index ON _user (email);
+CREATE UNIQUE INDEX __user__email_verification_code_index ON _user (email_verification_code);
+CREATE UNIQUE INDEX __user__password_reset_code_index ON _user (password_reset_code);
+CREATE UNIQUE INDEX __user__authorization_code_index ON _user (authorization_code);
+CREATE UNIQUE INDEX __user__provider_ids_index ON _user (provider_id, provider_user_id);
+
+CREATE TRIGGER __user__updated_trigger AFTER UPDATE ON _user FOR EACH ROW
+ BEGIN
+ UPDATE _user SET updated = UNIXEPOCH() WHERE id = OLD.id;
+ END;
+
+--
+-- Session table
+--
+CREATE TABLE _session (
+ id INTEGER PRIMARY KEY NOT NULL,
+ user BLOB NOT NULL REFERENCES _user(id) ON DELETE CASCADE,
+ refresh_token TEXT NOT NULL,
+ updated INTEGER DEFAULT (UNIXEPOCH()) NOT NULL
+) STRICT;
+
+-- NOTE: The expiry is computed based on `updated` + TTL, thus touching the row
+-- will extend the opaque refresh token's expiry.
+CREATE TRIGGER __session__updated_trigger AFTER UPDATE ON _session FOR EACH ROW
+ BEGIN
+ UPDATE _session SET updated = UNIXEPOCH() WHERE user = OLD.user;
+ END;
+
+-- Main unique index to lookup refresh tokens efficiently.
+CREATE UNIQUE INDEX __session__refresh_token_index ON _session (refresh_token);
+-- An index on the user for efficient deletions of all sessions given a user.
+CREATE INDEX __session__user_index ON _session (user);
+
+--
+-- User avatar table
+--
+CREATE TABLE _user_avatar (
+ user BLOB PRIMARY KEY NOT NULL REFERENCES _user(id) ON DELETE CASCADE,
+ file TEXT CHECK(jsonschema('std.FileUpload', file, 'image/png, image/jpeg')) NOT NULL,
+ updated INTEGER DEFAULT (UNIXEPOCH()) NOT NULL
+) STRICT;
+
+CREATE TRIGGER __user_avatar__updated_trigger AFTER UPDATE ON _user_avatar FOR EACH ROW
+ BEGIN
+ UPDATE _user_avatar SET updated = UNIXEPOCH() WHERE user = OLD.user;
+ END;
diff --git a/trailbase-core/src/admin/config/get_config.rs b/trailbase-core/src/admin/config/get_config.rs
new file mode 100644
index 0000000..fd95bfa
--- /dev/null
+++ b/trailbase-core/src/admin/config/get_config.rs
@@ -0,0 +1,35 @@
+use axum::extract::State;
+use axum_extra::protobuf::Protobuf;
+use base64::prelude::*;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::config::proto::GetConfigResponse;
+
+pub async fn get_config_handler(
+ State(state): State,
+) -> Result, Error> {
+ let config = state.get_config();
+ let hash = config.hash();
+
+ // NOTE: We used to strip the secrets to avoid exposing them in the admin dashboard. This would
+ // be mostly relevant if no TLS (plain text transmission) or if we wanted to have less privileged
+ // dashboard users than admins.
+ // We went back on this for now, since this requires very complicated merging. For example, an
+ // oauth provider is already configured and an admin adds another one. You get back:
+ //
+ // [
+ // { provider_id: X, client_id: "old" },
+ // { provider_id: Y, client_id: "new", client_secret: "new_secret" },
+ // ]
+ //
+ // which fails validation because "old" is missing the "secret". We'd have to merge secrets back
+ // before validation on entries, which haven't been removed, ... and this true for all secrets.
+ //
+ // let (stripped, _secrets) = strip_secrets(&config)?;
+
+ return Ok(Protobuf(GetConfigResponse {
+ config: Some(config),
+ hash: Some(BASE64_URL_SAFE.encode(hash.to_le_bytes())),
+ }));
+}
diff --git a/trailbase-core/src/admin/config/mod.rs b/trailbase-core/src/admin/config/mod.rs
new file mode 100644
index 0000000..49d30ab
--- /dev/null
+++ b/trailbase-core/src/admin/config/mod.rs
@@ -0,0 +1,5 @@
+mod get_config;
+mod update_config;
+
+pub use get_config::get_config_handler;
+pub use update_config::update_config_handler;
diff --git a/trailbase-core/src/admin/config/update_config.rs b/trailbase-core/src/admin/config/update_config.rs
new file mode 100644
index 0000000..1da417d
--- /dev/null
+++ b/trailbase-core/src/admin/config/update_config.rs
@@ -0,0 +1,33 @@
+use axum::extract::State;
+use axum::http::StatusCode;
+use axum::response::IntoResponse;
+use axum_extra::protobuf::Protobuf;
+use base64::prelude::*;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::config::proto::UpdateConfigRequest;
+use crate::config::ConfigError;
+
+pub async fn update_config_handler(
+ State(state): State,
+ Protobuf(request): Protobuf,
+) -> Result {
+ let Some(Ok(hash)) = request.hash.map(|h| BASE64_URL_SAFE.decode(h)) else {
+ return Err(Error::Precondition("Missing hash".to_string()));
+ };
+ let Some(config) = request.config else {
+ return Err(Error::Precondition("Missing config".to_string()));
+ };
+
+ let current_hash = state.get_config().hash();
+ if current_hash.to_le_bytes() == *hash {
+ state
+ .validate_and_update_config(config, Some(current_hash))
+ .await?;
+
+ return Ok((StatusCode::OK, "Config updated"));
+ }
+
+ return Err(ConfigError::Update("Concurrent edit".to_string()).into());
+}
diff --git a/trailbase-core/src/admin/error.rs b/trailbase-core/src/admin/error.rs
new file mode 100644
index 0000000..0d39d96
--- /dev/null
+++ b/trailbase-core/src/admin/error.rs
@@ -0,0 +1,73 @@
+use axum::body::Body;
+use axum::http::{header::CONTENT_TYPE, StatusCode};
+use axum::response::{IntoResponse, Response};
+use log::*;
+use thiserror::Error;
+
+#[derive(Debug, Error)]
+pub enum AdminError {
+ #[error("Libsql error: {0}")]
+ Libsql(#[from] libsql::Error),
+ #[error("Deserialization error: {0}")]
+ Deserialization(#[from] serde::de::value::Error),
+ #[error("JsonSerialization error: {0}")]
+ JsonSerialization(#[from] serde_json::Error),
+ #[error("Base64 decoding error: {0}")]
+ Base64Decode(#[from] base64::DecodeError),
+ #[error("Already exists: {0}")]
+ AlreadyExists(&'static str),
+ #[error("precondition failed: {0}")]
+ Precondition(String),
+ #[error("Schema error: {0}")]
+ Schema(#[from] crate::schema::SchemaError),
+ #[error("Table lookup error: {0}")]
+ TableLookup(#[from] crate::table_metadata::TableLookupError),
+ #[error("DB Migration error: {0}")]
+ Migration(#[from] refinery::Error),
+ #[error("SQL -> Json error: {0}")]
+ Json(#[from] crate::records::sql_to_json::JsonError),
+ #[error("Schema error: {0}")]
+ SchemaError(#[from] trailbase_sqlite::schema::SchemaError),
+ #[error("Json -> SQL Params error: {0}")]
+ Params(#[from] crate::records::json_to_sql::ParamsError),
+ #[error("Config error: {0}")]
+ Config(#[from] crate::config::ConfigError),
+ #[error("Auth error: {0}")]
+ Auth(#[from] crate::auth::AuthError),
+ #[error("WhereClause error: {0}")]
+ WhereClause(#[from] crate::listing::WhereClauseError),
+ #[error("Transaction error: {0}")]
+ Transaction(#[from] crate::transaction::TransactionError),
+ #[error("JSON schema error: {0}")]
+ JSONSchema(#[from] crate::table_metadata::JsonSchemaError),
+ #[error("Email error: {0}")]
+ Email(#[from] crate::email::EmailError),
+ #[error("Query error: {0}")]
+ Query(#[from] crate::records::json_to_sql::QueryError),
+ #[error("File error: {0}")]
+ File(#[from] crate::records::files::FileError),
+ #[error("Sql parse error: {0}")]
+ SqlParse(#[from] sqlite3_parser::lexer::sql::Error),
+}
+
+impl IntoResponse for AdminError {
+ fn into_response(self) -> Response {
+ let (status, msg) = match self {
+ // FIXME: For error types that already implement "into_response" we should just unpack them.
+ // We should be able to use a generic for that.
+ Self::Auth(err) => return err.into_response(),
+ Self::Deserialization(_) => (StatusCode::BAD_REQUEST, self.to_string()),
+ Self::Precondition(_) => (StatusCode::BAD_REQUEST, self.to_string()),
+ Self::AlreadyExists(_) => (StatusCode::CONFLICT, self.to_string()),
+ // NOTE: We can almost always leak the internal error (except for permission errors) since
+ // these are errors for the admin apis.
+ ref _err => (StatusCode::INTERNAL_SERVER_ERROR, self.to_string()),
+ };
+
+ return Response::builder()
+ .status(status)
+ .header(CONTENT_TYPE, "text/plain")
+ .body(Body::new(msg))
+ .unwrap();
+ }
+}
diff --git a/trailbase-core/src/admin/jwt.rs b/trailbase-core/src/admin/jwt.rs
new file mode 100644
index 0000000..d3dc2c4
--- /dev/null
+++ b/trailbase-core/src/admin/jwt.rs
@@ -0,0 +1,10 @@
+use axum::extract::State;
+use axum::http::StatusCode;
+use axum::response::{IntoResponse, Response};
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+
+pub async fn get_public_key(State(state): State) -> Result {
+ return Ok((StatusCode::OK, state.jwt().public_key()).into_response());
+}
diff --git a/trailbase-core/src/admin/list_logs.rs b/trailbase-core/src/admin/list_logs.rs
new file mode 100644
index 0000000..4b9e64a
--- /dev/null
+++ b/trailbase-core/src/admin/list_logs.rs
@@ -0,0 +1,396 @@
+use axum::{
+ extract::{RawQuery, State},
+ Json,
+};
+use chrono::{DateTime, Duration, Utc};
+use lazy_static::lazy_static;
+use libsql::{de, params::Params, Connection};
+use log::*;
+use serde::{Deserialize, Serialize};
+use trailbase_sqlite::query_one_row;
+use ts_rs::TS;
+use uuid::Uuid;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::constants::{LOGS_RETENTION_DEFAULT, LOGS_TABLE_ID_COLUMN};
+use crate::listing::{
+ build_filter_where_clause, limit_or_default, parse_query, Order, WhereClause,
+};
+use crate::logging::Log;
+use crate::table_metadata::{lookup_and_parse_table_schema, TableMetadata};
+use crate::util::id_to_b64;
+
+#[derive(Debug, Serialize, TS)]
+pub struct LogJson {
+ pub id: Uuid,
+
+ pub created: f64,
+ pub r#type: i32,
+
+ pub level: i32,
+ pub status: u16,
+ pub method: String,
+ pub url: String,
+
+ pub latency_ms: f64,
+ pub client_ip: String,
+ pub referer: String,
+ pub user_agent: String,
+
+ #[ts(type = "Object | undefined")]
+ pub data: Option,
+}
+
+impl From for LogJson {
+ fn from(value: Log) -> Self {
+ return LogJson {
+ id: Uuid::from_bytes(value.id.unwrap()),
+ created: value.created.unwrap_or(0.0),
+ r#type: value.r#type,
+ level: value.level,
+ status: value.status,
+ method: value.method,
+ url: value.url,
+ latency_ms: value.latency,
+ client_ip: value.client_ip,
+ referer: value.referer,
+ user_agent: value.user_agent,
+ data: value.data,
+ };
+ }
+}
+
+#[derive(Debug, Serialize, TS)]
+#[ts(export)]
+pub struct ListLogsResponse {
+ total_row_count: i64,
+ cursor: Option,
+ entries: Vec,
+
+ stats: Option,
+}
+
+// FIXME: should be an admin-only api.
+pub async fn list_logs_handler(
+ State(state): State,
+ RawQuery(raw_url_query): RawQuery,
+) -> Result, Error> {
+ let conn = state.logs_conn();
+
+ // FIXME: we should probably return an error if the query parsing fails rather than quietly
+ // falling back to defaults.
+ let url_query = parse_query(raw_url_query);
+ let (filter_params, cursor, limit, order) = match url_query {
+ Some(q) => (Some(q.params), q.cursor, q.limit, q.order),
+ None => (None, None, None, None),
+ };
+
+ // NOTE: We cannot use state.table_metadata() here, since we're working on the logs database.
+ // We could cache, however this is just the admin logs handler.
+ let table = lookup_and_parse_table_schema(conn, LOGS_TABLE_NAME).await?;
+ let table_metadata = TableMetadata::new(table.clone(), &[table]);
+ let filter_where_clause = build_filter_where_clause(&table_metadata, filter_params)?;
+
+ let total_row_count = {
+ let row = query_one_row(
+ conn,
+ &format!(
+ "SELECT COUNT(*) FROM {LOGS_TABLE_NAME} WHERE {clause}",
+ clause = filter_where_clause.clause
+ ),
+ Params::Named(filter_where_clause.params.clone()),
+ )
+ .await?;
+
+ row.get::(0)?
+ };
+
+ lazy_static! {
+ static ref DEFAULT_ORDERING: Vec<(String, Order)> =
+ vec![(LOGS_TABLE_ID_COLUMN.to_string(), Order::Descending)];
+ }
+ let logs = fetch_logs(
+ conn,
+ filter_where_clause.clone(),
+ cursor,
+ order.unwrap_or_else(|| DEFAULT_ORDERING.clone()),
+ limit_or_default(limit),
+ )
+ .await?;
+
+ let stats = {
+ let now = Utc::now();
+ let args = FetchAggregateArgs {
+ filter_where_clause: Some(filter_where_clause),
+ from: now
+ - Duration::seconds(state.access_config(|c| {
+ c.server
+ .logs_retention_sec
+ .unwrap_or_else(|| LOGS_RETENTION_DEFAULT.num_seconds())
+ })),
+ to: now,
+ interval: Duration::seconds(600),
+ };
+
+ let first_page = cursor.is_none();
+ match first_page {
+ true => {
+ let stats = fetch_aggregate_stats(conn, &args).await;
+
+ if let Err(ref err) = stats {
+ warn!("Failed to fetch stats for {args:?}: {err}");
+ }
+ stats.ok()
+ }
+ false => None,
+ }
+ };
+
+ let response = ListLogsResponse {
+ total_row_count,
+ cursor: logs.last().and_then(|log| log.id.as_ref().map(id_to_b64)),
+ entries: logs
+ .into_iter()
+ .map(|log| log.into())
+ .collect::>(),
+ stats,
+ };
+
+ return Ok(Json(response));
+}
+
+async fn fetch_logs(
+ conn: &Connection,
+ filter_where_clause: WhereClause,
+ cursor: Option<[u8; 16]>,
+ order: Vec<(String, Order)>,
+ limit: usize,
+) -> Result, Error> {
+ let mut params = filter_where_clause.params;
+ let mut where_clause = filter_where_clause.clause;
+ params.push((":limit".to_string(), libsql::Value::Integer(limit as i64)));
+
+ if let Some(cursor) = cursor {
+ params.push((":cursor".to_string(), libsql::Value::Blob(cursor.to_vec())));
+ where_clause = format!("{where_clause} AND _row_.id < :cursor",);
+ }
+
+ let order_clause = order
+ .iter()
+ .map(|(col, ord)| {
+ format!(
+ "_row_.{col} {}",
+ match ord {
+ Order::Descending => "DESC",
+ Order::Ascending => "ASC",
+ }
+ )
+ })
+ .collect::>()
+ .join(", ");
+
+ let sql_query = format!(
+ r#"
+ SELECT _row_.*
+ FROM
+ (SELECT * FROM {LOGS_TABLE_NAME}) as _row_
+ WHERE
+ {where_clause}
+ ORDER BY
+ {order_clause}
+ LIMIT :limit
+ "#,
+ );
+
+ let mut rows = conn.query(&sql_query, Params::Named(params)).await?;
+
+ let mut logs: Vec = vec![];
+ while let Ok(Some(row)) = rows.next().await {
+ match de::from_row(&row) {
+ Ok(log) => logs.push(log),
+ Err(err) => warn!("failed: {err}"),
+ };
+ }
+ return Ok(logs);
+}
+
+#[derive(Debug, Serialize, TS)]
+pub struct Stats {
+ // List of (timestamp, value).
+ rate: Vec<(i64, f64)>,
+}
+
+#[derive(Debug)]
+struct FetchAggregateArgs {
+ filter_where_clause: Option,
+ from: DateTime,
+ to: DateTime,
+ interval: Duration,
+}
+
+async fn fetch_aggregate_stats(
+ conn: &Connection,
+ args: &FetchAggregateArgs,
+) -> Result {
+ let filter_clause = args
+ .filter_where_clause
+ .as_ref()
+ .map(|c| c.clause.clone())
+ .unwrap_or_else(|| "TRUE".to_string());
+
+ #[derive(Deserialize)]
+ struct AggRow {
+ interval_end_ts: i64,
+ count: i64,
+ }
+
+ // Aggregate rate of all logs in the same :interval_seconds.
+ //
+ // Note, we're aligning the interval wide grid with the latest `to` timestamp to minimize
+ // artifacts when (to - from) / interval is not an integer. This way we only get artifacts in the
+ // oldest interval.
+ let qps_query = format!(
+ r#"
+ SELECT
+ CAST(ROUND((created - :to_seconds) / :interval_seconds) AS INTEGER) * :interval_seconds + :to_seconds AS interval_end_ts,
+ COUNT(*) as count
+ FROM
+ (SELECT * FROM {LOGS_TABLE_NAME} WHERE created > :from_seconds AND created < :to_seconds AND {filter_clause} ORDER BY id DESC)
+ GROUP BY
+ interval_end_ts
+ ORDER BY
+ interval_end_ts ASC
+ "#
+ );
+
+ use libsql::Value::Integer;
+ let from_seconds = args.from.timestamp();
+ let interval_seconds = args.interval.num_seconds();
+ let mut params: Vec<(String, libsql::Value)> = vec![
+ (":interval_seconds".to_string(), Integer(interval_seconds)),
+ (":from_seconds".to_string(), Integer(from_seconds)),
+ (":to_seconds".to_string(), Integer(args.to.timestamp())),
+ ];
+
+ if let Some(filter) = &args.filter_where_clause {
+ params.extend(filter.params.clone())
+ }
+
+ let mut rows = conn.query(&qps_query, Params::Named(params)).await?;
+
+ let mut rate: Vec<(i64, f64)> = vec![];
+ while let Ok(Some(row)) = rows.next().await {
+ let r: AggRow = de::from_row(&row)?;
+
+ // The oldest interval may be clipped if "(to-from)/interval" isn't integer. In this case
+ // dividide by a shorter interval length to reduce artifacting. Otherwise, the clipped
+ // interval would appear to have a lower rater.
+ let effective_interval_seconds = std::cmp::min(
+ interval_seconds,
+ r.interval_end_ts - (from_seconds - interval_seconds),
+ ) as f64;
+
+ rate.push((
+ // Use interval midpoint as timestamp.
+ r.interval_end_ts - interval_seconds / 2,
+ // Compute rate from event count in interval.
+ (r.count as f64) / effective_interval_seconds,
+ ));
+ }
+
+ return Ok(Stats { rate });
+}
+
+#[cfg(test)]
+mod tests {
+ use chrono::{DateTime, Duration};
+
+ use super::*;
+ use crate::migrations::apply_logs_migrations;
+
+ #[tokio::test]
+ async fn test_aggregate_rate_computation() {
+ let conn = trailbase_sqlite::connect_sqlite(None, None).await.unwrap();
+ apply_logs_migrations(conn.clone()).await.unwrap();
+
+ let interval_seconds = 600;
+ let to = DateTime::parse_from_rfc3339("1996-12-22T12:00:00Z").unwrap();
+ // An **almost** 24h interval. We make it slightly shorter, so we get some clipping.
+ let from = to - Duration::seconds(24 * 3600 - 20);
+
+ {
+ // Insert test data.
+ let before = (from - Duration::seconds(1)).timestamp();
+ let after = (to + Duration::seconds(1)).timestamp();
+
+ let just_inside0 = (from + Duration::seconds(10)).timestamp();
+ let just_inside1 = (to - Duration::seconds(10)).timestamp();
+
+ let smack_in_there0 = (from + Duration::seconds(12 * 3600)).timestamp();
+ let smack_in_there1 = (from + Duration::seconds(12 * 3600 + 1)).timestamp();
+
+ conn
+ .execute_batch(&format!(
+ r#"
+ INSERT INTO {LOGS_TABLE_NAME} (created) VALUES({before});
+ INSERT INTO {LOGS_TABLE_NAME} (created) VALUES({after});
+
+ INSERT INTO {LOGS_TABLE_NAME} (created) VALUES({just_inside0});
+ INSERT INTO {LOGS_TABLE_NAME} (created) VALUES({just_inside1});
+
+ INSERT INTO {LOGS_TABLE_NAME} (created) VALUES({smack_in_there0});
+ INSERT INTO {LOGS_TABLE_NAME} (created) VALUES({smack_in_there1});
+ "#,
+ ))
+ .await
+ .unwrap();
+ }
+
+ let args = FetchAggregateArgs {
+ filter_where_clause: None,
+ from: from.into(),
+ to: to.into(),
+ interval: Duration::seconds(interval_seconds),
+ };
+
+ let stats = fetch_aggregate_stats(&conn, &args).await.unwrap();
+
+ // Assert that there are 3 data points in the given range and that all of them have a rate of
+ // one log in the 600s interval.
+ let rates = stats.rate;
+ assert_eq!(rates.len(), 3);
+
+ // Assert the oldest, clipped interval has a slightly elevated rate.
+ {
+ let rate = rates[0];
+ assert_eq!(
+ DateTime::from_timestamp(rate.0, 0).unwrap(),
+ DateTime::parse_from_rfc3339("1996-12-21T11:55:00Z").unwrap()
+ );
+ assert!(rate.1 > 1.0 / interval_seconds as f64);
+ }
+
+ // Assert the middle rate, has two logs, i.e. double the base rate.
+ {
+ let rate = rates[1];
+ assert_eq!(
+ DateTime::from_timestamp(rate.0, 0).unwrap(),
+ DateTime::parse_from_rfc3339("1996-12-21T23:55:00Z").unwrap()
+ );
+ assert_eq!(rate.1, 2.0 / interval_seconds as f64);
+ }
+
+ // Assert the youngest, most recent interval has the base rate.
+ {
+ let rate = rates[2];
+ assert_eq!(
+ DateTime::from_timestamp(rate.0, 0).unwrap(),
+ DateTime::parse_from_rfc3339("1996-12-22T11:55:00Z").unwrap()
+ );
+ assert_eq!(rate.1, 1.0 / interval_seconds as f64);
+ }
+ }
+}
+
+const LOGS_TABLE_NAME: &str = "_logs";
diff --git a/trailbase-core/src/admin/mod.rs b/trailbase-core/src/admin/mod.rs
new file mode 100644
index 0000000..5ca4b52
--- /dev/null
+++ b/trailbase-core/src/admin/mod.rs
@@ -0,0 +1,66 @@
+mod config;
+mod error;
+mod jwt;
+mod list_logs;
+mod oauth_providers;
+mod parse;
+mod query;
+pub(crate) mod rows;
+mod schema;
+mod table;
+pub(crate) mod user;
+
+pub use error::AdminError;
+
+use crate::app_state::AppState;
+use axum::{
+ routing::{delete, get, patch, post},
+ Router,
+};
+
+pub fn router() -> Router {
+ Router::new()
+ // Row actions.
+ .route("/table/:table_name/rows", get(rows::list_rows_handler))
+ .route("/table/:table_name/files", get(rows::read_files_handler))
+ .route("/table/:table_name/rows", delete(rows::delete_rows_handler))
+ .route("/table/:table_name", patch(rows::update_row_handler))
+ .route("/table/:table_name", post(rows::insert_row_handler))
+ .route("/table/:table_name", delete(rows::delete_row_handler))
+ // Index actions.
+ .route("/index", post(table::create_index_handler))
+ .route("/index", patch(table::alter_index_handler))
+ .route("/index", delete(table::drop_index_handler))
+ // Table actions.
+ .route(
+ "/table/:table_name/schema.json",
+ get(table::get_table_schema_handler),
+ )
+ .route("/table", post(table::create_table_handler))
+ .route("/table", delete(table::drop_table_handler))
+ .route("/table", patch(table::alter_table_handler))
+ // Table & Index actions.
+ .route("/tables", get(table::list_tables_handler))
+ // Config actions
+ .route("/config", get(config::get_config_handler))
+ .route("/config", post(config::update_config_handler))
+ // User actions
+ .route("/user", get(user::list_users_handler))
+ .route("/user", post(user::create_user_handler))
+ .route("/user", patch(user::update_user_handler))
+ // Schema actions
+ .route("/schema", get(schema::list_schemas_handler))
+ .route("/schema", post(schema::update_schema_handler))
+ // Logs
+ .route("/logs", get(list_logs::list_logs_handler))
+ // Query execution handler for the UI editor
+ .route("/query", post(query::query_handler))
+ // Parse handler for UI validation.
+ .route("/parse", post(parse::parse_handler))
+ // List available oauth providers
+ .route(
+ "/oauth_providers",
+ get(oauth_providers::available_oauth_providers_handler),
+ )
+ .route("/public_key", get(jwt::get_public_key))
+}
diff --git a/trailbase-core/src/admin/oauth_providers.rs b/trailbase-core/src/admin/oauth_providers.rs
new file mode 100644
index 0000000..2d92978
--- /dev/null
+++ b/trailbase-core/src/admin/oauth_providers.rs
@@ -0,0 +1,22 @@
+use axum::extract::Json;
+use serde::Serialize;
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::auth::oauth::providers::{oauth_provider_registry, OAuthProviderEntry};
+
+#[derive(Debug, Serialize, TS)]
+#[ts(export)]
+pub struct OAuthProviderResponse {
+ providers: Vec,
+}
+
+pub async fn available_oauth_providers_handler(// State(state): State,
+) -> Result, Error> {
+ return Ok(Json(OAuthProviderResponse {
+ providers: oauth_provider_registry
+ .iter()
+ .map(|factory| factory.into())
+ .collect(),
+ }));
+}
diff --git a/trailbase-core/src/admin/parse.rs b/trailbase-core/src/admin/parse.rs
new file mode 100644
index 0000000..1771a83
--- /dev/null
+++ b/trailbase-core/src/admin/parse.rs
@@ -0,0 +1,57 @@
+use axum::{extract::State, Json};
+use base64::prelude::*;
+use serde::{Deserialize, Serialize};
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::table_metadata::sqlite3_parse_into_statements;
+
+#[derive(Debug, Deserialize, Serialize, TS)]
+pub enum Mode {
+ Expression,
+ Statement,
+}
+
+#[derive(Debug, Deserialize, Serialize, TS)]
+#[ts(export)]
+pub struct ParseRequest {
+ query: String,
+ mode: Option,
+ // NOTE: We could probably be more specific for access checks setting up _REQ_, _ROW_, _USER_
+ // appropriately.
+ // create_access: bool,
+ // read_access: bool,
+ // update_access: bool,
+ // delete_access: bool,
+}
+
+#[derive(Debug, Deserialize, Serialize, TS)]
+#[ts(export)]
+pub struct ParseResponse {
+ ok: bool,
+ message: Option,
+}
+
+pub async fn parse_handler(
+ State(_state): State,
+ Json(request): Json,
+) -> Result, Error> {
+ let query = String::from_utf8_lossy(&BASE64_URL_SAFE.decode(request.query)?).to_string();
+
+ let result = match request.mode.unwrap_or(Mode::Expression) {
+ Mode::Statement => sqlite3_parse_into_statements(&query),
+ Mode::Expression => sqlite3_parse_into_statements(&format!("SELECT ({query})")),
+ };
+
+ return match result.err() {
+ None => Ok(Json(ParseResponse {
+ ok: true,
+ message: None,
+ })),
+ Some(err) => Ok(Json(ParseResponse {
+ ok: false,
+ message: Some(err.to_string()),
+ })),
+ };
+}
diff --git a/trailbase-core/src/admin/query.rs b/trailbase-core/src/admin/query.rs
new file mode 100644
index 0000000..fa6512b
--- /dev/null
+++ b/trailbase-core/src/admin/query.rs
@@ -0,0 +1,82 @@
+use axum::{extract::State, Json};
+use serde::{Deserialize, Serialize};
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::records::sql_to_json::rows_to_json_arrays;
+use crate::schema::Column;
+use crate::table_metadata::sqlite3_parse_into_statements;
+
+#[derive(Debug, Default, Serialize, TS)]
+#[ts(export)]
+pub struct QueryResponse {
+ columns: Option>,
+
+ #[ts(type = "Object[][]")]
+ rows: Vec>,
+}
+
+#[derive(Debug, Deserialize, Serialize, TS)]
+#[ts(export)]
+pub struct QueryRequest {
+ query: String,
+}
+
+pub async fn query_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result, Error> {
+ // NOTE: conn.query() only executes the first query and quietly drops the rest :/.
+ //
+ // In an ideal world we'd use sqlparser to validate the entire query before doing anything *and*
+ // also to break up the statements and execute them one-by-one. However, sqlparser is far from
+ // having 100% coverage, for example, it doesn't parse trigger statements (maybe
+ // https://crates.io/crates/sqlite3-parser would have been the better choice).
+ //
+ // In the end we really want to allow executing all constructs as valid to sqlite. As such we
+ // best effort parse the statements to see if need to invalidate the table cache and otherwise
+ // fall back to libsql's execute batch which materializes all rows and invalidate anyway.
+
+ // Check the statements are correct before executing anything, just to be sure.
+ let statements = sqlite3_parse_into_statements(&request.query)?;
+ let mut must_invalidate_table_cache = false;
+ for stmt in statements {
+ use sqlite3_parser::ast::Stmt;
+
+ match stmt {
+ Stmt::DropView { .. }
+ | Stmt::DropTable { .. }
+ | Stmt::AlterTable { .. }
+ | Stmt::CreateTable { .. }
+ | Stmt::CreateVirtualTable { .. }
+ | Stmt::CreateView { .. } => {
+ must_invalidate_table_cache = true;
+ }
+ _ => {
+ // Do nothing.
+ }
+ }
+ }
+
+ let batched_rows_result = state.conn().execute_batch(&request.query).await;
+
+ // In the fallback case we always need to invalidate the cache.
+ if must_invalidate_table_cache {
+ state.table_metadata().invalidate_all().await?;
+ }
+
+ let mut batched_rows = batched_rows_result?;
+
+ let mut prev: Option = None;
+ while let Some(maybe_rows) = batched_rows.next_stmt_row() {
+ prev = maybe_rows;
+ }
+
+ if let Some(result_rows) = prev {
+ let (rows, columns) = rows_to_json_arrays(result_rows, 1024).await?;
+
+ return Ok(Json(QueryResponse { columns, rows }));
+ }
+ return Ok(Json(QueryResponse::default()));
+}
diff --git a/trailbase-core/src/admin/rows/delete_rows.rs b/trailbase-core/src/admin/rows/delete_rows.rs
new file mode 100644
index 0000000..1c8ad5f
--- /dev/null
+++ b/trailbase-core/src/admin/rows/delete_rows.rs
@@ -0,0 +1,239 @@
+use axum::{
+ extract::{Path, State},
+ http::StatusCode,
+ response::{IntoResponse, Response},
+ Json,
+};
+use serde::{Deserialize, Serialize};
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::records::json_to_sql::simple_json_value_to_param;
+use crate::records::json_to_sql::DeleteQueryBuilder;
+
+#[derive(Debug, Serialize, Deserialize, Default, TS)]
+#[ts(export)]
+pub struct DeleteRowRequest {
+ primary_key_column: String,
+
+ /// The primary key (of any type since we're in row instead of RecordApi land) of rows that
+ /// shall be deleted.
+ #[ts(type = "Object")]
+ value: serde_json::Value,
+}
+
+pub async fn delete_row_handler(
+ State(state): State,
+ Path(table_name): Path,
+ Json(request): Json,
+) -> Result {
+ delete_row(
+ &state,
+ table_name,
+ &request.primary_key_column,
+ request.value,
+ )
+ .await?;
+ return Ok((StatusCode::OK, "deleted").into_response());
+}
+
+async fn delete_row(
+ state: &AppState,
+ table_name: String,
+ pk_col: &str,
+ value: serde_json::Value,
+) -> Result<(), Error> {
+ let Some(table_metadata) = state.table_metadata().get(&table_name) else {
+ return Err(Error::Precondition(format!("Table {table_name} not found")));
+ };
+
+ let Some((column, _col_meta)) = table_metadata.column_by_name(pk_col) else {
+ return Err(Error::Precondition(format!("Missing column: {pk_col}")));
+ };
+
+ if !column.is_primary() {
+ return Err(Error::Precondition(format!("Not a primary key: {pk_col}")));
+ }
+
+ DeleteQueryBuilder::run(
+ state,
+ &table_metadata,
+ pk_col,
+ simple_json_value_to_param(column.data_type, value)?,
+ )
+ .await?;
+
+ return Ok(());
+}
+
+#[derive(Debug, Serialize, Deserialize, Default, TS)]
+#[ts(export)]
+pub struct DeleteRowsRequest {
+ /// Name of the primary key column we use to identify which rows to delete.
+ primary_key_column: String,
+
+ /// A list of primary keys (of any type since we're in row instead of RecordApi land)
+ /// of rows that shall be deleted.
+ #[ts(type = "Object[]")]
+ values: Vec,
+}
+
+pub async fn delete_rows_handler(
+ State(state): State,
+ Path(table_name): Path,
+ Json(request): Json,
+) -> Result {
+ let DeleteRowsRequest {
+ primary_key_column,
+ values,
+ } = request;
+
+ for value in values {
+ delete_row(&state, table_name.clone(), &primary_key_column, value).await?;
+ }
+
+ return Ok((StatusCode::OK, "deleted all").into_response());
+}
+
+#[cfg(test)]
+mod tests {
+ use axum::extract::{Json, Path, RawQuery, State};
+ use trailbase_sqlite::query_one_row;
+
+ use super::*;
+ use crate::admin::rows::insert_row::insert_row_handler;
+ use crate::admin::rows::list_rows::list_rows_handler;
+ use crate::admin::rows::update_row::{update_row_handler, UpdateRowRequest};
+ use crate::admin::table::{create_table_handler, CreateTableRequest};
+ use crate::app_state::*;
+ use crate::schema::{Column, ColumnDataType, ColumnOption, Table};
+ use crate::util::{b64_to_uuid, uuid_to_b64};
+
+ // TODO: This full-lifecycle test should probably live outside the scope of delete_row.
+ #[tokio::test]
+ async fn test_insert_update_delete_rows() {
+ let state = test_state(None).await.unwrap();
+ let conn = state.conn();
+
+ let table_name = "test_table".to_string();
+ let pk_col = "myid".to_string();
+ let _ = create_table_handler(
+ State(state.clone()),
+ Json(CreateTableRequest {
+ schema: Table {
+ name: table_name.clone(),
+ strict: false,
+ columns: vec![
+ Column {
+ name: pk_col.clone(),
+ data_type: ColumnDataType::Blob,
+ options: vec![
+ ColumnOption::Unique { is_primary: true },
+ ColumnOption::Check(format!("(is_uuid_v7({pk_col}))")),
+ ColumnOption::Default("(uuid_v7())".to_string()),
+ ],
+ },
+ Column {
+ name: "col0".to_string(),
+ data_type: ColumnDataType::Text,
+ options: vec![],
+ },
+ ],
+ foreign_keys: vec![],
+ unique: vec![],
+ virtual_table: false,
+ temporary: false,
+ },
+ dry_run: Some(false),
+ }),
+ )
+ .await
+ .unwrap();
+
+ let insert = |value: &str| {
+ insert_row_handler(
+ State(state.clone()),
+ Path(table_name.clone()),
+ Json(serde_json::json!({
+ "col0": value,
+ })),
+ )
+ };
+
+ let get_id = |row: Vec| {
+ return match &row[0] {
+ serde_json::Value::String(str) => b64_to_uuid(str).unwrap(),
+ x => {
+ panic!("unexpected type: {x:?}");
+ }
+ };
+ };
+
+ let id0 = {
+ let Json(row) = insert("row0").await.unwrap();
+ assert_eq!(&row[1], "row0");
+ get_id(row)
+ };
+ let id1 = {
+ let Json(row) = insert("row1").await.unwrap();
+ assert_eq!(&row[1], "row1");
+ get_id(row)
+ };
+
+ let count = || async {
+ query_one_row(conn, &format!("SELECT COUNT(*) FROM '{table_name}'"), ())
+ .await
+ .unwrap()
+ .get::(0)
+ .unwrap()
+ };
+
+ assert_eq!(count().await, 2);
+
+ let updated_value = "row0 updated";
+ update_row_handler(
+ State(state.clone()),
+ Path(table_name.clone()),
+ Json(UpdateRowRequest {
+ primary_key_column: pk_col.clone(),
+ primary_key_value: serde_json::Value::String(uuid_to_b64(&id0)),
+ row: serde_json::json!({
+ "col0": updated_value.to_string(),
+ }),
+ }),
+ )
+ .await
+ .unwrap();
+
+ let listing = list_rows_handler(
+ State(state.clone()),
+ Path(table_name.clone()),
+ RawQuery(Some(format!("{pk_col}={}", uuid_to_b64(&id0)))),
+ )
+ .await
+ .unwrap();
+
+ assert_eq!(listing.rows.len(), 1, "Listing: {listing:?}");
+ assert_eq!(
+ listing.rows[0][1],
+ serde_json::Value::String(updated_value.to_string())
+ );
+
+ let delete = |id: uuid::Uuid| {
+ delete_row_handler(
+ State(state.clone()),
+ Path(table_name.clone()),
+ Json(DeleteRowRequest {
+ primary_key_column: pk_col.clone(),
+ value: serde_json::Value::String(uuid_to_b64(&id)),
+ }),
+ )
+ };
+
+ delete(id0).await.unwrap();
+ delete(id1).await.unwrap();
+
+ assert_eq!(count().await, 0);
+ }
+}
diff --git a/trailbase-core/src/admin/rows/insert_row.rs b/trailbase-core/src/admin/rows/insert_row.rs
new file mode 100644
index 0000000..659c803
--- /dev/null
+++ b/trailbase-core/src/admin/rows/insert_row.rs
@@ -0,0 +1,38 @@
+use axum::extract::{Path, State};
+use axum::Json;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::records::json_to_sql::{InsertQueryBuilder, Params};
+use crate::records::sql_to_json::row_to_json_array;
+
+type Row = Vec;
+
+pub async fn insert_row_handler(
+ State(state): State,
+ Path(table_name): Path,
+ Json(request): Json,
+) -> Result, Error> {
+ let row = insert_row(&state, table_name, request).await?;
+ return Ok(Json(row));
+}
+
+pub async fn insert_row(
+ state: &AppState,
+ table_name: String,
+ value: serde_json::Value,
+) -> Result {
+ let Some(table_metadata) = state.table_metadata().get(&table_name) else {
+ return Err(Error::Precondition(format!("Table {table_name} not found")));
+ };
+
+ let row = InsertQueryBuilder::run(
+ state,
+ Params::from(&table_metadata, value, None)?,
+ None,
+ Some("*"),
+ )
+ .await?;
+
+ return Ok(row_to_json_array(row)?);
+}
diff --git a/trailbase-core/src/admin/rows/list_rows.rs b/trailbase-core/src/admin/rows/list_rows.rs
new file mode 100644
index 0000000..3c5e11d
--- /dev/null
+++ b/trailbase-core/src/admin/rows/list_rows.rs
@@ -0,0 +1,189 @@
+use axum::extract::{Json, Path, RawQuery, State};
+use libsql::{params::Params, Connection};
+use log::*;
+use serde::Serialize;
+use std::sync::Arc;
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::api::query_one_row;
+use crate::app_state::AppState;
+use crate::listing::{
+ build_filter_where_clause, limit_or_default, parse_query, Order, WhereClause,
+};
+use crate::records::sql_to_json::rows_to_json_arrays;
+use crate::schema::Column;
+use crate::table_metadata::TableOrViewMetadata;
+
+#[derive(Debug, Serialize, TS)]
+#[ts(export)]
+pub struct ListRowsResponse {
+ pub total_row_count: i64,
+ pub cursor: Option,
+
+ pub columns: Vec,
+
+ // NOTE: use `Object` rather than object to include primitive types.
+ #[ts(type = "Object[][]")]
+ pub rows: Vec>,
+}
+
+pub async fn list_rows_handler(
+ State(state): State,
+ Path(table_name): Path,
+ RawQuery(raw_url_query): RawQuery,
+) -> Result, Error> {
+ let (filter_params, cursor, offset, limit, order) = match parse_query(raw_url_query) {
+ Some(q) => (Some(q.params), q.cursor, q.offset, q.limit, q.order),
+ None => (None, None, None, None, None),
+ };
+
+ let (virtual_table, table_or_view_metadata): (bool, Arc) = {
+ if let Some(table_metadata) = state.table_metadata().get(&table_name) {
+ (table_metadata.schema.virtual_table, table_metadata)
+ } else if let Some(view_metadata) = state.table_metadata().get_view(&table_name) {
+ (false, view_metadata)
+ } else {
+ return Err(Error::Precondition(format!(
+ "Table or view '{table_name}' not found"
+ )));
+ }
+ };
+
+ // Where clause contains column filters and cursor depending on what's present in the url query
+ // string.
+ let filter_where_clause = build_filter_where_clause(&*table_or_view_metadata, filter_params)?;
+
+ let total_row_count = {
+ let where_clause = &filter_where_clause.clause;
+ let count_query = format!("SELECT COUNT(*) FROM '{table_name}' WHERE {where_clause}");
+ let row = query_one_row(
+ state.conn(),
+ &count_query,
+ Params::Named(filter_where_clause.params.clone()),
+ )
+ .await?;
+ row.get::(0)?
+ };
+
+ let cursor_column = table_or_view_metadata.record_pk_column();
+ let (rows, columns) = fetch_rows(
+ state.conn(),
+ &table_name,
+ filter_where_clause,
+ order,
+ Pagination {
+ cursor_column: cursor_column.map(|(_idx, c)| c),
+ cursor,
+ offset,
+ limit: limit_or_default(limit),
+ },
+ )
+ .await?;
+
+ let next_cursor = cursor_column.and_then(|(col_idx, _col)| {
+ let row = rows.last()?;
+ assert!(row.len() > col_idx);
+ match &row[col_idx] {
+ serde_json::Value::String(id) => {
+ // Should be a base64 encoded [u8; 16] id.
+ Some(id.clone())
+ }
+ _ => None,
+ }
+ });
+
+ return Ok(Json(ListRowsResponse {
+ total_row_count,
+ cursor: next_cursor,
+ // NOTE: in the view case we don't have a good way of extracting the columns from the "CREATE
+ // VIEW" query so we fall back to columns constructed from the returned data.
+ columns: match virtual_table {
+ true => columns.unwrap_or_else(Vec::new),
+ false => table_or_view_metadata.columns().unwrap_or_else(|| {
+ debug!("Falling back to inferred cols for view: '{table_name}'");
+ columns.unwrap_or_else(Vec::new)
+ }),
+ },
+ rows,
+ }));
+}
+
+struct Pagination<'a> {
+ cursor_column: Option<&'a Column>,
+ cursor: Option<[u8; 16]>,
+ offset: Option,
+ limit: usize,
+}
+
+async fn fetch_rows(
+ conn: &Connection,
+ table_or_view_name: &str,
+ filter_where_clause: WhereClause,
+ order: Option>,
+ pagination: Pagination<'_>,
+) -> Result<(Vec>, Option>), Error> {
+ let WhereClause {
+ mut clause,
+ mut params,
+ } = filter_where_clause;
+ params.push((
+ ":limit".to_string(),
+ libsql::Value::Integer(pagination.limit as i64),
+ ));
+ params.push((
+ ":offset".to_string(),
+ libsql::Value::Integer(pagination.offset.unwrap_or(0) as i64),
+ ));
+
+ if let Some(cursor) = pagination.cursor {
+ params.push((":cursor".to_string(), libsql::Value::Blob(cursor.to_vec())));
+ clause = format!("{clause} AND _row_.id < :cursor",);
+ }
+
+ let order_clause = match order {
+ Some(order) => order
+ .iter()
+ .map(|(col, ord)| {
+ format!(
+ "_row_.{col} {}",
+ match ord {
+ Order::Descending => "DESC",
+ Order::Ascending => "ASC",
+ }
+ )
+ })
+ .collect::>()
+ .join(", "),
+ None => match pagination.cursor_column {
+ Some(col) => format!("{col_name} DESC", col_name = col.name),
+ None => "NULL".to_string(),
+ },
+ };
+
+ let query = format!(
+ r#"
+ SELECT _row_.*
+ FROM
+ (SELECT * FROM {table_or_view_name}) as _row_
+ WHERE
+ {clause}
+ ORDER BY
+ {order_clause}
+ LIMIT :limit
+ OFFSET :offset
+ "#,
+ );
+
+ let result_rows = conn
+ .query(&query, libsql::params::Params::Named(params))
+ .await
+ .map_err(|err| {
+ #[cfg(debug_assertions)]
+ error!("QUERY: {query}\n\t=> {err}");
+
+ return err;
+ })?;
+
+ return Ok(rows_to_json_arrays(result_rows, 1024).await?);
+}
diff --git a/trailbase-core/src/admin/rows/mod.rs b/trailbase-core/src/admin/rows/mod.rs
new file mode 100644
index 0000000..3a9d72d
--- /dev/null
+++ b/trailbase-core/src/admin/rows/mod.rs
@@ -0,0 +1,11 @@
+mod delete_rows;
+mod insert_row;
+mod list_rows;
+mod read_files;
+mod update_row;
+
+pub(super) use delete_rows::{delete_row_handler, delete_rows_handler};
+pub(super) use insert_row::insert_row_handler;
+pub(super) use list_rows::list_rows_handler;
+pub(super) use read_files::read_files_handler;
+pub(super) use update_row::update_row_handler;
diff --git a/trailbase-core/src/admin/rows/read_files.rs b/trailbase-core/src/admin/rows/read_files.rs
new file mode 100644
index 0000000..25c5814
--- /dev/null
+++ b/trailbase-core/src/admin/rows/read_files.rs
@@ -0,0 +1,79 @@
+use axum::{
+ extract::{Path, Query, State},
+ response::Response,
+};
+use serde::Deserialize;
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::records::files::read_file_into_response;
+use crate::records::json_to_sql::simple_json_value_to_param;
+use crate::records::json_to_sql::{GetFileQueryBuilder, GetFilesQueryBuilder};
+
+#[derive(Debug, Deserialize, TS)]
+#[ts(export)]
+pub struct ReadFilesRequest {
+ pk_column: String,
+
+ /// The primary key (of any type since we're in row instead of RecordAPI land) of rows that
+ /// shall be deleted.
+ #[ts(type = "Object")]
+ pk_value: serde_json::Value,
+
+ file_column_name: String,
+ file_index: Option,
+}
+
+pub async fn read_files_handler(
+ State(state): State,
+ Path(table_name): Path,
+ Query(request): Query,
+) -> Result {
+ let Some(table_metadata) = state.table_metadata().get(&table_name) else {
+ return Err(Error::Precondition(format!("Table {table_name} not found")));
+ };
+ let pk_col = &request.pk_column;
+
+ let Some((col, _col_meta)) = table_metadata.column_by_name(pk_col) else {
+ return Err(Error::Precondition(format!("Missing column: {pk_col}")));
+ };
+
+ if !col.is_primary() {
+ return Err(Error::Precondition(format!("Not a primary key: {pk_col}")));
+ }
+
+ let Some(file_col_metadata) = table_metadata.column_by_name(&request.file_column_name) else {
+ return Err(Error::Precondition(format!("Missing column: {pk_col}")));
+ };
+
+ let pk_value = simple_json_value_to_param(col.data_type, request.pk_value)?;
+
+ return if let Some(file_index) = request.file_index {
+ let mut file_uploads = GetFilesQueryBuilder::run(
+ &state,
+ &table_name,
+ file_col_metadata,
+ &request.pk_column,
+ pk_value,
+ )
+ .await?;
+
+ if file_index >= file_uploads.0.len() {
+ return Err(Error::Precondition(format!("Out of bounds: {file_index}")));
+ }
+
+ Ok(read_file_into_response(&state, file_uploads.0.remove(file_index)).await?)
+ } else {
+ let file_upload = GetFileQueryBuilder::run(
+ &state,
+ &table_name,
+ file_col_metadata,
+ &request.pk_column,
+ pk_value,
+ )
+ .await?;
+
+ Ok(read_file_into_response(&state, file_upload).await?)
+ };
+}
diff --git a/trailbase-core/src/admin/rows/update_row.rs b/trailbase-core/src/admin/rows/update_row.rs
new file mode 100644
index 0000000..9ca05cb
--- /dev/null
+++ b/trailbase-core/src/admin/rows/update_row.rs
@@ -0,0 +1,54 @@
+use axum::extract::{Path, State};
+use axum::Json;
+use serde::{Deserialize, Serialize};
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::records::json_to_sql::{simple_json_value_to_param, Params, UpdateQueryBuilder};
+
+#[derive(Debug, Serialize, Deserialize, Default, TS)]
+#[ts(export)]
+pub struct UpdateRowRequest {
+ pub primary_key_column: String,
+
+ #[ts(type = "Object")]
+ pub primary_key_value: serde_json::Value,
+
+ /// This is expected to be a map from column name to value.
+ ///
+ /// Note that using an array here wouldn't make sense. The map allows for sparseness and only
+ /// updating specific cells.
+ #[ts(type = "{ [key: string]: Object | undefined }")]
+ pub row: serde_json::Value,
+}
+
+pub async fn update_row_handler(
+ State(state): State,
+ Path(table_name): Path,
+ Json(request): Json,
+) -> Result<(), Error> {
+ let Some(table_metadata) = state.table_metadata().get(&table_name) else {
+ return Err(Error::Precondition(format!("Table {table_name} not found")));
+ };
+
+ let pk_col = &request.primary_key_column;
+ let Some((column, _col_meta)) = table_metadata.column_by_name(pk_col) else {
+ return Err(Error::Precondition(format!("Missing column: {pk_col}")));
+ };
+
+ if !column.is_primary() {
+ return Err(Error::Precondition(format!("Not a primary key: {pk_col}")));
+ }
+
+ UpdateQueryBuilder::run(
+ &state,
+ &table_metadata,
+ Params::from(&table_metadata, request.row, None)?,
+ &column.name,
+ simple_json_value_to_param(column.data_type, request.primary_key_value)?,
+ )
+ .await?;
+
+ return Ok(());
+}
diff --git a/trailbase-core/src/admin/schema/mod.rs b/trailbase-core/src/admin/schema/mod.rs
new file mode 100644
index 0000000..77b0908
--- /dev/null
+++ b/trailbase-core/src/admin/schema/mod.rs
@@ -0,0 +1,97 @@
+use axum::extract::{Json, State};
+use serde::{Deserialize, Serialize};
+use ts_rs::TS;
+
+use trailbase_sqlite::schema::{get_schemas, set_user_schema};
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+
+#[derive(Debug, Serialize, TS)]
+pub struct JsonSchema {
+ pub name: String,
+ // NOTE: ideally we'd return an js `Object` here, however tanstack-form goes bonkers with
+ // excessive type evaluation depth. Maybe we shouldn't use tanstack-form for schemas?
+ pub schema: String,
+ pub builtin: bool,
+}
+
+#[derive(Debug, Serialize, TS)]
+#[ts(export)]
+pub struct ListJsonSchemasResponse {
+ schemas: Vec,
+}
+
+impl From for JsonSchema {
+ fn from(value: trailbase_sqlite::schema::Schema) -> Self {
+ return JsonSchema {
+ name: value.name,
+ schema: value.schema.to_string(),
+ builtin: value.builtin,
+ };
+ }
+}
+
+pub async fn list_schemas_handler(
+ State(_state): State,
+) -> Result, Error> {
+ let schemas = get_schemas();
+
+ return Ok(Json(ListJsonSchemasResponse {
+ schemas: schemas.into_iter().map(|s| s.into()).collect(),
+ }));
+}
+
+#[derive(Debug, Deserialize, TS)]
+#[ts(export)]
+pub struct UpdateJsonSchemaRequest {
+ name: String,
+ #[ts(type = "Object | undefined")]
+ schema: Option,
+}
+
+pub async fn update_schema_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result, Error> {
+ // Update the schema in memory.
+ let (name, schema) = (request.name, request.schema);
+ set_user_schema(&name, schema.clone())?;
+
+ // And if that succeeds update config.
+ let mut config = state.get_config();
+ if let Some(schema) = schema {
+ // Add/update
+ let mut found = false;
+ for s in &mut config.schemas {
+ if s.name.as_ref() == Some(&name) {
+ s.schema = Some(schema.to_string());
+ found = true;
+ }
+ }
+
+ if !found {
+ config.schemas.push(crate::config::proto::JsonSchemaConfig {
+ name: Some(name.clone()),
+ schema: Some(schema.to_string()),
+ })
+ }
+ } else {
+ // Remove
+ config.schemas = config
+ .schemas
+ .into_iter()
+ .filter_map(|s| {
+ if s.name.as_ref() == Some(&name) {
+ return None;
+ }
+ return Some(s);
+ })
+ .collect();
+ }
+
+ // FIXME: Use hashed update to avoid races.
+ state.validate_and_update_config(config, None).await?;
+
+ return Ok(Json(serde_json::json!({})));
+}
diff --git a/trailbase-core/src/admin/table/alter_index.rs b/trailbase-core/src/admin/table/alter_index.rs
new file mode 100644
index 0000000..2701673
--- /dev/null
+++ b/trailbase-core/src/admin/table/alter_index.rs
@@ -0,0 +1,58 @@
+use axum::{
+ extract::State,
+ http::StatusCode,
+ response::{IntoResponse, Response},
+ Json,
+};
+use log::*;
+use serde::Deserialize;
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::schema::TableIndex;
+use crate::transaction::TransactionRecorder;
+
+#[derive(Clone, Debug, Deserialize, TS)]
+#[ts(export)]
+pub struct AlterIndexRequest {
+ pub source_schema: TableIndex,
+ pub target_schema: TableIndex,
+}
+
+// NOTE: sqlite has very limited alter table support, thus we're always recreating the table and
+// moving data over, see https://sqlite.org/lang_altertable.html.
+
+pub async fn alter_index_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result {
+ let conn = state.conn();
+
+ let source_schema = request.source_schema;
+ let source_index_name = &source_schema.name;
+ let target_schema = request.target_schema;
+
+ debug!("Alter index:\nsource: {source_schema:?}\ntarget: {target_schema:?}",);
+
+ let mut tx = TransactionRecorder::new(
+ conn.clone(),
+ state.data_dir().migrations_path(),
+ format!("alter_index_{source_index_name}"),
+ )
+ .await?;
+
+ // Drop old index
+ tx.execute(&format!("DROP INDEX {source_index_name}"))
+ .await?;
+
+ // Create new index
+ let create_index_query = target_schema.create_index_statement();
+ tx.query(&create_index_query).await?;
+
+ // Write to migration file.
+ let report = tx.commit_and_create_migration().await?;
+ debug!("Migration report: {report:?}");
+
+ return Ok((StatusCode::OK, "altered index").into_response());
+}
diff --git a/trailbase-core/src/admin/table/alter_table.rs b/trailbase-core/src/admin/table/alter_table.rs
new file mode 100644
index 0000000..9f9ae69
--- /dev/null
+++ b/trailbase-core/src/admin/table/alter_table.rs
@@ -0,0 +1,223 @@
+use std::collections::HashSet;
+
+use axum::{
+ extract::State,
+ http::StatusCode,
+ response::{IntoResponse, Response},
+ Json,
+};
+use log::*;
+use serde::Deserialize;
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::schema::Table;
+use crate::transaction::TransactionRecorder;
+
+#[derive(Clone, Debug, Deserialize, TS)]
+#[ts(export)]
+pub struct AlterTableRequest {
+ pub source_schema: Table,
+ pub target_schema: Table,
+}
+
+// NOTE: sqlite has very limited alter table support, thus we're always recreating the table and
+// moving data over, see https://sqlite.org/lang_altertable.html.
+
+pub async fn alter_table_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result {
+ let source_schema = request.source_schema;
+ let source_table_name = &source_schema.name;
+
+ let Some(_metadata) = state.table_metadata().get(source_table_name) else {
+ return Err(Error::Precondition(format!(
+ "Cannot alter '{source_table_name}'. Only tables are supported.",
+ )));
+ };
+
+ let target_schema = request.target_schema;
+ let target_table_name = &target_schema.name;
+
+ debug!("Alter table:\nsource: {source_schema:?}\ntarget: {target_schema:?}",);
+
+ let temp_table_name: String = {
+ if target_table_name != source_table_name {
+ target_table_name.clone()
+ } else {
+ format!("__alter_table_{target_table_name}")
+ }
+ };
+
+ let source_columns: HashSet = source_schema
+ .columns
+ .iter()
+ .map(|c| c.name.clone())
+ .collect();
+ let copy_columns: Vec = target_schema
+ .columns
+ .iter()
+ .filter_map(|c| {
+ if source_columns.contains(&c.name) {
+ Some(c.name.clone())
+ } else {
+ None
+ }
+ })
+ .collect();
+
+ let mut target_schema_copy = target_schema.clone();
+ target_schema_copy.name = temp_table_name.to_string();
+
+ let mut tx = TransactionRecorder::new(
+ state.conn().clone(),
+ state.data_dir().migrations_path(),
+ format!("alter_table_{source_table_name}"),
+ )
+ .await?;
+ tx.execute("PRAGMA foreign_keys = OFF").await?;
+
+ // Create new table
+ let sql = target_schema_copy.create_table_statement();
+ tx.query(&sql).await?;
+
+ // Copy
+ tx.query(&format!(
+ r#"
+ INSERT INTO
+ {temp_table_name} ({column_list})
+ SELECT
+ {column_list}
+ FROM
+ {source_table_name}
+ "#,
+ column_list = copy_columns.join(", "),
+ ))
+ .await?;
+
+ tx.query(&format!("DROP TABLE {source_table_name}")).await?;
+
+ if *target_table_name != temp_table_name {
+ tx.query(&format!(
+ "ALTER TABLE '{temp_table_name}' RENAME TO '{target_table_name}'"
+ ))
+ .await?;
+ }
+
+ tx.execute("PRAGMA foreign_keys = ON").await?;
+
+ // Write to migration file.
+ let report = tx.commit_and_create_migration().await?;
+ debug!("Migration report: {report:?}");
+
+ state.table_metadata().invalidate_all().await?;
+
+ return Ok((StatusCode::OK, "altered table").into_response());
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::admin::table::{create_table_handler, CreateTableRequest};
+ use crate::app_state::*;
+ use crate::schema::{Column, ColumnDataType, ColumnOption, Table};
+
+ #[tokio::test]
+ async fn test_alter_table() -> Result<(), anyhow::Error> {
+ let state = test_state(None).await?;
+ let conn = state.conn();
+ let pk_col = "my_pk".to_string();
+
+ let create_table_request = CreateTableRequest {
+ schema: Table {
+ name: "foo".to_string(),
+ strict: true,
+ columns: vec![Column {
+ name: pk_col.clone(),
+ data_type: ColumnDataType::Blob,
+ options: vec![ColumnOption::Unique { is_primary: true }],
+ }],
+ foreign_keys: vec![],
+ unique: vec![],
+ virtual_table: false,
+ temporary: false,
+ },
+ dry_run: Some(false),
+ };
+ info!(
+ "Create Table: {}",
+ create_table_request.schema.create_table_statement()
+ );
+ let _ = create_table_handler(State(state.clone()), Json(create_table_request.clone())).await?;
+
+ conn.query(&format!("SELECT {pk_col} FROM foo"), ()).await?;
+
+ {
+ // Noop: source and target identical.
+ let alter_table_request = AlterTableRequest {
+ source_schema: create_table_request.schema.clone(),
+ target_schema: create_table_request.schema.clone(),
+ };
+
+ alter_table_handler(State(state.clone()), Json(alter_table_request.clone()))
+ .await
+ .unwrap();
+
+ conn.query(&format!("SELECT {pk_col} FROM foo"), ()).await?;
+ }
+
+ {
+ // Add column.
+ let mut target_schema = create_table_request.schema.clone();
+
+ target_schema.columns.push(Column {
+ name: "new".to_string(),
+ data_type: ColumnDataType::Text,
+ options: vec![
+ ColumnOption::NotNull,
+ ColumnOption::Default("'default'".to_string()),
+ ],
+ });
+
+ info!("{}", target_schema.create_table_statement());
+
+ let alter_table_request = AlterTableRequest {
+ source_schema: create_table_request.schema.clone(),
+ target_schema,
+ };
+
+ alter_table_handler(State(state.clone()), Json(alter_table_request.clone()))
+ .await
+ .unwrap();
+
+ conn
+ .query(&format!("SELECT {pk_col}, new FROM foo"), ())
+ .await?;
+ }
+
+ {
+ // Rename table and remove "new" column.
+ let mut target_schema = create_table_request.schema.clone();
+
+ target_schema.name = "bar".to_string();
+
+ info!("{}", target_schema.create_table_statement());
+
+ let alter_table_request = AlterTableRequest {
+ source_schema: create_table_request.schema.clone(),
+ target_schema,
+ };
+
+ alter_table_handler(State(state.clone()), Json(alter_table_request.clone()))
+ .await
+ .unwrap();
+
+ assert!(conn.query("SELECT * FROM foo", ()).await.is_err());
+ conn.query(&format!("SELECT {pk_col} FROM bar"), ()).await?;
+ }
+
+ return Ok(());
+ }
+}
diff --git a/trailbase-core/src/admin/table/create_index.rs b/trailbase-core/src/admin/table/create_index.rs
new file mode 100644
index 0000000..27a8f32
--- /dev/null
+++ b/trailbase-core/src/admin/table/create_index.rs
@@ -0,0 +1,58 @@
+use axum::{extract::State, Json};
+use serde::{Deserialize, Serialize};
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::schema::TableIndex;
+use crate::transaction::TransactionRecorder;
+
+#[derive(Clone, Debug, Deserialize, TS)]
+#[ts(export)]
+pub struct CreateIndexRequest {
+ pub schema: TableIndex,
+ pub dry_run: Option,
+}
+
+#[derive(Clone, Debug, Serialize, TS)]
+#[ts(export)]
+pub struct CreateIndexResponse {
+ pub sql: String,
+}
+
+pub async fn create_index_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result, Error> {
+ let conn = state.conn();
+ let dry_run = request.dry_run.unwrap_or(false);
+ let index_name = request.schema.name.clone();
+
+ let create_index_query = request.schema.create_index_statement();
+
+ if !dry_run {
+ let mut tx = TransactionRecorder::new(
+ conn.clone(),
+ state.data_dir().migrations_path(),
+ format!("create_index_{index_name}"),
+ )
+ .await?;
+
+ tx.query(&create_index_query).await?;
+
+ // Write to migration file.
+ tx.commit_and_create_migration().await?;
+ }
+
+ return Ok(Json(CreateIndexResponse {
+ sql: sqlformat::format(
+ &format!("{create_index_query};"),
+ &sqlformat::QueryParams::None,
+ sqlformat::FormatOptions {
+ indent: sqlformat::Indent::Spaces(2),
+ uppercase: true,
+ lines_between_queries: 1,
+ },
+ ),
+ }));
+}
diff --git a/trailbase-core/src/admin/table/create_table.rs b/trailbase-core/src/admin/table/create_table.rs
new file mode 100644
index 0000000..ccc5574
--- /dev/null
+++ b/trailbase-core/src/admin/table/create_table.rs
@@ -0,0 +1,66 @@
+use axum::{extract::State, Json};
+use serde::{Deserialize, Serialize};
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::schema::Table;
+use crate::transaction::TransactionRecorder;
+
+#[derive(Clone, Debug, Deserialize, TS)]
+#[ts(export)]
+pub struct CreateTableRequest {
+ pub schema: Table,
+ pub dry_run: Option,
+}
+
+#[derive(Clone, Debug, Serialize, TS)]
+#[ts(export)]
+pub struct CreateTableResponse {
+ pub sql: String,
+}
+
+pub async fn create_table_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result, Error> {
+ let conn = state.conn();
+ if request.schema.columns.is_empty() {
+ return Err(Error::Precondition(
+ "Tables need to have at least one column".to_string(),
+ ));
+ }
+ let dry_run = request.dry_run.unwrap_or(false);
+ let table_name = request.schema.name.clone();
+
+ // This contains the create table statement and may also contain indexes and triggers.
+ let query = request.schema.create_table_statement();
+
+ if !dry_run {
+ let mut tx = TransactionRecorder::new(
+ conn.clone(),
+ state.data_dir().migrations_path(),
+ format!("create_table_{table_name}"),
+ )
+ .await?;
+
+ tx.query(&query).await?;
+
+ // Write to migration file.
+ tx.commit_and_create_migration().await?;
+
+ state.table_metadata().invalidate_all().await?;
+ }
+
+ return Ok(Json(CreateTableResponse {
+ sql: sqlformat::format(
+ format!("{query};").as_str(),
+ &sqlformat::QueryParams::None,
+ sqlformat::FormatOptions {
+ indent: sqlformat::Indent::Spaces(2),
+ uppercase: true,
+ lines_between_queries: 1,
+ },
+ ),
+ }));
+}
diff --git a/trailbase-core/src/admin/table/drop_index.rs b/trailbase-core/src/admin/table/drop_index.rs
new file mode 100644
index 0000000..b1187e6
--- /dev/null
+++ b/trailbase-core/src/admin/table/drop_index.rs
@@ -0,0 +1,43 @@
+use axum::{
+ extract::State,
+ http::StatusCode,
+ response::{IntoResponse, Response},
+ Json,
+};
+use log::*;
+use serde::Deserialize;
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::transaction::TransactionRecorder;
+
+#[derive(Clone, Debug, Deserialize, TS)]
+#[ts(export)]
+pub struct DropIndexRequest {
+ pub name: String,
+}
+
+pub async fn drop_index_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result {
+ let conn = state.conn();
+ let index_name = request.name;
+
+ let mut tx = TransactionRecorder::new(
+ conn.clone(),
+ state.data_dir().migrations_path(),
+ format!("drop_index_{index_name}"),
+ )
+ .await?;
+
+ let query = format!("DROP INDEX IF EXISTS {}", index_name);
+ info!("dropping index: {query}");
+ tx.execute(&query).await?;
+
+ // Write to migration file.
+ tx.commit_and_create_migration().await?;
+
+ return Ok((StatusCode::OK, "").into_response());
+}
diff --git a/trailbase-core/src/admin/table/drop_table.rs b/trailbase-core/src/admin/table/drop_table.rs
new file mode 100644
index 0000000..eb6e3b8
--- /dev/null
+++ b/trailbase-core/src/admin/table/drop_table.rs
@@ -0,0 +1,54 @@
+use axum::{
+ extract::State,
+ http::StatusCode,
+ response::{IntoResponse, Response},
+ Json,
+};
+use log::*;
+use serde::Deserialize;
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::transaction::TransactionRecorder;
+
+#[derive(Clone, Debug, Deserialize, TS)]
+#[ts(export)]
+pub struct DropTableRequest {
+ pub name: String,
+}
+
+pub async fn drop_table_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result {
+ let table_name = &request.name;
+
+ let entity_type: &str;
+ if state.table_metadata().get(table_name).is_some() {
+ entity_type = "TABLE";
+ } else if state.table_metadata().get_view(table_name).is_some() {
+ entity_type = "VIEW";
+ } else {
+ return Err(Error::Precondition(format!(
+ "Table or view '{table_name}' not found"
+ )));
+ }
+
+ let mut tx = TransactionRecorder::new(
+ state.conn().clone(),
+ state.data_dir().migrations_path(),
+ format!("drop_{}_{table_name}", entity_type.to_lowercase()),
+ )
+ .await?;
+
+ let query = format!("DROP {entity_type} IF EXISTS {table_name}");
+ info!("dropping table: {query}");
+ tx.execute(&query).await?;
+
+ // Write to migration file.
+ tx.commit_and_create_migration().await?;
+ state.table_metadata().invalidate_all().await?;
+
+ return Ok((StatusCode::OK, "").into_response());
+}
diff --git a/trailbase-core/src/admin/table/get_table_schema.rs b/trailbase-core/src/admin/table/get_table_schema.rs
new file mode 100644
index 0000000..907330a
--- /dev/null
+++ b/trailbase-core/src/admin/table/get_table_schema.rs
@@ -0,0 +1,31 @@
+use axum::extract::{Path, State};
+use axum::http::header;
+use axum::response::{IntoResponse, Response};
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::table_metadata::{build_json_schema, JsonSchemaMode};
+
+pub async fn get_table_schema_handler(
+ State(state): State,
+ Path(table_name): Path,
+) -> Result {
+ let Some(table_metadata) = state.table_metadata().get(&table_name) else {
+ return Err(Error::Precondition(format!("Table {table_name} not found")));
+ };
+
+ // TOOD: Allow controlling the schema mode to generate different types for insert, select, and
+ // update.
+ let (_schema, json) = build_json_schema(
+ table_metadata.name(),
+ &*table_metadata,
+ JsonSchemaMode::Insert,
+ )?;
+
+ let mut response = serde_json::to_string_pretty(&json)?.into_response();
+ response.headers_mut().insert(
+ header::CONTENT_DISPOSITION,
+ header::HeaderValue::from_static("attachment"),
+ );
+ return Ok(response);
+}
diff --git a/trailbase-core/src/admin/table/list_tables.rs b/trailbase-core/src/admin/table/list_tables.rs
new file mode 100644
index 0000000..af32310
--- /dev/null
+++ b/trailbase-core/src/admin/table/list_tables.rs
@@ -0,0 +1,119 @@
+use axum::{extract::State, Json};
+use libsql::de;
+use log::*;
+use serde::{Deserialize, Serialize};
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::constants::SQLITE_SCHEMA_TABLE;
+use crate::schema::{Table, View};
+use crate::table_metadata::sqlite3_parse_into_statement;
+use crate::{app_state::AppState, schema::TableIndex};
+
+// TODO: Rudimentary unparsed trigger representation, since sqlparser didn't currently support
+// parsing sqlite triggers. Now we're using sqlite3_parser and should return structured data
+#[derive(Clone, Default, Debug, Serialize, TS)]
+pub struct TableTrigger {
+ pub name: String,
+ pub table_name: String,
+ pub sql: String,
+}
+
+#[derive(Clone, Default, Debug, Serialize, TS)]
+#[ts(export)]
+pub struct ListSchemasResponse {
+ pub tables: Vec
,
+ pub indexes: Vec,
+ pub triggers: Vec,
+ pub views: Vec,
+}
+
+pub async fn list_tables_handler(
+ State(state): State,
+) -> Result, Error> {
+ let conn = state.conn();
+
+ // NOTE: the "ORDER BY" is a bit sneaky, it ensures that we parse all "table"s before we parse
+ // "view"s.
+ let mut rows = conn
+ .query(
+ &format!("SELECT * FROM {SQLITE_SCHEMA_TABLE} ORDER BY type"),
+ (),
+ )
+ .await?;
+
+ let mut schemas = ListSchemasResponse::default();
+
+ while let Some(row) = rows.next().await? {
+ #[derive(Deserialize, Debug)]
+ pub struct SqliteSchema {
+ pub r#type: String,
+ pub name: String,
+ pub tbl_name: String,
+ #[allow(unused)]
+ pub rootpage: i64,
+
+ pub sql: Option,
+ }
+
+ let schema: SqliteSchema = de::from_row(&row)?;
+ let name = &schema.name;
+
+ match schema.r#type.as_str() {
+ "table" => {
+ let table_name = &schema.name;
+ let Some(sql) = schema.sql else {
+ warn!("Missing sql for table: {table_name}");
+ continue;
+ };
+
+ if let Some(create_table_statement) = sqlite3_parse_into_statement(&sql)? {
+ schemas.tables.push(create_table_statement.try_into()?);
+ }
+ }
+ "index" => {
+ let index_name = &schema.name;
+ let Some(sql) = schema.sql else {
+ // Auto-indexes are expected to not have `.sql`.
+ if !name.starts_with("sqlite_autoindex") {
+ warn!("Missing sql for index: {index_name}");
+ }
+ continue;
+ };
+
+ if let Some(create_index_statement) = sqlite3_parse_into_statement(&sql)? {
+ schemas.indexes.push(create_index_statement.try_into()?);
+ }
+ }
+ "view" => {
+ let view_name = &schema.name;
+ let Some(sql) = schema.sql else {
+ warn!("Missing sql for view: {view_name}");
+ continue;
+ };
+
+ if let Some(create_view_statement) = sqlite3_parse_into_statement(&sql)? {
+ schemas
+ .views
+ .push(View::from(create_view_statement, &schemas.tables)?);
+ }
+ }
+ "trigger" => {
+ let Some(sql) = schema.sql else {
+ warn!("Empty trigger for: {schema:?}");
+ continue;
+ };
+
+ // TODO: Turn this into structured data now that we use sqlite3_parser.
+ schemas.triggers.push(TableTrigger {
+ name: schema.name,
+ table_name: schema.tbl_name,
+ sql,
+ });
+ }
+ x => warn!("Unknown schema type: {name} : {x}"),
+ }
+ }
+
+ return Ok(Json(schemas));
+}
diff --git a/trailbase-core/src/admin/table/mod.rs b/trailbase-core/src/admin/table/mod.rs
new file mode 100644
index 0000000..8fb4deb
--- /dev/null
+++ b/trailbase-core/src/admin/table/mod.rs
@@ -0,0 +1,25 @@
+// Indexes
+mod alter_index;
+mod create_index;
+mod drop_index;
+mod get_table_schema;
+
+pub(super) use alter_index::alter_index_handler;
+pub(super) use create_index::create_index_handler;
+pub(super) use drop_index::drop_index_handler;
+pub(super) use get_table_schema::get_table_schema_handler;
+
+// Tables
+mod alter_table;
+mod create_table;
+mod drop_table;
+
+pub(crate) use alter_table::alter_table_handler;
+#[allow(unused)]
+pub(crate) use create_table::{create_table_handler, CreateTableRequest};
+pub(crate) use drop_table::drop_table_handler;
+
+// Lists both Tables and Indexes
+mod list_tables;
+
+pub(crate) use list_tables::list_tables_handler;
diff --git a/trailbase-core/src/admin/user/create_user.rs b/trailbase-core/src/admin/user/create_user.rs
new file mode 100644
index 0000000..1d845fe
--- /dev/null
+++ b/trailbase-core/src/admin/user/create_user.rs
@@ -0,0 +1,111 @@
+use axum::{extract::State, Json};
+use lazy_static::lazy_static;
+use libsql::{de, named_params};
+use serde::{Deserialize, Serialize};
+use trailbase_sqlite::query_one_row;
+use ts_rs::TS;
+use uuid::Uuid;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::auth::api::register::validate_and_normalize_email_address;
+use crate::auth::password::hash_password;
+use crate::auth::password::validate_passwords;
+use crate::auth::user::DbUser;
+use crate::auth::util::user_exists;
+use crate::constants::{PASSWORD_OPTIONS, USER_TABLE, VERIFICATION_CODE_LENGTH};
+use crate::email::Email;
+use crate::rand::generate_random_string;
+
+#[derive(Debug, Serialize, Deserialize, Default, TS)]
+#[ts(export)]
+pub struct CreateUserRequest {
+ pub email: String,
+ pub password: String,
+ pub verified: bool,
+
+ pub admin: bool,
+}
+
+#[derive(Debug, Serialize, Deserialize, Default)]
+pub struct CreateUserResponse {
+ pub id: Uuid,
+}
+
+pub async fn create_user_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result, Error> {
+ let normalized_email = validate_and_normalize_email_address(&request.email)?;
+
+ validate_passwords(&request.password, &request.password, &PASSWORD_OPTIONS)?;
+
+ let exists = user_exists(&state, &normalized_email).await?;
+ if exists {
+ return Err(Error::AlreadyExists("user"));
+ }
+
+ let hashed_password = hash_password(&request.password)?;
+ let email_verification_code = if request.verified {
+ None
+ } else {
+ Some(generate_random_string(VERIFICATION_CODE_LENGTH))
+ };
+
+ lazy_static! {
+ static ref INSERT_USER_QUERY: String = indoc::formatdoc!(
+ r#"
+ INSERT INTO '{USER_TABLE}'
+ (email, password_hash, verified, admin, email_verification_code)
+ VALUES
+ (:email, :password_hash, :verified, :admin ,:email_verification_code)
+ RETURNING *
+ "#,
+ );
+ }
+
+ let user: DbUser = de::from_row(
+ &query_one_row(
+ state.user_conn(),
+ &INSERT_USER_QUERY,
+ named_params! {
+ ":email": normalized_email,
+ ":password_hash": hashed_password,
+ ":verified": request.verified,
+ ":admin": request.admin,
+ ":email_verification_code": email_verification_code.clone(),
+ },
+ )
+ .await?,
+ )?;
+
+ if let Some(email_verification_code) = email_verification_code {
+ Email::verification_email(&state, &user, &email_verification_code)?
+ .send()
+ .await?;
+ }
+
+ return Ok(Json(CreateUserResponse {
+ id: Uuid::from_bytes(user.id),
+ }));
+}
+
+#[cfg(test)]
+pub(crate) async fn create_user_for_test(
+ state: &AppState,
+ email: &str,
+ password: &str,
+) -> Result {
+ let response = create_user_handler(
+ State(state.clone()),
+ Json(CreateUserRequest {
+ email: email.to_string(),
+ password: password.to_string(),
+ verified: true,
+ admin: false,
+ }),
+ )
+ .await?;
+
+ return Ok(response.id);
+}
diff --git a/trailbase-core/src/admin/user/list_users.rs b/trailbase-core/src/admin/user/list_users.rs
new file mode 100644
index 0000000..3d3131a
--- /dev/null
+++ b/trailbase-core/src/admin/user/list_users.rs
@@ -0,0 +1,170 @@
+use axum::{
+ extract::{RawQuery, State},
+ Json,
+};
+use lazy_static::lazy_static;
+use libsql::{de, params::Params, Connection};
+use log::*;
+use serde::Serialize;
+use trailbase_sqlite::query_one_row;
+use ts_rs::TS;
+use uuid::Uuid;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::auth::user::DbUser;
+use crate::constants::{USER_TABLE, USER_TABLE_ID_COLUMN};
+use crate::listing::{
+ build_filter_where_clause, limit_or_default, parse_query, Order, WhereClause,
+};
+use crate::util::id_to_b64;
+
+#[derive(Debug, Serialize, TS)]
+pub struct UserJson {
+ pub id: String,
+ pub email: String,
+ pub verified: bool,
+ pub admin: bool,
+
+ // For external oauth providers.
+ pub provider_id: i64,
+ pub provider_user_id: Option,
+
+ pub email_verification_code: String,
+}
+
+impl From for UserJson {
+ fn from(value: DbUser) -> Self {
+ UserJson {
+ id: Uuid::from_bytes(value.id).to_string(),
+ email: value.email,
+ verified: value.verified,
+ admin: value.admin,
+ provider_id: value.provider_id,
+ provider_user_id: value.provider_user_id,
+ email_verification_code: value.email_verification_code.unwrap_or_default(),
+ }
+ }
+}
+
+#[derive(Debug, Serialize, TS)]
+#[ts(export)]
+pub struct ListUsersResponse {
+ total_row_count: i64,
+ cursor: Option,
+
+ users: Vec,
+}
+
+pub async fn list_users_handler(
+ State(state): State,
+ RawQuery(raw_url_query): RawQuery,
+) -> Result, Error> {
+ let conn = state.user_conn();
+
+ let url_query = parse_query(raw_url_query);
+ info!("query: {url_query:?}");
+ let (filter_params, cursor, limit, order) = match url_query {
+ Some(q) => (Some(q.params), q.cursor, q.limit, q.order),
+ None => (None, None, None, None),
+ };
+
+ let Some(table_metadata) = state.table_metadata().get(USER_TABLE) else {
+ return Err(Error::Precondition(format!("Table {USER_TABLE} not found")));
+ };
+ // Where clause contains column filters and cursor depending on what's present in the url query
+ // string.
+ let filter_where_clause = build_filter_where_clause(&*table_metadata, filter_params)?;
+
+ let total_row_count = {
+ let where_clause = &filter_where_clause.clause;
+ let row = query_one_row(
+ conn,
+ &format!("SELECT COUNT(*) FROM {USER_TABLE} WHERE {where_clause}"),
+ Params::Named(filter_where_clause.params.clone()),
+ )
+ .await?;
+
+ row.get::(0)?
+ };
+
+ lazy_static! {
+ static ref DEFAULT_ORDERING: Vec<(String, Order)> =
+ vec![(USER_TABLE_ID_COLUMN.to_string(), Order::Descending)];
+ }
+ let users = fetch_users(
+ conn,
+ filter_where_clause.clone(),
+ cursor,
+ order.unwrap_or_else(|| DEFAULT_ORDERING.clone()),
+ limit_or_default(limit),
+ )
+ .await?;
+
+ return Ok(Json(ListUsersResponse {
+ total_row_count,
+ cursor: users.last().map(|user| id_to_b64(&user.id)),
+ users: users
+ .into_iter()
+ .map(|user| user.into())
+ .collect::>(),
+ }));
+}
+
+async fn fetch_users(
+ conn: &Connection,
+ filter_where_clause: WhereClause,
+ cursor: Option<[u8; 16]>,
+ order: Vec<(String, Order)>,
+ limit: usize,
+) -> Result, Error> {
+ let mut params = filter_where_clause.params;
+ let mut where_clause = filter_where_clause.clause;
+ params.push((":limit".to_string(), libsql::Value::Integer(limit as i64)));
+
+ if let Some(cursor) = cursor {
+ params.push((":cursor".to_string(), libsql::Value::Blob(cursor.to_vec())));
+ where_clause = format!("{where_clause} AND _row_.id < :cursor",);
+ }
+
+ let order_clause = order
+ .iter()
+ .map(|(col, ord)| {
+ format!(
+ "_row_.{col} {}",
+ match ord {
+ Order::Descending => "DESC",
+ Order::Ascending => "ASC",
+ }
+ )
+ })
+ .collect::>()
+ .join(", ");
+
+ let sql_query = format!(
+ r#"
+ SELECT _row_.*
+ FROM
+ (SELECT * FROM {USER_TABLE}) as _row_
+ WHERE
+ {where_clause}
+ ORDER BY
+ {order_clause}
+ LIMIT :limit
+ "#,
+ );
+
+ info!("PARAMS: {params:?}\nQUERY: {sql_query}");
+
+ let mut rows = conn.query(&sql_query, Params::Named(params)).await?;
+
+ let mut users: Vec = vec![];
+ while let Ok(Some(row)) = rows.next().await {
+ match de::from_row(&row) {
+ Ok(user) => users.push(user),
+ Err(err) => warn!("failed: {err}"),
+ };
+ }
+
+ return Ok(users);
+}
diff --git a/trailbase-core/src/admin/user/mod.rs b/trailbase-core/src/admin/user/mod.rs
new file mode 100644
index 0000000..8151314
--- /dev/null
+++ b/trailbase-core/src/admin/user/mod.rs
@@ -0,0 +1,68 @@
+mod create_user;
+mod list_users;
+mod update_user;
+
+pub use create_user::{create_user_handler, CreateUserRequest};
+pub(super) use list_users::list_users_handler;
+pub(super) use update_user::update_user_handler;
+
+#[cfg(test)]
+pub(crate) use create_user::create_user_for_test;
+
+#[cfg(test)]
+mod tests {
+ use axum::{extract::State, Json};
+ use libsql::params;
+ use std::sync::Arc;
+ use uuid::Uuid;
+
+ use crate::app_state::{test_state, TestStateOptions};
+ use crate::auth::util::user_by_email;
+ use crate::constants::USER_TABLE;
+ use crate::email::{testing::TestAsyncSmtpTransport, Mailer};
+
+ use super::create_user::*;
+
+ #[tokio::test]
+ async fn test_user_creation_and_deletion() {
+ let _ = env_logger::try_init_from_env(
+ env_logger::Env::new().default_filter_or("info,refinery_core=warn"),
+ );
+
+ let mailer = TestAsyncSmtpTransport::new();
+ let state = test_state(Some(TestStateOptions {
+ mailer: Some(Mailer::Smtp(Arc::new(mailer.clone()))),
+ ..Default::default()
+ }))
+ .await
+ .unwrap();
+
+ let email = "foo@bar.org";
+ let user_id = create_user_handler(
+ State(state.clone()),
+ Json(CreateUserRequest {
+ email: email.to_string(),
+ password: "Secret!1!!".to_string(),
+ verified: true,
+ admin: true,
+ }),
+ )
+ .await
+ .unwrap()
+ .id;
+
+ let user = user_by_email(&state, email).await.unwrap();
+ assert_eq!(Uuid::from_bytes(user.id), user_id);
+
+ state
+ .user_conn()
+ .execute(
+ &format!("DELETE FROM '{USER_TABLE}' WHERE id = $1"),
+ params!(user.get_id().as_bytes()),
+ )
+ .await
+ .unwrap();
+
+ assert!(user_by_email(&state, email).await.is_err());
+ }
+}
diff --git a/trailbase-core/src/admin/user/update_user.rs b/trailbase-core/src/admin/user/update_user.rs
new file mode 100644
index 0000000..7446ed8
--- /dev/null
+++ b/trailbase-core/src/admin/user/update_user.rs
@@ -0,0 +1,69 @@
+use axum::{
+ extract::State,
+ http::StatusCode,
+ response::{IntoResponse, Response},
+ Json,
+};
+use lazy_static::lazy_static;
+use libsql::params;
+use serde::{Deserialize, Serialize};
+use ts_rs::TS;
+
+use crate::admin::AdminError as Error;
+use crate::app_state::AppState;
+use crate::auth::password::hash_password;
+use crate::constants::USER_TABLE;
+
+#[derive(Debug, Serialize, Deserialize, Default, TS)]
+#[ts(export)]
+pub struct UpdateUserRequest {
+ id: uuid::Uuid,
+
+ email: Option,
+ password: Option,
+ verified: Option,
+}
+
+pub async fn update_user_handler(
+ State(state): State,
+ Json(request): Json,
+) -> Result {
+ let conn = state.user_conn();
+ let user_id_bytes = request.id.into_bytes();
+
+ let hashed_password = match &request.password {
+ Some(pw) => Some(hash_password(pw)?),
+ None => None,
+ };
+
+ // TODO: Rather than using a transaction below we could build combined update queries:
+ // UPDATE