@contember/engine-s3-plugin 1.2.1 → 1.3.0-alpha.13

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 (58) hide show
  1. package/dist/src/Config.d.ts +2 -3
  2. package/dist/src/Config.d.ts.map +1 -1
  3. package/dist/src/Config.js.map +1 -1
  4. package/dist/src/S3ConfigProcessor.d.ts +2 -2
  5. package/dist/src/S3ConfigProcessor.d.ts.map +1 -1
  6. package/dist/src/S3ConfigProcessor.js.map +1 -1
  7. package/dist/src/S3ObjectAuthorizator.d.ts +22 -0
  8. package/dist/src/S3ObjectAuthorizator.d.ts.map +1 -0
  9. package/dist/src/S3ObjectAuthorizator.js +48 -0
  10. package/dist/src/S3ObjectAuthorizator.js.map +1 -0
  11. package/dist/src/S3SchemaContributor.d.ts +10 -5
  12. package/dist/src/S3SchemaContributor.d.ts.map +1 -1
  13. package/dist/src/S3SchemaContributor.js +61 -90
  14. package/dist/src/S3SchemaContributor.js.map +1 -1
  15. package/dist/src/S3SchemaTypes.d.ts +21 -0
  16. package/dist/src/S3SchemaTypes.d.ts.map +1 -0
  17. package/dist/src/S3SchemaTypes.js +65 -0
  18. package/dist/src/S3SchemaTypes.js.map +1 -0
  19. package/dist/src/S3Service.d.ts +10 -10
  20. package/dist/src/S3Service.d.ts.map +1 -1
  21. package/dist/src/S3Service.js +40 -37
  22. package/dist/src/S3Service.js.map +1 -1
  23. package/dist/src/S3Signer.d.ts +1 -1
  24. package/dist/src/S3Signer.d.ts.map +1 -1
  25. package/dist/src/S3Signer.js +1 -1
  26. package/dist/src/S3Signer.js.map +1 -1
  27. package/dist/src/index.d.ts +6 -4
  28. package/dist/src/index.d.ts.map +1 -1
  29. package/dist/src/index.js +7 -4
  30. package/dist/src/index.js.map +1 -1
  31. package/dist/src/tsconfig.tsbuildinfo +1 -1
  32. package/dist/tests/cases/authorizator.test.d.ts +2 -0
  33. package/dist/tests/cases/authorizator.test.d.ts.map +1 -0
  34. package/dist/tests/cases/authorizator.test.js +21 -0
  35. package/dist/tests/cases/authorizator.test.js.map +1 -0
  36. package/dist/tests/cases/signRequest.test.js +14 -5
  37. package/dist/tests/cases/signRequest.test.js.map +1 -1
  38. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +9 -5
  40. package/src/Config.ts +1 -2
  41. package/src/S3ConfigProcessor.ts +2 -2
  42. package/src/S3ObjectAuthorizator.ts +63 -0
  43. package/src/S3SchemaContributor.ts +50 -114
  44. package/src/S3SchemaTypes.ts +89 -0
  45. package/src/S3Service.ts +51 -43
  46. package/src/S3Signer.ts +2 -2
  47. package/src/index.ts +9 -7
  48. package/src/tsconfig.json +3 -9
  49. package/tests/cases/authorizator.test.ts +22 -0
  50. package/tests/cases/signRequest.test.ts +18 -18
  51. package/tests/tsconfig.json +1 -3
  52. package/tsconfig.json +2 -6
  53. package/dist/src/ObjectKeyVerifier.d.ts +0 -3
  54. package/dist/src/ObjectKeyVerifier.d.ts.map +0 -1
  55. package/dist/src/ObjectKeyVerifier.js +0 -18
  56. package/dist/src/ObjectKeyVerifier.js.map +0 -1
  57. package/src/ObjectKeyVerifier.ts +0 -14
  58. package/types/sign3/index.d.ts +0 -8
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=authorizator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorizator.test.d.ts","sourceRoot":"","sources":["../../../tests/cases/authorizator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const src_1 = require("../../src");
5
+ (0, vitest_1.test)('required read pattern', () => {
6
+ const authorizator = new src_1.S3ObjectAuthorizator([], [{ pattern: 'foo/**' }]);
7
+ vitest_1.assert.doesNotThrow(() => authorizator.verifyReadAccess({ key: 'foo/lorem.jpg' }));
8
+ vitest_1.assert.throw(() => authorizator.verifyReadAccess({ key: 'lorem.jpg' }), 'Read access forbidden for object key lorem.jpg');
9
+ });
10
+ (0, vitest_1.test)('required upload pattern', () => {
11
+ const authorizator = new src_1.S3ObjectAuthorizator([{ pattern: 'foo/**' }], []);
12
+ vitest_1.assert.doesNotThrow(() => authorizator.verifyUploadAccess({ key: 'foo/lorem.jpg', size: null }));
13
+ vitest_1.assert.throw(() => authorizator.verifyUploadAccess({ key: 'lorem.jpg', size: null }), 'Upload access forbidden for object key lorem.jpg');
14
+ });
15
+ (0, vitest_1.test)('max upload size', () => {
16
+ const authorizator = new src_1.S3ObjectAuthorizator([{ pattern: '**', maxSize: 1024 }], []);
17
+ vitest_1.assert.doesNotThrow(() => authorizator.verifyUploadAccess({ key: 'lorem.jpg', size: 1000 }));
18
+ vitest_1.assert.throw(() => authorizator.verifyUploadAccess({ key: 'lorem.jpg', size: null }), 'File size must be provided');
19
+ vitest_1.assert.throw(() => authorizator.verifyUploadAccess({ key: 'lorem.jpg', size: 2048 }), 'Uploaded file is too large');
20
+ });
21
+ //# sourceMappingURL=authorizator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorizator.test.js","sourceRoot":"","sources":["../../../tests/cases/authorizator.test.ts"],"names":[],"mappings":";;AAAA,mCAAqC;AACrC,mCAAgD;AAEhD,IAAA,aAAI,EAAC,uBAAuB,EAAE,GAAG,EAAE;IAClC,MAAM,YAAY,GAAG,IAAI,0BAAoB,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC1E,eAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,CAAA;IAClF,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,gDAAgD,CAAC,CAAA;AAC1H,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,yBAAyB,EAAE,GAAG,EAAE;IACpC,MAAM,YAAY,GAAG,IAAI,0BAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1E,eAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAChG,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,kDAAkD,CAAC,CAAA;AAC1I,CAAC,CAAC,CAAA;AAGF,IAAA,aAAI,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC5B,MAAM,YAAY,GAAG,IAAI,0BAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACrF,eAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC5F,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,4BAA4B,CAAC,CAAA;IACnH,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,4BAA4B,CAAC,CAAA;AACpH,CAAC,CAAC,CAAA"}
@@ -15,21 +15,30 @@ const createS3Service = (bucket, prefix = '') => new src_1.S3Service({
15
15
  }, {
16
16
  uuid: () => constantUuid,
17
17
  now: () => mocked,
18
- });
18
+ }, new src_1.S3ObjectAuthorizator([{ pattern: '**' }], [{ pattern: '**' }]));
19
19
  (0, vitest_1.test)('sign s3 request', () => {
20
20
  const service = createS3Service('test');
21
- vitest_1.assert.equal(service.getSignedReadUrl('foo.jpg', () => { }).url, 'https://test.s3.eu-central-1.amazonaws.com/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=00e912fe0383066802fc6c0f93ffb223320ca143992385fe69070bbb87c758dc&X-Amz-SignedHeaders=host');
21
+ const signed = service.getSignedReadUrl({ objectKey: 'foo.jpg', expiration: null });
22
+ (0, vitest_1.expect)(signed.url).toMatchInlineSnapshot('"https://test.s3.eu-central-1.amazonaws.com/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=00e912fe0383066802fc6c0f93ffb223320ca143992385fe69070bbb87c758dc&X-Amz-SignedHeaders=host"');
22
23
  });
