@fayz-ai/plugin-reports 0.16.29 → 0.16.31
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/dist/AnalyticsModule-YIH6MDCC.js +4 -0
- package/dist/AnalyticsModule-YIH6MDCC.js.map +1 -0
- package/dist/AnalyticsOverview-R3JEMUQL.js +4 -0
- package/dist/AnalyticsOverview-R3JEMUQL.js.map +1 -0
- package/dist/AnalyticsReportViewer-ORI3XI5D.js +5 -0
- package/dist/AnalyticsReportViewer-ORI3XI5D.js.map +1 -0
- package/dist/AnalyticsSettingsPage-XWPM3VSA.js +4 -0
- package/dist/AnalyticsSettingsPage-XWPM3VSA.js.map +1 -0
- package/dist/LiveViewPage-XMVZHJ3U.js +16 -0
- package/dist/LiveViewPage-XMVZHJ3U.js.map +1 -0
- package/dist/ReportsListPage-7FAKQZ4T.js +4 -0
- package/dist/ReportsListPage-7FAKQZ4T.js.map +1 -0
- package/dist/chunk-67JOMNSD.js +127 -0
- package/dist/chunk-67JOMNSD.js.map +1 -0
- package/dist/chunk-DP7S37Y2.js +145 -0
- package/dist/chunk-DP7S37Y2.js.map +1 -0
- package/dist/chunk-DTUN4WLI.js +577 -0
- package/dist/chunk-DTUN4WLI.js.map +1 -0
- package/dist/chunk-S4MICM4C.js +23 -0
- package/dist/chunk-S4MICM4C.js.map +1 -0
- package/dist/chunk-VGDOKFED.js +236 -0
- package/dist/chunk-VGDOKFED.js.map +1 -0
- package/dist/chunk-YVLQV4N7.js +307 -0
- package/dist/chunk-YVLQV4N7.js.map +1 -0
- package/dist/components/ReportPagination.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -2092
- package/dist/index.js.map +1 -1
- package/dist/migrations/main.browser.js +7 -0
- package/dist/migrations/main.browser.js.map +1 -0
- package/dist/migrations/main.js +692 -0
- package/dist/migrations/main.js.map +1 -0
- package/package.json +10 -4
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import * as React3 from 'react';
|
|
2
|
+
import React3__default from 'react';
|
|
3
|
+
import { usePluginRuntime, getAnalyticsCards, hashRouterAdapter } from '@fayz-ai/core';
|
|
4
|
+
import { AnalyticsContextProvider } from '@fayz-ai/ui';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
// src/lib/lastViewed.ts
|
|
8
|
+
var KEY = "fayz.analytics.lastViewed";
|
|
9
|
+
function read() {
|
|
10
|
+
if (typeof window === "undefined") return {};
|
|
11
|
+
try {
|
|
12
|
+
const raw = window.localStorage.getItem(KEY);
|
|
13
|
+
return raw ? JSON.parse(raw) : {};
|
|
14
|
+
} catch {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function write(map) {
|
|
19
|
+
if (typeof window === "undefined") return;
|
|
20
|
+
try {
|
|
21
|
+
window.localStorage.setItem(KEY, JSON.stringify(map));
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
26
|
+
function markViewed(cardId) {
|
|
27
|
+
const next = { ...read(), [cardId]: (/* @__PURE__ */ new Date()).toISOString() };
|
|
28
|
+
write(next);
|
|
29
|
+
for (const listener of listeners) listener(next);
|
|
30
|
+
}
|
|
31
|
+
function useLastViewed() {
|
|
32
|
+
const [map, setMap] = React3.useState(() => read());
|
|
33
|
+
React3.useEffect(() => {
|
|
34
|
+
listeners.add(setMap);
|
|
35
|
+
return () => {
|
|
36
|
+
listeners.delete(setMap);
|
|
37
|
+
};
|
|
38
|
+
}, []);
|
|
39
|
+
return map;
|
|
40
|
+
}
|
|
41
|
+
var KEY2 = "fayz.analytics.prefs";
|
|
42
|
+
var EMPTY = { version: 1, cards: {}, custom: [] };
|
|
43
|
+
function read2() {
|
|
44
|
+
if (typeof window === "undefined") return EMPTY;
|
|
45
|
+
try {
|
|
46
|
+
const raw = window.localStorage.getItem(KEY2);
|
|
47
|
+
if (!raw) return EMPTY;
|
|
48
|
+
const parsed = JSON.parse(raw);
|
|
49
|
+
return {
|
|
50
|
+
version: 1,
|
|
51
|
+
cards: parsed.cards && typeof parsed.cards === "object" ? parsed.cards : {},
|
|
52
|
+
custom: Array.isArray(parsed.custom) ? parsed.custom : []
|
|
53
|
+
};
|
|
54
|
+
} catch {
|
|
55
|
+
return EMPTY;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function write2(prefs) {
|
|
59
|
+
if (typeof window === "undefined") return;
|
|
60
|
+
try {
|
|
61
|
+
const empty = Object.keys(prefs.cards).length === 0 && prefs.custom.length === 0;
|
|
62
|
+
if (empty) window.localStorage.removeItem(KEY2);
|
|
63
|
+
else window.localStorage.setItem(KEY2, JSON.stringify(prefs));
|
|
64
|
+
} catch {
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
var listeners2 = /* @__PURE__ */ new Set();
|
|
68
|
+
function publish(next) {
|
|
69
|
+
write2(next);
|
|
70
|
+
for (const listener of listeners2) listener(next);
|
|
71
|
+
}
|
|
72
|
+
function useAnalyticsPrefs() {
|
|
73
|
+
const [prefs, setPrefs] = React3.useState(() => read2());
|
|
74
|
+
React3.useEffect(() => {
|
|
75
|
+
listeners2.add(setPrefs);
|
|
76
|
+
return () => {
|
|
77
|
+
listeners2.delete(setPrefs);
|
|
78
|
+
};
|
|
79
|
+
}, []);
|
|
80
|
+
return prefs;
|
|
81
|
+
}
|
|
82
|
+
function setCardPref(cardId, patch) {
|
|
83
|
+
const current = read2();
|
|
84
|
+
const merged = { ...current.cards[cardId], ...patch };
|
|
85
|
+
const meaningful = Object.entries(merged).filter(([, v]) => v !== void 0 && v !== null);
|
|
86
|
+
const cards = { ...current.cards };
|
|
87
|
+
if (meaningful.length === 0) delete cards[cardId];
|
|
88
|
+
else cards[cardId] = Object.fromEntries(meaningful);
|
|
89
|
+
publish({ ...current, cards });
|
|
90
|
+
}
|
|
91
|
+
function clearCardPref(cardId) {
|
|
92
|
+
const current = read2();
|
|
93
|
+
const cards = { ...current.cards };
|
|
94
|
+
delete cards[cardId];
|
|
95
|
+
publish({ ...current, cards });
|
|
96
|
+
}
|
|
97
|
+
function setOverviewOrder(ids) {
|
|
98
|
+
const current = read2();
|
|
99
|
+
const cards = { ...current.cards };
|
|
100
|
+
ids.forEach((id, index) => {
|
|
101
|
+
cards[id] = { ...cards[id], order: index, pinned: cards[id]?.pinned ?? true };
|
|
102
|
+
});
|
|
103
|
+
publish({ ...current, cards });
|
|
104
|
+
}
|
|
105
|
+
function saveCustomReport(report) {
|
|
106
|
+
const current = read2();
|
|
107
|
+
const custom = current.custom.some((r) => r.id === report.id) ? current.custom.map((r) => r.id === report.id ? report : r) : [...current.custom, report];
|
|
108
|
+
publish({ ...current, custom });
|
|
109
|
+
}
|
|
110
|
+
function deleteCustomReport(id) {
|
|
111
|
+
const current = read2();
|
|
112
|
+
const cards = { ...current.cards };
|
|
113
|
+
delete cards[id];
|
|
114
|
+
publish({ ...current, cards, custom: current.custom.filter((r) => r.id !== id) });
|
|
115
|
+
}
|
|
116
|
+
function resetAnalyticsPrefs() {
|
|
117
|
+
publish({ ...EMPTY });
|
|
118
|
+
}
|
|
119
|
+
function sourceKey(card) {
|
|
120
|
+
const source = card.query.source;
|
|
121
|
+
if (source.kind === "fn") return card.grain ? `fn:${card.grain}` : `fn:${card.id}`;
|
|
122
|
+
return `${source.kind}:${source.name ?? card.id}`;
|
|
123
|
+
}
|
|
124
|
+
function analyticsSources(pool) {
|
|
125
|
+
const groups = /* @__PURE__ */ new Map();
|
|
126
|
+
for (const card of pool) {
|
|
127
|
+
const key = sourceKey(card);
|
|
128
|
+
const list = groups.get(key);
|
|
129
|
+
if (list) list.push(card);
|
|
130
|
+
else groups.set(key, [card]);
|
|
131
|
+
}
|
|
132
|
+
const out = [];
|
|
133
|
+
for (const [key, cards] of groups) {
|
|
134
|
+
const base = cards.find((c) => (c.query.measures?.length ?? 0) > 0);
|
|
135
|
+
if (!base) continue;
|
|
136
|
+
const palette = fieldPalette(pool, base);
|
|
137
|
+
if (palette.measures.length === 0) continue;
|
|
138
|
+
out.push({ key, base, label: base.name, ...palette });
|
|
139
|
+
}
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
function fieldPalette(pool, base) {
|
|
143
|
+
const key = sourceKey(base);
|
|
144
|
+
const dimensions = /* @__PURE__ */ new Map();
|
|
145
|
+
const measures = /* @__PURE__ */ new Map();
|
|
146
|
+
for (const card of pool) {
|
|
147
|
+
if (sourceKey(card) !== key) continue;
|
|
148
|
+
for (const d of card.query.dimensions ?? []) {
|
|
149
|
+
if (!d.hidden && !dimensions.has(d.key)) dimensions.set(d.key, d);
|
|
150
|
+
}
|
|
151
|
+
for (const m of card.query.measures ?? []) {
|
|
152
|
+
if (!measures.has(m.key)) measures.set(m.key, m);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return { dimensions: [...dimensions.values()], measures: [...measures.values()] };
|
|
156
|
+
}
|
|
157
|
+
function withRatioOperands(kept, all) {
|
|
158
|
+
const set = new Set(kept);
|
|
159
|
+
for (const key of kept) {
|
|
160
|
+
const measure = all.find((m) => m.key === key);
|
|
161
|
+
for (const operand of measure?.ratioOf ?? []) set.add(operand);
|
|
162
|
+
}
|
|
163
|
+
return set;
|
|
164
|
+
}
|
|
165
|
+
function applyPref(card, pref) {
|
|
166
|
+
if (!pref) return card;
|
|
167
|
+
const next = { ...card, query: { ...card.query }, viz: { ...card.viz } };
|
|
168
|
+
if (pref.name) next.name = pref.name;
|
|
169
|
+
if (pref.viz) next.viz.type = pref.viz;
|
|
170
|
+
if (pref.measures?.length) {
|
|
171
|
+
const all = card.query.measures ?? [];
|
|
172
|
+
const keep = withRatioOperands(pref.measures, all);
|
|
173
|
+
next.query.measures = all.filter((m) => keep.has(m.key));
|
|
174
|
+
if (card.viz.measures?.length) {
|
|
175
|
+
next.viz.measures = card.viz.measures.filter((k) => keep.has(k));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (pref.dimensions?.length) {
|
|
179
|
+
const keep = new Set(pref.dimensions);
|
|
180
|
+
next.query.dimensions = (card.query.dimensions ?? []).filter((d) => d.hidden || keep.has(d.key));
|
|
181
|
+
}
|
|
182
|
+
const placed = pref.pinned ?? Boolean(card.dashboard && card.dashboard.defaultVisible !== false);
|
|
183
|
+
if (!placed) {
|
|
184
|
+
next.dashboard = void 0;
|
|
185
|
+
} else {
|
|
186
|
+
next.dashboard = {
|
|
187
|
+
...card.dashboard,
|
|
188
|
+
defaultVisible: true,
|
|
189
|
+
order: pref.order ?? card.dashboard?.order ?? 999,
|
|
190
|
+
span: pref.span ?? card.dashboard?.span
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return next;
|
|
194
|
+
}
|
|
195
|
+
function resolveCustomReport(report, pool) {
|
|
196
|
+
const base = pool.find((c) => c.id === report.baseId);
|
|
197
|
+
if (!base) return null;
|
|
198
|
+
const palette = fieldPalette(pool, base);
|
|
199
|
+
const dimensions = report.dimensions.map((key) => palette.dimensions.find((d) => d.key === key)).filter((d) => Boolean(d));
|
|
200
|
+
const keep = withRatioOperands(report.measures, palette.measures);
|
|
201
|
+
const measures = palette.measures.filter((m) => keep.has(m.key));
|
|
202
|
+
return {
|
|
203
|
+
id: report.id,
|
|
204
|
+
name: report.name,
|
|
205
|
+
description: report.description,
|
|
206
|
+
icon: report.icon ?? "FileText",
|
|
207
|
+
category: report.category,
|
|
208
|
+
createdBy: report.createdBy,
|
|
209
|
+
grain: base.grain,
|
|
210
|
+
available: base.available,
|
|
211
|
+
compare: base.compare,
|
|
212
|
+
permission: base.permission,
|
|
213
|
+
query: {
|
|
214
|
+
source: base.query.source,
|
|
215
|
+
dateColumn: base.query.dateColumn,
|
|
216
|
+
dimensions,
|
|
217
|
+
measures,
|
|
218
|
+
filters: base.query.filters,
|
|
219
|
+
defaultSort: report.measures[0] ?? dimensions[0]?.key,
|
|
220
|
+
defaultSortDir: "desc"
|
|
221
|
+
},
|
|
222
|
+
viz: { type: report.viz }
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function resolveCards(catalogue, prefs) {
|
|
226
|
+
const custom = prefs.custom.map((report) => resolveCustomReport(report, catalogue)).filter((c) => Boolean(c));
|
|
227
|
+
return [...catalogue, ...custom].filter((card) => !prefs.cards[card.id]?.hidden).map((card) => applyPref(card, prefs.cards[card.id]));
|
|
228
|
+
}
|
|
229
|
+
var ANALYTICS_BASE = "/analytics";
|
|
230
|
+
var REPORTS_BASE = `${ANALYTICS_BASE}/reports`;
|
|
231
|
+
var SETTINGS_ROUTE = `${ANALYTICS_BASE}/settings`;
|
|
232
|
+
var ConfigContext = React3__default.createContext(null);
|
|
233
|
+
function useAnalyticsConfig() {
|
|
234
|
+
const ctx = React3__default.useContext(ConfigContext);
|
|
235
|
+
if (!ctx) throw new Error("useAnalyticsConfig must be used inside <AnalyticsSurface>");
|
|
236
|
+
return ctx;
|
|
237
|
+
}
|
|
238
|
+
function useAnalyticsCatalogue() {
|
|
239
|
+
const runtime = usePluginRuntime();
|
|
240
|
+
const { cards, createdBy } = useAnalyticsConfig();
|
|
241
|
+
return React3__default.useMemo(() => {
|
|
242
|
+
const byId = /* @__PURE__ */ new Map();
|
|
243
|
+
for (const card of getAnalyticsCards(runtime)) byId.set(card.id, card);
|
|
244
|
+
for (const card of cards) byId.set(card.id, card);
|
|
245
|
+
return [...byId.values()].map((c) => c.createdBy ? c : { ...c, createdBy });
|
|
246
|
+
}, [runtime, cards, createdBy]);
|
|
247
|
+
}
|
|
248
|
+
function useAnalyticsCards() {
|
|
249
|
+
const catalogue = useAnalyticsCatalogue();
|
|
250
|
+
const prefs = useAnalyticsPrefs();
|
|
251
|
+
return React3__default.useMemo(() => resolveCards(catalogue, prefs), [catalogue, prefs]);
|
|
252
|
+
}
|
|
253
|
+
function useOverviewCards() {
|
|
254
|
+
const all = useAnalyticsCards();
|
|
255
|
+
return React3__default.useMemo(
|
|
256
|
+
() => all.filter((c) => c.dashboard && c.dashboard.defaultVisible !== false).sort((a, b) => (a.dashboard?.order ?? 0) - (b.dashboard?.order ?? 0)),
|
|
257
|
+
[all]
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
function cardColumns(card) {
|
|
261
|
+
if (card.columns?.length) return card.columns;
|
|
262
|
+
return [
|
|
263
|
+
// A hidden dimension is group-by only — the id a person column reads from,
|
|
264
|
+
// never a column of UUIDs next to the name it belongs to.
|
|
265
|
+
...(card.query.dimensions ?? []).filter((d) => !d.hidden).map((d) => ({
|
|
266
|
+
key: d.key,
|
|
267
|
+
label: d.label,
|
|
268
|
+
type: d.person ? "person" : d.format ?? (d.grain ? "date" : "text"),
|
|
269
|
+
idKey: d.person?.idKey,
|
|
270
|
+
personKind: d.person?.kind,
|
|
271
|
+
align: "left"
|
|
272
|
+
})),
|
|
273
|
+
...(card.query.measures ?? []).map((m) => ({
|
|
274
|
+
key: m.key,
|
|
275
|
+
label: m.label,
|
|
276
|
+
type: m.format ?? "number",
|
|
277
|
+
align: "right",
|
|
278
|
+
sortable: true
|
|
279
|
+
}))
|
|
280
|
+
];
|
|
281
|
+
}
|
|
282
|
+
function navigateAnalytics(path) {
|
|
283
|
+
hashRouterAdapter().navigate(path);
|
|
284
|
+
}
|
|
285
|
+
function AnalyticsSurface({ config, provider, children }) {
|
|
286
|
+
const openCard = React3__default.useCallback((card) => {
|
|
287
|
+
markViewed(card.id);
|
|
288
|
+
navigateAnalytics(`${REPORTS_BASE}/${encodeURIComponent(card.id)}`);
|
|
289
|
+
}, []);
|
|
290
|
+
return /* @__PURE__ */ jsx(ConfigContext.Provider, { value: config, children: /* @__PURE__ */ jsx(
|
|
291
|
+
AnalyticsContextProvider,
|
|
292
|
+
{
|
|
293
|
+
provider,
|
|
294
|
+
currency: config.currency,
|
|
295
|
+
defaultPreset: config.defaultRange,
|
|
296
|
+
defaultCompare: config.defaultCompare,
|
|
297
|
+
defaultPageSize: config.defaultPageSize,
|
|
298
|
+
onOpenCard: openCard,
|
|
299
|
+
createdBy: config.createdBy,
|
|
300
|
+
children
|
|
301
|
+
}
|
|
302
|
+
) });
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
export { ANALYTICS_BASE, AnalyticsSurface, REPORTS_BASE, SETTINGS_ROUTE, analyticsSources, cardColumns, clearCardPref, deleteCustomReport, fieldPalette, markViewed, navigateAnalytics, resetAnalyticsPrefs, resolveCards, resolveCustomReport, saveCustomReport, setCardPref, setOverviewOrder, sourceKey, useAnalyticsCards, useAnalyticsCatalogue, useAnalyticsConfig, useAnalyticsPrefs, useLastViewed, useOverviewCards };
|
|
306
|
+
//# sourceMappingURL=chunk-YVLQV4N7.js.map
|
|
307
|
+
//# sourceMappingURL=chunk-YVLQV4N7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/lastViewed.ts","../src/lib/preferences.ts","../src/views/AnalyticsSurface.tsx"],"names":["React","KEY","read","write","listeners","React2"],"mappings":";;;;;;;AAYA,IAAM,GAAA,GAAM,2BAAA;AAIZ,SAAS,IAAA,GAAsB;AAC7B,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAC;AAC3C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC3C,IAAA,OAAO,GAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,IAAsB,EAAC;AAAA,EACrD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,MAAM,GAAA,EAA0B;AACvC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,IAAM,SAAA,uBAAgB,GAAA,EAAkC;AAEjD,SAAS,WAAW,MAAA,EAAsB;AAC/C,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK,EAAG,CAAC,MAAM,GAAA,iBAAG,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,EAAE;AAC7D,EAAA,KAAA,CAAM,IAAI,CAAA;AACV,EAAA,KAAA,MAAW,QAAA,IAAY,SAAA,EAAW,QAAA,CAAS,IAAI,CAAA;AACjD;AAEO,SAAS,aAAA,GAA+B;AAC7C,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,IAAUA,MAAA,CAAA,QAAA,CAAwB,MAAM,MAAM,CAAA;AAChE,EAAMA,iBAAU,MAAM;AACpB,IAAA,SAAA,CAAU,IAAI,MAAM,CAAA;AACpB,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,CAAU,OAAO,MAAM,CAAA;AAAA,IAAE,CAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,GAAA;AACT;ACxBA,IAAMC,IAAAA,GAAM,sBAAA;AA2CZ,IAAM,KAAA,GAAwB,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAElE,SAASC,KAAAA,GAAuB;AAC9B,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQD,IAAG,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA;AAAA,MACT,KAAA,EAAO,OAAO,KAAA,IAAS,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,MAAA,CAAO,KAAA,GAAQ,EAAC;AAAA,MAC1E,MAAA,EAAQ,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA,CAAO,SAAS;AAAC,KAC1D;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAASE,OAAM,KAAA,EAA6B;AAC1C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA;AAC/E,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,YAAA,CAAa,UAAA,CAAWF,IAAG,CAAA;AAAA,gBACjC,YAAA,CAAa,OAAA,CAAQA,MAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,IAAMG,UAAAA,uBAAgB,GAAA,EAAqC;AAE3D,SAAS,QAAQ,IAAA,EAA4B;AAC3C,EAAAD,OAAM,IAAI,CAAA;AACV,EAAA,KAAA,MAAW,QAAA,IAAYC,UAAAA,EAAW,QAAA,CAAS,IAAI,CAAA;AACjD;AAGO,SAAS,iBAAA,GAAoC;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAUC,MAAA,CAAA,QAAA,CAAyB,MAAMH,OAAM,CAAA;AACrE,EAAMG,iBAAU,MAAM;AACpB,IAAAD,UAAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,IAAA,OAAO,MAAM;AAAE,MAAAA,UAAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAAE,CAAA;AAAA,EAC5C,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,KAAA;AACT;AAIO,SAAS,WAAA,CAAY,QAAgB,KAAA,EAAgC;AAC1E,EAAA,MAAM,UAAUF,KAAAA,EAAK;AACrB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,OAAA,CAAQ,MAAM,MAAM,CAAA,EAAG,GAAG,KAAA,EAAM;AAGpD,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,MAAM,EAAE,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,KAAM,MAAA,IAAa,MAAM,IAAI,CAAA;AACzF,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,OAAA,CAAQ,KAAA,EAAM;AACjC,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,MAAM,CAAA;AAAA,OAC3C,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA,CAAO,YAAY,UAAU,CAAA;AAClD,EAAA,OAAA,CAAQ,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,CAAA;AAC/B;AAEO,SAAS,cAAc,MAAA,EAAsB;AAClD,EAAA,MAAM,UAAUA,KAAAA,EAAK;AACrB,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,OAAA,CAAQ,KAAA,EAAM;AACjC,EAAA,OAAO,MAAM,MAAM,CAAA;AACnB,EAAA,OAAA,CAAQ,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,CAAA;AAC/B;AAGO,SAAS,iBAAiB,GAAA,EAAqB;AACpD,EAAA,MAAM,UAAUA,KAAAA,EAAK;AACrB,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,OAAA,CAAQ,KAAA,EAAM;AACjC,EAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,EAAA,EAAI,KAAA,KAAU;AACzB,IAAA,KAAA,CAAM,EAAE,CAAA,GAAI,EAAE,GAAG,MAAM,EAAE,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,EAAE,CAAA,EAAG,UAAU,IAAA,EAAK;AAAA,EAC9E,CAAC,CAAA;AACD,EAAA,OAAA,CAAQ,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,CAAA;AAC/B;AAEO,SAAS,iBAAiB,MAAA,EAA4B;AAC3D,EAAA,MAAM,UAAUA,KAAAA,EAAK;AACrB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,EAAE,CAAA,GACxD,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,EAAA,GAAK,MAAA,GAAS,CAAE,CAAA,GAC3D,CAAC,GAAG,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AAC9B,EAAA,OAAA,CAAQ,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,CAAA;AAChC;AAEO,SAAS,mBAAmB,EAAA,EAAkB;AACnD,EAAA,MAAM,UAAUA,KAAAA,EAAK;AACrB,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,OAAA,CAAQ,KAAA,EAAM;AACjC,EAAA,OAAO,MAAM,EAAE,CAAA;AACf,EAAA,OAAA,CAAQ,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,QAAQ,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,GAAG,CAAA;AAClF;AAEO,SAAS,mBAAA,GAA4B;AAC1C,EAAA,OAAA,CAAQ,EAAE,GAAG,KAAA,EAAO,CAAA;AACtB;AAcO,SAAS,UAAU,IAAA,EAAgC;AACxD,EAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA;AAC1B,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAA,EAAM,IAAA,CAAK,KAAK,CAAA,CAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,EAAE,CAAA,CAAA;AAChF,EAAA,OAAO,GAAG,MAAA,CAAO,IAAI,IAAI,MAAA,CAAO,IAAA,IAAQ,KAAK,EAAE,CAAA,CAAA;AACjD;AAwBO,SAAS,iBAAiB,IAAA,EAAkD;AACjF,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAgC;AACnD,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC3B,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAAA,SACnB,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,CAAC,IAAI,CAAC,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,EAAQ;AACjC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,EAAE,KAAA,CAAM,QAAA,EAAU,MAAA,IAAU,CAAA,IAAK,CAAC,CAAA;AAClE,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AACvC,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACnC,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,EAAM,GAAG,OAAA,EAAS,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,YAAA,CAAa,MAA0B,IAAA,EAAsC;AAC3F,EAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAgC;AACvD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA8B;AACnD,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,SAAA,CAAU,IAAI,CAAA,KAAM,GAAA,EAAK;AAC7B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,EAAC,EAAG;AAC3C,MAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,EAAG,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,QAAA,IAAY,EAAC,EAAG;AACzC,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,GAAG,GAAG,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAAA,IACjD;AAAA,EACF;AACA,EAAA,OAAO,EAAE,UAAA,EAAY,CAAC,GAAG,WAAW,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,CAAC,GAAG,QAAA,CAAS,MAAA,EAAQ,CAAA,EAAE;AAClF;AAIA,SAAS,iBAAA,CAAkB,MAAgB,GAAA,EAAsC;AAC/E,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAI,CAAA;AACxB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,UAAU,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,GAAG,CAAA;AAC7C,IAAA,KAAA,MAAW,WAAW,OAAA,EAAS,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,IAAI,OAAO,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAA,CAAU,MAAwB,IAAA,EAAuD;AAChG,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,IAAA,GAAyB,EAAE,GAAG,IAAA,EAAM,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,IAAS,GAAA,EAAK,EAAE,GAAG,IAAA,CAAK,KAAI,EAAE;AAEzF,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA;AAChC,EAAA,IAAI,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,OAAO,IAAA,CAAK,GAAA;AAEnC,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,QAAA,IAAY,EAAC;AACpC,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,IAAA,CAAK,QAAA,EAAU,GAAG,CAAA;AACjD,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAA,CAAI,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAC,CAAA;AAGvD,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,MAAA,EAAQ;AAC7B,MAAA,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,IACjE;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAQ;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAGpC,IAAA,IAAA,CAAK,MAAM,UAAA,GAAA,CAAc,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,IAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,EACjG;AAEA,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,OAAA,CAAQ,KAAK,SAAA,IAAa,IAAA,CAAK,SAAA,CAAU,cAAA,KAAmB,KAAK,CAAA;AAC/F,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAAA,EACnB,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,SAAA,GAAY;AAAA,MACf,GAAG,IAAA,CAAK,SAAA;AAAA,MACR,cAAA,EAAgB,IAAA;AAAA,MAChB,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,WAAW,KAAA,IAAS,GAAA;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,SAAA,EAAW;AAAA,KACrC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,mBAAA,CACd,QACA,IAAA,EACyB;AACzB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,OAAO,MAAM,CAAA;AACpD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AACvC,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,CACvB,GAAA,CAAI,CAAC,GAAA,KAAQ,OAAA,CAAQ,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,GAAA,KAAQ,GAAG,CAAC,CAAA,CAC1D,OAAO,CAAC,CAAA,KAA+B,OAAA,CAAQ,CAAC,CAAC,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,CAAO,QAAA,EAAU,QAAQ,QAAQ,CAAA;AAChE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAC,CAAA;AAE/D,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,CAAO,EAAA;AAAA,IACX,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,IAAA,EAAM,OAAO,IAAA,IAAQ,UAAA;AAAA,IACrB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,KAAK,KAAA,CAAM,MAAA;AAAA,MACnB,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,MACvB,UAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,MACpB,aAAa,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA,EAAG,GAAA;AAAA,MAClD,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,CAAO,GAAA;AAAI,GAC1B;AACF;AAMO,SAAS,YAAA,CAAa,WAA+B,KAAA,EAA2C;AACrG,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA,CAClB,GAAA,CAAI,CAAC,WAAW,mBAAA,CAAoB,MAAA,EAAQ,SAAS,CAAC,EACtD,MAAA,CAAO,CAAC,CAAA,KAA6B,OAAA,CAAQ,CAAC,CAAC,CAAA;AAClD,EAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,MAAM,CAAA,CAC5B,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,EAAG,MAAM,CAAA,CAC9C,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AACxD;ACnUO,IAAM,cAAA,GAAiB;AACvB,IAAM,YAAA,GAAe,GAAG,cAAc,CAAA,QAAA;AACtC,IAAM,cAAA,GAAiB,GAAG,cAAc,CAAA,SAAA;AAyE/C,IAAM,aAAA,GAAgBF,eAAAA,CAAM,aAAA,CAA8C,IAAI,CAAA;AAEvE,SAAS,kBAAA,GAA8C;AAC5D,EAAA,MAAM,GAAA,GAAMA,eAAAA,CAAM,UAAA,CAAW,aAAa,CAAA;AAC1C,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,2DAA2D,CAAA;AACrF,EAAA,OAAO,GAAA;AACT;AAaO,SAAS,qBAAA,GAA4C;AAC1D,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,kBAAA,EAAmB;AAChD,EAAA,OAAOA,eAAAA,CAAM,QAAQ,MAAM;AACzB,IAAA,MAAM,IAAA,uBAAW,GAAA,EAA8B;AAC/C,IAAA,KAAA,MAAW,IAAA,IAAQ,kBAAkB,OAAO,CAAA,OAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,IAAI,CAAA;AACrE,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAI,CAAA;AAChD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,EAAE,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,YAAY,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,WAAY,CAAA;AAAA,EAC9E,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,SAAS,CAAC,CAAA;AAChC;AAUO,SAAS,iBAAA,GAAwC;AACtD,EAAA,MAAM,YAAY,qBAAA,EAAsB;AACxC,EAAA,MAAM,QAAQ,iBAAA,EAAkB;AAChC,EAAA,OAAOA,eAAAA,CAAM,OAAA,CAAQ,MAAM,YAAA,CAAa,SAAA,EAAW,KAAK,CAAA,EAAG,CAAC,SAAA,EAAW,KAAK,CAAC,CAAA;AAC/E;AAGO,SAAS,gBAAA,GAAuC;AACrD,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,OAAOA,eAAAA,CAAM,OAAA;AAAA,IACX,MAAM,IACH,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,CAAU,cAAA,KAAmB,KAAK,EACjE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,SAAA,EAAW,SAAS,CAAA,KAAM,CAAA,CAAE,SAAA,EAAW,KAAA,IAAS,CAAA,CAAE,CAAA;AAAA,IACvE,CAAC,GAAG;AAAA,GACN;AACF;AASO,SAAS,YAAY,IAAA,EAA8C;AACxE,EAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,OAAO,IAAA,CAAK,OAAA;AACtC,EAAA,OAAO;AAAA;AAAA;AAAA,IAGL,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAA2B;AAAA,MACxF,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,IAAA,EAAM,EAAE,MAAA,GAAS,QAAA,GAAY,EAAE,MAAA,KAAW,CAAA,CAAE,QAAQ,MAAA,GAAS,MAAA,CAAA;AAAA,MAC7D,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA;AAAA,MACjB,UAAA,EAAY,EAAE,MAAA,EAAQ,IAAA;AAAA,MACtB,KAAA,EAAO;AAAA,KACT,CAAE,CAAA;AAAA,IACF,GAAA,CAAI,KAAK,KAAA,CAAM,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAA2B;AAAA,MAC7D,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,IAAA,EAAM,EAAE,MAAA,IAAU,QAAA;AAAA,MAClB,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACZ,CAAE;AAAA,GACJ;AACF;AAEO,SAAS,kBAAkB,IAAA,EAAoB;AACpD,EAAA,iBAAA,EAAkB,CAAE,SAAS,IAAI,CAAA;AACnC;AAQO,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAQ,QAAA,EAAU,UAAS,EAA0B;AACtF,EAAA,MAAM,QAAA,GAAWA,eAAAA,CAAM,WAAA,CAAY,CAAC,IAAA,KAA2B;AAC7D,IAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAClB,IAAA,iBAAA,CAAkB,GAAG,YAAY,CAAA,CAAA,EAAI,mBAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,GAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAO,MAAA,EAC7B,QAAA,kBAAA,GAAA;AAAA,IAAC,wBAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,eAAe,MAAA,CAAO,YAAA;AAAA,MACtB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,UAAA,EAAY,QAAA;AAAA,MACZ,WAAW,MAAA,CAAO,SAAA;AAAA,MAEjB;AAAA;AAAA,GACH,EACF,CAAA;AAEJ","file":"chunk-YVLQV4N7.js","sourcesContent":["import * as React from 'react'\n\n// ---------------------------------------------------------------------------\n// \"Last viewed\" for the report list.\n//\n// A catalogue of eighty reports sorted alphabetically is a filing cabinet; the\n// three a merchant actually opens each Monday are what they came for. This is\n// per-browser rather than per-tenant on purpose — it is a convenience ordering,\n// not a business fact, and it should not cost a write to the database on every\n// report a user glances at.\n// ---------------------------------------------------------------------------\n\nconst KEY = 'fayz.analytics.lastViewed'\n\ntype LastViewedMap = Record<string, string>\n\nfunction read(): LastViewedMap {\n if (typeof window === 'undefined') return {}\n try {\n const raw = window.localStorage.getItem(KEY)\n return raw ? (JSON.parse(raw) as LastViewedMap) : {}\n } catch {\n return {}\n }\n}\n\nfunction write(map: LastViewedMap): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(KEY, JSON.stringify(map))\n } catch {\n /* quota or private mode — losing this costs an ordering, not data */\n }\n}\n\nconst listeners = new Set<(map: LastViewedMap) => void>()\n\nexport function markViewed(cardId: string): void {\n const next = { ...read(), [cardId]: new Date().toISOString() }\n write(next)\n for (const listener of listeners) listener(next)\n}\n\nexport function useLastViewed(): LastViewedMap {\n const [map, setMap] = React.useState<LastViewedMap>(() => read())\n React.useEffect(() => {\n listeners.add(setMap)\n return () => { listeners.delete(setMap) }\n }, [])\n return map\n}\n","import * as React from 'react'\nimport type {\n AnalyticsCardDef, AnalyticsDimension, AnalyticsMeasure, AnalyticsVizType,\n} from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// What the user decided about the report catalogue.\n//\n// The catalogue itself is code: an app declares its cards, a plugin contributes\n// the ones it owns the data for. This file is the LAYER ON TOP — which of them\n// this user wants on the overview, in what order, showing which columns, plus\n// the reports they built themselves. Nothing here edits a shipped definition;\n// it records an override next to it, so an app update still moves the base\n// card and the user's choices survive it.\n//\n// A CUSTOM REPORT IS NOT A FREE-FORM QUERY. It stores a base card id plus the\n// dimensions and measures picked from that source's field palette. That is a\n// deliberate ceiling: a user cannot invent a data source, and a builder that\n// pretends otherwise produces reports that fail at read time. What they CAN do\n// is ask a different question of a source the app already exposes — which is\n// what \"quero esse relatório quebrado por praça\" actually means.\n//\n// Per-browser (localStorage), like `lastViewed`. Moving it to the tenant is a\n// swap of read/write below plus a table; every caller reads through the hook.\n// ---------------------------------------------------------------------------\n\nconst KEY = 'fayz.analytics.prefs'\n\nexport interface AnalyticsCardPref {\n /** Drop from the catalogue entirely — a built-in this tenant does not use. */\n hidden?: boolean\n /** Force onto (true) or off (false) the overview, whatever the card declares. */\n pinned?: boolean\n /** Position on the overview grid. */\n order?: number\n /** Tile width, in grid columns. */\n span?: 1 | 2 | 3 | 4\n /** Rename — the vocabulary of the house beats the vocabulary of the plugin. */\n name?: string\n /** Chart type override. */\n viz?: AnalyticsVizType\n /** Measure keys to keep. Absent = all. Ratio operands are always kept. */\n measures?: string[]\n /** Visible dimension keys to keep. Absent = all. Hidden ones always survive. */\n dimensions?: string[]\n}\n\nexport interface CustomReport {\n id: string\n name: string\n description?: string\n category: string\n icon?: string\n /** Shown in the list's \"Created by\" column — the house, not the product. */\n createdBy?: string\n /** The card whose data source this report reads. */\n baseId: string\n dimensions: string[]\n measures: string[]\n viz: AnalyticsVizType\n createdAt: string\n}\n\nexport interface AnalyticsPrefs {\n version: 1\n cards: Record<string, AnalyticsCardPref>\n custom: CustomReport[]\n}\n\nconst EMPTY: AnalyticsPrefs = { version: 1, cards: {}, custom: [] }\n\nfunction read(): AnalyticsPrefs {\n if (typeof window === 'undefined') return EMPTY\n try {\n const raw = window.localStorage.getItem(KEY)\n if (!raw) return EMPTY\n const parsed = JSON.parse(raw) as Partial<AnalyticsPrefs>\n return {\n version: 1,\n cards: parsed.cards && typeof parsed.cards === 'object' ? parsed.cards : {},\n custom: Array.isArray(parsed.custom) ? parsed.custom : [],\n }\n } catch {\n return EMPTY\n }\n}\n\nfunction write(prefs: AnalyticsPrefs): void {\n if (typeof window === 'undefined') return\n try {\n const empty = Object.keys(prefs.cards).length === 0 && prefs.custom.length === 0\n if (empty) window.localStorage.removeItem(KEY)\n else window.localStorage.setItem(KEY, JSON.stringify(prefs))\n } catch {\n /* quota / private mode */\n }\n}\n\nconst listeners = new Set<(prefs: AnalyticsPrefs) => void>()\n\nfunction publish(next: AnalyticsPrefs): void {\n write(next)\n for (const listener of listeners) listener(next)\n}\n\n/** Read the saved preferences and re-render when any surface changes them. */\nexport function useAnalyticsPrefs(): AnalyticsPrefs {\n const [prefs, setPrefs] = React.useState<AnalyticsPrefs>(() => read())\n React.useEffect(() => {\n listeners.add(setPrefs)\n return () => { listeners.delete(setPrefs) }\n }, [])\n return prefs\n}\n\n// --- mutations -------------------------------------------------------------\n\nexport function setCardPref(cardId: string, patch: AnalyticsCardPref): void {\n const current = read()\n const merged = { ...current.cards[cardId], ...patch }\n // A pref that says nothing is not a pref: drop the entry so a later app\n // update can move the base card freely.\n const meaningful = Object.entries(merged).filter(([, v]) => v !== undefined && v !== null)\n const cards = { ...current.cards }\n if (meaningful.length === 0) delete cards[cardId]\n else cards[cardId] = Object.fromEntries(meaningful) as AnalyticsCardPref\n publish({ ...current, cards })\n}\n\nexport function clearCardPref(cardId: string): void {\n const current = read()\n const cards = { ...current.cards }\n delete cards[cardId]\n publish({ ...current, cards })\n}\n\n/** Persist the overview order for the ids given, in the order given. */\nexport function setOverviewOrder(ids: string[]): void {\n const current = read()\n const cards = { ...current.cards }\n ids.forEach((id, index) => {\n cards[id] = { ...cards[id], order: index, pinned: cards[id]?.pinned ?? true }\n })\n publish({ ...current, cards })\n}\n\nexport function saveCustomReport(report: CustomReport): void {\n const current = read()\n const custom = current.custom.some((r) => r.id === report.id)\n ? current.custom.map((r) => (r.id === report.id ? report : r))\n : [...current.custom, report]\n publish({ ...current, custom })\n}\n\nexport function deleteCustomReport(id: string): void {\n const current = read()\n const cards = { ...current.cards }\n delete cards[id]\n publish({ ...current, cards, custom: current.custom.filter((r) => r.id !== id) })\n}\n\nexport function resetAnalyticsPrefs(): void {\n publish({ ...EMPTY })\n}\n\n// --- resolution ------------------------------------------------------------\n\n/**\n * Which cards read the same rows.\n *\n * A view or an RPC is named, so its name IS the identity. A function source has\n * no name the outside can see, so the card's declared `grain` stands in — two\n * cards at order grain over the same app function answer about the same rows,\n * and that is exactly the set whose fields can be mixed in one report. A card\n * with neither falls back to its own id: alone in its group, which is the safe\n * answer when nothing says otherwise.\n */\nexport function sourceKey(card: AnalyticsCardDef): string {\n const source = card.query.source\n if (source.kind === 'fn') return card.grain ? `fn:${card.grain}` : `fn:${card.id}`\n return `${source.kind}:${source.name ?? card.id}`\n}\n\nexport interface FieldPalette {\n dimensions: AnalyticsDimension[]\n measures: AnalyticsMeasure[]\n}\n\nexport interface AnalyticsSourceGroup extends FieldPalette {\n key: string\n /** A real card over this source — what a new report inherits its query from. */\n base: AnalyticsCardDef\n label: string\n}\n\n/**\n * The distinct data sources behind a catalogue, each with everything askable of\n * it.\n *\n * The builder offers THESE, not the seventeen cards: six of them read the same\n * order rows, and a source picker listing all six asks the user to choose\n * between six spellings of one answer. Sources with nothing to aggregate are\n * left out — a detail listing has no measures, and a report with no measure is\n * a table of raw rows the user already has.\n */\nexport function analyticsSources(pool: AnalyticsCardDef[]): AnalyticsSourceGroup[] {\n const groups = new Map<string, AnalyticsCardDef[]>()\n for (const card of pool) {\n const key = sourceKey(card)\n const list = groups.get(key)\n if (list) list.push(card)\n else groups.set(key, [card])\n }\n const out: AnalyticsSourceGroup[] = []\n for (const [key, cards] of groups) {\n const base = cards.find((c) => (c.query.measures?.length ?? 0) > 0)\n if (!base) continue\n const palette = fieldPalette(pool, base)\n if (palette.measures.length === 0) continue\n out.push({ key, base, label: base.name, ...palette })\n }\n return out\n}\n\n/** Every field any card offers over the same source, de-duplicated by key. */\nexport function fieldPalette(pool: AnalyticsCardDef[], base: AnalyticsCardDef): FieldPalette {\n const key = sourceKey(base)\n const dimensions = new Map<string, AnalyticsDimension>()\n const measures = new Map<string, AnalyticsMeasure>()\n for (const card of pool) {\n if (sourceKey(card) !== key) continue\n for (const d of card.query.dimensions ?? []) {\n if (!d.hidden && !dimensions.has(d.key)) dimensions.set(d.key, d)\n }\n for (const m of card.query.measures ?? []) {\n if (!measures.has(m.key)) measures.set(m.key, m)\n }\n }\n return { dimensions: [...dimensions.values()], measures: [...measures.values()] }\n}\n\n/** Ratio measures are computed from two others; keeping one without its\n * operands leaves the card dividing by a number nobody fetched. */\nfunction withRatioOperands(kept: string[], all: AnalyticsMeasure[]): Set<string> {\n const set = new Set(kept)\n for (const key of kept) {\n const measure = all.find((m) => m.key === key)\n for (const operand of measure?.ratioOf ?? []) set.add(operand)\n }\n return set\n}\n\nfunction applyPref(card: AnalyticsCardDef, pref: AnalyticsCardPref | undefined): AnalyticsCardDef {\n if (!pref) return card\n const next: AnalyticsCardDef = { ...card, query: { ...card.query }, viz: { ...card.viz } }\n\n if (pref.name) next.name = pref.name\n if (pref.viz) next.viz.type = pref.viz\n\n if (pref.measures?.length) {\n const all = card.query.measures ?? []\n const keep = withRatioOperands(pref.measures, all)\n next.query.measures = all.filter((m) => keep.has(m.key))\n // The tile's own measure pick has to stay inside what the query still\n // fetches, or a KPI ends up pointing at a column that no longer exists.\n if (card.viz.measures?.length) {\n next.viz.measures = card.viz.measures.filter((k) => keep.has(k))\n }\n }\n\n if (pref.dimensions?.length) {\n const keep = new Set(pref.dimensions)\n // Hidden dimensions survive on purpose: they carry ids and sort keys, and\n // dropping one turns a chronological axis into an alphabetical one.\n next.query.dimensions = (card.query.dimensions ?? []).filter((d) => d.hidden || keep.has(d.key))\n }\n\n const placed = pref.pinned ?? Boolean(card.dashboard && card.dashboard.defaultVisible !== false)\n if (!placed) {\n next.dashboard = undefined\n } else {\n next.dashboard = {\n ...card.dashboard,\n defaultVisible: true,\n order: pref.order ?? card.dashboard?.order ?? 999,\n span: pref.span ?? card.dashboard?.span,\n }\n }\n\n return next\n}\n\n/** A stored custom report, rebuilt against the catalogue it derives from. */\nexport function resolveCustomReport(\n report: CustomReport,\n pool: AnalyticsCardDef[],\n): AnalyticsCardDef | null {\n const base = pool.find((c) => c.id === report.baseId)\n if (!base) return null\n\n const palette = fieldPalette(pool, base)\n const dimensions = report.dimensions\n .map((key) => palette.dimensions.find((d) => d.key === key))\n .filter((d): d is AnalyticsDimension => Boolean(d))\n const keep = withRatioOperands(report.measures, palette.measures)\n const measures = palette.measures.filter((m) => keep.has(m.key))\n\n return {\n id: report.id,\n name: report.name,\n description: report.description,\n icon: report.icon ?? 'FileText',\n category: report.category,\n createdBy: report.createdBy,\n grain: base.grain,\n available: base.available,\n compare: base.compare,\n permission: base.permission,\n query: {\n source: base.query.source,\n dateColumn: base.query.dateColumn,\n dimensions,\n measures,\n filters: base.query.filters,\n defaultSort: report.measures[0] ?? dimensions[0]?.key,\n defaultSortDir: 'desc',\n },\n viz: { type: report.viz },\n }\n}\n\n/**\n * The catalogue as this user sees it: overrides applied, their own reports\n * appended, the ones they removed gone.\n */\nexport function resolveCards(catalogue: AnalyticsCardDef[], prefs: AnalyticsPrefs): AnalyticsCardDef[] {\n const custom = prefs.custom\n .map((report) => resolveCustomReport(report, catalogue))\n .filter((c): c is AnalyticsCardDef => Boolean(c))\n return [...catalogue, ...custom]\n .filter((card) => !prefs.cards[card.id]?.hidden)\n .map((card) => applyPref(card, prefs.cards[card.id]))\n}\n","import React from 'react'\nimport {\n usePluginRuntime, getAnalyticsCards, hashRouterAdapter,\n type AnalyticsCardDef, type AnalyticsProvider as AnalyticsProviderType, type AnalyticsColumnDef,\n type AnalyticsCompare, type AgentRole,\n} from '@fayz-ai/core'\nimport { AnalyticsContextProvider, type AnalyticsRangePreset } from '@fayz-ai/ui'\nimport { markViewed } from '../lib/lastViewed'\nimport { resolveCards, useAnalyticsPrefs } from '../lib/preferences'\n\n// ---------------------------------------------------------------------------\n// The surface every analytics page mounts inside.\n//\n// Cards arrive from two places and are merged here: the plugins that own the\n// data contribute them through the runtime registry (`analyticsCards` on the\n// manifest), and the host app adds or overrides via options. Registry first,\n// app last — an app curating its own pack must be able to win.\n// ---------------------------------------------------------------------------\n\nexport const ANALYTICS_BASE = '/analytics'\nexport const REPORTS_BASE = `${ANALYTICS_BASE}/reports`\nexport const SETTINGS_ROUTE = `${ANALYTICS_BASE}/settings`\n\nexport interface AnalyticsLabels {\n analytics: string\n reports: string\n liveView: string\n /** Rail entry for the card grid. Falls back to the `reports.overview` key. */\n overview?: string\n /** Rail entry for the customisation screen. Falls back to the locale key. */\n settings?: string\n overviewSubtitle: string\n reportsSubtitle: string\n searchReports: string\n category: string\n createdBy: string\n /** Cleared state of each facet chip: \"All categories\" / \"All authors\". */\n allCategories: string\n allCreatedBy: string\n lastViewed: string\n name: string\n noResults: string\n never: string\n back: string\n export: string\n print: string\n unavailableTitle: string\n unavailableDescription: string\n emptyOverviewTitle: string\n emptyOverviewDescription: string\n liveViewSoon: string\n results: string\n}\n\n/** How the assistant introduces itself on the analytics screens. Every field is\n * optional: what is not set falls back to the plugin's own locale strings. */\nexport interface AnalyticsAssistantConfig {\n /** Which colleague reads the numbers here. Defaults to the plugin's own\n * (`growth`) — an app whose analytics are a finance conversation says so. */\n role?: AgentRole\n /** Names the task here — \"Growth Analyst\". */\n persona?: string\n /** Hero headline. `{{name}}` resolves to the signed-in user's first name. */\n headline?: string\n pitch?: string\n description?: string\n placeholder?: string\n suggestions?: { label: string; prompt?: string }[]\n /** `true` opens on the hero takeover. Default FALSE here, unlike the shell's:\n * the analytics home is a page of numbers, and a full-column invitation over\n * them hides the very thing the user navigated to. The composer docks at the\n * bottom instead — the assistant is offered, the metrics stay readable. */\n auto?: boolean\n}\n\nexport interface ResolvedAnalyticsConfig {\n /** Cards declared by the host app (merged with the plugin registry at render). */\n cards: AnalyticsCardDef[]\n labels: AnalyticsLabels\n currency: { code: string; locale: string; symbol: string }\n /** Attribution for pre-built cards — the product name, e.g. \"FayzShop\". */\n createdBy: string\n defaultPageSize: number\n showHeader: boolean\n /** Range the surface opens on. A salon reads 30 days; a school reads a term. */\n defaultRange: AnalyticsRangePreset\n defaultCompare: AnalyticsCompare\n /** Whether the Live View entry appears in the module rail. */\n showLiveView: boolean\n /** `null` mounts no invite — the screen opens on its numbers, not on a\n * conversation. Otherwise: the overrides, over the locale defaults. */\n assistant: AnalyticsAssistantConfig | null\n}\n\nconst ConfigContext = React.createContext<ResolvedAnalyticsConfig | null>(null)\n\nexport function useAnalyticsConfig(): ResolvedAnalyticsConfig {\n const ctx = React.useContext(ConfigContext)\n if (!ctx) throw new Error('useAnalyticsConfig must be used inside <AnalyticsSurface>')\n return ctx\n}\n\n/**\n * The catalogue AS SHIPPED — registry + app, de-duplicated by id, with no user\n * overrides applied.\n *\n * The app's own definition wins a collision so a host can retune a card the\n * plugin shipped (relabel it, move it off the overview) without forking the\n * plugin — the alternative is apps carrying patched copies of plugin cards.\n *\n * Only the settings screen wants this: it has to show what the defaults ARE in\n * order to offer a way back to them. Everything else reads `useAnalyticsCards`.\n */\nexport function useAnalyticsCatalogue(): AnalyticsCardDef[] {\n const runtime = usePluginRuntime()\n const { cards, createdBy } = useAnalyticsConfig()\n return React.useMemo(() => {\n const byId = new Map<string, AnalyticsCardDef>()\n for (const card of getAnalyticsCards(runtime)) byId.set(card.id, card)\n for (const card of cards) byId.set(card.id, card)\n return [...byId.values()].map((c) => (c.createdBy ? c : { ...c, createdBy }))\n }, [runtime, cards, createdBy])\n}\n\n/**\n * Every card visible on this surface, with the user's own layer applied:\n * their order, their columns, their reports, minus what they removed.\n *\n * The overview, the rail, the list and the viewer all read THIS — a preference\n * that only the grid honoured would rename a card in one place and not the\n * other, which is how a \"customisable\" screen becomes two screens.\n */\nexport function useAnalyticsCards(): AnalyticsCardDef[] {\n const catalogue = useAnalyticsCatalogue()\n const prefs = useAnalyticsPrefs()\n return React.useMemo(() => resolveCards(catalogue, prefs), [catalogue, prefs])\n}\n\n/** Cards a pack placed on the overview grid, in their declared order. */\nexport function useOverviewCards(): AnalyticsCardDef[] {\n const all = useAnalyticsCards()\n return React.useMemo(\n () => all\n .filter((c) => c.dashboard && c.dashboard.defaultVisible !== false)\n .sort((a, b) => (a.dashboard?.order ?? 0) - (b.dashboard?.order ?? 0)),\n [all],\n )\n}\n\n/**\n * Columns for a card's tabular view.\n *\n * An aggregate card has no `columns` of its own — its table IS its dimensions\n * and measures, so deriving them keeps one definition instead of asking every\n * card author to restate the same fields twice and let the two drift.\n */\nexport function cardColumns(card: AnalyticsCardDef): AnalyticsColumnDef[] {\n if (card.columns?.length) return card.columns\n return [\n // A hidden dimension is group-by only — the id a person column reads from,\n // never a column of UUIDs next to the name it belongs to.\n ...(card.query.dimensions ?? []).filter((d) => !d.hidden).map((d): AnalyticsColumnDef => ({\n key: d.key,\n label: d.label,\n type: d.person ? 'person' : (d.format ?? (d.grain ? 'date' : 'text')),\n idKey: d.person?.idKey,\n personKind: d.person?.kind,\n align: 'left',\n })),\n ...(card.query.measures ?? []).map((m): AnalyticsColumnDef => ({\n key: m.key,\n label: m.label,\n type: m.format ?? 'number',\n align: 'right',\n sortable: true,\n })),\n ]\n}\n\nexport function navigateAnalytics(path: string): void {\n hashRouterAdapter().navigate(path)\n}\n\nexport interface AnalyticsSurfaceProps {\n config: ResolvedAnalyticsConfig\n provider: AnalyticsProviderType\n children?: React.ReactNode\n}\n\nexport function AnalyticsSurface({ config, provider, children }: AnalyticsSurfaceProps) {\n const openCard = React.useCallback((card: AnalyticsCardDef) => {\n markViewed(card.id)\n navigateAnalytics(`${REPORTS_BASE}/${encodeURIComponent(card.id)}`)\n }, [])\n\n return (\n <ConfigContext.Provider value={config}>\n <AnalyticsContextProvider\n provider={provider}\n currency={config.currency}\n defaultPreset={config.defaultRange}\n defaultCompare={config.defaultCompare}\n defaultPageSize={config.defaultPageSize}\n onOpenCard={openCard}\n createdBy={config.createdBy}\n >\n {children}\n </AnalyticsContextProvider>\n </ConfigContext.Provider>\n )\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReportPagination.d.ts","sourceRoot":"","sources":["../../src/components/ReportPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"ReportPagination.d.ts","sourceRoot":"","sources":["../../src/components/ReportPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,EAAE,qBAAqB,qBAwBhH"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAC/F,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAQvD,OAAO,EAEL,KAAK,eAAe,EAAgC,KAAK,wBAAwB,EAClF,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|