@commercetools-frontend-extensions/operations 0.0.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 +55 -0
- package/README.md +169 -0
- package/babel.config.js +6 -0
- package/dist/commercetools-frontend-extensions-operations.cjs.d.ts +2 -0
- package/dist/commercetools-frontend-extensions-operations.cjs.dev.js +2469 -0
- package/dist/commercetools-frontend-extensions-operations.cjs.js +7 -0
- package/dist/commercetools-frontend-extensions-operations.cjs.prod.js +2461 -0
- package/dist/commercetools-frontend-extensions-operations.esm.js +2316 -0
- package/dist/declarations/src/@api/export-operations.d.ts +5 -0
- package/dist/declarations/src/@api/fetcher.d.ts +17 -0
- package/dist/declarations/src/@api/file-upload.d.ts +3 -0
- package/dist/declarations/src/@api/import-containers.d.ts +35 -0
- package/dist/declarations/src/@api/import-operations.d.ts +6 -0
- package/dist/declarations/src/@api/index.d.ts +8 -0
- package/dist/declarations/src/@api/process-file.d.ts +3 -0
- package/dist/declarations/src/@api/test-fixtures.d.ts +272 -0
- package/dist/declarations/src/@api/urls.d.ts +44 -0
- package/dist/declarations/src/@components/file-drop-area/active-drag-drop-area.d.ts +10 -0
- package/dist/declarations/src/@components/file-drop-area/disabled-drop-area.d.ts +5 -0
- package/dist/declarations/src/@components/file-drop-area/drop-area-wrapper.d.ts +11 -0
- package/dist/declarations/src/@components/file-drop-area/enabled-drop-area.d.ts +7 -0
- package/dist/declarations/src/@components/file-drop-area/file-drop-area.d.ts +14 -0
- package/dist/declarations/src/@components/file-drop-area/file-dropped-area.d.ts +6 -0
- package/dist/declarations/src/@components/file-drop-area/index.d.ts +7 -0
- package/dist/declarations/src/@components/file-drop-area/styles.d.ts +9 -0
- package/dist/declarations/src/@components/icons/file-icon.d.ts +2 -0
- package/dist/declarations/src/@components/icons/index.d.ts +2 -0
- package/dist/declarations/src/@components/icons/lock-icon.d.ts +2 -0
- package/dist/declarations/src/@components/index.d.ts +6 -0
- package/dist/declarations/src/@components/info-box/index.d.ts +1 -0
- package/dist/declarations/src/@components/info-box/info-box.d.ts +7 -0
- package/dist/declarations/src/@components/upload-separator/index.d.ts +1 -0
- package/dist/declarations/src/@components/upload-separator/upload-separator.d.ts +12 -0
- package/dist/declarations/src/@components/upload-settings/index.d.ts +1 -0
- package/dist/declarations/src/@components/upload-settings/upload-settings.d.ts +11 -0
- package/dist/declarations/src/@components/uploading-modal/index.d.ts +1 -0
- package/dist/declarations/src/@components/uploading-modal/uploading-modal.d.ts +12 -0
- package/dist/declarations/src/@constants/delimiters.d.ts +8 -0
- package/dist/declarations/src/@constants/import-tags.d.ts +7 -0
- package/dist/declarations/src/@constants/index.d.ts +4 -0
- package/dist/declarations/src/@constants/resource-links.d.ts +10 -0
- package/dist/declarations/src/@constants/upload-limits.d.ts +10 -0
- package/dist/declarations/src/@errors/http-error.d.ts +6 -0
- package/dist/declarations/src/@errors/index.d.ts +8 -0
- package/dist/declarations/src/@errors/invalid-response-error.d.ts +3 -0
- package/dist/declarations/src/@errors/no-resources-to-export-error.d.ts +3 -0
- package/dist/declarations/src/@errors/project-key-not-available-error.d.ts +3 -0
- package/dist/declarations/src/@errors/query-predicate-error.d.ts +4 -0
- package/dist/declarations/src/@errors/unexpected-column-error.d.ts +3 -0
- package/dist/declarations/src/@errors/unexpected-operation-state-error.d.ts +4 -0
- package/dist/declarations/src/@errors/unexpected-resource-type-error.d.ts +3 -0
- package/dist/declarations/src/@hooks/index.d.ts +5 -0
- package/dist/declarations/src/@hooks/use-fetch-export-operations.d.ts +15 -0
- package/dist/declarations/src/@hooks/use-fetch-import-container-details.d.ts +15 -0
- package/dist/declarations/src/@hooks/use-fetch-import-operations.d.ts +16 -0
- package/dist/declarations/src/@hooks/use-fetch-import-summaries.d.ts +20 -0
- package/dist/declarations/src/@hooks/use-import-container-upload.d.ts +18 -0
- package/dist/declarations/src/@types/api.d.ts +13 -0
- package/dist/declarations/src/@types/basic-error-data-type.d.ts +5 -0
- package/dist/declarations/src/@types/export-operation.d.ts +95 -0
- package/dist/declarations/src/@types/file-upload.d.ts +63 -0
- package/dist/declarations/src/@types/import-container.d.ts +53 -0
- package/dist/declarations/src/@types/import-operation.d.ts +13 -0
- package/dist/declarations/src/@types/import-states.d.ts +9 -0
- package/dist/declarations/src/@types/import-summary.d.ts +15 -0
- package/dist/declarations/src/@types/index.d.ts +9 -0
- package/dist/declarations/src/@types/shared.d.ts +7 -0
- package/dist/declarations/src/@utils/error-mapping.d.ts +19 -0
- package/dist/declarations/src/@utils/file-upload.d.ts +46 -0
- package/dist/declarations/src/@utils/form.d.ts +1 -0
- package/dist/declarations/src/@utils/format.d.ts +5 -0
- package/dist/declarations/src/@utils/import-container.d.ts +8 -0
- package/dist/declarations/src/@utils/index.d.ts +6 -0
- package/dist/declarations/src/@utils/url.d.ts +6 -0
- package/dist/declarations/src/index.d.ts +26 -0
- package/index.js +1 -0
- package/jest.test.config.js +11 -0
- package/package.json +63 -0
- package/src/@api/export-operations.ts +26 -0
- package/src/@api/fetcher.spec.ts +51 -0
- package/src/@api/fetcher.ts +127 -0
- package/src/@api/file-upload.spec.ts +83 -0
- package/src/@api/file-upload.ts +46 -0
- package/src/@api/import-containers.ts +256 -0
- package/src/@api/import-operations.ts +33 -0
- package/src/@api/index.ts +8 -0
- package/src/@api/process-file.spec.ts +74 -0
- package/src/@api/process-file.ts +53 -0
- package/src/@api/test-fixtures.ts +772 -0
- package/src/@api/urls.ts +118 -0
- package/src/@components/file-drop-area/active-drag-drop-area.tsx +33 -0
- package/src/@components/file-drop-area/disabled-drop-area.tsx +17 -0
- package/src/@components/file-drop-area/drop-area-wrapper.tsx +38 -0
- package/src/@components/file-drop-area/enabled-drop-area.tsx +27 -0
- package/src/@components/file-drop-area/file-drop-area.tsx +74 -0
- package/src/@components/file-drop-area/file-dropped-area.tsx +29 -0
- package/src/@components/file-drop-area/index.ts +7 -0
- package/src/@components/file-drop-area/styles.ts +67 -0
- package/src/@components/icons/file-icon.tsx +30 -0
- package/src/@components/icons/index.ts +2 -0
- package/src/@components/icons/lock-icon.tsx +34 -0
- package/src/@components/index.ts +6 -0
- package/src/@components/info-box/index.ts +1 -0
- package/src/@components/info-box/info-box.tsx +23 -0
- package/src/@components/upload-separator/index.ts +1 -0
- package/src/@components/upload-separator/upload-separator.tsx +61 -0
- package/src/@components/upload-settings/index.ts +1 -0
- package/src/@components/upload-settings/upload-settings.tsx +36 -0
- package/src/@components/uploading-modal/index.ts +1 -0
- package/src/@components/uploading-modal/uploading-modal.tsx +64 -0
- package/src/@constants/delimiters.ts +14 -0
- package/src/@constants/import-tags.ts +9 -0
- package/src/@constants/index.ts +4 -0
- package/src/@constants/resource-links.ts +61 -0
- package/src/@constants/upload-limits.ts +11 -0
- package/src/@errors/http-error.ts +17 -0
- package/src/@errors/index.ts +8 -0
- package/src/@errors/invalid-response-error.ts +6 -0
- package/src/@errors/no-resources-to-export-error.ts +6 -0
- package/src/@errors/project-key-not-available-error.ts +6 -0
- package/src/@errors/query-predicate-error.ts +10 -0
- package/src/@errors/unexpected-column-error.ts +6 -0
- package/src/@errors/unexpected-operation-state-error.ts +8 -0
- package/src/@errors/unexpected-resource-type-error.ts +6 -0
- package/src/@hooks/index.ts +5 -0
- package/src/@hooks/messages.ts +11 -0
- package/src/@hooks/use-fetch-export-operations.ts +34 -0
- package/src/@hooks/use-fetch-import-container-details.ts +31 -0
- package/src/@hooks/use-fetch-import-operations.ts +42 -0
- package/src/@hooks/use-fetch-import-summaries.ts +47 -0
- package/src/@hooks/use-fetch.spec.ts +76 -0
- package/src/@hooks/use-fetch.ts +80 -0
- package/src/@hooks/use-import-container-upload.spec.ts +294 -0
- package/src/@hooks/use-import-container-upload.ts +126 -0
- package/src/@types/api.ts +14 -0
- package/src/@types/basic-error-data-type.ts +5 -0
- package/src/@types/export-operation.ts +144 -0
- package/src/@types/file-upload.ts +81 -0
- package/src/@types/import-container.ts +104 -0
- package/src/@types/import-operation.ts +31 -0
- package/src/@types/import-states.ts +9 -0
- package/src/@types/import-summary.ts +22 -0
- package/src/@types/index.ts +9 -0
- package/src/@types/shared.ts +52 -0
- package/src/@utils/error-mapping.spec.ts +126 -0
- package/src/@utils/error-mapping.ts +39 -0
- package/src/@utils/file-upload.spec.ts +151 -0
- package/src/@utils/file-upload.ts +150 -0
- package/src/@utils/form.ts +20 -0
- package/src/@utils/format.spec.ts +62 -0
- package/src/@utils/format.ts +53 -0
- package/src/@utils/import-container.spec.ts +26 -0
- package/src/@utils/import-container.ts +34 -0
- package/src/@utils/index.ts +6 -0
- package/src/@utils/url.spec.ts +75 -0
- package/src/@utils/url.ts +18 -0
- package/src/index.ts +27 -0
- package/tsconfig.json +9 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# @commercetools-frontend-extensions/operations
|
|
2
|
+
|
|
3
|
+
## 2.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1640](https://github.com/commercetools/merchant-center-operations/pull/1640) [`f857821`](https://github.com/commercetools/merchant-center-operations/commit/f857821ffebd12a90b02ab5b6f77cf4cb08a495c) Thanks [@yassinejebli](https://github.com/yassinejebli)! - chore: enable npm publication for operations shared package
|
|
8
|
+
|
|
9
|
+
## 2.0.0
|
|
10
|
+
|
|
11
|
+
### Major Changes
|
|
12
|
+
|
|
13
|
+
- [#1638](https://github.com/commercetools/merchant-center-operations/pull/1638) [`516f918`](https://github.com/commercetools/merchant-center-operations/commit/516f9189854c90c9d30242d2b724f0882ebbebee) Thanks [@yassinejebli](https://github.com/yassinejebli)! - Publish shared operations package and update modals
|
|
14
|
+
|
|
15
|
+
## 1.1.3
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- [#1423](https://github.com/commercetools/merchant-center-operations/pull/1423) [`d3da143`](https://github.com/commercetools/merchant-center-operations/commit/d3da1439618f27b4804b7293b0d8419508c6639a) Thanks [@renovate](https://github.com/apps/renovate)! - update all dependencies
|
|
20
|
+
|
|
21
|
+
## 1.1.2
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- [#1382](https://github.com/commercetools/merchant-center-operations/pull/1382) [`67fde7a`](https://github.com/commercetools/merchant-center-operations/commit/67fde7aee9c41631d2e703f009fdfb3bbb091868) Thanks [@renovate](https://github.com/apps/renovate)! - update all dependencies
|
|
26
|
+
|
|
27
|
+
## 1.1.1
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- [#1344](https://github.com/commercetools/merchant-center-operations/pull/1344) [`0ee84d2`](https://github.com/commercetools/merchant-center-operations/commit/0ee84d2d6a8c3f34f53ac750890c9f7ab68cfedf) Thanks [@renovate](https://github.com/apps/renovate)! - chore: update deps
|
|
32
|
+
|
|
33
|
+
## 1.1.0
|
|
34
|
+
|
|
35
|
+
### Minor Changes
|
|
36
|
+
|
|
37
|
+
- [#1282](https://github.com/commercetools/merchant-center-operations/pull/1282) [`1a8828c`](https://github.com/commercetools/merchant-center-operations/commit/1a8828c14baff2512819872a5dd895a70861185f) Thanks [@mustafaasif2](https://github.com/mustafaasif2)! - remove support for locale `zh-CN`
|
|
38
|
+
|
|
39
|
+
## 1.0.3
|
|
40
|
+
|
|
41
|
+
### Patch Changes
|
|
42
|
+
|
|
43
|
+
- [#1243](https://github.com/commercetools/merchant-center-operations/pull/1243) [`da123a8`](https://github.com/commercetools/merchant-center-operations/commit/da123a824ce028794562865c4d047478fcdf0812) Thanks [@renovate](https://github.com/apps/renovate)! - chore: update all dependencies
|
|
44
|
+
|
|
45
|
+
## 1.0.2
|
|
46
|
+
|
|
47
|
+
### Patch Changes
|
|
48
|
+
|
|
49
|
+
- [#1243](https://github.com/commercetools/merchant-center-operations/pull/1243) [`da123a8`](https://github.com/commercetools/merchant-center-operations/commit/da123a824ce028794562865c4d047478fcdf0812) Thanks [@renovate](https://github.com/apps/renovate)! - chore: update all dependencies
|
|
50
|
+
|
|
51
|
+
## 1.0.1
|
|
52
|
+
|
|
53
|
+
### Patch Changes
|
|
54
|
+
|
|
55
|
+
- [#1189](https://github.com/commercetools/merchant-center-operations/pull/1189) [`7e1b60f`](https://github.com/commercetools/merchant-center-operations/commit/7e1b60f9b220dc7b79d5e21f9d1ec8880b7caeac) Thanks [@renovate](https://github.com/apps/renovate)! - update all dependencies
|
package/README.md
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Shared operations package
|
|
2
|
+
|
|
3
|
+
Shared functionality for import/export operations across multiple frontend applications and extensions.
|
|
4
|
+
|
|
5
|
+
## Hooks
|
|
6
|
+
|
|
7
|
+
### `useImportContainerUpload`
|
|
8
|
+
|
|
9
|
+
Handles file upload to import containers with automatic cleanup on errors.
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
const { upload, abort, isUploading, progress } = useImportContainerUpload({
|
|
13
|
+
projectKey: string
|
|
14
|
+
})
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Parameters:**
|
|
18
|
+
- `projectKey` (required): The commercetools project key
|
|
19
|
+
|
|
20
|
+
**Returns:**
|
|
21
|
+
- `upload`: Function to start file upload
|
|
22
|
+
- `abort`: Function to cancel ongoing upload
|
|
23
|
+
- `isUploading`: Boolean indicating upload state
|
|
24
|
+
- `progress`: Upload progress (0-100)
|
|
25
|
+
|
|
26
|
+
**Usage:**
|
|
27
|
+
```typescript
|
|
28
|
+
const projectKey = useApplicationContext((context) => context.project?.key)
|
|
29
|
+
const { upload, isUploading, progress } = useImportContainerUpload({
|
|
30
|
+
projectKey: projectKey!
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
await upload({
|
|
34
|
+
file: File,
|
|
35
|
+
resourceType: 'product' | 'category' | ...,
|
|
36
|
+
settings?: {
|
|
37
|
+
format?: 'CSV' | 'JSON',
|
|
38
|
+
decimalSeparator?: '.' | ',',
|
|
39
|
+
resourceType?: string, // example: 'product-draft' for products
|
|
40
|
+
options?: {
|
|
41
|
+
publishAllChanges?: boolean, // product-specific
|
|
42
|
+
unpublishAllChanges?: boolean // product-specific
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
onSuccess: (response, containerKey) => { /* ... */ },
|
|
46
|
+
onError: (error) => { /* ... */ },
|
|
47
|
+
onProgress: (progress) => { /* ... */ }
|
|
48
|
+
})
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### `useFetchImportOperations`
|
|
54
|
+
|
|
55
|
+
Fetches import operations for a specific container with optional polling.
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
const { data, error, isLoading, refetch, lastFetchTime } = useFetchImportOperations({
|
|
59
|
+
projectKey: string,
|
|
60
|
+
importContainerKey: string,
|
|
61
|
+
queryParams?: ImportOperationQueryParams,
|
|
62
|
+
pollingInterval?: number,
|
|
63
|
+
shouldContinuePolling?: (data) => boolean
|
|
64
|
+
})
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Parameters:**
|
|
68
|
+
- `projectKey` (required): The commercetools project key
|
|
69
|
+
- `importContainerKey` (required): The import container key
|
|
70
|
+
- `queryParams`: Optional query parameters (limit, offset, etc.)
|
|
71
|
+
- `pollingInterval`: Polling interval in milliseconds
|
|
72
|
+
- `shouldContinuePolling`: Function to determine if polling should continue
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### `useFetchImportSummaries`
|
|
77
|
+
|
|
78
|
+
Fetches import summaries (containers) with optional polling.
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
const { data, error, isLoading, refetch, lastFetchTime } = useFetchImportSummaries({
|
|
82
|
+
projectKey: string,
|
|
83
|
+
queryParams?: ImportContainerQueryParams,
|
|
84
|
+
pollingInterval?: number,
|
|
85
|
+
shouldContinuePolling?: (data) => boolean
|
|
86
|
+
})
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Parameters:**
|
|
90
|
+
- `projectKey` (required): The commercetools project key
|
|
91
|
+
- `queryParams`: Optional query parameters (limit, offset, states, etc.)
|
|
92
|
+
- `pollingInterval`: Polling interval in milliseconds
|
|
93
|
+
- `shouldContinuePolling`: Function to determine if polling should continue
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### `useFetchImportContainerDetails`
|
|
98
|
+
|
|
99
|
+
Fetches details for a specific import container with optional polling.
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
const { data, error, isLoading, refetch, lastFetchTime } = useFetchImportContainerDetails({
|
|
103
|
+
projectKey: string,
|
|
104
|
+
importContainerKey: string,
|
|
105
|
+
pollingInterval?: number,
|
|
106
|
+
shouldContinuePolling?: (data) => boolean
|
|
107
|
+
})
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Parameters:**
|
|
111
|
+
- `projectKey` (required): The commercetools project key
|
|
112
|
+
- `importContainerKey` (required): The import container key
|
|
113
|
+
- `pollingInterval`: Polling interval in milliseconds
|
|
114
|
+
- `shouldContinuePolling`: Function to determine if polling should continue
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### `useFetchExportOperations`
|
|
119
|
+
|
|
120
|
+
Fetches export operations with optional polling.
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
const { data, error, isLoading, refetch, lastFetchTime } = useFetchExportOperations({
|
|
124
|
+
projectKey: string,
|
|
125
|
+
queryParams?: ExportOperationQueryParams,
|
|
126
|
+
pollingInterval?: number,
|
|
127
|
+
shouldContinuePolling?: (data) => boolean
|
|
128
|
+
})
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Parameters:**
|
|
132
|
+
- `projectKey` (required): The commercetools project key
|
|
133
|
+
- `queryParams`: Optional query parameters (limit, offset, resourceTypes, etc.)
|
|
134
|
+
- `pollingInterval`: Polling interval in milliseconds
|
|
135
|
+
- `shouldContinuePolling`: Function to determine if polling should continue
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Notes
|
|
140
|
+
|
|
141
|
+
- **All hooks require `projectKey`** to be passed explicitly (retrieved from `useApplicationContext`)
|
|
142
|
+
- **Polling is opt-in** via `pollingInterval` parameter
|
|
143
|
+
- **Standard return structure**: All fetch hooks return `{ data, error, isLoading, refetch, lastFetchTime }`
|
|
144
|
+
- **Automatic cleanup**: `useImportContainerUpload` automatically cleans up containers on upload errors
|
|
145
|
+
- **File upload limits**: The package exports backend-recommended limits enforced in frontend validation:
|
|
146
|
+
- `MAX_FILE_SIZE_MB` (35 MB)
|
|
147
|
+
- `MAX_ROW_COUNT` (80,000)
|
|
148
|
+
- **Internal use only**: This package also exports additional components, utilities, types, and API functions that are intended for internal use within the operations repository (operations app and frontend extensions). Only the hooks documented above are considered stable public API for external consumption.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Common patterns
|
|
153
|
+
|
|
154
|
+
### Polling example
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
const POLL_INTERVAL = 5000 // 5 seconds
|
|
158
|
+
|
|
159
|
+
const { data, isLoading } = useFetchImportOperations({
|
|
160
|
+
projectKey,
|
|
161
|
+
importContainerKey,
|
|
162
|
+
pollingInterval: POLL_INTERVAL,
|
|
163
|
+
shouldContinuePolling: (data) => {
|
|
164
|
+
// Stop polling when all operations are completed
|
|
165
|
+
return data?.results?.some(op => op.state === 'processing') ?? false
|
|
166
|
+
}
|
|
167
|
+
})
|
|
168
|
+
```
|
|
169
|
+
|
package/babel.config.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from "./declarations/src/index.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVyY2V0b29scy1mcm9udGVuZC1leHRlbnNpb25zLW9wZXJhdGlvbnMuY2pzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuL2RlY2xhcmF0aW9ucy9zcmMvaW5kZXguZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSJ9
|