@inkbar/core 0.5.0 → 0.6.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.
@@ -96,6 +96,15 @@ function quadFromRect(r) {
96
96
  }
97
97
  };
98
98
  }
99
+ /** One quad covering `r`, in the corner order of `quadFromRect`. */
100
+ function quadsFromRect(r) {
101
+ return [quadFromRect(r)];
102
+ }
103
+ /** The bounding box of every corner of `quads`. */
104
+ function rectFromQuads(quads) {
105
+ if (quads.length === 0) throw new RangeError("rectFromQuads needs at least one quad");
106
+ return unionRects(quads.map(rectFromQuad));
107
+ }
99
108
  function unionRects(rects) {
100
109
  if (rects.length === 0) throw new RangeError("unionRects needs at least one rect");
101
110
  let x1 = Infinity;
@@ -251,6 +260,102 @@ function readonly(w) {
251
260
  };
252
261
  }
253
262
  //#endregion
263
+ //#region src/model/records.ts
264
+ /**
265
+ * A keyed list of plain records. Records are stored as frozen copies, so a change's `before` and `after` can be
266
+ * kept as history entries without copying.
267
+ */
268
+ function createRecordStore(key, opts = {}) {
269
+ const list = writable((opts.initial ?? []).map(frozen));
270
+ const emitter = new Emitter();
271
+ let destroyed = false;
272
+ function commit(next, change) {
273
+ if (destroyed) return;
274
+ list.set(next);
275
+ emitter.emit("change", change);
276
+ opts.onChange?.(next, change);
277
+ }
278
+ return {
279
+ key,
280
+ list: readonly(list),
281
+ get: (id) => list.get().find((r) => r.id === id),
282
+ add(record) {
283
+ if (list.get().some((r) => r.id === record.id)) throw new InkError("DuplicateId", `A record with id ${record.id} already exists`, {
284
+ key,
285
+ id: record.id
286
+ });
287
+ const stored = frozen(record);
288
+ commit([...list.get(), stored], {
289
+ kind: "add",
290
+ record: stored
291
+ });
292
+ return stored;
293
+ },
294
+ update(id, patch) {
295
+ const before = list.get().find((r) => r.id === id);
296
+ if (destroyed || !before) return void 0;
297
+ const after = Object.freeze({
298
+ ...before,
299
+ ...patch,
300
+ id: before.id
301
+ });
302
+ commit(list.get().map((r) => r.id === id ? after : r), {
303
+ kind: "update",
304
+ id,
305
+ before,
306
+ after
307
+ });
308
+ return after;
309
+ },
310
+ remove(id) {
311
+ const record = list.get().find((r) => r.id === id);
312
+ if (destroyed || !record) return void 0;
313
+ commit(list.get().filter((r) => r.id !== id), {
314
+ kind: "remove",
315
+ record
316
+ });
317
+ return record;
318
+ },
319
+ replaceAll(incoming, reason) {
320
+ const prev = new Map(list.get().map((r) => [r.id, r]));
321
+ const added = [];
322
+ const updated = [];
323
+ const next = incoming.map((r) => {
324
+ const old = prev.get(r.id);
325
+ if (!old) {
326
+ added.push(r.id);
327
+ return frozen(r);
328
+ }
329
+ if (shallowEqual(old, r)) return old;
330
+ updated.push(r.id);
331
+ return frozen(r);
332
+ });
333
+ const kept = new Set(next.map((r) => r.id));
334
+ commit(next, {
335
+ kind: "replace",
336
+ reason,
337
+ added,
338
+ updated,
339
+ removed: [...prev.keys()].filter((id) => !kept.has(id))
340
+ });
341
+ },
342
+ on: (event, fn) => emitter.on(event, fn),
343
+ destroy() {
344
+ destroyed = true;
345
+ emitter.clear();
346
+ }
347
+ };
348
+ }
349
+ /** Freezes a copy, so the caller's object stays theirs; an already frozen record is kept. */
350
+ function frozen(record) {
351
+ return Object.isFrozen(record) ? record : Object.freeze({ ...record });
352
+ }
353
+ function shallowEqual(a, b) {
354
+ const ka = Object.keys(a);
355
+ const kb = Object.keys(b);
356
+ return ka.length === kb.length && ka.every((k) => Object.hasOwn(b, k) && a[k] === b[k]);
357
+ }
358
+ //#endregion
254
359
  //#region src/model/selection.ts
