om-memory-system 4.8.0 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -142,10 +142,19 @@ export function nextFallbackPort(currentPort, failedTakeovers, maxFallbackPort,
142
142
  return currentPort + 1;
143
143
  }
144
144
  const STEP_ASIDE_HOLD_OFF_MS = 60_000;
145
+ /** What a web app without an npm check reports, such as one inside a host session. */
146
+ const NO_UPDATE = { available: null, state: "idle", code: null, canInstall: false };
145
147
  /** Lets the 202 reply reach the caller before the server stops. */
146
148
  const STEP_ASIDE_REPLY_GRACE_MS = 100;
147
- /** Differs between processes, so the page can tell a restarted web app from the old one. */
148
- const PROCESS_INSTANCE = randomUUID();
149
+ /**
150
+ * Differs between processes, so the page can tell a restarted web app from the old one.
151
+ * A restart names its copy's instance, so it can tell its copy from another web app.
152
+ */
153
+ const PROCESS_INSTANCE = /^[0-9a-f-]{36}$/.test(process.env.OMMS_WEB_INSTANCE ?? "")
154
+ ? process.env.OMMS_WEB_INSTANCE
155
+ : randomUUID();
156
+ // Child processes, such as an OpenCode model list, must not report the same instance.
157
+ delete process.env.OMMS_WEB_INSTANCE;
149
158
  export class WebServer {
150
159
  server = null;
151
160
  config;
@@ -156,6 +165,7 @@ export class WebServer {
156
165
  onPortsExhaustedCallback = null;
157
166
  onStepAsideCallback = null;
158
167
  onPowerActionCallback = null;
168
+ webUpdate = null;
159
169
  powerActionRunning = false;
160
170
  stepAsideTimer = null;
161
171
  holdOffTimer = null;
@@ -164,6 +174,8 @@ export class WebServer {
164
174
  maxFallbackPort;
165
175
  settingsImportJobs;
166
176
  backfillControlsInstance;
177
+ /** The memory store's projects for Directory maps suggestions, read at most once a minute. */
178
+ storeProjects;
167
179
  /** Run an import-page action; errors carry their own status and never file contents. */
168
180
  async importResponse(action, status = 200) {
169
181
  try {
@@ -220,6 +232,10 @@ export class WebServer {
220
232
  setOnPowerAction(callback) {
221
233
  this.onPowerActionCallback = callback;
222
234
  }
235
+ /** Standalone web apps register this to report and install npm releases. */
236
+ setWebUpdate(update) {
237
+ this.webUpdate = update;
238
+ }
223
239
  /** Only a local caller may stop the web app; the token alone is not enough. */
224
240
  handlePowerAction(action, remoteAddress) {
225
241
  const record = (outcome) => log("Web server power request", { action, outcome, ownVersion: packageVersion() });
@@ -232,6 +248,12 @@ export class WebServer {
232
248
  record("unsupported");
233
249
  return this.jsonResponse({ success: false, error: "Not supported by this web app" }, 409);
234
250
  }
251
+ // An update restarts through the same callback; a Stop or Restart now would cut npm off.
252
+ const updateState = this.webUpdate?.status().state;
253
+ if (updateState === "installing" || updateState === "restarting") {
254
+ record("refused_update_running");
255
+ return this.jsonResponse({ success: false, error: "An update is running" }, 409);
256
+ }
235
257
  // A repeated request must not start a second stop or restart while one runs.
236
258
  if (this.powerActionRunning) {
237
259
  record("already_running");
@@ -253,6 +275,24 @@ export class WebServer {
253
275
  }, STEP_ASIDE_REPLY_GRACE_MS).unref();
254
276
  return this.jsonResponse({ success: true }, 202);
255
277
  }
278
+ /** Install the npm release and restart onto it. Same guards as Restart. */
279
+ handleUpdate(remoteAddress) {
280
+ const record = (outcome) => log("Web server update request", { outcome, ownVersion: packageVersion() });
281
+ if (!isLoopbackAddress(remoteAddress)) {
282
+ record("refused_not_loopback");
283
+ return this.jsonResponse({ success: false, error: "Loopback caller required" }, 403);
284
+ }
285
+ if (this.powerActionRunning) {
286
+ record("refused_power_running");
287
+ return this.jsonResponse({ success: false, error: "A stop or restart is running" }, 409);
288
+ }
289
+ const reply = this.webUpdate?.requestInstall() ?? "cannot-install";
290
+ record(reply);
291
+ if (reply === "accepted")
292
+ return this.jsonResponse({ success: true }, 202);
293
+ const error = reply === "no-update" ? "No newer release" : "This web app cannot install";
294
+ return this.jsonResponse({ success: false, error }, 409);
295
+ }
256
296
  /** API token routes. Only a caller on this machine with the local token manages tokens. */
257
297
  async handleTokenRoute(req, path, method, remoteAddress) {
258
298
  if (!isLoopbackAddress(remoteAddress)) {
@@ -538,8 +578,34 @@ export class WebServer {
538
578
  this.stopHealthCheckLoop();
539
579
  await this.attemptTakeover();
540
580
  }
581
+ else if (this.onStepAsideCallback && (await this.ownerIsNewer())) {
582
+ // A standalone web app behind a newer one would serve old code after a restart.
583
+ this.stopHealthCheckLoop();
584
+ log("Web server waiter retired", { ownVersion: packageVersion() });
585
+ try {
586
+ await this.onStepAsideCallback();
587
+ }
588
+ catch (error) {
589
+ log("Step-aside callback error", { error: String(error) });
590
+ }
591
+ }
541
592
  }, 5000);
542
593
  }
594
+ async ownerIsNewer() {
595
+ try {
596
+ const response = await fetch(`${this.getUrl()}/api/web/status`, {
597
+ headers: { [AUTH_HEADER]: getOrCreateAuthToken() },
598
+ signal: AbortSignal.timeout(2_000),
599
+ });
600
+ if (!response.ok)
601
+ return false;
602
+ const { version } = (await response.json());
603
+ return typeof version === "string" && isOlderVersion(packageVersion(), version);
604
+ }
605
+ catch {
606
+ return false;
607
+ }
608
+ }
543
609
  stopHealthCheckLoop() {
544
610
  if (this.healthCheckInterval) {
545
611
  clearInterval(this.healthCheckInterval);
@@ -727,6 +793,8 @@ export class WebServer {
727
793
  success: true,
728
794
  status: "ok",
729
795
  authEnabled: auth?.isEnabled() ?? false,
796
+ // Opaque per process; a restart finds its copy by it even behind basic auth.
797
+ instance: PROCESS_INSTANCE,
730
798
  });
731
799
  }
732
800
  if (path === "/" || path === "/index.html" || path === "/settings") {
@@ -763,12 +831,31 @@ export class WebServer {
763
831
  });
764
832
  }
765
833
  if (path === "/api/settings/backfill" && method === "GET") {
766
- const { readBackfillStatus } = await import("./backfill-state.js");
767
- return this.jsonResponse({
768
- pi: await readBackfillStatus("pi"),
769
- opencode: await readBackfillStatus("opencode"),
770
- "claude-code": await readBackfillStatus("claude-code"),
771
- });
834
+ const [{ CONFIG }, { readBackfillStatus, readUnresolvedDirectories, visibleUnresolvedCount },] = await Promise.all([import("../config.js"), import("./backfill-state.js")]);
835
+ // Read at request time from the Directory maps list, so the badge and the
836
+ // list agree and an Ignore click changes every badge at once. The list
837
+ // hides ignored directories and directories with a saved map.
838
+ const hidden = [
839
+ ...(CONFIG.importIgnoredDirectories ?? []),
840
+ ...CONFIG.importPathMaps.map((map) => map.from),
841
+ ];
842
+ const status = async (host) => {
843
+ const current = await readBackfillStatus(host);
844
+ if (!current)
845
+ return current;
846
+ // A damaged list must not hide the host's status: keep the run's count.
847
+ const directories = await readUnresolvedDirectories(host).catch(() => null);
848
+ if (!directories)
849
+ return current;
850
+ const unresolved = visibleUnresolvedCount(current.counts.unresolved, directories, hidden);
851
+ return { ...current, counts: { ...current.counts, unresolved } };
852
+ };
853
+ const [pi, opencode, claudeCode] = await Promise.all([
854
+ status("pi"),
855
+ status("opencode"),
856
+ status("claude-code"),
857
+ ]);
858
+ return this.jsonResponse({ pi, opencode, "claude-code": claudeCode });
772
859
  }
773
860
  if (path === "/api/settings/backfill/runs" && method === "GET") {
774
861
  return this.jsonResponse(await (await this.backfillControls()).status());
@@ -792,11 +879,15 @@ export class WebServer {
792
879
  // Keys, tokens, and the embedder can be changed only from this machine.
793
880
  isLocal: isLoopbackAddress(remoteAddress),
794
881
  instance: PROCESS_INSTANCE,
882
+ update: this.webUpdate?.status() ?? NO_UPDATE,
795
883
  });
796
884
  }
797
885
  if ((path === "/api/web/stop" || path === "/api/web/restart") && method === "POST") {
798
886
  return this.handlePowerAction(path === "/api/web/stop" ? "stop" : "restart", remoteAddress);
799
887
  }
888
+ if (path === "/api/web/update" && method === "POST") {
889
+ return this.handleUpdate(remoteAddress);
890
+ }
800
891
  if (path === "/api/web/step-aside" && method === "POST") {
801
892
  const body = await req.json().catch(() => null);
802
893
  return this.handleStepAside(remoteAddress, body);
@@ -926,8 +1017,19 @@ export class WebServer {
926
1017
  return this.jsonResponse(await testExternalApi());
927
1018
  }
928
1019
  if (path === "/api/settings/import-maps" && method === "GET") {
929
- const { directoryMapsView } = await import("../importer/web-import-api.js");
930
- return this.jsonResponse(await directoryMapsView());
1020
+ const { directoryMapsView, readStoreProjects } = await import("../importer/web-import-api.js");
1021
+ // Every save on the page reloads this list; the store's projects rarely change.
1022
+ if (!this.storeProjects || Date.now() - this.storeProjects.readAt > 60_000) {
1023
+ this.storeProjects = {
1024
+ readAt: Date.now(),
1025
+ projects: readStoreProjects(this.config.directory ?? process.cwd()),
1026
+ };
1027
+ }
1028
+ const knownProjects = await this.storeProjects.projects;
1029
+ // An empty result is a failed read or no store yet; try again next time.
1030
+ if (!knownProjects.length)
1031
+ this.storeProjects = undefined;
1032
+ return this.jsonResponse(await directoryMapsView({ knownProjects }));
931
1033
  }
932
1034
  if (path === "/api/settings/models" && method === "GET") {
933
1035
  const { listOpencodeSettingsModels, listPiSettingsModels } = await import("../importer/settings-models.js");
@@ -0,0 +1,3 @@
1
+ import { WebUpdate } from "./web-update.js";
2
+ /** The npm check and installer of a standalone web app, with the real process, npm, and clock. */
3
+ export declare function startWebUpdate(restart: () => Promise<string | undefined>, canRestart: () => boolean): WebUpdate;
@@ -0,0 +1,47 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { globalCommandVersion } from "./global-version.js";
4
+ import { log } from "./logger.js";
5
+ import { packageVersion } from "./package-version.js";
6
+ import { WebUpdate } from "./web-update.js";
7
+ /** The npm check and installer of a standalone web app, with the real process, npm, and clock. */
8
+ export function startWebUpdate(restart, canRestart) {
9
+ const update = new WebUpdate({
10
+ version: packageVersion(),
11
+ enabled: process.env.OMMS_DISABLE_UPDATE_CHECK !== "1",
12
+ fetch,
13
+ setInterval: (callback, ms) => setInterval(callback, ms),
14
+ log,
15
+ execPath: process.execPath,
16
+ platform: process.platform,
17
+ exists: existsSync,
18
+ spawn: (command, args, options) => spawn(command, args, {
19
+ shell: options.shell,
20
+ stdio: ["ignore", "ignore", "pipe"],
21
+ windowsHide: true,
22
+ }),
23
+ // npm installs beside this Node.js, so read that install, not the first command on PATH.
24
+ globalVersion: () => globalCommandVersion({ find: () => null }).version,
25
+ restart,
26
+ canRestart,
27
+ // Resolves once npm has stopped. `taskkill /T` also stops npm under the cmd.exe
28
+ // wrapper that `shell: true` starts; the child's own exit confirms it.
29
+ killTree: (child) => new Promise((resolve) => {
30
+ child.on("exit", () => resolve());
31
+ if (process.platform === "win32" && child.pid) {
32
+ spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
33
+ stdio: "ignore",
34
+ windowsHide: true,
35
+ }).on("error", () => child.kill("SIGKILL"));
36
+ }
37
+ else {
38
+ child.kill("SIGTERM");
39
+ }
40
+ }),
41
+ setTimeout: (callback, ms) => setTimeout(callback, ms),
42
+ clearTimeout: (handle) => clearTimeout(handle),
43
+ now: () => Date.now(),
44
+ });
45
+ update.start();
46
+ return update;
47
+ }
@@ -0,0 +1,76 @@
1
+ export declare const UPDATE_CHECK_INTERVAL_MS: number;
2
+ /** An install that takes longer is stopped, and the web app keeps serving. */
3
+ export declare const INSTALL_TIMEOUT_MS: number;
4
+ export type UpdateState = "idle" | "installing" | "restarting" | "failed";
5
+ /** The `update` field of `GET /api/web/status`. */
6
+ export interface UpdateStatus {
7
+ /** The newer release on npm, or null. */
8
+ available: string | null;
9
+ state: UpdateState;
10
+ /** The failure code while `state` is `failed`. */
11
+ code: string | null;
12
+ /** True when this web app can install the release itself. */
13
+ canInstall: boolean;
14
+ }
15
+ export interface WebUpdateDeps {
16
+ /** The running version. */
17
+ version: string;
18
+ /** False when `OMMS_DISABLE_UPDATE_CHECK` is `1`. */
19
+ enabled: boolean;
20
+ fetch: typeof fetch;
21
+ setInterval: (callback: () => void, ms: number) => {
22
+ unref?: () => void;
23
+ };
24
+ log: (message: string, data: Record<string, unknown>) => void;
25
+ /** The runtime of this web app; npm must sit beside it. */
26
+ execPath: string;
27
+ platform: NodeJS.Platform;
28
+ exists: (path: string) => boolean;
29
+ spawn: (command: string, args: string[], options: {
30
+ shell: boolean;
31
+ }) => InstallChild;
32
+ /** The version of the global install after npm ran, or null. */
33
+ globalVersion: () => string | null;
34
+ /** False when no restart could serve the new copy, such as a missing launcher. Checked before npm runs. */
35
+ canRestart: () => boolean;
36
+ /** Stop npm and its children. On Windows the shell wrapper alone would leave npm running. */
37
+ killTree: (child: InstallChild) => Promise<void>;
38
+ /** Restart onto the newest copy. Returns a failure code when this web app keeps serving. */
39
+ restart: () => Promise<string | undefined>;
40
+ setTimeout: (callback: () => void, ms: number) => unknown;
41
+ clearTimeout: (handle: unknown) => void;
42
+ now: () => number;
43
+ }
44
+ /** The parts of a child process the install runner uses. */
45
+ export interface InstallChild {
46
+ pid?: number;
47
+ stderr: {
48
+ on(event: "data", listener: (chunk: Buffer | string) => void): unknown;
49
+ } | null;
50
+ on(event: "error", listener: () => void): unknown;
51
+ on(event: "exit", listener: (code: number | null) => void): unknown;
52
+ kill(signal?: NodeJS.Signals): boolean;
53
+ }
54
+ export type InstallRequest = "accepted" | "no-update" | "cannot-install";
55
+ /** A failure code from npm's error stream. The text itself never leaves this function. */
56
+ export declare function npmFailureCode(errorText: string): string;
57
+ export declare class WebUpdate {
58
+ private readonly deps;
59
+ private available;
60
+ private state;
61
+ private code;
62
+ private started;
63
+ constructor(deps: WebUpdateDeps);
64
+ /** Check now, then every 6 hours. A second call does nothing. */
65
+ start(): void;
66
+ /** Read npm `latest`. A failed read keeps the last result. */
67
+ check(): Promise<void>;
68
+ /** The npm that installs into the prefix the launcher reads. */
69
+ private npmPath;
70
+ status(): UpdateStatus;
71
+ private canInstall;
72
+ /** Start the install and the restart. A request while one runs joins it. */
73
+ requestInstall(): InstallRequest;
74
+ private install;
75
+ private runNpm;
76
+ }
@@ -0,0 +1,157 @@
1
+ import { posix, win32 } from "node:path";
2
+ import { availableUpdate, latestNpmVersion } from "./update-check.js";
3
+ // The web app's npm release check. It reads npm `latest` at start and then every
4
+ // 6 hours, and keeps the result in memory for `GET /api/web/status`. It imports
5
+ // no host adapter and no config, so tests pass every input.
6
+ export const UPDATE_CHECK_INTERVAL_MS = 6 * 60 * 60 * 1000;
7
+ /** An install that takes longer is stopped, and the web app keeps serving. */
8
+ export const INSTALL_TIMEOUT_MS = 5 * 60 * 1000;
9
+ /** Only a plain release reaches the npm arguments; the value comes from the registry. */
10
+ const PLAIN_VERSION = /^\d+\.\d+\.\d+$/;
11
+ /** Enough of npm's error stream to find a code; the rest is dropped. */
12
+ const ERROR_TAIL_BYTES = 64 * 1024;
13
+ /** A failure code from npm's error stream. The text itself never leaves this function. */
14
+ export function npmFailureCode(errorText) {
15
+ if (/\b(EACCES|EPERM)\b/.test(errorText))
16
+ return "permission";
17
+ if (/\b(ENOTFOUND|ETIMEDOUT|ECONNRESET|EAI_AGAIN)\b/.test(errorText))
18
+ return "network";
19
+ return "npm-exit";
20
+ }
21
+ export class WebUpdate {
22
+ deps;
23
+ available = null;
24
+ state = "idle";
25
+ code = null;
26
+ started = false;
27
+ constructor(deps) {
28
+ this.deps = deps;
29
+ }
30
+ /** Check now, then every 6 hours. A second call does nothing. */
31
+ start() {
32
+ if (this.started || !this.deps.enabled)
33
+ return;
34
+ this.started = true;
35
+ void this.check();
36
+ this.deps.setInterval(() => void this.check(), UPDATE_CHECK_INTERVAL_MS).unref?.();
37
+ }
38
+ /** Read npm `latest`. A failed read keeps the last result. */
39
+ async check() {
40
+ if (!this.deps.enabled)
41
+ return;
42
+ const latest = await latestNpmVersion(this.deps.fetch);
43
+ if (latest === null) {
44
+ this.deps.log("Web app update check failed", { code: "unreachable" });
45
+ return;
46
+ }
47
+ this.available = availableUpdate(this.deps.version, latest);
48
+ }
49
+ /** The npm that installs into the prefix the launcher reads. */
50
+ npmPath() {
51
+ // Path rules follow the target platform, not the machine that runs this code.
52
+ const path = this.deps.platform === "win32" ? win32 : posix;
53
+ const name = this.deps.platform === "win32" ? "npm.cmd" : "npm";
54
+ return path.join(path.dirname(this.deps.execPath), name);
55
+ }
56
+ status() {
57
+ return {
58
+ available: this.available,
59
+ state: this.state,
60
+ code: this.code,
61
+ canInstall: this.canInstall(),
62
+ };
63
+ }
64
+ canInstall() {
65
+ return this.deps.exists(this.npmPath()) && this.deps.canRestart();
66
+ }
67
+ /** Start the install and the restart. A request while one runs joins it. */
68
+ requestInstall() {
69
+ if (this.state === "installing" || this.state === "restarting")
70
+ return "accepted";
71
+ if (!this.available)
72
+ return "no-update";
73
+ if (!this.canInstall())
74
+ return "cannot-install";
75
+ this.state = "installing";
76
+ this.code = null;
77
+ void this.install(this.available);
78
+ return "accepted";
79
+ }
80
+ async install(target) {
81
+ const began = this.deps.now();
82
+ const record = (outcome, code, exitCode) => this.deps.log("Web app update", {
83
+ outcome,
84
+ code,
85
+ from: this.deps.version,
86
+ to: target,
87
+ exitCode,
88
+ durationMs: this.deps.now() - began,
89
+ });
90
+ const fail = (code, exitCode) => {
91
+ this.state = "failed";
92
+ this.code = code;
93
+ record("failed", code, exitCode);
94
+ };
95
+ if (!PLAIN_VERSION.test(target))
96
+ return fail("bad-version");
97
+ const { code, exitCode } = await this.runNpm(target);
98
+ if (code)
99
+ return fail(code, exitCode);
100
+ if (this.deps.globalVersion() !== target)
101
+ return fail("version-mismatch", exitCode);
102
+ this.state = "restarting";
103
+ record("installed", null, exitCode);
104
+ const restartCode = await this.deps.restart();
105
+ // The restart exits this process on success, so a return means it kept serving.
106
+ if (restartCode)
107
+ fail(restartCode);
108
+ else
109
+ this.state = "idle";
110
+ }
111
+ runNpm(target) {
112
+ return new Promise((resolve) => {
113
+ let child;
114
+ try {
115
+ // Windows runs `npm.cmd` only through a shell, which splits an unquoted path at a
116
+ // space (`C:\\Program Files`). The arguments are fixed and the version is checked.
117
+ const windows = this.deps.platform === "win32";
118
+ const command = windows ? `"${this.npmPath()}"` : this.npmPath();
119
+ child = this.deps.spawn(command, ["install", "-g", `om-memory-system@${target}`], {
120
+ shell: windows,
121
+ });
122
+ }
123
+ catch {
124
+ resolve({ code: "spawn-error" });
125
+ return;
126
+ }
127
+ let errorText = "";
128
+ let done = false;
129
+ const finish = (result) => {
130
+ if (done)
131
+ return;
132
+ done = true;
133
+ this.deps.clearTimeout(timer);
134
+ resolve(result);
135
+ };
136
+ let timedOut = false;
137
+ const timer = this.deps.setTimeout(() => {
138
+ timedOut = true;
139
+ // Keep the update running until npm has stopped, so nothing else touches the install.
140
+ void this.deps
141
+ .killTree(child)
142
+ .catch(() => undefined)
143
+ .then(() => finish({ code: "timeout" }));
144
+ }, INSTALL_TIMEOUT_MS);
145
+ child.stderr?.on("data", (chunk) => {
146
+ errorText = (errorText + String(chunk)).slice(-ERROR_TAIL_BYTES);
147
+ });
148
+ child.on("error", () => finish({ code: "spawn-error" }));
149
+ child.on("exit", (exitCode) => {
150
+ // After a timeout the tree is still stopping; the timeout path reports it.
151
+ if (timedOut)
152
+ return;
153
+ finish({ code: exitCode === 0 ? null : npmFailureCode(errorText), exitCode });
154
+ });
155
+ });
156
+ }
157
+ }
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--font-mono:"JetBrains Mono Variable", "JetBrains Mono", "Fira Code", ui-monospace, monospace;--color-black:#000;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-6xl:72rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-normal:1.5;--leading-relaxed:1.625;--ease-in:cubic-bezier(.4, 0, 1, 1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--default-mono-font-family:"JetBrains Mono Variable", "JetBrains Mono", "Fira Code", ui-monospace, monospace;--color-status-warning:var(--status-warning-label);--color-status-success:var(--status-success-label);--color-status-info:var(--status-info-label);--color-selection:var(--selection);--color-ring:var(--ring);--color-border:var(--border);--color-popover-foreground:var(--popover-foreground);--color-popover:var(--popover)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}body{background-color:var(--background);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0}html{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.end-3{inset-inline-end:calc(var(--spacing) * 3)}.end-4{inset-inline-end:calc(var(--spacing) * 4)}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.bottom-full{bottom:100%}.left-1\/2{left:50%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.col-start-2{grid-column-start:2}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.ms-1{margin-inline-start:var(--spacing)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.ms-5{margin-inline-start:calc(var(--spacing) * 5)}.ms-auto{margin-inline-start:auto}.me-2{margin-inline-end:calc(var(--spacing) * 2)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-auto{margin-top:auto}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.grid\!{display:grid!important}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-full{width:100%;height:100%}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-auto{height:auto}.h-full{height:100%}.h-svh{height:100svh}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.max-h-screen{max-height:100vh}.min-h-0{min-height:0}.min-h-5{min-height:calc(var(--spacing) * 5)}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-32{min-height:calc(var(--spacing) * 32)}.min-h-svh{min-height:100svh}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-64{width:calc(var(--spacing) * 64)}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.max-w-6xl{max-width:var(--container-6xl)}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-\[min\(24rem\,calc\(100vw-1rem\)\)\]{max-width:min(24rem,100vw - 1rem)}.max-w-\[min\(40rem\,calc\(100vw-2rem\)\)\]{max-width:min(40rem,100vw - 2rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.min-w-0{min-width:0}.min-w-7{min-width:calc(var(--spacing) * 7)}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-\[56rem\]{min-width:56rem}.min-w-full{min-width:100%}.min-w-max{min-width:max-content}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.basis-56{flex-basis:calc(var(--spacing) * 56)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.scroll-mt-4{scroll-margin-top:calc(var(--spacing) * 4)}.scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-rows-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-rows:auto minmax(0,1fr) auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-1{row-gap:var(--spacing)}.self-center{align-self:center}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-clip{overflow-x:clip}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:calc(var(--radius) * 1.8)}.rounded-\[4px\]{border-radius:4px}.rounded-\[7px\]{border-radius:7px}.rounded-\[9px\]{border-radius:9px}.rounded-\[10px\]{border-radius:10px}.rounded-\[12px\]{border-radius:12px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) * .8)}.rounded-sm{border-radius:calc(var(--radius) * .6)}.rounded-xl{border-radius:calc(var(--radius) * 1.4)}.rounded-s-lg{border-start-start-radius:var(--radius);border-end-start-radius:var(--radius)}.rounded-e-lg{border-start-end-radius:var(--radius);border-end-end-radius:var(--radius)}.border{border-style:var(--tw-border-style);border-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-amber-500\/50{border-color:var(--status-warning)}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/50{border-color:color-mix(in oklab, var(--status-warning) 50%, transparent)}}.border-blue-600\/40{border-color:var(--status-info-label)}@supports (color:color-mix(in lab, red, red)){.border-blue-600\/40{border-color:color-mix(in oklab, var(--status-info-label) 40%, transparent)}}.border-border,.border-border\/60{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--border) 60%, transparent)}}.border-current{border-color:currentColor}.border-destructive\/25{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/25{border-color:color-mix(in oklab, var(--destructive) 25%, transparent)}}.border-green-600\/40{border-color:var(--status-success-label)}@supports (color:color-mix(in lab, red, red)){.border-green-600\/40{border-color:color-mix(in oklab, var(--status-success-label) 40%, transparent)}}.border-input{border-color:var(--input)}.border-orange-600\/40{border-color:var(--status-warning-label)}@supports (color:color-mix(in lab, red, red)){.border-orange-600\/40{border-color:color-mix(in oklab, var(--status-warning-label) 40%, transparent)}}.border-primary\/25{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/25{border-color:color-mix(in oklab, var(--primary) 25%, transparent)}}.border-primary\/40{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/40{border-color:color-mix(in oklab, var(--primary) 40%, transparent)}}.border-primary\/50{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/50{border-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.border-red-600\/40{border-color:var(--destructive-label)}@supports (color:color-mix(in lab, red, red)){.border-red-600\/40{border-color:color-mix(in oklab, var(--destructive-label) 40%, transparent)}}.border-sidebar-border,.border-sidebar-border\/80{border-color:var(--sidebar-border)}@supports (color:color-mix(in lab, red, red)){.border-sidebar-border\/80{border-color:color-mix(in oklab, var(--sidebar-border) 80%, transparent)}}.border-status-success{border-color:var(--status-success-label)}.border-transparent{border-color:#0000}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-background,.bg-background\/95{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/95{background-color:color-mix(in oklab, var(--background) 95%, transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-blue-500\/15{background-color:var(--status-info)}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/15{background-color:color-mix(in oklab, var(--status-info) 15%, transparent)}}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/70{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/70{background-color:color-mix(in oklab, var(--card) 70%, transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-green-500\/15{background-color:var(--status-success)}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/15{background-color:color-mix(in oklab, var(--status-success) 15%, transparent)}}.bg-muted,.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-orange-500\/15{background-color:var(--status-warning)}@supports (color:color-mix(in lab, red, red)){.bg-orange-500\/15{background-color:color-mix(in oklab, var(--status-warning) 15%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.bg-red-500\/15{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/15{background-color:color-mix(in oklab, var(--destructive) 15%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-selection{background-color:var(--selection)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-accent{background-color:var(--sidebar-accent)}.bg-sidebar-border{background-color:var(--sidebar-border)}.bg-transparent{background-color:#0000}.bg-clip-padding{background-clip:padding-box}.fill-current{fill:currentColor}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-px{padding:1px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.ps-2{padding-inline-start:calc(var(--spacing) * 2)}.ps-8{padding-inline-start:calc(var(--spacing) * 8)}.pe-10{padding-inline-end:calc(var(--spacing) * 10)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-start{text-align:start}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono Variable,JetBrains Mono,Fira Code,ui-monospace,monospace}.text-page-title{font-size:1.5rem;line-height:var(--tw-leading,1.25)}.text-section-title{font-size:1.125rem;line-height:var(--tw-leading,1.4)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-subsection-title{font-size:.9375rem;line-height:var(--tw-leading,1.4)}.text-ui{font-size:.875rem;line-height:var(--tw-leading,1.45)}.text-xs{font-size:.8125rem;line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-code{font-size:.75rem}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.\[color\:oklch\(0\.42_0\.13_var\(--keyword-hue\)\)\]{color:oklch(.42 .13 var(--keyword-hue))}.\[color\:oklch\(0\.42_0\.13_var\(--memory-type-hue\)\)\]{color:oklch(.42 .13 var(--memory-type-hue))}.text-amber-600,.text-amber-700{color:var(--status-warning-label)}.text-blue-700{color:var(--status-info-label)}.text-brand-label{color:var(--brand-label)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-destructive{color:var(--destructive)}.text-destructive-label{color:var(--destructive-label)}.text-emerald-500{color:var(--status-success-label)}.text-foreground{color:var(--foreground)}.text-green-600,.text-green-700{color:var(--status-success-label)}.text-muted-foreground{color:var(--muted-foreground)}.text-orange-700{color:var(--status-warning-label)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-label{color:var(--primary-label)}.text-red-600,.text-red-700{color:var(--destructive-label)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.text-sidebar-foreground{color:var(--sidebar-foreground)}.text-status-success{color:var(--status-success-label)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-input{--tw-ring-color:var(--input)}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,width\]{transition-property:transform,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\!paused{animation-play-state:paused!important}.\!running{animation-play-state:running!important}.\[unicode-bidi\:plaintext\]{unicode-bidi:plaintext}.paused{animation-play-state:paused}.running{animation-play-state:running}.group-focus-within\/tooltip\:opacity-100:is(:where(.group\/tooltip):focus-within *){opacity:1}@media (hover:hover){.group-hover\/tooltip\:opacity-100:is(:where(.group\/tooltip):hover *){opacity:1}}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.selection\:bg-selection ::selection{background-color:var(--selection)}.selection\:bg-selection::selection{background-color:var(--selection)}.selection\:text-foreground ::selection{color:var(--foreground)}.selection\:text-foreground::selection{color:var(--foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-ui::file-selector-button{font-size:.875rem;line-height:var(--tw-leading,1.45)}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}@media (hover:hover){.hover\:bg-destructive\/16:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/16:hover{background-color:color-mix(in oklab, var(--destructive) 16%, transparent)}}.hover\:bg-interactive-hover:hover{background-color:var(--interactive-hover)}.hover\:bg-muted:hover,.hover\:bg-muted\/30:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/30:hover{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.hover\:bg-muted\/40:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.hover\:bg-primary\/16:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/16:hover{background-color:color-mix(in oklab, var(--primary) 16%, transparent)}}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:text-primary:hover{color:var(--primary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:bg-selection:focus-visible{background-color:var(--selection)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:var(--background)}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:bg-destructive\/22:active{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.active\:bg-destructive\/22:active{background-color:color-mix(in oklab, var(--destructive) 22%, transparent)}}.active\:bg-interactive-active:active{background-color:var(--interactive-active)}.active\:bg-primary\/22:active{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.active\:bg-primary\/22:active{background-color:color-mix(in oklab, var(--primary) 22%, transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[icon\=inline-end\]\:pe-2:has([data-icon=inline-end]){padding-inline-end:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-end\]\:pe-2\.5:has([data-icon=inline-end]){padding-inline-end:calc(var(--spacing) * 2.5)}.has-data-\[icon\=inline-end\]\:pe-3:has([data-icon=inline-end]){padding-inline-end:calc(var(--spacing) * 3)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:ps-2:has([data-icon=inline-start]){padding-inline-start:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:ps-2\.5:has([data-icon=inline-start]){padding-inline-start:calc(var(--spacing) * 2.5)}.has-data-\[icon\=inline-start\]\:ps-3:has([data-icon=inline-start]){padding-inline-start:calc(var(--spacing) * 3)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[slot\=alert-action\]\:relative:has([data-slot=alert-action]){position:relative}.has-data-\[slot\=alert-action\]\:pe-18:has([data-slot=alert-action]){padding-inline-end:calc(var(--spacing) * 18)}.has-\[\>svg\]\:grid-cols-\[auto_minmax\(0\,1fr\)\]:has(>svg){grid-template-columns:auto minmax(0,1fr)}.has-\[\>svg\]\:gap-x-2\.5:has(>svg){column-gap:calc(var(--spacing) * 2.5)}.aria-checked\:bg-selection[aria-checked=true],.aria-expanded\:bg-selection[aria-expanded=true]{background-color:var(--selection)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-1[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\:ring-destructive[aria-invalid=true],.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive-label>*)[data-slot=alert-description]{color:var(--destructive-label)}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}@media not all and (width>=48rem){.max-md\:hidden{display:none}.max-md\:-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}}@media (width>=40rem){.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}}@media (width>=48rem){.md\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.md\:sticky{position:sticky}.md\:top-0{top:0}.md\:mx-auto{margin-inline:auto}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:min-h-7{min-height:calc(var(--spacing) * 7)}.md\:min-h-8{min-height:calc(var(--spacing) * 8)}.md\:min-h-9{min-height:calc(var(--spacing) * 9)}.md\:w-14{width:calc(var(--spacing) * 14)}.md\:min-w-7{min-width:calc(var(--spacing) * 7)}.md\:translate-x-0\!{--tw-translate-x:0px!important;translate:var(--tw-translate-x) var(--tw-translate-y)!important}.md\:scroll-mt-4{scroll-margin-top:calc(var(--spacing) * 4)}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-col{flex-direction:column}.md\:justify-center{justify-content:center}.md\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.md\:border-sidebar-border{border-color:var(--sidebar-border)}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:px-0{padding-inline:0}.md\:px-2{padding-inline:calc(var(--spacing) * 2)}}@media (width>=64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.rtl\:-scale-x-100:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *){--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}.rtl\:rotate-90:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *){rotate:90deg}@media not all and (width>=48rem){.max-md\:rtl\:translate-x-full:where(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)),[dir=rtl],[dir=rtl] *){--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}}.dark\:bg-destructive\/16:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/16:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 16%, transparent)}}.dark\:bg-primary\/16:is(.dark *){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-primary\/16:is(.dark *){background-color:color-mix(in oklab, var(--primary) 16%, transparent)}}.dark\:\[color\:oklch\(0\.8_0\.13_var\(--keyword-hue\)\)\]:is(.dark *){color:oklch(.8 .13 var(--keyword-hue))}.dark\:\[color\:oklch\(0\.8_0\.13_var\(--memory-type-hue\)\)\]:is(.dark *){color:oklch(.8 .13 var(--memory-type-hue))}.dark\:text-blue-400:is(.dark *){color:var(--status-info-label)}.dark\:text-green-400:is(.dark *){color:var(--status-success-label)}.dark\:text-orange-400:is(.dark *){color:var(--status-warning-label)}.dark\:text-red-400:is(.dark *){color:var(--destructive-label)}@media (hover:hover){.dark\:hover\:bg-destructive\/22:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/22:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 22%, transparent)}}.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.dark\:hover\:bg-primary\/22:is(.dark *):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-primary\/22:is(.dark *):hover{background-color:color-mix(in oklab, var(--primary) 22%, transparent)}}}.dark\:active\:bg-destructive\/30:is(.dark *):active{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:active\:bg-destructive\/30:is(.dark *):active{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.dark\:active\:bg-primary\/30:is(.dark *):active{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:active\:bg-primary\/30:is(.dark *):active{background-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.\[\&_button\]\:h-auto button{height:auto}.\[\&_button\]\:min-h-8 button{min-height:calc(var(--spacing) * 8)}.\[\&_button\]\:py-1\.5 button{padding-block:calc(var(--spacing) * 1.5)}.\[\&_button\]\:whitespace-normal button{white-space:normal}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}@media (hover:hover){.\[a\]\:hover\:bg-destructive\/16:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-destructive\/16:is(a):hover{background-color:color-mix(in oklab, var(--destructive) 16%, transparent)}}.\[a\]\:hover\:bg-muted:is(a):hover{background-color:var(--muted)}.\[a\]\:hover\:bg-primary\/16:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-primary\/16:is(a):hover{background-color:color-mix(in oklab, var(--primary) 16%, transparent)}}.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.\[a\]\:hover\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}}:is(.\*\:\[svg\]\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.\*\:\[svg\]\:translate-y-0\.5>*):is(svg){--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.\*\:\[svg\]\:text-current>*):is(svg){color:currentColor}:is(.\*\:\[svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4>*):is(svg:not([class*=size-])){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}@media (width>=48rem){.md\:\[\&\>\*\]\:justify-center>*{justify-content:center}.md\:\[\&\>\*\]\:rounded-none>*{border-radius:0}.md\:\[\&\>\*\]\:py-1\.5>*{padding-block:calc(var(--spacing) * 1.5)}.md\:\[\&\>\*\+\*\]\:border-s-0>*+*{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.md\:\[\&\>\*\+\*\]\:border-t>*+*{border-top-style:var(--tw-border-style);border-top-width:1px}}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3\!>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(data:font/woff2;base64,d09GMgABAAAAAAfsABQAAAAAEAwAAAeCAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhwoP0hWQVJbBmA/U1RBVIFiJyYAdC9qEQgKhGSEAAsgADCGCAE2AiQDOgQgBYlMB4EUDAcbLQ4onoexrSC/2ZyLAa8p8VHB8/x3Vue+V0hVJalMJg2nx/TCrQXxBeqLjQG7FyM1WEa/X1tEXN7cFz9EJEMmMUz3RihWSSKeQCbcIou0izz/C8v+fq3VfajEa9gDD11CImXS7qL/RJFVzC1qiB6KmKeD6TZdQ6IRGv78dL6uSVVCfgni5mzu7kcgQBgAEAQTQRCoL++STTYybkJxNfQxAAIAGu8OdEB9teW2jh4BpgDqFjAeSEByW3zFP0CBBgNMsMCGEDjgggdhiEAUAeIIED7ABTDUEnkIE9Q9ahFgKttcVhApo4ACB4qobHaccgDfEjFO6aaWUhjMLt2SyIvHKoDqoA4CSUwEIYQCEjhAO9R1G6keDeDZGjNo+AhxOjCEGTr1WeIF3kYBiLAOKvkJSMiKX0VdAyQt3SDJClCkxJCHkCzfqyVTriJZLcolS32JZHUekq2TYNkYtCtjYHMQXSxGjXDz2t/yLWXzDzxz+o3zFwDEaN23F+13pyMdQAEaSKAR9vcGq4A4MTSKCElGW+M7UcY7xqkggITb28ZJhlqc9q2twYKTt0NjixBgYvO9BIihEBLYuOFXQzfIQ7dXGUEEEgFDooBfAzqiQbpJrhiWSuKJCRFKYbHCyJKI2G5GiZbNAvgAu5pc3vwx4G+g3aDkhklABiSz0BICXrYghtYhx/cdJ+44rY2oZ0aMNRFz3VZjb6W33F3gzltqtOCV8tTHSpOeXuItfvr5lCdfzFpqtEitvqdcdGGFd28ZqqC0tPbeChGXgrIlnhSWu/eUso4uKWFLugyDzQJhflY4659+WjQ++6x72WUMv9G8mw6QJl7BVxX5fe/kpUsOvnZwee9uQ0cGXYd0o89XB2748sDSnt8d2VphdOTTgceDVvOds0v9P/s7HPq15aGun/6Vllb56f1dl0t1LejqrNkpdRZsG8TOnM5vkBG5oiVyVGnS8LHps5cfNWJs6qKPfaNSxiQNBUm3cKNWROr0GSur7Za31k1vieq7LH11VF+jXdRIasRKflc7jkobm1Z9te1IyZA0pDkhLR98+H37Zf1c/8at+dB7x+7GfVyTfJMPiYztsnl59Y5l4j+0n1RXlpHnF3Tq7HecmNF/CJodEMAikruxiyJaGLvHOdAfoA+oDvpjBm2b91cHGRZMU9n25xEU0A8fgEEAdKI3Q1iDtc034sug5YVMkE2jsE+BIkwSoQ3gxXMqz9tELp48bd0cFKOKS7xYjEuXBnZP5ia7DyiO/X/YI+PQSbt2uSdqAkWL9nQbV1XB94/+uPfdZz8dnXYFBYrcTl2SIR/ybxJNJPz/Gupb0JaZeens2ekC7EKr8t+Ls/P5VJPYJdHKyqfg2nqU6bhlidzcddQV/7MmecTzJ5VPcKXkNKSEogHjYFx6QZ7rQ+FSe8njaiNuOnXS8H2ScQ619c2mC3VTtauL0rRbXd/CkSOP37FY9Zkjz8+GibYUMOEWF+RdrFS8Ecv1SHOpPUPZGEIpjPvFyU5cXKjd6OXqorTqy9GwRd++HVufPGnVsW+aO3vggKZ18jR9sXaTC1PWTEsVUaK0FkNySbTQDqlm2PfDjZcu4aalnSLKjnOoYQ0nUlqqXcGpPu/4VgV/xU2pAqW4BW3qzhQ8/hFKhV2qE3+BKAtDqBXjfgnVdH4y0wg5tbVNRenNdTWOrenWLcupQdmsbq5b+18piTe/xRdp1xbILxNPJGInm2z6hoB21Lal0i+ePTtd7B45+3XhFJ329evskXm7qurUVREotqSluSo/L29d3qDhI4YOQqWhI4YNvBNfsMHeXKemXrxQfKeuPOGRVayA3JtkJKEgbPp+dXUDluddutRYLFoXGXWX6N3WFaGLbQtRSitVYNacTNSdy7AaG/HSaUEANcBoGXNdcZvZsOqQ1icBDv21/gzAoYPHH/WDW0qNR3QTYKEAEHig6o13NXbND06CQPlRtYjGNnSktRc09k1mAMDvAlDKfQjgy6fssInlfzmNAjKkDxoxHOBLdVRAIVt9j4qo+hA1w9T1aNBNTUOTTNUHLbqokE+UAfJXCIGw/IxCSL5GRUJeR40rL/UxTm4Q08H6MbCs70ObuNyIIXrINHQYInF06UUlevTjbQzTh5upiDMzMMogUtEnjPs/Y7jAHCJeB0GBHh04tC6FiB6ZFB1oArUSIoFoqhzCeAN6lHwm0T4C3VVPWvjpSMXReuWesMEcoqrmgtNBGd2noWeV0hNAz9rFeShNJxHGsPa3HXeKTk8b55hahySYHaYKKFFLpCfN8rsoaJn01CR04Gkc+5k7KVTCmClX8Q10HCrUEkVlSX+XO33oQR9609tJ516H497WSobWs5Up6TLaS10/dessIskgJSLiDlWvHVUywpkQ7hdPZqGyiEF0uVQerVcPamT1A3eKXdyI1vG9OoflrSXihZ1qqGE3nhmAgiIbRCQgPLEPtOM3UQwTLYaYYomNlpA44opnjV6jkD6id80OOrzf6BzmMD6eEa1zKyeYG1fzfEf16V6jw9XYOaar1/b2kP/IYX8oR2mcFvv2GtBV3JXgd437AQAA)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--background:#fdfcfa;--foreground:#393a34;--card:#f8f7f5;--card-foreground:#393a34;--popover:#f8f7f5;--popover-foreground:#393a34;--primary:#b35017;--primary-foreground:#fff;--primary-hover:#9a4310;--primary-active:#85390c;--primary-label:#85390c;--brand-label:#678d6c;--secondary:#f7f6f4;--secondary-foreground:#393a34;--muted:#f7f6f4;--muted-foreground:#5c5c54;--accent:#a9998f2b;--accent-foreground:#393a34;--selection:#a9998f2b;--interactive-hover:#0000000d;--interactive-active:#00000014;--destructive:#b7493f;--destructive-label:#8f3028;--border:#e5e1de;--border-hover:#cbc7c2;--input:#8b857d;--ring:#b35017;--status-warning:#8d6c15;--status-warning-label:#79590d;--status-success:#5f8d3d;--status-success-label:#426528;--status-info:#2d72c4;--status-info-label:#245faa;--chart-1:#b35017;--chart-2:#5f8d3d;--chart-3:#2d72c4;--chart-4:#8d6c15;--chart-5:#b7493f;--radius:.625rem;--sidebar:#f7f6f4;--sidebar-foreground:#393a34;--sidebar-primary:#b35017;--sidebar-primary-foreground:#fff;--sidebar-accent:#a9998f2b;--sidebar-accent-foreground:#393a34;--sidebar-border:#e5e1de;--sidebar-ring:#b35017;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.dark{--background:#120f0e;--foreground:#c9c5ba;--card:#181715;--card-foreground:#c9c5ba;--popover:#181715;--popover-foreground:#c9c5ba;--primary:#da7c47;--primary-foreground:#120f0e;--primary-hover:#eb8c57;--primary-active:#fd9b66;--primary-label:#fd9b66;--brand-label:#678d6c;--secondary:#171615;--secondary-foreground:#c9c5ba;--muted:#171615;--muted-foreground:#8f8b81;--accent:#c8c6c52b;--accent-foreground:#c9c5ba;--selection:#c8c6c52b;--interactive-hover:#ffffff12;--interactive-active:#ffffff1f;--destructive:#da5b4a;--destructive-label:#ff9b8e;--border:#242323;--border-hover:#504e4c;--input:#777169;--ring:#da7c47;--status-warning:#c67f13;--status-warning-label:#e7a33c;--status-success:#76ad4f;--status-success-label:#9ac974;--status-info:#479fe6;--status-info-label:#78b8ec;--chart-1:#da7c47;--chart-2:#76ad4f;--chart-3:#479fe6;--chart-4:#c67f13;--chart-5:#da5b4a;--sidebar:#171615;--sidebar-foreground:#c9c5ba;--sidebar-primary:#da7c47;--sidebar-primary-foreground:#120f0e;--sidebar-accent:#c8c6c52b;--sidebar-accent-foreground:#c9c5ba;--sidebar-border:#242323;--sidebar-ring:#da7c47;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}::selection{background:var(--selection);color:var(--foreground)}.markdown-content{word-break:break-word;line-height:1.6}.markdown-content pre{background:var(--muted);border:1px solid var(--border);border-radius:var(--radius);padding:.75rem;overflow-x:auto}.markdown-content code{font-family:var(--font-mono);font-size:.75rem}.markdown-content p{margin:.4em 0}.confidence-ring{--p:0;background:conic-gradient(var(--primary) calc(var(--p) * 1%), var(--border) 0);border-radius:9999px;place-items:center;width:2.25rem;height:2.25rem;font-size:.65rem;display:grid}.confidence-ring span{background:var(--card);border-radius:9999px;place-items:center;width:1.75rem;height:1.75rem;display:grid}.settings-view button:not(:disabled){cursor:pointer}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}.settings-view{overflow-wrap:anywhere;min-width:0;font-size:.875rem;line-height:1.45}.settings-view input:not([type=checkbox]):not([type=radio]):not([data-slot]),.settings-view select{border:1px solid var(--input);background:var(--card);min-width:0;max-width:100%;height:36px;color:var(--foreground);border-radius:10px;padding:4px 10px;font-size:.875rem;transition:background-color .15s}.settings-view input::placeholder{color:var(--muted-foreground)}.settings-view :is(input[type=checkbox],input[type=radio]){accent-color:var(--primary);flex-shrink:0}.settings-view button:not([data-slot]):not([role=combobox]):not(.underline){border:1px solid var(--input);background:var(--card);white-space:normal;border-radius:10px;max-width:100%;min-height:36px;padding:4px 10px;transition:background-color .15s}.settings-view button:not([data-slot]):not([role=combobox]):not(:disabled):hover{background:var(--interactive-hover)}.settings-view button:not([data-slot]):not([role=combobox]):not(:disabled):active{background:var(--interactive-active)}.settings-view :is(input,select,button):not([data-slot]):focus-visible{outline:2px solid var(--ring);outline-offset:2px}.settings-view :is(input,select,button):disabled{cursor:not-allowed;opacity:.5}.settings-view :is(input,select)[aria-invalid=true]{border-color:var(--destructive)}.settings-view :is(code,pre,.font-mono){direction:ltr;unicode-bidi:isolate;font-size:.75rem}.settings-view #settings-section-external-api input:not([type=radio]),.settings-view #directory-maps input:not([type=checkbox]){font-family:var(--font-mono);direction:ltr;unicode-bidi:isolate}.settings-view .flex>*,.settings-view .grid>*{min-width:0}.settings-view table{overflow-wrap:normal}