@memberjunction/storage 2.38.0 → 2.40.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 (38) hide show
  1. package/dist/drivers/AWSFileStorage.d.ts +360 -4
  2. package/dist/drivers/AWSFileStorage.d.ts.map +1 -1
  3. package/dist/drivers/AWSFileStorage.js +357 -4
  4. package/dist/drivers/AWSFileStorage.js.map +1 -1
  5. package/dist/drivers/AzureFileStorage.d.ts +362 -2
  6. package/dist/drivers/AzureFileStorage.d.ts.map +1 -1
  7. package/dist/drivers/AzureFileStorage.js +357 -2
  8. package/dist/drivers/AzureFileStorage.js.map +1 -1
  9. package/dist/drivers/BoxFileStorage.d.ts +539 -20
  10. package/dist/drivers/BoxFileStorage.d.ts.map +1 -1
  11. package/dist/drivers/BoxFileStorage.js +521 -20
  12. package/dist/drivers/BoxFileStorage.js.map +1 -1
  13. package/dist/drivers/DropboxFileStorage.d.ts +437 -15
  14. package/dist/drivers/DropboxFileStorage.d.ts.map +1 -1
  15. package/dist/drivers/DropboxFileStorage.js +431 -15
  16. package/dist/drivers/DropboxFileStorage.js.map +1 -1
  17. package/dist/drivers/GoogleDriveFileStorage.d.ts +342 -16
  18. package/dist/drivers/GoogleDriveFileStorage.d.ts.map +1 -1
  19. package/dist/drivers/GoogleDriveFileStorage.js +340 -16
  20. package/dist/drivers/GoogleDriveFileStorage.js.map +1 -1
  21. package/dist/drivers/GoogleFileStorage.d.ts +358 -2
  22. package/dist/drivers/GoogleFileStorage.d.ts.map +1 -1
  23. package/dist/drivers/GoogleFileStorage.js +356 -2
  24. package/dist/drivers/GoogleFileStorage.js.map +1 -1
  25. package/dist/drivers/SharePointFileStorage.d.ts +434 -20
  26. package/dist/drivers/SharePointFileStorage.d.ts.map +1 -1
  27. package/dist/drivers/SharePointFileStorage.js +453 -22
  28. package/dist/drivers/SharePointFileStorage.js.map +1 -1
  29. package/dist/generic/FileStorageBase.d.ts +326 -108
  30. package/dist/generic/FileStorageBase.d.ts.map +1 -1
  31. package/dist/generic/FileStorageBase.js +54 -6
  32. package/dist/generic/FileStorageBase.js.map +1 -1
  33. package/dist/util.d.ts +125 -18
  34. package/dist/util.d.ts.map +1 -1
  35. package/dist/util.js +125 -18
  36. package/dist/util.js.map +1 -1
  37. package/package.json +4 -4
  38. package/readme.md +211 -1
@@ -1,30 +1,386 @@
1
1
  /// <reference types="node" />
2
2
  import { CreatePreAuthUploadUrlPayload, FileStorageBase, StorageListResult, StorageObjectMetadata } from '../generic/FileStorageBase';
