@mondaydotcomorg/monday-authorization 3.5.0-feat-shaime-support-entity-attributes-in-authorization-sdk-a98616f → 3.5.0-feat-shaime-support-entity-attributes-in-authorization-sdk-8d846f1

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 (29) hide show
  1. package/dist/authorization-attributes-ms-service.d.ts +17 -0
  2. package/dist/authorization-attributes-ms-service.d.ts.map +1 -1
  3. package/dist/authorization-attributes-ms-service.js +165 -0
  4. package/dist/authorization-attributes-service.d.ts +52 -66
  5. package/dist/authorization-attributes-service.d.ts.map +1 -1
  6. package/dist/authorization-attributes-service.js +105 -353
  7. package/dist/constants/sns.d.ts +2 -0
  8. package/dist/constants/sns.d.ts.map +1 -1
  9. package/dist/constants/sns.js +4 -0
  10. package/dist/esm/authorization-attributes-ms-service.d.ts +17 -0
  11. package/dist/esm/authorization-attributes-ms-service.d.ts.map +1 -1
  12. package/dist/esm/authorization-attributes-ms-service.mjs +165 -0
  13. package/dist/esm/authorization-attributes-service.d.ts +52 -66
  14. package/dist/esm/authorization-attributes-service.d.ts.map +1 -1
  15. package/dist/esm/authorization-attributes-service.mjs +107 -355
  16. package/dist/esm/constants/sns.d.ts +2 -0
  17. package/dist/esm/constants/sns.d.ts.map +1 -1
  18. package/dist/esm/constants/sns.mjs +3 -1
  19. package/dist/esm/types/authorization-attributes-contracts.d.ts +16 -0
  20. package/dist/esm/types/authorization-attributes-contracts.d.ts.map +1 -1
  21. package/dist/esm/types/authorization-attributes-contracts.mjs +6 -1
  22. package/dist/types/authorization-attributes-contracts.d.ts +16 -0
  23. package/dist/types/authorization-attributes-contracts.d.ts.map +1 -1
  24. package/dist/types/authorization-attributes-contracts.js +5 -0
  25. package/package.json +1 -1
  26. package/src/authorization-attributes-ms-service.ts +246 -0
  27. package/src/authorization-attributes-service.ts +147 -426
  28. package/src/constants/sns.ts +2 -0
  29. package/src/types/authorization-attributes-contracts.ts +20 -0
@@ -10,6 +10,8 @@ import { APP_NAME } from './constants.mjs';
10
10
  const INTERNAL_APP_NAME = 'internal_ms';
11
11
  const UPSERT_RESOURCE_ATTRIBUTES_PATH = '/attributes/{accountId}/resource';
12
12
  const DELETE_RESOURCE_ATTRIBUTES_PATH = '/attributes/{accountId}/resource/{resourceType}/{resourceId}';