255
360
  const union = (a, b) => {
256
361
  const x = Math.min(a.x, b.x);
@@ -1792,6 +1897,7 @@ function isProduction() {
1792
1897
  }
1793
1898
  //#endregion
1794
1899
  //#region src/model/annotations/history.ts
1900
+ const noop = () => {};
1795
1901
  /**
1796
1902
  * Snapshot-based undo and redo over an uncontrolled store.
1797
1903
  *
@@ -1811,6 +1917,8 @@ function createHistory(store, opts = {}) {
1811
1917
  batch(fn) {
1812
1918
  fn();
1813
1919
  },
1920
+ track: () => noop,
1921
+ react: () => noop,
1814
1922
  destroy() {}
1815
1923
  };
1816
1924
  const limit = opts.limit ?? 200;
@@ -1818,14 +1926,84 @@ function createHistory(store, opts = {}) {
1818
1926
  const redoStack = [];
1819
1927
  let previous = store.list.get();
1820
1928
  let replaying = false;
1821
- /** Open batch depth; while above zero, changes update `previous` but push no entry. */
1929
+ /**
1930
+ * Open step depth (batches, and an edit while its reactions run); while above zero, changes
1931
+ * update the baselines but push no entry.
1932
+ */
1822
1933
  let depth = 0;
1823
- /** The list when the outermost batch opened (or was restarted by a replace). */
1824
- let batchStart = null;
1934
+ /** The lists when the outermost step opened (or were restarted by a replace). */
1935
+ let start = null;
1936
+ /** Each tracked store with its list as of the last change history saw. */
1937
+ const tracked = /* @__PURE__ */ new Map();
1938
+ const reactions = /* @__PURE__ */ new Set();
1825
1939
  const sync = () => {
1826
1940
  canUndo.set(undoStack.length > 0);
1827
1941
  canRedo.set(redoStack.length > 0);
1828
1942
  };
1943
+ const push = (entry) => {
1944
+ undoStack.push(entry);
1945
+ if (undoStack.length > limit) undoStack.shift();
1946
+ redoStack.length = 0;
1947
+ sync();
1948
+ };
1949
+ /**
1950
+ * Forgets `recordStore`'s records in every entry, so undo and redo leave it alone. An entry
1951
+ * left with nothing to replay (no annotation change, no other store) is dropped.
1952
+ */
1953
+ const dropEntries = (recordStore) => {
1954
+ for (const stack of [undoStack, redoStack]) {
1955
+ const kept = stack.filter((entry) => {
1956
+ if (!entry.records.delete(recordStore)) return true;
1957
+ const { before, after } = entry.annotations;
1958
+ return entry.records.size > 0 || !sameList(before, after);
1959
+ });
1960
+ stack.splice(0, stack.length, ...kept);
1961
+ }
1962
+ sync();
1963
+ };
1964
+ const resetStacks = () => {
1965
+ undoStack.length = 0;
1966
+ redoStack.length = 0;
1967
+ sync();
1968
+ };
1969
+ /** Opens the outermost step from `annotations` and every tracked store's baseline. */
1970
+ const open = (annotations) => {
1971
+ const records = /* @__PURE__ */ new Map();
1972
+ for (const [s, t] of tracked) records.set(s, t.previous);
1973
+ start = {
1974
+ annotations,
1975
+ records
1976
+ };
1977
+ };
1978
+ /**
1979
+ * Closes the outermost step: one entry for everything that changed since it opened. A step
1980
+ * whose lists end where they began (the same objects in the same order) records nothing.
1981
+ */
1982
+ const close = () => {
1983
+ const from = start;
1984
+ start = null;
1985
+ if (!from) return;
1986
+ const annotations = {
1987
+ before: from.annotations,
1988
+ after: store.list.get()
1989
+ };
1990
+ previous = annotations.after;
1991
+ const records = /* @__PURE__ */ new Map();
1992
+ for (const [s, t] of tracked) {
1993
+ const before = from.records.get(s) ?? t.previous;
1994
+ const after = s.list.get();
1995
+ t.previous = after;
1996
+ if (!sameList(before, after)) records.set(s, {
1997
+ before,
1998
+ after
1999
+ });
2000
+ }
2001
+ if (records.size === 0 && sameList(annotations.before, annotations.after)) return;
2002
+ push({
2003
+ annotations,
2004
+ records
2005
+ });
2006
+ };
1829
2007
  let destroyed = false;
1830
2008
  const unsubscribe = store.on("change", (change) => {
1831
2009
  const current = store.list.get();
@@ -1838,39 +2016,40 @@ function createHistory(store, opts = {}) {
1838
2016
  const f = change.fields.get(a.id);
1839
2017
  return f && withEmbeddedFields(a, f) || a;
1840
2018
  });
1841
- for (const entry of [...undoStack, ...redoStack]) {
1842
- entry.before = fill(entry.before);
1843
- entry.after = fill(entry.after);
2019
+ for (const { annotations } of [...undoStack, ...redoStack]) {
2020
+ annotations.before = fill(annotations.before);
2021
+ annotations.after = fill(annotations.after);
1844
2022
  }
1845
- if (batchStart) batchStart = fill(batchStart);
2023
+ if (start) start.annotations = fill(start.annotations);
1846
2024
  previous = current;
1847
2025
  return;
1848
2026
  }
1849
2027
  if (change.kind === "replace") {
1850
- undoStack.length = 0;
1851
- redoStack.length = 0;
1852
2028
  previous = current;
1853
- if (depth > 0) batchStart = current;
1854
- sync();
2029
+ if (depth > 0) open(current);
2030
+ resetStacks();
1855
2031
  return;
1856
2032
  }
1857
2033
  if (depth > 0) {
1858
2034
  previous = current;
2035
+ for (const fn of [...reactions]) fn(change);
1859
2036
  return;
1860
2037
  }
1861
- undoStack.push({
1862
- before: previous,
1863
- after: current
1864
- });
1865
- if (undoStack.length > limit) undoStack.shift();
1866
- redoStack.length = 0;
1867
- previous = current;
1868
- sync();
2038
+ open(previous);
2039
+ depth++;
2040
+ try {
2041
+ for (const fn of [...reactions]) fn(change);
2042
+ } finally {
2043
+ if (--depth === 0 && !destroyed) close();
2044
+ }
1869
2045
  });