23
24
  (0, vitest_1.test)('sign s3 request - prefix', () => {
24
25
  const service = createS3Service('test', 'lorem');
25
- vitest_1.assert.equal(service.getSignedReadUrl('lorem/foo.jpg', () => { }).url, 'https://test.s3.eu-central-1.amazonaws.com/lorem/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=f6c69dc306422c2b3242c9d9d42147336817720ffae249af8bd91cc7062e9f6d&X-Amz-SignedHeaders=host');
26
+ const signed = service.getSignedReadUrl({ objectKey: 'lorem/foo.jpg', expiration: null });
27
+ (0, vitest_1.expect)(signed.url).toMatchInlineSnapshot('"https://test.s3.eu-central-1.amazonaws.com/lorem/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=f6c69dc306422c2b3242c9d9d42147336817720ffae249af8bd91cc7062e9f6d&X-Amz-SignedHeaders=host"');
26
28
  });
27
29
  (0, vitest_1.test)('sign upload', () => {
28
30
  const service = createS3Service('test');
29
- vitest_1.assert.equal(service.getSignedUploadUrl('foo.jpg', () => { }, src_1.S3Acl.PublicRead, 1800).url, `https://test.s3.eu-central-1.amazonaws.com/${constantUuid}.bin?Cache-Control=immutable&Content-Type=foo.jpg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=1800&X-Amz-Signature=d33b2d6574fca41d7f707fd3d4695712380f78a0e9e0b0ace3fc12d7a4606bc2&X-Amz-SignedHeaders=cache-control%3Bhost%3Bx-amz-acl&x-amz-acl=public-read`);
31
+ const signed = service.getSignedUploadUrl({ contentType: 'image/jpeg', acl: 'PUBLIC_READ', expiration: 1800, contentDisposition: null, extension: null, fileName: null, prefix: null, suffix: null, size: null });
32
+ (0, vitest_1.expect)(signed.url).toMatchInlineSnapshot('"https://test.s3.eu-central-1.amazonaws.com/9fce3907-ff2b-45bb-b4ce-eff5527dd315.jpeg?Cache-Control=immutable&Content-Type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=1800&X-Amz-Signature=fcd00b967054c19a2ee64b59e31d61e032ea086dcf2f0d8c36a883971c469c99&X-Amz-SignedHeaders=cache-control%3Bhost%3Bx-amz-acl&x-amz-acl=public-read"');
33
+ });
34
+ (0, vitest_1.test)('sign upload #2', () => {
35
+ const service = createS3Service('test');
36
+ const signed = service.getSignedUploadUrl({ contentType: 'image/jpeg', acl: 'PUBLIC_READ', expiration: 1800, contentDisposition: 'INLINE', extension: 'jpeg', fileName: 'foo-bar.jpeg', prefix: 'foo', suffix: 'bar', size: null });
37
+ (0, vitest_1.expect)(signed.url).toMatchInlineSnapshot('"https://test.s3.eu-central-1.amazonaws.com/foo/9fce3907-ff2b-45bb-b4ce-eff5527dd315bar.jpeg?Cache-Control=immutable&Content-Type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=1800&X-Amz-Signature=979a93bca65a98ce6b2bf97d2bf2afe7d5f2fa805f7d596187675416c86a3bd5&X-Amz-SignedHeaders=cache-control%3Bcontent-disposition%3Bhost%3Bx-amz-acl&x-amz-acl=public-read"');
30
38
  });
