@stoneforge/quarry 1.10.2 → 1.13.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 +3 -1
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/admin.js +313 -3
- package/dist/cli/commands/admin.js.map +1 -1
- package/dist/cli/commands/auto-link-helper.d.ts +33 -0
- package/dist/cli/commands/auto-link-helper.d.ts.map +1 -0
- package/dist/cli/commands/auto-link-helper.js +73 -0
- package/dist/cli/commands/auto-link-helper.js.map +1 -0
- package/dist/cli/commands/crud.d.ts +1 -0
- package/dist/cli/commands/crud.d.ts.map +1 -1
- package/dist/cli/commands/crud.js +44 -5
- package/dist/cli/commands/crud.js.map +1 -1
- package/dist/cli/commands/docs.d.ts +1 -0
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +81 -1
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/external-sync.d.ts +17 -0
- package/dist/cli/commands/external-sync.d.ts.map +1 -0
- package/dist/cli/commands/external-sync.js +1647 -0
- package/dist/cli/commands/external-sync.js.map +1 -0
- package/dist/cli/commands/log.d.ts +18 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +282 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/metrics.d.ts +9 -0
- package/dist/cli/commands/metrics.d.ts.map +1 -0
- package/dist/cli/commands/metrics.js +219 -0
- package/dist/cli/commands/metrics.js.map +1 -0
- package/dist/cli/runner.d.ts.map +1 -1
- package/dist/cli/runner.js +8 -0
- package/dist/cli/runner.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +28 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/defaults.d.ts +13 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +21 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/file.d.ts.map +1 -1
- package/dist/config/file.js +61 -0
- package/dist/config/file.js.map +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/merge.d.ts.map +1 -1
- package/dist/config/merge.js +46 -1
- package/dist/config/merge.js.map +1 -1
- package/dist/config/types.d.ts +63 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +30 -0
- package/dist/config/types.js.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +51 -1
- package/dist/config/validation.js.map +1 -1
- package/dist/external-sync/adapters/task-sync-adapter.d.ts +177 -0
- package/dist/external-sync/adapters/task-sync-adapter.d.ts.map +1 -0
- package/dist/external-sync/adapters/task-sync-adapter.js +353 -0
- package/dist/external-sync/adapters/task-sync-adapter.js.map +1 -0
- package/dist/external-sync/auto-link.d.ts +66 -0
- package/dist/external-sync/auto-link.d.ts.map +1 -0
- package/dist/external-sync/auto-link.js +98 -0
- package/dist/external-sync/auto-link.js.map +1 -0
- package/dist/external-sync/conflict-resolver.d.ts +170 -0
- package/dist/external-sync/conflict-resolver.d.ts.map +1 -0
- package/dist/external-sync/conflict-resolver.js +580 -0
- package/dist/external-sync/conflict-resolver.js.map +1 -0
- package/dist/external-sync/index.d.ts +20 -0
- package/dist/external-sync/index.d.ts.map +1 -0
- package/dist/external-sync/index.js +20 -0
- package/dist/external-sync/index.js.map +1 -0
- package/dist/external-sync/provider-registry.d.ts +109 -0
- package/dist/external-sync/provider-registry.d.ts.map +1 -0
- package/dist/external-sync/provider-registry.js +188 -0
- package/dist/external-sync/provider-registry.js.map +1 -0
- package/dist/external-sync/providers/github/github-api.d.ts +271 -0
- package/dist/external-sync/providers/github/github-api.d.ts.map +1 -0
- package/dist/external-sync/providers/github/github-api.js +366 -0
- package/dist/external-sync/providers/github/github-api.js.map +1 -0
- package/dist/external-sync/providers/github/github-field-map.d.ts +76 -0
- package/dist/external-sync/providers/github/github-field-map.d.ts.map +1 -0
- package/dist/external-sync/providers/github/github-field-map.js +157 -0
- package/dist/external-sync/providers/github/github-field-map.js.map +1 -0
- package/dist/external-sync/providers/github/github-provider.d.ts +36 -0
- package/dist/external-sync/providers/github/github-provider.d.ts.map +1 -0
- package/dist/external-sync/providers/github/github-provider.js +212 -0
- package/dist/external-sync/providers/github/github-provider.js.map +1 -0
- package/dist/external-sync/providers/github/github-task-adapter.d.ts +135 -0
- package/dist/external-sync/providers/github/github-task-adapter.d.ts.map +1 -0
- package/dist/external-sync/providers/github/github-task-adapter.js +374 -0
- package/dist/external-sync/providers/github/github-task-adapter.js.map +1 -0
- package/dist/external-sync/providers/github/index.d.ts +12 -0
- package/dist/external-sync/providers/github/index.d.ts.map +1 -0
- package/dist/external-sync/providers/github/index.js +15 -0
- package/dist/external-sync/providers/github/index.js.map +1 -0
- package/dist/external-sync/providers/index.d.ts +9 -0
- package/dist/external-sync/providers/index.d.ts.map +1 -0
- package/dist/external-sync/providers/index.js +10 -0
- package/dist/external-sync/providers/index.js.map +1 -0
- package/dist/external-sync/providers/linear/index.d.ts +19 -0
- package/dist/external-sync/providers/linear/index.d.ts.map +1 -0
- package/dist/external-sync/providers/linear/index.js +19 -0
- package/dist/external-sync/providers/linear/index.js.map +1 -0
- package/dist/external-sync/providers/linear/linear-api.d.ts +252 -0
- package/dist/external-sync/providers/linear/linear-api.d.ts.map +1 -0
- package/dist/external-sync/providers/linear/linear-api.js +522 -0
- package/dist/external-sync/providers/linear/linear-api.js.map +1 -0
- package/dist/external-sync/providers/linear/linear-field-map.d.ts +135 -0
- package/dist/external-sync/providers/linear/linear-field-map.d.ts.map +1 -0
- package/dist/external-sync/providers/linear/linear-field-map.js +338 -0
- package/dist/external-sync/providers/linear/linear-field-map.js.map +1 -0
- package/dist/external-sync/providers/linear/linear-provider.d.ts +52 -0
- package/dist/external-sync/providers/linear/linear-provider.d.ts.map +1 -0
- package/dist/external-sync/providers/linear/linear-provider.js +169 -0
- package/dist/external-sync/providers/linear/linear-provider.js.map +1 -0
- package/dist/external-sync/providers/linear/linear-task-adapter.d.ts +190 -0
- package/dist/external-sync/providers/linear/linear-task-adapter.d.ts.map +1 -0
- package/dist/external-sync/providers/linear/linear-task-adapter.js +521 -0
- package/dist/external-sync/providers/linear/linear-task-adapter.js.map +1 -0
- package/dist/external-sync/providers/linear/linear-types.d.ts +114 -0
- package/dist/external-sync/providers/linear/linear-types.d.ts.map +1 -0
- package/dist/external-sync/providers/linear/linear-types.js +10 -0
- package/dist/external-sync/providers/linear/linear-types.js.map +1 -0
- package/dist/external-sync/sync-engine.d.ts +298 -0
- package/dist/external-sync/sync-engine.d.ts.map +1 -0
- package/dist/external-sync/sync-engine.js +785 -0
- package/dist/external-sync/sync-engine.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/inbox.js +1 -1
- package/dist/sync/hash.d.ts +5 -0
- package/dist/sync/hash.d.ts.map +1 -1
- package/dist/sync/hash.js +21 -2
- package/dist/sync/hash.js.map +1 -1
- package/package.json +11 -5
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Detection and Resolution Module
|
|
3
|
+
*
|
|
4
|
+
* Detects conflicts during external sync (both local and remote changed since
|
|
5
|
+
* last sync) and resolves them using configurable strategies:
|
|
6
|
+
*
|
|
7
|
+
* - last_write_wins: Compare updatedAt timestamps, most recent wins
|
|
8
|
+
* - local_wins: Stoneforge version always wins
|
|
9
|
+
* - remote_wins: External version always wins
|
|
10
|
+
* - manual: Tag element with sync-conflict for human resolution
|
|
11
|
+
*
|
|
12
|
+
* Supports field-level merge: when different fields changed on each side,
|
|
13
|
+
* both changes are applied automatically. Only same-field changes are conflicts.
|
|
14
|
+
*
|
|
15
|
+
* @module conflict-resolver
|
|
16
|
+
*/
|
|
17
|
+
import type { Element, Timestamp, ConflictStrategy, ExternalSyncState, ExternalSyncConflict, ExternalTask, TaskFieldMapConfig } from '@stoneforge/core';
|
|
18
|
+
/**
|
|
19
|
+
* Information about a detected conflict between local and remote versions.
|
|
20
|
+
* Includes details about which fields changed on each side.
|
|
21
|
+
*/
|
|
22
|
+
export interface ConflictInfo {
|
|
23
|
+
/** Local element ID */
|
|
24
|
+
readonly elementId: string;
|
|
25
|
+
/** External item ID */
|
|
26
|
+
readonly externalId: string;
|
|
27
|
+
/** Provider name */
|
|
28
|
+
readonly provider: string;
|
|
29
|
+
/** Project/repository */
|
|
30
|
+
readonly project: string;
|
|
31
|
+
/** Local element's updatedAt timestamp */
|
|
32
|
+
readonly localUpdatedAt: Timestamp;
|
|
33
|
+
/** Remote item's updatedAt timestamp */
|
|
34
|
+
readonly remoteUpdatedAt: string;
|
|
35
|
+
/** Fields that changed locally (by localField name) */
|
|
36
|
+
readonly localChangedFields: readonly string[];
|
|
37
|
+
/** Fields that changed remotely (by externalField name) */
|
|
38
|
+
readonly remoteChangedFields: readonly string[];
|
|
39
|
+
/** Fields that changed on BOTH sides (true conflict) */
|
|
40
|
+
readonly conflictingFields: readonly string[];
|
|
41
|
+
/** Whether field-level merge can resolve some changes automatically */
|
|
42
|
+
readonly canFieldMerge: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Result of resolving a conflict. Contains the changes to apply
|
|
46
|
+
* to the local element and/or the external item.
|
|
47
|
+
*/
|
|
48
|
+
export interface ResolvedChanges {
|
|
49
|
+
/** The conflict that was resolved */
|
|
50
|
+
readonly conflict: ConflictInfo;
|
|
51
|
+
/** Strategy used for resolution */
|
|
52
|
+
readonly strategy: ConflictStrategy;
|
|
53
|
+
/** Whether the conflict was fully resolved (false if manual) */
|
|
54
|
+
readonly resolved: boolean;
|
|
55
|
+
/** Which side won, if resolved automatically */
|
|
56
|
+
readonly winner?: 'local' | 'remote' | 'merged';
|
|
57
|
+
/** Field values to apply to the local element (from remote or merged) */
|
|
58
|
+
readonly localUpdates?: Record<string, unknown>;
|
|
59
|
+
/** Field values to push to the external system (from local or merged) */
|
|
60
|
+
readonly remoteUpdates?: Record<string, unknown>;
|
|
61
|
+
/** For manual resolution: both versions stored for human review */
|
|
62
|
+
readonly manualConflict?: {
|
|
63
|
+
readonly local: Record<string, unknown>;
|
|
64
|
+
readonly remote: Record<string, unknown>;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Options for conflict detection, allowing callers to provide
|
|
69
|
+
* field-level change context.
|
|
70
|
+
*/
|
|
71
|
+
export interface DetectConflictOptions {
|
|
72
|
+
/** Field map config for field-level analysis (optional) */
|
|
73
|
+
readonly fieldMapConfig?: TaskFieldMapConfig;
|
|
74
|
+
/** Snapshot of local element at last push (for field-level diff) */
|
|
75
|
+
readonly localBaseline?: Record<string, unknown>;
|
|
76
|
+
/** Snapshot of remote item at last pull (for field-level diff) */
|
|
77
|
+
readonly remoteBaseline?: Record<string, unknown>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Detect whether a conflict exists between a local element and a remote item.
|
|
81
|
+
*
|
|
82
|
+
* A conflict exists when BOTH of these are true:
|
|
83
|
+
* - Local changed: current element content hash differs from lastPushedHash
|
|
84
|
+
* - Remote changed: current external item hash differs from lastPulledHash
|
|
85
|
+
*
|
|
86
|
+
* If a fieldMapConfig is provided along with baselines, performs field-level
|
|
87
|
+
* analysis to determine which specific fields conflict.
|
|
88
|
+
*
|
|
89
|
+
* @param localElement - The current local element
|
|
90
|
+
* @param remoteItem - The current external item
|
|
91
|
+
* @param syncState - The element's external sync state (from metadata._externalSync)
|
|
92
|
+
* @param options - Optional field-level detection options
|
|
93
|
+
* @returns ConflictInfo if both sides changed, or null if no conflict
|
|
94
|
+
*/
|
|
95
|
+
export declare function detectConflict(localElement: Element, remoteItem: ExternalTask, syncState: ExternalSyncState, options?: DetectConflictOptions): ConflictInfo | null;
|
|
96
|
+
/**
|
|
97
|
+
* Compute a deterministic hash for an external item's content fields.
|
|
98
|
+
* Used for change detection on the remote side.
|
|
99
|
+
*
|
|
100
|
+
* Normalizes the item to a consistent shape for hashing:
|
|
101
|
+
* sorted keys, JSON stringified, SHA256.
|
|
102
|
+
*/
|
|
103
|
+
export declare function computeExternalItemHash(item: ExternalTask): string;
|
|
104
|
+
/**
|
|
105
|
+
* Resolve a conflict using the specified strategy.
|
|
106
|
+
*
|
|
107
|
+
* Strategies:
|
|
108
|
+
* - last_write_wins: Compare updatedAt timestamps, most recent wins
|
|
109
|
+
* - local_wins: Stoneforge version always takes precedence
|
|
110
|
+
* - remote_wins: External version always takes precedence
|
|
111
|
+
* - manual: Mark for human resolution
|
|
112
|
+
*
|
|
113
|
+
* When field-level merge is possible (different fields changed on each side),
|
|
114
|
+
* non-conflicting fields are merged automatically regardless of strategy.
|
|
115
|
+
* The strategy only applies to fields that actually conflict (same field
|
|
116
|
+
* changed on both sides).
|
|
117
|
+
*
|
|
118
|
+
* @param conflict - The detected conflict info
|
|
119
|
+
* @param strategy - The resolution strategy to apply
|
|
120
|
+
* @param localElement - Current local element
|
|
121
|
+
* @param remoteItem - Current remote item
|
|
122
|
+
* @param options - Optional field map config for field-level merge
|
|
123
|
+
* @returns ResolvedChanges describing what to apply
|
|
124
|
+
*/
|
|
125
|
+
export declare function resolveConflict(conflict: ConflictInfo, strategy: ConflictStrategy, localElement?: Element, remoteItem?: ExternalTask, options?: {
|
|
126
|
+
fieldMapConfig?: TaskFieldMapConfig;
|
|
127
|
+
}): ResolvedChanges;
|
|
128
|
+
/** Tag applied to elements with unresolved sync conflicts */
|
|
129
|
+
export declare const SYNC_CONFLICT_TAG = "sync-conflict";
|
|
130
|
+
/**
|
|
131
|
+
* Apply manual conflict resolution metadata to an element.
|
|
132
|
+
* Tags the element with 'sync-conflict' and stores both versions
|
|
133
|
+
* in metadata._externalSync.conflict.
|
|
134
|
+
*
|
|
135
|
+
* @param element - The element to mark as conflicted
|
|
136
|
+
* @param conflict - The conflict info
|
|
137
|
+
* @param localValues - Local field values at time of conflict
|
|
138
|
+
* @param remoteValues - Remote field values at time of conflict
|
|
139
|
+
* @returns Updated metadata and tags to apply to the element
|
|
140
|
+
*/
|
|
141
|
+
export declare function applyManualConflict(element: Element, conflict: ConflictInfo, localValues: Record<string, unknown>, remoteValues: Record<string, unknown>): {
|
|
142
|
+
metadata: Record<string, unknown>;
|
|
143
|
+
tags: string[];
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Resolve a manual conflict by choosing a side.
|
|
147
|
+
* Clears the sync-conflict tag and conflict metadata.
|
|
148
|
+
*
|
|
149
|
+
* Returns the updates to apply to the element. The caller is
|
|
150
|
+
* responsible for applying these and pushing/pulling as needed.
|
|
151
|
+
*
|
|
152
|
+
* @param element - The element with the conflict
|
|
153
|
+
* @param keep - Which side to keep: 'local' or 'remote'
|
|
154
|
+
* @returns Updated metadata, tags, and field values from the chosen side
|
|
155
|
+
*/
|
|
156
|
+
export declare function resolveManualConflict(element: Element, keep: 'local' | 'remote'): {
|
|
157
|
+
metadata: Record<string, unknown>;
|
|
158
|
+
tags: string[];
|
|
159
|
+
fieldValues: Record<string, unknown>;
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* Convert a ConflictInfo and ResolvedChanges into an ExternalSyncConflict
|
|
163
|
+
* suitable for inclusion in sync result reports.
|
|
164
|
+
*
|
|
165
|
+
* @param conflict - The detected conflict info
|
|
166
|
+
* @param resolved - The resolution result
|
|
167
|
+
* @returns ExternalSyncConflict for reporting
|
|
168
|
+
*/
|
|
169
|
+
export declare function toExternalSyncConflict(conflict: ConflictInfo, resolved: ResolvedChanges): ExternalSyncConflict;
|
|
170
|
+
//# sourceMappingURL=conflict-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolver.d.ts","sourceRoot":"","sources":["../../src/external-sync/conflict-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EAEZ,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAO1B;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uBAAuB;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC;IACnC,wCAAwC;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,uDAAuD;IACvD,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,2DAA2D;IAC3D,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,wDAAwD;IACxD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,uEAAuE;IACvE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAChD,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,yEAAyE;IACzE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,mEAAmE;IACnE,QAAQ,CAAC,cAAc,CAAC,EAAE;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1C,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,QAAQ,CAAC,cAAc,CAAC,EAAE,kBAAkB,CAAC;IAC7C,oEAAoE;IACpE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,kEAAkE;IAClE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnD;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,OAAO,EACrB,UAAU,EAAE,YAAY,EACxB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,YAAY,GAAG,IAAI,CA6BrB;AA+BD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAmBlE;AA6GD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,CAAC,EAAE,OAAO,EACtB,UAAU,CAAC,EAAE,YAAY,EACzB,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAChD,eAAe,CA6BjB;AAiOD,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAyBvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,GACvB;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CA2BA;AAMD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,eAAe,GACxB,oBAAoB,CAYtB"}
|