@batterai/strapi-plugin-canvas 0.1.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 (152) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +16 -0
  3. package/README.md +131 -0
  4. package/dist/admin/appearance.d.ts +12 -0
  5. package/dist/admin/appearance.d.ts.map +1 -0
  6. package/dist/admin/appearance.js +44 -0
  7. package/dist/admin/appearance.js.map +1 -0
  8. package/dist/admin/block-packages.d.ts +4 -0
  9. package/dist/admin/block-packages.d.ts.map +1 -0
  10. package/dist/admin/block-packages.js +14 -0
  11. package/dist/admin/block-packages.js.map +1 -0
  12. package/dist/admin/client/content-model.d.ts +3 -0
  13. package/dist/admin/client/content-model.d.ts.map +1 -0
  14. package/dist/admin/client/content-model.js +76 -0
  15. package/dist/admin/client/content-model.js.map +1 -0
  16. package/dist/admin/client/host-services.d.ts +4 -0
  17. package/dist/admin/client/host-services.d.ts.map +1 -0
  18. package/dist/admin/client/host-services.js +141 -0
  19. package/dist/admin/client/host-services.js.map +1 -0
  20. package/dist/admin/index.d.ts +37 -0
  21. package/dist/admin/index.d.ts.map +1 -0
  22. package/dist/admin/index.js +34 -0
  23. package/dist/admin/index.js.map +1 -0
  24. package/dist/admin/pages/App.d.ts +4 -0
  25. package/dist/admin/pages/App.d.ts.map +1 -0
  26. package/dist/admin/pages/App.js +50 -0
  27. package/dist/admin/pages/App.js.map +1 -0
  28. package/dist/admin/translations.d.ts +4 -0
  29. package/dist/admin/translations.d.ts.map +1 -0
  30. package/dist/admin/translations.js +16 -0
  31. package/dist/admin/translations.js.map +1 -0
  32. package/dist/constants.d.ts +14 -0
  33. package/dist/constants.d.ts.map +1 -0
  34. package/dist/constants.js +18 -0
  35. package/dist/constants.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/server/bootstrap.d.ts +4 -0
  41. package/dist/server/bootstrap.d.ts.map +1 -0
  42. package/dist/server/bootstrap.js +37 -0
  43. package/dist/server/bootstrap.js.map +1 -0
  44. package/dist/server/config/index.d.ts +24 -0
  45. package/dist/server/config/index.d.ts.map +1 -0
  46. package/dist/server/config/index.js +33 -0
  47. package/dist/server/config/index.js.map +1 -0
  48. package/dist/server/content-types/canvas-page/schema.d.ts +45 -0
  49. package/dist/server/content-types/canvas-page/schema.d.ts.map +1 -0
  50. package/dist/server/content-types/canvas-page/schema.js +21 -0
  51. package/dist/server/content-types/canvas-page/schema.js.map +1 -0
  52. package/dist/server/content-types/canvas-site/schema.d.ts +41 -0
  53. package/dist/server/content-types/canvas-site/schema.d.ts.map +1 -0
  54. package/dist/server/content-types/canvas-site/schema.js +20 -0
  55. package/dist/server/content-types/canvas-site/schema.js.map +1 -0
  56. package/dist/server/content-types/index.d.ts +90 -0
  57. package/dist/server/content-types/index.d.ts.map +1 -0
  58. package/dist/server/content-types/index.js +7 -0
  59. package/dist/server/content-types/index.js.map +1 -0
  60. package/dist/server/controllers/canvas.d.ts +48 -0
  61. package/dist/server/controllers/canvas.d.ts.map +1 -0
  62. package/dist/server/controllers/canvas.js +409 -0
  63. package/dist/server/controllers/canvas.js.map +1 -0
  64. package/dist/server/controllers/index.d.ts +448 -0
  65. package/dist/server/controllers/index.d.ts.map +1 -0
  66. package/dist/server/controllers/index.js +5 -0
  67. package/dist/server/controllers/index.js.map +1 -0
  68. package/dist/server/index.d.ts +645 -0
  69. package/dist/server/index.d.ts.map +1 -0
  70. package/dist/server/index.js +21 -0
  71. package/dist/server/index.js.map +1 -0
  72. package/dist/server/license.d.ts +13 -0
  73. package/dist/server/license.d.ts.map +1 -0
  74. package/dist/server/license.js +24 -0
  75. package/dist/server/license.js.map +1 -0
  76. package/dist/server/policies/is-admin-authenticated.d.ts +2 -0
  77. package/dist/server/policies/is-admin-authenticated.d.ts.map +1 -0
  78. package/dist/server/policies/is-admin-authenticated.js +4 -0
  79. package/dist/server/policies/is-admin-authenticated.js.map +1 -0
  80. package/dist/server/register.d.ts +2 -0
  81. package/dist/server/register.d.ts.map +1 -0
  82. package/dist/server/register.js +4 -0
  83. package/dist/server/register.js.map +1 -0
  84. package/dist/server/routes/admin.d.ts +18 -0
  85. package/dist/server/routes/admin.d.ts.map +1 -0
  86. package/dist/server/routes/admin.js +38 -0
  87. package/dist/server/routes/admin.js.map +1 -0
  88. package/dist/server/routes/index.d.ts +31 -0
  89. package/dist/server/routes/index.d.ts.map +1 -0
  90. package/dist/server/routes/index.js +7 -0
  91. package/dist/server/routes/index.js.map +1 -0
  92. package/dist/server/routes/public.d.ts +13 -0
  93. package/dist/server/routes/public.d.ts.map +1 -0
  94. package/dist/server/routes/public.js +7 -0
  95. package/dist/server/routes/public.js.map +1 -0
  96. package/dist/server/services/collaboration-service.d.ts +24 -0
  97. package/dist/server/services/collaboration-service.d.ts.map +1 -0
  98. package/dist/server/services/collaboration-service.js +164 -0
  99. package/dist/server/services/collaboration-service.js.map +1 -0
  100. package/dist/server/services/document-command-service.d.ts +34 -0
  101. package/dist/server/services/document-command-service.d.ts.map +1 -0
  102. package/dist/server/services/document-command-service.js +418 -0
  103. package/dist/server/services/document-command-service.js.map +1 -0
  104. package/dist/server/services/document-service.d.ts +14 -0
  105. package/dist/server/services/document-service.d.ts.map +1 -0
  106. package/dist/server/services/document-service.js +144 -0
  107. package/dist/server/services/document-service.js.map +1 -0
  108. package/dist/server/services/index.d.ts +68 -0
  109. package/dist/server/services/index.d.ts.map +1 -0
  110. package/dist/server/services/index.js +28 -0
  111. package/dist/server/services/index.js.map +1 -0
  112. package/dist/server/services/page-doc-store.d.ts +59 -0
  113. package/dist/server/services/page-doc-store.d.ts.map +1 -0
  114. package/dist/server/services/page-doc-store.js +285 -0
  115. package/dist/server/services/page-doc-store.js.map +1 -0
  116. package/dist/server/services/site-store.d.ts +43 -0
  117. package/dist/server/services/site-store.d.ts.map +1 -0
  118. package/dist/server/services/site-store.js +212 -0
  119. package/dist/server/services/site-store.js.map +1 -0
  120. package/dist/server-cjs/index.js +17381 -0
  121. package/dist/server-cjs/package.json +3 -0
  122. package/package.json +77 -0
  123. package/src/admin/appearance.ts +56 -0
  124. package/src/admin/block-packages.ts +16 -0
  125. package/src/admin/client/content-model.ts +88 -0
  126. package/src/admin/client/host-services.ts +172 -0
  127. package/src/admin/index.tsx +56 -0
  128. package/src/admin/pages/App.tsx +56 -0
  129. package/src/admin/strapi-admin.d.ts +1 -0
  130. package/src/admin/translations.ts +23 -0
  131. package/src/constants.ts +21 -0
  132. package/src/index.ts +11 -0
  133. package/src/server/bootstrap.ts +45 -0
  134. package/src/server/config/index.ts +46 -0
  135. package/src/server/content-types/canvas-page/schema.ts +20 -0
  136. package/src/server/content-types/canvas-site/schema.ts +19 -0
  137. package/src/server/content-types/index.ts +7 -0
  138. package/src/server/controllers/canvas.ts +468 -0
  139. package/src/server/controllers/index.ts +5 -0
  140. package/src/server/index.ts +21 -0
  141. package/src/server/license.ts +42 -0
  142. package/src/server/policies/is-admin-authenticated.ts +3 -0
  143. package/src/server/register.ts +3 -0
  144. package/src/server/routes/admin.ts +40 -0
  145. package/src/server/routes/index.ts +7 -0
  146. package/src/server/routes/public.ts +6 -0
  147. package/src/server/services/collaboration-service.ts +180 -0
  148. package/src/server/services/document-command-service.ts +495 -0
  149. package/src/server/services/document-service.ts +162 -0
  150. package/src/server/services/index.ts +41 -0
  151. package/src/server/services/page-doc-store.ts +348 -0
  152. package/src/server/services/site-store.ts +243 -0
