pim-agent 0.11.0 → 0.12.1

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pim-agent",
3
- "version": "0.11.0",
3
+ "version": "0.12.1",
4
4
  "description": "A batteries-included distro of Pi, accessible in your terminal, browser and Telegram.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -75,8 +75,8 @@
75
75
  "vite": "^8.2.2"
76
76
  },
77
77
  "dependencies": {
78
- "@earendil-works/pi-coding-agent": "0.85.1",
79
- "@earendil-works/pi-server": "0.85.1",
78
+ "@earendil-works/pi-coding-agent": "0.87.1",
79
+ "@earendil-works/pi-server": "0.87.1",
80
80
  "diff": "^9.0.0",
81
81
  "fzf": "^0.5.2",
82
82
  "grammy": "^1.46.0",
@@ -4,8 +4,6 @@ type ModelLike = {
4
4
  readonly id?: string;
5
5
  };
6
6
 
7
- const CLAUDE_APPLY_PATCH_MAJOR = 5;
8
-
9
7
  // Never match a GPT-named non-OpenAI model (`eleutherai/gpt-neo`): a false positive hands it a tool it was not trained on.
10
8
  function isGptModel(model: ModelLike | undefined): boolean {
11
9
  const provider = (model?.provider ?? "").toLowerCase();
@@ -25,15 +23,6 @@ function isGptModel(model: ModelLike | undefined): boolean {
25
23
  );
26
24
  }
27
25
 
28
- function claudeMajorVersion(id: string): number | undefined {
29
- const match = /(?:^|[/.])claude-[a-z]+-(\d+)/.exec(id);
30
- return match ? Number(match[1]) : undefined;
31
- }
32
-
33
26
  export function prefersApplyPatch(model: ModelLike | undefined): boolean {
34
- if (isGptModel(model)) {
35
- return true;
36
- }
37
- const major = claudeMajorVersion((model?.id ?? "").toLowerCase());
38
- return major !== undefined && major >= CLAUDE_APPLY_PATCH_MAJOR;
27
+ return isGptModel(model);
39
28
  }
@@ -0,0 +1,128 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { totalmem } from "node:os";
3
+
4
+ export const MEMORY_LIMIT_VAR = "PIM_BASH_MEMORY_MAX";
5
+ const DEFAULT_SHARE_OF_RAM = 0.25;
6
+ const PROBE_LIMIT = 1024 ** 3;
7
+ const UNITS = { "": 1, K: 1024, M: 1024 ** 2, G: 1024 ** 3, T: 1024 ** 4 };
8
+
9
+ export type MemoryScope = {
10
+ readonly unit: string;
11
+ readonly limitBytes: number;
12
+ readonly argv: readonly string[];
13
+ };
14
+
15
+ let supported: Promise<boolean> | null = null;
16
+ let owner: Promise<string | null> | null = null;
17
+
18
+ function limitBytes(): number | null {
19
+ const raw = process.env[MEMORY_LIMIT_VAR]?.trim();
20
+ if (raw === undefined || raw === "") {
21
+ return Math.floor(totalmem() * DEFAULT_SHARE_OF_RAM);
22
+ }
23
+ if (/^(off|infinity|0)$/i.test(raw)) {
24
+ return null;
25
+ }
26
+ const match = /^(\d+(?:\.\d+)?)\s*([KMGT]?)i?B?$/i.exec(raw);
27
+ if (!match) {
28
+ throw new Error(
29
+ `${MEMORY_LIMIT_VAR}=${raw} is not a size: use e.g. 8G or 512M, or off to disable the limit.`
30
+ );
31
+ }
32
+ const unit = (match[2] ?? "").toUpperCase() as keyof typeof UNITS;
33
+ return Math.floor(Number(match[1]) * UNITS[unit]);
34
+ }
35
+
36
+ /** Whether a scope's MemoryMax is really enforced: without the memory controller delegated, systemd accepts it and ignores it. */
37
+ async function probe(): Promise<boolean> {
38
+ if (process.platform !== "linux") {
39
+ return false;
40
+ }
41
+ try {
42
+ const proc = Bun.spawn({
43
+ cmd: [
44
+ "systemd-run",
45
+ "--user",
46
+ "--scope",
47
+ "--quiet",
48
+ "--expand-environment=no",
49
+ `--property=MemoryMax=${PROBE_LIMIT}`,
50
+ "--",
51
+ "sh",
52
+ "-c",
53
+ 'read -r line < /proc/self/cgroup; cat "/sys/fs/cgroup${line#0::}/memory.max"',
54
+ ],
55
+ stdout: "pipe",
56
+ stderr: "ignore",
57
+ });
58
+ const [out, code] = await Promise.all([
59
+ new Response(proc.stdout).text(),
60
+ proc.exited,
61
+ ]);
62
+ return code === 0 && out.trim() === String(PROBE_LIMIT);
63
+ } catch {
64
+ return false;
65
+ }
66
+ }
67
+
68
+ /** The user-manager service this process runs in, so a command's scope stops with it. */
69
+ async function findOwner(): Promise<string | null> {
70
+ try {
71
+ const cgroup = await readFile("/proc/self/cgroup", "utf8");
72
+ const path = cgroup.trim().split("\n").at(-1)?.split("::")[1] ?? "";
73
+ const unit = path.split("/").at(-1) ?? "";
74
+ const underUserManager = path.includes("/user@");
75
+ return underUserManager &&
76
+ unit.endsWith(".service") &&
77
+ !unit.startsWith("user@")
78
+ ? unit
79
+ : null;
80
+ } catch {
81
+ return null;
82
+ }
83
+ }
84
+
85
+ /** The systemd-run prefix that puts one command in its own memory-capped scope, or null when it cannot be capped. */
86
+ async function scope(): Promise<MemoryScope | null> {
87
+ const limit = limitBytes();
88
+ if (limit === null || !(await (supported ??= probe()))) {
89
+ return null;
90
+ }
91
+ const bindTo = await (owner ??= findOwner());
92
+ const unit = `pim-bash-${crypto.randomUUID().slice(0, 8)}.scope`;
93
+ return {
94
+ unit,
95
+ limitBytes: limit,
96
+ argv: [
97
+ "systemd-run",
98
+ "--user",
99
+ "--scope",
100
+ "--quiet",
101
+ "--expand-environment=no",
102
+ "--collect",
103
+ `--unit=${unit}`,
104
+ `--property=MemoryMax=${limit}`,
105
+ "--property=MemorySwapMax=0",
106
+ "--property=OOMPolicy=kill",
107
+ ...(bindTo
108
+ ? [`--property=BindsTo=${bindTo}`, `--property=After=${bindTo}`]
109
+ : []),
110
+ "--",
111
+ ],
112
+ };
113
+ }
114
+
115
+ async function systemctl(args: readonly string[]): Promise<void> {
116
+ await Bun.spawn({
117
+ cmd: ["systemctl", "--user", ...args],
118
+ stdout: "ignore",
119
+ stderr: "ignore",
120
+ }).exited;
121
+ }
122
+
123
+ /** Ends whatever of a killed command is still in its scope, including a scope systemd never saw empty. */
124
+ async function stop(unit: string): Promise<void> {
125
+ await systemctl(["--no-block", "stop", unit]);
126
+ }
127
+
128
+ export const MemoryCap = { limitBytes, scope, stop };
@@ -37,6 +37,11 @@ export function formatResult(
37
37
  lines.push("Aborted.");
38
38
  } else if (result.timedOut) {
39
39
  lines.push(`Timed out after ${timeoutMs} ms.`);
40
+ } else if (result.memoryLimitHit !== null) {
41
+ lines.push(
42
+ `Killed: most likely it exceeded the ${Format.bytes(result.memoryLimitHit)} memory limit for one command. ` +
43
+ "Retrying it unchanged will fail the same way; reduce its memory use (stream or batch the data, run fewer parallel workers)."
44
+ );
40
45
  }
41
46
  for (const label of STREAMS) {
42
47
  const stream = result[label];
@@ -3,6 +3,7 @@ import { SpillCache } from "../../shared/SpillCache";
3
3
  import { StreamCapture } from "./capture";
4
4
  import { isErrorResult } from "./format";
5
5
  import { normaliseStdoutImage } from "./image";
6
+ import { MemoryCap } from "./MemoryCap";
6
7
  import {
7
8
  type BashCommandResult,
8
9
  type CapturedStream,
@@ -18,7 +19,8 @@ const COMMAND_VAR = "PIM_BASH_COMMAND";
18
19
  // argv is what `pkill -f`/`pgrep -f` match, so a command naming its own target would
19
20
  // signal this shell before its target. The env hands it over out of argv's reach, and
20
21
  // the unset keeps it out of every child's environment too.
21
- const RUNNER = `__pim_command=$${COMMAND_VAR}; unset ${COMMAND_VAR}; eval "$__pim_command"`;
22
+ // The raised oom_score_adj makes the command, not the agent or the desktop, the kernel's first victim.
23
+ const RUNNER = `{ echo 500 > /proc/self/oom_score_adj; } 2>/dev/null; __pim_command=$${COMMAND_VAR}; unset ${COMMAND_VAR}; eval "$__pim_command"`;
22
24
 
23
25
  export function killAllActiveBashGroups(sig: NodeJS.Signals = "SIGTERM"): void {
24
26
  for (const pid of activePids) {
@@ -100,10 +102,11 @@ export async function runBashCommand(
100
102
  const startedAt = Date.now();
101
103
  const stdoutCap = new StreamCapture();
102
104
  const stderrCap = new StreamCapture();
105
+ const scope = await MemoryCap.scope();
103
106
 
104
107
  // setsid gives the tree its own process group (pgid == proc.pid) so the whole tree can be signalled.
105
108
  const proc = Bun.spawn({
106
- cmd: ["setsid", "bash", "-lc", RUNNER],
109
+ cmd: [...(scope?.argv ?? []), "setsid", "bash", "-lc", RUNNER],
107
110
  cwd,
108
111
  stdout: "pipe",
109
112
  stderr: "pipe",
@@ -170,6 +173,9 @@ export async function runBashCommand(
170
173
  } finally {
171
174
  clearTimeout(sigkillTimer);
172
175
  }
176
+ if (scope) {
177
+ await MemoryCap.stop(scope.unit);
178
+ }
173
179
  }
174
180
 
175
181
  exitCode = proc.exitCode ?? null;
@@ -207,6 +213,12 @@ export async function runBashCommand(
207
213
  const stdout = stdoutCap.snapshot(sniffed !== null);
208
214
  const stderr = stderrCap.snapshot();
209
215
 
216
+ // Under OOMPolicy=kill a limit hit is a SIGKILL of the whole scope; systemd's own Result for it is racy.
217
+ const memoryLimitHit =
218
+ scope !== null && signalCode === "SIGKILL" && !timedOut && !aborted
219
+ ? scope.limitBytes
220
+ : null;
221
+
210
222
  const [stdoutPath, stderrPath, stdoutImage] = await Promise.all([
211
223
  spillIfTruncated(stdout, stdoutCap, "out"),
212
224
  spillIfTruncated(stderr, stderrCap, "err"),
@@ -222,6 +234,7 @@ export async function runBashCommand(
222
234
  stdoutImage,
223
235
  timedOut,
224
236
  aborted,
237
+ memoryLimitHit,
225
238
  durationMs: Date.now() - startedAt,
226
239
  };
227
240
  }
@@ -43,6 +43,8 @@ export type BashCommandResult = {
43
43
  readonly stdoutImage: NormalisedImage | null;
44
44
  readonly timedOut: boolean;
45
45
  readonly aborted: boolean;
46
+ /** The limit in bytes, set when the capped command was SIGKILLed without pim sending it. */
47
+ readonly memoryLimitHit: number | null;
46
48
  readonly durationMs: number;
47
49
  };
48
50
 
@@ -10,7 +10,7 @@ export default function (pi: ExtensionAPI): void {
10
10
  name: "edit",
11
11
  label: "edit",
12
12
  description:
13
- "Replace strings in a UTF-8 text file. " +
13
+ "Replace strings in a UTF-8 text file; batch several replacements in one call via `edits`. " +
14
14
  "Prefer edit over write for changes to existing files.",
15
15
  parameters: editSchema,
16
16
  renderShell: "self",
@@ -12,7 +12,7 @@ export default function (pi: ExtensionAPI): void {
12
12
  label: "subagent",
13
13
  description:
14
14
  "Run a task in an isolated subagent with a fresh context. " +
15
- "The subagent inherits the currently active tools, except subagent itself. " +
15
+ "The subagent inherits the current model, thinking level and active tools, except subagent itself. " +
16
16
  "Multiple subagent calls in one turn run in parallel. " +
17
17
  "Subagent output returned to the main agent is capped at 32KB.",
18
18
  parameters: subagentSchema,
@@ -26,6 +26,7 @@ export default function (pi: ExtensionAPI): void {
26
26
  signal,
27
27
  onUpdate,
28
28
  activeToolNames: pi.getActiveTools(),
29
+ thinkingLevel: pi.getThinkingLevel(),
29
30
  });
30
31
  },
31
32
  toViewModel: subagentView,
@@ -1,4 +1,5 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
+ import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
3
  import type {
3
4
  AgentSessionEvent,
4
5
  AgentToolResult,
@@ -66,6 +67,8 @@ export type SubagentSession = {
66
67
 
67
68
  export type SubagentSessionSpec = {
68
69
  readonly activeToolNames?: readonly string[];
70
+ /** The parent's live level; left unset, pi falls back to settings, not to the parent. */
71
+ readonly thinkingLevel?: ThinkingLevel;
69
72
  /** The parent's tool call id, which names the child's log on disk. */
70
73
  readonly callId?: string;
71
74
  };
@@ -111,6 +114,7 @@ export async function createSdkSubagentSession(
111
114
  cwd: parentCtx.cwd,
112
115
  agentDir: getAgentDir(),
113
116
  model: parentCtx.model,
117
+ thinkingLevel: spec.thinkingLevel,
114
118
  sessionManager: await childSessionManager(parentCtx, spec.callId),
115
119
  resourceLoader: loader,
116
120
  tools: spec.activeToolNames
@@ -144,6 +148,7 @@ export async function runSubagent(
144
148
  onUpdate,
145
149
  createSession = createSdkSubagentSession,
146
150
  activeToolNames,
151
+ thinkingLevel,
147
152
  callId,
148
153
  } = run;
149
154
 
@@ -175,7 +180,11 @@ export async function runSubagent(
175
180
  };
176
181
 
177
182
  try {
178
- session = await createSession(parentCtx, { activeToolNames, callId });
183
+ session = await createSession(parentCtx, {
184
+ activeToolNames,
185
+ thinkingLevel,
186
+ callId,
187
+ });
179
188
  capture.noteSessionId(session.sessionId);
180
189
  session.subscribe((event) => capture.handle(event));
181
190
  signal?.addEventListener("abort", onAbort, { once: true });
@@ -2,10 +2,13 @@ import type {
2
2
  ExtensionAPI,
3
3
  ExtensionFactory,
4
4
  } from "@earendil-works/pi-coding-agent";
5
- import { formatSkillsForPrompt } from "@earendil-works/pi-coding-agent";
6
-
7
5
  import type { Surface } from "../../shared/Surface";
8
- import { buildSystemPrompt, formatDatetime } from "./prompt";
6
+ import {
7
+ buildEnvironment,
8
+ buildInstructions,
9
+ formatDatetime,
10
+ leadWithSystemPrompt,
11
+ } from "./prompt";
9
12
 
10
13
  const DATETIME_MESSAGE_TYPE = "pim-datetime";
11
14
 
@@ -25,27 +28,18 @@ export default function (surface?: Surface): ExtensionFactory {
25
28
  return { action: "continue" };
26
29
  });
27
30
  pi.on("before_agent_start", (event, ctx) => {
28
- const {
29
- cwd,
30
- contextFiles,
31
- skills,
32
- promptGuidelines,
33
- appendSystemPrompt,
34
- customPrompt,
35
- } = event.systemPromptOptions;
36
- return {
37
- systemPrompt: buildSystemPrompt({
38
- model: ctx.model,
39
- cwd,
40
- contextFiles: contextFiles ?? [],
41
- skillsBlock:
42
- skills && skills.length > 0 ? formatSkillsForPrompt(skills) : "",
43
- toolGuidelines: promptGuidelines ?? [],
44
- appendSystemPrompt,
45
- customPrompt,
46
- ...(surface === undefined ? {} : { surface }),
47
- }),
48
- };
31
+ const options = event.systemPromptOptions;
32
+ if (!options.customPrompt?.trim()) {
33
+ options.customPrompt = buildInstructions(options);
34
+ }
35
+ options.sections.environment = buildEnvironment({
36
+ model: ctx.model,
37
+ surface,
38
+ });
39
+ });
40
+ pi.on("context_with_system", (event) => {
41
+ const messages = leadWithSystemPrompt(event.messages);
42
+ return messages ? { messages } : undefined;
49
43
  });
50
44
  };
51
45
  }
@@ -1,18 +1,14 @@
1
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
1
+ import type { NormalizedBuildSystemPromptOptions } from "@earendil-works/pi-coding-agent";
2
2
 
3
3
  import type { Surface } from "../../shared/Surface";
4
4
 
5
- type BuildOptions = {
6
- readonly model?: ExtensionContext["model"];
7
- readonly cwd: string;
8
- readonly contextFiles: ReadonlyArray<{
9
- readonly path: string;
10
- readonly content: string;
11
- }>;
12
- readonly skillsBlock: string;
13
- readonly toolGuidelines: ReadonlyArray<string>;
14
- readonly appendSystemPrompt?: string;
15
- readonly customPrompt?: string;
5
+ type GuidelineOptions = Pick<
6
+ NormalizedBuildSystemPromptOptions,
7
+ "selectedTools" | "toolGuidelines" | "promptGuidelines"
8
+ >;
9
+
10
+ type EnvironmentOptions = {
11
+ readonly model?: { readonly id: string; readonly provider: string };
16
12
  readonly os?: string;
17
13
  readonly surface?: Surface;
18
14
  };
@@ -34,56 +30,45 @@ function dynamicGuidelines(): ReadonlyArray<string> {
34
30
  return guidelines;
35
31
  }
36
32
 
37
- export function buildSystemPrompt(opts: BuildOptions): string {
38
- const sections: string[] = [];
39
-
40
- if (opts.customPrompt && opts.customPrompt.trim().length > 0) {
41
- sections.push(opts.customPrompt);
42
- } else {
43
- sections.push(
44
- [
45
- "<system_instructions>",
46
- "You are Pim (Pi IMproved), a batteries-included agent built on the Pi harness.",
47
- ...opts.toolGuidelines.map((g) => `- ${g}`),
48
- ...dynamicGuidelines().map((g) => `- ${g}`),
49
- "</system_instructions>",
50
- ].join("\n")
51
- );
33
+ export function buildInstructions(options: GuidelineOptions): string {
34
+ const guidelines = new Set([
35
+ ...options.selectedTools.flatMap(
36
+ (name) => options.toolGuidelines[name] ?? []
37
+ ),
38
+ ...options.promptGuidelines,
39
+ ...dynamicGuidelines(),
40
+ ]);
41
+ return [
42
+ "<system_instructions>",
43
+ "You are Pim (Pi IMproved), a batteries-included agent built on the Pi harness.",
44
+ ...[...guidelines].map((g) => `- ${g}`),
45
+ "</system_instructions>",
46
+ ].join("\n");
47
+ }
48
+
49
+ export function leadWithSystemPrompt<T extends { readonly role: string }>(
50
+ messages: ReadonlyArray<T>
51
+ ): T[] | undefined {
52
+ const first = messages.findIndex((message) => message.role === "system");
53
+ if (first <= 0) {
54
+ return undefined;
52
55
  }
56
+ return [
57
+ messages[first]!,
58
+ ...messages.slice(0, first),
59
+ ...messages.slice(first + 1),
60
+ ];
61
+ }
53
62
 
63
+ export function buildEnvironment(opts: EnvironmentOptions): string {
54
64
  const model = opts.model
55
65
  ? `${opts.model.id} via ${opts.model.provider}`
56
66
  : "unknown";
57
- sections.push(
58
- [
59
- "<environment>",
60
- `- cwd: ${opts.cwd}`,
61
- `- os: ${opts.os ?? describeOs()}`,
62
- `- model: ${model}`,
63
- ...(opts.surface ? [`- surface: ${opts.surface}`] : []),
64
- "</environment>",
65
- ].join("\n")
66
- );
67
-
68
- if (opts.contextFiles.length > 0) {
69
- const files = opts.contextFiles
70
- .map(
71
- ({ path, content }) =>
72
- `<file path="${escapeXmlAttr(path)}">\n${content}\n</file>`
73
- )
74
- .join("\n");
75
- sections.push(`<project_instructions>\n${files}\n</project_instructions>`);
76
- }
77
-
78
- if (opts.skillsBlock) {
79
- sections.push(opts.skillsBlock.trimStart());
80
- }
81
-
82
- if (opts.appendSystemPrompt && opts.appendSystemPrompt.trim().length > 0) {
83
- sections.push(opts.appendSystemPrompt);
84
- }
85
-
86
- return sections.join("\n\n");
67
+ return [
68
+ `- os: ${opts.os ?? describeOs()}`,
69
+ `- model: ${model}`,
70
+ ...(opts.surface ? [`- surface: ${opts.surface}`] : []),
71
+ ].join("\n");
87
72
  }
88
73
 
89
74
  export function describeOs(options: OsDescriptionOptions = {}): string {
@@ -221,11 +206,3 @@ export function formatDatetime(d: Date): string {
221
206
  const day = d.toLocaleDateString("en-US", { weekday: "long" });
222
207
  return `${iso} (${day})`;
223
208
  }
224
-
225
- function escapeXmlAttr(value: string): string {
226
- return value
227
- .replace(/&/g, "&amp;")
228
- .replace(/"/g, "&quot;")
229
- .replace(/</g, "&lt;")
230
- .replace(/>/g, "&gt;");
231
- }
@@ -379,6 +379,7 @@ function systemdUnit(unit: Unit, at: Install): string {
379
379
  `ExecStart=${at.bunPath} ${at.pimEntry} ${modeArgs(unit).join(" ")}`,
380
380
  "Restart=always",
381
381
  "RestartSec=2",
382
+ "OOMPolicy=continue",
382
383
  "",
383
384
  "[Install]",
384
385
  "WantedBy=default.target",
@@ -3,7 +3,7 @@ import type {
3
3
  ExtensionAPI,
4
4
  ToolDefinition,
5
5
  } from "@earendil-works/pi-coding-agent";
6
- import { validateToolArguments } from "@earendil-works/pi-ai";
6
+ import { validateToolArguments, type JsonObject } from "@earendil-works/pi-ai";
7
7
  import type { Static, TSchema } from "typebox";
8
8
  import { Levenshtein } from "./Levenshtein";
9
9
  import { Renderer } from "./Renderer";
@@ -169,7 +169,7 @@ function wrap<TParams extends TSchema, TDetails = unknown, TState = unknown>(
169
169
  type: "toolCall",
170
170
  id: "",
171
171
  name: def.name,
172
- arguments: cleaned as Record<string, unknown>,
172
+ arguments: cleaned as JsonObject,
173
173
  }
174
174
  ) as Static<TParams>;
175
175
  } catch (err) {
@@ -461,7 +461,7 @@ function revalidateBranch(branch: JsonSchema, value: unknown): Issue[] {
461
461
  type: "toolCall",
462
462
  id: "",
463
463
  name: "_branch",
464
- arguments: (value ?? {}) as Record<string, unknown>,
464
+ arguments: (value ?? {}) as JsonObject,
465
465
  }
466
466
  );
467
467
  return [];
@@ -1,3 +1,3 @@
1
- import{n as e,t}from"./index-CTrlTM53.js";var n=e(t(((e,t)=>{function n(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw Error(`map is read-only`)}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw Error(`set is read-only`)}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(t=>{let r=e[t],i=typeof r;(i===`object`||i===`function`)&&!Object.isFrozen(r)&&n(r)}),e}var r=class{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function i(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#x27;`)}function a(e,...t){let n=Object.create(null);for(let t in e)n[t]=e[t];return t.forEach(function(e){for(let t in e)n[t]=e[t]}),n}var o=`</span>`,s=e=>!!e.scope,c=(e,{prefix:t})=>{if(e.startsWith(`language:`))return e.replace(`language:`,`language-`);if(e.includes(`.`)){let n=e.split(`.`);return[`${t}${n.shift()}`,...n.map((e,t)=>`${e}${`_`.repeat(t+1)}`)].join(` `)}return`${t}${e}`},l=class{constructor(e,t){this.buffer=``,this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=i(e)}openNode(e){if(!s(e))return;let t=c(e.scope,{prefix:this.classPrefix});this.span(t)}closeNode(e){s(e)&&(this.buffer+=o)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}},u=(e={})=>{let t={children:[]};return Object.assign(t,e),t},d=class e{constructor(){this.rootNode=u(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let t=u({scope:e});this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return typeof t==`string`?e.addText(t):t.children&&(e.openNode(t),t.children.forEach(t=>this._walk(e,t)),e.closeNode(t)),e}static _collapse(t){typeof t!=`string`&&t.children&&(t.children.every(e=>typeof e==`string`)?t.children=[t.children.join(``)]:t.children.forEach(t=>{e._collapse(t)}))}},f=class extends d{constructor(e){super(),this.options=e}addText(e){e!==``&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,t){let n=e.root;t&&(n.scope=`language:${t}`),this.add(n)}toHTML(){return new l(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function p(e){return e?typeof e==`string`?e:e.source:null}function m(e){return _(`(?=`,e,`)`)}function h(e){return _(`(?:`,e,`)*`)}function g(e){return _(`(?:`,e,`)?`)}function _(...e){return e.map(e=>p(e)).join(``)}function v(e){let t=e[e.length-1];return typeof t==`object`&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function y(...e){return`(`+(v(e).capture?``:`?:`)+e.map(e=>p(e)).join(`|`)+`)`}function b(e){return RegExp(e.toString()+`|`).exec(``).length-1}function ee(e,t){let n=e&&e.exec(t);return n&&n.index===0}var x=new RegExp(y(/\[(?:[^\\\]]|\\.)*\]/,/\(\?<(?![=!])[^>]+>/,/\(\?'[^']+'/,/\(\??/,/\\([1-9][0-9]*)/,/\\./));function S(e,{joinWith:t}){let n=0;return e.map(e=>{n+=1;let t=n,r=p(e),i=``;for(;r.length>0;){let e=x.exec(r);if(!e){i+=r;break}i+=r.substring(0,e.index),r=r.substring(e.index+e[0].length),e[0][0]===`\\`&&e[1]?i+=`\\`+String(Number(e[1])+t):(i+=e[0],(e[0]===`(`||/^\(\?[<']/.test(e[0]))&&n++)}return i}).map(e=>`(${e})`).join(t)}var C=/\b\B/,w=`[a-zA-Z]\\w*`,T=`[a-zA-Z_]\\w*`,E=`\\b\\d+(\\.\\d+)?`,D=`(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)`,O=`\\b(0b[01]+)`,k=`!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~`,A=(e={})=>{let t=/^#![ ]*\//;return e.binary&&(e.begin=_(t,/.*\b/,e.binary,/\b.*/)),a({scope:`meta`,begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{e.index!==0&&t.ignoreMatch()}},e)},j={begin:`\\\\[\\s\\S]`,relevance:0},M={scope:`string`,begin:`'`,end:`'`,illegal:`\\n`,contains:[j]},N={scope:`string`,begin:`"`,end:`"`,illegal:`\\n`,contains:[j]},P={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},F=function(e,t,n={}){let r=a({scope:`comment`,begin:e,end:t,contains:[]},n);r.contains.push({scope:`doctag`,begin:`[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)`,end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=y(`I`,`a`,`is`,`so`,`us`,`to`,`at`,`if`,`in`,`it`,`on`,/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:_(/[ ]+/,`(`,i,/[.]?[:]?([.][ ]|[ ])/,`){3}`)}),r},I=F(`//`,`$`),L=F(`/\\*`,`\\*/`),R=F(`#`,`$`),z=Object.freeze({__proto__:null,APOS_STRING_MODE:M,BACKSLASH_ESCAPE:j,BINARY_NUMBER_MODE:{scope:`number`,begin:O,relevance:0},BINARY_NUMBER_RE:O,COMMENT:F,C_BLOCK_COMMENT_MODE:L,C_LINE_COMMENT_MODE:I,C_NUMBER_MODE:{scope:`number`,begin:D,relevance:0},C_NUMBER_RE:D,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})},HASH_COMMENT_MODE:R,IDENT_RE:w,MATCH_NOTHING_RE:C,METHOD_GUARD:{begin:`\\.\\s*[a-zA-Z_]\\w*`,relevance:0},NUMBER_MODE:{scope:`number`,begin:E,relevance:0},NUMBER_RE:E,PHRASAL_WORDS_MODE:P,QUOTE_STRING_MODE:N,REGEXP_MODE:{scope:`regexp`,begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[j,{begin:/\[/,end:/\]/,relevance:0,contains:[j]}]},RE_STARTERS_RE:k,SHEBANG:A,TITLE_MODE:{scope:`title`,begin:w,relevance:0},UNDERSCORE_IDENT_RE:T,UNDERSCORE_TITLE_MODE:{scope:`title`,begin:T,relevance:0}});function B(e,t){e.input[e.index-1]===`.`&&t.ignoreMatch()}function te(e,t){e.className!==void 0&&(e.scope=e.className,delete e.className)}function ne(e,t){t&&e.beginKeywords&&(e.begin=`\\b(`+e.beginKeywords.split(` `).join(`|`)+`)(?!\\.)(?=\\b|\\s)`,e.__beforeBegin=B,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,e.relevance===void 0&&(e.relevance=0))}function re(e,t){Array.isArray(e.illegal)&&(e.illegal=y(...e.illegal))}function ie(e,t){if(e.match){if(e.begin||e.end)throw Error(`begin & end are not supported with match`);e.begin=e.match,delete e.match}}function ae(e,t){e.relevance===void 0&&(e.relevance=1)}var oe=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw Error(`beforeMatch cannot be used with starts`);let n=Object.assign({},e);Object.keys(e).forEach(t=>{delete e[t]}),e.keywords=n.keywords,e.begin=_(n.beforeMatch,m(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},se=[`of`,`and`,`for`,`in`,`not`,`or`,`if`,`then`,`parent`,`list`,`value`],ce=`keyword`;function V(e,t,n=ce){let r=Object.create(null);return typeof e==`string`?i(n,e.split(` `)):Array.isArray(e)?i(n,e):Object.keys(e).forEach(function(n){Object.assign(r,V(e[n],t,n))}),r;function i(e,n){t&&(n=n.map(e=>e.toLowerCase())),n.forEach(function(t){let n=t.split(`|`);r[n[0]]=[e,le(n[0],n[1])]})}}function le(e,t){return t?Number(t):+!ue(e)}function ue(e){return se.includes(e.toLowerCase())}var H={},U=e=>{console.error(e)},W=(e,...t)=>{console.log(`WARN: ${e}`,...t)},G=(e,t)=>{H[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),H[`${e}/${t}`]=!0)},K=Error();function q(e,t,{key:n}){let r=0,i=e[n],a={},o={};for(let e=1;e<=t.length;e++)o[e+r]=i[e],a[e+r]=!0,r+=b(t[e-1]);e[n]=o,e[n]._emit=a,e[n]._multi=!0}function de(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw U(`skip, excludeBegin, returnBegin not compatible with beginScope: {}`),K;if(typeof e.beginScope!=`object`||e.beginScope===null)throw U(`beginScope must be object`),K;q(e,e.begin,{key:`beginScope`}),e.begin=S(e.begin,{joinWith:``})}}function fe(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw U(`skip, excludeEnd, returnEnd not compatible with endScope: {}`),K;if(typeof e.endScope!=`object`||e.endScope===null)throw U(`endScope must be object`),K;q(e,e.end,{key:`endScope`}),e.end=S(e.end,{joinWith:``})}}function pe(e){e.scope&&typeof e.scope==`object`&&e.scope!==null&&(e.beginScope=e.scope,delete e.scope)}function me(e){pe(e),typeof e.beginScope==`string`&&(e.beginScope={_wrap:e.beginScope}),typeof e.endScope==`string`&&(e.endScope={_wrap:e.endScope}),de(e),fe(e)}function he(e){function t(t,n){return new RegExp(p(t),`m`+(e.case_insensitive?`i`:``)+(e.unicodeRegex?`u`:``)+(n?`g`:``))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=b(e)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let e=this.regexes.map(e=>e[1]);this.matcherRe=t(S(e,{joinWith:`|`}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;let t=this.matcherRe.exec(e);if(!t)return null;let n=t.findIndex((e,t)=>t>0&&e!==void 0),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];let t=new n;return this.rules.slice(e).forEach(([e,n])=>t.addRule(e,n)),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),t.type===`begin`&&this.count++}exec(e){let t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition()&&!(n&&n.index===this.lastIndex)){let t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}function i(e){let t=new r;return e.contains.forEach(e=>t.addRule(e.begin,{rule:e,type:`begin`})),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:`end`}),e.illegal&&t.addRule(e.illegal,{type:`illegal`}),t}function o(n,r){let a=n;if(n.isCompiled)return a;[te,ie,me,oe].forEach(e=>e(n,r)),e.compilerExtensions.forEach(e=>e(n,r)),n.__beforeBegin=null,[ne,re,ae].forEach(e=>e(n,r)),n.isCompiled=!0;let s=null;return typeof n.keywords==`object`&&n.keywords.$pattern&&(n.keywords=Object.assign({},n.keywords),s=n.keywords.$pattern,delete n.keywords.$pattern),s||=/\w+/,n.keywords&&=V(n.keywords,e.case_insensitive),a.keywordPatternRe=t(s,!0),r&&(n.begin||=/\B|\b/,a.beginRe=t(a.begin),!n.end&&!n.endsWithParent&&(n.end=/\B|\b/),n.end&&(a.endRe=t(a.end)),a.terminatorEnd=p(a.end)||``,n.endsWithParent&&r.terminatorEnd&&(a.terminatorEnd+=(n.end?`|`:``)+r.terminatorEnd)),n.illegal&&(a.illegalRe=t(n.illegal)),n.contains||=[],n.contains=[].concat(...n.contains.map(function(e){return ge(e===`self`?n:e)})),n.contains.forEach(function(e){o(e,a)}),n.starts&&o(n.starts,r),a.matcher=i(a),a}if(e.compilerExtensions||=[],e.contains&&e.contains.includes(`self`))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return e.classNameAliases=a(e.classNameAliases||{}),o(e)}function J(e){return e?e.endsWithParent||J(e.starts):!1}function ge(e){return e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map(function(t){return a(e,{variants:null},t)})),e.cachedVariants?e.cachedVariants:J(e)?a(e,{starts:e.starts?a(e.starts):null}):Object.isFrozen(e)?a(e):e}var _e=`11.12.0`,ve=class extends Error{constructor(e,t){super(e),this.name=`HTMLInjectionError`,this.html=t}},Y=i,X=a,Z=Symbol(`nomatch`),ye=7,Q=function(e){let t=Object.create(null),i=Object.create(null),a=[],o=!0,s=`Could not find the language '{}', did you forget to load/include a language module?`,c={disableAutodetect:!0,name:`Plain text`,contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:`hljs-`,cssSelector:`pre code`,languages:null,__emitter:f};function u(e){return l.noHighlightRe.test(e)}function d(e){let t=e.className+` `;t+=e.parentNode?e.parentNode.className:``;let n=l.languageDetectRe.exec(t);if(n){let t=M(n[1]);return t||(W(s.replace(`{}`,n[1])),W(`Falling back to no-highlight mode for this block.`,e)),t?n[1]:`no-highlight`}return t.split(/\s+/).find(e=>u(e)||M(e))}function p(e,t,n){let r=``,i=``;typeof t==`object`?(r=e,n=t.ignoreIllegals,i=t.language):(G(`10.7.0`,`highlight(lang, code, ...args) has been deprecated.`),G(`10.7.0`,`Please use highlight(code, options) instead.
1
+ import{n as e,t}from"./index-C5D7B_8d.js";var n=e(t(((e,t)=>{function n(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw Error(`map is read-only`)}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw Error(`set is read-only`)}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(t=>{let r=e[t],i=typeof r;(i===`object`||i===`function`)&&!Object.isFrozen(r)&&n(r)}),e}var r=class{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function i(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#x27;`)}function a(e,...t){let n=Object.create(null);for(let t in e)n[t]=e[t];return t.forEach(function(e){for(let t in e)n[t]=e[t]}),n}var o=`</span>`,s=e=>!!e.scope,c=(e,{prefix:t})=>{if(e.startsWith(`language:`))return e.replace(`language:`,`language-`);if(e.includes(`.`)){let n=e.split(`.`);return[`${t}${n.shift()}`,...n.map((e,t)=>`${e}${`_`.repeat(t+1)}`)].join(` `)}return`${t}${e}`},l=class{constructor(e,t){this.buffer=``,this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=i(e)}openNode(e){if(!s(e))return;let t=c(e.scope,{prefix:this.classPrefix});this.span(t)}closeNode(e){s(e)&&(this.buffer+=o)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}},u=(e={})=>{let t={children:[]};return Object.assign(t,e),t},d=class e{constructor(){this.rootNode=u(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let t=u({scope:e});this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return typeof t==`string`?e.addText(t):t.children&&(e.openNode(t),t.children.forEach(t=>this._walk(e,t)),e.closeNode(t)),e}static _collapse(t){typeof t!=`string`&&t.children&&(t.children.every(e=>typeof e==`string`)?t.children=[t.children.join(``)]:t.children.forEach(t=>{e._collapse(t)}))}},f=class extends d{constructor(e){super(),this.options=e}addText(e){e!==``&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,t){let n=e.root;t&&(n.scope=`language:${t}`),this.add(n)}toHTML(){return new l(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function p(e){return e?typeof e==`string`?e:e.source:null}function m(e){return _(`(?=`,e,`)`)}function h(e){return _(`(?:`,e,`)*`)}function g(e){return _(`(?:`,e,`)?`)}function _(...e){return e.map(e=>p(e)).join(``)}function v(e){let t=e[e.length-1];return typeof t==`object`&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}function y(...e){return`(`+(v(e).capture?``:`?:`)+e.map(e=>p(e)).join(`|`)+`)`}function b(e){return RegExp(e.toString()+`|`).exec(``).length-1}function ee(e,t){let n=e&&e.exec(t);return n&&n.index===0}var x=new RegExp(y(/\[(?:[^\\\]]|\\.)*\]/,/\(\?<(?![=!])[^>]+>/,/\(\?'[^']+'/,/\(\??/,/\\([1-9][0-9]*)/,/\\./));function S(e,{joinWith:t}){let n=0;return e.map(e=>{n+=1;let t=n,r=p(e),i=``;for(;r.length>0;){let e=x.exec(r);if(!e){i+=r;break}i+=r.substring(0,e.index),r=r.substring(e.index+e[0].length),e[0][0]===`\\`&&e[1]?i+=`\\`+String(Number(e[1])+t):(i+=e[0],(e[0]===`(`||/^\(\?[<']/.test(e[0]))&&n++)}return i}).map(e=>`(${e})`).join(t)}var C=/\b\B/,w=`[a-zA-Z]\\w*`,T=`[a-zA-Z_]\\w*`,E=`\\b\\d+(\\.\\d+)?`,D=`(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)`,O=`\\b(0b[01]+)`,k=`!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~`,A=(e={})=>{let t=/^#![ ]*\//;return e.binary&&(e.begin=_(t,/.*\b/,e.binary,/\b.*/)),a({scope:`meta`,begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{e.index!==0&&t.ignoreMatch()}},e)},j={begin:`\\\\[\\s\\S]`,relevance:0},M={scope:`string`,begin:`'`,end:`'`,illegal:`\\n`,contains:[j]},N={scope:`string`,begin:`"`,end:`"`,illegal:`\\n`,contains:[j]},P={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},F=function(e,t,n={}){let r=a({scope:`comment`,begin:e,end:t,contains:[]},n);r.contains.push({scope:`doctag`,begin:`[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)`,end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=y(`I`,`a`,`is`,`so`,`us`,`to`,`at`,`if`,`in`,`it`,`on`,/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:_(/[ ]+/,`(`,i,/[.]?[:]?([.][ ]|[ ])/,`){3}`)}),r},I=F(`//`,`$`),L=F(`/\\*`,`\\*/`),R=F(`#`,`$`),z=Object.freeze({__proto__:null,APOS_STRING_MODE:M,BACKSLASH_ESCAPE:j,BINARY_NUMBER_MODE:{scope:`number`,begin:O,relevance:0},BINARY_NUMBER_RE:O,COMMENT:F,C_BLOCK_COMMENT_MODE:L,C_LINE_COMMENT_MODE:I,C_NUMBER_MODE:{scope:`number`,begin:D,relevance:0},C_NUMBER_RE:D,END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})},HASH_COMMENT_MODE:R,IDENT_RE:w,MATCH_NOTHING_RE:C,METHOD_GUARD:{begin:`\\.\\s*[a-zA-Z_]\\w*`,relevance:0},NUMBER_MODE:{scope:`number`,begin:E,relevance:0},NUMBER_RE:E,PHRASAL_WORDS_MODE:P,QUOTE_STRING_MODE:N,REGEXP_MODE:{scope:`regexp`,begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[j,{begin:/\[/,end:/\]/,relevance:0,contains:[j]}]},RE_STARTERS_RE:k,SHEBANG:A,TITLE_MODE:{scope:`title`,begin:w,relevance:0},UNDERSCORE_IDENT_RE:T,UNDERSCORE_TITLE_MODE:{scope:`title`,begin:T,relevance:0}});function B(e,t){e.input[e.index-1]===`.`&&t.ignoreMatch()}function te(e,t){e.className!==void 0&&(e.scope=e.className,delete e.className)}function ne(e,t){t&&e.beginKeywords&&(e.begin=`\\b(`+e.beginKeywords.split(` `).join(`|`)+`)(?!\\.)(?=\\b|\\s)`,e.__beforeBegin=B,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,e.relevance===void 0&&(e.relevance=0))}function re(e,t){Array.isArray(e.illegal)&&(e.illegal=y(...e.illegal))}function ie(e,t){if(e.match){if(e.begin||e.end)throw Error(`begin & end are not supported with match`);e.begin=e.match,delete e.match}}function ae(e,t){e.relevance===void 0&&(e.relevance=1)}var oe=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw Error(`beforeMatch cannot be used with starts`);let n=Object.assign({},e);Object.keys(e).forEach(t=>{delete e[t]}),e.keywords=n.keywords,e.begin=_(n.beforeMatch,m(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},se=[`of`,`and`,`for`,`in`,`not`,`or`,`if`,`then`,`parent`,`list`,`value`],ce=`keyword`;function V(e,t,n=ce){let r=Object.create(null);return typeof e==`string`?i(n,e.split(` `)):Array.isArray(e)?i(n,e):Object.keys(e).forEach(function(n){Object.assign(r,V(e[n],t,n))}),r;function i(e,n){t&&(n=n.map(e=>e.toLowerCase())),n.forEach(function(t){let n=t.split(`|`);r[n[0]]=[e,le(n[0],n[1])]})}}function le(e,t){return t?Number(t):+!ue(e)}function ue(e){return se.includes(e.toLowerCase())}var H={},U=e=>{console.error(e)},W=(e,...t)=>{console.log(`WARN: ${e}`,...t)},G=(e,t)=>{H[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),H[`${e}/${t}`]=!0)},K=Error();function q(e,t,{key:n}){let r=0,i=e[n],a={},o={};for(let e=1;e<=t.length;e++)o[e+r]=i[e],a[e+r]=!0,r+=b(t[e-1]);e[n]=o,e[n]._emit=a,e[n]._multi=!0}function de(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw U(`skip, excludeBegin, returnBegin not compatible with beginScope: {}`),K;if(typeof e.beginScope!=`object`||e.beginScope===null)throw U(`beginScope must be object`),K;q(e,e.begin,{key:`beginScope`}),e.begin=S(e.begin,{joinWith:``})}}function fe(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw U(`skip, excludeEnd, returnEnd not compatible with endScope: {}`),K;if(typeof e.endScope!=`object`||e.endScope===null)throw U(`endScope must be object`),K;q(e,e.end,{key:`endScope`}),e.end=S(e.end,{joinWith:``})}}function pe(e){e.scope&&typeof e.scope==`object`&&e.scope!==null&&(e.beginScope=e.scope,delete e.scope)}function me(e){pe(e),typeof e.beginScope==`string`&&(e.beginScope={_wrap:e.beginScope}),typeof e.endScope==`string`&&(e.endScope={_wrap:e.endScope}),de(e),fe(e)}function he(e){function t(t,n){return new RegExp(p(t),`m`+(e.case_insensitive?`i`:``)+(e.unicodeRegex?`u`:``)+(n?`g`:``))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=b(e)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let e=this.regexes.map(e=>e[1]);this.matcherRe=t(S(e,{joinWith:`|`}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;let t=this.matcherRe.exec(e);if(!t)return null;let n=t.findIndex((e,t)=>t>0&&e!==void 0),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];let t=new n;return this.rules.slice(e).forEach(([e,n])=>t.addRule(e,n)),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),t.type===`begin`&&this.count++}exec(e){let t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition()&&!(n&&n.index===this.lastIndex)){let t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}}function i(e){let t=new r;return e.contains.forEach(e=>t.addRule(e.begin,{rule:e,type:`begin`})),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:`end`}),e.illegal&&t.addRule(e.illegal,{type:`illegal`}),t}function o(n,r){let a=n;if(n.isCompiled)return a;[te,ie,me,oe].forEach(e=>e(n,r)),e.compilerExtensions.forEach(e=>e(n,r)),n.__beforeBegin=null,[ne,re,ae].forEach(e=>e(n,r)),n.isCompiled=!0;let s=null;return typeof n.keywords==`object`&&n.keywords.$pattern&&(n.keywords=Object.assign({},n.keywords),s=n.keywords.$pattern,delete n.keywords.$pattern),s||=/\w+/,n.keywords&&=V(n.keywords,e.case_insensitive),a.keywordPatternRe=t(s,!0),r&&(n.begin||=/\B|\b/,a.beginRe=t(a.begin),!n.end&&!n.endsWithParent&&(n.end=/\B|\b/),n.end&&(a.endRe=t(a.end)),a.terminatorEnd=p(a.end)||``,n.endsWithParent&&r.terminatorEnd&&(a.terminatorEnd+=(n.end?`|`:``)+r.terminatorEnd)),n.illegal&&(a.illegalRe=t(n.illegal)),n.contains||=[],n.contains=[].concat(...n.contains.map(function(e){return ge(e===`self`?n:e)})),n.contains.forEach(function(e){o(e,a)}),n.starts&&o(n.starts,r),a.matcher=i(a),a}if(e.compilerExtensions||=[],e.contains&&e.contains.includes(`self`))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return e.classNameAliases=a(e.classNameAliases||{}),o(e)}function J(e){return e?e.endsWithParent||J(e.starts):!1}function ge(e){return e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map(function(t){return a(e,{variants:null},t)})),e.cachedVariants?e.cachedVariants:J(e)?a(e,{starts:e.starts?a(e.starts):null}):Object.isFrozen(e)?a(e):e}var _e=`11.12.0`,ve=class extends Error{constructor(e,t){super(e),this.name=`HTMLInjectionError`,this.html=t}},Y=i,X=a,Z=Symbol(`nomatch`),ye=7,Q=function(e){let t=Object.create(null),i=Object.create(null),a=[],o=!0,s=`Could not find the language '{}', did you forget to load/include a language module?`,c={disableAutodetect:!0,name:`Plain text`,contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:`hljs-`,cssSelector:`pre code`,languages:null,__emitter:f};function u(e){return l.noHighlightRe.test(e)}function d(e){let t=e.className+` `;t+=e.parentNode?e.parentNode.className:``;let n=l.languageDetectRe.exec(t);if(n){let t=M(n[1]);return t||(W(s.replace(`{}`,n[1])),W(`Falling back to no-highlight mode for this block.`,e)),t?n[1]:`no-highlight`}return t.split(/\s+/).find(e=>u(e)||M(e))}function p(e,t,n){let r=``,i=``;typeof t==`object`?(r=e,n=t.ignoreIllegals,i=t.language):(G(`10.7.0`,`highlight(lang, code, ...args) has been deprecated.`),G(`10.7.0`,`Please use highlight(code, options) instead.
2
2
  https://github.com/highlightjs/highlight.js/issues/2277`),i=e,r=t),n===void 0&&(n=!0);let a={code:r,language:i};R(`before:highlight`,a);let o=a.result?a.result:v(a.language,a.code,n);return o.code=a.code,R(`after:highlight`,o),o}function v(e,n,i,a){let c=Object.create(null);function u(e,t){return e.keywords[t]}function d(){if(!k.keywords){j.addText(N);return}let e=0;k.keywordPatternRe.lastIndex=0;let t=k.keywordPatternRe.exec(N),n=``;for(;t;){n+=N.substring(e,t.index);let r=E.case_insensitive?t[0].toLowerCase():t[0],i=u(k,r);if(i){let[e,a]=i;if(j.addText(n),n=``,c[r]=(c[r]||0)+1,c[r]<=ye&&(P+=a),e.startsWith(`_`))n+=t[0];else{let n=E.classNameAliases[e]||e;m(t[0],n)}}else n+=t[0];e=k.keywordPatternRe.lastIndex,t=k.keywordPatternRe.exec(N)}n+=N.substring(e),j.addText(n)}function f(){if(N===``)return;let e=null;if(typeof k.subLanguage==`string`){if(!t[k.subLanguage]){j.addText(N);return}e=v(k.subLanguage,N,!0,A[k.subLanguage]),A[k.subLanguage]=e._top}else e=x(N,k.subLanguage.length?k.subLanguage:null);k.relevance>0&&(P+=e.relevance),j.__addSublanguage(e._emitter,e.language)}function p(){k.subLanguage==null?d():f(),N=``}function m(e,t){e!==``&&(j.startScope(t),j.addText(e),j.endScope())}function h(e,t){let n=1,r=t.length-1;for(;n<=r;){if(!e._emit[n]){n++;continue}let r=E.classNameAliases[e[n]]||e[n],i=t[n];r?m(i,r):(N=i,d(),N=``),n++}}function g(e,t){return e.scope&&typeof e.scope==`string`&&j.openNode(E.classNameAliases[e.scope]||e.scope),e.beginScope&&(e.beginScope._wrap?(m(N,E.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),N=``):e.beginScope._multi&&(h(e.beginScope,t),N=``)),k=Object.create(e,{parent:{value:k}}),k}function _(e,t,n){let i=ee(e.endRe,n);if(i){if(e[`on:end`]){let n=new r(e);e[`on:end`](t,n),n.isMatchIgnored&&(i=!1)}if(i){for(;e.endsParent&&e.parent;)e=e.parent;return e}}if(e.endsWithParent)return _(e.parent,t,n)}function y(e){return k.matcher.regexIndex===0?(N+=e[0],1):(L=!0,0)}function b(e){let t=e[0],n=e.rule,i=new r(n),a=[n.__beforeBegin,n[`on:begin`]];for(let n of a)if(n&&(n(e,i),i.isMatchIgnored))return y(t);return n.skip?N+=t:(n.excludeBegin&&(N+=t),p(),!n.returnBegin&&!n.excludeBegin&&(N=t)),g(n,e),n.returnBegin?0:t.length}function S(e){let t=e[0],r=n.substring(e.index),i=_(k,e,r);if(!i)return Z;let a=k;k.endScope&&k.endScope._wrap?(p(),m(t,k.endScope._wrap)):k.endScope&&k.endScope._multi?(p(),h(k.endScope,e)):a.skip?N+=t:(a.returnEnd||a.excludeEnd||(N+=t),p(),a.excludeEnd&&(N=t));do k.scope&&j.closeNode(),!k.skip&&!k.subLanguage&&(P+=k.relevance),k=k.parent;while(k!==i.parent);return i.starts&&g(i.starts,e),a.returnEnd?0:t.length}function C(){let e=[];for(let t=k;t!==E;t=t.parent)t.scope&&e.unshift(t.scope);e.forEach(e=>j.openNode(e))}let w={};function T(t,r){let a=r&&r[0];if(N+=t,a==null)return p(),0;if(w.type===`begin`&&r.type===`end`&&w.index===r.index&&a===``){if(N+=n.slice(r.index,r.index+1),!o){let t=Error(`0 width match regex (${e})`);throw t.languageName=e,t.badRule=w.rule,t}return 1}if(w=r,r.type===`begin`)return b(r);if(r.type===`illegal`&&!i){let e=Error(`Illegal lexeme "`+a+`" for mode "`+(k.scope||`<unnamed>`)+`"`);throw e.mode=k,e}if(r.type===`end`){let e=S(r);if(e!==Z)return e}if(r.type===`illegal`&&a===``)return r.index===n.length||(N+=`
3
3
  `),1;if(I>1e5&&I>r.index*3)throw Error(`potential infinite loop, way more iterations than matches`);return N+=a,a.length}let E=M(e);if(!E)throw U(s.replace(`{}`,e)),Error(`Unknown language: "`+e+`"`);let D=he(E),O=``,k=a||D,A={},j=new l.__emitter(l);C();let N=``,P=0,F=0,I=0,L=!1;try{if(E.__emitTokens)E.__emitTokens(n,j);else{for(k.matcher.considerAll();;){I++,L?L=!1:k.matcher.considerAll(),k.matcher.lastIndex=F;let e=k.matcher.exec(n);if(!e)break;let t=T(n.substring(F,e.index),e);F=e.index+t}T(n.substring(F))}return j.finalize(),O=j.toHTML(),{language:e,value:O,relevance:P,illegal:!1,_emitter:j,_top:k}}catch(t){if(t.message&&t.message.includes(`Illegal`))return{language:e,value:Y(n),illegal:!0,relevance:0,_illegalBy:{message:t.message,index:F,context:n.slice(F-100,F+100),mode:t.mode,resultSoFar:O},_emitter:j};if(o)return{language:e,value:Y(n),illegal:!1,relevance:0,errorRaised:t,_emitter:j,_top:k};throw t}}function b(e){let t={value:Y(e),illegal:!1,relevance:0,_top:c,_emitter:new l.__emitter(l)};return t._emitter.addText(e),t}function x(e,n){n=n||l.languages||Object.keys(t);let r=b(e),i=n.filter(M).filter(P).map(t=>v(t,e,!1));i.unshift(r);let[a,o]=i.sort((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(M(e.language).supersetOf===t.language)return 1;if(M(t.language).supersetOf===e.language)return-1}return 0}),s=a;return s.secondBest=o,s}function S(e,t,n){let r=t&&i[t]||n;e.classList.add(`hljs`),e.classList.add(`language-${r}`)}function C(e){let t=null,n=d(e);if(u(n))return;if(R(`before:highlightElement`,{el:e,language:n}),e.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e);return}if(e.children.length>0&&(l.ignoreUnescapedHTML||(console.warn(`One of your code blocks includes unescaped HTML. This is a potentially serious security risk.`),console.warn(`https://github.com/highlightjs/highlight.js/wiki/security`),console.warn(`The element with unescaped HTML:`),console.warn(e)),l.throwUnescapedHTML))throw new ve(`One of your code blocks includes unescaped HTML.`,e.innerHTML);t=e;let r=t.textContent,i=n?p(r,{language:n,ignoreIllegals:!0}):x(r);e.innerHTML=i.value,e.dataset.highlighted=`yes`,S(e,n,i.language),e.result={language:i.language,re:i.relevance,relevance:i.relevance},i.secondBest&&(e.secondBest={language:i.secondBest.language,relevance:i.secondBest.relevance}),R(`after:highlightElement`,{el:e,result:i,text:r})}function w(e){l=X(l,e)}let T=()=>{O(),G(`10.6.0`,`initHighlighting() deprecated. Use highlightAll() now.`)};function E(){O(),G(`10.6.0`,`initHighlightingOnLoad() deprecated. Use highlightAll() now.`)}let D=!1;function O(){function e(){O()}if(document.readyState===`loading`){D||window.addEventListener(`DOMContentLoaded`,e,!1),D=!0;return}document.querySelectorAll(l.cssSelector).forEach(C)}function k(n,r){let i=null;try{i=r(e)}catch(e){if(U(`Language definition for '{}' could not be registered.`.replace(`{}`,n)),o)U(e);else throw e;i=c}i.name||(i.name=n),t[n]=i,i.rawDefinition=r.bind(null,e),i.aliases&&N(i.aliases,{languageName:n})}function A(e){delete t[e];for(let t of Object.keys(i))i[t]===e&&delete i[t]}function j(){return Object.keys(t)}function M(e){return e=(e||``).toLowerCase(),t[e]||t[i[e]]}function N(e,{languageName:t}){typeof e==`string`&&(e=[e]),e.forEach(e=>{i[e.toLowerCase()]=t})}function P(e){let t=M(e);return t&&!t.disableAutodetect}function F(e){e[`before:highlightBlock`]&&!e[`before:highlightElement`]&&(e[`before:highlightElement`]=t=>{e[`before:highlightBlock`](Object.assign({block:t.el},t))}),e[`after:highlightBlock`]&&!e[`after:highlightElement`]&&(e[`after:highlightElement`]=t=>{e[`after:highlightBlock`](Object.assign({block:t.el},t))})}function I(e){F(e),a.push(e)}function L(e){let t=a.indexOf(e);t!==-1&&a.splice(t,1)}function R(e,t){let n=e;a.forEach(function(e){e[n]&&e[n](t)})}function B(e){return G(`10.7.0`,`highlightBlock will be removed entirely in v12.0`),G(`10.7.0`,`Please use highlightElement now.`),C(e)}Object.assign(e,{highlight:p,highlightAuto:x,highlightAll:O,highlightElement:C,highlightBlock:B,configure:w,initHighlighting:T,initHighlightingOnLoad:E,registerLanguage:k,unregisterLanguage:A,listLanguages:j,getLanguage:M,registerAliases:N,autoDetection:P,inherit:X,addPlugin:I,removePlugin:L}),e.debugMode=function(){o=!1},e.safeMode=function(){o=!0},e.versionString=_e,e.regex={concat:_,lookahead:m,either:y,optional:g,anyNumberOfTimes:h};for(let e in z)typeof z[e]==`object`&&n(z[e]);return Object.assign(e,z),e},$=Q({});$.newInstance=()=>Q({}),t.exports=$,$.HighlightJS=$,$.default=$}))()).default;export{n as default};