13
+ const UPSERT_ENTITY_ATTRIBUTES_PATH = '/attributes/{accountId}/entity';
14
+ const DELETE_ENTITY_ATTRIBUTES_PATH = '/attributes/{accountId}/entity/{entityType}/{entityId}';
13
15
  /**
14
16
  * Service class for managing resource attributes in the authorization microservice.
15
17
  * Provides synchronous HTTP operations to create/update and delete attributes on resources.
@@ -225,6 +227,169 @@ class AuthorizationAttributesMsService {
225
227
  throw err;
226
228
  }
227
229
  }
230
+ /**
231
+ * Creates or updates entity attributes synchronously.
232
+ * @param accountId The account ID
233
+ * @param entityAttributeAssignments Array of EntityAttributeAssignment objects
234
+ * @returns Promise<void>
235
+ */
236
+ static async upsertEntityAttributesSync(accountId, entityAttributeAssignments) {
237
+ // Skip HTTP requests in test environment
238
+ if (process.env.NODE_ENV === 'test') {
239
+ logger.debug({ tag: this.LOG_TAG, accountId, count: entityAttributeAssignments.length }, 'Skipping upsertEntityAttributesSync in test environment');
240
+ return;
241
+ }
242
+ // Validate inputs
243
+ if (!Number.isInteger(accountId)) {
244
+ throw new ArgumentError(`accountId must be an integer, got: ${accountId}`);
245
+ }
246
+ if (!Array.isArray(entityAttributeAssignments)) {
247
+ throw new ArgumentError('entityAttributeAssignments must be an array');
248
+ }
249
+ if (entityAttributeAssignments.length === 0) {
250
+ logger.warn({ tag: this.LOG_TAG, accountId }, 'upsertEntityAttributesSync called with empty array');
251
+ return;
252
+ }
253
+ // Validate each assignment
254
+ for (let i = 0; i < entityAttributeAssignments.length; i++) {
255
+ const assignment = entityAttributeAssignments[i];
256
+ if (!assignment.entityId || typeof assignment.entityId !== 'number') {
257
+ throw new ArgumentError(`entityAttributeAssignments[${i}].entityId is required and must be a number`);
258
+ }
259
+ if (!assignment.entityType || typeof assignment.entityType !== 'string') {
260
+ throw new ArgumentError(`entityAttributeAssignments[${i}].entityType is required and must be a string`);
261
+ }
262
+ if (!assignment.key || typeof assignment.key !== 'string') {
263
+ throw new ArgumentError(`entityAttributeAssignments[${i}].key is required and must be a string`);
264
+ }
265
+ if (assignment.value === undefined || typeof assignment.value !== 'string') {
266
+ throw new ArgumentError(`entityAttributeAssignments[${i}].value is required and must be a string`);
267
+ }
268
+ }
269
+ // Build request body
270
+ const requestBody = {
271
+ entityAttributeAssignments: entityAttributeAssignments.map(assignment => ({
272
+ entityId: assignment.entityId,
273
+ entityType: assignment.entityType,
274
+ key: assignment.key,
275
+ value: assignment.value,
276
+ })),
277
+ };
278
+ const httpClient = Api.getPart('httpClient');
279
+ if (!httpClient) {
280
+ throw new Error('AuthorizationAttributesMsService: HTTP client is not initialized');
281
+ }
282
+ const path = UPSERT_ENTITY_ATTRIBUTES_PATH.replace('{accountId}', accountId.toString());
283
+ const headers = this.getRequestHeaders(accountId);
284
+ try {
285
+ logger.info({ tag: this.LOG_TAG, accountId, count: entityAttributeAssignments.length }, 'Upserting entity attributes');
286
+ await httpClient.fetch({
287
+ url: {
288
+ appName: APP_NAME,
289
+ path,
290
+ },
291
+ method: 'POST',
292
+ headers,
293
+ body: JSON.stringify(requestBody),
294
+ }, {
295
+ timeout: AuthorizationInternalService.getRequestTimeout(),
296
+ retryPolicy: AuthorizationInternalService.getRetriesPolicy(),
297
+ });
298
+ logger.info({ tag: this.LOG_TAG, accountId, count: entityAttributeAssignments.length }, 'Successfully upserted entity attributes');
299
+ }
300
+ catch (err) {
301
+ logger.error({
302
+ tag: this.LOG_TAG,
303
+ accountId,
304
+ method: 'upsertEntityAttributesSync',
305
+ error: err instanceof Error ? err.message : String(err),
306
+ }, 'Failed to upsert entity attributes');
307
+ if (err instanceof HttpFetcherError) {
308
+ throw new Error(`AuthorizationAttributesMsService: [upsertEntityAttributesSync] request failed with status ${err.status}: ${err.message}`);
309
+ }
310
+ throw err;
311
+ }
312
+ }
313
+ /**
314
+ * Deletes specific attributes from an entity synchronously.
315
+ * @param accountId The account ID
316
+ * @param entityType The entity type
317
+ * @param entityId The entity ID
318
+ * @param attributeKeys Array of attribute key strings to delete
319
+ * @returns Promise<void>
320
+ */
321
+ static async deleteEntityAttributesSync(accountId, entityType, entityId, attributeKeys) {
322
+ // Skip HTTP requests in test environment
323
+ if (process.env.NODE_ENV === 'test') {
324
+ logger.debug({ tag: this.LOG_TAG, accountId, entityType, entityId, attributeKeys }, 'Skipping deleteEntityAttributesSync in test environment');
325
+ return;
326
+ }
327
+ // Validate inputs
328
+ if (!Number.isInteger(accountId)) {
329
+ throw new ArgumentError(`accountId must be an integer, got: ${accountId}`);
330
+ }
331
+ if (!entityType || typeof entityType !== 'string') {
332
+ throw new ArgumentError(`entityType must be a string, got: ${typeof entityType}`);
333
+ }
334
+ if (!Number.isInteger(entityId)) {
335
+ throw new ArgumentError(`entityId must be an integer, got: ${entityId}`);
336
+ }
337
+ if (!Array.isArray(attributeKeys)) {
338
+ throw new ArgumentError('attributeKeys must be an array');
339
+ }
340
+ if (attributeKeys.length === 0) {
341
+ logger.warn({ tag: this.LOG_TAG, accountId, entityType, entityId }, 'deleteEntityAttributesSync called with empty keys array');
342
+ return;
343
+ }
344
+ // Validate all keys are strings
345
+ for (let i = 0; i < attributeKeys.length; i++) {
346
+ if (typeof attributeKeys[i] !== 'string') {
347
+ throw new ArgumentError(`All attributeKeys must be strings, but item at index ${i} is not`);
348
+ }
349
+ }
350
+ // Build request body
351
+ const requestBody = {
352
+ keys: attributeKeys,
353
+ };
354
+ const httpClient = Api.getPart('httpClient');
355
+ if (!httpClient) {
356
+ throw new Error('AuthorizationAttributesMsService: HTTP client is not initialized');
357
+ }
358
+ const path = DELETE_ENTITY_ATTRIBUTES_PATH.replace('{accountId}', accountId.toString())
359
+ .replace('{entityType}', entityType)
360
+ .replace('{entityId}', entityId.toString());
361
+ const headers = this.getRequestHeaders(accountId);
362
+ try {
363
+ logger.info({ tag: this.LOG_TAG, accountId, entityType, entityId, keys: attributeKeys }, 'Deleting entity attributes');
364
+ await httpClient.fetch({
365
+ url: {
366
+ appName: APP_NAME,
367
+ path,
368
+ },
369
+ method: 'DELETE',
370
+ headers,
371
+ body: JSON.stringify(requestBody),
372
+ }, {
373
+ timeout: AuthorizationInternalService.getRequestTimeout(),
374
+ retryPolicy: AuthorizationInternalService.getRetriesPolicy(),
375
+ });
376
+ logger.info({ tag: this.LOG_TAG, accountId, entityType, entityId, keys: attributeKeys }, 'Successfully deleted entity attributes');
377
+ }
378
+ catch (err) {
379
+ logger.error({
380
+ tag: this.LOG_TAG,
381
+ accountId,
382
+ method: 'deleteEntityAttributesSync',
383
+ entityType,
384
+ entityId,
385
+ error: err instanceof Error ? err.message : String(err),
386
+ }, 'Failed to delete entity attributes');
387
+ if (err instanceof HttpFetcherError) {
388
+ throw new Error(`AuthorizationAttributesMsService: [deleteEntityAttributesSync] request failed with status ${err.status}: ${err.message}`);
389
+ }
390
+ throw err;
391
+ }
392
+ }
228
393
  }
