@artblocks/abx-token-api 0.1.0-alpha.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/LICENSE +21 -0
- package/dist/abxjs.d.ts +13 -0
- package/dist/abxjs.d.ts.map +1 -0
- package/dist/abxjs.js +49 -0
- package/dist/abxjs.js.map +1 -0
- package/dist/art.d.ts +26 -0
- package/dist/art.d.ts.map +1 -0
- package/dist/art.js +85 -0
- package/dist/art.js.map +1 -0
- package/dist/code.d.ts +73 -0
- package/dist/code.d.ts.map +1 -0
- package/dist/code.js +216 -0
- package/dist/code.js.map +1 -0
- package/dist/dashboard.d.ts +12 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +231 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/deps.d.ts +146 -0
- package/dist/deps.d.ts.map +1 -0
- package/dist/deps.js +297 -0
- package/dist/deps.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/inline.d.ts +19 -0
- package/dist/inline.d.ts.map +1 -0
- package/dist/inline.js +23 -0
- package/dist/inline.js.map +1 -0
- package/dist/metadata.d.ts +89 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +673 -0
- package/dist/metadata.js.map +1 -0
- package/dist/resolve.d.ts +74 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +107 -0
- package/dist/resolve.js.map +1 -0
- package/dist/server.d.ts +91 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +940 -0
- package/dist/server.js.map +1 -0
- package/dist/watcher.d.ts +56 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +179 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
const EXPLORER = 'https://sepolia.etherscan.io';
|
|
2
|
+
/** Wrap page content in the shared, dependency-free HTML shell. */
|
|
3
|
+
function page(title, baseUrl, body) {
|
|
4
|
+
return `<!doctype html>
|
|
5
|
+
<html lang="en"><head>
|
|
6
|
+
<meta charset="utf-8"/>
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
8
|
+
<title>${esc(title)}</title>
|
|
9
|
+
<style>${CSS}</style>
|
|
10
|
+
</head><body>
|
|
11
|
+
<header class="bar">
|
|
12
|
+
<div class="brand"><span class="dot"></span> ABX <em>Self-Host Toolkit</em></div>
|
|
13
|
+
<div class="node">node: <code>${esc(baseUrl)}</code></div>
|
|
14
|
+
</header>
|
|
15
|
+
<main>${body}</main>
|
|
16
|
+
<footer>
|
|
17
|
+
<p>The exit isn't a promise — it's this. <a href="/api/projects">/api/projects</a> · reference implementation, intentionally plain, fully forkable.</p>
|
|
18
|
+
</footer>
|
|
19
|
+
</body></html>`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The per-contract dashboard, served at `/d/<chainId>/<address>`. **Read-only by design**: it
|
|
23
|
+
* renders reconstructed state but takes NO actions. Re-indexing and verification are mutating /
|
|
24
|
+
* load-bearing operations gated behind the admin token (from the CLI: `abx index <addr> --remote`),
|
|
25
|
+
* never public buttons — a public host should never let a stranger trigger a full chain replay.
|
|
26
|
+
*/
|
|
27
|
+
export function renderDashboard(project, baseUrl, chainId) {
|
|
28
|
+
return page(`${project.name ?? project.address} · ABX`, baseUrl, `
|
|
29
|
+
<section class="intro">
|
|
30
|
+
<div class="kicker">Layer 3 · the credible exit, running</div>
|
|
31
|
+
<h1>${esc(project.name ?? 'Your project')}, served from chain alone.</h1>
|
|
32
|
+
<p>This node indexed this ABX contract on chain ${chainId}, rebuilt its <strong>entire state by replaying the event spine</strong>, and now serves the standard token API + image — touching <strong>zero</strong> centralized services. Delete the database and replay: identical, every time.</p>
|
|
33
|
+
</section>
|
|
34
|
+
${renderProject(project, baseUrl, chainId)}`);
|
|
35
|
+
}
|
|
36
|
+
/** The node index at `/`, served read-only: which contracts this resolver serves, each linking to
|
|
37
|
+
* its per-contract dashboard. No actions — operate via the CLI (admin-token gated). */
|
|
38
|
+
export function renderIndex(projects, baseUrl, chainId) {
|
|
39
|
+
const ordered = [...projects].sort((a, b) => b.reconstructedAt.localeCompare(a.reconstructedAt));
|
|
40
|
+
const rows = ordered
|
|
41
|
+
.map((s) => `<li><a href="/d/${chainId}/${esc(s.address)}">${esc(s.name ?? s.address)}</a> <code>${shorten(s.address)}</code> <span class="muted">· ${s.tokens.length} token(s) · ${esc(timeago(s.reconstructedAt))}</span></li>`)
|
|
42
|
+
.join('');
|
|
43
|
+
return page('ABX Self-Host Node', baseUrl, `
|
|
44
|
+
<section class="intro">
|
|
45
|
+
<div class="kicker">Layer 3 · the credible exit, running</div>
|
|
46
|
+
<h1>Projects served from chain alone.</h1>
|
|
47
|
+
<p>This node reconstructs each contract below from the event spine and serves the standard token API + image. Read-only — operate it from the <code>abx</code> CLI.</p>
|
|
48
|
+
</section>
|
|
49
|
+
${ordered.length ? `<section class="index"><ul class="proj-list">${rows}</ul></section>` : EMPTY_STATE}`);
|
|
50
|
+
}
|
|
51
|
+
function renderProject(s, baseUrl, chainId) {
|
|
52
|
+
const tok = s.tokens[0];
|
|
53
|
+
const img = tok ? `${baseUrl}/t/${chainId}/${s.address}/${tok.tokenId}/image` : '';
|
|
54
|
+
const canonical = s.isCanonical
|
|
55
|
+
? `<span class="badge ok">✓ canonical — factory-verified</span>`
|
|
56
|
+
: `<span class="badge warn">discovery only — unverified</span>`;
|
|
57
|
+
return `
|
|
58
|
+
<section class="grid" data-address="${esc(s.address)}">
|
|
59
|
+
<div class="art-col">
|
|
60
|
+
<div class="art">${img ? `<img src="${esc(img)}" alt="token image"/>` : 'no token'}</div>
|
|
61
|
+
<div class="links">
|
|
62
|
+
<a href="${baseUrl}/t/${chainId}/${s.address}/${tok?.tokenId ?? '0'}" target="_blank">tokenURI JSON →</a>
|
|
63
|
+
<a href="${baseUrl}/c/${chainId}/${s.address}" target="_blank">contractURI JSON →</a>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<div class="info-col">
|
|
68
|
+
<h2>${esc(s.name ?? s.address)} ${s.symbol ? `<span class="sym">${esc(s.symbol)}</span>` : ''}</h2>
|
|
69
|
+
<div class="chip-row">
|
|
70
|
+
<a class="chip" href="${EXPLORER}/address/${s.address}" target="_blank" title="View on Etherscan">${shorten(s.address)} ↗</a>
|
|
71
|
+
${canonical}
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<div class="facts">
|
|
75
|
+
${fact('Token #0', tok?.minted ? `<span class="badge ok">minted</span>` : `<span class="badge warn">not yet minted</span>`)}
|
|
76
|
+
${fact('Owner', tok?.minted && tok.owner ? linkAddr(tok.owner) : s.owner ? `${linkAddr(s.owner)} <span class="muted">(admin)</span>` : '—')}
|
|
77
|
+
${fact('Royalty', s.royalty ? `${(s.royalty.bps / 100).toFixed(2)}% → ${shorten(s.royalty.receiver)}` : 'none')}
|
|
78
|
+
${fact('ABX core version', s.abxVersion !== null ? `v${s.abxVersion}` : '—')}
|
|
79
|
+
${fact('Implementation', s.implementation ? linkAddr(s.implementation) : '—')}
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<div class="exts">
|
|
83
|
+
<span class="lbl">Extensions detected via beacon:</span>
|
|
84
|
+
${s.extensions.map((e) => `<span class="pill">${esc(friendly(e.name))} <em>v${e.version}</em></span>`).join('') || '<span class="muted">none</span>'}
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
${renderCommitments(s)}
|
|
88
|
+
|
|
89
|
+
<div class="rebuild">
|
|
90
|
+
<div class="rebuild-head">
|
|
91
|
+
<span class="lbl">Reconstructed from chain</span>
|
|
92
|
+
<span class="meta">blocks ${esc(s.deployBlock ?? s.fromBlock)} → ${esc(s.toBlock)} · <strong>${s.eventCount}</strong> spine events · ${esc(timeago(s.reconstructedAt))}</span>
|
|
93
|
+
</div>
|
|
94
|
+
<p class="muted readonly-note">Read-only view. Re-index + verify are admin operations — run <code>abx index ${shorten(s.address)} --remote</code> / <code>abx verify</code> from the CLI.</p>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
</section>
|
|
98
|
+
|
|
99
|
+
<section class="spine">
|
|
100
|
+
<h3>The event spine, replayed <span class="muted">— this is the whole reconstruction</span></h3>
|
|
101
|
+
<table>
|
|
102
|
+
<thead><tr><th></th><th>event</th><th>what it told us</th><th>block</th><th>tx</th></tr></thead>
|
|
103
|
+
<tbody>
|
|
104
|
+
${s.events.map(eventRow).join('')}
|
|
105
|
+
</tbody>
|
|
106
|
+
</table>
|
|
107
|
+
</section>`;
|
|
108
|
+
}
|
|
109
|
+
function renderCommitments(s) {
|
|
110
|
+
const tokenFields = s.tokens.flatMap((t) => t.fields.map((f) => ({ ...f, locked: t.lockedFields.includes(f.field) })));
|
|
111
|
+
const collection = s.collectionFields.map((f) => ({ ...f, locked: s.lockedCollectionFields.includes(f.field) }));
|
|
112
|
+
const all = [...tokenFields, ...collection];
|
|
113
|
+
if (all.length === 0)
|
|
114
|
+
return '';
|
|
115
|
+
return `<div class="commit">
|
|
116
|
+
<span class="lbl">On-chain metadata (field · representation):</span>
|
|
117
|
+
${all
|
|
118
|
+
.map((f) => `<div class="commit-row"><code>${esc(f.field)} · ${esc(f.representation)}</code> <span class="hash">${esc(f.value)}</span> ${f.locked ? '<span class="badge ok">locked</span>' : ''}</div>`)
|
|
119
|
+
.join('')}
|
|
120
|
+
</div>`;
|
|
121
|
+
}
|
|
122
|
+
function eventRow(e) {
|
|
123
|
+
const reg = e.register === 2 ? `<span class="reg r2" title="Native ABX event">ABX</span>` : `<span class="reg r1" title="Standard ERC event">ERC</span>`;
|
|
124
|
+
return `<tr>
|
|
125
|
+
<td>${reg}</td>
|
|
126
|
+
<td class="evt">${esc(e.name)}</td>
|
|
127
|
+
<td class="what">${esc(e.what)}</td>
|
|
128
|
+
<td class="num">${esc(e.blockNumber)}</td>
|
|
129
|
+
<td><a href="${EXPLORER}/tx/${e.txHash}" target="_blank">${shorten(e.txHash)} ↗</a></td>
|
|
130
|
+
</tr>`;
|
|
131
|
+
}
|
|
132
|
+
function fact(label, value) {
|
|
133
|
+
return `<div class="f"><span class="fl">${esc(label)}</span><span class="fv">${value}</span></div>`;
|
|
134
|
+
}
|
|
135
|
+
function linkAddr(a) {
|
|
136
|
+
return `<a href="${EXPLORER}/address/${a}" target="_blank">${shorten(a)} ↗</a>`;
|
|
137
|
+
}
|
|
138
|
+
function friendly(name) {
|
|
139
|
+
if (name === 'abx.extension.royalty')
|
|
140
|
+
return 'Royalty';
|
|
141
|
+
if (name === 'abx.extension.content-commitment')
|
|
142
|
+
return 'Content Commitment';
|
|
143
|
+
return name;
|
|
144
|
+
}
|
|
145
|
+
function shorten(a) {
|
|
146
|
+
return a.length > 12 ? `${a.slice(0, 6)}…${a.slice(-4)}` : a;
|
|
147
|
+
}
|
|
148
|
+
function timeago(iso) {
|
|
149
|
+
const then = new Date(iso).getTime();
|
|
150
|
+
const secs = Math.max(0, Math.round((Date.now() - then) / 1000));
|
|
151
|
+
if (secs < 60)
|
|
152
|
+
return `${secs}s ago`;
|
|
153
|
+
if (secs < 3600)
|
|
154
|
+
return `${Math.round(secs / 60)}m ago`;
|
|
155
|
+
return `${Math.round(secs / 3600)}h ago`;
|
|
156
|
+
}
|
|
157
|
+
function esc(s) {
|
|
158
|
+
return String(s).replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
|
|
159
|
+
}
|
|
160
|
+
const EMPTY_STATE = `<section class="empty">
|
|
161
|
+
<h2>No project indexed yet</h2>
|
|
162
|
+
<p>Deploy a 1/1 to Sepolia and index it in one command:</p>
|
|
163
|
+
<pre>pnpm abx demo</pre>
|
|
164
|
+
<p class="muted">Then refresh this page.</p>
|
|
165
|
+
</section>`;
|
|
166
|
+
const CSS = `
|
|
167
|
+
:root{--bg:#0a0a0f;--raised:#12121a;--card:#16161f;--ink:#e8e8ef;--dim:#9a9aad;--faint:#5b5b70;--accent:#7df9c6;--accent2:#8b7dff;--accent3:#ffb86b;--line:#26263a;--mono:"SF Mono","Fira Code",ui-monospace,Menlo,monospace;--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif}
|
|
168
|
+
*{margin:0;padding:0;box-sizing:border-box}
|
|
169
|
+
body{background:var(--bg);color:var(--ink);font-family:var(--sans);line-height:1.6;-webkit-font-smoothing:antialiased}
|
|
170
|
+
code,pre{font-family:var(--mono)}
|
|
171
|
+
a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}
|
|
172
|
+
.bar{display:flex;justify-content:space-between;align-items:center;padding:18px 32px;border-bottom:1px solid var(--line);position:sticky;top:0;background:rgba(10,10,15,.85);backdrop-filter:blur(8px);z-index:5}
|
|
173
|
+
.brand{font-weight:600;letter-spacing:.02em}.brand em{color:var(--dim);font-style:normal;font-weight:400}
|
|
174
|
+
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);box-shadow:0 0 8px var(--accent);margin-right:8px;animation:pulse 2s infinite}
|
|
175
|
+
@keyframes pulse{50%{opacity:.4}}
|
|
176
|
+
.node{font-size:13px;color:var(--dim)}.node code{color:var(--accent2)}
|
|
177
|
+
main{max-width:1080px;margin:0 auto;padding:0 32px 64px}
|
|
178
|
+
.intro{padding:56px 0 32px}
|
|
179
|
+
.kicker{font-family:var(--mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--accent);margin-bottom:14px}
|
|
180
|
+
h1{font-size:40px;line-height:1.1;letter-spacing:-.02em;margin-bottom:16px}
|
|
181
|
+
.intro p{color:var(--dim);max-width:680px;font-size:17px}
|
|
182
|
+
.intro strong{color:var(--ink)}
|
|
183
|
+
.grid{display:grid;grid-template-columns:340px 1fr;gap:32px;margin-bottom:40px}
|
|
184
|
+
.art{aspect-ratio:1;border-radius:14px;overflow:hidden;border:1px solid var(--line);background:var(--card)}
|
|
185
|
+
.art img{width:100%;height:100%;display:block}
|
|
186
|
+
.links{display:flex;flex-direction:column;gap:6px;margin-top:14px;font-size:13px;font-family:var(--mono)}
|
|
187
|
+
h2{font-size:26px;letter-spacing:-.01em}h2 .sym{color:var(--faint);font-size:16px;font-family:var(--mono)}
|
|
188
|
+
.chip-row{display:flex;gap:10px;align-items:center;margin:12px 0 20px;flex-wrap:wrap}
|
|
189
|
+
.chip{font-family:var(--mono);font-size:12px;background:var(--raised);border:1px solid var(--line);padding:5px 10px;border-radius:8px;color:var(--ink)}
|
|
190
|
+
.badge{font-size:11px;font-family:var(--mono);padding:4px 9px;border-radius:8px;text-transform:uppercase;letter-spacing:.05em}
|
|
191
|
+
.badge.ok{background:rgba(125,249,198,.12);color:var(--accent);border:1px solid rgba(125,249,198,.3)}
|
|
192
|
+
.badge.warn{background:rgba(255,184,107,.12);color:var(--accent3);border:1px solid rgba(255,184,107,.3)}
|
|
193
|
+
.facts{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--line);border:1px solid var(--line);border-radius:12px;overflow:hidden;margin-bottom:18px}
|
|
194
|
+
.f{background:var(--card);padding:12px 14px}
|
|
195
|
+
.fl{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--faint);margin-bottom:3px}
|
|
196
|
+
.fv{font-family:var(--mono);font-size:13px}
|
|
197
|
+
.exts{margin-bottom:18px;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
|
|
198
|
+
.lbl{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--faint)}
|
|
199
|
+
.pill{background:rgba(139,125,255,.12);border:1px solid rgba(139,125,255,.3);color:var(--accent2);font-family:var(--mono);font-size:12px;padding:4px 10px;border-radius:8px}
|
|
200
|
+
.pill em{color:var(--dim);font-style:normal}
|
|
201
|
+
.commit{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px;margin-bottom:18px}
|
|
202
|
+
.commit-row{display:flex;gap:10px;align-items:center;margin-top:8px;font-size:12px}
|
|
203
|
+
.hash{font-family:var(--mono);color:var(--dim);word-break:break-all;font-size:11px}
|
|
204
|
+
.muted{color:var(--faint)}
|
|
205
|
+
.rebuild{background:linear-gradient(180deg,rgba(125,249,198,.04),transparent);border:1px solid var(--line);border-radius:12px;padding:18px}
|
|
206
|
+
.rebuild-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:14px;flex-wrap:wrap;gap:8px}
|
|
207
|
+
.meta{font-family:var(--mono);font-size:12px;color:var(--dim)}.meta strong{color:var(--accent)}
|
|
208
|
+
.actions{display:flex;gap:10px}
|
|
209
|
+
button{font-family:var(--mono);font-size:13px;background:var(--accent);color:#06120d;border:0;padding:10px 16px;border-radius:9px;cursor:pointer;font-weight:600}
|
|
210
|
+
button:hover{opacity:.9}button.ghost{background:transparent;color:var(--ink);border:1px solid var(--line)}
|
|
211
|
+
button:disabled{opacity:.5;cursor:wait}
|
|
212
|
+
.result{margin-top:14px;font-family:var(--mono);font-size:13px;min-height:0}
|
|
213
|
+
.result .line{padding:4px 0}.result .good{color:var(--accent)}.result .bad{color:#ff7d8b}
|
|
214
|
+
.spine{margin-top:8px}
|
|
215
|
+
.spine h3{font-size:18px;margin-bottom:14px;font-weight:600}
|
|
216
|
+
table{width:100%;border-collapse:collapse;font-size:13px}
|
|
217
|
+
th{text-align:left;font-family:var(--mono);font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--faint);padding:8px 10px;border-bottom:1px solid var(--line)}
|
|
218
|
+
td{padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:top}
|
|
219
|
+
.evt{font-family:var(--mono);color:var(--ink)}.what{color:var(--dim)}.num{font-family:var(--mono);color:var(--faint)}
|
|
220
|
+
.reg{font-family:var(--mono);font-size:10px;font-weight:700;padding:2px 6px;border-radius:5px}
|
|
221
|
+
.reg.r2{background:rgba(139,125,255,.15);color:var(--accent2)}.reg.r1{background:rgba(125,249,198,.12);color:var(--accent)}
|
|
222
|
+
.empty{text-align:center;padding:60px 0}.empty pre{display:inline-block;background:var(--card);border:1px solid var(--line);padding:12px 20px;border-radius:10px;margin:14px 0;color:var(--accent)}
|
|
223
|
+
.index{padding:8px 0 40px}
|
|
224
|
+
.proj-list{list-style:none;display:flex;flex-direction:column;gap:10px}
|
|
225
|
+
.proj-list li{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:12px 16px}
|
|
226
|
+
.proj-list code{color:var(--dim);font-size:12px;font-family:var(--mono)}
|
|
227
|
+
.readonly-note{margin-top:14px;font-size:12px}.readonly-note code{color:var(--accent2);font-family:var(--mono)}
|
|
228
|
+
footer{border-top:1px solid var(--line);padding:24px 32px;text-align:center;color:var(--faint);font-size:13px}
|
|
229
|
+
@media(max-width:720px){.grid{grid-template-columns:1fr}.facts{grid-template-columns:1fr}h1{font-size:30px}}
|
|
230
|
+
`;
|
|
231
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,8BAA8B,CAAC;AAEhD,mEAAmE;AACnE,SAAS,IAAI,CAAC,KAAa,EAAE,OAAe,EAAE,IAAY;IACxD,OAAO;;;;SAIA,GAAG,CAAC,KAAK,CAAC;SACV,GAAG;;;;kCAIsB,GAAG,CAAC,OAAO,CAAC;;QAEtC,IAAI;;;;eAIG,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAqB,EAAE,OAAe,EAAE,OAAe;IACrF,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,QAAQ,EAAE,OAAO,EAAE;;;UAGzD,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,cAAc,CAAC;sDACS,OAAO;;IAEzD,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;wFACwF;AACxF,MAAM,UAAU,WAAW,CAAC,QAAwB,EAAE,OAAe,EAAE,OAAe;IACpF,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IACjG,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,mBAAmB,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,cAAc,CACxN;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE;;;;;;IAMzC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,gDAAgD,IAAI,iBAAiB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5G,CAAC;AAED,SAAS,aAAa,CAAC,CAAe,EAAE,OAAe,EAAE,OAAe;IACtE,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW;QAC7B,CAAC,CAAC,8DAA8D;QAChE,CAAC,CAAC,6DAA6D,CAAC;IAElE,OAAO;wCAC+B,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;;yBAE7B,GAAG,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,UAAU;;mBAErE,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG;mBACxD,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,OAAO;;;;;YAKxC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;;gCAEnE,QAAQ,YAAY,CAAC,CAAC,OAAO,+CAA+C,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;UACpH,SAAS;;;;UAIT,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,gDAAgD,CAAC;UACzH,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC,GAAG,CAAC;UACzI,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;UAC7G,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;UAC1E,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;;;;;UAK3E,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,iCAAiC;;;QAGpJ,iBAAiB,CAAC,CAAC,CAAC;;;;;sCAKU,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,UAAU,4BAA4B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;;sHAE1D,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;;;;;;;;;;UAU9H,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;aAG5B,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAe;IACxC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACzC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAC,CAAC,CAAC,CACxE,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,GAAG,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO;;MAEH,GAAG;SACF,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,iCAAiC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,8BAA8B,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAC9L;SACA,IAAI,CAAC,EAAE,CAAC;SACN,CAAC;AACV,CAAC;AAED,SAAS,QAAQ,CAAC,CAAqF;IACrG,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,0DAA0D,CAAC,CAAC,CAAC,4DAA4D,CAAC;IACzJ,OAAO;UACC,GAAG;sBACS,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;uBACV,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;sBACZ,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;mBACrB,QAAQ,OAAO,CAAC,CAAC,MAAM,qBAAqB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACxE,CAAC;AACT,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,KAAa;IACxC,OAAO,mCAAmC,GAAG,CAAC,KAAK,CAAC,2BAA2B,KAAK,eAAe,CAAC;AACtG,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,YAAY,QAAQ,YAAY,CAAC,qBAAqB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClF,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,IAAI,KAAK,uBAAuB;QAAE,OAAO,SAAS,CAAC;IACvD,IAAI,IAAI,KAAK,kCAAkC;QAAE,OAAO,oBAAoB,CAAC;IAC7E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjE,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACrC,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;IACxD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;AAC3C,CAAC;AAED,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;AAC3H,CAAC;AAED,MAAM,WAAW,GAAG;;;;;WAKT,CAAC;AAEZ,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEX,CAAC"}
|
package/dist/deps.d.ts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { type Address, type DependencyInfo, type ProjectState, type PublicClient } from '@artblocks/abx-sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Registry-aware dependency resolution — the resolver's leg of the
|
|
4
|
+
* specs/protocol/dependency-registry.md "Consumers" table:
|
|
5
|
+
*
|
|
6
|
+
* the collection's registry pointer: `availableOnChain` → serve the bytes
|
|
7
|
+
* → else `preferredCDN` → else the built-in CDN map (last resort, warns)
|
|
8
|
+
*
|
|
9
|
+
* The read interface is AB's IDependencyRegistryV0 shape (a hard compatibility rule —
|
|
10
|
+
* any registry a collection points at speaks it). Script chunks are stored gzip'd THEN
|
|
11
|
+
* base64'd; the resolver concatenates the chunk strings, base64-decodes, and gunzips
|
|
12
|
+
* server-side so the document inlines plain JS. Resolution NEVER throws — the document
|
|
13
|
+
* must always assemble; every failure degrades to the built-in map with one warn.
|
|
14
|
+
*
|
|
15
|
+
* This module also owns the query-string size budget for URL-carried tokenData (~8KB
|
|
16
|
+
* request-line caps at gateway front-ends). It applies only to the directory 302 fallback
|
|
17
|
+
* — the primary inline-injection path carries tokenData inside the document. Over-budget
|
|
18
|
+
* redirects are still served IN FULL (never silently drop params), but warn loudly — once
|
|
19
|
+
* per project per process, then debug.
|
|
20
|
+
*/
|
|
21
|
+
/** The IDependencyRegistryV0 reads the resolver speaks (exact AB signatures). */
|
|
22
|
+
export declare const DEPENDENCY_REGISTRY_ABI: readonly [{
|
|
23
|
+
readonly type: "function";
|
|
24
|
+
readonly name: "getDependencyDetails";
|
|
25
|
+
readonly stateMutability: "view";
|
|
26
|
+
readonly inputs: readonly [{
|
|
27
|
+
readonly name: "dependencyNameAndVersion";
|
|
28
|
+
readonly type: "bytes32";
|
|
29
|
+
}];
|
|
30
|
+
readonly outputs: readonly [{
|
|
31
|
+
readonly name: "nameAndVersion";
|
|
32
|
+
readonly type: "string";
|
|
33
|
+
}, {
|
|
34
|
+
readonly name: "licenseType";
|
|
35
|
+
readonly type: "string";
|
|
36
|
+
}, {
|
|
37
|
+
readonly name: "preferredCDN";
|
|
38
|
+
readonly type: "string";
|
|
39
|
+
}, {
|
|
40
|
+
readonly name: "additionalCDNCount";
|
|
41
|
+
readonly type: "uint24";
|
|
42
|
+
}, {
|
|
43
|
+
readonly name: "preferredRepository";
|
|
44
|
+
readonly type: "string";
|
|
45
|
+
}, {
|
|
46
|
+
readonly name: "additionalRepositoryCount";
|
|
47
|
+
readonly type: "uint24";
|
|
48
|
+
}, {
|
|
49
|
+
readonly name: "dependencyWebsite";
|
|
50
|
+
readonly type: "string";
|
|
51
|
+
}, {
|
|
52
|
+
readonly name: "availableOnChain";
|
|
53
|
+
readonly type: "bool";
|
|
54
|
+
}, {
|
|
55
|
+
readonly name: "scriptCount";
|
|
56
|
+
readonly type: "uint24";
|
|
57
|
+
}];
|
|
58
|
+
}, {
|
|
59
|
+
readonly type: "function";
|
|
60
|
+
readonly name: "getDependencyScript";
|
|
61
|
+
readonly stateMutability: "view";
|
|
62
|
+
readonly inputs: readonly [{
|
|
63
|
+
readonly name: "dependencyNameAndVersion";
|
|
64
|
+
readonly type: "bytes32";
|
|
65
|
+
}, {
|
|
66
|
+
readonly name: "index";
|
|
67
|
+
readonly type: "uint256";
|
|
68
|
+
}];
|
|
69
|
+
readonly outputs: readonly [{
|
|
70
|
+
readonly type: "string";
|
|
71
|
+
}];
|
|
72
|
+
}];
|
|
73
|
+
/** What a registry ref resolved to: on-chain bytes (gunzipped, inline-ready JS) or a CDN URL. */
|
|
74
|
+
export type RegistryResolution = {
|
|
75
|
+
kind: 'onchain';
|
|
76
|
+
script: string;
|
|
77
|
+
} | {
|
|
78
|
+
kind: 'cdn';
|
|
79
|
+
url: string;
|
|
80
|
+
};
|
|
81
|
+
/** Reset all in-process dependency state (cache + budget flags + serve modes) — for tests. */
|
|
82
|
+
export declare function resetDependencyResolutionState(): void;
|
|
83
|
+
/** The collection's registry pointer, if set to a real address (zero/undefined ⇒ none). */
|
|
84
|
+
export declare function activeRegistry(state: ProjectState): Address | null;
|
|
85
|
+
/**
|
|
86
|
+
* Resolve one `name@version` ref through the collection's registry. Returns the resolution
|
|
87
|
+
* (or null when the registry couldn't answer — caller falls back to the built-in map) plus
|
|
88
|
+
* whether it was served from cache. Never throws; a fresh failure logs ONE warn (the
|
|
89
|
+
* negative cache rate-limits it) naming the dep and why.
|
|
90
|
+
*/
|
|
91
|
+
export declare function resolveRegistryDep(client: PublicClient, registry: Address, dep: DependencyInfo): Promise<{
|
|
92
|
+
resolution: RegistryResolution | null;
|
|
93
|
+
cached: boolean;
|
|
94
|
+
error?: string;
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Resolve a `name@version` registry ref to a CDN URL — the built-in reference convention,
|
|
98
|
+
* the LAST-resort rung of the resolution order (the soft registry pointer stays
|
|
99
|
+
* non-validating). Known runtimes get their real dist paths; anything else is best-effort npm.
|
|
100
|
+
*/
|
|
101
|
+
export declare function registryDepUrl(ref: string): string | null;
|
|
102
|
+
/**
|
|
103
|
+
* The ordered dependency `<script>` tags for the generator document, each dep resolved per
|
|
104
|
+
* the Consumers table: registry on-chain bytes → registry preferredCDN → built-in map;
|
|
105
|
+
* `onchain`-resolution refs read their SSTORE2 data contract directly (never a registry).
|
|
106
|
+
* Never throws — an unresolvable dep is skipped (after the warn) and the document assembles.
|
|
107
|
+
*/
|
|
108
|
+
export declare function dependencyScriptTags(client: PublicClient, state: ProjectState): Promise<string[]>;
|
|
109
|
+
export type DirectoryServeMode = 'inline-injection' | 'redirect-fallback';
|
|
110
|
+
/** Record which directory serving path a live-view request actually took. */
|
|
111
|
+
export declare function recordDirectoryServe(address: string, mode: DirectoryServeMode): void;
|
|
112
|
+
/** Gateway front-ends commonly cap request lines near 8KB — the spec's URL budget. It
|
|
113
|
+
* applies to URL-carried `?abx=` payloads (the 302 fallback); resolver inline serving
|
|
114
|
+
* injects tokenData into the document and is unaffected. */
|
|
115
|
+
export declare const URL_BUDGET_BYTES = 8192;
|
|
116
|
+
/**
|
|
117
|
+
* Measure a URL-carried `?abx=` payload (the directory 302 fallback) against the ~8KB
|
|
118
|
+
* budget. The FULL URL is always served — params are never dropped — this only makes the
|
|
119
|
+
* breach visible: a loud structured warn on the first over-budget redirect per project per
|
|
120
|
+
* process, debug-level after. Inline-injection serving never routes through here.
|
|
121
|
+
*/
|
|
122
|
+
export declare function checkUrlBudget(address: string, tokenId: string, redirectUrl: string): void;
|
|
123
|
+
/** The project's URL-budget status (directory projects) — surfaced by /api/deps. */
|
|
124
|
+
export declare function urlBudgetStatus(address: string): {
|
|
125
|
+
limit: number;
|
|
126
|
+
exceeded: boolean;
|
|
127
|
+
lastBytes?: number;
|
|
128
|
+
lastTokenId?: string;
|
|
129
|
+
lastAt?: string;
|
|
130
|
+
};
|
|
131
|
+
export type ResolvedVia = 'onchain-registry' | 'cdn-registry' | 'builtin-map' | 'inline-onchain' | 'unresolved';
|
|
132
|
+
export interface DepStatus {
|
|
133
|
+
ref: string;
|
|
134
|
+
resolution: 'registry' | 'onchain';
|
|
135
|
+
resolvedVia: ResolvedVia;
|
|
136
|
+
registry: Address | null;
|
|
137
|
+
cached: boolean;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Per-dep resolution status for a project — a read-only dry run of the same resolution the
|
|
141
|
+
* generator document uses (and it shares the cache, so a status read warms serving). For
|
|
142
|
+
* directory projects the active serving path (inline-injection primary vs the ?abx= 302
|
|
143
|
+
* fallback) and the URL-budget flag ride along.
|
|
144
|
+
*/
|
|
145
|
+
export declare function depStatusReport(client: PublicClient, state: ProjectState): Promise<Record<string, unknown>>;
|
|
146
|
+
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAGtH;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iFAAiF;AACjF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4B1B,CAAC;AAEX,iGAAiG;AACjG,MAAM,MAAM,kBAAkB,GAAG;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,GAAG;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC;AAWhG,8FAA8F;AAC9F,wBAAgB,8BAA8B,IAAI,IAAI,CAIrD;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI,CAIlE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,OAAO,EACjB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC;IAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,CA+CnF;AAgBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAazD;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BvG;AAID,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAM1E,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAEpF;AAID;;6DAE6D;AAC7D,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAMrC;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAgB1F;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAIA;AAID,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,cAAc,GAAG,aAAa,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAEhH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsDjH"}
|