@bagelink/blox 1.15.587 → 1.15.591

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 (56) hide show
  1. package/README.md +48 -22
  2. package/dist/CmsPageView.vue.d.ts.map +1 -1
  3. package/dist/{PreviewApp-D208UMZs.js → PreviewApp-BagepqPk.js} +1 -1
  4. package/dist/{PreviewApp-DNMYw1AS.cjs → PreviewApp-HVipxMQ3.cjs} +1 -1
  5. package/dist/{PreviewApp.vue_vue_type_style_index_0_lang-Dm0SmjEr.cjs → PreviewApp.vue_vue_type_style_index_0_lang-C6e-tDzD.cjs} +6 -6
  6. package/dist/{PreviewApp.vue_vue_type_style_index_0_lang-l6QisbG-.js → PreviewApp.vue_vue_type_style_index_0_lang-Dl3bKQTA.js} +1 -1
  7. package/dist/api/index.d.ts +24 -0
  8. package/dist/api/index.d.ts.map +1 -1
  9. package/dist/{routes-DDiQDksF.js → appRuntime-B6yWkH3M.js} +280 -82
  10. package/dist/{routes-DOcek9fP.cjs → appRuntime-D1Z3fX-G.cjs} +237 -39
  11. package/dist/appRuntime.d.ts +26 -0
  12. package/dist/appRuntime.d.ts.map +1 -0
  13. package/dist/composables/useLocale.d.ts +10 -3
  14. package/dist/composables/useLocale.d.ts.map +1 -1
  15. package/dist/content/routes.d.ts +4 -2
  16. package/dist/content/routes.d.ts.map +1 -1
  17. package/dist/content/useContentSeo.d.ts.map +1 -1
  18. package/dist/core.d.ts +2 -0
  19. package/dist/core.d.ts.map +1 -1
  20. package/dist/createBloxApp.d.ts +9 -19
  21. package/dist/createBloxApp.d.ts.map +1 -1
  22. package/dist/data/useData.d.ts.map +1 -1
  23. package/dist/index.cjs +91 -111
  24. package/dist/index.d.ts +2 -2
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.mjs +64 -84
  27. package/dist/{shard-runner-Bc4gTl71.js → shard-runner-DauYjwvg.js} +2 -2
  28. package/dist/{shard-runner-ZAwqteYY.cjs → shard-runner-xIPqGX-Q.cjs} +2 -2
  29. package/dist/ssg/cli.cjs +2 -4
  30. package/dist/ssg/cli.mjs +2 -4
  31. package/dist/ssg/client.cjs +0 -73
  32. package/dist/ssg/client.d.ts +1 -3
  33. package/dist/ssg/client.d.ts.map +1 -1
  34. package/dist/ssg/client.mjs +1 -74
  35. package/dist/ssg/constants.d.ts +0 -4
  36. package/dist/ssg/constants.d.ts.map +1 -1
  37. package/dist/ssg/createSSREntry.d.ts.map +1 -1
  38. package/dist/ssg/index.cjs +26 -47
  39. package/dist/ssg/index.d.ts +1 -3
  40. package/dist/ssg/index.d.ts.map +1 -1
  41. package/dist/ssg/index.mjs +24 -45
  42. package/dist/ssg/prerender.d.ts +1 -5
  43. package/dist/ssg/prerender.d.ts.map +1 -1
  44. package/dist/ssg/render-resolved-page.d.ts +0 -2
  45. package/dist/ssg/render-resolved-page.d.ts.map +1 -1
  46. package/dist/{validate-output-DRCseorw.js → validate-output-B56PuxEM.js} +0 -2
  47. package/dist/{validate-output-DlHgDBoV.cjs → validate-output-CRfMSrpx.cjs} +0 -2
  48. package/dist/vite-plugin.cjs +3 -64
  49. package/dist/vite-plugin.d.ts +0 -8
  50. package/dist/vite-plugin.d.ts.map +1 -1
  51. package/dist/vite-plugin.mjs +3 -64
  52. package/package.json +1 -1
  53. package/dist/ssg/collection-cache.d.ts +0 -53
  54. package/dist/ssg/collection-cache.d.ts.map +0 -1
  55. package/dist/ssg/state-cache.d.ts +0 -21
  56. package/dist/ssg/state-cache.d.ts.map +0 -1
package/README.md CHANGED
@@ -28,39 +28,61 @@ Do not import `@bagelink/vue/dist/style.css` or
28
28
  existing projects. Import the same entries in local development and CI so a
