@tinloof/medusa-sanity-sync 0.1.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 (67) hide show
  1. package/.medusa/server/src/admin/index.js +1521 -0
  2. package/.medusa/server/src/admin/index.mjs +1520 -0
  3. package/.medusa/server/src/api/admin/sanity/documents/[id]/route.d.ts +3 -0
  4. package/.medusa/server/src/api/admin/sanity/documents/[id]/route.d.ts.map +1 -0
  5. package/.medusa/server/src/api/admin/sanity/documents/[id]/route.js +12 -0
  6. package/.medusa/server/src/api/admin/sanity/entities/[entityType]/[id]/sync/route.d.ts +7 -0
  7. package/.medusa/server/src/api/admin/sanity/entities/[entityType]/[id]/sync/route.d.ts.map +1 -0
  8. package/.medusa/server/src/api/admin/sanity/entities/[entityType]/[id]/sync/route.js +23 -0
  9. package/.medusa/server/src/api/admin/sanity/syncs/route.d.ts +14 -0
  10. package/.medusa/server/src/api/admin/sanity/syncs/route.d.ts.map +1 -0
  11. package/.medusa/server/src/api/admin/sanity/syncs/route.js +60 -0
  12. package/.medusa/server/src/core/default-entities.d.ts +35 -0
  13. package/.medusa/server/src/core/default-entities.d.ts.map +1 -0
  14. package/.medusa/server/src/core/default-entities.js +67 -0
  15. package/.medusa/server/src/core/entity-registry.d.ts +15 -0
  16. package/.medusa/server/src/core/entity-registry.d.ts.map +1 -0
  17. package/.medusa/server/src/core/entity-registry.js +35 -0
  18. package/.medusa/server/src/core/index.d.ts +4 -0
  19. package/.medusa/server/src/core/index.d.ts.map +1 -0
  20. package/.medusa/server/src/core/index.js +17 -0
  21. package/.medusa/server/src/core/transformer.d.ts +49 -0
  22. package/.medusa/server/src/core/transformer.d.ts.map +1 -0
  23. package/.medusa/server/src/core/transformer.js +76 -0
  24. package/.medusa/server/src/event-batcher/event-batcher.d.ts +29 -0
  25. package/.medusa/server/src/event-batcher/event-batcher.d.ts.map +1 -0
  26. package/.medusa/server/src/event-batcher/event-batcher.js +93 -0
  27. package/.medusa/server/src/event-batcher/event-buffer.d.ts +35 -0
  28. package/.medusa/server/src/event-batcher/event-buffer.d.ts.map +1 -0
  29. package/.medusa/server/src/event-batcher/event-buffer.js +127 -0
  30. package/.medusa/server/src/event-batcher/index.d.ts +4 -0
  31. package/.medusa/server/src/event-batcher/index.d.ts.map +1 -0
  32. package/.medusa/server/src/event-batcher/index.js +8 -0
  33. package/.medusa/server/src/event-batcher/types.d.ts +50 -0
  34. package/.medusa/server/src/event-batcher/types.d.ts.map +1 -0
  35. package/.medusa/server/src/event-batcher/types.js +3 -0
  36. package/.medusa/server/src/index.d.ts +40 -0
  37. package/.medusa/server/src/index.d.ts.map +1 -0
  38. package/.medusa/server/src/index.js +62 -0
  39. package/.medusa/server/src/modules/sanity/index.d.ts +8 -0
  40. package/.medusa/server/src/modules/sanity/index.d.ts.map +1 -0
  41. package/.medusa/server/src/modules/sanity/index.js +15 -0
  42. package/.medusa/server/src/modules/sanity/service.d.ts +115 -0
  43. package/.medusa/server/src/modules/sanity/service.d.ts.map +1 -0
  44. package/.medusa/server/src/modules/sanity/service.js +301 -0
  45. package/.medusa/server/src/subscribers/factory.d.ts +43 -0
  46. package/.medusa/server/src/subscribers/factory.d.ts.map +1 -0
  47. package/.medusa/server/src/subscribers/factory.js +68 -0
  48. package/.medusa/server/src/subscribers/index.d.ts +9 -0
  49. package/.medusa/server/src/subscribers/index.d.ts.map +1 -0
  50. package/.medusa/server/src/subscribers/index.js +13 -0
  51. package/.medusa/server/src/subscribers/sanity-sync.d.ts +10 -0
  52. package/.medusa/server/src/subscribers/sanity-sync.d.ts.map +1 -0
  53. package/.medusa/server/src/subscribers/sanity-sync.js +81 -0
  54. package/.medusa/server/src/types/index.d.ts +189 -0
  55. package/.medusa/server/src/types/index.d.ts.map +1 -0
  56. package/.medusa/server/src/types/index.js +3 -0
  57. package/.medusa/server/src/workflows/index.d.ts +2 -0
  58. package/.medusa/server/src/workflows/index.d.ts.map +1 -0
  59. package/.medusa/server/src/workflows/index.js +6 -0
  60. package/.medusa/server/src/workflows/sanity-sync-products/index.d.ts +6 -0
  61. package/.medusa/server/src/workflows/sanity-sync-products/index.d.ts.map +1 -0
  62. package/.medusa/server/src/workflows/sanity-sync-products/index.js +16 -0
  63. package/.medusa/server/src/workflows/sanity-sync-products/steps/sync.d.ts +4 -0
  64. package/.medusa/server/src/workflows/sanity-sync-products/steps/sync.d.ts.map +1 -0
  65. package/.medusa/server/src/workflows/sanity-sync-products/steps/sync.js +90 -0
  66. package/README.md +459 -0
  67. package/package.json +120 -0