@@ -0,0 +1,212 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { BATTERY_THEME_DEFAULT_TOKENS } from "@batterai/contract";
3
+ import { CANVAS_SITE_UID, DEFAULT_SITE_KEY } from "../../constants.js";
4
+ export class CanvasSiteConflict extends Error {
5
+ expectedDocVersion;
6
+ actualDocVersion;
7
+ status = 409;
8
+ constructor(expectedDocVersion, actualDocVersion) {
9
+ super(`Canvas site conflict: expected ${expectedDocVersion}, got ${actualDocVersion}`);
10
+ this.expectedDocVersion = expectedDocVersion;
11
+ this.actualDocVersion = actualDocVersion;
12
+ this.name = "CanvasSiteConflict";
13
+ }
14
+ }
15
+ export function emptyLibrary() {
16
+ return { categories: [], blocks: [], presets: [], sharedBlocks: [] };
17
+ }
18
+ /**
19
+ * Normalizes a host-supplied `seedLibrary` plugin config value into a
20
+ * `BlockLibrary`, filling any missing keys with empty arrays. Returns
21
+ * `undefined` when no seed was configured so callers can fall back to
22
+ * `emptyLibrary()`.
23
+ */
24
+ export function normalizeLibrary(seed) {
25
+ if (!seed || typeof seed !== "object" || Array.isArray(seed))
26
+ return undefined;
27
+ return {
28
+ categories: Array.isArray(seed.categories) ? seed.categories : [],
29
+ blocks: Array.isArray(seed.blocks) ? seed.blocks : [],
30
+ presets: Array.isArray(seed.presets) ? seed.presets : [],
31
+ sharedBlocks: [],
32
+ };
33
+ }
34
+ export function defaultHomePage(_now = new Date()) {
35
+ return {
36
+ id: "home",
37
+ title: "Home",
38
+ path: "/",
39
+ parentId: null,
40
+ root: [],
41
+ };
42
+ }
43
+ export function defaultSiteDocument(now = new Date()) {
44
+ return {
45
+ kind: "canvas-editor-site",
46
+ docVersion: 1,
47
+ content: {
48
+ media: [],
49
+ routes: [{ id: "home", label: "Home", path: "/" }],
50
+ sharedBlocks: [],
51
+ siteMetadata: { title: "Strapi site" },
52
+ translations: {},
53
+ },
54
+ contentTypes: [],
55
+ library: emptyLibrary(),
56
+ pageOrder: ["home"],
57
+ canvas: {
58
+ theme: { tokens: BATTERY_THEME_DEFAULT_TOKENS },
59
+ assets: [],
60
+ variables: {},
61
+ layout: { pageOrder: ["home"] },
62
+ },
63
+ status: {
64
+ adapter: "strapi",
65
+ connected: true,
66
+ product: "Canvas",
67
+ runtimeModel: "strapi-admin-plugin",
68
+ source: "plugin::canvas.canvas-site",
69
+ version: "0.1.0",
70
+ lastSyncedAt: now.toISOString(),
71
+ },
72
+ };
73
+ }
74
+ export function createSiteStore(strapi, seedLibrary, transaction) {
75
+ const query = () => strapi.documents?.("plugin::canvas.canvas-site") ?? strapi.entityService;
76
+ const metadata = transaction ? strapi.db.metadata.get(CANVAS_SITE_UID) : undefined;
77
+ const tableName = metadata?.tableName;
78
+ const columns = metadata ? {
79
+ documentId: columnName(metadata, "documentId", "document_id"),
80
+ siteKey: columnName(metadata, "siteKey", "site_key"),
81
+ docVersion: columnName(metadata, "docVersion", "doc_version"),
82
+ document: columnName(metadata, "document", "document"),
83
+ createdAt: columnName(metadata, "createdAt", "created_at"),
84
+ updatedAt: columnName(metadata, "updatedAt", "updated_at"),
85
+ } : undefined;
86
+ function table() {
87
+ if (!transaction || !tableName)
88
+ throw new Error("Canvas site aggregate writes require a Strapi transaction.");
89
+ return transaction(tableName);
90
+ }
91
+ async function transactionalRow() {
92
+ return table().where({ [columns.siteKey]: DEFAULT_SITE_KEY }).first();
93
+ }
94
+ return {
95
+ async readOrCreate() {
96
+ if (transaction) {
97
+ const existing = await transactionalRow();
98
+ if (existing?.[columns.document])
99
+ return normalizeSiteDocument(parseJson(existing[columns.document]));
100
+ const document = {
101
+ ...defaultSiteDocument(),
102
+ library: normalizeLibrary(seedLibrary) ?? emptyLibrary(),
103
+ };
104
+ const timestamp = new Date().toISOString();
105
+ await table().insert({
106
+ [columns.documentId]: randomUUID(),
107
+ [columns.siteKey]: DEFAULT_SITE_KEY,
108
+ [columns.docVersion]: document.docVersion,
109
+ [columns.document]: JSON.stringify(document),
110
+ [columns.createdAt]: timestamp,
111
+ [columns.updatedAt]: timestamp,
112
+ });
113
+ return document;
114
+ }
115
+ const rows = await strapi.entityService.findMany("plugin::canvas.canvas-site", {
116
+ filters: { siteKey: { $eq: DEFAULT_SITE_KEY } },
117
+ limit: 1,
118
+ });
119
+ const existing = rows[0];
120
+ if (existing?.document)
121
+ return normalizeSiteDocument(existing.document);
122
+ const document = {
123
+ ...defaultSiteDocument(),
124
+ library: normalizeLibrary(seedLibrary) ?? emptyLibrary(),
125
+ };
126
+ await query().create?.({
127
+ data: {
128
+ siteKey: DEFAULT_SITE_KEY,
129
+ docVersion: document.docVersion,
130
+ document,
131
+ },
132
+ });
133
+ return document;
134
+ },
135
+ async update(mutator) {
136
+ const rows = await strapi.entityService.findMany("plugin::canvas.canvas-site", {
137
+ filters: { siteKey: { $eq: DEFAULT_SITE_KEY } },
138
+ limit: 1,
139
+ });
140
+ const existing = rows[0];
141
+ const next = mutator(normalizeSiteDocument(existing?.document));
142
+ if (existing?.documentId) {
143
+ await query().update?.({
144
+ documentId: existing.documentId,
145
+ data: { docVersion: next.docVersion, document: next },
146
+ });
147
+ }
148
+ return next;
149
+ },
150
+ async updateIfVersion(expectedDocVersion, mutator) {
151
+ const existing = await transactionalRow();
152
+ const current = normalizeSiteDocument(parseJson(existing?.[columns.document]));
153
+ const actualDocVersion = Number(existing?.[columns.docVersion] ?? current.docVersion);
154
+ if (!existing || actualDocVersion !== expectedDocVersion) {
155
+ throw new CanvasSiteConflict(expectedDocVersion, actualDocVersion);
156
+ }
157
+ const next = mutator(current);
158
+ if (next.docVersion !== expectedDocVersion + 1) {
159
+ throw new Error("Canvas site aggregate mutation must increment docVersion exactly once.");
160
+ }
161
+ const affected = await table()
162
+ .where({
163
+ [columns.siteKey]: DEFAULT_SITE_KEY,
164
+ [columns.docVersion]: expectedDocVersion,
165
+ })
166
+ .update({
167
+ [columns.docVersion]: next.docVersion,
168
+ [columns.document]: JSON.stringify(next),
169
+ [columns.updatedAt]: new Date().toISOString(),
170
+ });
171
+ if (Number(affected) !== 1) {
172
+ const latest = await transactionalRow();
173
+ throw new CanvasSiteConflict(expectedDocVersion, Number(latest?.[columns.docVersion] ?? actualDocVersion));
174
+ }
175
+ return next;
176
+ },
177
+ };
178
+ }
179
+ export function normalizeSiteDocument(document) {
180
+ if (!document || typeof document !== "object" || Array.isArray(document))
181
+ return defaultSiteDocument();
182
+ const candidate = document;
183
+ return {
184
+ ...defaultSiteDocument(),
185
+ ...candidate,
186
+ content: {
187
+ ...defaultSiteDocument().content,
188
+ ...(candidate.content ?? {}),
189
+ },
190
+ library: candidate.library ?? emptyLibrary(),
191
+ canvas: {
192
+ ...defaultSiteDocument().canvas,
193
+ ...(candidate.canvas ?? {}),
194
+ },
195
+ pageOrder: Array.isArray(candidate.pageOrder) ? candidate.pageOrder.filter(Boolean) : ["home"],
196
+ docVersion: Number.isInteger(candidate.docVersion) && candidate.docVersion > 0 ? candidate.docVersion : 1,
197
+ };
198
+ }
199
+ function columnName(metadata, attribute, fallback) {
200
+ return metadata?.attributes?.[attribute]?.columnName ?? fallback;
201
+ }
202
+ function parseJson(value) {
203
+ if (typeof value !== "string")
204
+ return value;
205
+ try {
206
+ return JSON.parse(value);
207
+ }
208
+ catch {
209
+ return value;
210
+ }
211
+ }
212
+ //# sourceMappingURL=site-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-store.js","sourceRoot":"","sources":["../../../src/server/services/site-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,4BAA4B,EAAuB,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAqBpE,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAIhC;IACA;IAJF,MAAM,GAAG,GAAG,CAAC;IAEtB,YACW,kBAA0B,EAC1B,gBAAwB;QAEjC,KAAK,CAAC,kCAAkC,kBAAkB,SAAS,gBAAgB,EAAE,CAAC,CAAC;QAH9E,uBAAkB,GAAlB,kBAAkB,CAAQ;QAC1B,qBAAgB,GAAhB,gBAAgB,CAAQ;QAGjC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;AACvE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAwC;IACvE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/E,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,UAAyC,CAAC,CAAC,CAAC,EAAE;QACjG,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,MAAiC,CAAC,CAAC,CAAC,EAAE;QACjF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,OAAmC,CAAC,CAAC,CAAC,EAAE;QACrF,YAAY,EAAE,EAAE;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE;IAC/C,OAAO;QACL,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,GAAG;QACT,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,EAAE;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE;IAClD,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,CAAC;QACb,OAAO,EAAE;YACP,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAClD,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;YACtC,YAAY,EAAE,EAAE;SACjB;QACD,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,YAAY,EAAE;QACvB,SAAS,EAAE,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE;YACN,KAAK,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE;YAC/C,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,MAAe,CAAC,EAAE;SACzC;QACD,MAAM,EAAE;YACN,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,QAAQ;YACjB,YAAY,EAAE,qBAAqB;YACnC,MAAM,EAAE,4BAA4B;YACpC,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE;SAChC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAW,EACX,WAA+C,EAC/C,WAA0C;IAE1C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,4BAA4B,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC;IAC7F,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,MAAM,SAAS,GAAG,QAAQ,EAAE,SAAS,CAAC;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;QACzB,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC;QAC7D,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;QACpD,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC;QAC7D,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;QACtD,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC;QAC1D,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC;KAC3D,CAAC,CAAC,CAAC,SAAS,CAAC;IAEd,SAAS,KAAK;QACZ,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC9G,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,UAAU,gBAAgB;QAC7B,OAAO,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACzE,CAAC;IAED,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAC1C,IAAI,QAAQ,EAAE,CAAC,OAAQ,CAAC,QAAQ,CAAC;oBAAE,OAAO,qBAAqB,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACxG,MAAM,QAAQ,GAAuB;oBACnC,GAAG,mBAAmB,EAAE;oBACxB,OAAO,EAAE,gBAAgB,CAAC,WAAW,CAAC,IAAI,YAAY,EAAE;iBACzD,CAAC;gBACF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC3C,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC;oBACnB,CAAC,OAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE;oBACnC,CAAC,OAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB;oBACpC,CAAC,OAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,UAAU;oBAC1C,CAAC,OAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;oBAC7C,CAAC,OAAQ,CAAC,SAAS,CAAC,EAAE,SAAS;oBAC/B,CAAC,OAAQ,CAAC,SAAS,CAAC,EAAE,SAAS;iBAChC,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,EAAE;gBAC7E,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE;gBAC/C,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,QAAQ,EAAE,QAAQ;gBAAE,OAAO,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAuB;gBACnC,GAAG,mBAAmB,EAAE;gBACxB,OAAO,EAAE,gBAAgB,CAAC,WAAW,CAAC,IAAI,YAAY,EAAE;aACzD,CAAC;YACF,MAAM,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;gBACrB,IAAI,EAAE;oBACJ,OAAO,EAAE,gBAAgB;oBACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,QAAQ;iBACT;aACF,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,OAA6D;YACxE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,4BAA4B,EAAE;gBAC7E,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE;gBAC/C,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YAChE,IAAI,QAAQ,EAAE,UAAU,EAAE,CAAC;gBACzB,MAAM,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;oBACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;iBACtD,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,eAAe,CACnB,kBAA0B,EAC1B,OAA6D;YAE7D,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAChF,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;YACvF,IAAI,CAAC,QAAQ,IAAI,gBAAgB,KAAK,kBAAkB,EAAE,CAAC;gBACzD,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,UAAU,KAAK,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;YAC5F,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,EAAE;iBAC3B,KAAK,CAAC;gBACL,CAAC,OAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB;gBACpC,CAAC,OAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB;aAC1C,CAAC;iBACD,MAAM,CAAC;gBACN,CAAC,OAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU;gBACtC,CAAC,OAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBACzC,CAAC,OAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC/C,CAAC,CAAC;YACL,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBACxC,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAQ,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC;YAC9G,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACrD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,mBAAmB,EAAE,CAAC;IACvG,MAAM,SAAS,GAAG,QAAuC,CAAC;IAC1D,OAAO;QACL,GAAG,mBAAmB,EAAE;QACxB,GAAG,SAAS;QACZ,OAAO,EAAE;YACP,GAAG,mBAAmB,EAAE,CAAC,OAAO;YAChC,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC;SAC7B;QACD,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,YAAY,EAAE;QAC5C,MAAM,EAAE;YACN,GAAG,mBAAmB,EAAE,CAAC,MAAM;YAC/B,GAAG,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC;SAC5B;QACD,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9F,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,UAAW,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAW,CAAC,CAAC,CAAC,CAAC;KAC5G,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,QAAa,EAAE,SAAiB,EAAE,QAAgB;IACpE,OAAO,QAAQ,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,IAAI,QAAQ,CAAC;AACnE,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}