29
29
  source alias cannot hide a package-export problem.
30
30
 
31
- ## Quick Start
31
+ ## Production Website Setup
32
32
 
33
33
  ```typescript
34
34
  // main.ts
35
- import { createApp } from 'vue'
36
- import { createRouter, createWebHistory } from 'vue-router'
37
- import { createBlox, ButtonConfig, TextConfig, TitleConfig } from '@bagelink/blox'
35
+ import { createBloxApp } from '@bagelink/blox'
36
+ import { BagelVue } from '@bagelink/vue'
38
37
  import '@bagelink/vue/styles/core.css'
39
38
  import '@bagelink/blox/style.css'
40
39
 
41
40
  import App from './App.vue'
42
-
43
- const app = createApp(App)
44
- const router = createRouter({
45
- history: createWebHistory(),
46
- routes: [
47
- // Your app routes
48
- ],
41
+ import router from './router'
42
+
43
+ const blocks = import.meta.glob('./components/blocks/*.vue', { eager: true })
44
+
45
+ createBloxApp({
46
+ rootComponent: App,
47
+ router,
48
+ modules: blocks,
49
+ websiteName: 'my-site',
50
+ store: 'my-site',
51
+ locale: 'en',
52
+ supportedLocales: ['en'],
53
+ plugins: [BagelVue],
54
+ navigation: 'document',
49
55
  })
56
+ ```
50
57
 
51
- // Create and configure Blox
52
- const blox = createBlox()
53
- blox.registerComponents([ButtonConfig, TextConfig, TitleConfig]).registerRoutes(router)
54
-
55
- app.use(blox)
56
- app.use(router)
57
- app.mount('#app')
58
+ ```typescript
59
+ // main.server.ts
60
+ import { createBloxSSREntry } from '@bagelink/blox/ssg'
61
+ import { BagelVue } from '@bagelink/vue'
62
+ import App from './App.vue'
63
+ import { createRouter } from './router'
64
+
65
+ const blocks = import.meta.glob('./components/blocks/*.vue', { eager: true })
66
+
67
+ export const { render, prefetchResolve } = createBloxSSREntry({
68
+ rootComponent: App,
69
+ createRouter,
70
+ modules: blocks,
71
+ websiteName: 'my-site',
72
+ store: 'my-site',
73
+ locale: 'en',
74
+ supportedLocales: ['en'],
75
+ plugins: [BagelVue],
76
+ })
58
77
  ```
59
78
 
60
- That's it! Preview routes are now available at:
79
+ The client hydrates prerendered HTML directly. Components can use normal Vue
80
+ primitives including `Suspense`, `Teleport`, Pinia, and `onServerPrefetch`.
81
+ Use `useData(key, loader)` for data that must be present in static HTML and in
82
+ the hydration payload. Do not install fetch or Axios cache interceptors.
61
83
 
62
- - `/blox/preview/:pageId?` - External preview with editor communication
63
- - `/blox/render/:pageId?` - Static page rendering
84
+ Blox owns the preview route and one named CMS fallback route. Consumer routers
85
+ should declare app-owned routes and redirects only.
64
86
 
65
87
  ### With Custom Components
66
88
 
@@ -104,7 +126,11 @@ For more examples, see [SETUP_EXAMPLE.md](./SETUP_EXAMPLE.md).
104
126
 
105
127
  ---
106
128
 
107
- ## Alternative Setup (Legacy)
129
+ ## Low-level Setup
130
+
131
+ `createBlox()` remains available for the editor and specialized embedded
132
+ renderers. New production websites should use `createBloxApp()` and
133
+ `createBloxSSREntry()` so client and server assembly cannot drift.
108
134
 
109
135
  ### 1. Register Base Components
110
136
 