@@ -0,0 +1,189 @@
1
+ import type { Logger } from "@medusajs/framework/types";
2
+ import type { SanityClient } from "@sanity/client";
3
+ import type { BatcherConfig } from "../event-batcher";
4
+ /**
5
+ * Context passed to sync handlers
6
+ */
7
+ export type SyncContext = {
8
+ sanityClient: SanityClient;
9
+ logger: Logger;
10
+ };
11
+ /**
12
+ * Custom sync handlers for create/update/delete operations
13
+ */
14
+ export type SyncHandlers<T = any> = {
15
+ /**
16
+ * Handle entity creation. Receives raw Medusa data.
17
+ * Default: transform + sanity client.create()
18
+ */
19
+ onCreate?: (entityType: string, id: string, data: T, ctx: SyncContext) => Promise<void>;
20
+ /**
21
+ * Handle entity update. Receives raw Medusa data.
22
+ * Default: transform + sanity client.patch()
23
+ */
24
+ onUpdate?: (entityType: string, id: string, data: T, ctx: SyncContext) => Promise<void>;
25
+ /**
26
+ * Handle entity deletion. Only receives ID.
27
+ * Default: sanity client.delete()
28
+ */
29
+ onDelete?: (entityType: string, id: string, ctx: SyncContext) => Promise<void>;
30
+ };
31
+ /**
32
+ * Entity definition for configuring how a Medusa entity syncs to Sanity.
33
+ */
34
+ export type EntityDefinition = {
35
+ /**
36
+ * Medusa entity name (e.g., "product", "product_category", "product_collection")
37
+ */
38
+ medusaEntity: string;
39
+ /**
40
+ * Sanity document type to create/update
41
+ */
42
+ sanityType: string;
43
+ /**
44
+ * Events that trigger sync (e.g., ["product.created", "product.updated"])
45
+ */
46
+ events: string[];
47
+ /**
48
+ * Additional fields or relations to query from Medusa.
49
+ * All entity fields are fetched by default using "*".
50
+ * Use this to fetch relations like "images.*", "variants.*", etc.
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * // Fetch product images and variants
55
+ * queryFields: ["images.*", "variants.*"]
56
+ * ```
57
+ */
58
+ queryFields?: string[];
59
+ };
60
+ /**
61
+ * Top-level transformer function signature.
62
+ * This single function handles all entity transformations.
63
+ *
64
+ * @param entityType - The Medusa entity type (e.g., "product", "product_category")
65
+ * @param data - The raw Medusa entity data
66
+ * @returns The transformed data for Sanity (without _type and _id, those are added automatically)
67
+ */
68
+ export type TransformerFunction<T = any> = (entityType: string, data: T) => Record<string, any>;
69
+ /**
70
+ * Main plugin options for configuring the Sanity Sync plugin
71
+ */
72
+ export type SanitySyncPluginOptions = {
73
+ /**
74
+ * Sanity API token with write permissions
75
+ */
76
+ api_token: string;
77
+ /**
78
+ * Sanity project ID
79
+ */
80
+ project_id: string;
81
+ /**
82
+ * Sanity API version (e.g., "2024-01-01")
83
+ */
84
+ api_version: string;
85
+ /**
86
+ * Sanity dataset to use
87
+ */
88
+ dataset: "production" | "development" | string;
89
+ /**
90
+ * URL to the Sanity Studio (for generating links in Admin UI)
91
+ */
92
+ studio_url?: string;
93
+ /**
94
+ * Entity definitions for syncing.
95
+ * If not provided, default product entity is used.
96
+ * If provided, it replaces the defaults - use defaultProductEntity to include it.
97
+ */
98
+ entities?: EntityDefinition[];
99
+ /**
100
+ * Global transformer function for all entities.
101
+ * If not provided, a default transformer is used that maps basic fields.
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * transformer: (entityType, data) => {
106
+ * switch (entityType) {
107
+ * case "product":
108
+ * return { title: data.title, handle: data.handle };
109
+ * case "product_category":
110
+ * return { name: data.name, handle: data.handle };
111
+ * default:
112
+ * return data;
113
+ * }
114
+ * }
115
+ * ```
116
+ */
117
+ transformer?: TransformerFunction;
118
+ /**
119
+ * Batching configuration for event processing.
120
+ * If not provided, defaults to: flushInterval=10000ms, maxBatchSize=50, enabled=true
121
+ */
122
+ batching?: BatcherConfig;
123
+ /**
124
+ * Custom sync handlers for create/update/delete operations.
125
+ * If not provided, uses default Sanity create/patch/delete operations.
126
+ */
127
+ syncHandlers?: SyncHandlers;
128
+ };
129
+ /**
130
+ * Module options passed to the Sanity module service (internal use)
131
+ */
132
+ export type SanityModuleOptions = {
133
+ api_token: string;
134
+ project_id: string;
135
+ api_version: string;
136
+ dataset: string;
137
+ studio_url?: string;
138
+ entities?: EntityDefinition[];
139
+ transformer?: TransformerFunction;
140
+ batching?: BatcherConfig;
141
+ syncHandlers?: SyncHandlers;
142
+ };
143
+ /**
144
+ * Input for the generic sync entities workflow
145
+ */
146
+ export type SyncEntitiesInput = {
147
+ /**
148
+ * The entity type to sync (e.g., "product", "product_category")
149
+ */
150
+ entityType: string;
151
+ /**
152
+ * Optional list of entity IDs to sync. If not provided, syncs all entities.
153
+ */
154
+ ids?: string[];
155
+ };
156
+ /**
157
+ * Result of a sync operation
158
+ */
159
+ export type SyncResult = {
160
+ /**
161
+ * Total number of entities synced
162
+ */
163
+ total: number;
164
+ /**
165
+ * Number of entities created
166
+ */
167
+ created: number;
168
+ /**
169
+ * Number of entities updated
170
+ */
171
+ updated: number;
172
+ /**
173
+ * Any errors that occurred during sync
174
+ */
175
+ errors: Array<{
176
+ id: string;
177
+ error: string;
178
+ }>;
179
+ };
180
+ /**
181
+ * Upsert map entry for tracking sync operations (used for compensation)
182
+ */
183
+ export type UpsertMapEntry = {
184
+ id: string;
185
+ before: any;
186
+ after: any;
187
+ isCreate: boolean;
188
+ };
189
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,2 @@
1
+ export { syncEntitiesWorkflow } from "./sanity-sync-products";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/workflows/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncEntitiesWorkflow = void 0;
4
+ var sanity_sync_products_1 = require("./sanity-sync-products");
5
+ Object.defineProperty(exports, "syncEntitiesWorkflow", { enumerable: true, get: function () { return sanity_sync_products_1.syncEntitiesWorkflow; } });
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQUE4RDtBQUFyRCw0SEFBQSxvQkFBb0IsT0FBQSJ9
@@ -0,0 +1,6 @@
1
+ import type { SyncEntitiesInput, SyncResult } from "../../types";
2
+ /**
3
+ * Workflow for syncing any entity type to Sanity.
4
+ */
5
+ export declare const syncEntitiesWorkflow: import("@medusajs/framework/workflows-sdk").ReturnWorkflow<SyncEntitiesInput, SyncResult, []>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/workflows/sanity-sync-products/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGjE;;GAEG;AACH,eAAO,MAAM,oBAAoB,+FAShC,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncEntitiesWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const sync_1 = require("./steps/sync");
6
+ /**
7
+ * Workflow for syncing any entity type to Sanity.
8
+ */
9
+ exports.syncEntitiesWorkflow = (0, workflows_sdk_1.createWorkflow)({
10
+ name: "sanity-sync-entities",
11
+ retentionTime: 10_000,
12
+ }, (input) => {
13
+ const result = (0, sync_1.syncStep)(input);
14
+ return new workflows_sdk_1.WorkflowResponse(result);
15
+ });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3Nhbml0eS1zeW5jLXByb2R1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUcyQztBQUczQyx1Q0FBd0M7QUFFeEM7O0dBRUc7QUFDVSxRQUFBLG9CQUFvQixHQUFHLElBQUEsOEJBQWMsRUFDaEQ7SUFDRSxJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLGFBQWEsRUFBRSxNQUFNO0NBQ3RCLEVBQ0QsQ0FBQyxLQUF3QixFQUFnQyxFQUFFO0lBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUEsZUFBUSxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQ0YsQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ import type { SyncEntitiesInput, SyncResult } from "../../../types";
2
+ export type SyncStepInput = SyncEntitiesInput;
3
+ export declare const syncStep: import("@medusajs/framework/workflows-sdk").StepFunction<SyncEntitiesInput, SyncResult>;
4
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../../../../src/workflows/sanity-sync-products/steps/sync.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EAEX,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE9C,eAAO,MAAM,QAAQ,yFAoHpB,CAAC"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncStep = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const sanity_1 = require("../../../modules/sanity");
7
+ exports.syncStep = (0, workflows_sdk_1.createStep)({ name: "sync-step", async: true }, async (input, { container }) => {
8
+ const sanityModule = container.resolve(sanity_1.SANITY_MODULE);
9
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
10
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
11
+ const entityRegistry = sanityModule.getEntityRegistry();
12
+ const entity = entityRegistry.get(input.entityType);
13
+ if (!entity) {
14
+ return workflows_sdk_1.StepResponse.permanentFailure(`Entity type "${input.entityType}" is not registered`, []);
15
+ }
16
+ const upsertMap = [];
17
+ const result = {
18
+ total: 0,
19
+ created: 0,
20
+ updated: 0,
21
+ errors: [],
22
+ };
23
+ const batchSize = 200;
24
+ let hasMore = true;
25
+ let offset = 0;
26
+ // Build filters
27
+ const filters = input.ids ? { id: input.ids } : {};
28
+ // Use explicit queryFields if provided, otherwise fall back to wildcard
29
+ const queryFields = entity.queryFields?.length
30
+ ? entity.queryFields
31
+ : ["*"];
32
+ while (hasMore) {
33
+ const { data: entities, metadata: { count } = { count: 0 } } = await query.graph({
34
+ entity: entity.medusaEntity,
35
+ fields: queryFields,
36
+ filters,
37
+ pagination: {
38
+ skip: offset,
39
+ take: batchSize,
40
+ order: {
41
+ id: "ASC",
42
+ },
43
+ },
44
+ });
45
+ try {
46
+ await Promise.all(entities.map(async (entityData) => {
47
+ try {
48
+ // Get existing sanity document for rollback purposes
49
+ const existingDoc = await sanityModule.retrieve(entityData.id);
50
+ const { document, isCreate } = await sanityModule.upsertSyncDocument(input.entityType, entityData);
51
+ upsertMap.push({
52
+ id: entityData.id,
53
+ before: existingDoc,
54
+ after: document,
55
+ isCreate,
56
+ });
57
+ if (isCreate) {
58
+ result.created += 1;
59
+ }
60
+ else {
61
+ result.updated += 1;
62
+ }
63
+ result.total += 1;
64
+ }
65
+ catch (e) {
66
+ const errorMessage = e instanceof Error ? e.message : String(e);
67
+ result.errors.push({
68
+ id: entityData.id,
69
+ error: errorMessage,
70
+ });
71
+ logger.error(`Failed to sync ${input.entityType} ${entityData.id}: ${errorMessage}`);
72
+ }
73
+ }));
74
+ }
75
+ catch (e) {
76
+ return workflows_sdk_1.StepResponse.permanentFailure(`An error occurred while syncing documents: ${e}`, upsertMap);
77
+ }
78
+ offset += batchSize;
79
+ hasMore = offset < count;
80
+ }
81
+ logger.info(`Synced ${result.total} ${input.entityType}(s) to Sanity (${result.created} created, ${result.updated} updated, ${result.errors.length} errors)`);
82
+ return new workflows_sdk_1.StepResponse(result, upsertMap);
83
+ }, async (upsertMap, { container }) => {
84
+ if (!upsertMap || upsertMap.length === 0) {
85
+ return;
86
+ }
87
+ const sanityModule = container.resolve(sanity_1.SANITY_MODULE);
88
+ await sanityModule.compensate(upsertMap);
89
+ });
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc2FuaXR5LXN5bmMtcHJvZHVjdHMvc3RlcHMvc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBc0U7QUFDdEUscUVBQTZFO0FBRTdFLG9EQUF3RDtBQVUzQyxRQUFBLFFBQVEsR0FBRyxJQUFBLDBCQUFVLEVBQ2hDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQ2xDLEtBQUssRUFBRSxLQUFvQixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUM1QyxNQUFNLFlBQVksR0FBd0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxzQkFBYSxDQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRW5FLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXBELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sNEJBQVksQ0FBQyxnQkFBZ0IsQ0FDbEMsZ0JBQWdCLEtBQUssQ0FBQyxVQUFVLHFCQUFxQixFQUNyRCxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBcUIsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFlO1FBQ3pCLEtBQUssRUFBRSxDQUFDO1FBQ1IsT0FBTyxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztRQUNWLE1BQU0sRUFBRSxFQUFFO0tBQ1gsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztJQUN0QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDbkIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsZ0JBQWdCO0lBQ2hCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRW5ELHdFQUF3RTtJQUN4RSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU07UUFDNUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXO1FBQ3BCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRVYsT0FBTyxPQUFPLEVBQUUsQ0FBQztRQUNmLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQzFELE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFDM0IsTUFBTSxFQUFFLFdBQVc7WUFDbkIsT0FBTztZQUNQLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUU7b0JBQ0wsRUFBRSxFQUFFLEtBQUs7aUJBQ1Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFlLEVBQUUsRUFBRTtnQkFDckMsSUFBSSxDQUFDO29CQUNILHFEQUFxRDtvQkFDckQsTUFBTSxXQUFXLEdBQUcsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFL0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FDMUIsTUFBTSxZQUFZLENBQUMsa0JBQWtCLENBQ25DLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLFVBQVUsQ0FDWCxDQUFDO29CQUVKLFNBQVMsQ0FBQyxJQUFJLENBQUM7d0JBQ2IsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFO3dCQUNqQixNQUFNLEVBQUUsV0FBVzt3QkFDbkIsS0FBSyxFQUFFLFFBQVE7d0JBQ2YsUUFBUTtxQkFDVCxDQUFDLENBQUM7b0JBRUgsSUFBSSxRQUFRLEVBQUUsQ0FBQzt3QkFDYixNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQztvQkFDdEIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO29CQUN0QixDQUFDO29CQUVELE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUNwQixDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsTUFBTSxZQUFZLEdBQUcsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQzt3QkFDakIsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFO3dCQUNqQixLQUFLLEVBQUUsWUFBWTtxQkFDcEIsQ0FBQyxDQUFDO29CQUNILE1BQU0sQ0FBQyxLQUFLLENBQ1Ysa0JBQWtCLEtBQUssQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLEVBQUUsS0FBSyxZQUFZLEVBQUUsQ0FDdkUsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyw0QkFBWSxDQUFDLGdCQUFnQixDQUNsQyw4Q0FBOEMsQ0FBQyxFQUFFLEVBQ2pELFNBQVMsQ0FDVixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sSUFBSSxTQUFTLENBQUM7UUFDcEIsT0FBTyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQ1QsVUFBVSxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLGtCQUFrQixNQUFNLENBQUMsT0FBTyxhQUFhLE1BQU0sQ0FBQyxPQUFPLGFBQWEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsQ0FDakosQ0FBQztJQUVGLE9BQU8sSUFBSSw0QkFBWSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM3QyxDQUFDLEVBQ0QsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDakMsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQXdCLFNBQVMsQ0FBQyxPQUFPLENBQUMsc0JBQWEsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMzQyxDQUFDLENBQ0YsQ0FBQyJ9