@memberjunction/ng-list-management 5.34.1 → 5.36.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 (63) hide show
  1. package/README.md +179 -85
  2. package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts +74 -0
  3. package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts.map +1 -0
  4. package/dist/lib/components/audience-source-picker/audience-source-picker.component.js +396 -0
  5. package/dist/lib/components/audience-source-picker/audience-source-picker.component.js.map +1 -0
  6. package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts +34 -0
  7. package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts.map +1 -0
  8. package/dist/lib/components/audience-source-summary/audience-source-summary.component.js +136 -0
  9. package/dist/lib/components/audience-source-summary/audience-source-summary.component.js.map +1 -0
  10. package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts +55 -0
  11. package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts.map +1 -0
  12. package/dist/lib/components/list-audit-log/list-audit-log.component.js +280 -0
  13. package/dist/lib/components/list-audit-log/list-audit-log.component.js.map +1 -0
  14. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts +64 -0
  15. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts.map +1 -0
  16. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js +323 -0
  17. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js.map +1 -0
  18. package/dist/lib/components/list-invitations/list-invitations.component.d.ts +60 -0
  19. package/dist/lib/components/list-invitations/list-invitations.component.d.ts.map +1 -0
  20. package/dist/lib/components/list-invitations/list-invitations.component.js +367 -0
  21. package/dist/lib/components/list-invitations/list-invitations.component.js.map +1 -0
  22. package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +0 -4
  24. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js.map +1 -1
  25. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts +18 -1
  26. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +115 -66
  28. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -1
  29. package/dist/lib/components/list-stats/list-stats.component.d.ts +52 -0
  30. package/dist/lib/components/list-stats/list-stats.component.d.ts.map +1 -0
  31. package/dist/lib/components/list-stats/list-stats.component.js +283 -0
  32. package/dist/lib/components/list-stats/list-stats.component.js.map +1 -0
  33. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts +68 -0
  34. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts.map +1 -0
  35. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js +316 -0
  36. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js.map +1 -0
  37. package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts +47 -0
  38. package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts.map +1 -0
  39. package/dist/lib/components/shared-with-me/shared-with-me.component.js +231 -0
  40. package/dist/lib/components/shared-with-me/shared-with-me.component.js.map +1 -0
  41. package/dist/lib/components/tag-chips/tag-chips.component.d.ts +85 -0
  42. package/dist/lib/components/tag-chips/tag-chips.component.d.ts.map +1 -0
  43. package/dist/lib/components/tag-chips/tag-chips.component.js +392 -0
  44. package/dist/lib/components/tag-chips/tag-chips.component.js.map +1 -0
  45. package/dist/lib/models/list-sharing.models.d.ts +5 -0
  46. package/dist/lib/models/list-sharing.models.d.ts.map +1 -1
  47. package/dist/lib/models/list-sharing.models.js.map +1 -1
  48. package/dist/lib/module.d.ts +17 -8
  49. package/dist/lib/module.d.ts.map +1 -1
  50. package/dist/lib/module.js +51 -6
  51. package/dist/lib/module.js.map +1 -1
  52. package/dist/lib/services/list-management.service.d.ts.map +1 -1
  53. package/dist/lib/services/list-management.service.js +0 -9
  54. package/dist/lib/services/list-management.service.js.map +1 -1
  55. package/dist/lib/services/list-sharing.service.d.ts +8 -3
  56. package/dist/lib/services/list-sharing.service.d.ts.map +1 -1
  57. package/dist/lib/services/list-sharing.service.js +33 -15
  58. package/dist/lib/services/list-sharing.service.js.map +1 -1
  59. package/dist/public-api.d.ts +9 -0
  60. package/dist/public-api.d.ts.map +1 -1
  61. package/dist/public-api.js +9 -0
  62. package/dist/public-api.js.map +1 -1
  63. package/package.json +13 -11
package/README.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # @memberjunction/ng-list-management
2
2
 