@@ -1 +1 @@
1
- {"version":3,"file":"CmsPageView.vue.d.ts","sourceRoot":"","sources":["../src/CmsPageView.vue"],"names":[],"mappings":";AAmkBA,wBAMG"}
1
+ {"version":3,"file":"CmsPageView.vue.d.ts","sourceRoot":"","sources":["../src/CmsPageView.vue"],"names":[],"mappings":";AAqkBA,wBAMG"}
@@ -1,4 +1,4 @@
1
- import { _ as _sfc_main } from "./PreviewApp.vue_vue_type_style_index_0_lang-l6QisbG-.js";
1
+ import { _ as _sfc_main } from "./PreviewApp.vue_vue_type_style_index_0_lang-Dl3bKQTA.js";
2
2
  export {
3
3
  _sfc_main as default
4
4
  };
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const PreviewApp_vue_vue_type_style_index_0_lang = require("./PreviewApp.vue_vue_type_style_index_0_lang-Dm0SmjEr.cjs");
3
+ const PreviewApp_vue_vue_type_style_index_0_lang = require("./PreviewApp.vue_vue_type_style_index_0_lang-C6e-tDzD.cjs");
4
4
  exports.default = PreviewApp_vue_vue_type_style_index_0_lang._sfc_main;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  const vue = require("vue");
3
- const routes = require("./routes-DOcek9fP.cjs");
3
+ const appRuntime = require("./appRuntime-D1Z3fX-G.cjs");
4
4
  function sendToEditor(msg) {
5
5
  window.parent.postMessage(cloneForPostMessage(msg), "*");
6
6
  }
@@ -45,7 +45,7 @@ const PreviewRenderer = vue.defineComponent({
45
45
  }
46
46
  },