1870
- const apply = (list) => {
2046
+ /** Replays a step's lists under the `replaying` guard, skipping stores no longer tracked. */
2047
+ const apply = (entry, side) => {
1871
2048
  replaying = true;
1872
2049
  try {
1873
- store.replaceAll([...list], "history");
2050
+ const { annotations } = entry;
2051
+ if (!sameList(annotations.before, annotations.after)) store.replaceAll([...annotations[side]], "history");
2052
+ for (const [s, snapshot] of entry.records) if (tracked.has(s)) s.replaceAll([...snapshot[side]], "history");
1874
2053
  } finally {
1875
2054
  replaying = false;
1876
2055
  }
@@ -1882,14 +2061,14 @@ function createHistory(store, opts = {}) {
1882
2061
  const entry = undoStack.pop();
1883
2062
  if (destroyed || !entry) return;
1884
2063
  redoStack.push(entry);
1885
- apply(entry.before);
2064
+ apply(entry, "before");
1886
2065
  sync();
1887
2066
  },
1888
2067
  redo() {
1889
2068
  const entry = redoStack.pop();
1890
2069
  if (destroyed || !entry) return;
1891
2070
  undoStack.push(entry);
1892
- apply(entry.after);
2071
+ apply(entry, "after");
1893
2072
  sync();
1894
2073
  },
1895
2074
  batch(fn) {
@@ -1897,45 +2076,78 @@ function createHistory(store, opts = {}) {
1897
2076
  fn();
1898
2077
  return;
1899
2078
  }
1900
- if (depth++ === 0) batchStart = store.list.get();
2079
+ if (depth++ === 0) open(store.list.get());
1901
2080
  try {
1902
2081
  const result = fn();
1903
2082
  if (result !== null && typeof result === "object" && typeof result.then === "function" && !isProduction()) console.warn("[inkbar] history.batch(fn): fn returned a promise. Changes after its first await are not part of the batch.");
1904
2083
  } finally {
1905
- if (--depth === 0 && !destroyed) {
1906
- const before = batchStart;
1907
- batchStart = null;
1908
- const after = store.list.get();
1909
- if (before && !sameAnnotations(before, after)) {
1910
- undoStack.push({
1911
- before,
1912
- after
1913
- });
1914
- if (undoStack.length > limit) undoStack.shift();
1915
- redoStack.length = 0;
1916
- sync();
1917
- }
1918
- }
2084
+ if (--depth === 0 && !destroyed) close();
1919
2085
  }
1920
2086
  },
2087
+ track(recordStore) {
2088
+ if (destroyed || tracked.has(recordStore)) return noop;
2089
+ const unsubscribeStore = recordStore.on("change", (change) => {
2090
+ const t = tracked.get(recordStore);
2091
+ if (!t) return;
2092
+ const before = t.previous;
2093
+ const current = recordStore.list.get();
2094
+ t.previous = current;
2095
+ if (replaying || change.kind === "replace" && change.reason === "history") return;
2096
+ if (change.kind === "replace") {
2097
+ if (depth > 0 && start) start.records.set(recordStore, current);
2098
+ dropEntries(recordStore);
2099
+ return;
2100
+ }
2101
+ if (depth > 0) return;
2102
+ push({
2103
+ annotations: {
2104
+ before: previous,
2105
+ after: previous
2106
+ },
2107
+ records: /* @__PURE__ */ new Map([[recordStore, {
2108
+ before,
2109
+ after: current
2110
+ }]])
2111
+ });
2112
+ });
2113
+ tracked.set(recordStore, {
2114
+ previous: recordStore.list.get(),
2115
+ unsubscribe: unsubscribeStore
2116
+ });
2117
+ if (start) start.records.set(recordStore, recordStore.list.get());
2118
+ return () => {
2119
+ if (tracked.get(recordStore)?.unsubscribe !== unsubscribeStore) return;
2120
+ unsubscribeStore();
2121
+ tracked.delete(recordStore);
2122
+ start?.records.delete(recordStore);
2123
+ };
2124
+ },
2125
+ react(fn) {
2126
+ if (destroyed) return noop;
2127
+ const run = (edit) => fn(edit);
2128
+ reactions.add(run);
2129
+ return () => {
2130
+ reactions.delete(run);
2131
+ };
2132
+ },
1921
2133
  destroy() {
1922
2134
  destroyed = true;
1923
- batchStart = null;
2135
+ start = null;
1924
2136
  unsubscribe();
1925
- undoStack.length = 0;
1926
- redoStack.length = 0;
1927
- sync();
2137
+ for (const t of tracked.values()) t.unsubscribe();
2138
+ tracked.clear();
2139
+ reactions.clear();
2140
+ resetStacks();
1928
2141
  },
1929
2142
  clear() {
1930
- undoStack.length = 0;
1931
- redoStack.length = 0;
1932
2143
  previous = store.list.get();
1933
- sync();
2144
+ for (const [s, t] of tracked) t.previous = s.list.get();
2145
+ resetStacks();
1934
2146
  }
1935
2147
  };
1936
2148
  }