3
- Angular components for managing entity list membership with a responsive dialog interface. Allows users to add and remove records from multiple lists with visual membership indicators.
3
+ Angular components for the MemberJunction Lists feature: list-membership
4
+ management, sharing, refresh-from-source preview, audience picking,
5
+ tagging, and lightweight stats. Drop-in pieces that any MJ app can use;
6
+ the components here own the UI shape, and
7
+ [`@memberjunction/lists`](../../../Lists/README.md) owns the underlying
8
+ business logic.
4
9
 
5
10
  ## Installation
6
11
 
@@ -8,37 +13,7 @@ Angular components for managing entity list membership with a responsive dialog
8
13
  npm install @memberjunction/ng-list-management
9
14
  ```
10
15
 
11
- ## Overview
12
-
13
- The List Management package provides a dialog-based UI for managing which lists a set of entity records belong to. It supports search and filtering, visual membership indicators (full/partial/none), inline list creation, batch operations with progress feedback, and list sharing via a separate sharing dialog.
14
-
15
- ```mermaid
16
- flowchart TD
17
- subgraph Dialog["List Management Dialog"]
18
- A["Search & Filter"] --> B["List Items with Membership Indicators"]
19
- B --> C["Toggle Membership"]
20
- B --> D["Inline List Creation"]
21
- end
22
- subgraph Share["List Sharing Dialog"]
23
- E["Share with Users/Roles"]
24
- end
25
- subgraph Services["Services"]
26
- F["ListManagementService"]
27
- G["ListSharingService"]
28
- end
29
-
30
- C --> F
31
- D --> F
32
- E --> G
33
-
34
- style Dialog fill:#2d6a9f,stroke:#1a4971,color:#fff
35
- style Share fill:#7c5295,stroke:#563a6b,color:#fff
36
- style Services fill:#2d8659,stroke:#1a5c3a,color:#fff
37
- ```
38
-
39
- ## Usage
40
-
41
- ### Module Import
16
+ ## Module import
42
17
 
43
18
  ```typescript
44
19
  import { ListManagementModule } from '@memberjunction/ng-list-management';
@@ -49,74 +24,193 @@ import { ListManagementModule } from '@memberjunction/ng-list-management';
49
24
  export class YourModule {}
50
25
  ```
51
26
 
52
- ### List Management Dialog
27
+ All components below are exported via this single module.
28
+
29
+ ## Components
30
+
31
+ | Selector | Component | Purpose |
32
+ | ------------------------------ | ------------------------------------ | ------------------------------------------------------------------------------------------- |
33
+ | `mj-list-management-dialog` | `ListManagementDialogComponent` | Dialog for adding/removing records to/from lists |
34
+ | `mj-list-share-dialog` | `ListShareDialogComponent` | Share-with-users-or-roles dialog (audit-log + notification footer links) |
35
+ | `mj-list-delta-confirm` | `ListDeltaConfirmComponent` | Preview-and-confirm dialog for any mutating list op (drop-guard UX) |
36
+ | `mj-save-view-as-list-dialog` | `SaveViewAsListDialogComponent` | Materialize a User View into a new static List (with optional lineage + filter snapshot) |
37
+ | `mj-list-invitations` | `ListInvitationsComponent` | Per-list invitations management — Pending / Accepted / Expired / Revoked tabs + send form |
38
+ | `mj-list-audit-log` | `ListAuditLogComponent` | Per-list audit-log viewer reading the generic `MJ: Audit Logs` table |
39
+ | `mj-lists-shared-with-me` | `ListsSharedWithMeComponent` | Browse-style grid of all lists shared with the current user |
40
+ | `mj-list-stats` | `ListStatsComponent` | Side-panel usage stats (members, monthly growth, active shares, recent-activity feed) |
41
+ | `mj-tag-chips` | `TagChipsComponent` | Compact tag chips for any entity record (read-only + editable variants) |
42
+ | `mj-audience-source-picker` | `AudienceSourcePickerComponent` | Three-tab audience picker — List / View / Ad-hoc Filter — emits typed `AudienceSource` |
43
+ | `mj-audience-source-summary` | `AudienceSourceSummaryComponent` | Compact friendly-name summary of a selected `AudienceSource` |
44
+
45
+ ## Component reference
46
+
47
+ ### `mj-list-delta-confirm`
48
+
49
+ The **only** UI path that emits a valid `DeltaToken` to apply a list
50
+ mutation. Two visual states — safe (green) and drop-warning (red with a
51
+ required acknowledgement checkbox).
52
+
53
+ ```html
54
+ <mj-list-delta-confirm
55
+ [Visible]="confirmVisible && !!delta"
56
+ [Delta]="delta"
57
+ [TargetListName]="listName"
58
+ [SourceLabel]="sourceName"
59
+ (Confirm)="onConfirm($event)"
60
+ (Cancel)="onCancel()">
61
+ </mj-list-delta-confirm>
62
+ ```
63
+
64
+ `(Confirm)` emits the `DeltaToken` string; pass it back to
65
+ `GraphQLListsClient.ApplyListDelta({ Delta, ConfirmDrops })`.
66
+
67
+ ### `mj-save-view-as-list-dialog`
68
+
69
+ Materializes a User View into a new List. Surfaces the lineage
70
+ options (one-time snapshot vs. remember source view) and the
71
+ freeze-filter toggle (`UseSnapshot`).
53
72
 
54
73
  ```html