47
47
  setup(props) {
48
- const registry = vue.inject(routes.BLOX_REGISTRY_KEY, {});
48
+ const registry = vue.inject(appRuntime.BLOX_REGISTRY_KEY, {});
49
49
  const contexts = vue.inject("contexts", { value: {} });
50
50
  const localHovered = vue.ref(null);
51
51
  function onBlockClick(index) {
@@ -139,7 +139,7 @@ const PreviewRenderer = vue.defineComponent({
139
139
  "onMouseleave": onBlockLeave
140
140
  },
141
141
  [
142
- vue.h(definition.component, routes.resolveBlockProps(block, definition.schema.defaults, contexts.value)),
142
+ vue.h(definition.component, appRuntime.resolveBlockProps(block, definition.schema.defaults, contexts.value)),
143
143
  vue.h("div", { style: overlayStyle }),
144
144
  (isSelected || isHovered) && vue.h("div", { style: labelStyle }, label)
145
145
  ]
@@ -153,8 +153,8 @@ const _hoisted_1 = { class: "blox-preview-root" };
153
153
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
154
154
  __name: "PreviewApp",
155
155
  setup(__props) {
156
- const registry = vue.inject(routes.BLOX_REGISTRY_KEY, {});
157
- const { setLocale } = routes.useLocale();
156
+ const registry = vue.inject(appRuntime.BLOX_REGISTRY_KEY, {});
157
+ const { setLocale } = appRuntime.useLocale();
158
158
  const blocks = vue.ref([]);
159
159
  const contexts = vue.ref({});
160
160
  const selectedIndex = vue.ref(null);
@@ -162,7 +162,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
162
162
  const globalBlockTypes = vue.ref([]);
163
163
  const runtimeLoading = vue.ref(true);
164
164
  vue.provide("contexts", contexts);
165
- vue.provide(routes.BLOX_RUNTIME_KEY, {
165
+ vue.provide(appRuntime.BLOX_RUNTIME_KEY, {
166
166
  isPreview: vue.ref(true),
167
167
  loading: runtimeLoading
168
168
  });
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, inject, ref, h, provide, onMounted, onUnmounted, openBlock, createElementBlock, createVNode, unref, nextTick } from "vue";
2
- import { h as BLOX_REGISTRY_KEY, r as resolveBlockProps, u as useLocale, j as BLOX_RUNTIME_KEY } from "./routes-DDiQDksF.js";
2
+ import { f as BLOX_REGISTRY_KEY, r as resolveBlockProps, u as useLocale, g as BLOX_RUNTIME_KEY } from "./appRuntime-B6yWkH3M.js";
3
3
  function sendToEditor(msg) {
4
4
  window.parent.postMessage(cloneForPostMessage(msg), "*");
5
5
  }
@@ -1,5 +1,23 @@
1
1
  import { CollectionItemsPage, PageResolveRead } from './types';
2
+ import { App, InjectionKey } from 'vue';
2
3
  type CollectionResolver = (collection: string, options: ListItemsOptions) => Promise<Array<Record<string, unknown>>>;
4
+ export interface BloxApiOptions {
5
+ websiteName: string;
6
+ store: string;
7
+ origin?: string;
8
+ collectionResolver?: CollectionResolver | null;
9
+ }
10
+ export interface BloxApiClient {
11
+ getWebsiteIdSync: () => string | null;
12
+ getWebsiteId: () => Promise<string>;
13
+ resolvePath: (path: string, locale: string) => Promise<PageResolveRead>;
14
+ listItems: <T = Record<string, unknown>>(collection: string, options?: ListItemsOptions) => Promise<CollectionItemsPage & {
15
+ items: T[];
16
+ }>;
17
+ getItemBySlug: <T = Record<string, unknown>>(collection: string, slug: string, locale?: string) => Promise<T | null>;
18
+ getItemById: <T = Record<string, unknown>>(collection: string, id: string, locale?: string) => Promise<T | null>;
19
+ }
20
+ export declare const BLOX_API_KEY: InjectionKey<BloxApiClient>;
3
21
  export declare function configureApi(websiteName: string, store: string): void;
4
22
  /**
5
23
  * Point blox's datastore client at an absolute API base (SSG/Node, where
@@ -9,6 +27,9 @@ export declare function configureApi(websiteName: string, store: string): void;
9
27
  export declare function setApiOrigin(base: string): void;
10
28
  /** Use an immutable build-time collection source instead of HTTP during SSR. */
11
29
  export declare function setCollectionResolver(resolver: CollectionResolver | null): void;
30
+ export declare function createBloxApi(options: BloxApiOptions): BloxApiClient;
31
+ export declare function provideBloxApi(app: App, options: BloxApiOptions): BloxApiClient;
32
+ export declare function useBloxApi(): BloxApiClient | null;
12
33
  /** Synchronously read the resolved website id if already known (SSG-embedded or cached). */
13
34
  export declare function getWebsiteIdSync(): string | null;
14
35
  export declare function getWebsiteId(): Promise<string>;
@@ -38,5 +59,8 @@ export declare function getItemBySlug<T = Record<string, unknown>>(collection: s
38
59
  * Returns null if the item isn't available in that locale (datastore 406/404).
39
60
  */
40
61
  export declare function getItemById<T = Record<string, unknown>>(collection: string, id: string, locale?: string): Promise<T | null>;
62
+ export declare function listItemsFromActiveApi<T = Record<string, unknown>>(collection: string, options?: ListItemsOptions): Promise<CollectionItemsPage & {
63
+ items: T[];
64
+ }>;
41
65
  export {};
42
66
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAA;AAYrF,KAAK,kBAAkB,GAAG,CACzB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,gBAAgB,KACrB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;AAG5C,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAU/C;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAE/E;AAuBD,4FAA4F;AAC5F,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAOhD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAwBpD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAMxF;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,UAAU,EAAE,MAAM,EAClB,EAAE,MAAM,EAAE,CAAC,EAAE,MAAU,EAAE,KAAW,EAAE,GAAE,gBAAqB,GAC3D,OAAO,CAAC,mBAAmB,GAAG;IAAE,KAAK,EAAE,CAAC,EAAE,CAAA;CAAE,CAAC,CAQ/C;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAMnB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5D,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAOnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAA;AACrF,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,KAAK,CAAA;AAa5C,KAAK,kBAAkB,GAAG,CACzB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,gBAAgB,KACrB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;AAG5C,MAAM,WAAW,cAAc;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;CAC9C;AAED,MAAM,WAAW,aAAa;IAC7B,gBAAgB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IACrC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IACnC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAA;IACvE,SAAS,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,gBAAgB,KACtB,OAAO,CAAC,mBAAmB,GAAG;QAAE,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAA;IAClD,aAAa,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACtB,WAAW,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;CACtB;AAED,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,aAAa,CAAsB,CAAA;AAE3E,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAU/C;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAE/E;AAoBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA+FpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,CAI/E;AAED,wBAAgB,UAAU,IAAI,aAAa,GAAG,IAAI,CAEjD;AAkBD,4FAA4F;AAC5F,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAOhD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAwBpD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAMxF;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,UAAU,EAAE,MAAM,EAClB,EAAE,MAAM,EAAE,CAAC,EAAE,MAAU,EAAE,KAAW,EAAE,GAAE,gBAAqB,GAC3D,OAAO,CAAC,mBAAmB,GAAG;IAAE,KAAK,EAAE,CAAC,EAAE,CAAA;CAAE,CAAC,CAQ/C;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAMnB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5D,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAOnB;AAED,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,mBAAmB,GAAG;IAAE,KAAK,EAAE,CAAC,EAAE,CAAA;CAAE,CAAC,CAE/C"}