3
+ /**
4
+ * Google Cloud Storage implementation of the FileStorageBase interface.
5
+ *
6
+ * This class provides methods for interacting with Google Cloud Storage as a file storage provider.
7
+ * It implements all the abstract methods defined in FileStorageBase and handles Google-specific
8
+ * authentication, authorization, and file operations.
9
+ *
10
+ * It requires the following environment variables to be set:
11
+ * - STORAGE_GOOGLE_KEY_JSON: A JSON object containing Google Cloud service account credentials
12
+ * - STORAGE_GOOGLE_BUCKET_NAME: The GCS bucket name
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // Create an instance of GoogleFileStorage
17
+ * const gcsStorage = new GoogleFileStorage();
18
+ *
19
+ * // Generate a pre-authenticated upload URL
20
+ * const { UploadUrl } = await gcsStorage.CreatePreAuthUploadUrl('documents/report.pdf');
21
+ *
22
+ * // Generate a pre-authenticated download URL
23
+ * const downloadUrl = await gcsStorage.CreatePreAuthDownloadUrl('documents/report.pdf');
24
+ *
25
+ * // List files in a directory
26
+ * const files = await gcsStorage.ListObjects('documents/');
27
+ * ```
28
+ */
3
29
  export declare class GoogleFileStorage extends FileStorageBase {
30
+ /** The name of this storage provider, used in error messages */
4
31
  protected readonly providerName = "Google Cloud Storage";
32
+ /** The GCS bucket name */
5
33
  private _bucket;
34
+ /** The Google Cloud Storage client instance */
6
35
  private _client;
36
+ /**
37
+ * Creates a new instance of GoogleFileStorage.
38
+ *
39
+ * Initializes the connection to Google Cloud Storage using environment variables.
40
+ * Throws an error if any required environment variables are missing.
41
+ */
7
42
  constructor();
8
43
  /**
9
- * Normalizes directory paths to ensure they end with a slash
44
+ * Normalizes directory paths to ensure they end with a slash.
45
+ *
46
+ * This is a helper method used internally to ensure consistency in
47
+ * directory path representation. Google Cloud Storage doesn't have actual
48
+ * directories, so we use a trailing slash to simulate them.
49
+ *
50
+ * @param path - The directory path to normalize
51
+ * @returns The normalized path with a trailing slash
52
+ * @private
10
53
  */
11
54
  private _normalizeDirectoryPath;
12
55
  /**
13
- * Converts metadata to a string map for consistent handling
56
+ * Converts metadata to a string map for consistent handling.
57
+ *
58
+ * This is a helper method used internally to ensure that all metadata
59
+ * values are strings, as required by the StorageObjectMetadata type.
60
+ *
61
+ * @param metadata - The metadata object to convert
62
+ * @returns A record with string keys and string values
63
+ * @private
14
64
  */
15
65
  private _convertMetadataToStringMap;
66
+ /**
67
+ * Creates a pre-authenticated upload URL for an object in Google Cloud Storage.
68
+ *
69
+ * This method generates a signed URL that allows for uploading an object
70
+ * to GCS without needing Google Cloud credentials. The URL is valid for
71
+ * 10 minutes and includes the content type based on the file extension.
72
+ *
73
+ * @param objectName - The name of the object to upload (including any path/directory)
74
+ * @returns A Promise resolving to an object with the upload URL
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * // Generate a pre-authenticated upload URL for a PDF file
79
+ * const { UploadUrl } = await gcsStorage.CreatePreAuthUploadUrl('documents/report.pdf');
80
+ *
81
+ * // The URL can be used with fetch or other HTTP clients to upload the file
82
+ * console.log(UploadUrl);
83
+ * ```
84
+ */
16
85
  CreatePreAuthUploadUrl(objectName: string): Promise<CreatePreAuthUploadUrlPayload>;
86
+ /**
87
+ * Creates a pre-authenticated download URL for an object in Google Cloud Storage.
88
+ *
89
+ * This method generates a signed URL that allows for downloading an object
90
+ * from GCS without needing Google Cloud credentials. The URL is valid for
91
+ * 10 minutes and can be shared with clients.
92
+ *
93
+ * @param objectName - The name of the object to download (including any path/directory)
94
+ * @returns A Promise resolving to the download URL
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * // Generate a pre-authenticated download URL for a PDF file
99
+ * const downloadUrl = await gcsStorage.CreatePreAuthDownloadUrl('documents/report.pdf');
100
+ *
101
+ * // The URL can be shared with users or used in applications for direct download
102
+ * console.log(downloadUrl);
103
+ * ```
104
+ */
17
105
  CreatePreAuthDownloadUrl(objectName: string): Promise<string>;
106
+ /**
107
+ * Moves an object from one location to another within Google Cloud Storage.
108
+ *
109
+ * Unlike some other storage providers, GCS has a native rename operation
110
+ * that can be used to efficiently move objects without needing to copy
111
+ * and delete. This method leverages that capability.
112
+ *
113
+ * @param oldObjectName - The current name/path of the object
114
+ * @param newObjectName - The new name/path for the object
115
+ * @returns A Promise resolving to a boolean indicating success
116
+ *
117
+ * @example
118
+ * ```typescript
119
+ * // Move a file from drafts to published folder
120
+ * const success = await gcsStorage.MoveObject(
121
+ * 'drafts/report.docx',
122
+ * 'published/final-report.docx'
123
+ * );
124
+ *
125
+ * if (success) {
126
+ * console.log('File successfully moved');
127
+ * } else {
128
+ * console.log('Failed to move file');
129
+ * }
130
+ * ```
131
+ */
18
132
  MoveObject(oldObjectName: string, newObjectName: string): Promise<boolean>;
133
+ /**
134
+ * Deletes an object from Google Cloud Storage.
135
+ *
136
+ * This method attempts to delete the specified object. It uses the
137
+ * ignoreNotFound option to ensure it returns true even if the object
138
+ * didn't exist.
139
+ *
140
+ * @param objectName - The name of the object to delete (including any path/directory)
141
+ * @returns A Promise resolving to a boolean indicating success
142
+ *
143
+ * @example
144
+ * ```typescript
145
+ * // Delete a temporary file
146
+ * const deleted = await gcsStorage.DeleteObject('temp/report-draft.pdf');
147
+ *
148
+ * if (deleted) {
149
+ * console.log('File successfully deleted');
150
+ * } else {
151
+ * console.log('Failed to delete file');
152
+ * }
153
+ * ```
154
+ */
19
155
  DeleteObject(objectName: string): Promise<boolean>;
156
+ /**
157
+ * Lists objects with the specified prefix in Google Cloud Storage.
158
+ *
159
+ * This method returns a list of objects (files) and prefixes (directories)
160
+ * under the specified path prefix. It uses the GCS getFiles API which
161
+ * supports delimiter-based hierarchy simulation.
162
+ *
163
+ * Note: This implementation fetches metadata for each file, which can be
164
+ * inefficient for directories with many files. In a production environment,
165
+ * you might want to optimize this for large directories.
166
+ *
167
+ * @param prefix - The path prefix to list objects from (e.g., 'documents/')
168
+ * @param delimiter - The character used to simulate directory structure, defaults to '/'
169
+ * @returns A Promise resolving to a StorageListResult containing objects and prefixes
170
+ *
171
+ * @example
172
+ * ```typescript
173
+ * // List all files and directories in the documents folder
174
+ * const result = await gcsStorage.ListObjects('documents/');
175
+ *
176
+ * // Process files
177
+ * for (const file of result.objects) {
178
+ * console.log(`File: ${file.name}, Size: ${file.size}, Type: ${file.contentType}`);
179
+ * }
180
+ *
181
+ * // Process subdirectories
182
+ * for (const dir of result.prefixes) {
183
+ * console.log(`Directory: ${dir}`);
184
+ * }
185
+ * ```
186
+ */
20
187
  ListObjects(prefix: string, delimiter?: string): Promise<StorageListResult>;
188
+ /**
189
+ * Creates a directory (virtual) in Google Cloud Storage.
190
+ *
191
+ * Since GCS doesn't have a native directory concept, this method creates
192
+ * a zero-byte object with a trailing slash to simulate a directory.
193
+ * The object has a special content type to indicate it's a directory.
194
+ *
195
+ * @param directoryPath - The path of the directory to create
196
+ * @returns A Promise resolving to a boolean indicating success
197
+ *
198
+ * @example
199
+ * ```typescript
200
+ * // Create a new directory structure
201
+ * const created = await gcsStorage.CreateDirectory('documents/reports/annual/');
202
+ *
203
+ * if (created) {
204
+ * console.log('Directory created successfully');
205
+ * } else {
206
+ * console.log('Failed to create directory');
207
+ * }
208
+ * ```
209
+ */
21
210
  CreateDirectory(directoryPath: string): Promise<boolean>;
211
+ /**
212
+ * Deletes a directory (virtual) and optionally its contents from Google Cloud Storage.
213
+ *
214
+ * For non-recursive deletion, this method simply deletes the directory
215
+ * placeholder object. For recursive deletion, it lists all objects with
216
+ * the directory path as prefix and deletes them in parallel.
217
+ *
218
+ * @param directoryPath - The path of the directory to delete
219
+ * @param recursive - If true, deletes all contents recursively (default: false)
220
+ * @returns A Promise resolving to a boolean indicating success
221
+ *
222
+ * @example
223
+ * ```typescript
224
+ * // Delete an empty directory
225
+ * const deleted = await gcsStorage.DeleteDirectory('documents/temp/');
226
+ *
227
+ * // Delete a directory and all its contents
228
+ * const recursivelyDeleted = await gcsStorage.DeleteDirectory('documents/old_projects/', true);
229
+ * ```
230
+ */
22
231
  DeleteDirectory(directoryPath: string, recursive?: boolean): Promise<boolean>;
232
+ /**
233
+ * Retrieves metadata for a specific object in Google Cloud Storage.
234
+ *
235
+ * This method fetches the properties of an object without downloading its content,
236
+ * which is more efficient for checking file attributes like size, content type,
237
+ * and last modified date.
238
+ *
239
+ * @param objectName - The name of the object to get metadata for
240
+ * @returns A Promise resolving to a StorageObjectMetadata object
241
+ * @throws Error if the object doesn't exist or cannot be accessed
242
+ *
243
+ * @example
244
+ * ```typescript
245
+ * try {
246
+ * const metadata = await gcsStorage.GetObjectMetadata('documents/report.pdf');
247
+ * console.log(`File: ${metadata.name}`);
248
+ * console.log(`Size: ${metadata.size} bytes`);
249
+ * console.log(`Last modified: ${metadata.lastModified}`);
250
+ * } catch (error) {
251
+ * console.error('File does not exist or cannot be accessed');
252
+ * }
253
+ * ```
254
+ */
23
255
  GetObjectMetadata(objectName: string): Promise<StorageObjectMetadata>;
256
+ /**
257
+ * Downloads an object's content from Google Cloud Storage.
258
+ *
259
+ * This method retrieves the full content of an object and returns it
260
+ * as a Buffer for processing in memory.
261
+ *
262
+ * @param objectName - The name of the object to download
263
+ * @returns A Promise resolving to a Buffer containing the object's data
264
+ * @throws Error if the object doesn't exist or cannot be downloaded
265
+ *
266
+ * @example
267
+ * ```typescript
268
+ * try {
269
+ * const content = await gcsStorage.GetObject('documents/config.json');
270
+ * // Parse the JSON content
271
+ * const config = JSON.parse(content.toString('utf8'));
272
+ * console.log('Configuration loaded:', config);
273
+ * } catch (error) {
274
+ * console.error('Failed to download file:', error.message);
275
+ * }
276
+ * ```
277
+ */
24
278
  GetObject(objectName: string): Promise<Buffer>;
279
+ /**
280
+ * Uploads data to an object in Google Cloud Storage.
281
+ *
282
+ * This method directly uploads a Buffer of data to an object with the specified name.
283
+ * It's useful for server-side operations where you already have the data in memory.
284
+ *
285
+ * @param objectName - The name to assign to the uploaded object
286
+ * @param data - The Buffer containing the data to upload
287
+ * @param contentType - Optional MIME type for the object (inferred from name if not provided)
288
+ * @param metadata - Optional key-value pairs of custom metadata to associate with the object
289
+ * @returns A Promise resolving to a boolean indicating success
290
+ *
291
+ * @example
292
+ * ```typescript
293
+ * // Upload a text file
294
+ * const content = Buffer.from('Hello, World!', 'utf8');
295
+ * const uploaded = await gcsStorage.PutObject(
296
+ * 'documents/hello.txt',
297
+ * content,
298
+ * 'text/plain',
299
+ * { author: 'John Doe', department: 'Engineering' }
300
+ * );
301
+ *
302
+ * if (uploaded) {
303
+ * console.log('File uploaded successfully');
304
+ * } else {
305
+ * console.log('Failed to upload file');
306
+ * }
307
+ * ```
308
+ */
25
309
  PutObject(objectName: string, data: Buffer, contentType?: string, metadata?: Record<string, string>): Promise<boolean>;
310
+ /**
311
+ * Copies an object within Google Cloud Storage.
312
+ *
313
+ * This method creates a copy of an object at a new location without removing the original.
314
+ * It uses the GCS copy API, which allows for efficient copying within the same bucket.
315
+ *
316
+ * @param sourceObjectName - The name of the object to copy
317
+ * @param destinationObjectName - The name to assign to the copied object
318
+ * @returns A Promise resolving to a boolean indicating success
319
+ *
320
+ * @example
321
+ * ```typescript
322
+ * // Create a backup copy of an important file
323
+ * const copied = await gcsStorage.CopyObject(
324
+ * 'documents/contract.pdf',
325
+ * 'backups/contract_2024-05-16.pdf'
326
+ * );
327
+ *
328
+ * if (copied) {
329
+ * console.log('File copied successfully');
330
+ * } else {
331
+ * console.log('Failed to copy file');
332
+ * }
333
+ * ```
334
+ */
26
335
  CopyObject(sourceObjectName: string, destinationObjectName: string): Promise<boolean>;
336
+ /**
337
+ * Checks if an object exists in Google Cloud Storage.
338
+ *
339
+ * This method verifies the existence of an object without downloading
340
+ * its content. This is efficient for validation purposes.
341
+ *
342
+ * @param objectName - The name of the object to check
343
+ * @returns A Promise resolving to a boolean indicating if the object exists
344
+ *
345
+ * @example
346
+ * ```typescript
347
+ * // Check if a file exists before attempting to use it
348
+ * const exists = await gcsStorage.ObjectExists('documents/report.pdf');
349
+ *
350
+ * if (exists) {
351
+ * console.log('File exists, proceeding with download');
352
+ * const content = await gcsStorage.GetObject('documents/report.pdf');
353
+ * // Process the content...
354
+ * } else {
355
+ * console.log('File does not exist');
356
+ * }
357
+ * ```
358
+ */
27
359
  ObjectExists(objectName: string): Promise<boolean>;
360
+ /**
361
+ * Checks if a directory (virtual) exists in Google Cloud Storage.
362
+ *
363
+ * Since GCS doesn't have a native directory concept, this method checks for either:
364
+ * 1. The existence of a directory placeholder object (zero-byte object with trailing slash)
365
+ * 2. The existence of any objects with the directory path as a prefix
366
+ *
367
+ * @param directoryPath - The path of the directory to check
368
+ * @returns A Promise resolving to a boolean indicating if the directory exists
369
+ *
370
+ * @example
371
+ * ```typescript
372
+ * // Check if a directory exists before trying to save files to it
373
+ * const exists = await gcsStorage.DirectoryExists('documents/reports/');
374
+ *
375
+ * if (!exists) {
376
+ * console.log('Directory does not exist, creating it first');
377
+ * await gcsStorage.CreateDirectory('documents/reports/');
378
+ * }
379
+ *
380
+ * // Now safe to use the directory
381
+ * await gcsStorage.PutObject('documents/reports/new-report.pdf', fileData);
382
+ * ```
383
+ */
28
384
  DirectoryExists(directoryPath: string): Promise<boolean>;
29
385
  }
