@rpcbase/server 0.594.0 → 0.595.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.
Files changed (61) hide show
  1. package/dist/convertHeifToWebp-BT1n72DQ.js +148 -0
  2. package/dist/convertHeifToWebp-BT1n72DQ.js.map +1 -0
  3. package/dist/email-Co1GNjlT.js +7204 -0
  4. package/dist/email-Co1GNjlT.js.map +1 -0
  5. package/dist/handler-BqlcQ9sE.js +245 -0
  6. package/dist/handler-BqlcQ9sE.js.map +1 -0
  7. package/dist/handler-C92_gJkX.js +743 -0
  8. package/dist/handler-C92_gJkX.js.map +1 -0
  9. package/dist/handler-CapJTGzc.js +795 -0
  10. package/dist/handler-CapJTGzc.js.map +1 -0
  11. package/dist/handler-Fk-5fOSm.js +119 -0
  12. package/dist/handler-Fk-5fOSm.js.map +1 -0
  13. package/dist/htmlTemplate.d.ts +16 -0
  14. package/dist/htmlTemplate.d.ts.map +1 -0
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +5140 -5286
  18. package/dist/index.js.map +1 -1
  19. package/dist/notifications.js +273 -382
  20. package/dist/notifications.js.map +1 -1
  21. package/dist/postProcessors-iffHvje4.js +89 -0
  22. package/dist/postProcessors-iffHvje4.js.map +1 -0
  23. package/dist/queryWindow-DP8zD0lb.js +555 -0
  24. package/dist/queryWindow-DP8zD0lb.js.map +1 -0
  25. package/dist/render_resend-B1SSQ4f7.js +7 -0
  26. package/dist/render_resend-B1SSQ4f7.js.map +1 -0
  27. package/dist/rts/index.js +990 -1207
  28. package/dist/rts/index.js.map +1 -1
  29. package/dist/schemas-B2fUvgYo.js +4151 -0
  30. package/dist/schemas-B2fUvgYo.js.map +1 -0
  31. package/dist/shared-DfrVDSp0.js +79 -0
  32. package/dist/shared-DfrVDSp0.js.map +1 -0
  33. package/dist/ssrMiddleware.d.ts +7 -3
  34. package/dist/ssrMiddleware.d.ts.map +1 -1
  35. package/dist/uploads/worker.js +139 -168
  36. package/dist/uploads/worker.js.map +1 -1
  37. package/dist/uploads.js +12 -22
  38. package/dist/uploads.js.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/convertHeifToWebp-C-DGXZ2k.js +0 -169
  41. package/dist/convertHeifToWebp-C-DGXZ2k.js.map +0 -1
  42. package/dist/email-BCf24GmK.js +0 -8071
  43. package/dist/email-BCf24GmK.js.map +0 -1
  44. package/dist/handler-BqoKvylN.js +0 -147
  45. package/dist/handler-BqoKvylN.js.map +0 -1
  46. package/dist/handler-CUOJ51-w.js +0 -903
  47. package/dist/handler-CUOJ51-w.js.map +0 -1
  48. package/dist/handler-D-XdgeG_.js +0 -986
  49. package/dist/handler-D-XdgeG_.js.map +0 -1
  50. package/dist/handler-F0gFTzvh.js +0 -275
  51. package/dist/handler-F0gFTzvh.js.map +0 -1
  52. package/dist/postProcessors-D27fGZP0.js +0 -107
  53. package/dist/postProcessors-D27fGZP0.js.map +0 -1
  54. package/dist/queryWindow-Cdr7K-S1.js +0 -714
  55. package/dist/queryWindow-Cdr7K-S1.js.map +0 -1
  56. package/dist/render_resend_false-MiC__Smr.js +0 -6
  57. package/dist/render_resend_false-MiC__Smr.js.map +0 -1
  58. package/dist/schemas-Drf83ni9.js +0 -4517
  59. package/dist/schemas-Drf83ni9.js.map +0 -1
  60. package/dist/shared-CJrm9Wjp.js +0 -104
  61. package/dist/shared-CJrm9Wjp.js.map +0 -1
