@arborium/arborium 2.12.4 → 2.13.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.
- package/README.md +1 -1
- package/dist/arborium.d.ts +1 -1
- package/dist/arborium.iife.js +1 -1
- package/dist/arborium.iife.js.map +1 -1
- package/dist/arborium.js +198 -157
- package/dist/arborium.js.map +1 -1
- package/dist/arborium_host.js +9 -9
- package/dist/arborium_host_bg.wasm +0 -0
- package/dist/loader.d.ts +17 -0
- package/dist/plugins-manifest.d.ts +1 -1
- package/package.json +1 -1
package/dist/arborium.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _ = [
|
|
2
2
|
[/^#!.*\bpython[23]?\b/, "python"],
|
|
3
3
|
[/^#!.*\bnode\b/, "javascript"],
|
|
4
4
|
[/^#!.*\bdeno\b/, "typescript"],
|
|
@@ -11,7 +11,7 @@ const L = [
|
|
|
11
11
|
[/^#!.*\bsh\b/, "bash"],
|
|
12
12
|
[/^#!.*\blua\b/, "lua"],
|
|
13
13
|
[/^#!.*\bawk\b/, "awk"]
|
|
14
|
-
],
|
|
14
|
+
], L = [
|
|
15
15
|
// Rust - distinctive keywords
|
|
16
16
|
[/\b(fn|impl|trait|pub\s+fn|let\s+mut|&mut|->)\b/, "rust"],
|
|
17
17
|
// Go - distinctive keywords
|
|
@@ -71,23 +71,23 @@ const L = [
|
|
|
71
71
|
// Zig
|
|
72
72
|
[/\b(pub\s+fn|const\s+\w+\s*=|@import\(|comptime)\b/, "zig"]
|
|
73
73
|
];
|
|
74
|
-
function
|
|
74
|
+
function R(e) {
|
|
75
75
|
const t = e.split(`
|
|
76
76
|
`)[0];
|
|
77
|
-
for (const [
|
|
78
|
-
if (
|
|
79
|
-
return
|
|
80
|
-
for (const [
|
|
81
|
-
if (
|
|
82
|
-
return
|
|
77
|
+
for (const [r, n] of _)
|
|
78
|
+
if (r.test(t))
|
|
79
|
+
return n;
|
|
80
|
+
for (const [r, n] of L)
|
|
81
|
+
if (r.test(e))
|
|
82
|
+
return n;
|
|
83
83
|
return null;
|
|
84
84
|
}
|
|
85
|
-
function
|
|
85
|
+
function H(e) {
|
|
86
86
|
const t = e.match(/\blanguage-(\w+)\b/);
|
|
87
87
|
if (t) return t[1];
|
|
88
|
-
const
|
|
89
|
-
if (
|
|
90
|
-
const
|
|
88
|
+
const r = e.match(/\blang-(\w+)\b/);
|
|
89
|
+
if (r) return r[1];
|
|
90
|
+
const n = /* @__PURE__ */ new Set([
|
|
91
91
|
"rust",
|
|
92
92
|
"javascript",
|
|
93
93
|
"typescript",
|
|
@@ -123,12 +123,12 @@ function R(e) {
|
|
|
123
123
|
"console",
|
|
124
124
|
"sh"
|
|
125
125
|
]);
|
|
126
|
-
for (const
|
|
127
|
-
if (
|
|
128
|
-
return
|
|
126
|
+
for (const a of e.split(/\s+/))
|
|
127
|
+
if (n.has(a.toLowerCase()))
|
|
128
|
+
return a.toLowerCase();
|
|
129
129
|
return null;
|
|
130
130
|
}
|
|
131
|
-
function
|
|
131
|
+
function F(e) {
|
|
132
132
|
const t = {
|
|
133
133
|
js: "javascript",
|
|
134
134
|
ts: "typescript",
|
|
@@ -149,10 +149,10 @@ function H(e) {
|
|
|
149
149
|
plaintext: "text",
|
|
150
150
|
plain: "text",
|
|
151
151
|
txt: "text"
|
|
152
|
-
},
|
|
153
|
-
return t[
|
|
152
|
+
}, r = e.toLowerCase();
|
|
153
|
+
return t[r] || r;
|
|
154
154
|
}
|
|
155
|
-
const
|
|
155
|
+
const $ = "2.13.0", U = [
|
|
156
156
|
"ada",
|
|
157
157
|
"agda",
|
|
158
158
|
"asciidoc",
|
|
@@ -255,7 +255,7 @@ const _ = "2.12.4", U = [
|
|
|
255
255
|
"yuri",
|
|
256
256
|
"zig",
|
|
257
257
|
"zsh"
|
|
258
|
-
],
|
|
258
|
+
], z = [
|
|
259
259
|
{
|
|
260
260
|
name: "attribute",
|
|
261
261
|
tag: "at"
|
|
@@ -589,7 +589,7 @@ const _ = "2.12.4", U = [
|
|
|
589
589
|
tag: "cb"
|
|
590
590
|
}
|
|
591
591
|
];
|
|
592
|
-
function
|
|
592
|
+
function P(e) {
|
|
593
593
|
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
594
594
|
}
|
|
595
595
|
const T = {
|
|
@@ -597,7 +597,7 @@ const T = {
|
|
|
597
597
|
theme: "one-dark",
|
|
598
598
|
selector: "pre code",
|
|
599
599
|
cdn: "jsdelivr",
|
|
600
|
-
version:
|
|
600
|
+
version: $,
|
|
601
601
|
// Precise version from manifest
|
|
602
602
|
pluginsUrl: "",
|
|
603
603
|
// Empty means use bundled manifest
|
|
@@ -610,222 +610,263 @@ const T = {
|
|
|
610
610
|
),
|
|
611
611
|
resolveWasm: ({ baseUrl: e, path: t }) => fetch(`${e}/${t}`)
|
|
612
612
|
};
|
|
613
|
-
let
|
|
614
|
-
const
|
|
615
|
-
let
|
|
616
|
-
async function
|
|
613
|
+
let m = null, d = null, f = { ...T };
|
|
614
|
+
const h = /* @__PURE__ */ new Map(), k = /* @__PURE__ */ new Map(), p = new Set(U);
|
|
615
|
+
let c = null, b = null;
|
|
616
|
+
async function j(e) {
|
|
617
617
|
if (e.pluginsUrl)
|
|
618
|
-
return
|
|
618
|
+
return b || (b = (async () => {
|
|
619
619
|
e.logger.debug(`[arborium] Loading local plugins manifest from: ${e.pluginsUrl}`);
|
|
620
620
|
const t = await fetch(e.pluginsUrl);
|
|
621
621
|
if (!t.ok)
|
|
622
622
|
throw new Error(`Failed to load plugins.json: ${t.status}`);
|
|
623
|
-
|
|
624
|
-
})(),
|
|
623
|
+
c = await t.json(), e.logger.debug(`[arborium] Loaded local manifest with ${c?.entries.length} entries`);
|
|
624
|
+
})(), b);
|
|
625
625
|
}
|
|
626
|
-
function
|
|
627
|
-
if (
|
|
628
|
-
const s =
|
|
626
|
+
function E(e, t) {
|
|
627
|
+
if (c) {
|
|
628
|
+
const s = c.entries.find((l) => l.language === e);
|
|
629
629
|
if (s)
|
|
630
630
|
return s.local_js.substring(0, s.local_js.lastIndexOf("/"));
|
|
631
631
|
}
|
|
632
|
-
const
|
|
633
|
-
let
|
|
634
|
-
return
|
|
632
|
+
const r = t.cdn, n = t.version;
|
|
633
|
+
let a;
|
|
634
|
+
return r === "jsdelivr" ? a = "https://cdn.jsdelivr.net/npm" : r === "unpkg" ? a = "https://unpkg.com" : a = r, `${a}/@arborium/${e}@${n}`;
|
|
635
635
|
}
|
|
636
|
-
async function
|
|
637
|
-
const a = y.get(e);
|
|
638
|
-
if (a)
|
|
639
|
-
return t.logger.debug(`[arborium] Grammar '${e}' found in cache`), a;
|
|
636
|
+
async function x(e, t) {
|
|
640
637
|
const r = h.get(e);
|
|
641
638
|
if (r)
|
|
642
|
-
return t.logger.debug(`[arborium] Grammar '${e}'
|
|
643
|
-
const n =
|
|
644
|
-
|
|
639
|
+
return t.logger.debug(`[arborium] Grammar '${e}' found in cache`), r;
|
|
640
|
+
const n = k.get(e);
|
|
641
|
+
if (n)
|
|
642
|
+
return t.logger.debug(`[arborium] Grammar '${e}' already loading, waiting...`), n;
|
|
643
|
+
const a = I(e, t);
|
|
644
|
+
k.set(e, a);
|
|
645
645
|
try {
|
|
646
|
-
return await
|
|
646
|
+
return await a;
|
|
647
647
|
} finally {
|
|
648
|
-
|
|
648
|
+
k.delete(e);
|
|
649
649
|
}
|
|
650
650
|
}
|
|
651
|
-
async function
|
|
652
|
-
if (await
|
|
651
|
+
async function I(e, t) {
|
|
652
|
+
if (await j(t), !p.has(e) && !c?.entries.some((r) => r.language === e))
|
|
653
653
|
return t.logger.debug(`[arborium] Grammar '${e}' not available`), null;
|
|
654
654
|
try {
|
|
655
|
-
const
|
|
656
|
-
t.logger.debug(`[arborium] Loading grammar '${e}'${
|
|
657
|
-
const
|
|
655
|
+
const r = E(e, t), n = t.resolveJs === T.resolveJs ? ` from ${r}/grammar.js` : "";
|
|
656
|
+
t.logger.debug(`[arborium] Loading grammar '${e}'${n}`);
|
|
657
|
+
const a = await t.resolveJs({
|
|
658
658
|
language: e,
|
|
659
|
-
baseUrl:
|
|
659
|
+
baseUrl: r,
|
|
660
660
|
path: "grammar.js"
|
|
661
|
-
}), s = await t.resolveWasm({ language: e, baseUrl:
|
|
662
|
-
await
|
|
663
|
-
const
|
|
664
|
-
|
|
665
|
-
const
|
|
661
|
+
}), s = await t.resolveWasm({ language: e, baseUrl: r, path: "grammar_bg.wasm" });
|
|
662
|
+
await a.default({ module_or_path: s });
|
|
663
|
+
const l = a.language_id();
|
|
664
|
+
l !== e && t.logger.warn(`[arborium] Language ID mismatch: expected '${e}', got '${l}'`);
|
|
665
|
+
const w = a.injection_languages(), y = {
|
|
666
666
|
languageId: e,
|
|
667
|
-
injectionLanguages:
|
|
668
|
-
module:
|
|
667
|
+
injectionLanguages: w,
|
|
668
|
+
module: a,
|
|
669
669
|
// UTF-8 parsing for Rust host
|
|
670
|
-
parseUtf8: (
|
|
671
|
-
const
|
|
670
|
+
parseUtf8: (g) => {
|
|
671
|
+
const i = a.create_session();
|
|
672
672
|
try {
|
|
673
|
-
|
|
674
|
-
const
|
|
673
|
+
a.set_text(i, g);
|
|
674
|
+
const o = a.parse(i);
|
|
675
675
|
return {
|
|
676
|
-
spans:
|
|
677
|
-
injections:
|
|
676
|
+
spans: o.spans || [],
|
|
677
|
+
injections: o.injections || []
|
|
678
678
|
};
|
|
679
|
-
} catch (
|
|
680
|
-
return t.logger.error("[arborium] Parse error:",
|
|
679
|
+
} catch (o) {
|
|
680
|
+
return t.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
|
|
681
681
|
} finally {
|
|
682
|
-
|
|
682
|
+
a.free_session(i);
|
|
683
683
|
}
|
|
684
684
|
},
|
|
685
685
|
// UTF-16 parsing for JavaScript public API
|
|
686
|
-
parseUtf16: (
|
|
687
|
-
const
|
|
686
|
+
parseUtf16: (g) => {
|
|
687
|
+
const i = a.create_session();
|
|
688
688
|
try {
|
|
689
|
-
|
|
690
|
-
const
|
|
689
|
+
a.set_text(i, g);
|
|
690
|
+
const o = a.parse_utf16(i);
|
|
691
691
|
return {
|
|
692
|
-
spans:
|
|
693
|
-
injections:
|
|
692
|
+
spans: o.spans || [],
|
|
693
|
+
injections: o.injections || []
|
|
694
694
|
};
|
|
695
|
-
} catch (
|
|
696
|
-
return t.logger.error("[arborium] Parse error:",
|
|
695
|
+
} catch (o) {
|
|
696
|
+
return t.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
|
|
697
697
|
} finally {
|
|
698
|
-
|
|
698
|
+
a.free_session(i);
|
|
699
699
|
}
|
|
700
700
|
}
|
|
701
701
|
};
|
|
702
|
-
return
|
|
703
|
-
} catch (
|
|
704
|
-
return t.logger.error(`[arborium] Failed to load grammar '${e}':`,
|
|
702
|
+
return h.set(e, y), t.logger.debug(`[arborium] Grammar '${e}' loaded successfully`), y;
|
|
703
|
+
} catch (r) {
|
|
704
|
+
return t.logger.error(`[arborium] Failed to load grammar '${e}':`, r), null;
|
|
705
705
|
}
|
|
706
706
|
}
|
|
707
|
-
const
|
|
708
|
-
let
|
|
709
|
-
function
|
|
710
|
-
|
|
707
|
+
const v = /* @__PURE__ */ new Map();
|
|
708
|
+
let q = 1;
|
|
709
|
+
function C(e) {
|
|
710
|
+
globalThis.arboriumHost = {
|
|
711
711
|
/** Check if a language is available (sync) */
|
|
712
712
|
isLanguageAvailable(t) {
|
|
713
|
-
return
|
|
713
|
+
return p.has(t) || h.has(t);
|
|
714
714
|
},
|
|
715
715
|
/** Load a grammar and return a handle (async) */
|
|
716
716
|
async loadGrammar(t) {
|
|
717
|
-
const
|
|
718
|
-
if (!
|
|
719
|
-
for (const [
|
|
720
|
-
if (s ===
|
|
721
|
-
const
|
|
722
|
-
return
|
|
717
|
+
const r = await x(t, e);
|
|
718
|
+
if (!r) return 0;
|
|
719
|
+
for (const [a, s] of v)
|
|
720
|
+
if (s === r) return a;
|
|
721
|
+
const n = q++;
|
|
722
|
+
return v.set(n, r), n;
|
|
723
723
|
},
|
|
724
724
|
/** Parse text using a grammar handle (sync) - returns UTF-8 offsets for Rust host */
|
|
725
|
-
parse(t,
|
|
726
|
-
const
|
|
727
|
-
return
|
|
725
|
+
parse(t, r) {
|
|
726
|
+
const n = v.get(t);
|
|
727
|
+
return n ? n.parseUtf8(r) : { spans: [], injections: [] };
|
|
728
728
|
}
|
|
729
729
|
};
|
|
730
730
|
}
|
|
731
|
-
function
|
|
731
|
+
function G(e) {
|
|
732
732
|
if (e.hostUrl)
|
|
733
733
|
return e.hostUrl;
|
|
734
|
-
const t = e.cdn,
|
|
735
|
-
let
|
|
736
|
-
t === "jsdelivr" ?
|
|
737
|
-
const
|
|
738
|
-
return `${
|
|
734
|
+
const t = e.cdn, r = e.version;
|
|
735
|
+
let n;
|
|
736
|
+
t === "jsdelivr" ? n = "https://cdn.jsdelivr.net/npm" : t === "unpkg" ? n = "https://unpkg.com" : n = t;
|
|
737
|
+
const a = r === "latest" ? "" : `@${r}`;
|
|
738
|
+
return `${n}/@arborium/arborium${a}/dist`;
|
|
739
739
|
}
|
|
740
|
-
async function
|
|
741
|
-
return
|
|
742
|
-
|
|
743
|
-
const t =
|
|
744
|
-
e.logger.debug(`[arborium] Loading host from ${
|
|
740
|
+
async function S(e) {
|
|
741
|
+
return m || d || (d = (async () => {
|
|
742
|
+
C(e);
|
|
743
|
+
const t = G(e), r = `${t}/arborium_host.js`, n = `${t}/arborium_host_bg.wasm`;
|
|
744
|
+
e.logger.debug(`[arborium] Loading host from ${r}`);
|
|
745
745
|
try {
|
|
746
|
-
const
|
|
746
|
+
const a = await import(
|
|
747
747
|
/* @vite-ignore */
|
|
748
|
-
|
|
748
|
+
r
|
|
749
749
|
);
|
|
750
|
-
return await
|
|
751
|
-
highlight:
|
|
752
|
-
isLanguageAvailable:
|
|
753
|
-
}, e.logger.debug("[arborium] Host loaded successfully"),
|
|
754
|
-
} catch (
|
|
755
|
-
return e.logger.error("[arborium] Failed to load host:",
|
|
750
|
+
return await a.default(n), m = {
|
|
751
|
+
highlight: a.highlight,
|
|
752
|
+
isLanguageAvailable: a.isLanguageAvailable
|
|
753
|
+
}, e.logger.debug("[arborium] Host loaded successfully"), m;
|
|
754
|
+
} catch (a) {
|
|
755
|
+
return e.logger.error("[arborium] Failed to load host:", a), null;
|
|
756
756
|
}
|
|
757
|
-
})(),
|
|
757
|
+
})(), d);
|
|
758
758
|
}
|
|
759
|
-
async function
|
|
760
|
-
const
|
|
761
|
-
if (
|
|
759
|
+
async function A(e, t, r) {
|
|
760
|
+
const n = u(r), a = await S(n);
|
|
761
|
+
if (a)
|
|
762
762
|
try {
|
|
763
|
-
return
|
|
763
|
+
return a.highlight(e, t);
|
|
764
764
|
} catch (s) {
|
|
765
|
-
|
|
765
|
+
n.logger.error("[arborium] Host highlight failed:", s);
|
|
766
766
|
}
|
|
767
|
-
return
|
|
767
|
+
return P(t);
|
|
768
768
|
}
|
|
769
|
-
async function
|
|
770
|
-
const
|
|
771
|
-
if (!
|
|
772
|
-
const { module:
|
|
769
|
+
async function M(e, t) {
|
|
770
|
+
const r = u(t), n = await x(e, r);
|
|
771
|
+
if (!n) return null;
|
|
772
|
+
const { module: a } = n;
|
|
773
773
|
return {
|
|
774
|
-
languageId: () =>
|
|
775
|
-
injectionLanguages: () =>
|
|
776
|
-
highlight: async (s) =>
|
|
774
|
+
languageId: () => n.languageId,
|
|
775
|
+
injectionLanguages: () => n.injectionLanguages,
|
|
776
|
+
highlight: async (s) => A(e, s, t),
|
|
777
777
|
// Public API returns UTF-16 offsets for JavaScript compatibility
|
|
778
|
-
parse: (s) =>
|
|
778
|
+
parse: (s) => n.parseUtf16(s),
|
|
779
779
|
createSession: () => {
|
|
780
|
-
const s =
|
|
780
|
+
const s = a.create_session();
|
|
781
781
|
return {
|
|
782
|
-
setText: (
|
|
782
|
+
setText: (l) => a.set_text(s, l),
|
|
783
783
|
// Session.parse() returns UTF-16 offsets for JavaScript compatibility
|
|
784
784
|
parse: () => {
|
|
785
785
|
try {
|
|
786
|
-
const
|
|
786
|
+
const l = a.parse_utf16(s);
|
|
787
787
|
return {
|
|
788
|
-
spans:
|
|
789
|
-
injections:
|
|
788
|
+
spans: l.spans || [],
|
|
789
|
+
injections: l.injections || []
|
|
790
790
|
};
|
|
791
|
-
} catch (
|
|
792
|
-
return
|
|
791
|
+
} catch (l) {
|
|
792
|
+
return r.logger.error("[arborium] Session parse error:", l), { spans: [], injections: [] };
|
|
793
793
|
}
|
|
794
794
|
},
|
|
795
|
-
cancel: () =>
|
|
796
|
-
free: () =>
|
|
795
|
+
cancel: () => a.cancel(s),
|
|
796
|
+
free: () => a.free_session(s)
|
|
797
797
|
};
|
|
798
798
|
},
|
|
799
799
|
dispose: () => {
|
|
800
800
|
}
|
|
801
801
|
};
|
|
802
802
|
}
|
|
803
|
-
function
|
|
804
|
-
|
|
803
|
+
async function N(e, t, r) {
|
|
804
|
+
const n = u(r), a = e;
|
|
805
|
+
await a.default({ module_or_path: t });
|
|
806
|
+
const s = a.language_id(), l = a.injection_languages(), w = {
|
|
807
|
+
languageId: s,
|
|
808
|
+
injectionLanguages: l,
|
|
809
|
+
module: a,
|
|
810
|
+
parseUtf8: (g) => {
|
|
811
|
+
const i = a.create_session();
|
|
812
|
+
try {
|
|
813
|
+
a.set_text(i, g);
|
|
814
|
+
const o = a.parse(i);
|
|
815
|
+
return {
|
|
816
|
+
spans: o.spans || [],
|
|
817
|
+
injections: o.injections || []
|
|
818
|
+
};
|
|
819
|
+
} catch (o) {
|
|
820
|
+
return n.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
|
|
821
|
+
} finally {
|
|
822
|
+
a.free_session(i);
|
|
823
|
+
}
|
|
824
|
+
},
|
|
825
|
+
parseUtf16: (g) => {
|
|
826
|
+
const i = a.create_session();
|
|
827
|
+
try {
|
|
828
|
+
a.set_text(i, g);
|
|
829
|
+
const o = a.parse_utf16(i);
|
|
830
|
+
return {
|
|
831
|
+
spans: o.spans || [],
|
|
832
|
+
injections: o.injections || []
|
|
833
|
+
};
|
|
834
|
+
} catch (o) {
|
|
835
|
+
return n.logger.error("[arborium] Parse error:", o), { spans: [], injections: [] };
|
|
836
|
+
} finally {
|
|
837
|
+
a.free_session(i);
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
};
|
|
841
|
+
return h.set(s, w), p.add(s), n.logger.debug(`[arborium] Grammar '${s}' registered`), await M(s, r);
|
|
842
|
+
}
|
|
843
|
+
function u(e) {
|
|
844
|
+
return e ? { ...f, ...e } : { ...f };
|
|
805
845
|
}
|
|
806
|
-
function
|
|
807
|
-
|
|
846
|
+
function O(e) {
|
|
847
|
+
f = { ...f, ...e };
|
|
808
848
|
}
|
|
809
|
-
async function
|
|
810
|
-
const
|
|
811
|
-
return await
|
|
849
|
+
async function B(e, t) {
|
|
850
|
+
const r = u(t);
|
|
851
|
+
return await j(r), p.has(e) || (c?.entries.some((n) => n.language === e) ?? !1);
|
|
812
852
|
}
|
|
813
|
-
async function
|
|
814
|
-
const t =
|
|
815
|
-
return await
|
|
853
|
+
async function J(e) {
|
|
854
|
+
const t = u(e);
|
|
855
|
+
return await j(t), c ? c.entries.map((r) => r.language) : Array.from(p);
|
|
816
856
|
}
|
|
817
857
|
export {
|
|
818
858
|
U as availableLanguages,
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
N as
|
|
859
|
+
R as detectLanguage,
|
|
860
|
+
H as extractLanguageFromClass,
|
|
861
|
+
J as getAvailableLanguages,
|
|
862
|
+
u as getConfig,
|
|
863
|
+
A as highlight,
|
|
864
|
+
z as highlights,
|
|
865
|
+
B as isLanguageAvailable,
|
|
866
|
+
M as loadGrammar,
|
|
867
|
+
F as normalizeLanguage,
|
|
868
|
+
$ as pluginVersion,
|
|
869
|
+
N as registerGrammar,
|
|
870
|
+
O as setConfig
|
|
830
871
|
};
|
|
831
872
|
//# sourceMappingURL=arborium.js.map
|