31
39
  (0, vitest_1.test)('bucket with dot', () => {
32
40
  const service = createS3Service('test.foo');
33
- vitest_1.assert.equal(service.getSignedReadUrl('foo.jpg', () => { }).url, 'https://s3.eu-central-1.amazonaws.com/test.foo/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=811a809196e60413e0e54e51d3dd91ab73ad1482b61e5371864d25d43ba642ff&X-Amz-SignedHeaders=host');
41
+ const signed = service.getSignedReadUrl({ objectKey: 'foo.jpg', expiration: null });
42
+ (0, vitest_1.expect)(signed.url).toMatchInlineSnapshot('"https://s3.eu-central-1.amazonaws.com/test.foo/foo.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test%2F20210702%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210702T172200Z&X-Amz-Expires=3600&X-Amz-Signature=811a809196e60413e0e54e51d3dd91ab73ad1482b61e5371864d25d43ba642ff&X-Amz-SignedHeaders=host"');
34
43
  });
35
44
  //# sourceMappingURL=signRequest.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signRequest.test.js","sourceRoot":"","sources":["../../../tests/cases/signRequest.test.ts"],"names":[],"mappings":";;AAAA,mCAAqC;AACrC,mCAA4C;AAE5C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAA;AAC3C,MAAM,YAAY,GAAG,sCAAsC,CAAA;AAC3D,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,eAAS,CACrE;IACC,MAAM;IACN,MAAM,EAAE,cAAc;IACtB,WAAW,EAAE;QACZ,GAAG,EAAE,MAAM;QACX,MAAM,EAAE,MAAM;KACd;IACD,MAAM;CACN,EACD;IACC,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY;IACxB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM;CACjB,CACD,CAAA;AAGD,IAAA,aAAI,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC5B,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACvC,eAAM,CAAC,KAAK,CACX,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,GAAG,EACjD,kTAAkT,CAClT,CAAA;AACF,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,0BAA0B,EAAE,GAAG,EAAE;IACrC,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChD,eAAM,CAAC,KAAK,CACX,OAAO,CAAC,gBAAgB,CAAC,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,GAAG,EACvD,wTAAwT,CACxT,CAAA;AACF,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,aAAa,EAAE,GAAG,EAAE;IACxB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACvC,eAAM,CAAC,KAAK,CACX,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,WAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,EAC3E,8CAA8C,YAAY,mWAAmW,CAC7Z,CAAA;AACF,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC5B,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IAC3C,eAAM,CAAC,KAAK,CACX,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,GAAG,EACjD,sTAAsT,CACtT,CAAA;AACF,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"signRequest.test.js","sourceRoot":"","sources":["../../../tests/cases/signRequest.test.ts"],"names":[],"mappings":";;AAAA,mCAA6C;AAC7C,mCAA2D;AAE3D,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAA;AAC3C,MAAM,YAAY,GAAG,sCAAsC,CAAA;AAC3D,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,eAAS,CACrE;IACC,MAAM;IACN,MAAM,EAAE,cAAc;IACtB,WAAW,EAAE;QACZ,GAAG,EAAE,MAAM;QACX,MAAM,EAAE,MAAM;KACd;IACD,MAAM;CACN,EACD;IACC,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY;IACxB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM;CACjB,EACD,IAAI,0BAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAClE,CAAA;AAGD,IAAA,aAAI,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC5B,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IACnF,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,oTAAoT,CAAC,CAAA;AAC/V,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,0BAA0B,EAAE,GAAG,EAAE;IACrC,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IACzF,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,0TAA0T,CAAC,CAAA;AACrW,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,aAAa,EAAE,GAAG,EAAE;IACxB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACjN,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,0bAA0b,CAAC,CAAA;AACre,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACnO,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,udAAud,CAAC,CAAA;AAClgB,CAAC,CAAC,CAAA;AAGF,IAAA,aAAI,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC5B,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IACnF,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,wTAAwT,CAAC,CAAA;AACnW,CAAC,CAAC,CAAA"}