@@ -1,147 +0,0 @@
1
- import { models, ZRBRtsChangeOp } from "@rpcbase/db";
2
- import { buildAbilityFromSession } from "@rpcbase/db/acl";
3
- import { o as object, a as array, s as string, n as number, _ as _enum, b as boolean } from "./schemas-Drf83ni9.js";
4
- const Route = "/api/rb/rts/changes";
5
- const requestSchema = object({
6
- sinceSeq: number().int().min(0).default(0),
7
- limit: number().int().min(1).max(5e3).default(2e3),
8
- modelNames: array(string().min(1)).optional()
9
- });
10
- object({
11
- ok: boolean(),
12
- needsFullResync: boolean().optional(),
13
- earliestSeq: number().int().min(0).optional(),
14
- latestSeq: number().int().min(0),
15
- changes: array(object({
16
- seq: number().int().min(1),
17
- modelName: string().min(1),
18
- op: _enum(["delete", "reset_model"]),
19
- docId: string().optional()
20
- }))
21
- });
22
- const getTenantId = (ctx) => {
23
- const sessionTenantId = ctx.req.session?.user?.currentTenantId;
24
- if (typeof sessionTenantId === "string" && sessionTenantId.trim()) return sessionTenantId.trim();
25
- return null;
26
- };
27
- const ensureAuthorized = (ctx, tenantId) => {
28
- const userId = ctx.req.session?.user?.id;
29
- if (!userId) return null;
30
- const currentTenantId = ctx.req.session?.user?.currentTenantId;
31
- const normalizedCurrentTenantId = typeof currentTenantId === "string" ? currentTenantId.trim() : "";
32
- if (!normalizedCurrentTenantId || normalizedCurrentTenantId !== tenantId) return null;
33
- return userId;
34
- };
35
- const getModelCtx = (_ctx, tenantId) => ({
36
- req: {
37
- session: {
38
- user: {
39
- currentTenantId: tenantId
40
- }
41
- }
42
- }
43
- });
44
- const isRtsChangeRecord = (value) => {
45
- if (!value || typeof value !== "object") return false;
46
- const obj = value;
47
- const isOp = ZRBRtsChangeOp.safeParse(obj.op).success;
48
- return typeof obj.seq === "number" && typeof obj.modelName === "string" && isOp;
49
- };
50
- const changesHandler = async (payload, ctx) => {
51
- const parsed = requestSchema.safeParse(payload ?? {});
52
- if (!parsed.success) {
53
- ctx.res.status(400);
54
- return {
55
- ok: false,
56
- latestSeq: 0,
57
- changes: []
58
- };
59
- }
60
- const tenantId = getTenantId(ctx);
61
- if (!tenantId) {
62
- ctx.res.status(400);
63
- return {
64
- ok: false,
65
- latestSeq: 0,
66
- changes: []
67
- };
68
- }
69
- const userId = ensureAuthorized(ctx, tenantId);
70
- if (!userId) {
71
- ctx.res.status(401);
72
- return {
73
- ok: false,
74
- latestSeq: 0,
75
- changes: []
76
- };
77
- }
78
- const ability = buildAbilityFromSession({
79
- tenantId,
80
- session: ctx.req.session
81
- });
82
- const modelCtx = getModelCtx(ctx, tenantId);
83
- const [RtsChange, RtsCounter] = await Promise.all([models.get("RBRtsChange", modelCtx), models.get("RBRtsCounter", modelCtx)]);
84
- const counter = await RtsCounter.findOne({
85
- _id: "rts"
86
- }, {
87
- seq: 1
88
- }).lean();
89
- const latestSeq = Number(counter?.seq ?? 0) || 0;
90
- const {
91
- sinceSeq,
92
- limit,
93
- modelNames
94
- } = parsed.data;
95
- const requestedModelNames = Array.isArray(modelNames) && modelNames.length ? modelNames.map((m) => String(m)).filter(Boolean) : null;
96
- const allowedModelNames = requestedModelNames ? requestedModelNames.filter((m) => ability.can("read", m)) : Array.from(new Set((await RtsChange.distinct("modelName")).map((m) => String(m)).filter(Boolean).filter((m) => ability.can("read", m))));
97
- let earliestSeq;
98
- if (allowedModelNames.length) {
99
- const earliest = await RtsChange.findOne({
100
- modelName: {
101
- $in: allowedModelNames
102
- }
103
- }, {
104
- seq: 1
105
- }).sort({
106
- seq: 1
107
- }).lean();
108
- earliestSeq = earliest?.seq ? Number(earliest.seq) : void 0;
109
- }
110
- const needsFullResync = typeof earliestSeq === "number" && sinceSeq < earliestSeq - 1;
111
- const selector = {
112
- seq: {
113
- $gt: sinceSeq
114
- },
115
- modelName: {
116
- $in: allowedModelNames
117
- }
118
- };
119
- const changes = await RtsChange.find(selector, {
120
- _id: 0,
121
- seq: 1,
122
- modelName: 1,
123
- op: 1,
124
- docId: 1
125
- }).sort({
126
- seq: 1
127
- }).limit(limit).lean();
128
- return {
129
- ok: true,
130
- needsFullResync: needsFullResync || void 0,
131
- earliestSeq,
132
- latestSeq,
133
- changes: Array.isArray(changes) ? changes.filter(isRtsChangeRecord).filter((c) => ability.can("read", c.modelName)).map((c) => ({
134
- seq: Number(c.seq),
135
- modelName: String(c.modelName),
136
- op: c.op,
137
- docId: c.docId ? String(c.docId) : void 0
138
- })) : []
139
- };
140
- };
141
- const handler = (api) => {
142
- api.post(Route, changesHandler);
143
- };
144
- export {
145
- handler as default
146
- };
147
- //# sourceMappingURL=handler-BqoKvylN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handler-BqoKvylN.js","sources":["../src/rts/api/changes/index.ts","../src/rts/api/changes/handler.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const Route = \"/api/rb/rts/changes\"\n\nexport const requestSchema = z.object({\n sinceSeq: z.number().int().min(0).default(0),\n limit: z.number().int().min(1).max(5000).default(2000),\n modelNames: z.array(z.string().min(1)).optional(),\n})\n\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const responseSchema = z.object({\n ok: z.boolean(),\n needsFullResync: z.boolean().optional(),\n earliestSeq: z.number().int().min(0).optional(),\n latestSeq: z.number().int().min(0),\n changes: z.array(z.object({\n seq: z.number().int().min(1),\n modelName: z.string().min(1),\n op: z.enum([\"delete\", \"reset_model\"]),\n docId: z.string().optional(),\n })),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n\n","import { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models, ZRBRtsChangeOp, type IRBRtsChange, type IRBRtsCounter, type LoadModelCtx } from \"@rpcbase/db\"\nimport { buildAbilityFromSession, type AclSubjectType } from \"@rpcbase/db/acl\"\nimport type { Model } from \"mongoose\"\n\nimport * as Changes from \"./index\"\n\n\ntype SessionUser = {\n id?: string\n currentTenantId?: string\n signedInTenants?: string[]\n}\n\ntype RtsCounterDoc = IRBRtsCounter\ntype RtsChangeDoc = IRBRtsChange\n\nconst getTenantId = (ctx: Ctx<SessionUser>): string | null => {\n const sessionTenantId = ctx.req.session?.user?.currentTenantId\n if (typeof sessionTenantId === \"string\" && sessionTenantId.trim()) return sessionTenantId.trim()\n\n return null\n}\n\nconst ensureAuthorized = (ctx: Ctx<SessionUser>, tenantId: string): string | null => {\n const userId = ctx.req.session?.user?.id\n if (!userId) return null\n\n const currentTenantId = ctx.req.session?.user?.currentTenantId\n const normalizedCurrentTenantId = typeof currentTenantId === \"string\" ? currentTenantId.trim() : \"\"\n\n if (!normalizedCurrentTenantId || normalizedCurrentTenantId !== tenantId) return null\n return userId\n}\n\nconst getModelCtx = (_ctx: Ctx<SessionUser>, tenantId: string): LoadModelCtx => ({\n req: {\n session: {\n user: {\n currentTenantId: tenantId,\n },\n },\n },\n})\n\nconst isRtsChangeRecord = (value: unknown): value is RtsChangeDoc => {\n if (!value || typeof value !== \"object\") return false\n const obj = value as Partial<RtsChangeDoc>\n const isOp = ZRBRtsChangeOp.safeParse(obj.op).success\n return typeof obj.seq === \"number\" && typeof obj.modelName === \"string\" && isOp\n}\n\nconst changesHandler: ApiHandler<Changes.RequestPayload, Changes.ResponsePayload, SessionUser> = async(\n payload,\n ctx,\n): Promise<Changes.ResponsePayload> => {\n const parsed = Changes.requestSchema.safeParse(payload ?? {})\n if (!parsed.success) {\n ctx.res.status(400)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const tenantId = getTenantId(ctx)\n if (!tenantId) {\n ctx.res.status(400)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const userId = ensureAuthorized(ctx, tenantId)\n if (!userId) {\n ctx.res.status(401)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const ability = buildAbilityFromSession({ tenantId, session: ctx.req.session })\n\n const modelCtx = getModelCtx(ctx, tenantId)\n\n const [RtsChange, RtsCounter] = await Promise.all([\n models.get(\"RBRtsChange\", modelCtx) as Promise<Model<RtsChangeDoc>>,\n models.get(\"RBRtsCounter\", modelCtx) as Promise<Model<RtsCounterDoc>>,\n ])\n\n const counter = await RtsCounter.findOne({ _id: \"rts\" }, { seq: 1 }).lean()\n const latestSeq = Number(counter?.seq ?? 0) || 0\n\n const { sinceSeq, limit, modelNames } = parsed.data\n\n const requestedModelNames = Array.isArray(modelNames) && modelNames.length\n ? modelNames.map((m) => String(m)).filter(Boolean)\n : null\n\n const allowedModelNames = requestedModelNames\n ? requestedModelNames.filter((m) => ability.can(\"read\", m as AclSubjectType))\n : Array.from(\n new Set(\n (await RtsChange.distinct(\"modelName\"))\n .map((m) => String(m))\n .filter(Boolean)\n .filter((m) => ability.can(\"read\", m as AclSubjectType)),\n ),\n )\n\n let earliestSeq: number | undefined\n if (allowedModelNames.length) {\n const earliest = await RtsChange.findOne({ modelName: { $in: allowedModelNames } }, { seq: 1 }).sort({ seq: 1 }).lean()\n earliestSeq = earliest?.seq ? Number(earliest.seq) : undefined\n }\n\n const needsFullResync = typeof earliestSeq === \"number\" && sinceSeq < earliestSeq - 1\n\n const selector: Record<string, unknown> = { seq: { $gt: sinceSeq }, modelName: { $in: allowedModelNames } }\n\n const changes = await RtsChange\n .find(selector, { _id: 0, seq: 1, modelName: 1, op: 1, docId: 1 })\n .sort({ seq: 1 })\n .limit(limit)\n .lean()\n\n return {\n ok: true,\n needsFullResync: needsFullResync || undefined,\n earliestSeq,\n latestSeq,\n changes: Array.isArray(changes)\n ? changes\n .filter(isRtsChangeRecord)\n .filter((c) => ability.can(\"read\", c.modelName as AclSubjectType))\n .map((c) => ({\n seq: Number(c.seq),\n modelName: String(c.modelName),\n op: c.op,\n docId: c.docId ? String(c.docId) : undefined,\n }))\n : [],\n }\n}\n\nexport default (api: Api<SessionUser>) => {\n api.post(Changes.Route, changesHandler)\n}\n"],"names":["Route","requestSchema","z","sinceSeq","number","int","min","default","limit","max","modelNames","string","optional","ok","boolean","needsFullResync","earliestSeq","latestSeq","changes","seq","modelName","op","docId","getTenantId","ctx","sessionTenantId","req","session","user","currentTenantId","trim","ensureAuthorized","tenantId","userId","id","normalizedCurrentTenantId","getModelCtx","_ctx","isRtsChangeRecord","value","obj","isOp","ZRBRtsChangeOp","safeParse","success","changesHandler","payload","parsed","Changes","res","status","ability","buildAbilityFromSession","modelCtx","RtsChange","RtsCounter","Promise","all","models","get","counter","findOne","_id","lean","Number","data","requestedModelNames","Array","isArray","length","map","m","String","filter","Boolean","allowedModelNames","can","from","Set","distinct","earliest","$in","sort","undefined","selector","$gt","find","c","api","post"],"mappings":";;;AAGO,MAAMA,QAAQ;AAEd,MAAMC,gBAAgBC,OAAS;AAAA,EACpCC,UAAUD,OAAEE,EAASC,IAAAA,EAAMC,IAAI,CAAC,EAAEC,QAAQ,CAAC;AAAA,EAC3CC,OAAON,OAAEE,EAASC,IAAAA,EAAMC,IAAI,CAAC,EAAEG,IAAI,GAAI,EAAEF,QAAQ,GAAI;AAAA,EACrDG,YAAYR,MAAQA,OAAES,EAASL,IAAI,CAAC,CAAC,EAAEM,SAAAA;AACzC,CAAC;AAI6BV,OAAS;AAAA,EACrCW,IAAIX,QAAEY;AAAAA,EACNC,iBAAiBb,QAAEY,EAAUF,SAAAA;AAAAA,EAC7BI,aAAad,OAAEE,EAASC,MAAMC,IAAI,CAAC,EAAEM,SAAAA;AAAAA,EACrCK,WAAWf,OAAEE,EAASC,IAAAA,EAAMC,IAAI,CAAC;AAAA,EACjCY,SAAShB,MAAQA,OAAS;AAAA,IACxBiB,KAAKjB,OAAEE,EAASC,IAAAA,EAAMC,IAAI,CAAC;AAAA,IAC3Bc,WAAWlB,OAAES,EAASL,IAAI,CAAC;AAAA,IAC3Be,IAAInB,MAAO,CAAC,UAAU,aAAa,CAAC;AAAA,IACpCoB,OAAOpB,OAAES,EAASC,SAAAA;AAAAA,EAAS,CAC5B,CAAC;AACJ,CAAC;ACPD,MAAMW,cAAcA,CAACC,QAAyC;AAC5D,QAAMC,kBAAkBD,IAAIE,IAAIC,SAASC,MAAMC;AAC/C,MAAI,OAAOJ,oBAAoB,YAAYA,gBAAgBK,OAAQ,QAAOL,gBAAgBK,KAAAA;AAE1F,SAAO;AACT;AAEA,MAAMC,mBAAmBA,CAACP,KAAuBQ,aAAoC;AACnF,QAAMC,SAAST,IAAIE,IAAIC,SAASC,MAAMM;AACtC,MAAI,CAACD,OAAQ,QAAO;AAEpB,QAAMJ,kBAAkBL,IAAIE,IAAIC,SAASC,MAAMC;AAC/C,QAAMM,4BAA4B,OAAON,oBAAoB,WAAWA,gBAAgBC,SAAS;AAEjG,MAAI,CAACK,6BAA6BA,8BAA8BH,SAAU,QAAO;AACjF,SAAOC;AACT;AAEA,MAAMG,cAAcA,CAACC,MAAwBL,cAAoC;AAAA,EAC/EN,KAAK;AAAA,IACHC,SAAS;AAAA,MACPC,MAAM;AAAA,QACJC,iBAAiBG;AAAAA,MAAAA;AAAAA,IACnB;AAAA,EACF;AAEJ;AAEA,MAAMM,oBAAoBA,CAACC,UAA0C;AACnE,MAAI,CAACA,SAAS,OAAOA,UAAU,SAAU,QAAO;AAChD,QAAMC,MAAMD;AACZ,QAAME,OAAOC,eAAeC,UAAUH,IAAInB,EAAE,EAAEuB;AAC9C,SAAO,OAAOJ,IAAIrB,QAAQ,YAAY,OAAOqB,IAAIpB,cAAc,YAAYqB;AAC7E;AAEA,MAAMI,iBAA2F,OAC/FC,SACAtB,QACqC;AACrC,QAAMuB,SAASC,cAAsBL,UAAUG,WAAW,CAAA,CAAE;AAC5D,MAAI,CAACC,OAAOH,SAAS;AACnBpB,QAAIyB,IAAIC,OAAO,GAAG;AAClB,WAAO;AAAA,MAAErC,IAAI;AAAA,MAAOI,WAAW;AAAA,MAAGC,SAAS,CAAA;AAAA,IAAA;AAAA,EAC7C;AAEA,QAAMc,WAAWT,YAAYC,GAAG;AAChC,MAAI,CAACQ,UAAU;AACbR,QAAIyB,IAAIC,OAAO,GAAG;AAClB,WAAO;AAAA,MAAErC,IAAI;AAAA,MAAOI,WAAW;AAAA,MAAGC,SAAS,CAAA;AAAA,IAAA;AAAA,EAC7C;AAEA,QAAMe,SAASF,iBAAiBP,KAAKQ,QAAQ;AAC7C,MAAI,CAACC,QAAQ;AACXT,QAAIyB,IAAIC,OAAO,GAAG;AAClB,WAAO;AAAA,MAAErC,IAAI;AAAA,MAAOI,WAAW;AAAA,MAAGC,SAAS,CAAA;AAAA,IAAA;AAAA,EAC7C;AAEA,QAAMiC,UAAUC,wBAAwB;AAAA,IAAEpB;AAAAA,IAAUL,SAASH,IAAIE,IAAIC;AAAAA,EAAAA,CAAS;AAE9E,QAAM0B,WAAWjB,YAAYZ,KAAKQ,QAAQ;AAE1C,QAAM,CAACsB,WAAWC,UAAU,IAAI,MAAMC,QAAQC,IAAI,CAChDC,OAAOC,IAAI,eAAeN,QAAQ,GAClCK,OAAOC,IAAI,gBAAgBN,QAAQ,CAAkC,CACtE;AAED,QAAMO,UAAU,MAAML,WAAWM,QAAQ;AAAA,IAAEC,KAAK;AAAA,EAAA,GAAS;AAAA,IAAE3C,KAAK;AAAA,EAAA,CAAG,EAAE4C,KAAAA;AACrE,QAAM9C,YAAY+C,OAAOJ,SAASzC,OAAO,CAAC,KAAK;AAE/C,QAAM;AAAA,IAAEhB;AAAAA,IAAUK;AAAAA,IAAOE;AAAAA,EAAAA,IAAeqC,OAAOkB;AAE/C,QAAMC,sBAAsBC,MAAMC,QAAQ1D,UAAU,KAAKA,WAAW2D,SAChE3D,WAAW4D,IAAKC,CAAAA,MAAMC,OAAOD,CAAC,CAAC,EAAEE,OAAOC,OAAO,IAC/C;AAEJ,QAAMC,oBAAoBT,sBACtBA,oBAAoBO,OAAQF,CAAAA,MAAMpB,QAAQyB,IAAI,QAAQL,CAAmB,CAAC,IAC1EJ,MAAMU,KACN,IAAIC,KACD,MAAMxB,UAAUyB,SAAS,WAAW,GAClCT,IAAKC,CAAAA,MAAMC,OAAOD,CAAC,CAAC,EACpBE,OAAOC,OAAO,EACdD,OAAQF,OAAMpB,QAAQyB,IAAI,QAAQL,CAAmB,CAAC,CAC3D,CACF;AAEF,MAAIvD;AACJ,MAAI2D,kBAAkBN,QAAQ;AAC5B,UAAMW,WAAW,MAAM1B,UAAUO,QAAQ;AAAA,MAAEzC,WAAW;AAAA,QAAE6D,KAAKN;AAAAA,MAAAA;AAAAA,IAAkB,GAAK;AAAA,MAAExD,KAAK;AAAA,IAAA,CAAG,EAAE+D,KAAK;AAAA,MAAE/D,KAAK;AAAA,IAAA,CAAG,EAAE4C,KAAAA;AACjH/C,kBAAcgE,UAAU7D,MAAM6C,OAAOgB,SAAS7D,GAAG,IAAIgE;AAAAA,EACvD;AAEA,QAAMpE,kBAAkB,OAAOC,gBAAgB,YAAYb,WAAWa,cAAc;AAEpF,QAAMoE,WAAoC;AAAA,IAAEjE,KAAK;AAAA,MAAEkE,KAAKlF;AAAAA,IAAAA;AAAAA,IAAYiB,WAAW;AAAA,MAAE6D,KAAKN;AAAAA,IAAAA;AAAAA,EAAkB;AAExG,QAAMzD,UAAU,MAAMoC,UACnBgC,KAAKF,UAAU;AAAA,IAAEtB,KAAK;AAAA,IAAG3C,KAAK;AAAA,IAAGC,WAAW;AAAA,IAAGC,IAAI;AAAA,IAAGC,OAAO;AAAA,EAAA,CAAG,EAChE4D,KAAK;AAAA,IAAE/D,KAAK;AAAA,EAAA,CAAG,EACfX,MAAMA,KAAK,EACXuD,KAAAA;AAEH,SAAO;AAAA,IACLlD,IAAI;AAAA,IACJE,iBAAiBA,mBAAmBoE;AAAAA,IACpCnE;AAAAA,IACAC;AAAAA,IACAC,SAASiD,MAAMC,QAAQlD,OAAO,IAC1BA,QACCuD,OAAOnC,iBAAiB,EACxBmC,OAAQc,CAAAA,MAAMpC,QAAQyB,IAAI,QAAQW,EAAEnE,SAA2B,CAAC,EAChEkD,IAAKiB,CAAAA,OAAO;AAAA,MACXpE,KAAK6C,OAAOuB,EAAEpE,GAAG;AAAA,MACjBC,WAAWoD,OAAOe,EAAEnE,SAAS;AAAA,MAC7BC,IAAIkE,EAAElE;AAAAA,MACNC,OAAOiE,EAAEjE,QAAQkD,OAAOe,EAAEjE,KAAK,IAAI6D;AAAAA,IAAAA,EACnC,IACF,CAAA;AAAA,EAAA;AAER;AAEA,MAAA,UAAe,CAACK,QAA0B;AACxCA,MAAIC,KAAKzC,OAAeH,cAAc;AACxC;"}