30
386
  //# sourceMappingURL=GoogleFileStorage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GoogleFileStorage.d.ts","sourceRoot":"","sources":["../../src/drivers/GoogleFileStorage.ts"],"names":[],"mappings":";AAIA,OAAO,EACL,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AAEpC,qBACa,iBAAkB,SAAQ,eAAe;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,0BAA0B;IACzD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAU;;IASzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAUtB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAclF,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa7D,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1E,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWlD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkDxE,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBxD,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA4B3E,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA4BrE,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY9C,SAAS,CACpB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,OAAO,CAAC;IAsBN,UAAU,CAAC,gBAAgB,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBrF,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYlD,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAwBtE"}
1
+ {"version":3,"file":"GoogleFileStorage.d.ts","sourceRoot":"","sources":["../../src/drivers/GoogleFileStorage.ts"],"names":[],"mappings":";AAIA,OAAO,EACL,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBACa,iBAAkB,SAAQ,eAAe;IACpD,gEAAgE;IAChE,SAAS,CAAC,QAAQ,CAAC,YAAY,0BAA0B;IAEzD,0BAA0B;IAC1B,OAAO,CAAC,OAAO,CAAS;IAExB,+CAA+C;IAC/C,OAAO,CAAC,OAAO,CAAU;IAEzB;;;;;OAKG;;IAQH;;;;;;;;;;OAUG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;IAUnC;;;;;;;;;;;;;;;;;;OAkBG;IACU,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAc/F;;;;;;;;;;;;;;;;;;OAkBG;IACU,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa1E;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACU,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWvF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACU,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkDrF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACU,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBrE;;;;;;;;;;;;;;;;;;;OAmBG;IACU,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BxF;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA4BlF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACU,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACU,SAAS,CACpB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,OAAO,CAAC;IAsBnB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACU,UAAU,CAAC,gBAAgB,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBlG;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY/D;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACU,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAwBtE"}