@fluidframework/driver-utils 2.0.0-internal.5.1.0 → 2.0.0-internal.5.2.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/CHANGELOG.md +4 -0
- package/dist/adapters/compression/compressionTypes.d.ts +17 -0
- package/dist/adapters/compression/compressionTypes.d.ts.map +1 -0
- package/dist/adapters/compression/compressionTypes.js +17 -0
- package/dist/adapters/compression/compressionTypes.js.map +1 -0
- package/dist/adapters/compression/documentServiceCompressionAdapter.d.ts +13 -0
- package/dist/adapters/compression/documentServiceCompressionAdapter.d.ts.map +1 -0
- package/dist/adapters/compression/documentServiceCompressionAdapter.js +23 -0
- package/dist/adapters/compression/documentServiceCompressionAdapter.js.map +1 -0
- package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.d.ts +16 -0
- package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.d.ts.map +1 -0
- package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.js +36 -0
- package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.js.map +1 -0
- package/dist/adapters/compression/index.d.ts +8 -0
- package/dist/adapters/compression/index.d.ts.map +1 -0
- package/dist/adapters/compression/index.js +15 -0
- package/dist/adapters/compression/index.js.map +1 -0
- package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts +161 -0
- package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts.map +1 -0
- package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js +365 -0
- package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js.map +1 -0
- package/dist/adapters/compression/summaryblob/index.d.ts +6 -0
- package/dist/adapters/compression/summaryblob/index.d.ts.map +1 -0
- package/dist/adapters/compression/summaryblob/index.js +11 -0
- package/dist/adapters/compression/summaryblob/index.js.map +1 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +14 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/predefinedAdapters.d.ts +20 -0
- package/dist/adapters/predefinedAdapters.d.ts.map +1 -0
- package/dist/adapters/predefinedAdapters.js +51 -0
- package/dist/adapters/predefinedAdapters.js.map +1 -0
- package/dist/documentServiceFactoryProxy.d.ts +19 -0
- package/dist/documentServiceFactoryProxy.d.ts.map +1 -0
- package/dist/documentServiceFactoryProxy.js +27 -0
- package/dist/documentServiceFactoryProxy.js.map +1 -0
- package/dist/documentServiceProxy.d.ts +21 -0
- package/dist/documentServiceProxy.d.ts.map +1 -0
- package/dist/documentServiceProxy.js +36 -0
- package/dist/documentServiceProxy.js.map +1 -0
- package/dist/documentStorageServiceProxy.d.ts.map +1 -1
- package/dist/documentStorageServiceProxy.js +1 -0
- package/dist/documentStorageServiceProxy.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/parallelRequests.d.ts.map +1 -1
- package/dist/parallelRequests.js +4 -3
- package/dist/parallelRequests.js.map +1 -1
- package/lib/adapters/compression/compressionTypes.d.ts +17 -0
- package/lib/adapters/compression/compressionTypes.d.ts.map +1 -0
- package/lib/adapters/compression/compressionTypes.js +14 -0
- package/lib/adapters/compression/compressionTypes.js.map +1 -0
- package/lib/adapters/compression/documentServiceCompressionAdapter.d.ts +13 -0
- package/lib/adapters/compression/documentServiceCompressionAdapter.d.ts.map +1 -0
- package/lib/adapters/compression/documentServiceCompressionAdapter.js +19 -0
- package/lib/adapters/compression/documentServiceCompressionAdapter.js.map +1 -0
- package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.d.ts +16 -0
- package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.d.ts.map +1 -0
- package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.js +32 -0
- package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.js.map +1 -0
- package/lib/adapters/compression/index.d.ts +8 -0
- package/lib/adapters/compression/index.d.ts.map +1 -0
- package/lib/adapters/compression/index.js +8 -0
- package/lib/adapters/compression/index.js.map +1 -0
- package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts +161 -0
- package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts.map +1 -0
- package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js +361 -0
- package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js.map +1 -0
- package/lib/adapters/compression/summaryblob/index.d.ts +6 -0
- package/lib/adapters/compression/summaryblob/index.d.ts.map +1 -0
- package/lib/adapters/compression/summaryblob/index.js +6 -0
- package/lib/adapters/compression/summaryblob/index.js.map +1 -0
- package/lib/adapters/index.d.ts +7 -0
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +7 -0
- package/lib/adapters/index.js.map +1 -0
- package/lib/adapters/predefinedAdapters.d.ts +20 -0
- package/lib/adapters/predefinedAdapters.d.ts.map +1 -0
- package/lib/adapters/predefinedAdapters.js +46 -0
- package/lib/adapters/predefinedAdapters.js.map +1 -0
- package/lib/documentServiceFactoryProxy.d.ts +19 -0
- package/lib/documentServiceFactoryProxy.d.ts.map +1 -0
- package/lib/documentServiceFactoryProxy.js +23 -0
- package/lib/documentServiceFactoryProxy.js.map +1 -0
- package/lib/documentServiceProxy.d.ts +21 -0
- package/lib/documentServiceProxy.d.ts.map +1 -0
- package/lib/documentServiceProxy.js +32 -0
- package/lib/documentServiceProxy.js.map +1 -0
- package/lib/documentStorageServiceProxy.d.ts.map +1 -1
- package/lib/documentStorageServiceProxy.js +1 -0
- package/lib/documentStorageServiceProxy.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/parallelRequests.d.ts.map +1 -1
- package/lib/parallelRequests.js +4 -3
- package/lib/parallelRequests.js.map +1 -1
- package/package.json +8 -7
- package/src/adapters/compression/compressionTypes.ts +19 -0
- package/src/adapters/compression/documentServiceCompressionAdapter.ts +25 -0
- package/src/adapters/compression/documentServiceFactoryCompressionAdapter.ts +62 -0
- package/src/adapters/compression/index.ts +12 -0
- package/src/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.ts +446 -0
- package/src/adapters/compression/summaryblob/index.ts +9 -0
- package/src/adapters/index.ts +13 -0
- package/src/adapters/predefinedAdapters.ts +71 -0
- package/src/documentServiceFactoryProxy.ts +47 -0
- package/src/documentServiceProxy.ts +46 -0
- package/src/documentStorageServiceProxy.ts +1 -0
- package/src/index.ts +5 -0
- package/src/packageVersion.ts +1 -1
- package/src/parallelRequests.ts +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum SummaryCompressionAlgorithm {
|
|
6
|
+
None = 0,
|
|
7
|
+
LZ4 = 1
|
|
8
|
+
}
|
|
9
|
+
export interface ICompressionStorageConfig {
|
|
10
|
+
algorithm: SummaryCompressionAlgorithm;
|
|
11
|
+
minSizeToCompress: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const DefaultCompressionStorageConfig: {
|
|
14
|
+
algorithm: SummaryCompressionAlgorithm;
|
|
15
|
+
minSizeToCompress: number;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=compressionTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressionTypes.d.ts","sourceRoot":"","sources":["../../../src/adapters/compression/compressionTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oBAAY,2BAA2B;IACtC,IAAI,IAAI;IACR,GAAG,IAAI;CACP;AAED,MAAM,WAAW,yBAAyB;IACzC,SAAS,EAAE,2BAA2B,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,+BAA+B;;;CAG3C,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DefaultCompressionStorageConfig = exports.SummaryCompressionAlgorithm = void 0;
|
|
8
|
+
var SummaryCompressionAlgorithm;
|
|
9
|
+
(function (SummaryCompressionAlgorithm) {
|
|
10
|
+
SummaryCompressionAlgorithm[SummaryCompressionAlgorithm["None"] = 0] = "None";
|
|
11
|
+
SummaryCompressionAlgorithm[SummaryCompressionAlgorithm["LZ4"] = 1] = "LZ4";
|
|
12
|
+
})(SummaryCompressionAlgorithm = exports.SummaryCompressionAlgorithm || (exports.SummaryCompressionAlgorithm = {}));
|
|
13
|
+
exports.DefaultCompressionStorageConfig = {
|
|
14
|
+
algorithm: SummaryCompressionAlgorithm.LZ4,
|
|
15
|
+
minSizeToCompress: 500,
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=compressionTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressionTypes.js","sourceRoot":"","sources":["../../../src/adapters/compression/compressionTypes.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,IAAY,2BAGX;AAHD,WAAY,2BAA2B;IACtC,6EAAQ,CAAA;IACR,2EAAO,CAAA;AACR,CAAC,EAHW,2BAA2B,GAA3B,mCAA2B,KAA3B,mCAA2B,QAGtC;AAOY,QAAA,+BAA+B,GAAG;IAC9C,SAAS,EAAE,2BAA2B,CAAC,GAAG;IAC1C,iBAAiB,EAAE,GAAG;CACtB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport enum SummaryCompressionAlgorithm {\n\tNone = 0,\n\tLZ4 = 1,\n}\n\nexport interface ICompressionStorageConfig {\n\talgorithm: SummaryCompressionAlgorithm;\n\tminSizeToCompress: number;\n}\n\nexport const DefaultCompressionStorageConfig = {\n\talgorithm: SummaryCompressionAlgorithm.LZ4,\n\tminSizeToCompress: 500,\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { IDocumentService, IDocumentStorageService } from "@fluidframework/driver-definitions";
|
|
6
|
+
import { DocumentServiceProxy } from "../../documentServiceProxy";
|
|
7
|
+
import { ICompressionStorageConfig } from "./compressionTypes";
|
|
8
|
+
export declare class DocumentServiceCompressionAdapter extends DocumentServiceProxy {
|
|
9
|
+
private readonly _config;
|
|
10
|
+
constructor(service: IDocumentService, _config: ICompressionStorageConfig);
|
|
11
|
+
connectToStorage(): Promise<IDocumentStorageService>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=documentServiceCompressionAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentServiceCompressionAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/compression/documentServiceCompressionAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,qBAAa,iCAAkC,SAAQ,oBAAoB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAnD,OAAO,EAAE,gBAAgB,EAAmB,OAAO,EAAE,yBAAyB;IAI7E,gBAAgB,IAAI,OAAO,CAAC,uBAAuB,CAAC;CASjE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DocumentServiceCompressionAdapter = void 0;
|
|
8
|
+
const documentServiceProxy_1 = require("../../documentServiceProxy");
|
|
9
|
+
const summaryblob_1 = require("./summaryblob");
|
|
10
|
+
class DocumentServiceCompressionAdapter extends documentServiceProxy_1.DocumentServiceProxy {
|
|
11
|
+
constructor(service, _config) {
|
|
12
|
+
super(service);
|
|
13
|
+
this._config = _config;
|
|
14
|
+
}
|
|
15
|
+
async connectToStorage() {
|
|
16
|
+
const storage = await super.connectToStorage();
|
|
17
|
+
const wrapped = new summaryblob_1.DocumentStorageServiceCompressionAdapter(storage, this._config);
|
|
18
|
+
await wrapped.getSnapshotTree();
|
|
19
|
+
return wrapped;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.DocumentServiceCompressionAdapter = DocumentServiceCompressionAdapter;
|
|
23
|
+
//# sourceMappingURL=documentServiceCompressionAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentServiceCompressionAdapter.js","sourceRoot":"","sources":["../../../src/adapters/compression/documentServiceCompressionAdapter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qEAAkE;AAClE,+CAAgI;AAGhI,MAAa,iCAAkC,SAAQ,2CAAoB;IAC1E,YAAY,OAAyB,EAAmB,OAAkC;QACzF,KAAK,CAAC,OAAO,CAAC,CAAC;QADwC,YAAO,GAAP,OAAO,CAA2B;IAE1F,CAAC;IAEM,KAAK,CAAC,gBAAgB;QAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,sDAAmD,CACtE,OAAO,EACP,IAAI,CAAC,OAAO,CACZ,CAAC;QACF,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IAChB,CAAC;CACD;AAdD,8EAcC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDocumentService, IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { DocumentServiceProxy } from \"../../documentServiceProxy\";\nimport { DocumentStorageServiceCompressionAdapter as DocumentStorageServiceSummaryBlobCompressionAdapter } from \"./summaryblob\";\nimport { ICompressionStorageConfig } from \"./compressionTypes\";\n\nexport class DocumentServiceCompressionAdapter extends DocumentServiceProxy {\n\tconstructor(service: IDocumentService, private readonly _config: ICompressionStorageConfig) {\n\t\tsuper(service);\n\t}\n\n\tpublic async connectToStorage(): Promise<IDocumentStorageService> {\n\t\tconst storage = await super.connectToStorage();\n\t\tconst wrapped = new DocumentStorageServiceSummaryBlobCompressionAdapter(\n\t\t\tstorage,\n\t\t\tthis._config,\n\t\t);\n\t\tawait wrapped.getSnapshotTree();\n\t\treturn wrapped;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { ITelemetryBaseLogger } from "@fluidframework/common-definitions";
|
|
6
|
+
import { IDocumentService, IDocumentServiceFactory, IResolvedUrl } from "@fluidframework/driver-definitions";
|
|
7
|
+
import { ISummaryTree } from "@fluidframework/protocol-definitions";
|
|
8
|
+
import { DocumentServiceFactoryProxy } from "../../documentServiceFactoryProxy";
|
|
9
|
+
import { ICompressionStorageConfig } from "..";
|
|
10
|
+
export declare class DocumentServiceFactoryCompressionAdapter extends DocumentServiceFactoryProxy {
|
|
11
|
+
private readonly _config;
|
|
12
|
+
constructor(serviceFactory: IDocumentServiceFactory, _config: ICompressionStorageConfig);
|
|
13
|
+
createContainer(createNewSummary: ISummaryTree | undefined, createNewResolvedUrl: IResolvedUrl, logger?: ITelemetryBaseLogger, clientIsSummarizer?: boolean): Promise<IDocumentService>;
|
|
14
|
+
createDocumentService(resolvedUrl: IResolvedUrl): Promise<IDocumentService>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=documentServiceFactoryCompressionAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentServiceFactoryCompressionAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/compression/documentServiceFactoryCompressionAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EACN,gBAAgB,EAChB,uBAAuB,EACvB,YAAY,EACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,IAAI,CAAC;AAI/C,qBAAa,wCAAyC,SAAQ,2BAA2B;IAGvF,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADxB,cAAc,EAAE,uBAAuB,EACtB,OAAO,EAAE,yBAAyB;IAKvC,eAAe,CAC3B,gBAAgB,EAAE,YAAY,GAAG,SAAS,EAC1C,oBAAoB,EAAE,YAAY,EAClC,MAAM,CAAC,EAAE,oBAAoB,EAC7B,kBAAkB,CAAC,EAAE,OAAO,GAC1B,OAAO,CAAC,gBAAgB,CAAC;IA2Bf,qBAAqB,CAAC,WAAW,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAIxF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DocumentServiceFactoryCompressionAdapter = void 0;
|
|
8
|
+
const documentServiceFactoryProxy_1 = require("../../documentServiceFactoryProxy");
|
|
9
|
+
const summaryblob_1 = require("./summaryblob");
|
|
10
|
+
const documentServiceCompressionAdapter_1 = require("./documentServiceCompressionAdapter");
|
|
11
|
+
class DocumentServiceFactoryCompressionAdapter extends documentServiceFactoryProxy_1.DocumentServiceFactoryProxy {
|
|
12
|
+
constructor(serviceFactory, _config) {
|
|
13
|
+
super(serviceFactory);
|
|
14
|
+
this._config = _config;
|
|
15
|
+
}
|
|
16
|
+
async createContainer(createNewSummary, createNewResolvedUrl, logger, clientIsSummarizer) {
|
|
17
|
+
if (createNewSummary !== undefined) {
|
|
18
|
+
// TODO : this is a hack to make sure that the initial summary is not compressed
|
|
19
|
+
// We must prevent the initial summary from being compressed because
|
|
20
|
+
// of the hack at packages/drivers/routerlicious-driver/src/createNewUtils.ts
|
|
21
|
+
// where the binary blob is converted to a string using UTF-8 encoding
|
|
22
|
+
// which is producing incorrect results for compressed data.
|
|
23
|
+
const configForInitial = Object.assign(Object.assign({}, this._config), { minSizeToCompress: Number.POSITIVE_INFINITY });
|
|
24
|
+
const newAppSumary = summaryblob_1.DocumentStorageServiceCompressionAdapter.compressSummary(createNewSummary.tree[".app"], configForInitial);
|
|
25
|
+
createNewSummary.tree[".app"] = newAppSumary;
|
|
26
|
+
}
|
|
27
|
+
const service = await this.serviceFactory.createContainer(createNewSummary, createNewResolvedUrl, logger, clientIsSummarizer);
|
|
28
|
+
return new documentServiceCompressionAdapter_1.DocumentServiceCompressionAdapter(service, this._config);
|
|
29
|
+
}
|
|
30
|
+
async createDocumentService(resolvedUrl) {
|
|
31
|
+
const service = await this.serviceFactory.createDocumentService(resolvedUrl);
|
|
32
|
+
return new documentServiceCompressionAdapter_1.DocumentServiceCompressionAdapter(service, this._config);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.DocumentServiceFactoryCompressionAdapter = DocumentServiceFactoryCompressionAdapter;
|
|
36
|
+
//# sourceMappingURL=documentServiceFactoryCompressionAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentServiceFactoryCompressionAdapter.js","sourceRoot":"","sources":["../../../src/adapters/compression/documentServiceFactoryCompressionAdapter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH,mFAAgF;AAEhF,+CAAgI;AAChI,2FAAwF;AAExF,MAAa,wCAAyC,SAAQ,yDAA2B;IACxF,YACC,cAAuC,EACtB,OAAkC;QAEnD,KAAK,CAAC,cAAc,CAAC,CAAC;QAFL,YAAO,GAAP,OAAO,CAA2B;IAGpD,CAAC;IAEM,KAAK,CAAC,eAAe,CAC3B,gBAA0C,EAC1C,oBAAkC,EAClC,MAA6B,EAC7B,kBAA4B;QAE5B,IAAI,gBAAgB,KAAK,SAAS,EAAE;YACnC,gFAAgF;YAChF,oEAAoE;YACpE,6EAA6E;YAC7E,sEAAsE;YACtE,4DAA4D;YAC5D,MAAM,gBAAgB,mCAClB,IAAI,CAAC,OAAO,KACf,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,GAC3C,CAAC;YACF,MAAM,YAAY,GACjB,sDAAmD,CAAC,eAAe,CAClE,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAiB,EAC7C,gBAAgB,CAChB,CAAC;YACH,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;SAC7C;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CACxD,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,EACN,kBAAkB,CAClB,CAAC;QACF,OAAO,IAAI,qEAAiC,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAAC,WAAyB;QAC3D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAC7E,OAAO,IAAI,qEAAiC,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;CACD;AA5CD,4FA4CC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport {\n\tIDocumentService,\n\tIDocumentServiceFactory,\n\tIResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport { DocumentServiceFactoryProxy } from \"../../documentServiceFactoryProxy\";\nimport { ICompressionStorageConfig } from \"..\";\nimport { DocumentStorageServiceCompressionAdapter as DocumentStorageServiceSummaryBlobCompressionAdapter } from \"./summaryblob\";\nimport { DocumentServiceCompressionAdapter } from \"./documentServiceCompressionAdapter\";\n\nexport class DocumentServiceFactoryCompressionAdapter extends DocumentServiceFactoryProxy {\n\tconstructor(\n\t\tserviceFactory: IDocumentServiceFactory,\n\t\tprivate readonly _config: ICompressionStorageConfig,\n\t) {\n\t\tsuper(serviceFactory);\n\t}\n\n\tpublic async createContainer(\n\t\tcreateNewSummary: ISummaryTree | undefined,\n\t\tcreateNewResolvedUrl: IResolvedUrl,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService> {\n\t\tif (createNewSummary !== undefined) {\n\t\t\t// TODO : this is a hack to make sure that the initial summary is not compressed\n\t\t\t// We must prevent the initial summary from being compressed because\n\t\t\t// of the hack at packages/drivers/routerlicious-driver/src/createNewUtils.ts\n\t\t\t// where the binary blob is converted to a string using UTF-8 encoding\n\t\t\t// which is producing incorrect results for compressed data.\n\t\t\tconst configForInitial = {\n\t\t\t\t...this._config,\n\t\t\t\tminSizeToCompress: Number.POSITIVE_INFINITY,\n\t\t\t};\n\t\t\tconst newAppSumary =\n\t\t\t\tDocumentStorageServiceSummaryBlobCompressionAdapter.compressSummary(\n\t\t\t\t\tcreateNewSummary.tree[\".app\"] as ISummaryTree,\n\t\t\t\t\tconfigForInitial,\n\t\t\t\t);\n\t\t\tcreateNewSummary.tree[\".app\"] = newAppSumary;\n\t\t}\n\t\tconst service = await this.serviceFactory.createContainer(\n\t\t\tcreateNewSummary,\n\t\t\tcreateNewResolvedUrl,\n\t\t\tlogger,\n\t\t\tclientIsSummarizer,\n\t\t);\n\t\treturn new DocumentServiceCompressionAdapter(service, this._config);\n\t}\n\n\tpublic async createDocumentService(resolvedUrl: IResolvedUrl): Promise<IDocumentService> {\n\t\tconst service = await this.serviceFactory.createDocumentService(resolvedUrl);\n\t\treturn new DocumentServiceCompressionAdapter(service, this._config);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
export { SummaryCompressionAlgorithm, ICompressionStorageConfig, DefaultCompressionStorageConfig, } from "./compressionTypes";
|
|
6
|
+
export { DocumentServiceFactoryCompressionAdapter } from "./documentServiceFactoryCompressionAdapter";
|
|
7
|
+
export { blobHeadersBlobName } from "./summaryblob";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/compression/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,2BAA2B,EAC3B,yBAAyB,EACzB,+BAA+B,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.blobHeadersBlobName = exports.DocumentServiceFactoryCompressionAdapter = exports.DefaultCompressionStorageConfig = exports.SummaryCompressionAlgorithm = void 0;
|
|
8
|
+
var compressionTypes_1 = require("./compressionTypes");
|
|
9
|
+
Object.defineProperty(exports, "SummaryCompressionAlgorithm", { enumerable: true, get: function () { return compressionTypes_1.SummaryCompressionAlgorithm; } });
|
|
10
|
+
Object.defineProperty(exports, "DefaultCompressionStorageConfig", { enumerable: true, get: function () { return compressionTypes_1.DefaultCompressionStorageConfig; } });
|
|
11
|
+
var documentServiceFactoryCompressionAdapter_1 = require("./documentServiceFactoryCompressionAdapter");
|
|
12
|
+
Object.defineProperty(exports, "DocumentServiceFactoryCompressionAdapter", { enumerable: true, get: function () { return documentServiceFactoryCompressionAdapter_1.DocumentServiceFactoryCompressionAdapter; } });
|
|
13
|
+
var summaryblob_1 = require("./summaryblob");
|
|
14
|
+
Object.defineProperty(exports, "blobHeadersBlobName", { enumerable: true, get: function () { return summaryblob_1.blobHeadersBlobName; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/compression/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uDAI4B;AAH3B,+HAAA,2BAA2B,OAAA;AAE3B,mIAAA,+BAA+B,OAAA;AAEhC,uGAAsG;AAA7F,oKAAA,wCAAwC,OAAA;AACjD,6CAAoD;AAA3C,kHAAA,mBAAmB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport {\n\tSummaryCompressionAlgorithm,\n\tICompressionStorageConfig,\n\tDefaultCompressionStorageConfig,\n} from \"./compressionTypes\";\nexport { DocumentServiceFactoryCompressionAdapter } from \"./documentServiceFactoryCompressionAdapter\";\nexport { blobHeadersBlobName } from \"./summaryblob\";\n"]}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { IDocumentStorageService, ISummaryContext } from "@fluidframework/driver-definitions";
|
|
6
|
+
import { ISnapshotTree, ISummaryHandle, ISummaryTree, IVersion } from "@fluidframework/protocol-definitions";
|
|
7
|
+
import { DocumentStorageServiceProxy } from "../../../documentStorageServiceProxy";
|
|
8
|
+
import { ICompressionStorageConfig } from "../";
|
|
9
|
+
export declare const blobHeadersBlobName = ".metadata.blobHeaders";
|
|
10
|
+
/**
|
|
11
|
+
* This class is a proxy for the IDocumentStorageService that compresses and decompresses blobs in the summary.
|
|
12
|
+
* The identification of the compressed blobs is done by adding a compression markup blob to the summary.
|
|
13
|
+
* Even if the markup blob is present, it does not mean that all blobs are compressed. The blob,
|
|
14
|
+
* which is compressed also contain the compression algorithm enumerated value from the
|
|
15
|
+
* SummaryCompressionAlgorithm enumeration in the first byte . If the blob is not
|
|
16
|
+
* commpressed, it contains the first byte equals to SummaryCompressionAlgorithm.None .
|
|
17
|
+
* In case, the markup blob is present, it is expected that the first byte of the markup blob
|
|
18
|
+
* will contain the info about the compression. If the first byte is not present, it is assumed
|
|
19
|
+
* that the compression is not enabled and no first prefix byte is present in the blobs.
|
|
20
|
+
*/
|
|
21
|
+
export declare class DocumentStorageServiceCompressionAdapter extends DocumentStorageServiceProxy {
|
|
22
|
+
private readonly _config;
|
|
23
|
+
private _isCompressionEnabled;
|
|
24
|
+
constructor(service: IDocumentStorageService, _config: ICompressionStorageConfig);
|
|
25
|
+
get service(): IDocumentStorageService;
|
|
26
|
+
/**
|
|
27
|
+
* This method returns true if there is a compression markup byte in the blob, otherwise false.
|
|
28
|
+
* @param blob - The blob to compress.
|
|
29
|
+
* @returns - True if there is a compression markup byte in the blob, otherwise false.
|
|
30
|
+
*/
|
|
31
|
+
private static hasPrefix;
|
|
32
|
+
/**
|
|
33
|
+
* This method reads the first byte from the given blob and maps that byte to the compression algorithm.
|
|
34
|
+
* @param blob - The maybe compressed blob.
|
|
35
|
+
*/
|
|
36
|
+
private static readAlgorithmFromBlob;
|
|
37
|
+
/**
|
|
38
|
+
* This method writes the given algorithm to the blob as the first byte.
|
|
39
|
+
* @param blob - The blob to write the algorithm to.
|
|
40
|
+
* @param algorithm - The algorithm to write.
|
|
41
|
+
* @returns - The blob with the algorithm as the first byte.
|
|
42
|
+
*/
|
|
43
|
+
private static writeAlgorithmToBlob;
|
|
44
|
+
/**
|
|
45
|
+
* This method removes the algorithm markup prefix from the blob (1 byte)
|
|
46
|
+
* @param blob - The blob to remove the prefix from.
|
|
47
|
+
* @returns - The blob without the prefix.
|
|
48
|
+
*/
|
|
49
|
+
private static removePrefixFromBlobIfPresent;
|
|
50
|
+
/**
|
|
51
|
+
* This method converts the given argument to Uint8Array. If the parameter is already Uint8Array,
|
|
52
|
+
* it is just returned as is. If the parameter is string, it is converted to Uint8Array using
|
|
53
|
+
* TextEncoder.
|
|
54
|
+
* @param input - The input to convert to Uint8Array.
|
|
55
|
+
* @returns - The Uint8Array representation of the input.
|
|
56
|
+
*/
|
|
57
|
+
private static toBinaryArray;
|
|
58
|
+
/**
|
|
59
|
+
* This method encodes the blob inside the given summary object of the SummaryType.Blob type using the given config
|
|
60
|
+
* containing the compression algorithm.
|
|
61
|
+
* @param input - The summary object to encode.
|
|
62
|
+
* @param config - The config containing the compression algorithm.
|
|
63
|
+
* @returns - The summary object with the encoded blob.
|
|
64
|
+
*/
|
|
65
|
+
private static readonly blobEncoder;
|
|
66
|
+
/**
|
|
67
|
+
* This method decodes the blob inside the given summary object of the SummaryType.Blob type.
|
|
68
|
+
* @param input - The summary object to decode.
|
|
69
|
+
* @returns - The summary object with the decoded blob.
|
|
70
|
+
*/
|
|
71
|
+
private static readonly blobDecoder;
|
|
72
|
+
/**
|
|
73
|
+
* This method encodes the given blob according to the given config.
|
|
74
|
+
* @param file - The blob to encode.
|
|
75
|
+
* @param config - The config to use for encoding.
|
|
76
|
+
* @returns - The encoded blob.
|
|
77
|
+
*/
|
|
78
|
+
private static encodeBlob;
|
|
79
|
+
/**
|
|
80
|
+
* This method decodes the given blob.
|
|
81
|
+
* @param file - The blob to decode.
|
|
82
|
+
* @returns - The decoded blob.
|
|
83
|
+
*/
|
|
84
|
+
private static decodeBlob;
|
|
85
|
+
/**
|
|
86
|
+
* This method traverses the SummaryObject recursively. If it finds the ISummaryBlob object,
|
|
87
|
+
* it applies encoding/decoding on it according to the given isEncode flag.
|
|
88
|
+
* @param isEncode - True if the encoding should be applied, false if the decoding should be applied.
|
|
89
|
+
* @param input - The summary object to traverse.
|
|
90
|
+
* @param encoder - The encoder function to use.
|
|
91
|
+
* @param decoder - The decoder function to use.
|
|
92
|
+
* @param config - The config to use for encoding.
|
|
93
|
+
* @param context - The summary context.
|
|
94
|
+
* @returns - The summary object with the encoded/decoded blob.
|
|
95
|
+
*/
|
|
96
|
+
private static recursivelyReplace;
|
|
97
|
+
/**
|
|
98
|
+
* This method traverses the SummaryTree recursively. If it finds the ISummaryBlob object with the key '.metadata',
|
|
99
|
+
* it returns the summary tree containing that blob.
|
|
100
|
+
*
|
|
101
|
+
* @param summary - The summary tree to traverse.
|
|
102
|
+
* @returns - The summary tree containing the metadata blob.
|
|
103
|
+
*/
|
|
104
|
+
private static findMetadataHolderSummary;
|
|
105
|
+
/**
|
|
106
|
+
* This method obtains the summary tree containing the metadata blob. It returns the content
|
|
107
|
+
* of the tree atribute.
|
|
108
|
+
* @param summary - The summary tree to traverse.
|
|
109
|
+
* @returns - The content of the tree attribute of the summary tree containing the metadata blob.
|
|
110
|
+
*/
|
|
111
|
+
private static getMetadataHolderTree;
|
|
112
|
+
/**
|
|
113
|
+
* This method adds the compression markup blob to the nested summary tree containing the metadata blob.
|
|
114
|
+
* @param summary - The top summary tree to put the compression markup blob into.
|
|
115
|
+
*/
|
|
116
|
+
private static putCompressionMarkup;
|
|
117
|
+
/**
|
|
118
|
+
* This method traverses the SnapshotTree recursively. If it finds the ISummaryBlob object with the key '.metadata',
|
|
119
|
+
* it checks, if the SummaryTree holder of that object also contains the compression markup blob. If it is found,
|
|
120
|
+
* it returns true, otherwise false.
|
|
121
|
+
* @param snapshot - The snapshot tree to traverse.
|
|
122
|
+
* @returns - True if the compression markup blob is found, otherwise false.
|
|
123
|
+
*/
|
|
124
|
+
private static hasCompressionMarkup;
|
|
125
|
+
/**
|
|
126
|
+
* This method performs compression of the blobs in the summary tree.
|
|
127
|
+
* @param summary - The summary tree to compress.
|
|
128
|
+
* @param config - The compression config.
|
|
129
|
+
* @returns - The compressed summary tree.
|
|
130
|
+
*/
|
|
131
|
+
static compressSummary(summary: ISummaryTree, config: ICompressionStorageConfig): ISummaryTree;
|
|
132
|
+
/**
|
|
133
|
+
* This method read blob from the storage and decompresses it if it is compressed.
|
|
134
|
+
* @param id - The id of the blob to read.
|
|
135
|
+
* @returns - The decompressed blob.
|
|
136
|
+
*/
|
|
137
|
+
readBlob(id: string): Promise<ArrayBufferLike>;
|
|
138
|
+
/**
|
|
139
|
+
* This method loads the snapshot tree from the server. It also checks, if the compression markup blob is present
|
|
140
|
+
* and setups the compression flag accordingly. It also identifies the blobs that are not compressed and do not contain
|
|
141
|
+
* algorithm byte prefix and store them.
|
|
142
|
+
* @param version - The version of the snapshot tree to load.
|
|
143
|
+
* @param scenarioName - The scenario name of the snapshot tree to load.
|
|
144
|
+
* @returns - The snapshot tree.
|
|
145
|
+
*/
|
|
146
|
+
getSnapshotTree(version?: IVersion | undefined, scenarioName?: string | undefined): Promise<ISnapshotTree | null>;
|
|
147
|
+
/**
|
|
148
|
+
* This method uploads the summary to the storage. It performs compression of the blobs in the summary tree.
|
|
149
|
+
* @param summary - The summary tree to upload.
|
|
150
|
+
* @param context - The summary context.
|
|
151
|
+
* @returns - The ID of the uploaded summary.
|
|
152
|
+
*/
|
|
153
|
+
uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string>;
|
|
154
|
+
/**
|
|
155
|
+
* This method downloads the summary from the storage and then applies decompression on the compressed blobs.
|
|
156
|
+
* @param id - The ID of the summary to be downloaded
|
|
157
|
+
* @returns - The summary with decompressed blobs
|
|
158
|
+
*/
|
|
159
|
+
downloadSummary(id: ISummaryHandle): Promise<ISummaryTree>;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=documentStorageServiceSummaryBlobCompressionAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentStorageServiceSummaryBlobCompressionAdapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC9F,OAAO,EACN,aAAa,EAEb,cAAc,EACd,YAAY,EACZ,QAAQ,EAGR,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAA+B,MAAM,KAAK,CAAC;AAE7E,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AAG3D;;;;;;;;;;GAUG;AACH,qBAAa,wCAAyC,SAAQ,2BAA2B;IAKvF,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJzB,OAAO,CAAC,qBAAqB,CAAkB;gBAG9C,OAAO,EAAE,uBAAuB,EACf,OAAO,EAAE,yBAAyB;IAKpD,IAAW,OAAO,IAAI,uBAAuB,CAE5C;IAED;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAMxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAmBnC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAK5C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAoBjC;IAEF;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAgBjC;IAEF;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAwBzB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAqBzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAoCjC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAkBxC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAOpC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IASnC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAsBnC;;;;;OAKG;WACW,eAAe,CAC5B,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,yBAAyB,GAC/B,YAAY;IAaf;;;;OAIG;IACmB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAYpE;;;;;;;OAOG;IACmB,eAAe,CACpC,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,EAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,GAE/B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAShC;;;;;OAKG;IACmB,wBAAwB,CAC7C,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC;IAQlB;;;;OAIG;IACmB,eAAe,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;CAYhF"}
|