every-plugin 0.0.6 → 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.
- package/README.md +77 -13
- package/dist/errors.js +10 -10
- package/dist/plugin.d.ts +98 -44
- package/dist/plugin.js +17 -15
- package/dist/runtime/errors.d.ts +22 -1
- package/dist/runtime/errors.d.ts.map +1 -1
- package/dist/runtime/errors.js +8 -6
- package/dist/runtime/index.d.ts +68 -16
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +126 -27
- package/dist/runtime/mf.test.d.ts +2 -0
- package/dist/runtime/mf.test.d.ts.map +1 -0
- package/dist/runtime/mf.test.js +135 -0
- package/dist/runtime/runtime.test.d.ts +1 -1
- package/dist/runtime/runtime.test.js +366 -296
- package/dist/runtime/services/module-federation.service.d.ts +36 -9
- package/dist/runtime/services/module-federation.service.d.ts.map +1 -1
- package/dist/runtime/services/module-federation.service.js +122 -99
- package/dist/runtime/services/plugin.service.d.ts +66 -13
- package/dist/runtime/services/plugin.service.d.ts.map +1 -1
- package/dist/runtime/services/plugin.service.js +330 -122
- package/dist/runtime/services/secrets.service.d.ts +29 -9
- package/dist/runtime/services/secrets.service.d.ts.map +1 -1
- package/dist/runtime/services/secrets.service.js +30 -26
- package/dist/runtime/services.d.ts +1 -2
- package/dist/runtime/services.d.ts.map +1 -1
- package/dist/runtime/services.js +0 -1
- package/dist/runtime/streaming.d.ts +29 -0
- package/dist/runtime/streaming.d.ts.map +1 -0
- package/dist/runtime/streaming.js +59 -0
- package/dist/runtime/streaming.test.d.ts +2 -0
- package/dist/runtime/streaming.test.d.ts.map +1 -0
- package/dist/runtime/streaming.test.js +271 -0
- package/dist/runtime/test-utils.d.ts +3 -0
- package/dist/runtime/test-utils.d.ts.map +1 -0
- package/dist/runtime/test-utils.js +13 -0
- package/dist/runtime/types.d.ts +27 -27
- package/dist/runtime/validation.d.ts +1 -1
- package/dist/runtime/validation.d.ts.map +1 -1
- package/dist/runtime/validation.js +14 -11
- package/dist/source.d.ts +62 -190
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +32 -85
- package/package.json +7 -3
- package/dist/runtime/runtime.d.ts +0 -58
- package/dist/runtime/runtime.d.ts.map +0 -1
- package/dist/runtime/runtime.js +0 -75
- package/dist/runtime/services/plugin-cache.service.d.ts +0 -18
- package/dist/runtime/services/plugin-cache.service.d.ts.map +0 -1
- package/dist/runtime/services/plugin-cache.service.js +0 -55
|
@@ -2,16 +2,43 @@ import * as EffectModule from "effect";
|
|
|
2
2
|
import { Effect } from "effect";
|
|
3
3
|
import { ModuleFederationError } from "../errors";
|
|
4
4
|
export interface IModuleFederationService {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
readonly registerRemote: (
|
|
6
|
+
pluginId: string,
|
|
7
|
+
url: string,
|
|
8
|
+
) => Effect.Effect<void, ModuleFederationError>;
|
|
9
|
+
readonly loadRemoteConstructor: (
|
|
10
|
+
pluginId: string,
|
|
11
|
+
url: string,
|
|
12
|
+
) => Effect.Effect<any, ModuleFederationError>;
|
|
7
13
|
}
|
|
8
|
-
declare const ModuleFederationService_base: EffectModule.Context.TagClass<
|
|
9
|
-
|
|
10
|
-
|
|
14
|
+
declare const ModuleFederationService_base: EffectModule.Context.TagClass<
|
|
15
|
+
ModuleFederationService,
|
|
16
|
+
"ModuleFederationService",
|
|
17
|
+
IModuleFederationService
|
|
18
|
+
> &
|
|
19
|
+
EffectModule.Effect.Tag.Proxy<
|
|
20
|
+
ModuleFederationService,
|
|
21
|
+
IModuleFederationService
|
|
22
|
+
> & {
|
|
23
|
+
use: <X>(
|
|
24
|
+
body: (_: IModuleFederationService) => X,
|
|
25
|
+
) => [X] extends [EffectModule.Effect.Effect<infer A, infer E, infer R>]
|
|
26
|
+
? EffectModule.Effect.Effect<A, E, R | ModuleFederationService>
|
|
27
|
+
: [X] extends [PromiseLike<infer A_1>]
|
|
28
|
+
? EffectModule.Effect.Effect<
|
|
29
|
+
A_1,
|
|
30
|
+
EffectModule.Cause.UnknownException,
|
|
31
|
+
ModuleFederationService
|
|
32
|
+
>
|
|
33
|
+
: EffectModule.Effect.Effect<X, never, ModuleFederationService>;
|
|
34
|
+
};
|
|
11
35
|
export declare class ModuleFederationService extends ModuleFederationService_base {
|
|
12
|
-
|
|
36
|
+
static Live: EffectModule.Layer.Layer<ModuleFederationService, never, never>;
|
|
13
37
|
}
|
|
14
38
|
export declare const ModuleFederationServiceTag: typeof ModuleFederationService;
|
|
15
|
-
export declare const ModuleFederationServiceLive: EffectModule.Layer.Layer<
|
|
16
|
-
|
|
17
|
-
|
|
39
|
+
export declare const ModuleFederationServiceLive: EffectModule.Layer.Layer<
|
|
40
|
+
ModuleFederationService,
|
|
41
|
+
never,
|
|
42
|
+
never
|
|
43
|
+
>;
|
|
44
|
+
//# sourceMappingURL=module-federation.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-federation.service.d.ts","sourceRoot":"","sources":["../../../src/runtime/services/module-federation.service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,MAAM,EAAS,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,wBAAwB;
|
|
1
|
+
{"version":3,"file":"module-federation.service.d.ts","sourceRoot":"","sources":["../../../src/runtime/services/module-federation.service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,MAAM,EAAS,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,cAAc,EAAE,CACxB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,KACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAChD,QAAQ,CAAC,qBAAqB,EAAE,CAC/B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,KACP,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;CAC/C;;;;AAyCD,qBAAa,uBAAwB,SAAQ,4BAES;IACrD,MAAM,CAAC,IAAI,kEAwFT;CACF;AAED,eAAO,MAAM,0BAA0B,gCAA0B,CAAC;AAClE,eAAO,MAAM,2BAA2B,iEAA+B,CAAC"}
|
|
@@ -1,108 +1,131 @@
|
|
|
1
1
|
import { betterFetch } from "@better-fetch/fetch";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
createInstance,
|
|
4
|
+
getInstance,
|
|
5
|
+
} from "@module-federation/enhanced/runtime";
|
|
3
6
|
import { setGlobalFederationInstance } from "@module-federation/runtime-core";
|
|
4
7
|
import * as EffectModule from "effect";
|
|
5
8
|
import { Effect, Layer } from "effect";
|
|
6
9
|
import * as ZodModule from "zod";
|
|
7
10
|
import { ModuleFederationError } from "../errors";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
11
|
+
|
|
12
|
+
const createModuleFederationInstance = Effect.cached(
|
|
13
|
+
Effect.sync(() => {
|
|
14
|
+
try {
|
|
15
|
+
let instance = getInstance();
|
|
16
|
+
if (!instance) {
|
|
17
|
+
instance = createInstance({
|
|
18
|
+
name: "host",
|
|
19
|
+
remotes: [],
|
|
20
|
+
shared: {
|
|
21
|
+
effect: {
|
|
22
|
+
shareConfig: {
|
|
23
|
+
singleton: true,
|
|
24
|
+
requiredVersion: "^3.17.6",
|
|
25
|
+
eager: true,
|
|
26
|
+
},
|
|
27
|
+
lib: () => EffectModule,
|
|
28
|
+
},
|
|
29
|
+
zod: {
|
|
30
|
+
shareConfig: {
|
|
31
|
+
singleton: true,
|
|
32
|
+
requiredVersion: "^4.0.8",
|
|
33
|
+
eager: true,
|
|
34
|
+
},
|
|
35
|
+
lib: () => ZodModule,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
setGlobalFederationInstance(instance);
|
|
40
|
+
}
|
|
41
|
+
return instance;
|
|
42
|
+
} catch (error) {
|
|
43
|
+
throw new Error(`Failed to initialize Module Federation: ${error}`);
|
|
44
|
+
}
|
|
45
|
+
}),
|
|
46
|
+
);
|
|
47
|
+
export class ModuleFederationService extends Effect.Tag(
|
|
48
|
+
"ModuleFederationService",
|
|
49
|
+
)() {
|
|
50
|
+
static Live = Layer.effect(
|
|
51
|
+
ModuleFederationService,
|
|
52
|
+
Effect.gen(function* () {
|
|
53
|
+
const mf = yield* Effect.flatten(createModuleFederationInstance);
|
|
54
|
+
return {
|
|
55
|
+
registerRemote: (pluginId, url) =>
|
|
56
|
+
Effect.gen(function* () {
|
|
57
|
+
// Check if remote is available
|
|
58
|
+
const { error } = yield* Effect.tryPromise({
|
|
59
|
+
try: () => betterFetch(url, { method: "HEAD" }),
|
|
60
|
+
catch: (error) =>
|
|
61
|
+
new ModuleFederationError({
|
|
62
|
+
pluginId,
|
|
63
|
+
remoteUrl: url,
|
|
64
|
+
cause:
|
|
65
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
if (error) {
|
|
69
|
+
return yield* Effect.fail(
|
|
70
|
+
new ModuleFederationError({
|
|
71
|
+
pluginId,
|
|
72
|
+
remoteUrl: url,
|
|
73
|
+
cause: new Error(`Remote not available: ${error}`),
|
|
74
|
+
}),
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
// Register remote
|
|
78
|
+
const remoteName = pluginId
|
|
79
|
+
.toLowerCase()
|
|
80
|
+
.replace("@", "")
|
|
81
|
+
.replace("/", "_");
|
|
82
|
+
yield* Effect.try({
|
|
83
|
+
try: () => mf.registerRemotes([{ name: remoteName, entry: url }]),
|
|
84
|
+
catch: (error) =>
|
|
85
|
+
new ModuleFederationError({
|
|
86
|
+
pluginId,
|
|
87
|
+
remoteUrl: url,
|
|
88
|
+
cause:
|
|
89
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
}),
|
|
93
|
+
loadRemoteConstructor: (pluginId, url) =>
|
|
94
|
+
Effect.gen(function* () {
|
|
95
|
+
const remoteName = pluginId
|
|
96
|
+
.toLowerCase()
|
|
97
|
+
.replace("@", "")
|
|
98
|
+
.replace("/", "_");
|
|
99
|
+
const modulePath = `${remoteName}/plugin`;
|
|
100
|
+
return yield* Effect.tryPromise({
|
|
101
|
+
try: async () => {
|
|
102
|
+
const container = await mf.loadRemote(modulePath);
|
|
103
|
+
if (!container) {
|
|
104
|
+
throw new Error(`No container returned for ${modulePath}`);
|
|
105
|
+
}
|
|
106
|
+
const Constructor =
|
|
107
|
+
typeof container === "function"
|
|
108
|
+
? container
|
|
109
|
+
: container?.default;
|
|
110
|
+
if (!Constructor || typeof Constructor !== "function") {
|
|
111
|
+
throw new Error(
|
|
112
|
+
`No valid constructor found. Container type: ${typeof container}`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
return Constructor;
|
|
116
|
+
},
|
|
117
|
+
catch: (error) =>
|
|
118
|
+
new ModuleFederationError({
|
|
119
|
+
pluginId,
|
|
120
|
+
remoteUrl: url,
|
|
121
|
+
cause:
|
|
122
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
123
|
+
}),
|
|
124
|
+
});
|
|
125
|
+
}),
|
|
126
|
+
};
|
|
127
|
+
}),
|
|
128
|
+
);
|
|
106
129
|
}
|
|
107
130
|
export const ModuleFederationServiceTag = ModuleFederationService;
|
|
108
131
|
export const ModuleFederationServiceLive = ModuleFederationService.Live;
|
|
@@ -1,22 +1,75 @@
|
|
|
1
1
|
import { Effect, Layer } from "effect";
|
|
2
2
|
import { PluginLoggerTag, type PluginRegistry } from "../../plugin";
|
|
3
3
|
import { PluginRuntimeError } from "../errors";
|
|
4
|
-
import type {
|
|
5
|
-
|
|
4
|
+
import type {
|
|
5
|
+
AnyPlugin,
|
|
6
|
+
InitializedPlugin,
|
|
7
|
+
PluginConstructor,
|
|
8
|
+
PluginInstance,
|
|
9
|
+
SecretsConfig,
|
|
10
|
+
} from "../types";
|
|
11
|
+
import { ModuleFederationService } from "./module-federation.service";
|
|
6
12
|
import { SecretsService } from "./secrets.service";
|
|
7
13
|
export interface IPluginService {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
14
|
+
readonly loadPlugin: (
|
|
15
|
+
pluginId: string,
|
|
16
|
+
) => Effect.Effect<PluginConstructor, PluginRuntimeError>;
|
|
17
|
+
readonly instantiatePlugin: <T extends AnyPlugin>(
|
|
18
|
+
pluginConstructor: PluginConstructor,
|
|
19
|
+
) => Effect.Effect<PluginInstance<T>, PluginRuntimeError>;
|
|
20
|
+
readonly initializePlugin: <T extends AnyPlugin>(
|
|
21
|
+
pluginInstance: PluginInstance<T>,
|
|
22
|
+
config: unknown,
|
|
23
|
+
) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
|
|
24
|
+
readonly executePlugin: <T extends AnyPlugin>(
|
|
25
|
+
initializedPlugin: InitializedPlugin<T>,
|
|
26
|
+
input: unknown,
|
|
27
|
+
) => Effect.Effect<any, PluginRuntimeError>;
|
|
28
|
+
readonly usePlugin: <T extends AnyPlugin>(
|
|
29
|
+
pluginId: string,
|
|
30
|
+
config: unknown,
|
|
31
|
+
) => Effect.Effect<InitializedPlugin<T>, PluginRuntimeError>;
|
|
32
|
+
readonly shutdownPlugin: (
|
|
33
|
+
plugin: InitializedPlugin<AnyPlugin>,
|
|
34
|
+
) => Effect.Effect<void, PluginRuntimeError>;
|
|
35
|
+
readonly clearCache: () => Effect.Effect<void, never>;
|
|
36
|
+
readonly cleanup: () => Effect.Effect<void, never>;
|
|
12
37
|
}
|
|
13
|
-
declare const PluginService_base: import("effect/Context").TagClass<
|
|
14
|
-
|
|
15
|
-
|
|
38
|
+
declare const PluginService_base: import("effect/Context").TagClass<
|
|
39
|
+
PluginService,
|
|
40
|
+
"PluginService",
|
|
41
|
+
IPluginService
|
|
42
|
+
> &
|
|
43
|
+
Effect.Tag.Proxy<PluginService, IPluginService> & {
|
|
44
|
+
use: <X>(
|
|
45
|
+
body: (_: IPluginService) => X,
|
|
46
|
+
) => [X] extends [Effect.Effect<infer A, infer E, infer R>]
|
|
47
|
+
? Effect.Effect<A, E, R | PluginService>
|
|
48
|
+
: [X] extends [PromiseLike<infer A_1>]
|
|
49
|
+
? Effect.Effect<
|
|
50
|
+
A_1,
|
|
51
|
+
import("effect/Cause").UnknownException,
|
|
52
|
+
PluginService
|
|
53
|
+
>
|
|
54
|
+
: Effect.Effect<X, never, PluginService>;
|
|
55
|
+
};
|
|
16
56
|
export declare class PluginService extends PluginService_base {
|
|
17
|
-
|
|
57
|
+
static Live: (
|
|
58
|
+
registry: PluginRegistry,
|
|
59
|
+
secrets: SecretsConfig,
|
|
60
|
+
) => Layer.Layer<
|
|
61
|
+
PluginService,
|
|
62
|
+
never,
|
|
63
|
+
PluginLoggerTag | SecretsService | ModuleFederationService
|
|
64
|
+
>;
|
|
18
65
|
}
|
|
19
66
|
export declare const PluginServiceTag: typeof PluginService;
|
|
20
|
-
export declare const PluginServiceLive: (
|
|
21
|
-
|
|
22
|
-
|
|
67
|
+
export declare const PluginServiceLive: (
|
|
68
|
+
registry: PluginRegistry,
|
|
69
|
+
secrets: SecretsConfig,
|
|
70
|
+
) => Layer.Layer<
|
|
71
|
+
PluginService,
|
|
72
|
+
never,
|
|
73
|
+
PluginLoggerTag | SecretsService | ModuleFederationService
|
|
74
|
+
>;
|
|
75
|
+
//# sourceMappingURL=plugin.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.service.d.ts","sourceRoot":"","sources":["../../../src/runtime/services/plugin.service.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"plugin.service.d.ts","sourceRoot":"","sources":["../../../src/runtime/services/plugin.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,EAAQ,KAAK,EAAY,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EACX,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,UAAU,EAAE,CACpB,QAAQ,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAC1D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,SAAS,SAAS,EAC/C,iBAAiB,EAAE,iBAAiB,KAChC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC1D,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC,SAAS,SAAS,EAC9C,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,EACjC,MAAM,EAAE,OAAO,KACX,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,SAAS,SAAS,EAC3C,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACvC,KAAK,EAAE,OAAO,KACV,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,SAAS,EACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,KACX,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7D,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC3G,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CACnD;;;;AAED,qBAAa,aAAc,SAAQ,kBAGhC;IACF,MAAM,CAAC,IAAI,GAAI,UAAU,cAAc,EAAE,SAAS,aAAa,mGAiY5D;CACH;AAED,eAAO,MAAM,gBAAgB,sBAAgB,CAAC;AAC9C,eAAO,MAAM,iBAAiB,aArYJ,cAAc,WAAW,aAAa,kGAqYb,CAAC"}
|