229
394
 
230
395
  export { AuthorizationAttributesMsService };
@@ -1,35 +1,55 @@
1
- import { FetcherConfig, HttpClient } from '@mondaydotcomorg/trident-backend-api';
2
- import { RecursivePartial } from '@mondaydotcomorg/monday-fetch-api';
3
- import { ResourceAttributeAssignment, ResourceAttributeResponse, ResourceAttributesOperation, EntityAttributeAssignment, EntityAttributeResponse, ResourceType, EntityType, ResourceAttributeKeyType, EntityAttributeKeyType } from './types/authorization-attributes-contracts';
1
+ import { ResourceAttributeAssignment, ResourceAttributesOperation, EntityAttributeAssignment, EntityAttributesOperation } from './types/authorization-attributes-contracts';
4
2
  import { Resource } from './types/general';
5
3
  export declare class AuthorizationAttributesService {
6
4
  private static LOG_TAG;
7
- private static API_PATHS;
8
- private httpClient;
9
- private fetchOptions;
10
5
  private snsArn;
11
6
  /**
12
7
  * Public constructor to create the AuthorizationAttributesService instance.
13
- * @param httpClient The HTTP client to use for API requests, if not provided, the default HTTP client from Api will be used.
14
- * @param fetchOptions The fetch options to use for API requests, if not provided, the default fetch options will be used.
15
8
  */
16
- constructor(httpClient?: HttpClient, fetchOptions?: RecursivePartial<FetcherConfig>);
9
+ constructor();
17
10
  /**
18
- * Upsert resource attributes synchronously, performing http call to the authorization MS to assign the given attributes to the given resource.
19
- * @param accountId
20
- * @param resourceAttributeAssignments - Array of resource (resourceType, resourceId) and attribute (key, value) pairs to upsert in the authorization MS.
21
- * e.g. [{ resourceType: 'board', resourceId: 123, key: 'board_kind', value: 'private' }]
22
- * @returns ResourceAttributeResponse - The affected (created and updated_ resource attributes assignments in the `attributes` field.
11
+ * Async function to upsert resource attributes using SNS.
12
+ * Sends the updates request to SNS and returns before the change actually took place.
13
+ * @param accountId The account ID
14
+ * @param appName App name of the calling app
15
+ * @param callerActionIdentifier Action identifier
16
+ * @param resourceAttributeAssignments Array of resource attribute assignments to upsert
17
+ * @return Promise with array of sent operations
23
18
  */
24
- upsertResourceAttributes(accountId: number, resourceAttributeAssignments: ResourceAttributeAssignment[]): Promise<ResourceAttributeResponse>;
19
+ upsertResourceAttributesAsync(accountId: number, appName: string, callerActionIdentifier: string, resourceAttributeAssignments: ResourceAttributeAssignment[]): Promise<ResourceAttributesOperation[]>;
25
20
  /**
26
- * Delete resource attributes assignments synchronously, performing http call to the authorization MS to delete the given attributes from the given singular resource.
27
- * @param accountId
28
- * @param resource - The resource (resourceType, resourceId) to delete the attributes for.
29
- * @param attributeKeys - Array of attribute keys to delete for the resource.
30
- * @returns ResourceAttributeResponse - The affected (deleted) resource attributes assignments in the `attributes` field.
21
+ * Async function to delete resource attributes using SNS.
22
+ * Sends the updates request to SNS and returns before the change actually took place.
23
+ * @param accountId The account ID
24
+ * @param appName App name of the calling app
25
+ * @param callerActionIdentifier Action identifier
26
+ * @param resource The resource (resourceType, resourceId)
27
+ * @param attributeKeys Array of attribute keys to delete
28
+ * @return Promise with array of sent operations
29
+ */
30
+ deleteResourceAttributesAsync(accountId: number, appName: string, callerActionIdentifier: string, resource: Resource, attributeKeys: string[]): Promise<ResourceAttributesOperation[]>;
31
+ /**
32
+ * Async function to upsert entity attributes using SNS.
33
+ * Sends the updates request to SNS and returns before the change actually took place.
34
+ * @param accountId The account ID
35
+ * @param appName App name of the calling app
36
+ * @param callerActionIdentifier Action identifier
37
+ * @param entityAttributeAssignments Array of entity attribute assignments to upsert
38
+ * @return Promise with array of sent operations
39
+ */
40
+ upsertEntityAttributesAsync(accountId: number, appName: string, callerActionIdentifier: string, entityAttributeAssignments: EntityAttributeAssignment[]): Promise<EntityAttributesOperation[]>;
41
+ /**
42
+ * Async function to delete entity attributes using SNS.
43
+ * Sends the updates request to SNS and returns before the change actually took place.
44
+ * @param accountId The account ID
45
+ * @param appName App name of the calling app
46
+ * @param callerActionIdentifier Action identifier
47
+ * @param entityType The entity type
48
+ * @param entityId The entity ID
49
+ * @param attributeKeys Array of attribute keys to delete
50
+ * @return Promise with array of sent operations
31
51
  */
32
- deleteResourceAttributes(accountId: number, resource: Resource, attributeKeys: string[]): Promise<ResourceAttributeResponse>;
52
+ deleteEntityAttributesAsync(accountId: number, appName: string, callerActionIdentifier: string, entityType: string, entityId: number, attributeKeys: string[]): Promise<EntityAttributesOperation[]>;
33
53
  /**
34
54
  * Async function, this function only send the updates request to SNS and return before the change actually took place
35
55
  * @param accountId
@@ -39,7 +59,17 @@ export declare class AuthorizationAttributesService {
39
59
  * @return {Promise<ResourceAttributesOperation[]>} Array of sent operations
40
60
  * */
41
61
  updateResourceAttributesAsync(accountId: number, appName: string, callerActionIdentifier: string, resourceAttributeOperations: ResourceAttributesOperation[]): Promise<ResourceAttributesOperation[]>;
42
- private sendSingleSnsMessage;
62
+ /**
63
+ * Async function, this function only send the updates request to SNS and return before the change actually took place
64
+ * @param accountId
65
+ * @param appName - App name of the calling app
66
+ * @param callerActionIdentifier - action identifier
67
+ * @param entityAttributeOperations - Array of operations to do on entity attributes.
68
+ * @return {Promise<EntityAttributesOperation[]>} Array of sent operations
69
+ * */
70
+ updateEntityAttributesAsync(accountId: number, appName: string, callerActionIdentifier: string, entityAttributeOperations: EntityAttributesOperation[]): Promise<EntityAttributesOperation[]>;
71
+ private sendSingleResourceSnsMessage;
72
+ private sendSingleEntitySnsMessage;
43
73
  private static getSnsTopicArn;
44
74
  /**
45
75
  * Checks we can contact the required SNS topic that used to send attribute updates to Authorization MS.
@@ -50,49 +80,5 @@ export declare class AuthorizationAttributesService {
50
80
  * @return {Promise<boolean>} - true if succeeded
51
81
  */
52
82
  asyncResourceAttributesHealthCheck(): Promise<boolean>;
53
- /**
54
- * Validates resource attribute assignments array
55
- */
56
- private static validateResourceAttributeAssignments;
57
- /**
58
- * Validates entity attribute assignments array
59
- */
60
- private static validateEntityAttributeAssignments;
61
- /**
62
- * Upsert resource attributes synchronously.
63
- * Matches API endpoint: POST /attributes/:accountId/resource
64
- * @param accountId The account ID
65
- * @param resourceAttributeAssignments Array of ResourceAttributeAssignment objects (1-100 items)
66
- * @returns Promise with response containing affected attributes
67
- */
68
- static upsertResourceAttributesSync(accountId: number, resourceAttributeAssignments: ResourceAttributeAssignment[]): Promise<ResourceAttributeResponse>;
69
- /**
70
- * Delete resource attributes synchronously.
71
- * Matches API endpoint: DELETE /attributes/:accountId/resource/:resourceType/:resourceId
72
- * @param accountId The account ID
73
- * @param resourceType The resource type
74
- * @param resourceId The resource ID
75
- * @param keys Array of attribute keys to delete
76
- * @returns Promise with response containing affected attributes
77
- */
78
- static deleteResourceAttributesSync(accountId: number, resourceType: ResourceType, resourceId: number, keys: ResourceAttributeKeyType[]): Promise<ResourceAttributeResponse>;
79
- /**
80
- * Upsert entity attributes synchronously.
81
- * Matches API endpoint: POST /attributes/:accountId/entity
82
- * @param accountId The account ID
83
- * @param entityAttributeAssignments Array of EntityAttributeAssignment objects (1-100 items)
84
- * @returns Promise with response containing affected attributes
85
- */
86
- static upsertEntityAttributesSync(accountId: number, entityAttributeAssignments: EntityAttributeAssignment[]): Promise<EntityAttributeResponse>;
87
- /**
88
- * Delete entity attributes synchronously.
89
- * Matches API endpoint: DELETE /attributes/:accountId/entity/:entityType/:entityId
90
- * @param accountId The account ID
91
- * @param entityType The entity type
92
- * @param entityId The entity ID
93
- * @param keys Array of attribute keys to delete
94
- * @returns Promise with response containing affected attributes
95
- */
96
- static deleteEntityAttributesSync(accountId: number, entityType: EntityType, entityId: number, keys: EntityAttributeKeyType[]): Promise<EntityAttributeResponse>;
97
83
  }