55
- <mj-list-management-dialog
56
- [config]="listConfig"
57
- [visible]="showListDialog"
58
- (complete)="onListManagementComplete($event)"
59
- (cancel)="onListManagementCancel()">
60
- </mj-list-management-dialog>
74
+ <mj-save-view-as-list-dialog
75
+ [Provider]="provider"
76
+ [Visible]="dialogVisible"
77
+ [ViewId]="viewId"
78
+ [ViewName]="viewName"
79
+ [RecordCount]="viewRowCount"
80
+ (Save)="onSaveAsList($event)"
81
+ (Cancel)="onCancel()">
82
+ </mj-save-view-as-list-dialog>
61
83
  ```
62
84
 
63
- ### List Sharing Dialog
85
+ `(Save)` emits a `SaveViewAsListResult` — caller invokes
86
+ `GraphQLListsClient.MaterializeFromView(viewId, opts)`.
87
+
88
+ ### `mj-list-invitations`
89
+
90
+ Full invitations management for one list. Drives the `Invite` /
91
+ `RevokeInvitation` / "Resend" flows from `ListSharing`.
64
92
 
65
93
  ```html
66
- <mj-list-share-dialog
67
- [listId]="selectedListId"
68
- [visible]="showShareDialog"
69
- (closed)="onShareDialogClosed()">
70
- </mj-list-share-dialog>
94
+ <mj-list-invitations
95
+ [Provider]="provider"
96
+ [ListID]="listId"
97
+ [ListName]="listName">
98
+ </mj-list-invitations>
71
99
  ```
72
100
 
73
- ### Configuration Example
101
+ ### `mj-list-audit-log`
74
102
 
75
- ```typescript
76
- import { ListManagementDialogConfig } from '@memberjunction/ng-list-management';
77
-
78
- const listConfig: ListManagementDialogConfig = {
79
- EntityName: 'Products',
80
- RecordIDs: ['product-1', 'product-2', 'product-3'],
81
- Title: 'Manage Product Lists',
82
- AllowCreateList: true,
83
- AllowShareList: true
84
- };
103
+ Per-list audit log viewer. Reads from `MJ: Audit Logs` filtered to the
104
+ List entity + this list's ID. Joins users + audit-log-types in a single
105
+ batch query so the table renders names, not UUIDs.
106
+
107
+ ```html
108
+ <mj-list-audit-log
109
+ [Provider]="provider"
110
+ [ListID]="listId"
111
+ [PageSize]="200">
112
+ </mj-list-audit-log>
85
113
  ```
86
114
 
87
- ## Components
115
+ ### `mj-lists-shared-with-me`
88
116
 