1937
- /** The same annotation objects in the same order. */
1938
- function sameAnnotations(a, b) {
2149
+ /** The same objects in the same order. */
2150
+ function sameList(a, b) {
1939
2151
  return a === b || a.length === b.length && a.every((x, i) => x === b[i]);
1940
2152
  }
1941
2153
  //#endregion
@@ -2382,6 +2594,7 @@ function createAnnotationStore(opts) {
2382
2594
  console.warn(`[inkbar] ControlledMutationIgnored: the host did not apply a ${entry.change.kind} for annotation ${entry.id}. In controlled mode, pass the list from onChange back into the store.`);
2383
2595
  }
2384
2596
  function commit(next, change) {
2597
+ if (change.kind !== "replace") emitter.emit("edit", change);
2385
2598
  if (controlled) {
2386
2599
  if (change.kind !== "replace") {
2387
2600
  const key = changeKey(change);
@@ -2480,6 +2693,7 @@ function createAnnotationStore(opts) {
2480
2693
  after
2481
2694
  };
2482
2695
  if (controlled && before.source === "pdf") {
2696
+ emitter.emit("edit", change);
2483
2697
  list.set(swap(list.get()));
2484
2698
  if (proposed) proposed = next;
2485
2699
  emitter.emit("change", change);
@@ -2868,7 +3082,7 @@ async function openDocument(source, options) {
2868
3082
  if (!destroyed && patched.size > 0) store._patchEmbedded(patched);
2869
3083
  }).catch(() => void 0);
2870
3084
  }, () => void 0);
2871
- return {
3085
+ const doc = {
2872
3086
  key: resolved.key,
2873
3087
  status: readonly(status),
2874
3088
  ready,
@@ -2879,6 +3093,9 @@ async function openDocument(source, options) {
2879
3093
  if (!handles) throw statusError(status.get());
2880
3094
  return textContentFromPdfjs(page, await (await handles.getPage(page)).getTextContent());
2881
3095
  },
3096
+ async pageText(page) {
3097
+ return (await doc.text(page)).items.map((item) => item.str).join(" ");
3098
+ },
2882
3099
  annotations: store,
2883
3100
  embedded,
2884
3101
  history,
@@ -2908,6 +3125,7 @@ async function openDocument(source, options) {
2908
3125
  return handles;
2909
3126
  }
2910
3127
  };
3128
+ return doc;
2911
3129
  }
2912
3130
  const EMBEDDED_CONCURRENCY = 8;
2913
3131
  /** Runs `task(0..count-1)` with at most `limit` in flight; results come back in index order. */
@@ -4707,6 +4925,6 @@ function createSignatureLibrary(store) {
4707
4925
  };
4708
4926
  }
4709
4927
  //#endregion
4710
- export { importAnnotations as $, readonly as $t, styleGroupOf as A, RectSchema as At, isTextMarkup as B, withCalloutBounds as Bt, repliesTo as C, NoteIconSchema as Ct, STYLE_GROUPS as D, PolygonSchema as Dt, withoutReplies as E, PolySchema as Et, typesInGroup as F, TextMarkupSchema as Ft, resizedRect as G, isKnown as Gt, movedEndpoint as H, LINE_ENDINGS as Ht, hasCallout as I, FringeSchema as It, withBox as J, cssVariableDefaults as Jt, scaled as K, pdfNameSet as Kt, hasCornerHandles as L, calloutStroke as Lt, styleGroupsOf as M, ShapeSchema as Mt, supportedProps as N, SquareSchema as Nt, createToolStyle as O, PolylineSchema as Ot, toFields as P, StampSchema as Pt, exportAnnotations as Q, derived as Qt, hasRectGeometry as R, freeTextBox as Rt, isThreadRoot as S, MaskSchema as St, threadRoot as T, PointSchema as Tt, movedTip as U, NOTE_ICONS as Ut, keepsAspect as V, INTENTS as Vt, resizedBox as W, PDF_NAME$1 as Wt, createAnnotationStore as X, staticDefaults as Xt, openDocument as Y, normalizeColor as Yt, deriveRect as Z, mergeLineRects as Zt, defaultEnds as _, isInkError as _n, IMAGE_DATA_URL as _t, createLocalSignatureStore as a, pointsFromFlat as an, pdfColorToHex as at, isAbandonedNote as b, LineSchema as bt, normaliseInk as c, rectContainsPoint as cn, AnnotationSchema as ct, recogniseStroke as d, rectsIntersect as dn, FreeTextSchema as dt, writable as en, createHistory as et, DEFAULT_CORNER_RADIUS as f, translateQuad as fn, FreeTextStyleSchema as ft, constrain as g, InkError as gn, GLOSS_VERSION$1 as gt, SHAPE_KINDS as h, Emitter as hn, GLOSS_SCHEMA_ID as ht, createInkTemplate as i, multiplyMatrix as in, importedId as it, styleGroupOfType as j, RedactSchema as jt, fromAnnotation as k, QuadSchema as kt, placeSignature as l, rectFromPoints as ln, CircleSchema as lt, DEFAULT_SHAPE_SIZE as m, unionRects as mn, GLOSS_MEDIA_TYPE as mt, SIGNATURE_INK_WIDTH as n, approxEqual as nn, SUPPORTED_SUBTYPES as nt, createMemorySignatureStore as o, quadFromRect as on, summarise as ot, DEFAULT_SHAPE_OPTIONS as p, translateRect as pn, GLOSS_FORMAT$1 as pt, translated as q, parsePdfDate as qt, createImageTemplate as r, invertMatrix as rn, importEmbeddedPage as rt, createSignatureLibrary as s, quadsFromFlat as sn, AnnotationDocumentSchema as st, DEFAULT_SIGNATURE_WIDTH as t, applyMatrix as tn, isProduction as tt, RECOGNISE_THRESHOLD as u, rectFromQuad as un, ExportedAnnotationSchema as ut, isPointerOnlyKind as v, InkSchema as vt, threadOf as w, NoteSchema as wt, isReply as x, LoupeSchema as xt, shapeInput as y, LineEndingSchema as yt, isBubble as z, isStandardCallout as zt };
4928
+ export { importAnnotations as $, derived as $t, styleGroupOf as A, RectSchema as At, isTextMarkup as B, withCalloutBounds as Bt, repliesTo as C, NoteIconSchema as Ct, STYLE_GROUPS as D, PolygonSchema as Dt, withoutReplies as E, PolySchema as Et, typesInGroup as F, TextMarkupSchema as Ft, resizedRect as G, isKnown as Gt, movedEndpoint as H, LINE_ENDINGS as Ht, hasCallout as I, FringeSchema as It, withBox as J, cssVariableDefaults as Jt, scaled as K, pdfNameSet as Kt, hasCornerHandles as L, calloutStroke as Lt, styleGroupsOf as M, ShapeSchema as Mt, supportedProps as N, SquareSchema as Nt, createToolStyle as O, PolylineSchema as Ot, toFields as P, StampSchema as Pt, exportAnnotations as Q, createRecordStore as Qt, hasRectGeometry as R, freeTextBox as Rt, isThreadRoot as S, MaskSchema as St, threadRoot as T, PointSchema as Tt, movedTip as U, NOTE_ICONS as Ut, keepsAspect as V, INTENTS as Vt, resizedBox as W, PDF_NAME$1 as Wt, createAnnotationStore as X, staticDefaults as Xt, openDocument as Y, normalizeColor as Yt, deriveRect as Z, mergeLineRects as Zt, defaultEnds as _, unionRects as _n, IMAGE_DATA_URL as _t, createLocalSignatureStore as a, multiplyMatrix as an, pdfColorToHex as at, isAbandonedNote as b, isInkError as bn, LineSchema as bt, normaliseInk as c, quadsFromFlat as cn, AnnotationSchema as ct, recogniseStroke as d, rectFromPoints as dn, FreeTextSchema as dt, readonly as en, createHistory as et, DEFAULT_CORNER_RADIUS as f, rectFromQuad as fn, FreeTextStyleSchema as ft, constrain as g, translateRect as gn, GLOSS_VERSION$1 as gt, SHAPE_KINDS as h, translateQuad as hn, GLOSS_SCHEMA_ID as ht, createInkTemplate as i, invertMatrix as in, importedId as it, styleGroupOfType as j, RedactSchema as jt, fromAnnotation as k, QuadSchema as kt, placeSignature as l, quadsFromRect as ln, CircleSchema as lt, DEFAULT_SHAPE_SIZE as m, rectsIntersect as mn, GLOSS_MEDIA_TYPE as mt, SIGNATURE_INK_WIDTH as n, applyMatrix as nn, SUPPORTED_SUBTYPES as nt, createMemorySignatureStore as o, pointsFromFlat as on, summarise as ot, DEFAULT_SHAPE_OPTIONS as p, rectFromQuads as pn, GLOSS_FORMAT$1 as pt, translated as q, parsePdfDate as qt, createImageTemplate as r, approxEqual as rn, importEmbeddedPage as rt, createSignatureLibrary as s, quadFromRect as sn, AnnotationDocumentSchema as st, DEFAULT_SIGNATURE_WIDTH as t, writable as tn, isProduction as tt, RECOGNISE_THRESHOLD as u, rectContainsPoint as un, ExportedAnnotationSchema as ut, isPointerOnlyKind as v, Emitter as vn, InkSchema as vt, threadOf as w, NoteSchema as wt, isReply as x, LoupeSchema as xt, shapeInput as y, InkError as yn, LineEndingSchema as yt, isBubble as z, isStandardCallout as zt };
4711
4929
 
4712
- //# sourceMappingURL=signatures-CMapTKrC.mjs.map
4930
+ //# sourceMappingURL=signatures-D68fuLlt.mjs.map