98
84
  //# sourceMappingURL=authorization-attributes-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authorization-attributes-service.d.ts","sourceRoot":"","sources":["../../src/authorization-attributes-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,aAAa,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEtF,OAAO,EAAoB,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAW3C,qBAAa,8BAA8B;IACzC,OAAO,CAAC,MAAM,CAAC,OAAO,CAA8B;IACpD,OAAO,CAAC,MAAM,CAAC,SAAS,CAKb;IACX,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;OAIG;gBACS,UAAU,CAAC,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,gBAAgB,CAAC,aAAa,CAAC;IAqBnF;;;;;;OAMG;IACG,wBAAwB,CAC5B,SAAS,EAAE,MAAM,EACjB,4BAA4B,EAAE,2BAA2B,EAAE,GAC1D,OAAO,CAAC,yBAAyB,CAAC;IA6BrC;;;;;;OAMG;IACG,wBAAwB,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,yBAAyB,CAAC;IAkCrC;;;;;;;UAOM;IACA,6BAA6B,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,2BAA2B,EAAE,2BAA2B,EAAE,GACzD,OAAO,CAAC,2BAA2B,EAAE,CAAC;YAY3B,oBAAoB;IA4BlC,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B;;;;;;;OAOG;IACG,kCAAkC,IAAI,OAAO,CAAC,OAAO,CAAC;IAqB5D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,oCAAoC;IA2BnD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kCAAkC;IA2BjD;;;;;;OAMG;WACU,4BAA4B,CACvC,SAAS,EAAE,MAAM,EACjB,4BAA4B,EAAE,2BAA2B,EAAE,GAC1D,OAAO,CAAC,yBAAyB,CAAC;IA6CrC;;;;;;;;OAQG;WACU,4BAA4B,CACvC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,wBAAwB,EAAE,GAC/B,OAAO,CAAC,yBAAyB,CAAC;IA0DrC;;;;;;OAMG;WACU,0BAA0B,CACrC,SAAS,EAAE,MAAM,EACjB,0BAA0B,EAAE,yBAAyB,EAAE,GACtD,OAAO,CAAC,uBAAuB,CAAC;IA6CnC;;;;;;;;OAQG;WACU,0BAA0B,CACrC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,sBAAsB,EAAE,GAC7B,OAAO,CAAC,uBAAuB,CAAC;CAyDpC"}