89
- | Component | Selector | Purpose |
90
- |-----------|----------|---------|
91
- | `ListManagementDialogComponent` | `mj-list-management-dialog` | Dialog for adding/removing records to/from lists |
92
- | `ListShareDialogComponent` | `mj-list-share-dialog` | Dialog for sharing lists with users and roles |
117
+ Browse-style grid for lists shared with the current user. Click events
118
+ bubble up via `OpenList` so the host app can route through its own
119
+ navigation.
120
+
121
+ ```html
122
+ <mj-lists-shared-with-me
123
+ [Provider]="provider"
124
+ (OpenList)="onOpenList($event.ListID)">
125
+ </mj-lists-shared-with-me>
126
+ ```
127
+
128
+ ### `mj-list-stats`
129
+
130
+ Compact side panel for a list detail view. Surfaces member count,
131
+ this-month growth, active share count, time-since-last-activity, and a
132
+ recent-activity feed pulled from the audit log.
133
+
134
+ ```html
135
+ <mj-list-stats [Provider]="provider" [ListID]="listId"></mj-list-stats>
136
+ ```
137
+
138
+ ### `mj-tag-chips`
139
+
140
+ Compact, reusable tag chips for any entity record. Backed by
141
+ `MJ: Tagged Items`. Read-only by default; passing `[Editable]="true"`
142
+ shows an inline autocomplete add field and per-chip remove buttons.
143
+
144
+ ```html
145
+ <!-- Read-only chips on a card -->
146
+ <mj-tag-chips
147
+ [Provider]="provider"
148
+ EntityName="MJ: Lists"
149
+ [RecordID]="listId"
150
+ [MaxDisplay]="3"
151
+ (TagClicked)="onFilterByTag($event)">
152
+ </mj-tag-chips>
153
+
154
+ <!-- Editable chips on a detail view -->
155
+ <mj-tag-chips
156
+ [Provider]="provider"
157
+ EntityName="MJ: Lists"
158
+ [RecordID]="listId"
159
+ [Editable]="true"
160
+ [MaxDisplay]="20">
161
+ </mj-tag-chips>
162
+ ```
163
+
164
+ ### `mj-audience-source-picker` + `mj-audience-source-summary`
165
+
166
+ Reusable audience picker for Communications and any other
167
+ audience-aware feature. Emits a typed `AudienceSource` discriminated
168
+ union (same shape as `ListSource` from `@memberjunction/lists`).
169
+
170
+ ```html
171
+ <mj-audience-source-picker
172
+ [Provider]="provider"
173
+ [LockedEntityName]="entityName"
174
+ [Source]="currentSource"
175
+ (SourceChange)="audience = $event">
176
+ </mj-audience-source-picker>
177
+
178
+ <mj-audience-source-summary
179
+ [Provider]="provider"
180
+ [Source]="audience"
181
+ [RecordCount]="resolvedCount">
182
+ </mj-audience-source-summary>
183
+ ```
184
+
185
+ Three tabs: **List** (pick a saved `MJ: List`), **View** (pick a
186
+ `MJ: User View`, marked "live"), **Ad-hoc Filter** (entity + free-form
187
+ `ExtraFilter`).
93
188
 
94
189
  ## Services
95
190
 
96
- | Service | Purpose |
97
- |---------|---------|
98
- | `ListManagementService` | Business logic for list operations (add, remove, create, load) |
99
- | `ListSharingService` | Business logic for sharing lists with users and roles |
100
-
101
- ## Exported Types
102
-
103
- - `ListManagementDialogConfig` -- Configuration for the list management dialog
104
- - `ListManagementResult` -- Result returned when dialog completes
105
- - `ListOperationDetail` -- Detail of a single add/remove operation
106
- - `ListItemViewModel` -- View model for a list item with membership state
107
- - `ListFilterTab` -- Filter tab type (`'all' | 'member' | 'not-member'`)
108
- - `ListSortOption` -- Sort option type (`'name' | 'date' | 'count'`)
109
- - `CreateListConfig` -- Configuration for inline list creation
110
- - `BatchOperationResult` -- Result of batch add/remove operations
111
- - `RecordMembershipInfo` -- Membership info for a record across lists
112
- - `ListShareConfig` -- Configuration for list sharing
113
- - `ListShareResult` -- Result of sharing operations
191
+ | Service | Purpose |
192
+ | --------------------- | -------------------------------------------------------------------- |
193
+ | `ListManagementService` | Add/remove/create list operations from the management dialog |
194
+ | `ListSharingService` | Direct share writes from the share dialog (Phase 1 path; new code prefer the server-side `ListSharing` via `GraphQLListsClient`) |
195
+
196
+ ## Companion packages
197
+
198
+ For the underlying business logic and the wire-format client:
199
+
200
+ - [`@memberjunction/lists`](../../../Lists/README.md) — `ListOperations`,
201
+ `ListSharing`, `AudienceResolver`, delta-token contract.
202
+ - [`@memberjunction/graphql-dataprovider`](../../../GraphQLDataProvider/README.md)
203
+ — `GraphQLListsClient` (typed client mirroring the `ListOperationsResolver`).
204
+ - [`@memberjunction/core-actions`](../../../Actions/CoreActions/README.md)
205
+ — `MaterializeListFromView`, `ShareList`, `Compose Lists`, `Move List Members`,
206
+ `Resolve Audience`, etc. — every UI capability also available as an MJ Action.
114
207
 
