@dimah-s3/server 0.7.3 → 0.8.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 (118) hide show
  1. package/README.md +8 -9
  2. package/dist/adapters/express.js +36 -49
  3. package/dist/adapters/express.js.map +1 -1
  4. package/dist/adapters/fastify.js +36 -49
  5. package/dist/adapters/fastify.js.map +1 -1
  6. package/dist/adapters/next.d.ts +3 -1
  7. package/dist/adapters/next.d.ts.map +1 -1
  8. package/dist/adapters/next.js +2 -0
  9. package/dist/adapters/next.js.map +1 -1
  10. package/dist/adapters/node.d.ts +1 -1
  11. package/dist/adapters/node.d.ts.map +1 -1
  12. package/dist/adapters/node.js +36 -49
  13. package/dist/adapters/node.js.map +1 -1
  14. package/dist/adapters/types.d.ts +1 -1
  15. package/dist/adapters/types.d.ts.map +1 -1
  16. package/dist/api/assert-feature-enabled.d.ts +5 -0
  17. package/dist/api/assert-feature-enabled.d.ts.map +1 -0
  18. package/dist/api/bind-endpoints.d.ts +8 -0
  19. package/dist/api/bind-endpoints.d.ts.map +1 -0
  20. package/dist/api/context.d.ts +10 -0
  21. package/dist/api/context.d.ts.map +1 -0
  22. package/dist/api/create-s3-endpoint.d.ts +141 -0
  23. package/dist/api/create-s3-endpoint.d.ts.map +1 -0
  24. package/dist/api/create-s3-middleware.d.ts +23 -0
  25. package/dist/api/create-s3-middleware.d.ts.map +1 -0
  26. package/dist/api/index.d.ts +6 -0
  27. package/dist/api/index.d.ts.map +1 -0
  28. package/dist/api/index.js +758 -0
  29. package/dist/api/index.js.map +1 -0
  30. package/dist/api/routes/confirm.d.ts +14 -0
  31. package/dist/api/routes/confirm.d.ts.map +1 -0
  32. package/dist/api/routes/delete.d.ts +16 -0
  33. package/dist/api/routes/delete.d.ts.map +1 -0
  34. package/dist/api/routes/download.d.ts +19 -0
  35. package/dist/api/routes/download.d.ts.map +1 -0
  36. package/dist/api/routes/index.d.ts +170 -0
  37. package/dist/api/routes/index.d.ts.map +1 -0
  38. package/dist/api/routes/multipart/abort.d.ts +20 -0
  39. package/dist/api/routes/multipart/abort.d.ts.map +1 -0
  40. package/dist/api/routes/multipart/complete.d.ts +22 -0
  41. package/dist/api/routes/multipart/complete.d.ts.map +1 -0
  42. package/dist/api/routes/multipart/init.d.ts +26 -0
  43. package/dist/api/routes/multipart/init.d.ts.map +1 -0
  44. package/dist/api/routes/multipart/list-parts.d.ts +17 -0
  45. package/dist/api/routes/multipart/list-parts.d.ts.map +1 -0
  46. package/dist/api/routes/multipart/part.d.ts +22 -0
  47. package/dist/api/routes/multipart/part.d.ts.map +1 -0
  48. package/dist/api/routes/upload.d.ts +26 -0
  49. package/dist/api/routes/upload.d.ts.map +1 -0
  50. package/dist/dimah-s3.d.ts +41 -12
  51. package/dist/dimah-s3.d.ts.map +1 -1
  52. package/dist/errors.d.ts +8 -22
  53. package/dist/errors.d.ts.map +1 -1
  54. package/dist/helpers/resolve-target.d.ts +51 -0
  55. package/dist/helpers/resolve-target.d.ts.map +1 -0
  56. package/dist/index.d.ts +7 -5
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +521 -483
  59. package/dist/index.js.map +1 -1
  60. package/dist/internal-helpers.d.ts +4 -8
  61. package/dist/internal-helpers.d.ts.map +1 -1
  62. package/dist/plugin/apply-plugins.d.ts.map +1 -1
  63. package/dist/plugin/chain-hooks.d.ts +1 -1
  64. package/dist/plugin/define-plugin.d.ts +4 -13
  65. package/dist/plugin/define-plugin.d.ts.map +1 -1
  66. package/dist/plugin/hook-registry.d.ts +2 -2
  67. package/dist/plugin/hook-registry.d.ts.map +1 -1
  68. package/dist/plugin/index.d.ts +1 -2
  69. package/dist/plugin/index.d.ts.map +1 -1
  70. package/dist/plugin/types.d.ts +21 -41
  71. package/dist/plugin/types.d.ts.map +1 -1
  72. package/dist/plugins.d.ts +7 -0
  73. package/dist/plugins.d.ts.map +1 -0
  74. package/dist/plugins.js +984 -0
  75. package/dist/plugins.js.map +1 -0
  76. package/dist/router.d.ts +12 -0
  77. package/dist/router.d.ts.map +1 -0
  78. package/dist/types/config.d.ts +61 -22
  79. package/dist/types/config.d.ts.map +1 -1
  80. package/dist/types/hook-contexts.d.ts +11 -6
  81. package/dist/types/hook-contexts.d.ts.map +1 -1
  82. package/dist/types/index.d.ts +2 -2
  83. package/dist/types/index.d.ts.map +1 -1
  84. package/package.json +16 -6
  85. package/dist/adapters/adapters.test.d.ts +0 -2
  86. package/dist/adapters/adapters.test.d.ts.map +0 -1
  87. package/dist/api.d.ts +0 -5
  88. package/dist/api.d.ts.map +0 -1
  89. package/dist/handler.d.ts +0 -5
  90. package/dist/handler.d.ts.map +0 -1
  91. package/dist/helpers/is-aws-not-found.test.d.ts +0 -2
  92. package/dist/helpers/is-aws-not-found.test.d.ts.map +0 -1
  93. package/dist/internal-helpers.test.d.ts +0 -2
  94. package/dist/internal-helpers.test.d.ts.map +0 -1
  95. package/dist/plugin/apply-plugins.test.d.ts +0 -2
  96. package/dist/plugin/apply-plugins.test.d.ts.map +0 -1
  97. package/dist/plugin/create-endpoint.d.ts +0 -20
  98. package/dist/plugin/create-endpoint.d.ts.map +0 -1
  99. package/dist/procedures/confirm.d.ts +0 -8
  100. package/dist/procedures/confirm.d.ts.map +0 -1
  101. package/dist/procedures/delete.d.ts +0 -8
  102. package/dist/procedures/delete.d.ts.map +0 -1
  103. package/dist/procedures/download.d.ts +0 -10
  104. package/dist/procedures/download.d.ts.map +0 -1
  105. package/dist/procedures/multipart/abort.d.ts +0 -13
  106. package/dist/procedures/multipart/abort.d.ts.map +0 -1
  107. package/dist/procedures/multipart/complete.d.ts +0 -12
  108. package/dist/procedures/multipart/complete.d.ts.map +0 -1
  109. package/dist/procedures/multipart/init.d.ts +0 -13
  110. package/dist/procedures/multipart/init.d.ts.map +0 -1
  111. package/dist/procedures/multipart/list-parts.d.ts +0 -9
  112. package/dist/procedures/multipart/list-parts.d.ts.map +0 -1
  113. package/dist/procedures/multipart/part.d.ts +0 -12
  114. package/dist/procedures/multipart/part.d.ts.map +0 -1
  115. package/dist/procedures/registry.d.ts +0 -78
  116. package/dist/procedures/registry.d.ts.map +0 -1
  117. package/dist/procedures/upload.d.ts +0 -14
  118. package/dist/procedures/upload.d.ts.map +0 -1