1
+ {"version":3,"file":"authorization-attributes-service.d.ts","sourceRoot":"","sources":["../../src/authorization-attributes-service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,EAG1B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAY3C,qBAAa,8BAA8B;IACzC,OAAO,CAAC,MAAM,CAAC,OAAO,CAA8B;IACpD,OAAO,CAAC,MAAM,CAAS;IAEvB;;OAEG;;IAKH;;;;;;;;OAQG;IACG,6BAA6B,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,4BAA4B,EAAE,2BAA2B,EAAE,GAC1D,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAQzC;;;;;;;;;OASG;IACG,6BAA6B,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAUzC;;;;;;;;OAQG;IACG,2BAA2B,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,0BAA0B,EAAE,yBAAyB,EAAE,GACtD,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAQvC;;;;;;;;;;OAUG;IACG,2BAA2B,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAUvC;;;;;;;UAOM;IACA,6BAA6B,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,2BAA2B,EAAE,2BAA2B,EAAE,GACzD,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAYzC;;;;;;;UAOM;IACA,2BAA2B,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,yBAAyB,EAAE,yBAAyB,EAAE,GACrD,OAAO,CAAC,yBAAyB,EAAE,CAAC;YAYzB,4BAA4B;YA4B5B,0BAA0B;IA4BxC,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B;;;;;;;OAOG;IACG,kCAAkC,IAAI,OAAO,CAAC,OAAO,CAAC;CAoB7D"}