115
208
  ## Dependencies
116
209
 
117
- - [@memberjunction/core](../../MJCore/README.md) -- Metadata, RunView
118
- - [@memberjunction/core-entities](../../MJCoreEntities/README.md) -- ListEntity, ListCategoryEntity
119
- - [@memberjunction/ng-shared-generic](../shared/README.md) -- Loading component
120
- - `@progress/kendo-angular-dialog` -- Dialog rendering
121
- - `@progress/kendo-angular-buttons` -- Button components
122
- - `@progress/kendo-angular-inputs` -- Input components
210
+ - [@memberjunction/core](../../MJCore/README.md) — `Metadata`, `RunView`
211
+ - [@memberjunction/core-entities](../../MJCoreEntities/README.md) — generated entity types
212
+ - [@memberjunction/lists](../../../Lists/README.md) — `AudienceSource`, `ListDelta`, `SharePermissionLevel`, etc.
213
+ - [@memberjunction/graphql-dataprovider](../../../GraphQLDataProvider/README.md) — `GraphQLListsClient`
214
+ - [@memberjunction/ng-base-types](../base-types/README.md) — `BaseAngularComponent` for multi-provider support
215
+ - [@memberjunction/ng-shared-generic](../shared/README.md) — loading component
216
+ - [@memberjunction/ng-ui-components](../ui-components/README.md) — `mj-dialog`, `mjButton`, etc.
@@ -0,0 +1,74 @@
1
+ import { EventEmitter, OnInit } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
+ import { type EntityInfo } from '@memberjunction/core';
4
+ import type { MJListEntity, MJUserViewEntity } from '@memberjunction/core-entities';
5
+ import type { AudienceSource } from '@memberjunction/lists-base';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Reusable picker for an `AudienceSource` (mockup 20). Three tabs:
9
+ *
10
+ * - **List** — pick from saved `MJ: List`s for the chosen entity.
11
+ * - **View** — pick from saved `MJ: User View`s for the chosen entity.
12
+ * Marked "live" so the user knows the record set is re-resolved at
13
+ * execution time.
14
+ * - **Ad-hoc Filter** — entity + free-form `ExtraFilter`. Skips
15
+ * server-side validation; the consumer can pre-flight via
16
+ * `ResolveAudience` (Action) or `AudienceResolver.Resolve` if desired.
17
+ *
18
+ * Emits the typed `AudienceSource` via `SourceChange` on selection; the
19
+ * sister `AudienceSourceSummaryComponent` renders the friendly summary.
20
+ * Multi-provider safe via `BaseAngularComponent.ProviderToUse`.
21
+ */
22
+ export type AudienceSourcePickerTab = 'list' | 'view' | 'adhoc';
23
+ export declare class AudienceSourcePickerComponent extends BaseAngularComponent implements OnInit {
24
+ private readonly cdr;
25
+ /**
26
+ * Pre-seed the picker with an existing audience. Useful when editing
27
+ * a previously-configured audience on a saved campaign.
28
+ */
29
+ set Source(value: AudienceSource | null);
30
+ get Source(): AudienceSource | null;
31
+ private _source;
32
+ /** When set, restrict the entity dropdown to this entity (lock it). */
33
+ LockedEntityName: string | null;
34
+ SourceChange: EventEmitter<import("@memberjunction/lists-base").ListSource | null>;
35
+ activeTab: AudienceSourcePickerTab;
36
+ entityOptions: EntityInfo[];
37
+ selectedEntityName: string | null;
38
+ availableLists: MJListEntity[];
39
+ filteredLists: MJListEntity[];
40
+ listSearch: string;
41
+ selectedListId: string | null;
42
+ availableViews: MJUserViewEntity[];
43
+ filteredViews: MJUserViewEntity[];
44
+ viewSearch: string;
45
+ selectedViewId: string | null;
46
+ adhocEntityName: string | null;
47
+ adhocFilter: string;
48
+ loading: boolean;
49
+ ngOnInit(): Promise<void>;
50
+ setTab(tab: AudienceSourcePickerTab): Promise<void>;
51
+ OnEntityChange(name: string): Promise<void>;
52
+ OnListSearchChange(): void;
53
+ OnViewSearchChange(): void;
54
+ OnSelectList(list: MJListEntity): void;
55
+ OnSelectView(view: MJUserViewEntity): void;
56
+ OnAdhocFilterChange(): void;
57
+ /**
58
+ * Build the currently-selected `AudienceSource` from picker state, or
59
+ * `null` if the picker isn't yet in a complete state.
60
+ */
61
+ get currentSource(): AudienceSource | null;
62
+ private emitCurrentSource;
63
+ /**
64
+ * Pull lists or views for the current tab from the server. We
65
+ * intentionally batch the (list, view) pair on entity change so
66
+ * switching tabs doesn't re-query.
67
+ */
68
+ private refreshTabData;
69
+ private recomputeFilteredLists;
70
+ private recomputeFilteredViews;
71
+ static ɵfac: i0.ɵɵFactoryDeclaration<AudienceSourcePickerComponent, never>;
72
+ static ɵcmp: i0.ɵɵComponentDeclaration<AudienceSourcePickerComponent, "mj-audience-source-picker", never, { "Source": { "alias": "Source"; "required": false; }; "LockedEntityName": { "alias": "LockedEntityName"; "required": false; }; }, { "SourceChange": "SourceChange"; }, never, never, false, never>;
73
+ }
74
+ //# sourceMappingURL=audience-source-picker.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audience-source-picker.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-picker/audience-source-picker.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AAEnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;;AAEjE;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,qBAOa,6BAA8B,SAAQ,oBAAqB,YAAW,MAAM;IACvF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD;;;OAGG;IACH,IACI,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,EActC;IACD,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CAElC;IACD,OAAO,CAAC,OAAO,CAA+B;IAE9C,uEAAuE;IAC9D,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEtC,YAAY,uEAA6C;IAE5D,SAAS,EAAE,uBAAuB,CAAU;IAC5C,aAAa,EAAE,UAAU,EAAE,CAAM;IAGjC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,cAAc,EAAE,YAAY,EAAE,CAAM;IACpC,aAAa,EAAE,YAAY,EAAE,CAAM;IACnC,UAAU,SAAM;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGrC,cAAc,EAAE,gBAAgB,EAAE,CAAM;IACxC,aAAa,EAAE,gBAAgB,EAAE,CAAM;IACvC,UAAU,SAAM;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGrC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,WAAW,SAAM;IAEjB,OAAO,UAAS;IAEjB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAclB,MAAM,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjD,kBAAkB,IAAI,IAAI;IAI1B,kBAAkB,IAAI,IAAI;IAI1B,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKtC,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAK1C,mBAAmB,IAAI,IAAI;IAIlC;;;OAGG;IACH,IAAW,aAAa,IAAI,cAAc,GAAG,IAAI,CAYhD;IAED,OAAO,CAAC,iBAAiB;IAMzB;;;;OAIG;YACW,cAAc;IAsC5B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,sBAAsB;yCAtLnB,6BAA6B;2CAA7B,6BAA6B;CA6LzC"}