@brightchain/brightchain-lib 0.18.0 → 0.19.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/package.json +1 -1
- package/src/lib/db/aggregation.d.ts +20 -0
- package/src/lib/db/aggregation.d.ts.map +1 -0
- package/src/lib/db/aggregation.js +407 -0
- package/src/lib/db/aggregation.js.map +1 -0
- package/src/lib/db/collection.d.ts +315 -0
- package/src/lib/db/collection.d.ts.map +1 -0
- package/src/lib/db/collection.js +1054 -0
- package/src/lib/db/collection.js.map +1 -0
- package/src/lib/db/cursor.d.ts +51 -0
- package/src/lib/db/cursor.d.ts.map +1 -0
- package/src/lib/db/cursor.js +100 -0
- package/src/lib/db/cursor.js.map +1 -0
- package/src/lib/db/errors.d.ts +83 -0
- package/src/lib/db/errors.d.ts.map +1 -0
- package/src/lib/db/errors.js +103 -0
- package/src/lib/db/errors.js.map +1 -0
- package/src/lib/db/inMemoryDatabase.d.ts +135 -0
- package/src/lib/db/inMemoryDatabase.d.ts.map +1 -0
- package/src/lib/db/inMemoryDatabase.js +258 -0
- package/src/lib/db/inMemoryDatabase.js.map +1 -0
- package/src/lib/db/inMemoryHeadRegistry.d.ts +33 -0
- package/src/lib/db/inMemoryHeadRegistry.d.ts.map +1 -0
- package/src/lib/db/inMemoryHeadRegistry.js +83 -0
- package/src/lib/db/inMemoryHeadRegistry.js.map +1 -0
- package/src/lib/db/index.d.ts +14 -0
- package/src/lib/db/index.d.ts.map +1 -0
- package/src/lib/db/index.js +18 -0
- package/src/lib/db/index.js.map +1 -0
- package/src/lib/db/indexing.d.ts +133 -0
- package/src/lib/db/indexing.d.ts.map +1 -0
- package/src/lib/db/indexing.js +287 -0
- package/src/lib/db/indexing.js.map +1 -0
- package/src/lib/db/queryEngine.d.ts +50 -0
- package/src/lib/db/queryEngine.d.ts.map +1 -0
- package/src/lib/db/queryEngine.js +461 -0
- package/src/lib/db/queryEngine.js.map +1 -0
- package/src/lib/db/schemaValidation.d.ts +41 -0
- package/src/lib/db/schemaValidation.d.ts.map +1 -0
- package/src/lib/db/schemaValidation.js +322 -0
- package/src/lib/db/schemaValidation.js.map +1 -0
- package/src/lib/db/transaction.d.ts +88 -0
- package/src/lib/db/transaction.d.ts.map +1 -0
- package/src/lib/db/transaction.js +112 -0
- package/src/lib/db/transaction.js.map +1 -0
- package/src/lib/db/types.d.ts +11 -0
- package/src/lib/db/types.d.ts.map +1 -0
- package/src/lib/db/types.js +11 -0
- package/src/lib/db/types.js.map +1 -0
- package/src/lib/db/updateEngine.d.ts +20 -0
- package/src/lib/db/updateEngine.d.ts.map +1 -0
- package/src/lib/db/updateEngine.js +193 -0
- package/src/lib/db/updateEngine.js.map +1 -0
- package/src/lib/db/uuidGenerator.d.ts +13 -0
- package/src/lib/db/uuidGenerator.d.ts.map +1 -0
- package/src/lib/db/uuidGenerator.js +34 -0
- package/src/lib/db/uuidGenerator.js.map +1 -0
- package/src/lib/errors/memberIndexSchemaValidationError.d.ts +6 -0
- package/src/lib/errors/memberIndexSchemaValidationError.d.ts.map +1 -0
- package/src/lib/errors/memberIndexSchemaValidationError.js +15 -0
- package/src/lib/errors/memberIndexSchemaValidationError.js.map +1 -0
- package/src/lib/index.d.ts +12 -0
- package/src/lib/index.d.ts.map +1 -1
- package/src/lib/index.js +55 -1
- package/src/lib/index.js.map +1 -1
- package/src/lib/interfaces/index.d.ts +1 -0
- package/src/lib/interfaces/index.d.ts.map +1 -1
- package/src/lib/interfaces/index.js.map +1 -1
- package/src/lib/interfaces/member-init-config.d.ts +20 -0
- package/src/lib/interfaces/member-init-config.d.ts.map +1 -0
- package/src/lib/interfaces/member-init-config.js +3 -0
- package/src/lib/interfaces/member-init-config.js.map +1 -0
- package/src/lib/interfaces/storage/index.d.ts +5 -0
- package/src/lib/interfaces/storage/index.d.ts.map +1 -1
- package/src/lib/interfaces/storage/index.js.map +1 -1
- package/src/lib/interfaces/storage/memberIndexSchema.d.ts +11 -0
- package/src/lib/interfaces/storage/memberIndexSchema.d.ts.map +1 -0
- package/src/lib/interfaces/storage/memberIndexSchema.js +26 -0
- package/src/lib/interfaces/storage/memberIndexSchema.js.map +1 -0
- package/src/lib/interfaces/storage/mnemonicSchema.d.ts +10 -0
- package/src/lib/interfaces/storage/mnemonicSchema.d.ts.map +1 -0
- package/src/lib/interfaces/storage/mnemonicSchema.js +22 -0
- package/src/lib/interfaces/storage/mnemonicSchema.js.map +1 -0
- package/src/lib/interfaces/storage/roleSchema.d.ts +10 -0
- package/src/lib/interfaces/storage/roleSchema.d.ts.map +1 -0
- package/src/lib/interfaces/storage/roleSchema.js +45 -0
- package/src/lib/interfaces/storage/roleSchema.js.map +1 -0
- package/src/lib/interfaces/storage/userRoleSchema.d.ts +10 -0
- package/src/lib/interfaces/storage/userRoleSchema.d.ts.map +1 -0
- package/src/lib/interfaces/storage/userRoleSchema.js +35 -0
- package/src/lib/interfaces/storage/userRoleSchema.js.map +1 -0
- package/src/lib/interfaces/storage/userSchema.d.ts +12 -0
- package/src/lib/interfaces/storage/userSchema.d.ts.map +1 -0
- package/src/lib/interfaces/storage/userSchema.js +62 -0
- package/src/lib/interfaces/storage/userSchema.js.map +1 -0
- /package/{BLOCK_COVERAGE_AUDIT.md → brightchain-lib/BLOCK_COVERAGE_AUDIT.md} +0 -0
- /package/{BROWSER_COMPAT.md → brightchain-lib/BROWSER_COMPAT.md} +0 -0
- /package/{DEPRECATIONS.md → brightchain-lib/DEPRECATIONS.md} +0 -0
- /package/{DEPRECATIONS_REMOVED.md → brightchain-lib/DEPRECATIONS_REMOVED.md} +0 -0
- /package/{MIGRATION.md → brightchain-lib/MIGRATION.md} +0 -0
- /package/{NAMING_AUDIT.md → brightchain-lib/NAMING_AUDIT.md} +0 -0
- /package/{NAMING_CONVENTIONS.md → brightchain-lib/NAMING_CONVENTIONS.md} +0 -0
- /package/{README.md → brightchain-lib/README.md} +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* In-memory index engine for fast document lookups.
|
|
4
|
+
*
|
|
5
|
+
* Supports single-field and compound indexes with optional uniqueness.
|
|
6
|
+
* Indexes are stored as sorted maps from stringified key values to sets of document IDs.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.DuplicateKeyError = exports.IndexManager = exports.CollectionIndex = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* Represents a single index on a collection.
|
|
12
|
+
*/
|
|
13
|
+
class CollectionIndex {
|
|
14
|
+
constructor(spec, options = {}) {
|
|
15
|
+
/**
|
|
16
|
+
* Map from stringified key → Set of document IDs.
|
|
17
|
+
* For unique indexes the set will have at most 1 entry.
|
|
18
|
+
*/
|
|
19
|
+
this.entries = new Map();
|
|
20
|
+
this.spec = spec;
|
|
21
|
+
this.unique = options.unique ?? false;
|
|
22
|
+
this.sparse = options.sparse ?? false;
|
|
23
|
+
this.name =
|
|
24
|
+
options.name ??
|
|
25
|
+
Object.entries(spec)
|
|
26
|
+
.map(([k, v]) => `${k}_${v}`)
|
|
27
|
+
.join('_');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extract the index key from a document.
|
|
31
|
+
* Returns `undefined` if the document is missing a required field (and the index is sparse).
|
|
32
|
+
*/
|
|
33
|
+
extractKey(doc) {
|
|
34
|
+
const parts = [];
|
|
35
|
+
for (const field of Object.keys(this.spec)) {
|
|
36
|
+
const value = getNestedValue(doc, field);
|
|
37
|
+
if (value === undefined && this.sparse)
|
|
38
|
+
return undefined;
|
|
39
|
+
parts.push(value ?? null);
|
|
40
|
+
}
|
|
41
|
+
return JSON.stringify(parts);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Add a document to the index.
|
|
45
|
+
* @throws Error if the index is unique and a duplicate key is found.
|
|
46
|
+
*/
|
|
47
|
+
addDocument(doc) {
|
|
48
|
+
const key = this.extractKey(doc);
|
|
49
|
+
if (key === undefined)
|
|
50
|
+
return; // sparse index – skip
|
|
51
|
+
const docId = doc._id;
|
|
52
|
+
if (!docId)
|
|
53
|
+
return;
|
|
54
|
+
if (this.unique) {
|
|
55
|
+
const existing = this.entries.get(key);
|
|
56
|
+
if (existing && existing.size > 0) {
|
|
57
|
+
// Allow re-indexing the same document
|
|
58
|
+
if (!existing.has(docId)) {
|
|
59
|
+
throw new DuplicateKeyError(this.name, key);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (!this.entries.has(key)) {
|
|
64
|
+
this.entries.set(key, new Set());
|
|
65
|
+
}
|
|
66
|
+
this.entries.get(key).add(docId);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Remove a document from the index.
|
|
70
|
+
*/
|
|
71
|
+
removeDocument(doc) {
|
|
72
|
+
const key = this.extractKey(doc);
|
|
73
|
+
if (key === undefined)
|
|
74
|
+
return;
|
|
75
|
+
const docId = doc._id;
|
|
76
|
+
if (!docId)
|
|
77
|
+
return;
|
|
78
|
+
const set = this.entries.get(key);
|
|
79
|
+
if (set) {
|
|
80
|
+
set.delete(docId);
|
|
81
|
+
if (set.size === 0)
|
|
82
|
+
this.entries.delete(key);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Look up document IDs by exact field values.
|
|
87
|
+
* Returns `undefined` if the query cannot use this index.
|
|
88
|
+
*/
|
|
89
|
+
lookup(query) {
|
|
90
|
+
const fields = Object.keys(this.spec);
|
|
91
|
+
// Check that the query has exact equality on all index fields
|
|
92
|
+
const parts = [];
|
|
93
|
+
for (const field of fields) {
|
|
94
|
+
if (!(field in query))
|
|
95
|
+
return undefined;
|
|
96
|
+
const cond = query[field];
|
|
97
|
+
// Only support exact match for index lookup (not operator queries)
|
|
98
|
+
if (typeof cond === 'object' &&
|
|
99
|
+
cond !== null &&
|
|
100
|
+
!Array.isArray(cond) &&
|
|
101
|
+
!(cond instanceof Date) &&
|
|
102
|
+
!(cond instanceof RegExp)) {
|
|
103
|
+
// Check for $eq operator
|
|
104
|
+
const condObj = cond;
|
|
105
|
+
if ('$eq' in condObj) {
|
|
106
|
+
parts.push(condObj['$eq'] ?? null);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
return undefined; // Complex operator – can't use this index
|
|
110
|
+
}
|
|
111
|
+
parts.push(cond ?? null);
|
|
112
|
+
}
|
|
113
|
+
const key = JSON.stringify(parts);
|
|
114
|
+
return this.entries.get(key);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get all document IDs in the index.
|
|
118
|
+
*/
|
|
119
|
+
allIds() {
|
|
120
|
+
const all = new Set();
|
|
121
|
+
for (const set of this.entries.values()) {
|
|
122
|
+
for (const id of set)
|
|
123
|
+
all.add(id);
|
|
124
|
+
}
|
|
125
|
+
return all;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Clear the index.
|
|
129
|
+
*/
|
|
130
|
+
clear() {
|
|
131
|
+
this.entries.clear();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get the number of entries in the index.
|
|
135
|
+
*/
|
|
136
|
+
get size() {
|
|
137
|
+
return this.entries.size;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Serialize the index metadata for persistence.
|
|
141
|
+
*/
|
|
142
|
+
toJSON() {
|
|
143
|
+
return {
|
|
144
|
+
name: this.name,
|
|
145
|
+
spec: this.spec,
|
|
146
|
+
unique: this.unique,
|
|
147
|
+
sparse: this.sparse,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.CollectionIndex = CollectionIndex;
|
|
152
|
+
/**
|
|
153
|
+
* Manages multiple indexes for a collection.
|
|
154
|
+
*/
|
|
155
|
+
class IndexManager {
|
|
156
|
+
constructor() {
|
|
157
|
+
this.indexes = new Map();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create a new index.
|
|
161
|
+
* @returns The name of the created index.
|
|
162
|
+
* @throws Error if an index with the same name already exists with different options.
|
|
163
|
+
*/
|
|
164
|
+
createIndex(spec, options = {}) {
|
|
165
|
+
const index = new CollectionIndex(spec, options);
|
|
166
|
+
if (this.indexes.has(index.name)) {
|
|
167
|
+
const existing = this.indexes.get(index.name);
|
|
168
|
+
if (JSON.stringify(existing.spec) !== JSON.stringify(spec)) {
|
|
169
|
+
throw new Error(`Index "${index.name}" already exists with a different spec`);
|
|
170
|
+
}
|
|
171
|
+
return index.name;
|
|
172
|
+
}
|
|
173
|
+
this.indexes.set(index.name, index);
|
|
174
|
+
return index.name;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Drop an index by name.
|
|
178
|
+
*/
|
|
179
|
+
dropIndex(name) {
|
|
180
|
+
return this.indexes.delete(name);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get all index names.
|
|
184
|
+
*/
|
|
185
|
+
listIndexes() {
|
|
186
|
+
return Array.from(this.indexes.keys());
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get an index by name.
|
|
190
|
+
*/
|
|
191
|
+
getIndex(name) {
|
|
192
|
+
return this.indexes.get(name);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Index a document in all indexes.
|
|
196
|
+
* @throws DuplicateKeyError if a unique constraint is violated.
|
|
197
|
+
*/
|
|
198
|
+
addDocument(doc) {
|
|
199
|
+
// Validate first (so we don't partially index if one fails)
|
|
200
|
+
const toAdd = [];
|
|
201
|
+
for (const index of this.indexes.values()) {
|
|
202
|
+
toAdd.push(index);
|
|
203
|
+
}
|
|
204
|
+
// Add to all
|
|
205
|
+
for (const index of toAdd) {
|
|
206
|
+
index.addDocument(doc);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Remove a document from all indexes.
|
|
211
|
+
*/
|
|
212
|
+
removeDocument(doc) {
|
|
213
|
+
for (const index of this.indexes.values()) {
|
|
214
|
+
index.removeDocument(doc);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Rebuild all indexes from a set of documents.
|
|
219
|
+
*/
|
|
220
|
+
rebuildAll(docs) {
|
|
221
|
+
for (const index of this.indexes.values()) {
|
|
222
|
+
index.clear();
|
|
223
|
+
for (const doc of docs) {
|
|
224
|
+
index.addDocument(doc);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Try to find an index that can serve the given query filter.
|
|
230
|
+
* Returns the set of matching document IDs if an index applies, otherwise undefined.
|
|
231
|
+
*/
|
|
232
|
+
findCandidates(filter) {
|
|
233
|
+
for (const index of this.indexes.values()) {
|
|
234
|
+
const ids = index.lookup(filter);
|
|
235
|
+
if (ids !== undefined)
|
|
236
|
+
return ids;
|
|
237
|
+
}
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Serialize all index metadata for persistence.
|
|
242
|
+
*/
|
|
243
|
+
toJSON() {
|
|
244
|
+
return Array.from(this.indexes.values()).map((idx) => idx.toJSON());
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Restore indexes from serialized metadata and rebuild from docs.
|
|
248
|
+
*/
|
|
249
|
+
restoreFromJSON(metadata, docs) {
|
|
250
|
+
for (const meta of metadata) {
|
|
251
|
+
this.createIndex(meta.spec, {
|
|
252
|
+
name: meta.name,
|
|
253
|
+
unique: meta.unique,
|
|
254
|
+
sparse: meta.sparse,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
this.rebuildAll(docs);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
exports.IndexManager = IndexManager;
|
|
261
|
+
// ── Errors ──
|
|
262
|
+
class DuplicateKeyError extends Error {
|
|
263
|
+
constructor(indexName, keyValue) {
|
|
264
|
+
super(`E11000 duplicate key error collection: index "${indexName}" dup key: ${keyValue}`);
|
|
265
|
+
this.name = 'DuplicateKeyError';
|
|
266
|
+
this.indexName = indexName;
|
|
267
|
+
this.keyValue = keyValue;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
exports.DuplicateKeyError = DuplicateKeyError;
|
|
271
|
+
// ── Helpers ──
|
|
272
|
+
function getNestedValue(obj, path) {
|
|
273
|
+
const parts = path.split('.');
|
|
274
|
+
let current = obj;
|
|
275
|
+
for (const part of parts) {
|
|
276
|
+
if (current === null || current === undefined)
|
|
277
|
+
return undefined;
|
|
278
|
+
if (typeof current === 'object') {
|
|
279
|
+
current = current[part];
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
return undefined;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return current;
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=indexing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexing.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/db/indexing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query engine – evaluates MongoDB-style filter queries against documents.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Comparison: $eq, $ne, $gt, $gte, $lt, $lte
|
|
6
|
+
* - Set membership: $in, $nin
|
|
7
|
+
* - Pattern: $regex
|
|
8
|
+
* - Existence: $exists
|
|
9
|
+
* - Array: $elemMatch, $size, $all
|
|
10
|
+
* - Logical: $and, $or, $nor, $not
|
|
11
|
+
* - Type: $type
|
|
12
|
+
* - Text: $text / $search (full-text search across indexed fields)
|
|
13
|
+
*/
|
|
14
|
+
import type { FilterQuery } from '@digitaldefiance/suite-core-lib';
|
|
15
|
+
import type { BsonDocument } from '../interfaces/storage/documentTypes';
|
|
16
|
+
/**
|
|
17
|
+
* Configure which fields are included in $text search.
|
|
18
|
+
* Call this before running a filter that contains $text.
|
|
19
|
+
*/
|
|
20
|
+
export declare function setTextSearchFields(fields: string[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Get the currently configured text search fields.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getTextSearchFields(): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Compare two values for ordering (like MongoDB's BSON comparison).
|
|
27
|
+
* Returns negative if a < b, 0 if equal, positive if a > b.
|
|
28
|
+
*/
|
|
29
|
+
export declare function compareValues(a: unknown, b: unknown): number;
|
|
30
|
+
/**
|
|
31
|
+
* Deep equality check (handles primitives, arrays, plain objects, Dates).
|
|
32
|
+
*/
|
|
33
|
+
export declare function deepEquals(a: unknown, b: unknown): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a document matches a filter query.
|
|
36
|
+
*/
|
|
37
|
+
export declare function matchesFilter<T extends BsonDocument>(doc: T, filter: FilterQuery<T>): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Apply projection to a document.
|
|
40
|
+
*/
|
|
41
|
+
export declare function applyProjection<T extends BsonDocument>(doc: T, projection: Record<string, 0 | 1>): Partial<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Sort an array of documents by a sort specification.
|
|
44
|
+
*/
|
|
45
|
+
export declare function sortDocuments<T extends BsonDocument>(docs: T[], sort: Record<string, 1 | -1>): T[];
|
|
46
|
+
/**
|
|
47
|
+
* Tokenize a string into lowercase words (basic whitespace + punctuation split).
|
|
48
|
+
*/
|
|
49
|
+
export declare function tokenize(text: string): string[];
|
|
50
|
+
//# sourceMappingURL=queryEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryEngine.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/db/queryEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAEV,WAAW,EACZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAQxE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAsCD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,CAW5D;AAuHD;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAuB1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,YAAY,EAClD,GAAG,EAAE,CAAC,EACN,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GACrB,OAAO,CA+DT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EACpD,GAAG,EAAE,CAAC,EACN,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAChC,OAAO,CAAC,CAAC,CAAC,CA0BZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,YAAY,EAClD,IAAI,EAAE,CAAC,EAAE,EACT,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAC3B,CAAC,EAAE,CAaL;AAID;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C"}
|