@qwickapps/server 1.3.0 → 1.3.1

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 (132) hide show
  1. package/README.md +154 -0
  2. package/dist/core/control-panel.d.ts.map +1 -1
  3. package/dist/core/control-panel.js +30 -2
  4. package/dist/core/control-panel.js.map +1 -1
  5. package/dist/core/plugin-registry.d.ts +36 -0
  6. package/dist/core/plugin-registry.d.ts.map +1 -1
  7. package/dist/core/plugin-registry.js +26 -0
  8. package/dist/core/plugin-registry.js.map +1 -1
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/plugins/auth/adapters/index.d.ts +1 -0
  14. package/dist/plugins/auth/adapters/index.d.ts.map +1 -1
  15. package/dist/plugins/auth/adapters/index.js +1 -0
  16. package/dist/plugins/auth/adapters/index.js.map +1 -1
  17. package/dist/plugins/auth/adapters/supabase-adapter.d.ts.map +1 -1
  18. package/dist/plugins/auth/adapters/supabase-adapter.js.map +1 -1
  19. package/dist/plugins/auth/adapters/supertokens-adapter.d.ts +18 -0
  20. package/dist/plugins/auth/adapters/supertokens-adapter.d.ts.map +1 -0
  21. package/dist/plugins/auth/adapters/supertokens-adapter.js +267 -0
  22. package/dist/plugins/auth/adapters/supertokens-adapter.js.map +1 -0
  23. package/dist/plugins/auth/env-config.d.ts +88 -0
  24. package/dist/plugins/auth/env-config.d.ts.map +1 -0
  25. package/dist/plugins/auth/env-config.js +489 -0
  26. package/dist/plugins/auth/env-config.js.map +1 -0
  27. package/dist/plugins/auth/index.d.ts +3 -1
  28. package/dist/plugins/auth/index.d.ts.map +1 -1
  29. package/dist/plugins/auth/index.js +3 -0
  30. package/dist/plugins/auth/index.js.map +1 -1
  31. package/dist/plugins/auth/supertokens-adapter.test.d.ts +10 -0
  32. package/dist/plugins/auth/supertokens-adapter.test.d.ts.map +1 -0
  33. package/dist/plugins/auth/supertokens-adapter.test.js +486 -0
  34. package/dist/plugins/auth/supertokens-adapter.test.js.map +1 -0
  35. package/dist/plugins/auth/types.d.ts +70 -0
  36. package/dist/plugins/auth/types.d.ts.map +1 -1
  37. package/dist/plugins/auth/types.js.map +1 -1
  38. package/dist/plugins/cache-plugin.test.js +3 -0
  39. package/dist/plugins/cache-plugin.test.js.map +1 -1
  40. package/dist/plugins/index.d.ts +4 -2
  41. package/dist/plugins/index.d.ts.map +1 -1
  42. package/dist/plugins/index.js +3 -1
  43. package/dist/plugins/index.js.map +1 -1
  44. package/dist/plugins/postgres-plugin.test.js +3 -0
  45. package/dist/plugins/postgres-plugin.test.js.map +1 -1
  46. package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts +7 -0
  47. package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts.map +1 -0
  48. package/dist/plugins/preferences/__tests__/deep-merge.test.js +215 -0
  49. package/dist/plugins/preferences/__tests__/deep-merge.test.js.map +1 -0
  50. package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts +7 -0
  51. package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts.map +1 -0
  52. package/dist/plugins/preferences/__tests__/preferences-plugin.test.js +265 -0
  53. package/dist/plugins/preferences/__tests__/preferences-plugin.test.js.map +1 -0
  54. package/dist/plugins/preferences/index.d.ts +12 -0
  55. package/dist/plugins/preferences/index.d.ts.map +1 -0
  56. package/dist/plugins/preferences/index.js +13 -0
  57. package/dist/plugins/preferences/index.js.map +1 -0
  58. package/dist/plugins/preferences/preferences-plugin.d.ts +39 -0
  59. package/dist/plugins/preferences/preferences-plugin.d.ts.map +1 -0
  60. package/dist/plugins/preferences/preferences-plugin.js +226 -0
  61. package/dist/plugins/preferences/preferences-plugin.js.map +1 -0
  62. package/dist/plugins/preferences/stores/index.d.ts +9 -0
  63. package/dist/plugins/preferences/stores/index.d.ts.map +1 -0
  64. package/dist/plugins/preferences/stores/index.js +9 -0
  65. package/dist/plugins/preferences/stores/index.js.map +1 -0
  66. package/dist/plugins/preferences/stores/postgres-store.d.ts +41 -0
  67. package/dist/plugins/preferences/stores/postgres-store.d.ts.map +1 -0
  68. package/dist/plugins/preferences/stores/postgres-store.js +181 -0
  69. package/dist/plugins/preferences/stores/postgres-store.js.map +1 -0
  70. package/dist/plugins/preferences/types.d.ts +91 -0
  71. package/dist/plugins/preferences/types.d.ts.map +1 -0
  72. package/dist/plugins/preferences/types.js +10 -0
  73. package/dist/plugins/preferences/types.js.map +1 -0
  74. package/dist/plugins/users/__tests__/users-plugin.test.d.ts +9 -0
  75. package/dist/plugins/users/__tests__/users-plugin.test.d.ts.map +1 -0
  76. package/dist/plugins/users/__tests__/users-plugin.test.js +546 -0
  77. package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -0
  78. package/dist/plugins/users/index.d.ts +2 -2
  79. package/dist/plugins/users/index.d.ts.map +1 -1
  80. package/dist/plugins/users/index.js +1 -1
  81. package/dist/plugins/users/index.js.map +1 -1
  82. package/dist/plugins/users/types.d.ts +36 -0
  83. package/dist/plugins/users/types.d.ts.map +1 -1
  84. package/dist/plugins/users/users-plugin.d.ts +8 -2
  85. package/dist/plugins/users/users-plugin.d.ts.map +1 -1
  86. package/dist/plugins/users/users-plugin.js +122 -5
  87. package/dist/plugins/users/users-plugin.js.map +1 -1
  88. package/dist-ui/assets/{index-Bsp2ntcw.js → index-BY8OxNgO.js} +112 -112
  89. package/dist-ui/assets/index-BY8OxNgO.js.map +1 -0
  90. package/dist-ui/index.html +1 -1
  91. package/dist-ui-lib/api/controlPanelApi.d.ts +53 -7
  92. package/dist-ui-lib/dashboard/WidgetComponentRegistry.d.ts +9 -5
  93. package/dist-ui-lib/dashboard/builtInWidgets.d.ts +7 -1
  94. package/dist-ui-lib/index.js +2382 -3651
  95. package/dist-ui-lib/index.js.map +1 -1
  96. package/dist-ui-lib/pages/AuthPage.d.ts +1 -0
  97. package/dist-ui-lib/pages/PluginsPage.d.ts +1 -0
  98. package/package.json +7 -2
  99. package/src/core/control-panel.ts +33 -2
  100. package/src/core/plugin-registry.ts +63 -0
  101. package/src/index.ts +7 -0
  102. package/src/plugins/auth/adapters/index.ts +1 -0
  103. package/src/plugins/auth/adapters/supabase-adapter.ts +22 -14
  104. package/src/plugins/auth/adapters/supertokens-adapter.ts +326 -0
  105. package/src/plugins/auth/env-config.ts +572 -0
  106. package/src/plugins/auth/index.ts +9 -0
  107. package/src/plugins/auth/supertokens-adapter.test.ts +621 -0
  108. package/src/plugins/auth/types.ts +80 -0
  109. package/src/plugins/cache-plugin.test.ts +3 -0
  110. package/src/plugins/index.ts +26 -0
  111. package/src/plugins/postgres-plugin.test.ts +3 -0
  112. package/src/plugins/preferences/__tests__/deep-merge.test.ts +242 -0
  113. package/src/plugins/preferences/__tests__/preferences-plugin.test.ts +350 -0
  114. package/src/plugins/preferences/index.ts +30 -0
  115. package/src/plugins/preferences/preferences-plugin.ts +270 -0
  116. package/src/plugins/preferences/stores/index.ts +9 -0
  117. package/src/plugins/preferences/stores/postgres-store.ts +252 -0
  118. package/src/plugins/preferences/types.ts +100 -0
  119. package/src/plugins/users/__tests__/users-plugin.test.ts +690 -0
  120. package/src/plugins/users/index.ts +3 -0
  121. package/src/plugins/users/types.ts +38 -0
  122. package/src/plugins/users/users-plugin.ts +142 -5
  123. package/ui/src/App.tsx +4 -1
  124. package/ui/src/api/controlPanelApi.ts +100 -1
  125. package/ui/src/components/ControlPanelApp.tsx +3 -0
  126. package/ui/src/dashboard/PluginWidgetRenderer.tsx +13 -10
  127. package/ui/src/dashboard/WidgetComponentRegistry.tsx +13 -9
  128. package/ui/src/dashboard/builtInWidgets.tsx +8 -2
  129. package/ui/src/pages/AuthPage.tsx +259 -0
  130. package/ui/src/pages/PluginsPage.tsx +394 -0
  131. package/ui/vite.lib.config.ts +5 -0
  132. package/dist-ui/assets/index-Bsp2ntcw.js.map +0 -1
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Supertokens Auth Adapter
3
+ *
4
+ * Provides Supertokens authentication using EmailPassword and ThirdParty recipes.
5
+ * Supports email/password and social logins (Google, Apple, GitHub).
6
+ *
7
+ * Note: Requires supertokens-node v20+
8
+ *
9
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
10
+ */
11
+ // Keys for storing data on the request object
12
+ const REQUEST_USER_KEY = '_supertokensUser';
13
+ const REQUEST_RES_KEY = '_supertokensRes';
14
+ const REQUEST_SESSION_KEY = '_supertokensSession';
15
+ /**
16
+ * Create a Supertokens authentication adapter
17
+ *
18
+ * Uses EmailPassword and ThirdParty recipes (Supertokens v20+)
19
+ */
20
+ export function supertokensAdapter(config) {
21
+ // Track initialization state
22
+ let initialized = false;
23
+ let initializationError = null;
24
+ return {
25
+ name: 'supertokens',
26
+ initialize() {
27
+ // Return middleware that lazily initializes Supertokens
28
+ const initMiddleware = async (req, res, next) => {
29
+ // Store response on request for later use in getUser()
30
+ req[REQUEST_RES_KEY] = res;
31
+ // Skip if already initialized with error
32
+ if (initializationError) {
33
+ return res.status(500).json({
34
+ error: 'Auth Configuration Error',
35
+ message: 'Supertokens is not properly configured. Install supertokens-node package: npm install supertokens-node',
36
+ details: initializationError.message,
37
+ });
38
+ }
39
+ // Lazy initialize Supertokens
40
+ if (!initialized) {
41
+ try {
42
+ const supertokens = await import('supertokens-node');
43
+ const Session = await import('supertokens-node/recipe/session');
44
+ const EmailPassword = await import('supertokens-node/recipe/emailpassword');
45
+ const ThirdParty = await import('supertokens-node/recipe/thirdparty');
46
+ // Build recipe list - using any[] for Supertokens internal types
47
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ const recipeList = [];
49
+ // Add EmailPassword recipe if enabled (default: true)
50
+ if (config.enableEmailPassword !== false) {
51
+ recipeList.push(EmailPassword.default.init());
52
+ }
53
+ // Add ThirdParty recipe if any social providers configured
54
+ if (config.socialProviders) {
55
+ // Build provider configurations using Supertokens ProviderInput type
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ const providers = [];
58
+ if (config.socialProviders.google) {
59
+ providers.push({
60
+ config: {
61
+ thirdPartyId: 'google',
62
+ clients: [
63
+ {
64
+ clientId: config.socialProviders.google.clientId,
65
+ clientSecret: config.socialProviders.google.clientSecret,
66
+ },
67
+ ],
68
+ },
69
+ });
70
+ }
71
+ if (config.socialProviders.apple) {
72
+ // Apple requires keyId, teamId, and privateKey in additionalConfig
73
+ providers.push({
74
+ config: {
75
+ thirdPartyId: 'apple',
76
+ clients: [
77
+ {
78
+ clientId: config.socialProviders.apple.clientId,
79
+ clientSecret: config.socialProviders.apple.clientSecret,
80
+ additionalConfig: {
81
+ keyId: config.socialProviders.apple.keyId,
82
+ teamId: config.socialProviders.apple.teamId,
83
+ },
84
+ },
85
+ ],
86
+ },
87
+ });
88
+ }
89
+ if (config.socialProviders.github) {
90
+ providers.push({
91
+ config: {
92
+ thirdPartyId: 'github',
93
+ clients: [
94
+ {
95
+ clientId: config.socialProviders.github.clientId,
96
+ clientSecret: config.socialProviders.github.clientSecret,
97
+ },
98
+ ],
99
+ },
100
+ });
101
+ }
102
+ if (providers.length > 0) {
103
+ recipeList.push(ThirdParty.default.init({
104
+ signInAndUpFeature: {
105
+ providers,
106
+ },
107
+ }));
108
+ }
109
+ }
110
+ // Always add Session recipe
111
+ recipeList.push(Session.default.init());
112
+ // Initialize Supertokens
113
+ supertokens.default.init({
114
+ framework: 'express',
115
+ supertokens: {
116
+ connectionURI: config.connectionUri,
117
+ apiKey: config.apiKey,
118
+ },
119
+ appInfo: {
120
+ appName: config.appName,
121
+ apiDomain: config.apiDomain,
122
+ websiteDomain: config.websiteDomain,
123
+ apiBasePath: config.apiBasePath ?? '/auth',
124
+ websiteBasePath: config.websiteBasePath ?? '/auth',
125
+ },
126
+ recipeList,
127
+ });
128
+ initialized = true;
129
+ }
130
+ catch (error) {
131
+ initializationError =
132
+ error instanceof Error ? error : new Error('Failed to initialize Supertokens');
133
+ console.error('[SupertokensAdapter] Initialization error:', error);
134
+ return res.status(500).json({
135
+ error: 'Auth Configuration Error',
136
+ message: 'Supertokens is not properly configured. Install supertokens-node package: npm install supertokens-node',
137
+ details: initializationError.message,
138
+ });
139
+ }
140
+ }
141
+ next();
142
+ };
143
+ // Supertokens middleware for handling auth routes
144
+ const supertokensMiddleware = async (req, res, next) => {
145
+ if (!initialized) {
146
+ return next();
147
+ }
148
+ try {
149
+ const { middleware } = await import('supertokens-node/framework/express');
150
+ middleware()(req, res, next);
151
+ }
152
+ catch {
153
+ next();
154
+ }
155
+ };
156
+ return [initMiddleware, supertokensMiddleware];
157
+ },
158
+ isAuthenticated(req) {
159
+ const extReq = req;
160
+ // Check if we already validated this request
161
+ if (extReq[REQUEST_USER_KEY]) {
162
+ return true;
163
+ }
164
+ // Check if session was already retrieved
165
+ if (extReq[REQUEST_SESSION_KEY]) {
166
+ return true;
167
+ }
168
+ // For synchronous check, we can only check if session cookies exist
169
+ // Full validation happens in getUser()
170
+ // Supertokens uses cookies, so we check for session tokens
171
+ const cookies = req.cookies || {};
172
+ const accessToken = cookies.sAccessToken;
173
+ const refreshToken = cookies.sRefreshToken;
174
+ // Also check for Authorization header (for API clients)
175
+ const authHeader = req.headers.authorization;
176
+ const hasBearerToken = authHeader?.startsWith('Bearer ');
177
+ return !!(accessToken || refreshToken || hasBearerToken);
178
+ },
179
+ async getUser(req) {
180
+ const extReq = req;
181
+ // Return cached user if available
182
+ const cachedUser = extReq[REQUEST_USER_KEY];
183
+ if (cachedUser) {
184
+ return cachedUser;
185
+ }
186
+ if (!initialized) {
187
+ return null;
188
+ }
189
+ // Get response object stored during middleware
190
+ const res = extReq[REQUEST_RES_KEY];
191
+ if (!res) {
192
+ console.error('[SupertokensAdapter] Response object not found on request');
193
+ return null;
194
+ }
195
+ try {
196
+ const Session = await import('supertokens-node/recipe/session');
197
+ const supertokens = await import('supertokens-node');
198
+ // Get session - sessionRequired: false means it won't throw if no session
199
+ const session = await Session.default.getSession(req, res, {
200
+ sessionRequired: false,
201
+ });
202
+ if (!session) {
203
+ return null;
204
+ }
205
+ // Cache session for isAuthenticated check
206
+ extReq[REQUEST_SESSION_KEY] = session;
207
+ const userId = session.getUserId();
208
+ // Get user info from Supertokens
209
+ const userInfo = await supertokens.default.getUser(userId);
210
+ if (!userInfo) {
211
+ return null;
212
+ }
213
+ // Get roles from session access token payload if available
214
+ const accessTokenPayload = session.getAccessTokenPayload();
215
+ const roles = accessTokenPayload?.roles || [];
216
+ // Map Supertokens user to AuthenticatedUser
217
+ const user = {
218
+ id: userId,
219
+ email: userInfo.emails?.[0] ?? '',
220
+ name: accessTokenPayload?.name ||
221
+ userInfo.thirdParty?.[0]?.userId ||
222
+ userInfo.emails?.[0]?.split('@')[0],
223
+ picture: accessTokenPayload?.picture,
224
+ emailVerified: userInfo.emails?.[0] ? true : false,
225
+ roles,
226
+ raw: {
227
+ ...userInfo,
228
+ sessionHandle: session.getHandle(),
229
+ accessTokenPayload,
230
+ },
231
+ };
232
+ // Cache on request object
233
+ extReq[REQUEST_USER_KEY] = user;
234
+ return user;
235
+ }
236
+ catch (error) {
237
+ console.error('[SupertokensAdapter] Error getting user:', error);
238
+ return null;
239
+ }
240
+ },
241
+ hasRoles(req, roles) {
242
+ const extReq = req;
243
+ const user = extReq[REQUEST_USER_KEY];
244
+ if (!user?.roles)
245
+ return false;
246
+ return roles.every((role) => user.roles?.includes(role));
247
+ },
248
+ getAccessToken(_req) {
249
+ // Supertokens uses session cookies, not access tokens
250
+ // Return null as per the design decision
251
+ return null;
252
+ },
253
+ onUnauthorized(_req, res) {
254
+ res.status(401).json({
255
+ error: 'Unauthorized',
256
+ message: 'Authentication required. Please sign in.',
257
+ hint: 'Use the /auth endpoints to authenticate',
258
+ });
259
+ },
260
+ async shutdown() {
261
+ // Supertokens doesn't require explicit cleanup
262
+ initialized = false;
263
+ initializationError = null;
264
+ },
265
+ };
266
+ }
267
+ //# sourceMappingURL=supertokens-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supertokens-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/supertokens-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Auth Plugin Environment Configuration
3
+ *
4
+ * Factory function and utilities for configuring auth adapters via environment variables.
5
+ * Supports all adapters: Auth0, Supabase, Supertokens, Basic.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ import type { Plugin } from '../../core/plugin-registry.js';
10
+ import type { Auth0AdapterConfig, SupabaseAdapterConfig, SupertokensAdapterConfig, BasicAdapterConfig, AuthEnvPluginOptions, AuthConfigStatus } from './types.js';
11
+ /**
12
+ * Get an environment variable, treating empty strings as undefined
13
+ */
14
+ declare function getEnv(key: string): string | undefined;
15
+ /**
16
+ * Parse a boolean environment variable
17
+ * Supports: true/false, 1/0, yes/no (case-insensitive)
18
+ */
19
+ declare function getEnvBool(key: string, defaultValue: boolean): boolean;
20
+ /**
21
+ * Parse a comma-separated list environment variable
22
+ */
23
+ declare function getEnvList(key: string): string[] | undefined;
24
+ /**
25
+ * Mask a sensitive value for display
26
+ */
27
+ declare function maskValue(value: string): string;
28
+ interface EnvParseResult<T> {
29
+ config: T | null;
30
+ errors: string[];
31
+ }
32
+ /**
33
+ * Parse Supertokens configuration from environment variables
34
+ */
35
+ declare function parseSupertokensEnv(): EnvParseResult<SupertokensAdapterConfig>;
36
+ /**
37
+ * Parse Auth0 configuration from environment variables
38
+ */
39
+ declare function parseAuth0Env(): EnvParseResult<Auth0AdapterConfig>;
40
+ /**
41
+ * Parse Supabase configuration from environment variables
42
+ */
43
+ declare function parseSupabaseEnv(): EnvParseResult<SupabaseAdapterConfig>;
44
+ /**
45
+ * Parse Basic Auth configuration from environment variables
46
+ */
47
+ declare function parseBasicAuthEnv(): EnvParseResult<BasicAdapterConfig>;
48
+ /**
49
+ * Create an auth plugin configured from environment variables.
50
+ *
51
+ * The plugin state depends on environment configuration:
52
+ * - **disabled**: AUTH_ADAPTER not set - no authentication middleware is applied
53
+ * - **enabled**: Valid configuration - adapter is active and working
54
+ * - **error**: Invalid configuration - plugin is disabled with error details
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * // Zero-config setup - reads everything from env vars
59
+ * const authPlugin = createAuthPluginFromEnv();
60
+ *
61
+ * // With overrides
62
+ * const authPlugin = createAuthPluginFromEnv({
63
+ * excludePaths: ['/health', '/metrics'],
64
+ * authRequired: true,
65
+ * });
66
+ * ```
67
+ *
68
+ * @param options - Optional overrides (env vars take precedence for adapter config)
69
+ * @returns A Plugin instance
70
+ */
71
+ export declare function createAuthPluginFromEnv(options?: AuthEnvPluginOptions): Plugin;
72
+ /**
73
+ * Get current auth plugin status
74
+ */
75
+ export declare function getAuthStatus(): AuthConfigStatus;
76
+ export declare const __testing: {
77
+ parseSupertokensEnv: typeof parseSupertokensEnv;
78
+ parseAuth0Env: typeof parseAuth0Env;
79
+ parseSupabaseEnv: typeof parseSupabaseEnv;
80
+ parseBasicAuthEnv: typeof parseBasicAuthEnv;
81
+ getEnv: typeof getEnv;
82
+ getEnvBool: typeof getEnvBool;
83
+ getEnvList: typeof getEnvList;
84
+ maskValue: typeof maskValue;
85
+ VALID_ADAPTERS: readonly ["supertokens", "auth0", "supabase", "basic"];
86
+ };
87
+ export {};
88
+ //# sourceMappingURL=env-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/env-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,+BAA+B,CAAC;AAC1F,OAAO,KAAK,EAEV,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAoBpB;;GAEG;AACH,iBAAS,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM/C;AAED;;;GAGG;AACH,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAa/D;AAED;;GAEG;AACH,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CASrD;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKxC;AAMD,UAAU,cAAc,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,iBAAS,mBAAmB,IAAI,cAAc,CAAC,wBAAwB,CAAC,CAoEvE;AAED;;GAEG;AACH,iBAAS,aAAa,IAAI,cAAc,CAAC,kBAAkB,CAAC,CAwC3D;AAED;;GAEG;AACH,iBAAS,gBAAgB,IAAI,cAAc,CAAC,qBAAqB,CAAC,CAoBjE;AAED;;GAEG;AACH,iBAAS,iBAAiB,IAAI,cAAc,CAAC,kBAAkB,CAAC,CAqB/D;AAYD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CA0G9E;AAMD;;GAEG;AACH,wBAAgB,aAAa,IAAI,gBAAgB,CAEhD;AA2ID,eAAO,MAAM,SAAS;;;;;;;;;;CAUrB,CAAC"}