@@ -1,10 +0,0 @@
1
- import type { PresignResponse } from "@dimah-s3/core";
2
- import type { DimahS3Config } from "../types";
3
- export type DownloadInput = {
4
- key: string;
5
- bucket?: string;
6
- fileName?: string;
7
- expiresIn?: number;
8
- };
9
- export declare function download(config: DimahS3Config, input: DownloadInput, request: Request): Promise<PresignResponse>;
10
- //# sourceMappingURL=download.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/procedures/download.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAStD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,eAAe,CAAC,CAgD1B"}
@@ -1,13 +0,0 @@
1
- import type { MultipartAbortResponse } from "@dimah-s3/core";
2
- import type { DimahS3Config } from "../../types";
3
- export type MultipartAbortInput = {
4
- key: string;
5
- uploadId: string;
6
- bucket?: string;
7
- };
8
- export declare function multipartAbort(config: DimahS3Config, input: MultipartAbortInput, request: Request): Promise<MultipartAbortResponse & {
9
- bucket: string;
10
- key: string;
11
- uploadId: string;
12
- }>;
13
- //# sourceMappingURL=abort.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../../src/procedures/multipart/abort.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,OAAO,GACf,OAAO,CACR,sBAAsB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAC3E,CA4BA"}
@@ -1,12 +0,0 @@
1
- import type { MultipartCompleteResponse } from "@dimah-s3/core";
2
- import type { DimahS3Config } from "../../types";
3
- export type MultipartCompleteInput = {
4
- key: string;
5
- uploadId: string;
6
- bucket?: string;
7
- parts: {
8
- partNumber: number;
9
- }[];
10
- };
11
- export declare function multipartComplete(config: DimahS3Config, input: MultipartCompleteInput, request: Request): Promise<MultipartCompleteResponse>;
12
- //# sourceMappingURL=complete.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../src/procedures/multipart/complete.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAKhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjC,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,yBAAyB,CAAC,CA4FpC"}
@@ -1,13 +0,0 @@
1
- import type { MultipartInitResponse } from "@dimah-s3/core";
2
- import type { DimahS3Config } from "../../types";
3
- export type MultipartInitInput = {
4
- key: string;
5
- bucket?: string;
6
- contentType?: string;
7
- fileSize?: number;
8
- metadata?: Record<string, string>;
9
- acl?: "private" | "public-read";
10
- fileName?: string;
11
- };
12
- export declare function multipartInit(config: DimahS3Config, input: MultipartInitInput, request: Request): Promise<MultipartInitResponse>;
13
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/procedures/multipart/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAI5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,qBAAqB,CAAC,CA8ChC"}
@@ -1,9 +0,0 @@
1
- import type { MultipartListPartsResponse } from "@dimah-s3/core";
2
- import type { DimahS3Config } from "../../types";
3
- export type MultipartListPartsInput = {
4
- key: string;
5
- uploadId: string;
6
- bucket?: string;
7
- };
8
- export declare function multipartListParts(config: DimahS3Config, input: MultipartListPartsInput, request: Request): Promise<MultipartListPartsResponse>;
9
- //# sourceMappingURL=list-parts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-parts.d.ts","sourceRoot":"","sources":["../../../src/procedures/multipart/list-parts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,0BAA0B,CAAC,CA4CrC"}
@@ -1,12 +0,0 @@
1
- import type { MultipartPartResponse } from "@dimah-s3/core";
2
- import type { DimahS3Config } from "../../types";
3
- export type MultipartSignPartInput = {
4
- key: string;
5
- uploadId: string;
6
- partNumber: number;
7
- partSize?: number;
8
- bucket?: string;
9
- expiresIn?: number;
10
- };
11
- export declare function multipartSignPart(config: DimahS3Config, input: MultipartSignPartInput, request: Request): Promise<MultipartPartResponse>;
12
- //# sourceMappingURL=part.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"part.d.ts","sourceRoot":"","sources":["../../../src/procedures/multipart/part.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,qBAAqB,CAAC,CAiDhC"}
@@ -1,78 +0,0 @@
1
- import type { DimahS3Config } from "../types";
2
- /**
3
- * Single source of truth for core procedures shared by the HTTP handler and
4
- * direct `createServerApi`. Keys match {@link S3_API_ROUTES}.
5
- */
6
- export type ProcedureEntry = {
7
- /** Relative path under `basePath` (same as `S3_API_ROUTES` values). */
8
- path: string;
9
- method: "GET" | "POST" | "DELETE";
10
- /** Optional HTTP status for successful JSON responses. */
11
- status?: number;
12
- /** Feature flag — disabled → 404 from both handler and `api`. */
13
- isEnabled: (config: DimahS3Config) => boolean | undefined;
14
- run: (config: DimahS3Config, input: unknown, request: Request) => Promise<unknown>;
15
- };
16
- export declare const PROCEDURE_REGISTRY: {
17
- readonly upload: {
18
- readonly path: "presign/upload";
19
- readonly method: "POST";
20
- readonly isEnabled: (c: DimahS3Config) => boolean | undefined;
21
- readonly run: (config: DimahS3Config, input: unknown, request: Request) => Promise<import("@dimah-s3/core").UploadPresignResponse>;
22
- };
23
- readonly uploadConfirm: {
24
- readonly path: "presign/upload/confirm";
25
- readonly method: "POST";
26
- readonly isEnabled: (c: DimahS3Config) => boolean | undefined;
27
- readonly run: (config: DimahS3Config, input: unknown, request: Request) => Promise<import("@dimah-s3/core").UploadConfirmResponse>;
28
- };
29
- readonly download: {
30
- readonly path: "presign/download";
31
- readonly method: "GET";
32
- readonly isEnabled: (c: DimahS3Config) => boolean | undefined;
33
- readonly run: (config: DimahS3Config, input: unknown, request: Request) => Promise<import("@dimah-s3/core").PresignResponse>;
34
- };
35
- readonly delete: {
36
- readonly path: "delete";
37
- readonly method: "DELETE";
38
- readonly isEnabled: (c: DimahS3Config) => boolean | undefined;
39
- readonly run: (config: DimahS3Config, input: unknown, request: Request) => Promise<import("@dimah-s3/core").DeleteResponse>;
40
- };
41
- readonly multipartInit: {
42
- readonly path: "presign/multipart/init";
43
- readonly method: "POST";
44
- readonly status: 201;
45
- readonly isEnabled: (c: DimahS3Config) => boolean | undefined;
46
- readonly run: (config: DimahS3Config, input: unknown, request: Request) => Promise<import("@dimah-s3/core").MultipartInitResponse>;
47
- };
48
- readonly multipartPart: {
49
- readonly path: "presign/multipart/part";
50
- readonly method: "POST";
51
- readonly isEnabled: (c: DimahS3Config) => boolean | undefined;
52
- readonly run: (config: DimahS3Config, input: unknown, request: Request) => Promise<import("@dimah-s3/core").MultipartPartResponse>;
53
- };
54
- readonly multipartComplete: {
55
- readonly path: "presign/multipart/complete";
56
- readonly method: "POST";
57
- readonly isEnabled: (c: DimahS3Config) => boolean | undefined;
58
- readonly run: (config: DimahS3Config, input: unknown, request: Request) => Promise<import("@dimah-s3/core").MultipartCompleteResponse>;
59
- };
60
- readonly multipartAbort: {
61
- readonly path: "presign/multipart/abort";
62
- readonly method: "POST";
63
- readonly isEnabled: (c: DimahS3Config) => boolean | undefined;
64
- readonly run: (config: DimahS3Config, input: unknown, request: Request) => Promise<import("@dimah-s3/core").MultipartAbortResponse & {
65
- bucket: string;
66
- key: string;
67
- uploadId: string;
68
- }>;
69
- };
70
- readonly multipartListParts: {
71
- readonly path: "presign/multipart/parts";
72
- readonly method: "GET";
73
- readonly isEnabled: (c: DimahS3Config) => boolean | undefined;
74
- readonly run: (config: DimahS3Config, input: unknown, request: Request) => Promise<import("@dimah-s3/core").MultipartListPartsResponse>;
75
- };
76
- };
77
- export type ProcedureKey = keyof typeof PROCEDURE_REGISTRY;
78
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/procedures/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAW9C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,GAAG,SAAS,CAAC;IAC1D,GAAG,EAAE,CACH,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;yBAGnB,MAAM;;;;;;yBAON,MAAM;;;;;;yBAON,KAAK;;;;;;yBAOL,QAAQ;;;;;;yBAWR,MAAM;yBACN,GAAG;;;;;;yBAWH,MAAM;;;;;;yBAWN,MAAM;;;;;;yBAWN,MAAM;;;;;;;;;;yBAWN,KAAK;;;;CASsD,CAAC;AAExE,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,kBAAkB,CAAC"}
@@ -1,14 +0,0 @@
1
- import type { UploadPresignResponse } from "@dimah-s3/core";
2
- import type { DimahS3Config } from "../types";
3
- export type UploadInput = {
4
- key: string;
5
- contentType?: string;
6
- fileSize?: number;
7
- metadata?: Record<string, string>;
8
- bucket?: string;
9
- expiresIn?: number;
10
- acl?: "private" | "public-read";
11
- fileName?: string;
12
- };
13
- export declare function upload(config: DimahS3Config, input: UploadInput, request: Request): Promise<UploadPresignResponse>;
14
- //# sourceMappingURL=upload.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/procedures/upload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAQ5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,MAAM,CAC1B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,qBAAqB,CAAC,CAgIhC"}